定製根文件系統的方法不少,最經常使用的是使用BusyBox來構建定製根文件系統。它集成壓縮了Linux的許多工具和命令,能夠使用戶迅速方便地創建一套相對完整、功能豐富的文件系統,其中包括大量經常使用的應用程序。下面詳細介紹有關Busybox定製根文件系統。html
在/home/xxx/xxx目錄下創建rootfs目錄,linux
$ mkdir rootfsgit
$ cd rootfsgithub
$ mkdir root bin sbin etc dev usr lib tmp mnt sys proc var //創建經常使用目錄shell
$ mkdir usr/lib usr/bin usr/sbinbash
$ tar -jxvf busybox-1.26.2.tar.bz2ide
$ make distclean函數
$ make defconfig工具
$ make menuconfig ARCH=armui
3.1選擇Busybox Settings --->
Installation Options --->
BusyBox installation prefix(在裏面輸入BusyBox的安裝目錄,我是保存在/home/xxx/xxx/rootfs下)
3.2選擇Busybox Settings --->
選中[*] Don't use /usr
3.3 Busybox Settings---->
Build Options---->
選中 [*]Build BusyBox as a static binary(靜態連接)
Cross Compiler prefix配置爲arm-linux-gnueabi-(指定交叉編譯器)
配置好後,保存相關配置信息。
$ make
$ make install
dev目錄下必須有console和null這兩個設備文件,使用mknod來建立這兩個設備文件。
$ cd dev/
$ sudo mknod -m 666 console c 5 1
$ sudo mknod -m 666 null c 1 3
$ cd /home/xxx/xxx/rootfs/etc
$ cp /home/ xxx/xxx/Downloads/busybox-1.26.2/examples/bootfloppy/etc/* ./ -raf
7.一、修改fstab配置文件爲:
1 proc /proc proc defaults 0 0 2 tmpfs /tmp tmpfs defaults 0 0 3 sysfs /sys sysfs defaults 0 0 4 tmpfs /dev tmpfs defaults 0 0 5 var /dev tmpfs defaults 0 0 6 ramfs /dev ramfs defaults 0 0 7
7.2修改profile文件爲:
# /etc/profile: system-wide .profile file for the Bourne shells USER="id -un" LOGNAME=$USER HOSTNAME='/bin/hostname' export PS1='[\u@\h:\w]\#' PATH=/bin:/sbin:/usr/bin:/usr/sbin LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH export PATH LD_LIBRARY_PATH
7.3修改inittab文件爲:
# /etc/inittab ::sysinit:/etc/init.d/rcS ::askfirst:-/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ::restart:/sbin/init
在啓動過程當中bootloader會傳遞參數init=/linuxrc給內核的main( )函數,因此在文件系統被掛載後,運行的第一個程序是linuxrc,而linuxrc是一個指向/bin/busybox的連接文件,也就是說文件系統被掛在後運行的第一個程序是busybox。Busybox首先會解析文件/etc/inittab,這個文件中存放的是系統的配置信息,這些配置信息指明瞭接下來將要啓動那些程序。
/etc/inittab 文件中每一個條目用來定義一個子進程,並肯定它的啓動方法,格式以下
<id>:<runlevels>:<action>:<process>
<id>:表示這個進程要使用的控制檯(即標準輸入、標準輸出、標準錯誤設備)。若是省 略,則使用與init進程同樣的控制檯。
<runlevels>:對於Busybox init程序,這個字段滑意義,能夠省略。
<action>:表示init程序如何控制這個子進程,
<process>: 要執行的程序,它能夠是可執行程序,也能夠是腳本
文件etc/inittab配置條目說明以下:
::sysinit:/etc/init.d/rcS 啓動系統初始化文件/etc/init.d/rcS。字段sysinit代表文件/etc/init.d/rcS在系統啓動後最早執行,而且只執行一次,init進程等待它結束才繼續執行其它動做。(腳本文件名通常爲rc,後綴S表明單用戶運行級別腳本)
::askfirst:-/bin/sh 啓動askfirst動做的shell。askfirst代表init進程先輸出「Please press Enter to actvie this console」,等用戶輸入回車鍵以後才啓動-/bin/sh。
::ctrlaltdel:/sbin/reboot 當按下Ctrl+Alt+Delete組合鍵時,init重啓執行程序。字段ctrlaltdel代表當按下Ctrl+Alt+Delete組合鍵時,執行相應的進程。
::shutdown:/bin/umount -a -r 告訴init在關機時運行umount命令卸載全部的文件系統,若是卸載失敗,試圖以只讀方式從新掛載。字段shutdown代表在重啓關閉系統命令時執行相應進程。
7.4 配置系統的hostname。在etc目錄下執行以下命令:
$ mkdir sysconfig
$ cd sysconfig
$ touch HOSTNAME
$ echo tiny4412 > HOSTNAME
7.5 配置init.d/rcS文件爲:
#! /bin/sh PATH=/sbin:/bin:/usr/bin:/usr/sbin runlevel=S prevlevel=N umask 022 export PATH runlevel prevlevel mount -a mkdir -p /dev/pts mount -t devpts devpts /dev/pts #mount -n -t usbfs none /proc/bus/usb echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s mkdir -p /var/lock ifconfig lo 127.0.0.1 /bin/hostname -F /etc/sysconfig/HOSTNAME
修改init.d/rcS文件權限爲:
$ chmod 777 init.d/rcS
詳解:
#!/bin/sh #用busybox的shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #shell命令的搜索路徑
runlevel=S #運行在單用戶模式
prevlevel=N #前一個級別,爲N則表示沒有前一個級別
umask 022 #權限位掩碼
export PATH runlevel prevlevel #將環境的變量導出到環境中
mount -a #將文件 /etc/fstab 中指明的文件掛載到對應的掛載點上
echo /sbin/mdev>/proc/sys/kernel/hotplug #當有熱插拔事件產生時, 內核就會調用位於/sbin目錄的 mdev。 這時 mdev經過環境變量中的 ACTION 和 DEVPATH,(這兩個變量是系統自帶的)來肯定這次熱插拔事件的動做以及影響了/sys 中的那個目錄。接着會看看這個目錄中是否有「dev」的屬性文件,若是有就利用這些信息爲 這個設備在/dev 下建立設備節點文件。
mdev -s #創建dev目錄。以‘-s’爲參數調用位於/sbin 目錄寫的 mdev(實際上是個連接,做用是傳遞參數給/bin目錄下的busybox 程序並調用它) ,mdev掃描 /sys/class和/sys/block中全部的類設備目錄,若是在目錄中含有名爲「dev」的文件,且文件中包含的是設備號,則 mdev 就利用這些信息爲這個設備在/dev下建立設備節點文件。通常只在啓動時才執行一次 「mdev -s」 。
7.6設置ROOT用戶(在etc下)
添加passwd
文件:
root:x:0:0:root:/root:/bin/bash
添加group
文件
root:x:0:
添加shadow
文件
root:$6$whiml8Gm$IuKrjGatftq.i6i3OYiu9EP3Rou.RtC2gKC0neyDgM/D5gGBzZwfCUiVoLAj.rWjEmSIwkIe2sKI0DpUusTDn1:17260:0:99999:7:::
#!/bin/bash rm -rf ramdisk* sudo dd if=/dev/zero of=ramdisk bs=1k count=8192 sudo mkfs.ext4 -F ramdisk sudo mkdir -p ./initrd sudo mount -t ext4 ramdisk ./initrd
sudo cp rootfs/* ./initrd -raf sudo mknod initrd/dev/console c 5 1 sudo mknod initrd/dev/null c 1 3 sudo umount ./initrd sudo gzip --best -c ramdisk > ramdisk.gz sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img rm ramdisk ramdisk.gz initrd -rf
把該腳本拷貝到rootfs同一目錄下,執行該腳本製做Ramdisk文件系統。生成的ramdisk.img就是咱們須要的Ramdisk文件系統。