1. 程式人生 > >uboot中利用TFTP和NFS載入核心映象和根檔案系統

uboot中利用TFTP和NFS載入核心映象和根檔案系統

origin: http://www.cnblogs.com/cjjnjust/articles/1754849.html

主機說明:

實驗板說明:
MPC8349itx開發板: IP: 59.64.155.244  閘道器 59.64.155.1
開發板eth0為vsc8201晶片,uboot支援驅動,另一晶片為交換交換晶片vsc7385,單獨模組驅動。
U-Boot-1.1.3 ;    Linux kernel-2.6.13
核心支援NFS分割槽(即編譯時在File system中選中[*] Root file system on NFS), 以及支援核心IP_PNP(即編譯時在Networking中選中[*] IP: kernel level autoconfiguration

)
    File systems  ---> 
        Network File Systems  ---> 
            <*> NFS file system support                        ## 必選
                [*]   Provide NFSv3 client support             ## 可選
            [*] Root file system on NFS                        ## 必選
    Networking  ---> 
        [*] Networking support 
            Networking options  ---> 
                [*]   IP: kernel level autoconfiguration       ## 必選

***************************************************************************

A: NFS啟動掛載根檔案系統

主機上操作:
$ cd /usr/local/mpc8349/
$ ./ltib --preconfig config/platform/mpc8349itx/defconfig-min-fs -f
    ## 依次進入如下選項選擇(X) NFS only, 根據情況決定是否選擇[ ] read-only root filesystem 
    --- Target Image Generation
        Options  --->
        --- Choose your root filesystem image type 
             Target image: (ext2.gz ramdisk)  --->         ## 改ramdisk檔案系統為NFS
            (X) NFS only

 
            [ ] read-only root filesystem
    ## 其他情況參考LTIB使用說明(http://blog.chinaunix.net/u2/80953/showart.php?id=1275002)
    ## 編譯結束後生成的根檔案系統是位於當前安裝目錄下的rootfs (/usr/local/mpc8349/small/rootfs)

$ ln -s /usr/local/mpc8349/small/rootfs  /home/liuby/rootfsln    ## 建立NFS服務目錄軟連線
$ su - root        ## 切換到root使用者,需要密碼
# echo "/usr/local/mpc8349/small/rootfs  59.64.155.244(rw,sync,no_root_squash)" > /etc/exports     ## NFS 服務配置
# service portmap restart
# service nfs restart
# exportfs -arv        ## 修改的NFS配置生效(exportfs引數順序不一樣,顯示有所不同,此順序顯示結果明瞭)
# exit


實驗板上操作:
uboot啟動後按鍵進入uboot命令列環境:
=> cp.b fef50000 40000 20000; go 40004        ## 驅動vsc7385晶片
=> set serverip 59.64.155.122          ## 主機地址
=> set ipaddr 59.64.155.244            ## 實驗板地址
=> set netmask 255.255.255.0
=> set netdev eth0                     ## eth0
=> ping 59.64.155.122                  ## 測試連通
=> set hostname PowerQUICC
=> set kernaddr fe810000            ## flash中核心起始地址
=> set rootpath /usr/local/mpc8349/small/rootfs        ## NFS服務根目錄
=> setenv bootargs root=/dev/nfs rw nfsroot=$serverip:$rootpath ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off console=ttyS0,115200
=> bootm $kernaddr
            ## 如果一切正常,核心啟動後會啟動NFS檔案系統作根檔案系統。
            ## 測試: 在開發板上建立一個檔案,在主機上會看到這個檔案生成
同樣可以簡化操作(測試nfs服務軟連線目錄):
=> cp.b fef50000 40000 20000; go 40004        ## 驅動vsc7385晶片
=> setenv ipaddr 59.64.155.244
=> setenv bootargs root=/dev/nfs rw nfsroot=59.64.155.122:/home/liuby/rootfsln ip=59.64.155.244:59.64.155.122:255.255.255.0 console=ttyS0,115200 
=> bootm fe810000            ## 核心映象uImage在FLASH中的儲存地址

************************

實驗中遇到一個問題,就是bootm之後核心啟動,NFS啟動掛載檔案系統快完成時出現下面這個錯誤提示
RPC: sendmsg returned error 101
nfs: RPC call returned error 101
後來才發現是檔案系統中的啟動指令碼在啟動過程中修改了eth0的ip地址,導致連線不上NFS server
後來再測試又發現試圖掛載非NFS檔案系統目錄時也會出現此問題,並且在主機上執行# showmount 命令結果會顯示有ip地址(實驗板ip地址)掛載。即: 在ltib編譯檔案系統時選擇ext2.gz ramdisk (非NFS only), 最後使用rootfs目錄,出現同樣的問題。

還有遇到過一個問題,根本無法掛載檔案系統,在啟動時出現下述提示
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
 <0>Rebooting in 180 seconds..
後來發現是 /etc/exports 只有如下一句
 /home/liuby/rootfs  59.64.155.244(rw,sync,no_root_squash)
而沒有像下面這樣指定根目錄的訪問許可權:
 /usr/local/mpc8349/small/rootfs  59.64.155.244(rw,sync,no_root_squash)
