首頁 > 軟體

tftp-nfs開發環境搭建

2020-06-16 17:27:17

嵌入式開發通常使用主機-開發板的開發模式,在裸板開發中,我們通常使用串列埠偵錯工具傳遞檔案,比如windows平台的超級終端,SecuCRT以及Linux平台的ckermit(題外話:ckermit比windows的那兩個快多了)。但在OS的開發環境中,由於程式複雜,規模巨大,串列埠的低速和易錯就不再適合我們開發了,而在這種環境下,基於網路的開發環境由於高速和準確受到了大家的青睞。

結構說明

在有OS的嵌入式系統中,SoC的啟動過程有3個載入。

  1. 上電的第一個程式就是片上固化的啟動程式碼,它負責把bootloader從Flash中載入到記憶體中並執行
  2. bootloader會從Flash中載入Linux核心以及裝置樹檔案到記憶體,並對兩者進行相關的設定。完成所有工作後跳轉到核心的首地址
  3. 核心接管bootloader設定好的硬體資源,核心啟動過程中非常重要的一件事就是掛載檔案系統。

在開發過程中,由於bootloader通常都具有網路功能,而linux核心,裝置樹dts和檔案系統fs都是不斷迭代的,所以我們自然希望通過設定bootloader的網路功能使其直接通過伺服器(開發主機)下載核心並進一步下載裝置樹檔案(tftp),甚至直接掛接網路上的檔案系統(nfs)。整個開發環境的結構框圖如下:

tftp的安裝和設定

tftp即tiny ftp,是一種輕型的ftp協定,Ubuntu下可以使用下面這個小指令碼安裝並設定。

#!/bin/bash
echo "Please input tftpdir"
read tftpdir
sudo mkdir $tftpdir        #建立用於傳輸檔案的目錄
sudo chmod 0777 $tftpdir
sudo apt-get install tftp-hpa tftpd-hpa xinetd -y
#sudo vi /etc/default/tftp-hpa
sudo touch /etc/default/tftpd-hpa
sudo chmod 0777 /etc/default/tftpd-hpa
sudo echo "TFTP_USERNAME="tftp"" > /etc/default/tftpd-hpa
sudo echo "TFTP_DIRECTORY="$tftpdir"" >> /etc/default/tftpd-hpa   #tftpd-hpa的服務目錄,這個想建立在哪裡都行
sudo echo "TFTP_ADDRESS="0.0.0.0:69""     >> /etc/default/tftpd-hpa   #指定開發板地址,需要和主機的ip在同一個網段     
sudo echo "TFTP_OPTIONS="-l -c -s""       >> /etc/default/tftpd-hpa   #-c是可以上傳檔案的引數,-s是指定tftpd-hpa服務目錄,上面已指定

sudo service tftpd-hpa restart
echo -e 'n'

nfs的安裝和設定

nfs即network filesystem,可以使用戶端直接從伺服器掛接檔案系統,方便開發板直接存取我們的程式或檔案。nfs的安裝和設定指令碼

#!/bin/bash
echo "nfs service"
echo "Please input nfs dir"
read nfsdir
sudo mkdir $nfsdir
sudo apt-get install nfs-kernel-server nfs-common portmap -y
#sudo vi /etc/exports
sudo touch /etc/exports
sudo chmod 0777 /etc/exports
sudo echo "$nfsdir  *(rw,sync,no_subtree_check,no_root_squash)" > /etc/exports
sudo service nfs-kernel-server restart
echo -e 'n'

export檔案的屬性選項

