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服務