윈도우의 Hyper-V: 도커데스크탑(리눅스), WSL(리눅스)

# VMware 워크스테이션과 충돌날 수 있어서 지양

KVM(CLI)

GUI 환경에서 VM 및 네트워크를 생성하고 관리했던것들을 CLI 환경에서 할 것

  • virsh list: 동작중인 VM들의 목록
  • --all: 모든 VM(도메인) 목록
[root@kvm ~]# cd /etc/libvirt/qemu/

# 도메인이 정의된 파일들의 목록 확인가능

  • vm1을 생성 후 파일을 복사

  • vm1을 GUI 환경에서 삭제

# virsh define : xml 파일로부터 도메인을 정의

[root@kvm qemu]# virsh define vm2.xml

# 정의할때는 xml 파일명으로 정의

[root@kvm qemu]# virsh undefine vm1

# 정의한 vm을 삭제할때는 도메인의 이름으로 하면 된다.


  • virt-install로 도메인 정의
[root@kvm qemu]# virt-install --name=vm3 --vcpus=2 --memory=512 --os-variant=debian10 \
> --cdrom=/remote/os/vyos.iso --network bridge=br0 --graphic=vnc --noautoconsole \
> --disk path=/remote/vm/vm3.img,size=5

# --vcpus=2 --memory=512

# --cdrom=/remote/os/vyos.iso

# --os-variant=debian10

#  --network bridge=br0

# --disk path=/remote/vm/vm3.img,size=5

# --graphic=vnc : 콘솔화면 출력 방식

# --noautoconsole : vm은 생성하되, 접속하진 않음

  • vm3에 접속
[root@kvm qemu]# virsh console vm3

# 콘솔화면에서 빠져나오고 싶으면 Ctrl+]

  • virsh destroy
[root@kvm qemu]# virsh destroy vm3

# virsh destroy : shutdown의 의미

# shutdown된 상태

  • virsh undefine
[root@kvm qemu]# virsh undefine vm3

# vm을 완전히 삭제하고 싶다면, destroy + undefine


Cirros

이미 운영체제가 설치되어있는 간단한 VM 디스크

# 구글에서 cirros로 검색

  • 경로 이동후 wget으로 다운로드
cd /remote/vm
wget https://download.cirros-cloud.net/0.5.2/cirros-0.5.2-x86_64-disk.img

[root@kvm vm]# mv cirros-0.5.2-x86_64-disk.img cirros.img
[root@kvm vm]# cp cirros.img c1.img
[root@kvm vm]# cp cirros.img c2.img

# 기존에 존재하는 디스크 이미지로부터 VM을 생성

 

  • kvm에서 만든 네트워크들에 대한 xml이 있는곳

# kvmnet1은 예전에 gui환경에서 생성한 네트워크

→ 우리가 몇몇 정보를 제외(uuid, mac주소 정도)하고 비슷하게 xml을 구성한다면 네트워크를 '정의' 가능

[root@kvm networks]# cp kvmnet1.xml kvmnet2.xml

  • kvmnet2.xml 파일에 정의된 내용을 토대로 네트워크를 생성
[root@kvm networks]# virsh net-define kvmnet2.xml

[root@kvm networks]# virsh net-start kvmnet2
[root@kvm networks]# virsh net-autostart kvmnet2

# 재부팅시에도 네트워크가 활성화되도록
# GUI 상에서도 네트워크가 잘 만들어진걸 확인 가능

 

CLI 환경에서 c2.img를 import해서 VM을 생성해보자.

[root@kvm networks]# virt-install --name=c2 --memory=512 --vcpus=2 \
> --network network=kvmnet2 --disk=/remote/vm/c2.img --import \
> --noautoconsole --graphic=vnc

# iso 파일을 지정할 필요가 없음

# --import : 기존에 존재하는 디스크를 불러옴

 

virsh 네트워크 관련 명령어

  • net-list : 네트워크목록
  • net-start : 네트워크 활성화(시작)
  • net-destroy : 네트워크 비활성화
  • net-undefine : 네트워크 삭제 (xml 파일 삭제)
  • net-edit : 네트워크 수정

실습)

