嵌入式linux網絡引導

  嵌入式linux網絡引導

嵌入式linux的開發中,內核移植及根文件系統的建立過程中,爲了驗證內核移植是否成功,根文件系統的建立是否可行,需要將它們的映像文件燒寫到Flash中反覆試驗。如此頻繁地燒寫Flash,既浪費時間,減低了開發效率,還會對Flash造成損傷。因此在內核移植及根文件系統的建立過程中一般採用網絡引導。具體操作過程如下:
Boot Loader環境變量及內核參數設置
我的開發板的boot loader採用的是U-boot,其環境變量設置如下:
Uboot> printenv
bootdelay=3
baudrate=115200
ethaddr=00:12:34:56:78:9a
ipaddr=192.168.0.9          
serverip=192.168.0.1        
netmask=255.255.255.0
rootpath=/home/zht/rfsys      
stdin=serial
stdout=serial
stderr=serial
bootcmd=tftp 21000000 uImage;bootm 21000000    
bootargs=root=/dev/nfs rw nfsroot=192.168.0.1:/home/zht/rfsys nfsaddrs=192.168.0.48: 192.168.0.1:192.168.0.1:255.255.255.0 console=ttyS0,115200 mem=32M  
 
設置目標板IP地址
設置服務器IP地址
設置根文件系統在服務器上的路徑,注意該路徑一定要設定爲服務器上的nfs目錄。
bootcmdu-boot啓動後執行的命令,命令之間用分號分隔。
   tftp 21000000 uImage 表示通過tftp 將內核映像下載到RAM中地址爲0x21000000;
   bootm 21000000 啓動linux操作系統
定義u-boot傳送給linux內核的命令行參數,該命令行指定以網絡文件系統作爲根文件系統。
其中root=/dev/nfs,並非真的設備,而是一個告訴內核經由網絡取得根文件系統的旗標。
參數nfsroot這個參數告訴內核以那一臺機器,那個目錄以及那個網絡文件系統選項作爲根文件系統使用。參數的格式如下:
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
如果指令列上沒有給定 nfsroot 參數,則將使用‘/tftpboot/%s’預設值。其它選項如下:
<server-ip> --指定網絡文件系統服務端的互聯網地址(IP address)。如果沒有給定此欄位,則使用由 nfsaddrs 變量(見下面)所決定的值。此參數的用途之一是允許使用不同機器作爲反向地址解析協議(RARP) 及網絡文件系統服務端。通常你可以不管它(設爲空白)。
<root-dir> -- 服務端上要作爲根掛入的目錄名稱。如果字串中有個‘%s’ 符記(token),此符記將代換爲客戶端互聯網地址之 ASCII 表示法。
<nfs-options> -- 標準的網絡文件系統選項。所有選項都以逗號分開。如果沒有給定此選項欄位則使用下列的預設值:
        port            = as given by server portmap daemon
        rsize           = 1024
        wsize           = 1024
        timeo           = 7
        retrans         = 3
        acregmin        = 3
        acregmax        = 60
        acdirmin        = 30
        acdirmax        = 60
        flags           = hard, nointr, noposix, cto, ac
參數nfsaddrs設定網絡通訊所需的各種網絡接口地址。如果沒有給定這個參數,則內核核會試著使用反向地址解析協議以及/或是啓動協議(BOOTP)以找出這些參數。其格式如下:
        nfsaddrs=<my-ip>:<serv-ip>:<gw-ip>:<netmask>:<name>:<dev>:<auto>
