在上節製做busybox後(位於/work/nfs_root/mini_fs), 而後根據如下5個來構建最小根文件系統:html
(1)/dev/console(終端控制檯, 提供標準輸入、標準輸出以及標準錯誤)linux
/dev/null (表示空設備終端, 全部寫到這個文件中的數據都會被丟棄掉。)
(2)init進程的程序(也就是busybox,由於init程序位於busybox中,已經完成)服務器
(3)/etc/inittab(用於init進程讀取配置, 而後執行inittab裏的指定應用程序)函數
(4)應用程序(被inittab配置文件調用的應用程序)工具
(5)C庫(glibc,被應用程序調用的C庫函數,好比:printf,strcmp,fopen等)spa
1.建立終端(/dev/console和/dev/null)3d
1.1輸入ls /dev/console /dev/null -l 查看pc機上終端的設備號:rest
得出:/dev/console主設備號=5,次設備號=1htm
/dev/null 主設備號=1,次設備號=3blog
1.2根據上面得出的設備號,建立console和null字符設備文件
mkdir dev //先在mini_fs目錄下建立個dev目錄(設備都放在dev目錄下)
cd dev/
sudo mknod console c 5 1 //建立console字符設備,
sudo mknod null c 1 3 //建立null 字符設備,
2. busybox已作好,因此init進程的程序也就作好了。
3.構造/etc/inittab (執行inittab裏的指定應用程序)
mkdir etc //在mini_fs目錄下建立個etc目錄
vi etc/inittab //建立inittab文件
inittab裏添加內容:
console::askfirst:-/bin/sh //action值必須小寫 id能夠寫成/dev/xx或xx
表示action= askfirst(每次啓動/bin/sh進程以前等待用戶按下enter鍵),而後指定/bin/sh的終端對應/dev/console字符設備
4.安裝glibc庫
mkdir lib //在mini_fs目錄下建立個lib目錄 (存放庫函數)
cd /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib //進入源目錄
cp *.so* /work/nfs_root/mini_fs/lib -d //複製glibc庫到lib目錄(*:匹配符,-d:保持連接)
5.使用mkyaffs2image製做文件系統(yaffs1針對小頁512B,yaffs2針對大頁2KB)
5.1生成mkyaffs2image工具
在/work/system目錄中 有一個壓縮文件yaffs_source_util_larger_small_page_nand.tar.bz2(保存了yaffs1和yaffs2)
tar –xjf yaffs_source_util_larger_small_page_nand.tar.bz2 //解壓
解壓獲得Development_util_ok,裏面就有yaffs1和yaffs2,以下圖:
5.2而後,進入yaffs2/utils,執行make 命令生成mkyaffs2image工具,將它複製到usr/local/bin目錄:
cd yaffs2/utils
make
sudo cp mkyaffs2image /usr/local/bin
sudo chmod +x /usr/local/bin/ mkyaffs2image //添加可執行屬性
5.3 mkyaffs2image製做yaffs2文件系統
cd /work/nfs_root //進入文件系統目錄上一層
mkyaffs2image mini_fs mini_fs.yaffs2 //將mini_fs文件系統製做成mini_fs.yaffs2映像文件系統
6.將製做好的mini_fs.yaffs2經過DNW下載到板子上,進行試驗
串口輸出以下圖,發現沒法打開控制檯:
發現是在建立console和null字符設備文件那裏出了問題,由於沒有加權限模式,因此內核沒法找到console。
刪除console和null設備,從新建立它們:
sudo mknod –m 660 console c 5 1 //建立console字符設備,設置權限用戶和組都能讀寫
sudo mknod –m 660 null c 1 3 //建立null 字符設備, 設置權限用戶和組都能讀寫
從新制做yaffs2並燒寫就能成功了, 以下圖:
恰好對應inittab配置文件中內容:console:: askfirst:-/bin/sh
askfirst: 啓動/bin/sh進程以前等待用戶按下enter鍵
最簡單的根文件系統就完成了,接下來開始完善根文件系統。
7 完善系統——添加ps命令
它是經過proc虛擬文件系統掛接到proc目錄,而後當前進程的信息會以文件的形式保存到proc目錄,就能夠用ps命令來查看內存中當前進程的狀態了
mkdir proc //建立proc目錄
mount –t proc none /proc //掛載proc, none:表示運行mount命令時顯示proc相關的輸出
接下來就能夠使用ps命令了,以下圖:
這裏的PID進程號都以文件的形式存在了/proc目錄裏,例如cd proc/1 ,進入init進程(init進程是內核第1個掛載的進程),以下圖
其中fd文件就是保存init進程的3個文件描述符--標準輸入(0)、標準輸出(1)以及標準錯誤(2)
經過ls –l fd 能夠看出這3個文件描述符都指向/dev/console控制檯,以下圖:
7.1 inittab配置文件中追加內容,避免手動mount掛載proc
方法1:
在inittab裏追加內容:
::sysinit:/etc/init.d/rcS //將/etc/init.d/rcS腳本設置成系統的初始化文件
而後mkdir -p etc/init.d 和vi etc/init.d/rcS, 添加一行命令(也能夠添加其它命令)
mount -t proc none /proc //掛載proc(前提根文件系統有proc目錄)
並加上可執行權限
sudo chmod +x etc/init.d/rcS //使腳本rcS可以執行命令
方法2:
除了使用在rcS中添加mount -t proc non /proc命令
也能夠用mount -a 做用是加載文件/etc/fstab中配置的全部設備
它會依賴一個配置文件/etc/fstab
它的格式以下 (參考linux應用開發手冊第368頁)
vi etc/init.d/rcS, 添加一行命令
mount -a //加載文件/etc/fstab中配置的全部設備
而後建立fstab文件vi etc /fstab,添加內容:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
能夠直接在板子裏操做,而後重啓就能使用ps命令了。
經過cat proc/mounts 命令就能夠查看當前掛載proc虛擬文件系統:
8 完善系統——使用mdev自動在/dev下建立設備節點
如今dev下只有2個字符設備,若是大量增長設備的話,手動建立太麻煩,能夠使用udev。
mdev 是udev的一個迷你版, 它主要的功能是管理/dev目錄底下的設備節點。它同時也是用來接替devfs及熱插拔的功能
mdev使用說明在busybox-1.7.0/docs/medev.txt中以及linux應用開發手冊第369頁,以下圖:
從上面得出mdev都須要內核sysfs、tmpfs、devpts的支持,
sysfs是管理虛擬系統,爲udev提供設備入口和uevent通道,sysfs類型,須要掛載到/sys目錄下
tmpfs是內存文件系統,tmpfs類型,須要掛載到/dev目錄下
devpts是內核虛擬系統, 管理員經過文件系統和內核進行溝通(讀\寫)的一種渠道, devpts類型,須要掛載到/dev/pts目錄下
8.1 建立sysfs、devpts要掛載的目錄
mkdir /sys //建立sysfs要掛載的目錄
mkdir /dev/pts //建立devpts要掛載的目錄
8.2 vi etc/init.d/rcS, 追加熱拔插命令和配置/dev設備,添加內容以下:
echo /sbin/mdev > /proc/sys/kernel/hotplug
//自動建立/proc/sys/kernel/hotplug, /sbin/mdev並指向hotplug,使mdev支持熱插拔
mdev -s //將/dev目錄下的設備文件建立成節點
8.3 vi etc /fstab,添加sysfs、tmpfs、pevpts掛載內容:
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
devpts /dev/pts devpts defaults 0 0
而後燒錄至板子中查看效果,以下圖,dev目錄下自動建立了不少節點,而後/proc/mounts裏也有掛載記錄
9 mkfs.jffs2製做jffs2文件系統(參考linux應用手冊375頁)
若須要製做yaffs2映像文件,則參考:http://www.cnblogs.com/lifexy/p/7028739.html
9.1 安裝zlib(壓縮動態庫)
cd /work/GUI/xwindow/X/deps
tar -xzf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure --shared --prefix=/usr //配置安裝動態庫(shared)到指定(prefix)的/usr目錄下
make //編譯
sudo make install //安裝
9.2 而後編譯mkfs.jffs2工具
cd /work/tools
tar -xjf mtd-utils-05.07.23.tar.bz2
cd mtd-utils-05.07.23/util
make
sudo make install
9.3製做jffs2文件系統
cd /work/nfs_root //準備製做子目錄mini_fs
mkfs.jffs2 -n -s 2048 -e 128KiB -d mini_fs -o mini_fs.jffs2
/*-n:表示每塊不添加清除標記,-s:size一頁大小爲2k,-e:一塊大小爲128kb
-d:製做的dir目錄,-o:輸出文件 */
9.4 燒入板子中,並設置bootargs參數爲jffs2啓動
在uboot中輸入:
set bootargs noinitrd root=/dev/mtdblock3 rootfstype=jffs2 init=/linuxrc console=ttySAC0
// rootfstype:將root file system type(根文件系統類型)強制設爲jffs2
而後save保存後從新啓動內核:
10 使用nfs掛載虛擬機目錄
10.1肯定板子是否與虛擬機位於同一網段
ifconfig eth0 up //開啓網關0,鏈接網線到路由器
ifconfig eth0 192.168.0.107 //設置ip
ping 192.168.0.106 //與虛擬機ping一下,是否已通
10.2肯定虛擬機是否能被掛載目錄
首先要使虛擬機可以被別人掛載目錄,在/etc/exports中添加須要被掛載的目錄便可
例如:
sudo vi /etc/exports
添加如下一段內容:
/work/nfs_root/mini_fs *(rw,sync,no_root_squash) //添加掛載目錄:/work/nfs_root/mini_fs
sudo /etc/init.d/nfs-kernel-sever restart //而後重啓nfs服務
10.3 而後將板子內核來掛載虛擬機目錄
mkdir /mnt //建立要掛載的目錄
mount -t nfs -o nolock,vers=2 192.168.0.106:/work/nfs_root/mini_fs /mnt
//將遠端虛擬機/work/nfs_root/mini_fs目錄掛載到開發板/mnt目錄裏
//命令詳細參數參考: http://www.cnblogs.com/lifexy/p/7380549.html
以下圖,而後板子內核的/mnt目錄就是虛擬機/work/nfs_root/mini_fs目錄了
11 使用nfs 做爲根文件系統啓動
經過設置u-boot的bootargs來更改開機自動進入nfs文件系統,不須要mount指令
步驟(參考http://www.cnblogs.com/lifexy/p/7049743.html):
進入uboot,輸入:
set bootargs noinitrd root=/dev/nfs nfsroot=192.168.0.106:/work/nfs_root/mini_fs ip=192.168.0.107:192.168.0.106:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
//設置npptargs,添加nfsroot(紅色:遠端服務器參數,藍色:開發板客戶端參數)
save //保存參數
而後重啓開發板進入內核,就啓動nfs文件系統了