第4階段——制作根文件系統 (4)


在上節制作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文件系統了

 

 


免責聲明!

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



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