[Linux]用Busybox做一個ROOTFS(根文件系統)

忘了到底前幾年看的一篇什麼busybox的教程,寫的極其複雜,以至於讓我這麼久以來一直不敢再去碰這個東西,直到今天又再次有了這個需求,特來再搞一次,沒想到不到倆小時,一次搞定,將這過程記錄下來,以後也好有個參考。

1 環境

宿主機: Ubuntu 18.04
交叉編譯工具鏈: aarch64-linux-gnu-gcc 7.4.0
目標機: Armv8 i.MX 8 EVK board

2 下載

busybox官網下載:https://busybox.net/,我是直接git clone的最新的1_31_stable分支
git clone git://git.busybox.net/busybox -b 1_31_stable
在這裏插入圖片描述

3 編譯

3.1 make defconfig

3.2 make menuconfig

這裏我們的原則是在make defconfig的基礎上儘可能少的改動這些config, 要改以下幾個地方,括號裏的是symbol,方便直接查找:

-> Settings
 --- Support --long-options
  [\*] Don't use /usr	#不要生成usr目錄	(CONFIG_INSTALL_NO_USR)
 --- Build Options
  [\*] Build static binary (no shared libs)  #進行靜態編譯	(CONFIG_STATIC)
 --- Installation Options ("make install" behavior)
  What kind of applet links to install (<choice> [=y])
   (X) as soft-links	(CONFIG_INSTALL_APPLET_SYMLINKS)
 --- Library Tuning
  [\*]   Query cursor position from terminal	(CONFIG_FEATURE_EDITING_ASK_TERMINAL)

結束,保存一下

3.3 make all

make ARCH=aarch64 CROSS_COMPILE=aarch64-linux-gnu- all

No Error, 必須的

3.4 make install

在當前目錄下會生成一個_install文件夾,到此我們的編譯算是完成了。

4 建立ROOTFS目錄結構

(起始路徑爲busybox的編譯根目錄,此處文件夾名爲busybox)
#mkdir ../rootfs		//創建一個rootfs目錄
#cd ../rootfs				//切換到rootfs目錄下
#mkdir dev etc lib usr var proc tmp home root mnt sys
#cd ../busybox/		//切換到busybox目錄下
#cp -ra _install/* ../rootfs
#cp -ra examples/bootfloppy/etc/*  ../rootfs/etc	//把fstab,init.d,inittab,profile拷貝過來,需修改
#cd ../rootfs/etc		//切換到rootfs的etc目錄下
#cp /etc/passwd .	//拷貝宿主機的passwd文件到rootfs的etc目錄中,需修改
#cp /etc/group .		//拷貝宿主機的group文件到rootfs的etc目錄中,需修改
#cp /etc/shadow .	//拷貝宿主機的shadow文件到rootfs的etc目錄中,需修改

5 修改上面的幾個文件

此操作的根文件夾爲rootfs文件夾內,目錄名爲rootfs

5.1 修改inittab

原始文件爲:
		::sysinit:/etc/init.d/rcS
		::respawn:-/bin/sh
		tty2::askfirst:-/bin/sh
		::ctrlaltdel:/bin/umount -a -r

修改後爲:
	---(1):開機免登陸直接進shell
	
		::sysinit:/etc/init.d/rcS
		console::askfirst:-/bin/sh
		::ctrlaltdel:/bin/umount -a -r

	---(2):開機需要登陸
	
		::sysinit:/etc/init.d/rcS
		::respawn:-/bin/login

5.2 修改profile

		PATH=/bin:/sbin:/usr/bin:/usr/sbin
		export LD_LIBRARY_PATH=/lib:/usr/lib
		/bin/hostname osee
		USER="`id -un`"
		LOGNAME=$USER
		HOSTNAME='/bin/hostname'
		PS1='[\u@\h \W]# '

5.3 修改 etc/init.d/rc.S

/bin/mount -n -t ramfs ramfs /var
/bin/mount -n -t ramfs ramfs /tmp
/bin/mount -n -t sysfs none /sys
/bin/mount -n -t ramfs none /dev
/bin/mkdir -p  /var/tmp
/bin/mkdir -p  /var/modules
/bin/mkdir -p  /var/run
/bin/mkdir -p  /var/log
/bin/mkdir -p /dev/pts						//telnet服務需要
/bin/mkdir -p /dev/shm						//telnet服務需要
#echo /sbin/mdev > /proc/sys/kernel/hotplug//USB自動掛載需要
/sbin/mdev -s         						//啓動mdev在/dev下自動創建設備文件節點
/bin/mount -a

#######配置網絡################################
/sbin/ifconfig lo 127.0.0.1 netmask 255.0.0.0
/sbin/ifconfig eth0 192.168.1.70
/sbin/ifconfig eth0 netmask 255.255.255.0
/sbin/route add default gw 192.168.1.1 eth0
/sbin/ifconfig eth1 192.168.1.71 netmask 255.255.255.0
/sbin/route add default gw 192.168.1.1 eth1

5.4 修改etc/fstab

none   /dev/pts    devpts   mode=0622      0 0
tmpfs  /dev/shm    tmpfs    defaults       0 0

5.5 修改passwd/group/shadow文件,只保留第一行

6 拷貝宿主機的libc到rootfs

#cp -ra /usr/aarch64-linux-gnu/lib/* rootfs/lib/

大功告成,快把卡插到目標機開發板上試下吧。

參考文獻:

1, 使用BusyBox製作嵌入式Linux根文件系統:https://www.cnblogs.com/Charles-Zhang-Blog/p/3419301.html
2, [Busybox]Busybox製作文件系統:https://www.cnblogs.com/aaronLinux/p/6886424.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章