ลง MS Windows 2000/XP บน QEMU

มีเหตุต้องใช้ Windows 2000/XP สำหรับเดโมในห้องเรียนพร้อมๆ กับลินุกซ์เลยเอา QEMU มาใช้ .. QEMU เป็นโปรแกรมที่จำลองการทำงานของซีพียูและระบบ ปัจจุบัน QEMU จำลองการทำงานของคอมพิวเตอร์ x86 กับ PowerPC ได้ทั้งระบบ และจำลองซีพียูได้สารพัด ทั้ง x86, x86-64, PowerPC, ARM และ SPARC .. เพราะเป็นการจำลองการทำงานย่อมช้ากว่าระบบจริงๆ อยู่แล้ว แม้จะจำลอง x86 บน x86 จริงๆ ก็ตาม แต่ก็ทนๆ เอา เพราะใช้เป็นครั้งคราวเท่านั้น

ติดตั้ง QEMU

Debian/Ubuntu ติดตั้งผ่าน APT ได้เลย ..

# apt-get install qemu

การทำงานของ QEMU นับถึงเวอร์ชัน 0.7.0 จะใช้ดิสก์อิมเมจในการจำลองเป็นฮาร์ดดิสก์ของระบบ ดังนั้นขอให้มีที่ว่างๆ ในพาร์ทิชันมากพอที่จะใช้เป็นดิสก์อิมเมจก็ใช้งานได้ โดยไม่ต้องแบ่งพาร์ทิชันกันใหม่ .. หาพื้นที่ว่างๆ ให้มากพอจะติดตั้ง Windows 2000 … Windows 2000 ติดตั้ง default ใช้พื้นที่ราวๆ 600-700 MB + เผื่อติดตั้งซอฟต์แวร์อื่นๆ อีกนิดหน่อย ก็สัก 1.5 – 2 GB น่าจะพอ สั่งสร้างดิสก์อิมเมจโดยสั่ง

$ qemu-img create disk.img 2G

คำสั่งนี้จะสร้างดิสก์อิมเมจสำหรับทำงานเสมือนเป็นฮาร์ดดิสก์ขนาด 2 GB .. ทีนี้เริ่มติดตั้ง Windows 2000 ได้โดยใส่แผ่นติดตั้งของ Windows 2000 ไว้ใน CDROM แล้วสั่ง

$ qemu -hda disk.img -cdrom /dev/cdrom -boot d

คำสั่งนี้เป็นการสั่ง qemu ให้จำลองคอมพิวเตอร์ x86 ทั้งระบบโดย

-hda disk.img เป็นการบอกให้ QEMU ใช้ไฟล์ disk.img เป็น Primary Master IDE disk หรือ ไดรว์ C:

-cdrom /dev/cdrom เป็นการบอกให้ QEMU จำลอง CDROM โดยใช้ /dev/cdrom CDROM จะเป็น Secondary Master หรือ ไดรว์ D: เสมอ

-boot d เป็นการสั่งให้ boot จาก CDROM

ทีนี้ QEMU ก็จะเริ่มต้นจำลองระบบ x86 แล้วก็ boot จาก CDROM ขั้นตอนที่เหลือก็จะเหมือนกับการติดตั้ง Windows 2000 ทั่วๆ ไป

First Boot !

หลังจากติดตั้งเสร็จแล้ว ทีนี้เราก็สามารถสั่ง

$ qemu -hda disk.img -cdrom /dev/cdrom -boot c

เพื่อบูต Windows 2000 ที่ติดตั้งไปตะกี้ .. ถ้าไม่จำเป็นต้องใช้ CDROM ก็ไม่จำเป็นต้องใส่ออปชัน -cdrom /dev/cdrom ก็ได้

ลองดู System Properties/Hardware กับ Device Manager ก็ได้รายละเอียดออกมาประมาณนี้

CPU: x86 Family 6 Model 3 Stepping 3 ~ Pentium II 233 MHz
Chipset: Intel 441FX
Bus: PCI
Display: Cirrus Logic 5446
Disk: IDE
CDROM: IDE
NIC: RealTek 8029 Ethernet NE2000 Compatible

