ช่วงนี้ได้ทดลองใช้งาน KVM บน Ubuntu เนื่องจากกำลังทดลองทำ Cluster เล็กๆสำหรับ Apache Cassandra จากเมื่อก่อนที่เคยใช้แต่ VirtualBox มาตลอด เพราะสะดวกดี ใช้ได้ทั้งบน Windows, OS X และ Linux พอมาลอง KVM ก็พบว่าการบริหารจัดการ VM ด้วย Virtual Machine Manager (VMM) ทำให้เราสะดวกมากขึ้น เนื่องจากผมก็ไม่ค่อยจะชอบจำ Command-line เท่าไรนัก และ VMM ก็สามารถ Remote ไปจัดการที่เครื่องใดก็ได้ในขณะที่ VirtualBox นั้น จะไม่มีเครื่องมือที่เป็น Remote มาให้ (มี RemoteBox อยู่แต่ไม่ได้ลองใช้)
หลังจากที่พยายามศึกษาการใช้งาน และทำการ Convert image ไฟล์จาก VDI Format ของ VirtualBox มาเป็น QCOW2 Format ของ Qemu อยู่พักใหญ่ เนื่องจากมีอยู่หลายไฟล์ และแต่ละไฟล์มีขนาดค่อนข้างใหญ่ ทำให้เนื้อที่ฮาร์ดดิสต์เต็ม เลยต้องจัดการข้อมูลเก่าๆอยู่นาน สุดท้ายก็ได้ทดลองรัน VM ขึ้นมาได้ แต่แล้วก็ติดปัญหาว่า VM ไม่สามารถมองเห็นจากภายนอกได้ เนื่องจาก VMM มี UI ให้เราสร้างแต่ Virtual Network ที่เป็น NAT หรือ Router เท่านั้น (เห็นบางแห่งแนะนำว่าเลือกเป็น Bridge ได้ แต่สำหรับ VMM บน Ubuntu 14.04 ที่ผมใช้อยู่ไม่มีเมนูให้เลือก) สุดท้ายก็เลยต้องลงมือทำด้วย Command-line ซึ่งก็เลยเป็นที่มาของการบันทึกนี้เพื่อกันลืมครับ
ขั้นตอน
1.ติดตั้ง bridge-utils
2.แก้ไขไฟล์ /etc/network/interfaces ซึ่งสำหรับกรณีที่ใช้ DHCP ของผมเป็นดังนี้ (ค่า bridge_ports ให้ใส่ชื่อ interface ของ LAN, ค่า post-up ใช้ในกรณีที่ DHCP แจก IP ตาม MAC Address ของ LAN)
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
post-up ip link set br0 address f4:6d:04:08:f1:5f
3.แก้ไขไฟล์ /etc/sysctrl.conf ดังนี้
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
4.restart network ใหม่
หมายเหตุ 1
พบว่า UFW มี Bug(UFW blocks libvirt bridged traffic) ทำให้ Guest VM ไม่สามารถใช้งาน Bridge ได้ ซึ่งมีคนแนะนำให้สั่ง
sysctl -p /etc/sysctl.confแล้วจะทำให้ใช้งานได้ โดยเราสามารถเพิ่มคำสั่งนี้ไว้ใน /etc/rc.local เพื่อให้ทุกครั้งที่ boot เครื่องใหม่ก็จะใช้งานได้เป็นปกติ
หมายเหตุ 2
มีคนรายงานปัญหาว่า หากคำสั่ง sysctl -p /etc/sysctl.conf แล้วมี error ดังนี้
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directoryอาจเกิดจากการที่ module bridge ในบางกรณี ไม่สร้าง net.bridge.* ให้ ซึ่งเขาแนะนำให้ติดตั้ง module br_netfilter เพิ่ม โดยสั่ง
modprobe br_netfilterหากใช้งานได้ ให้เพิ่มชื่อ br_netfilter ไว้ใน /etc/modules ก็จะใช้งานได้ โดยไม่ต้องสั่ง sysctl -p อีกต่อไป
ตรวจสอบ module br_netfilter ว่ามีหรือไม่ได้ด้วยคำสั่ง
egrep -r -i "nf-filter" /lib/modules/$(uname -r)/kernel/net/*