构建根文件系统之busybox(四)完善
目錄
- busybox(四)完善
- proc掛載
- 手動掛載
- proc解析
- 使用腳本自動掛載
- 使用mount-a掛載
- udev/mdev 掛載
- 使用jffs2 文件系統格式
- 安裝zlib
- 安裝jffs2 生成工具
- 修改命令行識別
- NFS網絡文件系統
- 設置主機
- 設置單板(手動掛載)
- NFS啟動
- FAQ
busybox(四)完善
proc掛載
手動掛載
在Linux中存在著一類特殊的偽文件系統,用于使用與文件接口統一的操作來完成各種功能,例如ptyfs、devfs、sysfs和procfs。procfs是Linux內核信息的抽象文件接口,大量內核中的信息以及可調參數都被作為常規文件映射到一個目錄樹中,這樣我們就可以簡單直接的通過echo或cat這樣的文件操作命令對系統信息進行查取和調整了。
嘗試使用ps命令來查看當前單板的進程,發現不能使用,這是因為proc文件系統還未掛載,
# psPID Uid VSZ Stat Command ps: can't open '/proc': No such file or directory嘗試手動掛載
mkdir proc mount -t proc none /proc ps 即可查看使用man mount?查看下幫助,使用/proc搜索下,發現使用-t是掛載虛擬文件系統的意思
mount -t type device dir 對于proc文件系統來說,它沒有設備,proc filesystem根本沒有處理dev_name這個參數,所以傳什么都沒有影響,只影響你的mount命令輸出。好的實踐應該將設備名指定為nodev。 參考鏈接 https://www.zhihu.com/question/263885160然后我們使用reboot重啟系統,發現這次雖然有proc文件夾,但是沒有自動掛載,所以也不能再次正確顯示
proc解析
打開proc目錄,發現里面有按數字命名的文件夾,他實際上就是進程號.我們打開文件夾1,查看fd文件夾,其文件1,2,3分別指向了標準輸出輸入和錯誤
# cd /proc/1/fd # ls -l lrwx------ 1 0 0 64 Jan 1 00:21 0 -> /dev/console lrwx------ 1 0 0 64 Jan 1 00:21 1 -> /dev/console lrwx------ 1 0 0 64 Jan 1 00:21 2 -> /dev/console使用腳本自動掛載
參考下默認的配置文件中的腳本::SYSINIT:/etc/init.d/rcS,手動添加
::CTRLALTDEL:reboot ::SHUTDOWN:umount -a -r ::RESTART:init ::ASKFIRST:-/bin/sh: tty2::ASKFIRST:-/bin/sh tty3::ASKFIRST:-/bin/sh tty4::ASKFIRST:-/bin/sh ::SYSINIT:/etc/init.d/rcS默認的配置表的路徑在/etc/inittab,這個是在busybox代碼中的parse_inittab函數體現的.修改為:
#/etc/inittab console::askfirst:-bin/sh ::sysinit:/etc/init.d/rcS #這個是本次新增的注意,這里的sysinit是小寫的,==大寫是不識別的==,提示Bad inittab entry: ::SYSINIT:/etc/init.d/rcS
然后創建所需的腳本mount -t proc none /proc
#/etc/init.d/rcS mount -t proc none /proc手動先創建proc文件夾,加上可執行權限
mkdir proc chmod +x rcS然后制作映像文件啟動
mkyaffs2image 2th 2th.yaffs2使用mount-a掛載
重新燒錄最原始的文件系統,手動使用mount -a掛載,這個命令依賴于etc/fstab文件【實際上一般的mount命令也受它的控制】,實際的格式如下:
| 設備名,對于proc可以為任意值 | 掛載點 | 文件系統類型 | 掛載參數,逗號隔開 | ? | ? |
| proc | /proc | proc | defaults | 0 | 0 |
手動建立文件etc/fstab
# etc/fstab#device mount-ponit type options dump fsck proc /proc proc defaults 0 0手動創建文件夾proc,執行掛載,成功
# mkdir proc # mount -a # ps自動掛載
同樣的我們可以使用etc/init.d/rcS來實現自動掛載,對rcS添加可執行權限
# /etc/inittab console::askfirst:-bin/sh ::sysinit:/etc/init.d/rcS# /etc/init.d/rcS mount -a# etc/fstab#device mount-ponit type options dump fsck proc /proc proc defaults 0 0手動創建文件夾proc后制作映像文件mkyaffs2image 3th/ 3th.yaffs2
然后可以查看下掛載了什么文件系統
# cat proc/mounts rootfs / rootfs rw 0 0 /dev/root / yaffs rw 0 0 proc /proc proc rw 0 0udev/mdev 掛載
dev目錄下對應著設備和驅動,我們最開始使用手動創建的形式添加.Linux下使用udev來實現自動創建dev下的設備節點.在busybox有其簡化般般mdev.在busybox下搜索mdev的幫助docs/mdev.txt.
Here's a typical code snippet from the init script: [1] mount -t sysfs sysfs /sys 掛載sysfs文件系統 [2] echo /bin/mdev > /proc/sys/kernel/hotplug [3] mdev -sOf course, a more "full" setup would entail executing this before the previous code snippet: [4] mount -t tmpfs mdev /dev [5] mkdir /dev/pts [6] mount -t devpts devpts /dev/pts先創建sysfs文件夾mkdir sys
然后實現掛載文件系統,使用mount -a根據etc/fstab去掛載[1,4,6]
# etc/fstab#device mount-ponit type options dump fsck proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0修改腳本文件/etc/init.d/rcS
# /etc/init.d/rcS #這里去掛載`fstab`的文件 #1,4 mount -a #5 mkdir /dev/pts #6 mount -t devpts devpts /dev/pts #2,支持熱拔插,hotplug指向mdev,自動創建設備節點 echo /sbin/mdev > /proc/sys/kernel/hotplug #3創建內核原有的設備系統 mdev -s制作文件系統后燒入
mkyaffs2image 4th/ 4th.yaffs2使用ls dev可以看到自動生成很多節點設備
# ls dev console ptyrf tty17 ttyq7 dsp ptys0 tty18 ttyq8 event0 ptys1 tty19 ttyq9 ----......再使用cat /proc/mounts?查看已經掛載的文件系統
# cat proc/mounts rootfs / rootfs rw 0 0 /dev/root / yaffs rw 0 0 proc /proc proc rw 0 0 sysfs /sys sysfs rw 0 0 tmpfs /dev tmpfs rw 0 0 devpts /dev/pts devpts rw 0 0使用jffs2 文件系統格式
這個文件格式一般使用在nor上,當然也可以在nand使用.zlib是個壓縮庫,jffs2是一個壓縮的文件系統.jffs2需要用到zlib工具
安裝zlib
源碼包是zlib-1.2.3.tar.gz,使用xzf,不是xjf來解壓.tar xzf zlib-1.2.3.tar.gz
最后安裝到系統,sudo make install
安裝jffs2 生成工具
源碼包是mtd-utils-05.07.23.tar.bz2,先解壓tar xjf mtd-utils-05.07.23.tar.bz2
cd util/去make
安裝?sudo make install
生成工具mkfs.jffs2
使用生成,不同的flash使用不同的參數
mkfs.jffs2 -n -s 2048 -e 128KiB -d first_fs -o first_fs.jffs2-s 一頁大小是2048 -e 一個塊大小 128KiB -d 源目錄 -o 輸出修改命令行識別
啟動單板,輸入j使用dnw燒寫,啟動后發現內核還是以yaff去識別VFS: Mounted root (yaffs filesystem).
.需要在啟動命令行指定根文件系統的類型
Enter your selection: q OpenJTAG> print bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0 baudrate=115200 ethaddr=08:00:3e:26:0a:5b ipaddr=192.168.7.17 serverip=192.168.7.11 netmask=255.255.255.0 mtdids=nand0=nandflash0 mtdparts=mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root) bootdelay=10 stdin=serial stdout=serial stderr=serial partition=nand0,0 mtddevnum=0 mtddevname=bootloaderEnvironment size: 444/131068 bytes設定根文件系統格式并保存rootfstype=jffs2
set bootargs noinitrd root=/dev/mtdblock3 rootfstype=jffs2 init=/linuxrc console=ttySAC0 save輸入boot啟動VFS: Mounted root (jffs2 filesystem).成功啟動
NFS網絡文件系統
設置主機
啟動NFS服務,使得主機上的文件夾允許被單板訪問掛載.NFS服務在/etc/exports上配置,在該文件上增加新建的文件系統的路徑sudo vi /etc/exports,添加內容,其中*表示允許所有文件
/work *(rw,sync,no_root_squash,no_subtree_check)/home/book/stu/fs/5th *(rw,sync,no_root_squash,no_subtree_check)重啟主機NFS,?sudo /etc/init.d/nfs-kernel-server restart
showmount -e?即可查看已經聲明過的可被掛載的目錄
嘗試使用主機自己掛載自己的NFS文件夾,主機自身ip為192.168.5.107,然后可以在mnt下看到文件
book@100ask:~/stu/fs$ sudo mount -t nfs 192.168.76.135:/home/book/stu/fs/5th /mnt book@100ask:~/stu/fs$ ls /mnt bin dev etc lib linuxrc proc sbin sys usr設置單板(手動掛載)
查詢設置ip
ifconfig eth0 up ifconfig eth0 192.168.5.200新建mnt文件夾,嘗試掛載
mkdir /mnt mount -t nfs -o nolock 192.168.5.222:/home/book/stu/fs/5th /mntmount :掛載命令 nfs :使用的協議 nolock :不阻塞 IP : NFS服務器的IP(NFS服務器運行在哪個系統上,就是哪個系統的IP) /work/nfs: 要掛載的目錄(Ubuntu的目錄) /mnt : 要掛載到的目錄(開發板上的目錄,注意掛載成功后,/mnt下原有數據將會被隱藏,無法找到)在主機新建一個文件echo hello >test.txt,單板可以馬上看到,在單板更改文件?echo mcu > test.txt,主機也能看到
注意看下etc/init.d/rcS?里面是否有ip配置,如果有,可以刪除或者改成對的.光盤的文件有設置這個,如果復制過來需要修改
NFS啟動
上述方式是先掛載了FLASH的文件系統,然后掛載另一個文件系統,下面嘗試使用NFS文件系統為根文件系統
命令行參數 ,具體格式在linux\Documentation\nfsroot.txt中有說明.或者直接搜索root nfs mount
https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>查看之前的啟動參數bootargs,修改省略hostname
# 原來的 # bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 set bootargs noinitrd root=/dev/nfs nfsroot=192.168.5.222:/home/book/stu/fs/5th ip=192.168.5.200:192.168.5.222:192.168.5.222:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0運行提示
IP-Config: Complete:device=eth0, addr=192.168.5.200, mask=255.255.255.0, gw=192.168.5.222,host=192.168.5.200, domain=, nis-domain=(none),bootserver=192.168.5.222, rootserver=192.168.5.222, rootpath= Looking up port of RPC 100003/2 on 192.168.5.222 Looking up port of RPC 100005/1 on 192.168.5.222可以在主機直接使用arm-linux-gcc編譯,產生的程序直接在單板運行
FAQ
NFS:Network File System(網絡文件系統),NFS只是一種文件系統,本身并沒有傳輸功能,是基于RPC協議實現的,為C/S架構。也就是說,NFS也只是文件系統而已,與jffs2,yaffs,ext4等是一類東西。但是NFS的特殊之處在于,它可以通過網絡來掛載,而不用燒寫到設備上。這就跟網吧里使用PXE啟動來搭建無盤系統一樣:每臺電腦并沒有安裝硬盤,而是直接通過PXE啟動服務器上的系統,看起來每臺電腦都有硬盤,其實都是掛載服務器上的硬盤。
NFS怎么用??前邊已經介紹過,NFS是C/S架構,也就是說,使用NFS需要搭建服務器和客戶端。客戶端很簡單,自帶的uboot已經添加了對NFS客戶端的支持,我們只需要管NFS服務器。這個服務器其實跟TFTP、Samba、 Ftp服務器是一類的東西,直接在Ubuntu上使用命令安裝即可,
轉載:https://www.cnblogs.com/zongzi10010/p/10023719.html?
總結
以上是生活随笔為你收集整理的构建根文件系统之busybox(四)完善的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 构建根文件系统之busybox(三)最小
- 下一篇: 简单BootLoader