使用Busybox做一個小巧的Linux作業系統

來源:互聯網
上載者:User
 

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的命令和工具。

 

下載 http://busybox.net/downloads/

使用過程中許多高版本都出現編譯錯誤,所以用了一個最原始的版本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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.