ubuntu: feisty - qemu

เดี๋ยวนี้ qemu พร้อม kqemu มีเป็นแบบแพกเกจเรียบร้อย การติดตั้งจึงต่างออกไปจากเดิม
สำหรับใน Feisty การติดตั้งเป็นดังนี้

ส่วนของ qemu
ติดตั้ง qemu
$ sudo aptitude install qemu

ส่วนของ kqemu
ติดตั้ง module-assistant
$ sudo aptitude install module-assistant

ติดตั้ง kqemu ผ่าน module-assistant
$ sudo m-a a-i kqemu

ใน Feisty ไม่ยอมสร้าง /dev/kqemu ให้ ต้องทำเอง
$ sudo mknod /dev/kqemu c 250 0
$ sudo chmod 666 /dev/kqemu
$ sudo modprobe kqemu

ส่วนของเน็ตเวิร์ก
สร้างตาราง nat ไว้รอก่อน
$ sudo iptables -t nat -D POSTROUTING -j MASQUERADE -o eth0
$ sudo iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0

ติดตั้งแพกเก็จชื่อ uml-utilities
$ sudo aptitude install uml-utilities

เอาอินเทอร์เฟส tun ขึ้นมา
$ sudo modprobe tun
$ sudo chmod 666 /dev/net/tun

qemu จะใช้งานเน็ตเวิร์กผ่านอินเทอร์เฟส tap0 เราจึงต้องสร้าง tap0 ขึ้นมา สมมุติว่าเราชื่อ user1
$ sudo tunctl -u user1

เสร็จแล้ว

สมมุติว่าเรามีอิมเมจ winxp.img อยู่แล้ว สามารถเรียกใช้งาน qemu ด้วย
$ qemu -kernel-kqemu -hda winxp.img -net nic -net tap,ifname=tap0

บันทึกเกร็ดเพิ่มเติม

  • ทดสอบไปทดสอบมา ดูแล้ว qemu น่าใช้ที่สุด เนื่องจากการทำงานราบเรียบกว่า Xen, VirtualBox, kvm, VMWare แพ้แต่ Parallel เท่านั้น ถึงแม้จะรันช้ากว่า แต่มีข้อดีตรงที่เราสามารถปรับเปลี่ยนได้ตามที่เราต้องการ
  • ในขั้นตอนติดตั้งโปรแกรม ควรปิดการทำงานของ kqemu โดยถ้าเป็น Windows Xp ให้เอาออปชั่น -kernel-kqemu ออก และถ้าเป็น Windows 98-ME ให้เติมออปชั่น -no-kqemu
  • ถ้าเป็นซีพียูตระกูลอินเทล - VT จะได้ความเร็วที่ราบรื่น แม้ไม่ได้ใส่ออปชั่น -kernel-kqemu ก็ตาม
  • เวลาติดตั้งโปรแกรม ควรใช้ประโยชน์จากการที่ qemu สามารถทำ overlay ได้มีเทคนิกดังนี้
    1. สร้างอิมเมจหลักก่อน สมมุติว่าชื่อ winxp.qcow
      $ qemu-img create -f qcow winxp.qcow 5G
    2. ติดตั้งวินโดวส์ โดยใช้ hda เป็น winxp.qcow จนเสร็จเรียบร้อย
    3. สร้าง Overlay image เพื่อเก็บอิมเมจเก่าไว้
      $ qemu-img create -b winxp.qcow -f qcow winxp.ovl
    4. ติดตั้งโปรแกรม หรือทำการทดลองใด ๆ บน Overlay image ที่สร้างขึ้น
    5. ถ้าติดตั้งไม่ผ่าน หรือทดลองจนงานเละ ก็ให้ลบอิมเมจ winxp.ovl ทิ้งไป แล้วเริ่มขั้นตอนก่อนหน้านี้ใหม่
    6. ถ้าติดตั้งหรือทดลองจนเสร็จเรียบร้อยแล้ว และต้องการบันทึกงานเข้าไปรวมกับอิมเมจเก่า ให้ใช้คำสั่ง
      $qemu-img commit winxp.ovl
      ผลคือข้อมูลใน winxp.ovl จะถูกบันทึกลงใน winxp.qcow และ winxp.ovl จะถูกลดขนาดลงมา พร้อมที่จะรับงานใหม่ต่อไป
  • ทดสอบล่าสุดบนเดเบียน qemu รุ่น 0.8.2 ซีพียู Pentium E6300 พบว่า
    • บน WindowsXP สั่งด้วย qemu เฉย ๆ เร็วกว่าใช้พารามิเตอร์ -kernel-kqemu
    • บน WindowsMe สั่งด้วย qemu -no-kqemu เร็วและเสถียรกว่า qemu เฉย ๆ (การสั่งด้วย qemu เฉย ๆ จะเปิดใช้งาน kqemu ในโหมด user โดยอัตโนมัติ)
    • บน WindowsMe สั่งด้วย qemu-system-x86_64 เฉย ๆ เสถียรเท่ากับสั่งด้วย qemu -no-kqemu แต่ช้ากว่า

    สรุปว่าสำหรับ qemu ตั้งแต่รุ่น 0.8.2 เป็นต้นไป ต้องทดลองดูหลาย ๆ แบบ ดูว่าแบบไหนดีที่สุด ไม่จำเป็นต้องเป็นตามคู่มือเสมอไป