<my-ip> -- 客戶端的互聯網地址。如果沒設,此地址將由反向地址解析協議或啓動協議來決定。使用何種協議端視配置核心時打開的選項以及 <auto> 參數而定。如果設定此參數,就不會使用反向地址解析協議或啓動協議。
<serv-ip> -- 網絡文件系統服務端之互聯網地址。如果使用反向地址解析協議來決定客戶端地址並且設定此參數,則只接受從指定之服務端傳來的迴應。要使用不同的機器作爲反向地址解析與網絡文件系統服務端的話,在此指定你的反向地址解析協議服務端(保持空白)並在 nfsroot 參數(見上述)中指定你的網絡文件系統服務端。如果此項目空白則使用回答反向地址解析協議或啓動協議之服務端的地址。
<gw-ip> -- 網關(gateway)之互聯網地址,若服務端位於不同的子網絡上時。如果此項目空白則不使用任何網關並假設服務端在本地的(local)網絡上,除非由啓動協議接收到值。
<netmask> -- 本地網絡界面的網絡掩碼。如果爲空白,則網絡掩碼由客戶端的互聯網地址導出,除非由啓動協議接收到值。
<name> -- 客戶端的名稱。如果空白,則使用客戶端互聯網地址之 ASCII-標記法,或由啓動協議接收的值。
<dev> -- 要使用的網絡設備名稱。如果爲空白,所有設備都會用來發出反向地址解析請求,啓動協議請求由最先找到的設備發出。網絡文件系統使用接收到反向地址解析協議或啓動協議迴應的設備。如果你只有一個設備那你可以不管它。
<auto> -- 用以作爲自動配置的方法。如果是 `rarp' 或是 `bootp' 則使用所指示的協議。如果此值爲 `both' 或空白,若配置核心時有打開這兩種協議則都使用。 `none' 表示不使用自動配置。這種情況下你必須指定前述欄位中所有必要的值。
<auto> 參數可以作爲 nfsaddrs 的參數單獨使用(前面沒有任何 `:` 字符),這種情況下會使用自動配置。然而,此種情況不能使用 `none'作爲值。
 
內核配置要求
 
添加內核對NFS的支持:
選中networking options-》IP:kernel level auloconfiguralion
選中file systems-》network file systems-》下的root file system on nfs nfs file system support
 
TFTP服務器的配置
root用戶登錄,運行setup命令
#setup
選擇Systme services,選擇tftp
打開tftp配置文件/etc/xinetd.d/tftp
server_args設定爲內核映像文件所在目錄,默認爲/tftpboot
我的內核映像在/home/zht/sources/kernel/linux-2.4.27目錄中,設定如下:
service tftp
{
        disable = no
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /home/zht/sources/kernel/linux-2.4.27
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}
 
重新啓動PC linux操作系統或者運行service xinetd restart命令啓動tftp服務器。
運行netstat -a | grep tftp 可以查看tftp服務器是否配置成功。
 
NFS服務器的配置
root身份登陸Linux服務器,編輯/etc目錄下的共享目錄配置文件exports,指定共享目錄及權限等。
執行如下命令編輯文件/etc/exports
# vi /etc/exports
在該文件裏添加如下內容:
/home/zht/rfsys 192.168.0.*(rw,sync,no_root_squash)
編輯完過後保存退出,然後運行命令exports –rav檢查輸入是否正確。
添加的內容表示:允許ip地址範圍在192.168.0.*的計算機以讀寫的權限來訪問/home/zht/rfsys目錄。/home/work也稱爲服務器輸出共享目錄。
括號內的參數意義描述如下:
rw:讀/寫權限,只讀權限的參數爲ro
sync:數據同步寫入內存和硬盤,也可以使用async,此時數據會先暫存於內存中,而不立即寫入硬盤。
no_root_squashNFS服務器共享目錄用戶的屬性,如果用戶是 root,那麼對於這個共享目錄來說就具有 root 的權限。
接着執行如下命令,啓動端口映射:
# /etc/rc.d/init.d/portmap start
最後執行如下命令啓動NFS服務,此時NFS會激活守護進程,然後就開始監聽 Client 端的請求:
# /etc/rc.d/init.d/nfs start
NFS服務器啓動後,還需要檢查Linux服務器的防火牆等設置(一般需要關閉防火牆服務,執行iptables -F),確保沒有屏蔽掉NFS使用的端口和允許通信的主機,主要是檢查Linux服務器iptablesipchains等選項的設置,以及/etc/hosts.deny/etc/hosts.allow文件。
我們首先在Linux服務器上進行NFS服務器的迴環測試,驗證共享目錄是否能夠被訪問。在Linux服務器上運行如下命令:
# mount –t nfs 192.168.0.20: /home/zht/rfsys  /mnt
# ls /mnt
命令將Linux服務器的NFS輸出共享目錄掛載到/mnt目錄下,因此,如果NFS正常工作,應該能夠在/mnt目錄看到/home/work共享目錄中的內容。
 
將內核映像文件uImage拷貝到/tftpboot目錄,建立的根文件系統拷貝到/home/zht/rfsys目錄中。然後重新啓動目標板。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章