1. 程式人生 > >nfs的兩種啟動方式

nfs的兩種啟動方式

在第一期視訊 :
第0課第7節_剛接觸開發板之製作根檔案系統及初試驅動.wmv ,因為要測試驅動,所以必須要把驅動程式弄到開發板裡才行。
於是韋老師介紹了兩種方式:

1 僅用flash上的根檔案系統啟動後,手工MOUNT NFS

使用NFS作為根檔案系統來啟動

視訊中只介紹了開發板這端uboot引數的設定,並未介紹Ubuntu端 NFS伺服器的設定,這就導致很多學員學習時遇到難以逾越的問題:NFS掛載,從而影響學習進度和熱情。此帖就是解決NFS相關的問題,希望對初學者有所幫助。先介紹:1 僅用flash上的根檔案系統啟動後,手工MOUNT NFS, 前提條件:
1. 開發板上要燒寫好檔案系統
2. 能正常開機進入Linux系統
3.uboot中啟動引數類似這種 bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0

大概說下步驟:

1.搭建(下載)、配置和重啟NFS伺服器

2.Ping 通伺服器

3.執行掛載命令

NFS是什麼?
NFS:Network File System(網路檔案系統),NFS只是一種檔案系統,本身並沒有傳輸功能,是基於RPC協議實現的,為C/S架構。也就是說,NFS也只是檔案系統而已,與jffs2,yaffs,ext4等是一類東西。但是NFS的特殊之處在於,它可以通過網路來掛載,而不用燒寫到裝置上。這就跟網咖裡使用PXE啟動來搭建無盤系統一樣:每臺電腦並沒有安裝硬碟,而是直接通過PXE啟動伺服器上的系統,看起來每臺電腦都有硬碟,其實都是掛載伺服器上的硬碟。

NFS怎麼用?


前邊已經介紹過,NFS是C/S架構,也就是說,使用NFS需要搭建伺服器和客戶端。客戶端很簡單,自帶的uboot已經添加了對NFS客戶端的支援,我們只需要管NFS伺服器。這個伺服器其實跟TFTP、Samba伺服器、Ftp伺服器也是一類的東西,直接在Ubuntu上使用命令安裝即可,
先下載NFS伺服器,演示如下:
sudo apt-get install nfs-kernel-server
這裡寫圖片描述
很顯然,我已經安裝過了,在提供的Ubuntu9.10裡也安裝過了,繼續往下走——–配置NFS伺服器
sudo vi /etc/exports
這裡寫圖片描述
預設狀態下是沒有配置的,可以參考給出的例子或者百度來決定配置資訊
例如,可以配置成這樣:
這裡寫圖片描述

就是在檔案裡添加了

/work/nfs               *(rw,sync,no_root_squash)
/var/lib/tftpboot       *(rw,sync,no_root_squash)
  • 1
  • 2

然後儲存,重啟NFS伺服器或者Ubuntu(如果不重啟,配置不會生效),命令如下:

sudo /etc/init.d/nfs-kernel-server restart
  • 1

這裡寫圖片描述

簡單解釋各個引數的意義:
/work/nfs :允許客戶端掛載的目錄,可新增任意多個,如果不設定,伺服器將不允許客戶端掛載。
* :允許所有IP的主機掛載該目錄
括號內的 :一些許可權設定,比如是否能夠讀寫(可百度,更詳盡)
現在NFS伺服器就可以用了。

1.檢視開發板和Ubuntu的IP,設定開發板IP並ping通NFS伺服器
這裡寫圖片描述

2.把你想拷貝到開發板上的檔案都複製到剛才設定的目錄裡,例如拷貝到 /work/nfs,然後在開發板上執行掛載命令
mount -t nfs -o nolock,vers=2 10.0.0.147:/work/nfs /mnt

解釋一下:
mount :掛載命令
nfs :使用的協議
nolock :不阻塞
vers : 使用的NFS版本號
IP : NFS伺服器的IP(NFS伺服器執行在哪個系統上,就是哪個系統的IP)
/work/nfs: 要掛載的目錄(Ubuntu的目錄)
/mnt : 要掛載到的目錄(開發板上的目錄,注意掛載成功後,/mnt下原有資料將會被隱藏,無法找到)

3.現在進入開發板上的/mnt目錄,就可以看到Ubuntu上要傳輸的檔案了
這裡寫圖片描述
4.測試驅動,測試應用程式都可以在/mnt目錄下進行,並且這個/mnt目錄也不會佔用開發板的Flash空間,很方便。

1 僅用flash上的根檔案系統啟動,手工MOUNT NFS 介紹完畢
強烈推薦這種方式,因為簡單。隨時想掛載就掛載,Ubuntu系統即使不開機(前提是ubuntu ip沒變)也不影響開發板的啟動。而 7.2 使用NFS作為根檔案系統來啟動 ,若Ubuntu未啟動或者檔案系統有問題,開發板根本無法開機,嚴重影響體驗。

