linux + busybox編譯以及在qemu中執行
轉自我自己的人人
linux核心至少有兩種方式編譯執行。一種是在一個linux系統上編譯完成得到二進位制檔案以後,把原來的linux核心(也就是剛剛用來編譯新核心的系統)直接替換,執行。這樣可能出現一個問題:如果新的核心有bug導致奔潰,也許就很難再把核心檔案改回原來的版本了,不得不重灌。另外一種就是本文的思路:在虛擬機器中執行新的linux核心,不必修改原來的linux系統,避免對原來系統的大手術。
(背景知識,只想知道安裝過程可跳過此段)有同學可能會問busybox是什麼東西,為什麼會多出一個東西需要編譯?大家可能見過一個名字叫GNU/Linux,為什麼linux前面加一個GNU呢?因為linux只是一個光桿司令核心,他並沒有提供和使用者互動的UI,也就是說沒有滑鼠、視窗、按鈕,甚至沒有命令列介面。在 GNU/Linux 系統中,Linux 就是核心元件。而該系統的其餘部分主要是由 GNU 工程編寫和提供的程式組成。"因為單獨的 Linux 核心並不能成為一個可以正常工作的作業系統,所以我們更傾向使用 “GNU/Linux” 一詞來表達人們通常所說的 “Linux”"。大家使用的Ubuntu等發行版是在GNU/Linux的基礎上加入各種UI和功能。還是沒說到busybox是什麼。。。。其實他就是linux上的一個命令列介面外加各種附加工具的工具包。有了它我們才能在新編譯的linux上輸入命令,進行互動。
好了,開始編譯吧。以下步驟在linux環境下完成
在www.kernel.org 下載一個linux原始碼包,我下載的是3.17版本
安裝配置工具,命令列:sudo apt-get install libncurses5-dev
安裝qemu虛擬機器:sudo apt-get install qemu
cd (原始碼包所在的目錄)
tar xf ./linux-3.17.tar.bz2
cd linux-3.17
make menuconfig
這時會彈出一個花花綠綠的選單,這是各種linux的編譯選項。為了提高編譯速度,我們可以把network,usb相關的程式選擇不編譯,也可以試一下不編譯哪些模組linux還能執行。或者保險起見什麼也不動,直接exit,儲存。
接下來命令列make
…….
linux漫長的編譯,我花了45分鐘
然後是busybox的編譯
http://www.busybox.net/ 下載busybox, 我下載的是busybox-1.22.0
命令列:
cd (原始碼包所在的目錄)
tar xv busybox-1.22.0.tar.bz2
cd busybox-1.22.0/
make menuconfig
這裡要注意了,在 Busybox Settings ---> Build Options --->的
[*] Build BusyBox as a static binary (no shared libs) 這個選項必須要選上(讓他前面有個*號)
然後exit儲存
然後命令列
make install
注意下檔案存放的位置,把linux-3.17和busybox-1.22.0兩個資料夾放在同一個資料夾裡(比如我放在了/home/menooker)
以/home/menooker資料夾為例,在/home/menooker新建一個文字檔案,命名makefs.sh。檔案管理器中右鍵之,屬性,許可權,允許作為執行檔案。右鍵檔案,編輯,在文字編輯器輸入
#!/bin/sh
KERNEL=$(pwd)
BUSYBOX=$(find busybox* -maxdepth 0)
LINUX=$(find linux* -maxdepth 0)
#create filesystem
cd $BUSYBOX
mkdir -pv proc sys dev etc etc/init.d
cat << EOF > etc/init.d/rcS
#!/bin/sh
#mount -t proc none /proc
#mount -t sysfs none /sys
#/sbin/mdev -s
/sbin/umount -a
/sbin/mount -a
/sbin/mount -t ext3 remount rw /
EOF
chmod 777 ./etc/init.d/rcS
cd -
mkfs.ext3 -m0 /dev/ram1
mkdir /mnt/ram
mount /dev/ram1 /mnt/ram
cp $BUSYBOX/* /mnt/ram -r
cp $BUSYBOX/_install/* /mnt/ram -r
sleep 1
umount /dev/ram1
dd if=/dev/ram1 of=rootfs.img
#create zip img
cd $KERNEL
gzip -c rootfs.img > rootfs.img.gz
這個檔案可以生成虛擬機器需要的rom,把busybox包含在其中。
回到命令列,
cd /home/menooker
sudo ./makefs.sh
應該可以在/home/menooker裡看到rootfs.img這個檔案
最後就是運行了,命令:qemu-system-i386 -kernel ./linux-3.17/arch/i386/boot/bzImage -initrd rootfs.img.gz -append "root=/dev/ram rdinit=sbin/init noapic"
等待其boot,如果成功執行在最後可以看到以下介面
這個就是新核心的虛擬機器,接下來你可以輸入各種命令調戲它了
p.s. 我是在ubuntu的VMWare虛擬機器中作以上嘗試的,虛擬機器中跑qemu虛擬機器貌似也沒啥問題
p.s. 本文是我根據自己安裝過程的記憶寫的,難免出現疏漏,僅作參考
感謝網上大神們分享的關於linux編譯,image製作,qemu的相關經驗,本文參考了