การติดตั้งและใช้งาน kvm (qemu) แบบ โบราณ ด้วย command line ล้วนๆ บน ubuntu

1. เตรียมเครื่อง host ที่จะใช้ติดตั้ง

หมาบเหตุ: ในกรณีที่คุณใช้ VM instance ในระบบ sciencecloud ขอให้อ่าน ข้อควรรู้ Notices นี้ประกอบ

ให้เปลี่ยน source repository ใน /etc/apt/sources.list จาก us.arch* เป็น th.arch* และ update repository ด้วยคำสั่ง

 
$ sudo sed -i "s/us.arch/th.arch/g" /etc/apt/sources.list
$ sudo apt-get update

ถ้าคุณขี้เกียจพิมพ์ password ทุกครั้งที่ใช้ sudo ก็ให้เพิ่มบรรทัดต่อไปนี้หลัง comment “# Allow members of group sudo to execute any command” (หรือพูดประมาณนี้)

$ sudo vi /etc/sudoers
...
...
ubuntu ALL=(ALL:ALL) NOPASSWD:ALL

ถ้าใช้ vi คุณต้อง save ด้วยคำสั่ง “:wq!”

2. ติดตั้งด้วย command line และใช้งานแบบ command lines

เช็ค cpu ว่า support kvm หรือไม่

$ sudo apt install cpu-checker 
$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

ติดตั้ง qemu-kvm และ bridge-utils (ปกติจะใช้ bridge แต่จะใช้ ovs แทนก็ได้)

$ sudo apt install qemu-kvm bridge-utils

สร้าง qcow2 disk image

$ qemu-img -h | more
$ qemu-img create -f qcow2 disk1.img 8G
Formatting 'disk1.img', fmt=qcow2 size=8589934592 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16

wget iso image ขิง ubuntu มาจากเว็บของเขา ในที่นี้ผมเอามาไว้ที่เครื่อง server ภายในคณะคือ 10.100.20.161 หลังจากนั้นผมรัน qemu-kvm เพื่อรัน VM ขึ้นมาโดยมี spec ดังนี้

  • ใข้ kvm hardware support
  • ให้มี 2 smp cpus และ 2 GB Memory
  • มี disk เปล่าคือ disk1.img
  • ให้ boot จาก cdrom และเนื้อหาของ cdrom อยู่ในไฟล์ ubuntu-16.10-server-amd64.iso
  • รัน vnc server ที่ port 5900+3
  • ใช้ NAT network

โหลด iso image ของ ubuntu 16.04.1 หรือ 16.10

$ wget http://10.100.20.161/images/ubuntu-16.04.1-server-amd64.iso

หรือ

$ wget http://10.100.20.161/images/ubuntu-16.10-server-amd64.iso

หลังจากนั้นให้รัน VM ด้วยโปรแกรม qemu-system-x86_64

$ qemu-system-x86_64  -h | more
$ sudo qemu-system-x86_64 -enable-kvm -smp 2 -m 2G -hda disk1.img -boot d -cdrom ubuntu-16.10-server-amd64.iso -vnc :3 -net nic -net user

คำสั่งข้างต้นที่ option “-vnc :3” เป็นการกำหนดให้ qemu-kvm รัน vnc server ที่ port 5900+3 รอรับ connection จาก vnc client เพื่อเข้าใช้งาน vm หลังจากรันแล้วคำสั่งจะ block

คุณต้องใช้ vnc client โปรแกรม connect ไปที่ port 5903 ในที่นี้ผม associate Floatin IP ให้กับ VM เครื่องนี้แล้ว แต่ยังไม่ได้เปิด Firewall ดังนั้นผมต้องเข้าไปกำหนดค่า security rules ให้สามารถเชื่อมต่อกับ port นั้นได้ ตรงนี้เป็นอะไรที่เกิดขึ้นเนื่องจากผมใช้ OpenStack cloud มารันเครื่อง host-192-168-3-4 นี้ ถ้าคุณทำในเครื่องจริงหรือระบบอื่นก็ข้ามตรงนี้ไปได้

ในที่นี้ ผมติดตั้ง TightVNC viewer บนเครื่อง windows และใช้มันเข้าถึงโดยระบุให้มัน connect ไปที่ 10.100.20.23:3 ก็จะได้หน้าจอขึ้นมาดังภาพ
kvmstudy1
หมายเหตุ: ถ้าคุณใช้ ubuntu desktop เป็น client ให้ติดตั้ง xtightvncviewer หรือ vinagre ดังข้างล่าง

$ sudo apt-get install xtightvncviewer
$ xtightvncviewer

ให้ติดตั้งต่อจนเสร็จ

ในระหว่างติตดตั้ง ถ้าอยากรู้ว่าจะส่งงาน qemu-kvm ได้อยางไรก็ให้กด ctrl alt 2 บนหน้าจอๆ ก็จะ switch มาที่ qemu monitor command line เพื่อรอรับคำสั่ง แต่ถ้าอยากกลับไปหน้าตามปกติก็ให้กด ctrl alt 1

