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

1.安裝mkyaffsimage, mkyaffs2image命令(用來製做yaffs文件系統)linux

第一個命令針對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,而後安裝步驟以下:spa

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

 

3.製做文件系統rest

3.1 解壓安裝busybox-1.7.0code

cd busybox-1.7.0
make menuconfig    

而後在菜單裏進入-> Busybox Settings-> Busybox Library Tuning選上: server

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

而後輸入vi Makefile,找到CROSS_COMPILE字段,後面添加」arm-linux-」:blog

 接着輸入:進程

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

安裝好了後,能夠看到busybox1.7_fs/bin裏便保存着linux命令,以下圖所示:ip

 

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服務
相關文章
相關標籤/搜索