2014/02/20

[Linux] Ubuntu12.04下利用 QEMU + chroot來編譯 Linux Kernel

為了避免在編譯Linux Kernel的錯誤,把原本的Linux OS損壞。可以採用在原本的Linux中使用QEMU的Guset OS的Linux的環境來編譯Kernel,這樣就可以避免修改到原本的OS系統,細節可以參考這篇文章

不過照著教學的步驟,使用Ubuntu 12.04來設定QEMU和編譯可能會遇到一些問題,像是一開始安裝QEMU和KVM之後
$ sudo apt-get install qemu qemu-kvm
會發現其實在Ubuntu 12.04找不到qemu的指令



上網查了一下發現要改成
$ sudo apt-get install qemu-system kvm
改用qemu-system-i386的指令取代qemu就可以在Ubuntu 12.04上跑QEMU虛擬系統了。

再來,設定準備子系統
$ dd if=/dev/zero of=disk.img bs=1 count=1 seek=10737418239
切割設定為10GB的硬碟大小。

執行安裝Ubuntu 12.04
$ qemu-system-i386 -hda disk.img -m 1024 -cdrom ubuntu-12.04.3-desktop-i386.iso -boot d
會發現有一個warning,說無法啟動KVM,這個是因為沒有安裝kvm
$ sudo modprobe kvm-intel
但執行後可能會看到
這個是因為CPU並沒有把Virtualization Technology給enable,這部分要進BIOS設定,可以參考這篇。不過就算不安裝kvm也不會怎樣,只是QEMU會跑得比較慢而已...

結論是這樣就可以開始載入Ubuntu 12.04到QEMU中了。

安裝過程

安裝完成之後就可以開啟QEMU中的Ubuntu了,不過因為需要用到網路,所以要使用以下指令,net採用user mode有點類似VirtualBox的NAT網路模式,會由Host OS端發虛擬IP給Guset OS端上網使用。
$ qemu-system-i386 -net nic -net user -hda disk.img -m 2047
如果電腦記憶體夠大的話可以給2GB,讓QEMU執行可以快點。
開機後確定上網OK。

然後在子系統中下載需要編譯Kernel的library。
\> sudo apt-get build-dep linux
\> sudo apt-get install libncurses5-dev
最後就可以關閉QEMU了。
\> sudo shutdown -h now


接著要利用chroot來編譯Kernel,首先要把Guset OS掛載到Host OS,讓Host端的Ubuntu可以讀取Guest端的File system,藉此傳檔案及編譯Kernel,速度會比在QEMU上跑快速很多,但風險是不要在此時使用root權限,不然有可能會改到Host端的OS本身的內容。
$ sudo losetup /dev/loop0 disk.img
$ sudo fdisk /dev/loop0
$ sudo losetup -d /dev/loop0

在主系統的partition資料夾掛載子系統的分割區
$ mkdri partition
$ sudo losetup --offset 1048576 /dev/loop0 disk.img
$ sudo mount /dev/loop0 partition
掛載成功後會看到partition資料夾內可以看到Guest OS的Ubuntu 12.04的File system

修改資料夾權限,然後把Linux kernel 3.5.5解壓縮到partition資料夾下的usr/src
$ sudo chown brown:brown partition/usr/src
$ tar jxf linux-3.5.5.tar.bz2 -C partition/usr/src
$ sudo chown root:root partition/usr/src
就可以準備來編譯Kernel了。

沒有留言:

張貼留言