มี NICs ก็ย่อมจะใช้งานเครือข่ายได้ :)

Networking

QEMU จำลองการเชื่อมต่อเครือข่ายโดยใช้ Tunnel Inteface เชื่อมเข้ากับ NICs ที่จำลองขึ้นมา ถ้าจะให้ Windows 2000 หรือ OS อะไรก็ตามบน QEMU ใช้งานเครือข่ายได้ ก็ต้องทำให้ลินุกซ์สนับสนุน TUN/TAP ก่อน เคอร์เนลส่วนใหญ่จะคอมไพล์ให้ TUN/TAP เป็น modules ไว้อยู่แล้ว ก็จะสามารถสั่ง

# modprobe tun

แล้วลอง

$ ifconfig tun0

ถ้า ifconfig แสดงข้อมูลของอินเทอร์เฟซ tun0 ขึ้นมาก็ถือว่าใช้งาน tunnel ได้แล้ว อย่างไรก็ตาม ถ้าต้องการใช้ QEMU ด้วย non-root accout อาจจะต้องแก้ group / permission ของ /dev/net/tun สักหน่อย เพื่อให้ผู้ใช้ใน group users สามารถอ่านเขียนผ่าน TUN ได้

# chgrp users /dev/net/tun
# chmod 660 /dev/net/tun

อาจจะมีบางกรณีที่ ifconfig tun0 แล้วได้ error ขึ้นมา แม้จะเป็น root แล้วก็ไม่สามารถใช้งาน /dev/net/tun ได้ แบบนี้ก็มีทางแก้โดยใช้โปรแกรม tunctl ซึ่งเป็นหนึ่งในชุด utilities ของ UML (User-Mode Linux นะ ไม่ใช่ Unified Modeling Language) ..

# apt-get install uml-utilities

ทุกครั้งที่จะใช้ tunnel ก็ใช้ tunctl ในการควบคุมการใช้งาน เช่น

# tunctl -u 'user' -t tun

คำสั่งนี้จะสร้างอินเทอร์เฟซ tun0 และกำหนด owner เป็นให้เป็น username ‘user’ ลอง ifconfig tun0 อีกที หนนี้ไม่ควรจะเกิด error แล้ว (ถ้ายังเกิดอีกก็ตัวใครตัวมัน)

หลังจากมีอินเทอร์เฟซ tun0 แล้วทีนี้ก็ลองรัน QEMU อีกที QEMU มันควรจะรายงานว่า Connected to host network interface: tun0 ถ้าได้ตามนี้ก็เป็นอันว่า OS ใน QEMU จะพร้อมเชื่อมออกอินเทอร์เน็ตได้แล้ว ให้ตั้ง IP ของ OS ใน QEMU ให้อยู่ในเครือข่ายเดียวกับ tun0, e.g. 172.20.0.2 และตั้ง gateway ไปที่ IP ของ tun0

ขั้นสุดท้ายก็คือทำ NAT โดยใช้สี่คาถาหากิน

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -A INPUT -i eth0 -m state --state NEW,INVALID -j DROP
# iptables -A FORWARD -i eth0 -m state --state NEW,INVALID -j DROP
# echo 1 > /proc/sys/net/ipv4/ip_forward

OS ใน QEMU ก็จะใช้งานอินเทอร์เน็ตได้ :)

เร่งการทำงานด้วย KQEMU

