在上節制作busybox后(位於/work/nfs_root/mini_fs), 然后根據以下5個來構建最小根文件系統:
(1)/dev/console(終端控制台, 提供標准輸入、標准輸出以及標准錯誤)
/dev/null (表示空設備終端, 所有寫到這個文件中的數據都會被丟棄掉。)
(2)init進程的程序(也就是busybox,因為init程序位於busybox中,已經完成)
(3)/etc/inittab(用於init進程讀取配置, 然后執行inittab里的指定應用程序)
(4)應用程序(被inittab配置文件調用的應用程序)
(5)C庫(glibc,被應用程序調用的C庫函數,比如:printf,strcmp,fopen等)
1.創建終端(/dev/console和/dev/null)
1.1輸入ls /dev/console /dev/null -l 查看pc機上終端的設備號:
得出:/dev/console主設備號=5,次設備號=1
/dev/null 主設備號=1,次設備號=3
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文件系統了