CLI환경에서 비슷한 방식으로 kvm 서버에 kvmnet3 대역을 192.168.3.0/24로 구성하되 dhcp를 활성화 하여 kvmnet3에서 생성되는 vm들이 dhcp로 아이피를 받아오도록 해보세요.  c3.img를 통해 생성된 vm이 dhcp로 아이피를 잘 받아왔나 확인해보세요.

 

1. kvmnet3 네트워크 생성

[root@kvm networks]# cp kvmnet2.xml kvmnet3.xml

# 네트워크 정의 서식을 모르기때문에 기존 xml파일을 복사.

# dhcp 구성하기 위해 필요한 서식을 default.xml에서 복사

  • 네트워크 정의 및 활성화 
[root@kvm networks]# virsh net-define kvmnet3.xml
[root@kvm networks]# virsh net-start kvmnet3
[root@kvm networks]# virsh net-autostart kvmnet3

 

2. c3.img 복사 및 c3 vm 생성

[root@kvm networks]# cp /remote/vm/cirros.img /remote/vm/c3.img

virt-install --name=c3 --memory=512 --vcpus=2 \
> --network network=kvmnet3 --disk=/remote/vm/c3.img --import --noautoconsole --graphic vnc

 

3. c3에 접속해서 확인

# 최초의 부팅되지 않은 이미지와 부팅되어 VM정보가 포함된 이미지는 용량부터가 많은 차이남

[root@kvm networks]# virsh migrate --unsafe --live c3 qemu+ssh://211.183.3.60/system

# kvm2 서버에서 kvmnet3이라는 네트워크가 존재하지 않기때문에 만들어주자

  • kvm2 서버에 kvmnet3이라는 네트워크 생성
[root@kvm2 ~]# cd /etc/libvirt/qemu/networks
<network>
  <name>kvmnet3</name>
  <bridge name='virbr3' stp='on' delay='0'/>
  <domain name='kvmnet3'/>
  <ip address='192.168.3.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.3.100' end='192.168.3.200'/>
    </dhcp>
  </ip>
</network>
[root@kvm2 networks]# virsh net-define kvmnet3.xml
[root@kvm2 networks]# virsh net-start kvmnet3
[root@kvm2 networks]# virsh net-autostart kvmnet3
  • kvm2라는 호스트네임을 못찾음

[root@kvm networks]# vi /etc/hosts
  • 작은 dns인 /etc/hosts에 kvm2의 주소를 안내

# 마이그레이션 후 kvm2서버에 가면, c3가 마이그레이션 된걸 확인 가능

# c3를 kvm2로 마이그레이션 한 후에도 shutdown된 c3를 확인 가능

[root@kvm networks]# virsh migrate --unsafe --live --verbose --persistent --undefinesource c1 qemu+ssh://211.183.3.60/system

# --verbose : 진행상황 표시

# --persistent : 영구적으로

# --undefinesource : shutdown된 vm을 남기지 않는

 

VM의 커스텀이미지를 제작

: 내가 원하는 정보를 넣은 커스텀이미지를 생성(나만의 AMI와 비슷)

[root@kvm networks]# yum install -y libguestfs*

# virt-builder라는 명령을 통해 말그대로 이미지를 빌드할 예정이다.

[root@kvm networks]# virt-builder --list

# 웹상 어딘가에 올려져있는 베이스이미지들

 

[root@kvm networks]# virt-builder centos-7.8 --size=7G --format=qcow2 -o /remote/vm/cent7.img --root-password password:test123

# -o : 아웃풋(저장될 디스크 이미지)

# centos-7.8 이미지를 베이스로, 크기가 7GB인 qcow2 형식의 디스크를 만들어서 /remote/vm 경로에 cent7.img로 저장, root계정의 암호: test123

[root@kvm networks]# cp /remote/vm/cent7.img /remote/vm/cen1.img

# 순수한 이미지는 그대로 두고 복사를 해서 쓰자.

[root@kvm networks]# virt-install --name=cen1 --vcpus=2 --ram=2048 --network bridge=br0  --disk=/remote/vm/cen1.img --import --noautoconsole --graphic=vnc
  •  생성한 vm에 콘솔 접속
[root@kvm networks]# virsh console cen1

# vmnet8의 dhcp를 활성화해서 cen1이 IP를 부여받는지 확인

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
 
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# echo vmtest > /var/www/html/index.html

# 브라우저에서도 접속 가능

