用busybox做一個迷你Linux

1.基礎知識
    一個操作系統可以簡單的抽象爲,引導程序+內核+文件系統。
    vmlinuz是Linux 內核的鏡像文件,可以被引導程序加載,從而啓動Linux系統。
    initrd的全稱是boot loader initialized RAM disk,它是系統啓動時所使用的根文件系統映像文件,這個文件系統中包含幾個驅動模塊,用來裝載實際的根文件系統,比如一個IDE或SCSI硬盤的驅動模塊,內核裝入這個模塊之後用它來驅動硬盤,掛接硬盤到ramdisk的某個子目錄,然後再用其中的pivot_root命令,將硬盤文件系統變成根文件系統,並開始執行init進程,此時init ram disk被umount,壽終正寢。
    由此可見,我們可以用vmlinuz+initrd.img做一個文件系同長駐內存的迷你Linux。
    現在進入正題了:
 
2.編譯內核
       cd /usr/src/....----進入內核源代碼目錄,沒有的話去官方網站,隨便下
      make menuconfig-----配置編譯選項請注意一定加入RAM disk support 和initial RAM disk  
                                      (initrd) support 的支持(在block device中)。另外最好將ext3文件系統
                                      編入內核,不要編成模塊。配置完畢後保存爲.config(默認)
      make bzImage----編譯
      在許多內核編譯參考中還有
      make modules
      make modules_install兩步
      但我們這裏沒有加入對modules的支持,所以不需要。
      生成的bzImage文件在usr/src/linux/arch/.../boot中,省略的根據你的機器架構決定,make過程中會有提示,比如我的是x86_64. 注意這個文件非常重要,其實就是我們最終的vmlinuz.

3.busybox
    busybox是一個集成了一百多個最常用linux命令和工具的軟件,它甚至還集成了一個http服務器和一個telnet服務器,而所有這一切功能卻只有區區1M左右的大小.我們平時用的那些linux命令就好比是分力式的電子元件,而busybox就好比是一個集成電路,把常用的工具和命令集成壓縮在一個可執行文件裏,功能基本不變,而大小卻小很多倍,在嵌入式linux應用中,busybox有非常廣的應用,另外,大多數linux發行版的安裝程序中都有busybox的身影,安裝linux的時候案ctrl+alt+F2就能得到一個控制檯,而這個控制檯中的所有命令都是指向busybox的鏈接.在我們的迷你Linux中,需要的也正是busybox的命令和工具。
下載 [url]http://busybox.net/downloads/[/url]
使用過程中許多高版本都出現編譯錯誤,所以用了一個最原始的版本busybox-1.00
#cp busybox-1.00.tar.gz /tmp/bunny
#cd /tmp/bunny
#tar xvfz busybox-1.00.tar.gz
#cd busybox-1.00
#make menuconfig ----編譯配置
下面是需要編譯進busybox的功能選項,其他的可以根據需要自選.
General Configuration應該選的選項
Show verbose applet usage messages
Runtime SUID/SGID configuration via /etc/busybox.conf
Build Options
Build BusyBox as a static binary (no shared libs)
這個選項是一定要選擇的,這樣才能把busybox編譯成靜態鏈接的可執行文件,運行時才獨立於其他函數庫.否則必需要其他庫文件才能運行,在單一個linux內核不能使他正常工作.
Installation Options
Don't use /usr
這個選項也一定要選,否則make install 後busybox將安裝在原系統的/usr下,這將覆蓋掉系統原有的命令.選擇這個選項後,make install後會在busybox目錄下生成一個叫_install的目錄,裏面有busybox和指向它的鏈接.
其他選項都是一些linux基本命令選項,自己需要哪些命令就編譯進去,一般用默認的就可以了.
配置好後退出並保存.config.
make
make install
編譯好後在busybox目錄下生成子目錄_install,裏面的內容:
bin
linuxrc -> bin/busybox
sbin
其中可執行文件busybox在bin目錄下,其他的都是指向他的符號鏈接.
 
4.製作自己的root fs
1)目錄結構
mkdir /tmp/myOS/rootfs
cd /tmp/myOS/rootfs
mkdir etc usr var tmp proc home root dev
其中etc,proc和dev是一定要建的,bin和sbin不用建,因爲busybox中已經有了.
其他的可以象徵性的建幾個就可以了.
拷貝busybox
#cp -R /tmp/bunny/busybox-1.00/_install/* /tmp/myOS/rootfs/
2)設備文件
我是直接從FC系統/dev目錄裏cp的,方法如下:
#cp -R /dev/console /tmp/myOS/rootfs/dev/
#cp -R /dev/null /tmp/myOS/rootfs/dev/
#cp -R /dev/zero /tmp/myOS/rootfs/dev/
你認爲需要的都cp過來
有的參考文獻說fd0,hda,ram,ram1,tty1,loop1,fb0,fb,tty等是必備的,但是好像有些文件並沒有
3)建立etc目錄下的配置文件
我是直接拷貝busybox自帶的例子
cp -R tmp/bunny/busybox-1.00/examples/bootfloppy/etc/*  /tmp/myOS/rootfs/etc
4)製作initrd.img映象文件
cd /tmp/myOS/
dd if=/dev/zero of=/tmp/disk bs=1M count=32    ------初始化32M內存空間
mkfs.ext3 -m0 /tmp/disk                        ------格式化爲ext3
mkdir /mnt/ram
mount -o loop /tmp/disk /mnt/ram                       ------掛載到/mnt/ram
cp -R rootfs/* /mnt/ram                        ------把rootfs寫入內存
umount /mnt/ram
dd if=/tmp/disk of=/tmp/myOS/initrd.img     ------把內存中的內容以映象方式取出
     ok,這個initrd.img就是我們的rootfs
有的文獻使用ram0,也就是將上述過程的/tmp/disk改爲/dev/ram0,雖然製作過程沒有問題,但是它存在大小限制
 
5.整合,啓動
1)kernel
  cp /usr/src/linux/arch/x86_64/bzImage /boot/vmlinuz
2)rootfs 一般命名爲initrd.img
  cp /tmp/myOS/initrd.img /boot
3)有了上述兩個文件,已經可以通過網絡dhcp, tftp服務器啓動,tftp服務器中添加啓動腳本如下
  DEFAULT linux
  PROMPT 0
  LABEL linux
  KERNEL vmlinuz
  append initrd=initrd.img devfs=nomount ramdisk_size=52000
 
問題:理論上這個小Linux也應該可以從grub引導,但是還沒配成功,歡迎補充。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章