從NFS啓動Linux

搞嵌入式的,不懂NFS,那絕對是一個悲劇。如果你連調試一個普通的Linux C程序,都要經歷“編譯->打包 -> 燒寫 -> 重啓”這些過程,那麼你離正式產品不是一天比一天遠,就是產品沒出,你已經厭倦了這個工作。筆者就曾經看到一個娃,在一臺內存只有512MB的機器上,裝了一個VMWare虛擬機,跑了一個Red Hat 9來編譯調試他的ARM Linux程序——我問他爲什麼不用NFS。他答曰,不知爲何物——於是決定在這分享分享快樂喜悅的調試方法。

Linux 啓動過程回顧

有人要多嘴了,我前面一大票文章都講了這個過程,在這裏又要重複。其實瞭解了Linux的啓動過程,再理解別的東西,就不難了,比如Live CD,裝在U盤上的Linux等等。

Linux 的工作原理

廢話少說,先上圖。


這很簡單吧。電腦就是來運行程序的,操作系統就是(不僅僅是)負責讓多個程序在一個CPU上跑的。Linux也不例外,也是操作系統內核啓動完成後,自然而然就輪到操作系統爲我們自己的程序服務的時候了。

這是它的基本原理。但是我們需要爲它考慮一些細節,第一個,也是本文最核心的地方,操作系統到哪裏尋找程序運行

首先我們要明確我們所指的程序,是放在有目錄級結構的文件系統裏,爲了尋找到所需要操作系統來運行的程序,我們必須告訴它,文件在哪個文件系統。一般來說,PC機的文件就存儲在硬盤上;對於Live CD而言,文件系統就藏在光盤上面。也就是說,只要操作系統能找到並正確地認識了文件系統,就可以執行裏面的程序了!

設置目標機器上的NFS啓動

看完了第一節,明白啓動的過程了嗎? 簡單地說,就是內核加載內核找到一個文件系統內核執行文件系統裏的一個程序。無論是從NFS啓動,還是從硬盤啓動,都是上述過程。只是NFS啓動,其文件系統是放在網絡上的。只要我們告訴內核,具體放在什麼地方,在網絡的另一端我們設置好共享,自然可以從NFS啓動。

讓內核識別NFS並可從NFS啓動

編譯內核

在內核源代碼目錄樹下,配置內核:

$make menuconfig

依次進入 File Systems -> Network File System中選擇 NFS client support 以及 Root file system on NFS。如果找不到Root file system on NFS 選項,要打開第一級菜單下的Networking support -> Networking options -> TCP/IP networking -> IP: kernel level autoconfiguration。如果NFS要使用DHCP,還得選上 IP: DHCP support。

保存配置並重新編譯即可。

配置內核參數

進入ARM開發板的設置 linux_cmd_line的地方(mini2440則爲開機按 s,輸入linux_cmd_line,並帶着引號輸入參數),或者進入PC的GRUB,設置類似參數

root=/dev/nfs rw nfsroot=192.168.1.1:/linux ip=192.168.1.5:::255.255.255.0:linux::off

該配置爲靜態IP設置。各參數意義如下:
root=/dev/nfs:指定根文件系統爲 /dev/nfs,即NFS 。這與/dev這個目錄並沒有什麼關係,在此僅爲一個名字。
rw:根文件系統掛載爲可讀寫。還可以有 ro 即只讀的選項。
nfsroot=192.168.1.1:/linux :指明掛載哪一個NFS上的哪一個目錄。這裏指的是掛載IP爲192.168.1.1的電腦上導出的/linux目錄。
ip=192.168.1.5:::255.255.255.0:linux::off:設置本機的IP。此舉是爲了連接剛纔設置的IP。這裏是一個靜態的配置,配置的格式爲 ip=本機的IP地址::網關地址:網絡掩碼:本機的主機名:網絡接口名:off 。一般情況下網關、網絡接口名都不需要設置。如果是DHCP獲取IP,那很簡單,直接 ip=dhcp 即可。

設置NFS服務器

NFS服務器可以是任意操作系統,只要能提供NFS服務即可(WINDOWS可以使用 WSU —— Windows Services for Unix來實現,具體請參考接下來本站要發表的文章)。在這裏以Fedora爲例,希望別的發行版的用戶觸類旁通。

對於Fedora來說,有圖形界面的工具進行設置,在管理-》服務器設置-》NFS中添加一個共享即可。
更通用的作法,就是修改 /etc/exports文件,之後再啓動NFS服務器。

/etc/exports文件格式如下

導出的文件夾 導出的網段(對該導出的網段的選項)

所謂導出的網段就是隻向哪個網段導出,保證安全性。一個例子爲:

/linux 192.168.1.0/24(rw,sync,no_root_squash)

就是將 /linux 導出到網段爲192.168.1.0,子網掩碼爲255.255.255.0 (即24)的網絡。其中可用的選項爲(翻譯自man文檔):

secure和insecure: secure選項下,所有連接的端口均小於1024。默認打開。
rw和ro: Read/Write和Read Only
async和sync async將使用異步數據存取,數據並非馬上寫入服務器的。sync則相反。使用async需要注意服務器不能隨意不正常地關閉,否則可能導致數據丟失。
no_wdelay:不使用延遲寫入。NFS服務器會將寫入寫入請求緩衝起來,可以提高性能。如果async已經打開那麼該選項無效。
no_subtree_check:不進行子樹檢查(使用該選項易引起安全問題)
root_squash和no_root_squash、all_squash:root_squash選項使得客戶端以root權限訪問文件系統時,轉換爲服務器端的匿名用戶。這選項打開一定要設置好服務器的權限。

之後再重新啓動NFS服務。Fedora下使用 /etc/init.d/nfs restart
使用 exports查看導出的文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章