การทำงานของ QEMU ทำงานช้าเอาเรื่องอยู่เหมือนกัน ส่วนนึงเป็นเพราะต้องจำลองการทำงานส่วนการจัดการหน่วยความจำ .. ถ้าถ้าสามารถใช้ชุดคำสั่ง native ในการจัดการหน่วยความจำได้ ก็จะทำให้ QEMU ทำงานได้เร็วขึ้นพอสมควรทีเดียว .. ด้วยเหตุนี้ผู้่พัฒนา QEMU เลยพัฒนา KQEMU เพิ่มขึ้นมาเป็น accelerator สำหรับ QEMU .. KQEMU เป็นเคอร์เนลโมดูลที่ช่วยให้ QEMU ใช้จัดการหน่วยความจำโดยใช้คำสั่ง native ของ x86 จริงๆ โดยไม่ต้องจำลองชุดคำสั่งบน QEMU ผลที่ได้จึงทำให้การจำลองระบบ x86 บนซีพียู x86 ทำงานได้เร็วขึ้น .. ข้อเสียของ KQEMU คือ 1. ต้อง compile QEMU + KQEMU เอง และ 2. ใช้งานกับ x86 ได้เท่านั้น .. วิธีการคือ ดาวน์โหลด ซอร์ส ของ QEMU และ KQEMU มา จากนั้นแตก src ของ QEMU ก่อน แล้วค่อยแตก src ของ KQEMU ภายในไดเรคทอรีของ QEMU

$ tar xzf qemu-0.7.1.tar.gz
$ cd qemu-0.7.1
$ tar xzf ../kqemu-0.7.1.tar.gz

แล้วค่อย

$ ./configure
$ make
$ sudo make install

QEMU จะติดตั้งลงใน /usr/local/* และติดตั้ง kernel modules ลงใน /lib/modules//misc/

การใช้งาน kqemu ก่อนอื่น ต้องสั่งโหลดเคอร์เนลโมดูล as root :

# modprobe kqemu major=0

จะได้ /dev/kqemu โผล่ขึ้นมา .. แก้ permission เป็น 666

# chmod 666 /dev/kqemu

ก็เป็นอันเรียบร้อย ทีนี้ก็เรียกใช้ qemu ตามปกติ โปรแกรมจะเรียกใช้งาน KQEMU ซึ่งควรจะทำงานได้เร็วขึ้น

ถ้าไม่อยากมานั่งแก้ permission ทุกครั้งที่สั่ง modprobe ก็ใช้ udev ช่วยได้ สำหรับ Ubuntu ให้สร้างไฟล์ /etc/udev/permission.d/kqemu.permissions ตามนี้

# kqemu
kqemu:root:root:0666

จะทำให้เวลา modprobe kqemu แล้ว udev จะสร้าง dev เป็น permission 666 อัตโนมัติ

Conclusions

สรุปแล้ว QEMU ก็ช่วยให้ติดตั้ง Windows 2000/XP ได้ตามที่ต้องการ .. บนเครื่อง Athlon XP 2000+ ตอบสนองการสั่งงานได้เร็วใช้ได้ ส่วนบน P-III 1 GHz ช้าไปหน่อย ช้าจนเซอร์วิสบางตัวของ Windows 2000 บางตัวไม่สามารถ startup ได้ในเวลาที่กำหนด ..ในกลุ่มซอฟต์แวร์ที่ใช้วิธี emulation นี้ถือว่า QEMU นี่เร็วสุดแล้วแหละ .. ถ้าต้องการเร็วกว่านี้ก็คงต้องเลือกใช้พวกที่เป็น virtualization อย่าง Win4Lin หรือ VMWare ซึ่งเป็น commercial .. หรือไม่ก็ xen ซึ่งทดสอบกันมาแล้วว่าทำงานแบบ virtualization ได้เร็วกว่า Win4Lin/VMWare ซะอีก แถมยังเป็นโอเพ่นซอร์สด้วย เท่าที่ลองดูก็น่าสนใจทีเดียว จะติดก็ตรงที่มันต้องทำอะไรกับเคอร์เนลเยอะไปหน่อย เลยไม่ค่อยอยากใช้ .. เห็นผ่านๆ ตาแวบๆ ว่า Ubuntu จะเอา Xen เข้าไปรวมด้วย คาดว่าคงได้เห็น stable ประมาณเวอร์ชัน 6.04 (เป็นอย่างเร็ว).. ถึงเวลานั้นค่อยว่ากันอีกที :P