基于busybox构建rootfs
它整合了許多Linux上常用的工具和命令(utilities), 如rm, ls, gzip, tftp等。對于這些工具和命令,busybox中的實現可能不是最全的,但卻是最常用的,因此它的特點就是短小精悍,特別適合對尺寸很敏感的嵌入式系統。
?
官網:https://busybox.net/
參考: http://www.tldp.org/HOWTO/Bootdisk-HOWTO/buildroot.html
?
busybox有兩個作用:
-
基于busybox構建rootfs
-
編譯生成Linux上常用的工具和命令
?
toolchain:gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu
?
?
1.?下載busybox
進官網,選擇 BusyBox 1.31.1下載
解壓:tar -vxjf busybox-1.31.1.tar.bz2
?
?
2.?配置
2.1?使用默認配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
-
defconfig,缺省配置,也就是默認配置選項。
-
allyesconfig,全選配置,也就是選中 busybox 的所有功能。
-
allnoconfig,最小配置。
?
2.2?定制
執行:make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-?menuconfig
默認配置即可
?
?
3.?build
3.1?創建一個文件夾用來存放roofs
cd ~/tools
mkdir rootfs
?
3.2 make
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- install CONFIG_PREFIX=/home/wangbaoli/tools/rootfs
CONFIG_PREFIX=/home/wangbaoli/tools/rootfs用來指定安裝文件夾
編譯完成后,工具和命令被安裝到~/tools/rootfs
?
?
4.?添加lib庫
4.1?lib
lib文件夾中包含*.so *.a庫,理論上我們應該copy?gcc-toolchain下的lib庫,并且根據需要做一定的刪減,否者的話rootfs體積會太大。
gcc-toolchain下的lib庫:/usr/local/gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib/
但是,這里為了節省做裁剪的時間,我直接復制已有rootfs的lib庫。
1)mkdir?lib
2)cp ~/repo/rootfs/buildroot-2019.02.5/output/target/lib/* ./lib
注:~/repo/rootfs/buildroot-2019.02.5/output/target?是buildroot默認的rootfs存放路徑
3)創建lib64到lib的軟連接
ln -s lib lib64
?
4.2?usr/lib
usr/lib文件夾中包含*.so *.a庫,理論上我們應該copy?gcc-toolchain下的usr/lib庫,并且根據需要做一定的刪減,否者的話rootfs體積會太大。
gcc-toolchain下的usr/lib庫:/usr/local/gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/lib
但是,這里為了節省做裁剪的時間,我直接復制已有rootfs的usr/lib庫。
1)cd usr && mkdir lib
2)cp ~/repo/rootfs/buildroot-2019.02.5/output/target/usr/lib/* ./lib
3)ln -s lib lib64
?
?
5.?添加init和其他文件夾
5.1 執行:mkdir dev proc mnt sys tmp root
?
5.2?添加init
如果通過bootloader傳入命令行參數init=xxx(通常是init=linuxrc),那么系統掛載文件系統后運行linuxrc。
如果存在文件/init,那么系統掛載文件系統后運行/init,即內核啟動時會將/init作為第一個用戶進程啟動。
在rootfs下,新建init,添加:
#!/bin/sh
# devtmpfs does not get automounted for initramfs
/bin/mount -t devtmpfs devtmpfs /dev
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
exec /sbin/init "$@"
然后執行:chmod +x init
?
?
6.?完善
首先:mkdir etc && mkdir etc/init.d
在kernel掛載根文件系統后,運行的第一個程序是根目錄下的linuxrc或init(?如果bootargs 設置 init=/linuxrc則運行linuxrc),實際是一個指向/bin/busybox的鏈接, 也就是說系統起來后運行的第一個程序是busybox本身。
linux先執行 /etc/inittab, 然后調用/etc/init.d/rcS, 最后是執行/etc/profile。
?
6.1?創建 /etc/init.d/rcS
開機啟動腳本
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH runlevel
/bin/hostname?megvii
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
然后:chmod +x etc/init.d/rcS
?
6.2?創建 /etc/fstab
proc????/proc???proc????defaults 0 0
tmpfs???/tmp????tmpfs???defaults 0 0
sysfs???/sys????sysfs???defaults 0 0
tmpfs???/dev????tmpfs???defaults 0 0
fstab 在 Linux 開機以后自動配置哪些需要自動掛載的分區。
?
6.3?創建 /etc/inittab
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
?
6.4?創建/etc/profile
USER="`id -un`"????????????????????????????????????????????????????????????????
LOGNAME=$USER
HOSTNAME=`/bin/hostname`
HOME=/root
PS1="[$USER@$HOSTNAME \W]\# "
PATH=$PATH
export USER LOGNAME HOSTNAME HOME PS1 PATH PATH LD_LIBRARY_PATH
此文件涉及系統的環境,即環境變量相關。這里修改會對所有用戶起作用。
用戶登錄或切換(即Login shell 啟動)時都有一個專用的運行環境,但首先執行 /etc/profile 。
在 /etc/profile 文件中設置的變量是全局變量。而 .bashrc文件(在用戶的家目錄下)則只對當前用戶有用。
?
6.5最終目錄
?
?
7.?打包
可以將rootfs打包壓縮成各種格式,我打包成rootfs.cpio.gz
1) cd rootfs
2)?打包壓縮成rootfs.cpio.gz
-
find ./* | cpio -H newc -o >?rootfs.cpio
-
gzip rootfs.cpio
?
?
8.?測試
測試該rootfs.cpio.gz
boot?kernel,出現如下錯誤,我們逐個來解決:
?
8.1?VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
[????2.086084] VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
[????2.086155] Please append a correct "root=" boot option; here are the available partitions:
[????2.086250] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
完成上述步驟5.2,添加init
?
8.2 can't run '/etc/init.d/rcS': No such file or directory
解決:完成上述步驟6
?
8.3?成功時的界面:
?
8.4?優化
1)去掉:Please press Enter to activate this console.
在/etc/inittab,將::askfirst:-/bin/sh改為::respawn:-/bin/sh
2)設置hostname
在/etc/init.d/rcS加入/bin/hostname?yourname
3)設置user
在/etc/profile?設置USER=root
?
?
注:
1) 解壓rootfs.cpio.gz
gunzip?rootfs.cpio.gz
cpio -idmv <rootfs.cpio
?
?
總結
以上是生活随笔為你收集整理的基于busybox构建rootfs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ethtool编译与内核实现介绍
- 下一篇: build linux kernel