第4階段——製做根文件系統 (4)

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

 

相關文章
相關標籤/搜索