詳解-制作根文件系統,並使用yaffs,jffs,nfs掛載系統(2)


1.安裝mkyaffsimage, mkyaffs2image命令(用來制作yaffs文件系統)

第一個命令針對Flash小頁512B,第二個針對Flash大頁2KB
首先下載壓縮文件 yaffs_source_util_larger_small_page_nand.tar.bz2
安裝mkyaffs2image命令為例:

tar –xjf yaffs_source_util_larger_small_page_nand.tar.bz2 //解壓出yaffs1和yaffs2
cd /Development_util_ok/yaffs2/utils
make    //生成mkyaffsimage和mkyaffs2image
sudo cp mkyaffs2image /usr/local/bin 
//將mkyaffs2image命令復制到可執行目錄路徑下

然后輸入mkyaffs2image命令,如果不能運行,則使用chmod命令加可執行屬性即可

 

2.安裝mkfs.jffs2命令(用來制作jffs文件系統)
首先下載壓縮文件mtd-utils-05.07.23.tar.bz2,然后安裝步驟如下:

tar -xf mtd-utils-05.07.23.tar.bz2
cd mtd-utils-05.07.23/util
make
sudo make install

 

3.制作文件系統

3.1 解壓安裝busybox-1.7.0

cd busybox-1.7.0
make menuconfig    

然后在菜單里進入-> Busybox Settings-> Busybox Library Tuning選上:

[*] Tab completion //tab補齊命令

然后輸入vi Makefile,找到CROSS_COMPILE字段,后面添加”arm-linux-”:

 接着輸入:

make //編譯
mkdir /work/nfs_root/busybox1.7_fs //創建要安裝的文件系統目錄 
make install CONFIG_PREFIX=/work/nfs_root/busybox1.7_fs //指定安裝位置

安裝好了后,可以看到busybox1.7_fs/bin里便保存着linux命令,如下圖所示:

 

3.2構造lib目錄(被應用程序調用的C庫函數,比如:printf,strcmp,fopen等)

cd /work/nfs_root/busybox1.7_fs
mkdir lib //創建lib目錄 (存放庫函數)
cd /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib //進入源目錄
cp *.so* /work/nfs_root/ busybox1.7_fs/lib -d //復制glibc庫到lib目錄(*:匹配符,-d:表示如果是鏈接文件,則繼續保持鏈接)

 

3.3構造etc目錄
在etc目錄下,需要構造以下3個文件

  • etc/inittab :     init進程會根據inittab文件里,來創建其它子進程,比如-/bin/sh進程
  • etc/init.d/rcS: 腳本文件,里面用來執行命令,比如設置網卡,使用mount -a來裝載/etc/fstab中的文件系統
  • etc/fstab :       里面保存要被掛載的哪個文件系統,比如proc、sysfs、tmpfs、devpts等系統

1)構造/etc/inittab

cd /work/nfs_root/busybox1.7_fs
mkdir etc/
vi etc/inittab

添加以下幾句:

::sysinit:/etc/init.d/rcS     //內核啟動時,執行/etc/init.d/rcS
console::askfirst:-/bin/sh    //啟動console對應的-/bin/sh進程之前,等待用戶按enter鍵,等價於: ::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot     //按下ctrl+alt+del組合鍵時,啟動reboot命令
::shutdown:/bin/umount -a -r  //系統關機前,卸載所有文件系統

2)構造etc/init.d/rcS

mkdir etc/init.d/ 
vi etc/init.d/rcS

添加以下幾句:

mount -a //裝載/etc/fstab中的文件系統
echo /sbin/mdev > /proc/sys/kernel/hotplug //使/sbin/medv指向hotplug,從而支持熱拔插
mdev -s 
//使用medv命令將會掃描/sys/class和/sys/block中所有的類設備目錄,然后把讀取到的dev相關文件自動在/dev創建下的所有設備節點,

並給rcS文件加上可執行權限:

sudo chmod +x etc/init.d/rcS //使腳本rcS能夠執行命令

3)構造etc/fstab

PS: 使用mdev命令需要sysfs、tmpfs、devpts這3個文件系統的支持

  • mdev:   是udev的一個迷你版, 它主要的功能是管理/dev目錄底下的設備節點。它同時也是用來接替devfs及熱插拔的功能
  • proc:     虛擬文件系統, 它只存在內存當中,而不占用外存空間, 可以通過proc得到系統的信息,比如運行的每個進程pid便存在/proc里
  • sysfs:    管理虛擬系統,為udev提供設備入口和uevent通道, sysfs類型,需要掛載到/sys目錄下
  • tmpfs:   臨時文件系統,用來減少對flash頻繁讀寫,tmpfs類型,需要掛載到/dev目錄下
  • devpts:  內核虛擬系統, devpts類型,需要掛載到/dev/pts目錄下
