1. 程式人生 > >基於busybox的Linux小系統制作 (initrd)

基於busybox的Linux小系統制作 (initrd)

準備環境:
1、一個Redhat完整系統的虛擬機器,本次例項使用的是Redhat Enterprise Linux 5.8
2、在主虛擬機器上新增一塊硬碟作為小系統的儲存盤,這裡新增的是IDE硬碟,
3、準備linux核心原始碼以及busybox原始碼,這裡使用linux-2.6.38.5和busybox-1.20.2版本
4、複製當前系統上的核心配置(/usr/src/kernel/2.6.18-308.el5-i686/.config),做略微修改;若當前系統核心版本與小linux的核心版本不同,可準備一個匹配的核心藍本。我這裡由於主系統的核心版本比較老,所以準備了一個較新的核心藍本(kernel-2.6.38.1-i686.cfg)進行修改編譯。


具體過程:
一、編譯核心
1、將/root下的核心原始碼解壓縮至/usr/src下的linux-2.6.38.5,並給其建立一個連線,命名為linux 
2、在linux核心連結檔案中以/root/kernel-2.6.38.1-i686.cfg為藍本編譯核心
(1)複製核心藍本至/usr/src/linux目錄下,命名為.config
(2)對當前核心進行編譯,可根據實際需要來選擇各種功能。本次例項主要是將ext3檔案系統以及pcnet32的vmware虛擬機器網絡卡驅動直接裝載進核心,其他的按需選擇。結束後將編譯的功能可自動儲存至.config檔案中。最後執行make SUBDIR=/arch 進行編譯
【進入手動編譯核心介面,前提是grouplist裡已安裝"Development Tools""Development Libraries"組,若未安裝,則配置yum源,安裝這兩個包組】

【在Device Drivers --> Network device support --> Ethernet (10 or 100Mbit) --> 查詢AMD PCnet32 PCI support ,將其改為* 即直接編譯進核心】
【在File systems --> 中將Ext3裝載進核心】
【儲存退出】
【執行make SUBDIR=/arch進行編譯,注:上述必須在/usr/src/linux中進行】

 
編譯過程大概需要一段時間,可等其編譯完成,也可提前做下一步。
二、編譯busybox
1、在新硬碟上分割槽,這裡需要一個大小100M的主分割槽作為小系統的boot分割槽,一個512M大小的主分割槽為小系統的根分割槽。將這兩個分割槽格式化後,分別掛載至/mnt/boot和/mnt/sysroot目錄。
  
(忘了說,w儲存退出)
 # 同步磁碟
2、安裝grub
 

3、編譯busybox

【此處的預設配置提供很多我們需要的程式,因此不進行過多的修改,只需將編譯選項改改,編譯成一個不使用共享庫的靜態二進位制檔案,從而避免了對主系統機的共享庫產生依賴;但你也可以不選擇此項,而完成編譯後把其依賴的共享庫複製至目標系統上的/lib目錄中即可;這裡採用前一種辦法。】
Busybox Settings --> Build Options -->  Build BusyBox as a static binary (no shared libs)
【儲存退出】
【接著進行make install編譯 注:是在busybox-1.20.2目錄下進行】

三、製作initrd
(1)建立一個目錄專門用來實現基於busybox的initrd

(2)在/tmp/initrd下製作initrd
【提供基本目錄】
 
【建立init指令碼】
#  vim /tmp/init

#  chmod +x init  加執行許可權
【製作initrd;歸檔並壓縮當前目錄下的所有檔案至/mnt/boot/initrd.gz】
四、核心編譯成功後,裝載核心

五、提供grub配置檔案
#  vim  /mnt/boot/grub/grub.conf


六、建立一個真正的根檔案系統
【將busybox-1.20.2/_install/*複製到/mnt/sysroot/ 即將busybox製作的rootfs作為小linux的根檔案系統】

【建立所需的目錄,即建立rootfs】

【建立兩個必要的裝置檔案】

【配置init及其所需要inittab檔案,即為init程序提供配置檔案】
#  vim  /mnt/sysroot/etc/inittab

【建立系統初始化指令碼】
#  vim  /mnt/sysroot/etc/rc.d/rc.sysinit

【提供開機自動掛載的配置檔案etc/fstab】
#  vim  /mnt/sysroot/etc/fstab
【為了適應我們習慣了使用的bash,這裡將bash複製過去,並將之前的指令碼中的sh改為bash】

將etc/inittab中設定的sh改為bash即可
#  vim /mnt/sysroot/etc/inittab

【進行同步】