หมายเหตุ

  • ผมอัปเกรดจาก dapper ด้วยคำสั่ง aptitude dist-upgrade จึงอาจมีสคริปต์เก่าหลงเหลืออยู่ ไม่แน่ใจว่าถ้าติดตั้งอูบุนตูจากแผ่นติดตั้งของ Feisty ล้วน ๆ ขั้นตอนการติดตั้ง qemu จะต่างออกไปจากนี้หรือไม่

อ้างอิง

debian: qemu เก็บตก

ทดลองใช้ qemu กับ usb
ในการสั่งรัน ต้องเติมพารามิเตอร์ -usbdevice host:XXXX:XXXX ต่อท้ายคำสั่ง
ซึ่งค่านี้คือค่า Vender ID และ Product ID ตามลำดับ โดยหาได้จากคำสั่ง lsusb

ตัวอย่างของเครื่องผมคือ
ต้องการใช้งาน usb ใน qemu โดยมี Printer Epson Stylus Photo 830 และสแกนเนอร์ UMAX Astra 5650

ดูค่าไอดี
$ lsusb

Bus 005 Device 001: ID 0000:0000  
Bus 004 Device 001: ID 0000:0000  
Bus 003 Device 002: ID 04b8:0005 Seiko Epson Corp. Stylus Printer
Bus 003 Device 001: ID 0000:0000  
Bus 002 Device 001: ID 0000:0000  
Bus 001 Device 002: ID 0461:0392 Primax Electronics, Ltd 
Bus 001 Device 001: ID 0000:0000  

สั่งรัน qemu
$ qemu YOUR-PARAMETER -usbdevice host:04b8:0005 -usbdevice host:0461:0392

เสียง
ใช้คำสั่ง
$ qemu YOUR-PARAMETER -soundhw all

Topic: 

debian: บันทึกการปรุง qemu รุ่นปรับแก้ NumLock/CapsLock เพื่อแจกจ่าย

รุ่นนี้เป็นรุ่นปรับแก้บั๊กเรื่อง NumLock/CapsLock ไม่ยอมเปลี่ยน ตามที่เคยบันทึกไว้

แต่ผมลืมแพกเกจที่ต้องการก่อนติดตั้งหมดแล้ว ฝากดูเอาเองตอน debuild หรือ configure

วิธีสร้างแพกเกจเดเบียน
$ sudo aptitude install devscripts
$ apt-get source qemu
$ cd qemu-0.9.0+20070816
$ vi sdl.c

