민트 리눅스 21.03 에서 KVM 가상환경을 구성해 본다. 구성에 핵심은 KVM 의 네트워크 설정이다. 앞서 설정한 OpenvSwitch 를 이용하도록 설정 해야 한다.
네트워크 환경
KVM 가상화를 위해서는 네트워크 환경을 먼저 고려해야 한다. 필자의 경우에는 공유기를 이용하고 있다. 외부 광랜으로 들어온 라인을 모뎀에서 받아서 이더넷로 변환해준다. 여기서 랜선으로 공유기에 연결하고 각 컴퓨터에 연결해서 쓴다.
공유기는 다들 아는 IpTime 인데, IpTime 은 새로운 장비가 접속되면 자동으로 사설IP 를 할당해 준다. 이것을 외부로 내보낼때는 NAT 기능을 이용해서 하나의 인터넷 라인으로 공유기 안쪽에 많은 장비를 사용할 수 있게된다.
KVM 가상화를 하게되면 브릿지 네트워크가 생성된다. 이 브릿지 네트워크는 NAT 모드로 작동된다. 172.x.x.x 대역으로 게스트에게 자동으로 IP 를 할당해 준다. 마치 IpTime 공유기와 같은데, 문제는 이렇게 되면 다른 컴퓨터에서 게스트에 접속할 수가 없게 된다. NAT 는 단반향으로 게시트에서 바깥으로 접속은 할 수 있지만 바깥에서 게스트로 접속은 불가능하다. 가능한 방법은 Port 포워딩인데, 포트마다 설정을 해줘야 하는 번거로움이 있다.
KVM 네트워크 설정을 NAT 가 아닌 브릿지(Bridge) 모드로 설정하고 드라이버를 OpenvSwitch 로 설정하면 호스트 컴퓨터에 브릿지 네트워크인 OpenvSwitch 를 통해서 IpTime 에서 사설 IP를 받게 된다. IpTime 내에 네트워크 모두 접속이 가능해 진다.
민트 리눅스(Mint Linux) 21.03 을 쓰고 있는데, 네트워킹이 NetworkManager 으로 되어 있다. Ubuntu 22.04 LTS 에서는 networkd 였지만 민트 리눅스는 같은 Ubuntu 라고 하더라도 네트워킹 운영을 NetworkManager 가 담당하고 있다.
이 문서는 민트 리눅스에서 OpenvSwitch 설정에 대한 것이다. Ubuntu 와 다른 네트워킹을 사용하기 때문에 nmcli 명령어를 이용한 방법을 소개 한다.
민트 리눅스 네트워킹 설정
이렇게 NetworkManager 일 경우에는 네트워크 인터페이스 관련 설정을 nmcli 로 하게된다. 물론 민트 리눅스 이기 때문에 GUI 를 통해서 손쉽게 할 수 있다.
GUI 툴을 이용해서 이렇게 설정을 하게 되면, nmcli 명령어를 사용해서 하는 것과 동일하게 nmcli 관련 설정파일이 변경 된다. 다음과 같은 경로에 파일이 존재한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
]# ls /etc/NetworkManager/system-connections/
'유선 연결 1.nmconnection'
]# cat 유선\ 연결\ 1.nmconnection
[connection]
id=유선연결1
uuid=f2de78ab-770b-3d94-9e17-12345
type=ethernet
autoconnect-priority=-999
interface-name=enp5s0
timestamp=1708005693
[ethernet]
wake-on-lan=64
[ipv4]
address1=192.168.96.4/20,192.168.96.1
dns=192.168.96.7;8.8.8.8;
method=manual
[ipv6]
addr-gen-mode=stable-privacy
method=auto
[proxy]
GUI 툴을 이용해 설정한 내용이 위 파일에 적용된다.
OpenvSwitch 설치
OpenvSwitch 를 설치를 먼저 해야 한다. Ubuntu 를 사용하고 NetworkManager 일 경우에 OpenvSwitch 도 NetworkManager 와 연관된 패키지를 설치하는 경우가 많지만 민트 리눅스에는 다음과 같은 패키지를 설치 한다.
2월1523:34:36systemv-desktop systemd[1]:Starting Open vSwitch...
2월1523:34:36systemv-desktop systemd[1]:Finished Open vSwitch.
systemd 에 설정이 되었고 시작도 되었다. 다음과 같이 명령어가 문제없이 출력되는 확인한다.
1
2
3
]# vs-vsctl show
c9b08240-08fb-438b-a314-123456
ovs_version:"2.17.8"
위와같이 정상적으로 버전이 출력되어야 한다.
network-manager 패키지 문제
민트 리눅스 21.03 에서는 network-manager 패키지에 문제가 있다. OpenvSwitch 플러그인이 비활성화된 패키지라는 거다. 다음과 같다.
1
2
--disable-modify-system\
--disable-ovs
ovs 를 활성화하기 위해서는 network-manager 를 재패키징 해야 한다. 이를 위해서는 소스 deb 를 다운로드 받아야 한다.
1
]# apt source network-manager
이렇게하면 디렉토로에 network-manager 관련 패키징을 위한 파일과 디렉토리가 생성된다. 여기서 다름과 같이 deb 패키징을 위한 configure 파일이라 할 수 있는 rules 파일을 수정해 줘야 한다.
1
2
]# cd network-manager-1.36.6/debian
]# vim rules
rules 파일을 열면 configure 설정을 볼 수 있다. 여기서 –disable-ovs 를 삭제한다. 이렇게 되면 ovs 를 위한 설정파일이 생성되고 이 파일에 대한 처리가 없으면 deb 패키징이 실패한다. 설치를 위한 파일 목록은 network-manager.install 파일이다. 여기서 다음을 추가해 준다.
만약 이렇게 자동으로 디스크가 인식되지 않는다면 SCSI 디스크 ReScan 기능을 이용해야 한다. Hot Swap 은 SCSI 의 host 번호를 이용해 작동됨으로 SCSI host 번호를 알아야 한다. 하지만 리눅스에서는 /dev/sdc 형식인데 SCSI host 번호와는 다른데, 다음과 같이 알아내야 한다.
프로젝트를 하다보니 윈도우즈 시스템을 사용하고 있는 가운데, 리눅스 머신이 필요하게 되어서 vmplayer 를 이용해 가상머신으로서 리눅스를 테스트 용도로 설치해 사용하고 있었다. 이제 프로젝트도 전부 끝나게 되어서 노트북에 설치한 이 VMPlayer 의 OS 를 KVM 시스템으로 옮기 싶었다.
어떻게 VMWare, VirtualBox VM 이미지를 KVM 이미지로 바꿀 수 있을까 싶어 자료 조사를 하고 KVM 시스템으로 옮길 수 있었다. 이에 대한 내용을 정리한다.
qemu-img
VMPlayer 는 무료 소프트웨어이기 때문에 이미지 변경에 대한 툴을 제공하지 않는다. 이 경우에 KVM 리눅스 머신이 존재한다면 VMPlayer 의 이미지를 KVM 리눅스 머신으로 옮긴다.
KVM 리눅스 머신에는 qemu-img 를 사용할 수 있다. 이 명령어는 이미지를 변경할 수 있게 해준다. 만일 이 명령어가 존재하지 않는다면 다음과 같이 설치 해준다.
qemu-img 명령어 설치
ZSH
1
2
3
4
# Ubuntu
]$sudo apt install qemu-utils
# RedHat
]$sudo dnf install qemu-img
VMPlayer 이미지 옮기기 및 정보
여기서 한가지 조건이 존재한다. VMPlayer 를 이용해 VM 을 생성할때에 스토리지를 하나의 통 파일로 만들건지 아니면 여러조각의 파일로 조각해서 만들건지를 물어본다. 이 경우에는 스토리지 파일을 하나의 통 파일로 작성한 경우에 한 한다.
하나의 통파일로 작성할 경우에 VMPlayer 는 확장자 .vmdk 파일이 존재하게 된다. 이것을 KVM 리눅스 머신으로 옮겨준다. 옮겨준 파일은 qemu-img 명령어를 이용해 파일의 정보를 조회해 볼 수 있다.
VMPlayer 이미지의 정보
ZSH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$qemu-img info RHEL9.0.vmdk
image:RHEL9.0.vmdk
file format:vmdk
virtual size:30GiB(32212254720bytes)
disk size:5.06GiB
cluster_size:65536
Format specific information:
cid:2869090990
parentcid:4294967295
create type:monolithicSparse
extents:
[0]:
virtual size:32212254720
filename:RHEL9.0.vmdk
cluster size:65536
format:
VMPlayer 에서 스토리지를 생성할때에 30GiB 크기로 생성을 했으며, 사용하는 만큼만 실체적인 용량을 쓰도록 했기 때문에 5.06GiB 의 파일 크기를 가진다.
qcow2, raw 변경
qemu-img 를 사용해 KVM 이미지로 변경할 이미지 포맷을 지정할 수 있다. KVM 의 경우에 qcow2 나 raw 의 이미지를 지원한다. qcow2 의 경우에는 앞서 VMPlayer 파일 형식과 같이 총 용량은 정해져 있지만 사용하는 만큼만 실제 파일시스템에 반영이 된다. raw 는 그냥 전체 생성할때 지정한 용량이 파일 시스템에 반영이 된다.
Rocky Linux 9 는 RHEL 9 (RedHat Enterprise Linux 9) 의 크론 버전이다. RHEL9는 상용인 반면에 Rokcy Linux 는 무료다.
RHEL9나 Rokcy Linux 9 로 넘어오면서 변화한 것중에 하나가 ifcfg-eth0 파일이다. 이 파일은 /etc/sysconfig/network-scripts 디렉토리에 존재했었고 eth0 네트워크 장치에 대한 네트워크 설정 정보가 저장되었었다. 부팅을하면서 Network-Manager 데몬이 이 파일을 읽어 실행했었다. 하지만 RHEL9과 Rokcy Linux 에서는 이 파일을 더 이상 사용하지 않고 nmcli 명령어를 통해서 세팅을 하도록 변경 되었다.
이러한 변화는 Open vSwitch 세팅에서도 영향을 준다. 우분투와 다르게 RHEL9, Rocky Linux 9 에서는 nmcli 명령어를 통해서 Open vSwitch 를 설정하게 된다.
주의
절대로 원격에서 작업을 해서는 안된다. 외부와 연결하는 네트워크 작업이기 때문에 원격에서 작업을 했을 경우 다시 접속이 안될 수 있다.
Open vSwitch 설치
Rocky Linux 9 에서 Open vSwitch 설치는 패키지로 제공한다. 다음과 같이 설치가 가능하다.
Open vSwitch 설치.
ZSH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
]# dnf install centos-release-nfv-openvswitch
]# dnf search openvswitch
Last metadata expiration check:0:34:49ago on Sun Jul1615:48:152023.
inet6 fe80::47b0:302c:15bb:ad30/64scope link noprefixroute
valid_lft forever preferred_lft forever
RHEL9, Rocky Linux 9 에서 어떻게 Open vSwitch 를 설정하는지 알아 봤다.
WOL 설정
Wake On Lan 은 Ethernet 선과 연결된 상태에서 컴퓨터에 전원을 켜지는 기능을 말한다. 이 기능을 사용하기 위해서는 먼저 메인보드에서 지원을 해줘야 한다. 한가지 더 주의해야 하는 것은 메인보드마다 설정 방법이 다 다르다.
이 작업을 했던 컴퓨터는 ASRock B550M Pro4 였는데, BIOS 설정에 Boot 메뉴에 Power On Lan 설정이 있어서 Enable 을 해줬지만 되지 않았다. Advanced 설정에서 ACPI 메뉴가 존재하는데 여기서 PCIE 를 이용한 Power On Lan 설정이 존재하는데 이것을 Enable 을 해줘야 한다.(정확한 메뉴는 기억이 나지 않는다. 메뉴얼을 찾아보면 쉽게 찾을 수 있다.)
이렇게 했는데도 WOL 기능이 되지 않는다면 이것은 리눅스의 설정을 해줘야 함을 의미 한다. 앞서 Open vSwitch 설정을 해준 관계로 외부 접속을 위한 디바이스의 연결 이름이 일반적으로 다르다.
]# nmcli conn show "ovs-if-enp4s0" | grep wake-on-lan
802-3-ethernet.wake-on-lan:magic
802-3-ethernet.wake-on-lan-password:--
이렇게 한 다음에 가능하면 두번 재부팅하라고 하지만.. 글쎄… 한번만 해줘도 잘됐었다. 여러번 테스트를 해봤는데 문제없이 잘되었다.
한가지 덧붙이자면 WOL 기능을 사용하기 위해서는 절대로 전원 플러그를 뽑아서는 안된다. 멀티탭에 각 구에 전원이 On/Off 스위치가 있을 경우에 전원을 차단해서도 안된다. 전원 플러그를 뽑았다가 다시 꼽아도 안된다. 반드시 전원 플러그를 꼽고 한번은 리눅스로 부팅을 해주고 난 후에 리눅스를 Shutdown 해주고 그리고 전원 플러그는 그대로 연결이 되어 있어야 한다.
WOL 기능은 공유기에 내장되어 있는 경우가 많다. 공유기를 이용하면 원격에서도 컴퓨터를 켤수 있고 공유기의 포워드 기능을 이용하면 켜진 컴퓨터로 외부에서 접속이 가능하다. 프로젝트 할때마다 자주 써먹는 유용한 방법이다.
KVM 가상화를 운영하고 있는데, 운영중인 VM 하나가 용량이 부족해지는 상황이 발생했다. KVM 가상화 VM 의 용량은 결국 이미지 파일 한개임으로 이 이미지 파일의 용량을 늘려주면 VM 의 용량이 사실상 늘어나는 것으로 생각했다.
하지만 현시점(2023) 에서 검색을 해보니 다양한 방법들이 존재했다. 그 중에는 VM 이미지를 로컬에 마운트해서 늘려주는 방법도 존재했지만 너무나 복잡해 보였다. 좀 더 쉬운 방법이 없을까 해서 검색한 결과 가장 쉬워보이는 것을 발견했고 이 방법으로 손쉽게 VM 용량을 늘리는데 성공했다.
VM 상태
용량을 늘리려는 VM 의 상태는 다음과 같다.
VM 용량 상태
ZSH
1
2
3
4
5
6
7
8
# df -h
Filesystem Size Used Avail Use%Mounted on
tmpfs393M8.0M385M3%/run
/dev/vda148G44G794M99%/
tmpfs2.0G52K2.0G1%/dev/shm
tmpfs5.0M05.0M0%/run/lock
tmpfs2.0G02.0G0%/run/qemu
tmpfs393M0393M0%/run/user/1000
/dev/vda1 으로 파티션 하나로 보이지만 사실 SWAP 파티션도 존재한다. 이 SWAP 파티션의 /dev/vda2 디바이스이며 약 2G 용량을 차지한다.
VM 이미지 경로
VM 을 운영하는 Host 서버에서 VM 의 이미지가 어디에 있는지를 다음과 같이 살펴볼 수 있다.
VM 디스크 이미지 정
ZSH
1
2
3
4
5
]# virsh domblklist --domain Ubuntu20.04
대상소스
----------------------------------
vda/opt/kvm/ubuntu20.04.img
sda-
VM 이미지 정보
VM 이미지의 정보를 아는 것은 매우 중요하다. VM 이미지의 타입이 존재하는데 raw, qemu 타입이다. 어떤 타입인지에 따라서 VM 이미지 용량을 늘리는 방법이 달라진다.
이 작업은 매우 중요하다. truncate 명령어를 이용하는 것인데, -r 옵션으로 용량 증설을 위한 이미지를 만들었다. 그리고 그 이미지에 용량 증설을 설정한다. 여기서는 10G 용량을 늘린다
루트(/) 피티션 /dev/sda1 크기 변경
VM 이미지 내의 파티션 정보는 /dev/sda1 으로 보인다. 여기서 주의해야 할 것은 VM 이 가동된 후에 이미지 정보의 디바이스 이름은 /dev/vda1 으로 다르다. virt-df 혹은 virt-filesystems 나온 내용을 기반으로 디바스 이름을 정해야 한다.
[941.1]Expanding/dev/sda1 using the‘resize2fs’method
virt-resize:Resize operation completed with no errors.Before deleting
the old disk,carefully check that the resized disk boots andworks
correctly.
변경 요약을 보면 /dev/sda1 의 용량이 증설될 것인데, 이 파티션의 파일시스템이 ext4 임으로 resize2fs 방법을 이용해서 크기가 확장될 것임을 알려주고 있다.
진행 상태를 보면 Copying /dev/sda1 으로 나오고 실행 명령어에서 변경전 이미지와 truncate 명령어로 새롭게 생성한 이미지를 인자로 줬는데, 아마도 변경전 이미지를 truncate 명령어로 새롭게 생성한 이미지에 순차적인 복사를 하는 것으로 보인다.
이미지 용량에 따라서 작업 시간는 차이를 보일 것이다.
새로운 이미지로 VM 시작한 후 파티션 확인
/mnt7/ubuntu20.04-new.img 이미지로 VM 을 부팅한다. 그리고 난 후 다음과 같이 파티션 용량이 늘었는지 체크한다.
디스크 확인
ZSH
1
2
3
4
5
6
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sr011:011024M0rom
vda252:0060G0disk
├─vda1252:1058.1G0part/
└─vda2252:201.8G0part[SWAP]
용량이 10G 늘었다.
파일시스템 용량을 봐 본다.
파일 시스템 용량 확인
ZSH
1
2
3
4
5
6
7
8
# df -h
Filesystem Size Used Avail Use%Mounted on
tmpfs393M6.8M386M2%/run
/dev/vda157G44G11G82%/
tmpfs2.0G52K2.0G1%/dev/shm
tmpfs5.0M05.0M0%/run/lock
tmpfs2.0G02.0G0%/run/qemu
tmpfs393M0393M0%/run/user/1000
앞에서 변경 요약을 보면 파일시스템이 뭔지를 파악하고 거기에 맞게 파티션 Resize 작업도 해주는 것으로 보인다. ext4 의 경우 resize2fs, XFS 의 경우에는 xfs_growfs 을 사용하는데 이런 작업은 파티션의 크기를 변경하는 것으로 VM 이미지 용량 증설과 함께 해준다.