可能遇到的問題
這裡寫圖片描述
典型的網路不通,檢查彼此的IP,保證網路通暢。
很多初學者以為,在uboot狀態下設定完IP能ping通Ubuntu那麼開發板進入Linux後也一定能ping通Ubuntu,這是不對的。兩種狀態下的IP互不影響,也就是說uboot的IP不會傳遞給Linux,如果需要使用網路都需要分別設定IP。

這裡寫圖片描述
解決方法:
①檢查要掛載的目錄/work/test是否在/etc/exports中宣告過,如果沒有,是沒有掛載許可權的,就參考前邊的例子新增
在Ubuntu上執行命令 showmount -e 即可檢視已經宣告過的可被掛載的目錄
②檢查NFS伺服器是否在執行
在Ubuntu上執行命令 sudo /etc/init.d/nfs-kernel-server status 即可檢視nfsd是否正在執行,如果沒有執行就參考前面的命令使其執行

使用NFS作為根檔案系統來啟動

如果你僅僅是想要讓開發板跟Ubuntu共享檔案,那麼強烈建議你用前面所提供的方式,因為 2 使用NFS作為根檔案系統來啟動 比較麻煩,這種啟動方式主要用在製作檔案系統上。下面詳細說明!

視訊一開始就教大家怎麼重燒整個系統,怎麼編譯uboot,怎麼編譯核心都講了,就是沒有講怎麼製作檔案系統。製作檔案系統屬於進階內容,被放到了第11節。但是視訊中又提前的介紹了NFS啟動,這就導致很多緊跟視訊操作不敢有絲毫遺漏的同學陷入深深的苦惱當中,無法在自己的開發板上覆現視訊中的現象是不可容忍的,有些同學甚至因此放棄了嵌入式的學習,這對一個過來人來說感覺是相當可惜的。現在我就慢慢引入為什麼需要NFS啟動吧。

大家都知道,開發板要想執行應用程式,檔案系統是必不可少的,在光盤裡有提供檔案系統

參考視訊的燒寫方法,很容易能夠燒寫成功。但是這個檔案系統是怎麼製作出來的?只能看第11節的視訊了,會發現步驟非常多。為了避免出錯,需要時時看製作的效果。如果每做一步都用mkyaffs2image製作一個檔案系統fs.yaffs2燒寫到開發板上顯然效率太低,此時NFS啟動的優勢就很明顯了—–可以通過NFS啟動的方式來實時看效果。

使用NFS啟動的前提條件
編譯核心和製作檔案系統所用的交叉編譯器必須相同(如果你用2.6.22.6的核心去掛載畢業班、第三期視訊的NFS檔案系統,肯定無法掛載)
步驟:

1.將製作的檔案系統放到/work/nfs/jz2440目錄下

2.參考上一個帖子的方式,新增路徑 /work/nfs/jz2440 到檔案 /etc/exports 中,以保證開發板有掛載這個目錄的許可權

3.重啟nfs伺服器

4.再次確認剛才設定的目錄是否生效

5.檢視Ubuntu的IP和開發板的IP,等會設定uboot啟動引數時會用到

6.設定uboot啟動引數

set bootargs noinitrd root=/dev/nfs nfsroot=10.0.0.147:/work/nfs/jz2440 ip=10.0.0.10:10.0.0.147:10.0.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
save

常見問題
1.如果你的檔案系統製作的沒有問題,那麼重啟開發板後應當能夠進入Linux系統。如果掛載失敗,就用光盤裡提供的檔案系統試試

注意:光碟提供的檔案系統中etc/init.d/rcS檔案中已經預設添加了設定開發板IP的命令,如果你不需要這個IP或者跟你的網段不同,可以修改以符合自己的需要。光盤裡提供的檔案系統都是用arm-linux-gcc(3.4.5版本製作的),因此你必須使用2.6.22.6的核心來啟動,否則無法掛載檔案系統。

2.使用NFS啟動你會發現一個問題,如果開發板跟Ubuntu之間的網路不通,那麼你的開發板就啟動不了。想想也很正常,客戶端跟伺服器網路不通是無法登陸的。如果你製作的檔案系統經過測試沒有任何問題,那就可以製作成yaffs2檔案系統燒寫到開發板上,不用每次都得開啟Ubuntu,插上網線,再啟動開發板了。
在第一期視訊第0課第7節03:40處有演示,

其實就是將NFS檔案系統使用mkyaffs2image工具製作生成yaffs2格式的檔案系統。至此,NFS全部掛載方式分析完畢。