. . .
    if (ev->keysym.sym == SDLK_PAUSE) {
        /* specific case */
        v = 0;
        if (ev->type == SDL_KEYUP)
            v |= 0x80;
        kbd_put_keycode(0xe1);
        kbd_put_keycode(0x1d | v);
    //    kbd_put_keycode(0x45 | v);
        return;
    }

    if (kbd_layout) {
        keycode = sdl_keyevent_to_keycode_generic(ev);
    } else {
        keycode = sdl_keyevent_to_keycode(ev);
    }

    switch(keycode) {
    case 0x00:
        /* sent when leaving window: reset the modifiers state */
        reset_keys();
        return;
    case 0x2a:                          /* Left Shift */
    case 0x36:                          /* Right Shift */
    case 0x1d:                          /* Left CTRL */
    case 0x9d:                          /* Right CTRL */
    case 0x38:                          /* Left ALT */
    case 0xb8:                         /* Right ALT */
        if (ev->type == SDL_KEYUP)
            modifiers_state[keycode] = 0;
        else
            modifiers_state[keycode] = 1;
        break;
    //case 0x45: /* num lock */
    //case 0x3a: /* caps lock */
        /* SDL does not send the key up event, so we generate it */
    //    kbd_put_keycode(keycode);
    //    kbd_put_keycode(keycode | 0x80);
    //    return;
    }
. . .

$ debuild -us -uc
จะได้แพกเกจเดเบียน ตามต้องการ

ติดตั้งด้วยคำสั่ง
$ sudo dpkg -i ../qemu_0.9.0+20070816-1_i386.deb

วิธีสร้างแพกเกจแบบทั่วไป
$ wget http://fabrice.bellard.free.fr/qemu/qemu-0.9.0.tar.gz
$ tar xfz qemu-0.9.0.tar.gz
$ cd qemu-0.9.0
$ configure --cc=gcc-3.4
$ make
$ checkinstall -D make install
$ make qemu-doc.html
$ make qemu-tech.html
$ make qemu.1
$ make qemu-img.1
$ sudo make install-doc
$ make tarbin

จะได้แพกเกจ qemu-0.9.0-i386.tar.gz ตามต้องการ โดยไฟล์จะมาอยู่ที่ไดเรกทอรี่ Home

Download
หากคร้านที่จะคอมไพล์เอง ดาวน์โหลดได้ที่นี่ครับ ฝากทดสอบบั๊กให้ด้วย

อ้างอิง
Murray's Blog: Building modified debian packages

บันทึกการแก้ปัญหา Num Lock - Caps Lock ของ qemu

เมื่อได้ลองใช้งาน qemu แบบจริงจัง เจอปัญหาว่า Num Lock กับ Caps Lock มีอาการแปลก ๆ กดแล้วได้ผลบ้าง ไม่ได้ผลบ้าง
เลยลองถอด qemu ของดิสโตร แล้วดาวน์โหลด qemu รุ่นล่าสุดมาลองดูซอร์สโค๊ด
$ sudo aptitude remove qemu
$ wget http://fabrice.bellard.free.fr/qemu/qemu-0.9.0.tar.gz
$ tar xfz qemu-0.9.0.tar.gz
$ cd qemu-0.9.0

ค้นข้อมูลในกูเกิลดู พบว่าต้นตออยู่ที่ไฟล์ sdl.c
พบว่า qemu แก้ปัญหา sdl ไม่ยอมส่งรหัส Num Lock - Caps Lock ไปให้ระบบ ด้วยการเขียนโค๊ดส่งรหัสเอง
แต่ปัจจุบันนี้ sdl น่าจะแก้ปัญหานี้แล้ว แต่โค๊ดส่วนนี้ยังคงอยู่ เลยทดลองเติมคอมเมนต์ในโค๊ดส่วนนี้ดู
$ vi sdl.c

...
    //case 0x45: /* num lock */
    //case 0x3a: /* caps lock */
        /* SDL does not send the key up event, so we generate it */
    //    kbd_put_keycode(keycode);
    //    kbd_put_keycode(keycode | 0x80);
    //    return;
    ...

แล้วจึงคอมไพล์ใหม่ ด้วย gcc-3.4 ซึ่งต้องติดตั้งใหม่
$ sudo aptitude install gcc-3.4
$ ./configure --cc=gcc-3.4
$ make
$ sudo make install

ผลปรากฎว่า สามารถใช้คีย์ Num Lock และ Caps Lock ได้อย่างที่ควรจะเป็นครับ

ทดลองกับเดเบียน Lenny และอูบุนตู Feisty ไลบรารี libsdl1.2-dev ทั้งคู่