윈도우의 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의 의미

- virsh undefine
[root@kvm qemu]# virsh undefine vm3
# vm을 완전히 삭제하고 싶다면, destroy + undefine

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




- 경로 이동후 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


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에 접속해서 확인


[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



[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라는 문구가 뜨도록 해보세요.
'AWS Cloud School 8기 > KVM' 카테고리의 다른 글
33일차) 2025-02-14(KVM+bridge, Migration) (0) | 2025.02.14 |
---|---|
32일차) 2025-02-13(VPN+web/was·Reverse proxy/db·NFS, KVM 초기설정) (0) | 2025.02.13 |