เมื่อเสร็จแล้วให้เลือก continue แล้ว vm จะรีบูทและจะวนกลับมาที่เริ่มต้นการติดตั้งอีกครั้งหนึ่งให้ กดปุ่ม ctrl alt 2 จะได้หน้าจอที่มี command line prompt ขึ้นต้นด้วย (qemu) ให้ป้อนคำสั่ง “quit” ซึ่งจะเหมือนกับปิดเครื่อง โปรแกรม qemu-system_x86_64 จะรีเทรินกลับมาที่ shell command line

(qemu) quit

เราจะรัน qemu-kvm อีกครั้งแต่ขอให้สังเกตุว่าผมเอา -cdrom ออก และเปลี่ยน -boot option เป็น “-boot c” นอกจากนั้นผมจะรัน vm นี้เป็น background process ด้วยโดยใส่ “&” เข้าไปข้างหลัง เพื่อที่ว่าผมจะได้ใช้ shell ได้

$ sudo qemu-system-x86_64 -enable-kvm -smp 2 -m 2G -hda disk1.img -boot c -vnc :3 -net nic -net user &
[1] 28890
$ 

บนเครื่อง client notebook ของผม ผมใช้ TightVNC viewer เข้าใช้เครื่อง vm

หลังจาก login แล้ว คุณสามารถใช้คำสั่ง ifconfig ดังคำสั่งข้างล่าง จะเห็นว่า Network ของ vm เครื่องนี้ใช้ Slirp protocol ซึ่งจะทำให้ vm ได้ IP 10.0.2.15 คุณสามารถใช้ ssh และ tcp/udp ได้ แต่ใช้ ICMP ไม่ได้ ดังนั้นจะ ping ไม่ได้ (เป็นข้อจำกัดของ Slirp)

$ ifconfig
$ ...

Network แบบนี้ทำให้ vm ทำงานใน NAT network ดังนั้น คุณจะไม่สามารถ ssh เข้าถึง vm เครื่องนี้ได้ ต้องใช้งานผ่าน console ด้วย vnc เท่านั้น

3. สร้าง overlay virtual disk

qemu-img อนุญาตให้คุณสร้าง overlay disk image ซึีงจะเป็น disk ที่สร้าง layer ของการเก็บข้อมูลขึ้นบน base disk image ทำให้ base disk image ไม่ถูกเปลี่ยนแปลง แต่การเปลี่ยนแปลงจะถูกเก็บใน overlay disk image เท่านั้น

$ qemu-img create -b disk1.img -f qcow2 disk1.ovl
Formatting 'disk1.ovl', fmt=qcow2 size=8589934592 backing_file=disk1.img encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16
$ ls -l
total 2675732
-rw-r--r-- 1 ubuntu ubuntu 2039349248 Nov 17 00:18 disk1.img
-rw-r--r-- 1 ubuntu ubuntu     197120 Nov 17 00:44 disk1.ovl
$

รัน qemu บน overlay image ด้วยคำสั่ง

$ sudo qemu-system-x86_64 -enable-kvm -smp 2 -m 2G -hda disk1.ovl -boot c -vnc :3 -net nic -net user &
[1] 29005

และผมใช้ xtighvncviewer เหมือนเดิมเข้าไปเปลี่ยนแปลงข้อมูล เมื่อใช้ ls -l ดูขนาดของไฟล์ทั้งสองอีกทีก็จะพบว่า disk1.ovl มีขนาดใหญ่ขึ้นในขณะที่ disk1.img มีขนาดเท่าเดิม

$ ls -l 
...
-rw-r--r-- 1 ubuntu ubuntu 2039349248 Nov 17 00:18 disk1.img
-rw-r--r-- 1 ubuntu ubuntu  321650688 Nov 17 01:02 disk1.ovl
...

แบบฝึกหัด 1: ให้คุณลองพิจารณาหรือทดลองดูว่าสามารถสร้าง overlay disk image บน disk1.ovl ได้หรือไม่ ทำอย่างไร

บัดนี้คุณได้สร้าง vm ด้วย qemu (kvm) แล้ว ให้เช็คความถูกต้องได้โดยใช้ vnc client เช่น TightVNC หรือ xtightvncviewer เข้าไปเช็คว่า VM ทำงานถูต้องดังภาพข้างล่าง
kvmrun
จากภาพจะเห็นว่า ผม login และ ifconfig ได้ ผมใช้ apt-get ติดต่อกับ internet ได้ แต่ไม่สามารถใช้ ICMP หรือ ping ได้ (เป็นข้อจำกัดของ Slirp)

อย่างไรก็ตาม VM นี้ยังเป็นแบบที่ใช้ NAT network ที่คุณไม่สามารถเข้าถึงจาก network และใช้มันเป็น server ได้ คุณต้องกำหนด network configuration ของ host ที่รัน VM นั้นให้ใช้ Linux Bridge หรือ Openvswitch ดังที่จะได้กล่าวถึงใน blog post ถัดไป

Leave a Reply