ro      唯讀存取
rw      讀寫存取
sync    所有資料在請求時寫入共用
async   nfs在寫入資料前可以響應請求
secure  nfs通過1024以下的安全TCP/IP埠傳送
insecure    nfs通過1024以上的埠傳送
wdelay      如果多個使用者要寫入nfs目錄,則歸組寫入(預設)
no_wdelay   如果多個使用者要寫入nfs目錄,則立即寫入,當使用async時,無需此設定
hide        在nfs共用目錄中不共用其子目錄
no_hide     共用nfs目錄的子目錄
subtree_check   如果共用/usr/bin之類的子目錄時,強制nfs檢查父目錄的許可權(預設)
no_subtree_check    不檢查父目錄許可權
all_squash      共用檔案的UID和GID對映匿名使用者anonymous,適合公用目錄
no_all_squash   保留共用檔案的UID和GID(預設)
root_squash     使用者的所有請求對映成如anonymous使用者一樣的許可權(預設)
no_root_squash  root使用者具有根目錄的完全管理存取許可權
anonuid=xxx     指定nfs伺服器/etc/passwd檔案中匿名使用者的UID
anongid=xxx     指定nfs伺服器/etc/passwd檔案中匿名使用者的GID

安裝完畢可以使用下面的命令測試一下

$sudo mount -t nfs localhost:/home/jiang/nfs /mnt/  #localhost後面接的是nfs共用目錄
$ls /mnt/
1.txt       #如果能看到nfs裡面的1.txt就表示掛接成功了,nfs伺服器沒有問題
$sudo unmount /mnt/

uboot環境設定

通過設定uboot讓它在啟動過程中從tftp獲取核心和裝置樹,並從在載入核心之後把通過啟動引數將"從nfs掛載根檔案系統"傳入核心。這個設定主要是通過uboot內建的"set 變數名 變數值+save"設定環境變數的方式進行設定,下面是我採用的uboot的環境變數,下面是我用的環境變數設定:

#pri                    #即printenv  
baudrate=115200
bootargs=root=/dev/nfs nfsroot=192.168.0.50:/nfs rw console=ttySAC2,115200n8 init=/linuxrc ip=192.168.0.55 loglevel=7 clk_ignore_unused
bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-origen.dtb;bootm 41000000 - 42000000
bootdelay=4
ethact=dm9000
ethaddr=11:22:33:44:55:66
fileaddr=41000000
filesize=26D213
gatewayip=192.168.2.1
ipaddr=192.168.0.55
netmask=255.255.255.0
serverip=192.168.0.50
stderr=serial
stdin=serial
stdout=serial

baudrate就是波特率,習慣上就設成115200,根據硬體的不同可以相應的修改

bootargs啟動引數,這個引數除了uboot要用,啟動核心之後還會傳入核心。
其中,root=/dev/nfs表示開發板的根檔案系統從nfs網路裝置中載入,nfsroot=192.168.0.55:/nfs表示從網路中的ip是192.168.0.55的主機中的/nfs目錄載入根檔案系統,rw表示可讀可寫,console=ttySAC2表示使用的中端,115200表示波特率,init=/linuxrc表示啟動的祖先進程的位置,顯然這是給linux核心用的,ip=192.168.0.55是開發板的ip,需要和主機在同一個網段,loglevel=7就是登入等級,這個不設也行,clk_ignore_unused忽略時鐘

bootcmd啟動命令,tftp 41000000 uImage表示從tftp網路中下載uImage核心映象到41000000地址處,tftp 42000000 exynos4412-origen.dtb表示下載從tftp網路中下載裝置樹檔案到42000000地址處,bootm 41000000 - 42000000表示從41000000啟動核心,我這沒有randisk,用-代替,不是從41000000到42000000的意思!!!,最後從42000000掛載根檔案系統。
注意:多個命令之間用;分隔,所以為了在設定變數的時候不立即執行,應該寫成set bootcmd tftp 41000000 uImage;tftp 42000000 exynos4412-origen.dtb;bootm 41000000 - 42000000

bootdelay啟動倒計時的秒數

gatewayip表示閘道器

ipaddr表示開發板的ip

serverip表示主機的ip

netmask表示子網掩碼

stderrstdinstdout表示標準輸入輸出錯誤裝置,基本都填串列埠serial

搭建開發環境的細節很多,如有紕漏歡迎批評^-^交流

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-11/137530.htm


IT145.com E-mail:sddin#qq.com