virt-builder로 생성한 cent7.img: 순수한 이미지 파일

  • 추가로 두개의 이미지를 더 복사
[root@kvm networks]# cp /remote/vm/cent7.img /remote/vm/cen2.img
[root@kvm networks]# cp /remote/vm/cent7.img /remote/vm/cen3.img

 

virt-customize 

: virt-builder로 생성된 순수한 이미지에 설정을 추가

  •  방화벽을 끄고 비활성화 하는 명령어 추가
[root@kvm networks]# virt-customize -a /remote/vm/cen2.img --firstboot-command \
> 'systemctl disable firewalld && systemctl stop firewalld'
[root@kvm networks]# virt-install --name=cen2 --vcpus=2 --ram=2048 --network bridge=br0 --disk=/remote/vm/cen2.img --import --noautoconsole --graphic=vnc
  • 설치 후 진입하여 방화벽이 꺼져있는지 확인
[root@kvm networks]# virsh console cen2

# 잘 꺼져 있는걸 확인 가능

 

--firstboot-command : 이미지를 처음 부팅했을때 실행할 명령어

--firstboot-install : 이미지 첫 부팅시 설치하는 명령어


더보기

실습)

이 이미지를 토대로(virt-builder) 해서 웹서버가 설치되어, 바로 접속 가능하며 방화벽이 꺼져있는 cent8.img라는 커스텀이미지(virt-customize)를 만들어보세요.
centos8의 패키지관리자는 dnf입니다.

 

CentOS 7의 libguestfs가 CentOS 8의 XFS 파일 시스템을 지원하지 못함

  • CentOS 8은 기본적으로 XFS를 사용하지만, CentOS 7의 libguestfs가 최신 XFS 버전을 인식하지 못할 가능성이 큼.

CentOS 7에서 CentOS 8용 이미지를 생성하는 것이 문제일 수도 있음

CentOS 7 환경에서 CentOS 8 이미지를 생성할 때 파일 시스템 호환성 문제가 발생할 수 있습니다.
가장 확실한 해결 방법은 CentOS 8 기반의 환경에서 virt-builder를 실행하는 것입니다.


  • virt-customize를 통한 관리자 암호 변경
[root@kvm networks]# virt-customize -a /remote/vm/cent7-1.img --root-password password:test1234
[root@kvm networks]# virt-install --name cent7-1 --ram=2048 --vcpus=2 --network bridge=br0 --disk=/remote/vm/cent7-1.img --import --noautoconsole --graphic=vnc
[root@kvm networks]# virsh console cent7-1

# 목표: kvm 호스트를 ssh-client, cent7-1이라는 VM을 ssh-server로 하여 암호인증없이 키페어 인증으로 ssh 접속

  • 키페어 생성

  • 생성된 프라이빗키와 퍼블릭키

[root@localhost ~]# mkdir ~/.ssh
[root@localhost ~]# vi ~/.ssh/authorized_keys


실습)

--upload 를 비롯한 virt-builder --help 목록에 나오는 명령어들을 활용하여 암호설정 없이 접속가능한 cent-ssh.img 이미지를 만들어보세요. (베이스이미지 - centos7.8) 방식은 여러가지가 있을 수 있음. 위에서 수동으로 했던 설정(퍼블릭키 복사)을 아예 이미지화하기.

 

--selinux-relabel : 혹시 이미지생성할때 셀리눅스관련 에러가 뜬다면 이 옵션 사용


1. 이미지생성

virt-builder centos-7.8 --size=7G --format=qcow2 -o /remote/vm/cent-ssh.img --upload /root/.ssh/id_rsa.pub:/root/temp_id_rsa.pub --run-command "mkdir -p /root/.ssh && cat /root/temp_id_rsa.pub >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys " --root-password password:test123
--selinux-relabel

 

2. vm 생성

virt-install --name=cent-ssh --vcpus=2 --ram=2048 --network bridge=br0  --disk=/remote/vm/cent-ssh.img --import --noautoconsole --graphic=vnc

 

3. 만든 vm 접속

virsh console cent-ssh


4. 만든 vm 접속

virsh console cent-ssh

자율과제)

centos-7.8을 베이스이미지로 하여 커스터마이징된 이미지로 VM을 생성했을때 해당 vm의 주소로 웹브라우저 접속시 KVM is easy라는 문구가 뜨도록 해보세요.