roofs 根文件系統(tǒng)簡介制作(下)
1.根文件系統(tǒng)簡介
?根文件系統(tǒng)首先是內(nèi)核啟動時所mount的第一個文件系統(tǒng),內(nèi)核代碼映像文件保存在根文件系統(tǒng)中,而系統(tǒng)引導(dǎo)啟動程序會在根文件系統(tǒng)掛載之后從中把一些基本的初始化腳本和服務(wù)等加載到內(nèi)存中去運行。文件系統(tǒng)是對一個存儲設(shè)備上的數(shù)據(jù)和元數(shù)據(jù)進行組織的機制。這種機制有利于用戶和操作系統(tǒng)的交互。文件是用戶和操作系統(tǒng)之間交互的主要工具。
Linux啟動時,第一個必須掛載的是根文件系統(tǒng);若系統(tǒng)不能從指定設(shè)備上掛載根文件系統(tǒng),則系統(tǒng)會出錯而退出啟動。成功之后可以自動或手動掛載其他的文件系統(tǒng)。因此,一個系統(tǒng)中可以同時存在不同的文件系統(tǒng)。
??接下來以busybox-1.30.1版本為例實現(xiàn)根文件系統(tǒng)制作。
2.根文件系統(tǒng)制作
開發(fā)平臺:ubuntu18.04.6 開發(fā)板:Cortex-A9 tiny4412 BusyBox版本:1.30.1 交叉編譯器:arm-linux-gcc |
2.1 現(xiàn)在busybox源碼,配置環(huán)境,編譯源碼
??(1)下載busybox源碼,解壓到用戶目錄下。
[wbyq@wbyq src_pack]$ tar xvf /mnt/hgfs/ubuntu/software_pack/busybox-1.30.1.tar.bz2
??(2)配置編譯環(huán)境
[wbyq@wbyq src_pack]$ cd busybox-1.30.1/ [wbyq@wbyq busybox-1.30.1]$ make menuconfig Settings ---> (arm-linx-) Cross compiler prefix (NEW) (/home/wbyq/src_pack/rootfs) Destination path for 'make install'
??配置好后保存退出,make編譯。
2.2 編碼源碼
[wbyq@wbyq busybox-1.30.1]$ make
2.2.1 編譯錯誤1
??編譯過程中若出現(xiàn)以下錯誤,則重新打開配置菜單,將syncfs屏蔽即可。
[wbyq@wbyq busybox-1.30.1]$ make menuconfig
??修改完成后保存退出,再次重新編譯。
2.2.2 編譯錯誤2
??編譯過程中若出現(xiàn)以下錯誤,則重新打開配置菜單,將setns屏蔽即可。
[wbyq@wbyq busybox-1.30.1]$ make menuconfig
??解決錯誤后重新編譯安裝。
[wbyq@wbyq busybox-1.30.1]$ make && make install -j8
??編譯安裝成功。
2.3 完善根文件系統(tǒng)
??進入到rootfs安裝目錄下,進行根文件系統(tǒng)完善。
[wbyq@wbyq busybox-1.30.1]$ cd /home/wbyq/src_pack/rootfs/ [wbyq@wbyq rootfs]$ ls bin linuxrc sbin usr
2.3.1 參考ubuntu根目錄,創(chuàng)建必要目錄
[wbyq@wbyq rootfs]$ mkdir etc lib lost+found proc snap tmp boot home media root srv cdrom mnt run dev opt sys
2.3.2 創(chuàng)建必要文件
??創(chuàng)建 etc/profile 文件、 etc/init.d 目 錄、 etc/init.d/rcS 文件
[wbyq@wbyq rootfs]$ touch etc/profile [wbyq@wbyq rootfs]$ mkdir etc/init.d [wbyq@wbyq rootfs]$ touch etc/init.d/rcS [wbyq@wbyq init.d]$ chmod +x rcS
2.3.3 完善etc目錄
[wbyq@wbyq rootfs]$ cp /etc/passwd etc/ [wbyq@wbyq rootfs]$ cp /etc/group etc/ [wbyq@wbyq rootfs]$ cp /etc/fstab etc/ [wbyq@wbyq rootfs]$ cp ../busybox-1.30.1/examples/inittab etc/
2.3.4 修改 inittab 文件
??修改 etc/inittab文件,只保留下面內(nèi)容:
::sysinit:/etc/init.d/rcS #設(shè)置初始化執(zhí)行的文件 #需要加上 console askfirst 表示需要按下回車才可以進入系統(tǒng) #respawn 表示開機直接進入系統(tǒng) console::askfirst:-/bin/sh ::ctrlaltdel:/sbin/reboot #指定重啟命令 ::shutdown:/bin/umount -a -r #指定關(guān)機時執(zhí)行的命令
2.3.5 編寫/etc/init.d/rcS啟動腳本文件
mount -a mkdir /dev/pts mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s /bin/hostname wbyq #設(shè)置主機名稱
rcS文件相關(guān)命令介紹
mount -a
mkdir /dev/pts
/dev/pts 是遠程登陸(telnet,ssh 等)后創(chuàng)建的控制臺設(shè)備文件所在的目錄。由于可能有好幾千個用戶登陸,所以/dev/pts 其實是動態(tài)生成的, 不象其他設(shè)備文件是構(gòu)建系統(tǒng)時就已經(jīng)產(chǎn)生的硬盤節(jié)點.
mount -t devpts devpts /dev/pts
內(nèi)核虛擬文件。和 proc 一樣,Linux 提供給管理員通過文件系統(tǒng)和內(nèi)核進行溝通( 讀\寫)的一種渠道。 pts 是遠程虛擬終端。 devpts 即遠程虛擬終端文件設(shè)備。 通過/dev/pts 可以了解目前遠程虛擬終端的基本情況。
echo /sbin/mdev > /proc/sys/kernel/hotplug
linux系統(tǒng)對于熱插拔事件的產(chǎn)生默認都是調(diào)用 /sbin/hotplug, 該程序通過加載驅(qū)動程序, 創(chuàng)建設(shè)備節(jié)點,掛載分區(qū)等。 如果系統(tǒng)中不是/sbin/hotplug 來執(zhí)行,而是 mdev,那么用戶應(yīng)當(dāng)在早期啟 動的時候?qū)⒏膱?zhí)行檔( 包含絕對位置)設(shè)置進去,于是有了上面的echo/sbin/mdev> /proc/sys/kernel/hotplug 我們可以在腳本中注釋掉該命令行,重新開機后 cat/proc/sys/kernel/hotplug 就會發(fā)現(xiàn)返回來的是/sbin/hotplug 說明系統(tǒng)默認都是調(diào)用這個。 這個配置在內(nèi)核編譯的時候?qū)懞玫脑趦?nèi)核 目錄下的.config可以看到有個配置叫做 CONFIG_UEVENT_HELPER_PATH=“/sbin/hotplug”
mdev -s #生成設(shè)備節(jié)點
/bin/hostname wbyq #設(shè)置主機名稱
2.3.6 編寫 profile 文件 gedit etc/profile
USER="id-un" #id -un 是獲得當(dāng)前登陸的用戶名稱,USER="`id -un`" 則是將 id -un 的返回值賦值給變量 USER LOGNAME=$USER #用于顯示用戶名稱 PS1='[\u@\h \W]\$ ' #命令行樣式環(huán)境變量, 查看系統(tǒng)命令行樣式 echo $PS1 PATH=$PATH HOSTNAME='/bin/hostname' export USER LOGNAME PS1 PATH HOSTNAME
2.3.7 拷貝必要動態(tài)庫文件
[wbyq@wbyq rootfs]$ cp ../arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/* ./lib/ -rfdv [wbyq@wbyq rootfs]$ cp ../arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/lib/* ./lib/ -rfdv [wbyq@wbyq rootfs]$ cp ../arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib/* ./lib/ -rfdv
2.3.8 完善dev目錄,創(chuàng)建設(shè)備節(jié)點
[wbyq@wbyq rootfs]$ sudo mknod dev/null c 1 3
2.4 設(shè)置NFS共享
??添加NFS共享目錄
[wbyq@wbyq rootfs]$ sudo vim /etc/exports /home/wbyq/src_pack/rootfs *(rw,no_root_squash,sync,insecure)
2.5 配置網(wǎng)絡(luò)
2.6 IP設(shè)置
??若開發(fā)板和電腦直連,則可設(shè)置為靜態(tài)IP方式,若是經(jīng)過路由器,則可使用動態(tài)IP方式。
3.配置開發(fā)板環(huán)境變量
setenv bootargs root=/dev/nfs nfsroot=192.168.10.123:/home/wbyq/src_pack/rootfs ip=192.168.10.106:192.168.10.123:192.168.10.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 lcd=S702
192.168.1.123:/home/xsw/linux_work/rootfs —服務(wù)器 IP 與共享目 錄
192.168.1.106 —開發(fā)板 IP 地址
192.168.1.123:192.168.1.1:255.255.255.0 —主機 IP、 子網(wǎng)掩碼、 網(wǎng)關(guān)
在uboot命令行執(zhí)行,配置完后重啟開發(fā)板。
3.1 開發(fā)板啟動掛載NFS失敗問題
??若開發(fā)板引導(dǎo)內(nèi)核后出現(xiàn)無法通過NFS掛載rootfs,則是由于開發(fā)板nfs版本協(xié)議和ubuntu的nfs協(xié)議不兼容。
??解決辦法:修改/etc/default/nfs-kernel-server 文件,添加協(xié)議版本支持。
[wbyq@wbyq rootfs]$ sudo vim /etc/default/nfs-kernel-server RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
??保存后重啟NFS服務(wù),重啟開發(fā)板。
3.2開發(fā)板啟動掛載進入命令行報錯
??原因:主要是etc/fstab文件格式不對,fstab文件報錯磁盤掛載信息。
??解決辦法:修改rootfs下的/etc/fstab文件
[wbyq@wbyq rootfs]$ gedit etc/fstab /dev/mapper/vg_wbyq-lv_swap swap swap defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
啟動成功
?至此,根文件系統(tǒng)制作完成,開發(fā)板啟動成功。接下來將正式進入驅(qū)動開發(fā)之旅。
審核編輯:劉清
-
Linux
+關(guān)注
關(guān)注
87文章
11207瀏覽量
208714 -
根文件系統(tǒng)
+關(guān)注
關(guān)注
0文章
25瀏覽量
11964 -
rootfs
+關(guān)注
關(guān)注
0文章
19瀏覽量
4655
發(fā)布評論請先 登錄
相關(guān)推薦
評論