結論: 必須指定NFS檔案系統所在目錄或其對應的軟連線做NFS服務根目錄(見下分析)

在NFS檔案系統中編譯busybox時可以不選擇編譯mount命令(不建議如此)

nfs總結:
如上 /home/liuby/rootfsln是指向/usr/local/mpc8349/small/rootfs的軟連線
# echo "/home/liuby/rootfsln 59.64.155.244(rw,sync,no_root_squash)" > /etc/exports
# exportfs -arv             ## 會彈出下面的提示
exporting 59.64.155.244:/usr/local/mpc8349/small/rootfs
可見 /etc/exports 中語句 /home/liuby/rootfsln 59.64.155.244(rw,sync,no_root_squash) 和 /usr/local/mpc8349/small/rootfs  59.64.155.244(rw,sync,no_root_squash) 是等效的.
故: 如果想用不同的檔案系統,可以改變這個軟連線指向新的檔案系統,這比複製檔案系統或者修改u-boot環境變數方便多了,並且還不用重新配置/etc/exports。
# echo "/home/liuby/rootfsln 59.64.155.244(rw, sync, no_root_squash)" > /etc/exports
$ rm -f /home/liuby/rootfsln
ln -s nfs_rootfs_dir_path  /home/liuby/rootfsln            ## 只需要建立和修改這個軟連線即可
exportfs -arv            ## 配置生效(必須)
在uboot環境變數中只需設定一次rootpath=/home/liuby/rootfsln, 每次只需在主機上修改此軟連線的指向,即可
注意許可權
***************************************************************************

B: TFTP下載核心和檔案系統映象到ram中啟動

主機上操作:
在主機上TFTP根目錄為/home/liuby/tftpboot/
$ mkdir /home/liuby/tftpboot/image_dir
$ cd /usr/local/mpc8349/small/
$ ./ltib --preconfig config/platform/mpc8349itx/defconfig-min-fs-modified -f --batch          ## 編譯核心和檔案系統映象
$ cp -f rootfs/boot/uImage  rootfs.ext2.gz.uboot  ~/tftpboot/image_dir/        ## 複製核心映象和檔案系統映象到~/tftpboot/image_dir
$ cd ~/tftpboot/
$ ln -s image_dir/ bootln


實驗板上操作:
=> set serverip 59.64.155.122          ## 主機地址
=> set ipaddr 59.64.155.244            ## 實驗板地址
=> set netmask 255.255.255.0 
=> set tftp_path bootln
=> ping $serverip                      ## 測試連通
=> cp.b fef50000 40000 20000; go 40004        ## 驅動vsc7385晶片
=> setenv loadkernaddr 1000000
=> setenv loadramdaddr 1200000
=> tftpboot $loadkernaddr image_dir/uImage    ## 下載核心映象到ram
=> tftp $loadramdaddr $tftp_path/rootfs.ext2.gz.uboot    ## 下載檔案系統映象到ram
=> bootm $loadkernaddr $loadramdaddr    ## 啟動ram中核心和檔案系統映象

下載不暢時,用CTRL+C來終止回到提示符


tftp總結:
在TFTP服務根目錄下建立目錄儲存映象檔案,然後建立軟連線指向需要下載的映象目錄,這樣可以通過修改連線檔案即可,而不用每次修改uboot環境變量了

***************************************************************************

C: TFTP下載核心映象到ram,NFS掛載根檔案系統(target image: NFS only)

主機上利用上面操作的結果,不進行配置。
實驗板上操作:
=> set serverip 59.64.155.122          ## 主機地址
=> set ipaddr 59.64.155.244            ## 實驗板地址
=> set netmask 255.255.255.0 
=> set bootargs root=/dev/nfs rw nfsroot=$serverip:/home/liuby/rootfsln ip=$ipaddr:$serverip:$netmask console=ttyS0,115200 
=> tftp 1000000 bootln/uImage          ## 下載核心映象到ram 地址1000000
=> bootm 1000000
                ## 測試發現核心啟動,NFS掛載成功

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

簡便方法:
將下面附錄的檔案儲存為.txt檔案,例如取名mpc8349itx_uboot_env.txt
用linux命令unix2dos進行轉換,然後開啟windows XP 超級終端,啟動實驗板進入uboot命令列環境:
點選超級終端介面 "檔案"->"屬性",彈出屬性對話方塊,點選"設定"->"ASCII碼設定",設定行延遲20ms,字元延遲1ms;然後點選"傳送"->"傳送文字檔案",選擇"mpc8349itx_uboot_env.txt"傳送。
此操作相當於在uboot命令列輸入uboot環境設定引數
執行完操作後儲存了這些設定,以後每次在uboot啟動時不用再敲入一行行的設定引數.

在uboot命令列下執行
=> run flashnfsboot
相當於 A 操作

在uboot命令列執行
=> run tftpramboot
相當於執行 B 操作

在uboot命令列執行
=> run tftpnfsboot
相當於執行 C 操作

轉栽地址:http://blog.chinaunix.net/u3/98913/showart_1978279.html