Should I create a generation 1 or 2 virtual machine in Hyper-V?
https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/plan/should-i-create-a-generation-1-or-2-virtual-machine-in-hyper-v
UEFI : Unified Extensible Firmware Interface
https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface
SSH 인증키 생성 및 서버에 등록(패스워드 입력X)
https://my-t-space.tistory.com/31
SSH 인증키 생성 및 서버에 등록 & 간편하게 접속하기
https://velog.io/@solar/SSH-%EC%9D%B8%EC%A6%9D%ED%82%A4-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%84%9C%EB%B2%84%EC%97%90-%EB%93%B1%EB%A1%9D-%EA%B0%84%ED%8E%B8%ED%95%98%EA%B2%8C-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0
신규 서버 추가에 앞서, DevOps 프로젝트로 개발 환경 구축의 자동화를 위한 Ansible Playbook의 작성이 요구되었다. 먼저 로컬 서버에서의 테스트 환경을 구축하기 위해 복수의 VM을 생성하기로 한다. VM은 Hyper-v를 통해 생성하고, Ubuntu 20.04 CLI 버전을 사용한다. 또한 보다 원활한 원격 서버 접속을 위해 간단한 ssh 초기 설정 등을 진행할 것이다.
구체적인 진행 방법과 그 과정은 다음과 같다.
Hyper-V를 통한 가상 서버(VM) 구축은 다음과 같은 과정을 거쳐 진행된다:
Windows Pro 10을 사용하고 있는 경우, Hyper-V manager를 실행한다.
상단의 장비 목록에서 현재 사용 중인 디바이스를 선택하고, 오른쪽의 Actions 메뉴에서 New > Virtual Machines를 선택한다.
사용할 가상 머신의 이름을 특정한다.
Generation(세대)를 설정한다. Generation 1과 2의 차이란 인용하면 그 내용이 다음과 같다:
- Your choice to create a generation 1 or generation 2 virtual machine depends on which guest operating system you want to install and the boot method you want to user to deploy the virtual machine. We recommend that you create a generation 2 virtual machine to take advantage of features like Secure Boot unless one of the following statements is true :
- The VHD you want to boot from is not UEFI-compatible
- Generation 2 doesn't support the operating system you want to run on the virtual machine.
- Generation 2 doesn't support the boot method you want to user
(Official Microsoft Documentation)
이상의 내용은 다음과 같다:
1세대 또는 2세대로 VM을 생성할지에 대한 선택은 VM을 배포할 유저가 어떠한 guest OS를 설치하고 실행하고 싶은지에 달려있다. 다음 중 하나 이상의 경우에 해당되지 않는 이상, Secure Boot과 같은 이점을 위해 2세대의 가상 머신을 생성하기를 권장한다:
그렇다면 2세대를 사용함으로써 얻을 수 있는 이점이란 무엇인가?
이 역시 동일한 레퍼런스에 자세한 설명이 존재한다. (이하 원문)
What are the advantages of using generation 2 virtual machines?
Here are some of the advantages you get when you use a generation 2 virtual machine:
* Secure boot
This is a feature that verifies the boot loader is signed by a trusted authority in the UEFI database to help prevent unauthorized firmware, operating systems, or UEFI drivers from running at boot time. Secure Boot is enabled by default for generation 2 virtual machines. If you need to run a guest operating system that's not supported by Secure Boot, you can disable if after virtual machine's created.
To Secure Boot generation 2 Linux virtual machines, you need to choose the UEFI CA Secure Boot template when you create the virtual machine.
* Larger boot volume
The maximum boot volume for generation 2 virtual machines is 64TB. This is the maximum disk size supported by a .VHDX. For generation 1 virtual machines, the maximum boot volume is 2TB for a .VHDX and 2040GB for a .VHD.
직역하면 내용은 이러하다.
2세대의 가상머신을 사용하여 얻을 수 있는 이점은 무엇인가?
Secure Boot (보안 부팅)
부팅이 실행될 때에 인증되지 않은 firmware, OS, 또는 UEFI 드라이버들을 방지할 수 있도록 boot loader가 UEFI 데이터베이스 내에서 신뢰된 인증으로부터 서명되었는지를 증명하는 기능이다. 보안 부팅은 2세대 가상 머신에서 기본 값으로 설정되어 있다. 보안 부팅을 지원하지 않는 guest OS를 실행하고자 하는 경우, 가상 머신을 생성한 후에 설정을 끌 수 있다.
Larger boot volume (더 큰 부팅 볼륨)
2세대 가상 머신의 최대 부팅 볼륨은 64TB이다. 이는 .VHDX의 최대 디스크 사이즈이다. 1세대 가상 머신의 경우, .VHDX의 최대 부팅 볼륨은 2TB이며 .VHD는 2040GB이다.
더욱 자세한 디바이스 지원에 대한 1세대와 2세대의 차이는 아래의 표와 같다.
다시 본론으로 넘어가서, 새 VM 생성의 다음 절차는 다음과 같다:
시작 메모리 용량을 설정한다. 기본값은 1024MB이다.
새로운 가상 머신은 각각 network adapter를 포함하고 있다. 어떤 가상 switch를 사용할지 선택할 수 있고 비연결 상태로 놔둘 수도 있다. 내 경우에는 Connection으로 WSL을 선택하였다.
가상 하드 디스크를 선택한다. 기본 값은 127GB이다.
os 이미지 파일을 선택한다. 내 경우, ubuntu 20.04 CLI 버전을 선택하였다.
생성이 완료되었다. 이 전 과정에서 선택한 사항들의 summary를 확인한다.
상기한 바와 같이 2세대의 가상 머신 생성을 선택한 경우, 별도의 보안 설정을 해 줄 필요가 있다.
생성한 VM을 우클릭한 후, settings를 선택한다.
Security 설정에서 Template을 UEFI 증명 authority로 선택하고, apply한다.
생성한 VM을 실행하면 다음과 같은 화면이 뜬다. start를 누른다.
로딩이 되면 언어를 먼저 설정해 준다. 참고로 CLI 버전의 VM은 마우스 조작이 불가능하므로, tab과 방향키 등을 통해 항목을 선택하고, enter를 눌러 확인 또는 다음 단계로 넘어갈 수 있다.
ipv4 주소를 설정해 준다. 기본값은 동적 ip로 설정되어 있으나, ssh 등으로 접속할 때에 고정 ip가 필요하다면 ipv4를 선택하고 원하는 주소값을 직접 입력한다.
Manual(직접 입력)을 선택하는 경우 ipv4 메소드 설정을 직접 입력할 수 있다. subnet은 공공 ip주소와 겹치지 않도록 사설 ip 주소 대역을 선택하고, address는 해당 사설 ip 주소 대역 내에서 원하는 주소를 작성해 준다. Ansible vm의 경우 192.168.100.30-33까지 할당하여 관리하고 있으므로 해당 대역대를 작성한다. gateway는 일단 적당히 적어주고 넘어간다.
proxy 설정이 별도로 필요하지 않다면 Done을 클릭해 다음 단계로 넘어간다.
apt-get update를 진행한다. 이 과정은 생략이 가능하다. (Continue without updating)
기본값대로, 디스크 전체를 사용하는 것으로 설정했다.
Summary를 확인하고 문제가 없다면 Done을 선택한 후 enter를 누른다.
위의 과정을 실행하는 경우 선택된 드라이브의 데이터가 포맷될텐데 괜찮냐는 경고문이 뜬다.
Continue를 눌러 다음 단계로 넘어간다.
system의 로그를 사용할 프로필과 비밀번호를 설정해 준다.
ssh를 사용할 예정이라면 Install OpenSSH Server를 선택하여 open ssh 서버를 설치한다.
VM 설정이 완료되었다.
vm에 접속할 때에, 일반적인 ubuntu 명령어는 다음과 같다.
ssh vaccessName@address
# e.g. ssh codepark@192.168.100.32
ssh를 통한 위의 과정으로 원격 서버에 접속할 때에, 매번 비밀번호를 입력하는 것이 귀찮다면 아래와 같은 과정을 통해 로그인 절차를 단순화할 수 있다.
ubuntu를 켜고, root 디렉토리로 이동한다.
단, 비root(사용자)의 경우 root 디렉토리는 /home/계정명
이며, root 권한의 경우 /root
이다.
참고로 습관적으로 root 권한으로 작업을 수행하는 것은 지양하는 것이 좋다. root 권한으로 생성한 작업들의 권한 역시 root 권한을 필요케 하기 때문.
root 디렉토리에서 다음과 같은 명령어를 입력해서 먼저 access key를 발급한다.
ssh-keygen
ssh-keygen을 입력하면 한 쌍의 키를 발급해 주는데, 하나는 .pub이 붙은 공개키 id_rsa.pub이며 하나는 .pub이 붙지 않은 비밀키 id_rsa이다. 이제 이 공개키를 원하는 원격 서버에 복사하면, 해당 원격 서버는 공개키와 접속 서버의 비밀키를 대조하여 known_hosts에 등록하게 된다.
ssh-keygen을 입력하고, 3번의 질문이 뜨는데 전부 엔터를 누르면 편하다. 이는 키를 복사할 디렉토리 선택, 비밀번호 설정 여부 등이다.
접근 키의 원격 서버로의 복사는 다음과 같은 명령어로 수행한다.
ssh-copy-id serverAccessname@Address
# e.g. ssh-copy-id codepark@192.168.100.32
키 복사가 완료되고 나면 해당 주소로 다시 접근해보라는 메세지가 표출된다.
해당 주소 다시 접근하면 비밀번호 입력 절차없이 간편하게 ssh 접근이 가능해진다.