mkdir proc/ //創建proc要掛載的目錄
mkdir sys/ //創建sysfs要掛載的目錄,
mkdir dev/pts -p //創建devpts要掛載的目錄
vi etc/fstab

添加以下幾句

# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts defaults 0 0

 

3.4構造其它文件/目錄
1)創建終端文件(dev/console和dev/null)

sudo mknod -m 660 dev/console c 5 1 
sudo mknod -m 660 dev/null c 1 3 

2)創建其它目錄

mkdir mnt tmp root


4.制作燒寫yaffs2

mkyaffs2image busybox1.7_fs busybox1.7_fs.yaffs2    //使用mkyaffs2image生成yaffs2

進入uboot燒寫:

nfs 30000000 192.168.1.199:/work/nfs_root/busybox1.7_fs.yaffs2
nand erase root
nand write.yaffs 0x30000000 0x260000 $(filesize) 
// write.yaffs:實現yaffs文件系統鏡像的燒寫, 如果NandFlash相應的區域有壞塊,可以跳過壞塊。

設置啟動參數:

set bootargs noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 init=/linuxrc console=ttySAC0
save

啟動內核:


5.制作燒寫jffs2

mkfs.jffs2 -n -s 2048 -e 128KiB -d busybox1.7_fs -o busybox1.7_fs.jffs2
/*-n:表示每塊不添加清除標記, -s:size一頁大小為2k,  -e:一塊大小為128kb
  -d:制作的dir目錄,    -o:輸出文件 */

進入uboot燒寫:

nfs 30000000 192.168.1.199:/work/nfs_root/busybox1.7_fs.jffs2
nand erase root
nand write.jffs2 0x30000000 0x260000 $(filesize) 
// write. jffs2 :和yffs原理一樣 

設置啟動參數:

set bootargs noinitrd root=/dev/mtdblock3 rootfstype=jffs2 init=/linuxrc console=ttySAC0
save

啟動內核:

 

6.通過uboot啟動nfs系統
6.1 在內核documentation目錄里找到nfsroot.txt文檔
找到nfs服務器地址設置"nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]":

  • server-ip:    服務器(虛擬機)IP地址
  • root-dir:      nfs根目錄位置
  • nfs-options:選項,默認可以不填

找到nfs客戶端設置"ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>":

  • client-ip:  客戶端(開發板)IP地址
  • server-ip:服務器(虛擬機)IP地址
  • gw-ip:      網關地址,一般都是192.168.1.1
  • netmask:  子網掩碼,255.255.255.0
  • hostname:主機名,可以不填
  • device:      網卡設備,默認一個網卡就填eth0
  • autoconf:  自動連接,填off不自動連接

6.2 所以設置啟動參數為

set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.199:/work/nfs_root/busybox1.7_fs ip=192.168.1.198:192.168.1.199:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 

啟動內核:

 

7.在內核里使用mount掛載nfs目錄

mount -t nfs -o nolock,vers=2 192.168.1.199:/work/nfs_root /mnt 
//mount命令將遠端虛擬機/work/nfs_root目錄掛載到開發板/mnt目錄里
//nolock:禁用文件鎖 vers=2:nfs版本協議2 192.168.1.199:虛擬機地址

運行出錯:

找到原因是網卡沒設置,輸入mount前設置即可(也可以直接寫入/etc/init.d/rcS):

ifconfig eth0 up
ifconfig eth0 192.168.1.198

 


8.如果mount掛載/啟動nfs系統失敗,那么有可能有下面兩個原因
8.1 確定板子是否與虛擬機位於同一網段

ifconfig eth0 up //開啟網關0,連接網線到路由器
ifconfig eth0 192.168.1.107 //設置ip,與虛擬機ip網段一樣,
ping 192.168.1.106 //與虛擬機ping一下,是否已通


8.2 確定虛擬機是否能被掛載目錄
要使虛擬機能夠被掛載目錄,在/etc/exports中添加需要被掛載的目錄即可
例如:

sudo vi /etc/exports 
/work/nfs_root *(rw,sync,no_root_squash)            //要被掛載的目錄:/work/nfs_root
sudo /etc/init.d/nfs-kernel-sever restart            //然后輸入命令重啟nfs服務


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM