virsh, virt-install 명령 테스트한 날짜: 2023년 8월 7일
KVM 을 사용하다보면, Virt-Manager 라는 GUI 툴이 조작하기 편해서 계속 Virt-Manager만 사용하게 된다.
그런데 가끔 SSH 터미널만 사용할 수 있는 환경이거나 CLI Command만 이용해서 Script를 작성할 때는 virsh를 꼭 사용해야 한다.
Virtual Machine 생성하기 (그리고 VM에 OS 설치하기)
$ virt-install \
--name my-vm \
--ram 4096 \
--vcpus 2 \
--disk /mnt/sda1/virtual_storage/waas.qcow2,size=100 \
--disk /mnt/hdd0/virtual_machine/harbor-2nd-storage.qcow2,size=500 \
--graphics none \
--network network=br-ex \
--console pty,target.type=virtio \
--autoconsole text \
--location /home/iso/ubuntu-22.04.1-live-server-amd64.iso
$ virt-install \
--import \
--osinfo ubuntu22.04 \
--name my-vm \
--ram 4096 \
--vcpus 2 \
--disk /mnt/sda1/virtual_storage/waas.qcow2,size=100 \
--graphics none \
--network network=br-ex \
--console pty,target.type=virtio \
--autoconsole text
$ virt-install --import \
--name my-machine \
--vcpus 4 \
--cpuset=2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32 \
--memory=4096 \
--memorybacking hugepages=on \
--numatune 0 \
--disk /mydir/my-machine.qcow2 \
--network bridge=my-br \
--network bridge=ems-br \
--os-variant rhel7.9 \
--noautoconsole
$
위 `virt-install` 명령을 실행하면, 바로 아래 화면이 출력되고
이 화면에서 대략 55~60초 정도 기다려야 다음 설치 화면으로 넘어간다.
위 화면에서 대략 55~60초 정도 기다리면, 드디어 아래와 같이 OS 설치 시작 화면이 나온다.
비록 Text Terminal 이지만, 조금이라도 예쁜 설치 화면을 원하면 "rich mode"를 선택한다.
이후부터는 일반적인 Ubuntu OS 설치 절차와 같다.
Virtual Machine 목록 보기
$ virsh list --all
Id Name State
-------------------------
1 x-node running
- am0 shut off
- aw0 shut off
- aw1 shut off
$
Virtual Machine 기동하기
$ virsh start am0
Domain am0 started
$ virsh list --all
Id Name State
-------------------------
1 x-node running
2 am0 running
- aw0 shut off
- aw1 shut off
$
Virtual Machine 종료하기
$ virsh shutdown 2
Domain 2 is being shutdown
$
$ virsh destroy 2
$ virsh undefine vm-name
Virtual Machine의 Console에 접속하기
$ virsh console x-node
Connected to domain x-node
Escape character is ^]
CentOS Linux 8
x-node login: root
Password: ......
[root@x-node ~]
qcow2 image file size 조정 (resize)
$ qemu-img resize myvm.qcow2 100G
$ qemu-img convert -O qcow2 source_image.qcow2 shrunk_image.qcow2
$ qemu-img info myvm.qcow2
qcow2 image 파일 생성하기
$ qemu-img create -f qcow2 my-virtual-volume.qcow2 250G
VM의 OS Type 전체 목록 열람하기
$ virt-install --osinfo list
...
ubuntu-lts-latest, ubuntu-stable-latest, ubuntu22.04, ubuntujammy
ubuntu21.10, ubuntuimpish
ubuntu21.04, ubuntuhirsute
ubuntu20.10, ubuntugroovy
ubuntu20.04, ubuntufocal
...
$
기존 VM instance에 disk 추가하기
$ virsh edit my-vm
... 중간 생략 ...
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type ='file' device='disk' >
<driver name='qemu' type ='qcow2' discard='unmap' />
<source file='/var/lib/libvirt/images/my-vm-a.qcow2' />
<target dev='vda' bus='virtio' />
<boot order='1' />
<address type ='pci' domain='0x0000' bus='0x05' slot='0x00' function ='0x0' />
</disk>
<disk type ='file' device='disk' >
<driver name='qemu' type ='qcow2' />
<source file='/opt/virtual_storage/vol_01.qcow2' />
<target dev='vdb' bus='virtio' />
<address type ='pci' domain='0x0000' bus='0x09' slot='0x00' function ='0x0' />
</disk>
... 중간 생략 ...
$ virsh reboot my-vm
$ systemctl restart libvirt-bin
위 방식과 다르게 virt-install 명령으로 disk를 추가하여 VM instance를 재시작한다.
virt-install \
--import \
--name my-vm \
--osinfo ubuntu22.04 \
--ram 2048 \
--vcpus 2 \
--disk /opt/virtual_machine/my-vm.qcow2 \
--disk /opt/virtual_machine/my-new-disk.qcow2 \
--graphics none \
--network network=br-ex \
--console pty,target.type=virtio \
--autoconsole text
VM의 CPU에 Host의 CPU를 Pinning
virsh vcpupin <vm-name> <vcpu-number> <host-core-number>
$ virsh vcpupin myvm 0 12
$ virsh vcpupin myvm 1 13
$ virsh vcpupin myvm
VCPU CPU Affinity
----------------------
0 12
1 13
제가 일하고 있는 기업 부설연구소에서 저와 같이 연구/개발할 동료를 찾고 있습니다.
(이곳은 개인 블로그라서 기업 이름은 기재하지 않겠습니다. E-mail로 문의주시면 자세한 정보를 공유하겠습니다.)
근무지 위치:
서울시 서초구 서초동, 3 호선 남부터미널역 근처 (전철역 출구에서 회사 입구까지 도보로 328m)
필요한 지식 (아래 내용 중에서 70 % 정도를 미리 알고 있다면 빠르게 협업할 수 있음):
- 운영체제 (학부 3 ~4 학년 때, 컴퓨터공학 운영체제 과목에서 배운 지식 수준):
예를 들어, Processor, Process 생성(Fork)/종료, Memory, 동시성, 병렬처리, OS kernel driver
- Linux OS에서 IPC 구현이 가능
예를 들어, MSGQ, SHM, Named PIPE 등 활용하여 Process간 Comm.하는 기능 구현이 가능하면 됨.
- Algorithm(C언어, C++ 언어로 구현 가능해야 함)
예를 들어, Hashtable, B-Tree, Qsort 정도를 C 또는 C++로 구현할 수 있을 정도
- Network 패킷 처리 지식(Layer 2 ~ 4 , Layer 7 )
예를 들어, DHCP Server/Client의 주요 Feature를 구현할 정도의 능력이 있으면 됨.
- Netfilter, eBPF 등 (IP packet hooking, ethernet packet 처리, UDP/TCP packet 처리)
- IETF RFC 문서를 잘 읽고 이해하는 능력 ^^
회사에서 사용하는 프로그래밍 언어:
- 프로그래밍 언어: C, C++, Go
(참고: 아직 연구소 동료들이 Rust를 사용하진 않습니다만, 새 언어로써 Rust를 사용하는 것을 고려하는 중)
근무 시간:
- 출근: 8 ~10 시 사이에서 자유롭게 선택
- 퇴근: 8 시간 근무 후 퇴근 (오후 5 시 ~ 7 시 사이)
- 야근 여부: 거의 없음 (내 경우, 올해 상반기 6 개월간 7 시 이후에 퇴근한 경우가 2 회 있었음)
- 회식 여부: 자유 (1 년에 2 회 정도 회식하는데, 본인이 집에 가고 싶으면 회식에 안 감. 왜 참석 안 하는지 묻지도 않음)
외근 여부:
- 신규 프로젝트 멤버 -> 외근 전혀 하지 않음 (나는 신규 프로젝트만 참여해서 지난 1 년 동안 한번도 외근 없었음)
- 상용 프로젝트 멤버 -> 1 년에 5 회 미만 정도로 외근
팀 워크샵 여부:
- 팀 워크샵 자체를 진행하지 않음. (워크샵 참석하는 거 싫어하는 개발자 환영 ^^)
연락처:
- "sejong.jeonjo@gmail.com"
- 블로그 비밀 댓글 (제가 하루에 한번씩 댓글 확인하고 있음)
원하는 인재상:
- 우리 부설연구소는 "긴 호흡으로 프로젝트를 진행" 하기 때문에 최소 2 년간 한 가지 주제를 꾸준하게 연구/개발할 수 있는 개발자를 원함.
- 우리 부설연구소는 자주적으로 연구 주제를 찾아서 업무를 하기 때문에 능동적으로 생각하고 행동하는 동료를 원함.
- 차분하게 연구 주제에 몰입하고, 해법을 찾는 것을 즐기는 사람.
내가 느끼는 우리 연구소의 장점:
- 갑/을 관계가 없음. (제가 근무하고 있는 연구소는 SI업종이 아니라서 갑/을 회사 개념이 없음)
- 연구소 자체적으로 연구 주제를 발굴하고 시스템을 개발하기 때문에 개발 일정에 대한 스트레스가 적음
- 빌딩 전체를 우리 회사가 사용하므로 분위기가 산만하지 않음.
- 근처에 예술의전당, 우면산 둘레길이 있어서 점심 시간에 산책하기 좋음 ^^
- 연구소 동료들 매너가 Good (2 년간 일하면서 한번도 감정에 스크레치 생기거나 얼굴 붉히며 싸운 적 없음 ^^)