1 嵌入式系統啟動流程
對于一個完整的嵌入式系統,它由U-boot、內核(Linux)、文件系統、應用程序四部分組成。那么這四部分之間的關系是怎么樣的呢?OpenWrt是屬于哪部分呢?
當我們拿到嵌入式設備,比如我們的MT7620開發板,然后給它一上電,首先運行的就是我們的U-boot程序,然后就是U-boot來啟動我們的內核(Linux),當內核(Linux)啟動完成以后,內核(Linux)就會去掛載我們的文件系統,當文件系統掛載成功以后,就會在文件系統上面運行我們的應用程序,比如我們學習C語言時寫的HelloWorld應用程序。
OpenWrt系統是一個嵌入式的Linux發行版。它本生是包含了內核(Linux)和文件系統兩部分的。因此,上一章中,我們編譯出來的固件
openwrt-ramips-mt7620-youku-yk1-squashfs-sysupgrade.bin
就是將內核(Linux)和文件系統打包成了一個bin文件。在這里,大家肯定會有疑問了,那么U-boot是誰提供的呢?對于其它的嵌入式設備,U-boot是需要我們單獨來編譯和燒寫的,而對于我們的MT7620等開發板,我們在出廠的時候,已經在開發板上的Flash中燒入了U-boot了。
那么大家馬上肯定會問,我們可以自己燒寫U-boot嗎?答案是肯定的。我們可以自己燒寫U-boot。如何燒寫,我們會在后面進行講解。
注意:雖然我們可以自己燒寫U-boot,但是,如果不是動手能力特別強的同學,不建議自己燒寫U-boot,因為隨時都有可能變磚。變磚以后,就只能通過SPIFlash編程器來拯救了。雖然在后面的章節,會講如何使用SPIFlash編程器來燒U-boot、固件。但是整個過程比較麻煩,所以請大家自己慎重。
2 U-boot菜單選項簡介
將開發板的Mini-USB口通過USB線和電腦的USB口進行連接,然后安裝串口驅動(只有第一次需要安裝),USB轉串口驅動文件如下,安裝步驟不再贅述。
圖1串口驅動
圖2電腦識別到串口
打開putty串口下載軟件,編者也給出了另一款下載軟件securecrt,看讀者喜好了。自己選擇吧。
緊接著,如圖3所示,在終端上設置好相應的串口(8N1,57600)。
圖3設置終端
最后上電啟動,便可以在串口上看到開發板的啟動信息,首先打印出的是U-boot的版本等信息,如圖4所示。
圖4 U-boot啟動信息
緊接著便進入了U-boot的菜單選項,如圖5所示。這里一共有5秒的時間供大家選擇。如果不做任何選擇,5秒后,便自動啟動內核。
圖5U-boot的菜單選項
1).選擇1,表示將固件通過網絡下載到內存中,如果是刷SDK固件,可以選擇這個選項,但是,如果是刷OpenWrt,該選項沒有用,我們會發現,刷固件成功以后,系統并不能正常啟動;
2).選擇2,表示將固件通過網絡下載到Flash中,在以后的開發中,我們都是使用該選項;
3).選擇3,表示啟動內核(Linux),上面說的5秒結束,不做任何選擇,系統就會默認來選擇該選項,然后啟動系統;
4).選擇4,便會進入到U-boot的命令行,注意區分Linux系統的命令行。在U-boot的命令行我們可以使用printenv、set、loadb等命令。
5).選擇7,表示將U-boot通過串口下載到Flash中;
6).選擇9,表示將U-boot通過網絡下載到Flash中。
3 燒寫OpenWrt固件
以下燒寫方法,都是通過網絡的方式進行燒寫。因此,需要用到網線。接線方式有兩種,一是通過網線將開發板的網口和電腦的網口直接相連(電腦---開發板);另一種是電腦和路由器通過網線或者wifi連接,然后開發板和路由器通過網線連接(電腦---路由器---開發板)。
為了更加方便和穩定,推薦使用第二種方法。
無論使用哪種方法,都必須遵循一個大前提,就是要讓電腦和開發板的IP處于同一個網段。另外,一定要關閉電腦的防火墻和一些頑固的殺毒軟件。
3.1 通過網線下載
3.1.1設置ubuntu虛擬網卡
1 選擇網卡
編輯->虛擬網絡編輯器->橋接模式選擇本機的物理網卡,見下圖.
圖6
2 網絡適配器設置
虛擬機->設置->網絡適配器
圖7
3.1.2 主服務器tftp服務器配置
TFTP(Trivial File Transfer Protocol,簡單文件傳輸協議)是TCP/IP協議族中的一個用來在客戶機與服務器之間進行簡單文件傳輸的協議,提供不復雜、開銷不大的文件傳輸服務。TFTP承載在UDP上,提供不可靠的數據流傳輸服務,不提供存取授權與認證機制,使用超時重傳方式來保證數據的到達。
0 IP配置
在談TFTP之前,先簡單講一下Linux網絡配置,網絡中最重要的當然是IP地址了,這里不講IP協議,在后面的網絡編程再講解,這里主要學習一下Linux下配置IP,配置IP地址的方法有兩種:
- 配置靜態IP:在主機進入網絡之前,事先未主機設置固定的IP地址;
- 配置動態IP:選擇DHCP網絡服務,在主機進行網絡之后,動態的隨機獲取IP地址;
當然,大家都知道ifconfig這個命令:
ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:6c:c2:ec
inet addr:172.16.58.130 Bcast:172.16.58.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe6c:c2ec/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:337 errors:0 dropped:0 overruns:0 frame:0
TX packets:358 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:123712 (123.7 KB) TX bytes:42430 (42.4 KB)
Interrupt:19 Base address:0x2024
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:149 errors:0 dropped:0 overruns:0 frame:0
TX packets:149 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:10307 (10.3 KB) TX bytes:10307 (10.3 KB)
如果ifconfig命令不帶任何參數時,用于顯示當前主機中狀態為“活動”的網絡接口信息;
當然,ifconfig命令可以修改IP地址:
sudo ifconfig eth0 192.168.3.51
但是這是動態的修改IP地址,重啟以后,IP地址又變回原來的靜態IP地址;修改IP地址除了可以在圖形界面中修改,也可以在配置文件中修改,這才是Linux的特性!無論是配置靜態IP還是動態IP,計算機系統將IP信息保存在什么地方呢?答案是配置文件 "/etc/network/interfaces".在UBuntu Linux 啟動時就能獲得IP地址的配置信息。若是配置靜態IP。就從配置文件中讀取IP地址參數,直接配置網絡接口設備;若是配置動態IP,就通知主機通過DHCP協議獲取網絡配置。以下分別為配置靜態IP和動態IP時,配置文件"/etc/network/interfaces"的實例:
動態IP
cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
靜態IP
cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.3.51
netmask 255.255.0.0
gateway 192.168.1.1
重啟下系統,用ifconfig命令查看IP地址
ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:6c:c2:ec
inet addr:192.168.3.51 Bcast:192.168.255.255 Mask:255.255.0.0
明顯看到IP地址依然是我們靜態修改過的IP地址。
注意:
1、若不能訪問外網: ping 不通114.114.114.114
解決方法: sudo route add default gw 192.168.1.1
2、若不能訪問域名: ping 不通baidu.com
解決方法:
1)-- sudo vi /etc/resolv.conf
2) -- 添加nameserver 114.114.114.114
1 檢查是否安裝tftp server
命令:dpkg –s tftpd-hpa
2 如果未安裝則需要安裝tftp-server
命令:sudo apt-get install tftp-hpa tftpd-hpa
Client:PC 安裝tftp-hpa
Server:ARM 安裝tftpd-hpa
后面的 tftp 此處的IP地址應該是ARM的IP地址。
__3 修改文件 tftpd-hpa __
命令:sudo vim /etc/default/tftpd-hpa
tftpd-hpa文件修改后如下:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
說明:修改項,其中TFTP_DIRECTORY處可以改為你的tftp-server的根目錄,這里是/tftpboot,當然可以改成其他地址,參數 -c 指定了可以創建文件,參數 -s是指定tftpd-hpa服務目錄,上面已經指定。
4 創建目錄tftpboot,改變權限及啟動
命令:
sudo mkdir /tftpboot
sudo chmod a+w /tftpboot
操作命令:
sudo service tftpd-hpa stop//停止
sudo service tftpd-hpa start//啟動
sudo service tftpd-hpa status//查看tftp信息
sudo service tftpd-hpa restart//重啟
5 測試
a、登陸服務器
tftp localhost或 tftp<主機IP>
b、從tftp服務器下載文件
tftp> get
c、上傳文件到tftp服務器
tftp> put
d、查看幫助
tftp>?
tftp-hpa5.2
Commands may be abbreviated. Commands are:
connect connect to remote tftp
mode set file transfer mode
put send file
get receive file
quit exit tftp
verbose toggle verbose mode
trace toggle packet tracing
literal toggle literal mode, ignore':'in file name
status show current status
binary set mode to octet
ascii set mode to netascii
rexmt set per-packet transmission timeout
timeout set total retransmission timeout
?print help information
help print help information
e、退出登陸
tftp> q
注意:必須是超級用戶權限
6問題及原因(解決方法):
1、Transfer time out.
tftpd服務沒有啟動
2、Error code 0:Permission denied
可能是由SELinux造成的,在FC3和FC3以后的FC版本中SELinux默認的都是開啟的,現在要關掉它。
修改文件/etc/sysconfig/selinux,設定SELINUX=disabled,然后重啟電腦即可
或者執行命令system-config-securitylevel打開“安全級別配置”對話框,將SELinux(S)選項中“強制”改為“允許”
3、Error code 1:File not found
指定的文件夾不存在;或tftpd啟動參數中沒有指定-c選項,允許上傳文件
4、Error code 2:Only absolute filenames allowed
TFTP_OPTIONS="-l -c -s",中的選項注意一下,是否沒 -c
5、Error code 2:Access violation
上傳的文件要有相應的可讀寫(覆蓋)的權限才能上傳,要對文件的權限進行修改
chmod 777 (文件名)
3.1.3 主機端NFS配置
NFS是Network File System的簡寫,即網絡文件系統。
網絡文件系統是許多操作系統都支持的文件系統中的一種,也被成為NFS。NFS允許一個系統在網絡上與他人共享目錄和文件。通過使用NFS,用戶可以像訪問本地文件一樣訪問遠端系統上的文件。
NFS所提供的共享文件服務是建議在高度信任的基礎上的,所以,向其他用戶釋放共享資源之前,一定要確保對方的可靠性。
NFS的應用:在我們嵌入式開發過程中,NFS是一個重要環節,我們常?!ぐ选案募毕到y放在主機上,然后在開發板啟動的時候通過NFS來掛載主機上的根文件系統。這樣省去了每次都要把文件系統燒寫到存儲設備上的步驟,可以說比tftp更方便。
下面我們將以Ubuntu為例,講解一下NFS的配置過程:
Server: PC
CLient : ARM(這里是用同一臺機器模擬的,主要是安裝過程)
1 檢查是否安裝nfs
命令:sudo dpkg -s install nfs-kernel-server
2 如果未安裝則需要安裝nfs-server
命令:sudo apt-get install nfs-kernel-server
3 修改配置文件及權限
命令:
sudo vim /etc/exports
sudo chmod 777 /tftpboot/rootfs
修改后的文件:
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#/tftpboot/rootfs *(rw,sync,no_root_squash,no_subtree_check)
格式說明:
共享目錄:主機名稱
主機名稱或共享IP:允許按照指定權限訪問這個目錄的遠程主機(如:開發板)
參數:
ro:只讀權限
rw:讀寫權限
no_root_squash:如果是客戶端root,那么他對這個目錄具有root權限
root_squash:如果是客戶端root,那么他的權限被限制為匿名使用者
all_squash:如果是客戶端是什么身份,那么他的權限被限制為匿名使用者
4手動啟停NFS服務
命令:
sudo/etc/init.d/nfs-kernel-server start
sudo /etc/init.d/nfs-kernel-server restart
sudo/etc/init.d/nfs-kernel-server stop
sudo/etc/init.d/nfs-kernel-server restart//重新啟動
5 共享操作
sudo/etc/init.d/nfs-kernel-server status//查看NFS服務當前狀態
showmount –e 192.168.3.51 //查看NFS服務器的共享資源
sudo mount –t nfs 192.168.3.51: /tftpboot/rootfs/mnt/nfs//掛載共享資源
-t 指類型,這里是NFS;
192.168.3.51是服務端的IP地址;
/tftpboot/rootfs 是服務端的共享目錄;
/mnt/nfs是掛載點,是客戶端的目錄;
當客戶端使用mount命令講NFS服務器上的到處文件系統掛載到本地后,接下來對掛載的文件系統的操作與使用本地文件系統沒有任何區別。
sudo umount/mnt/nfs//卸載共享資源
需要說明的是,當有用戶正在使用某個已加載的共享目錄上的文件時,則不能卸載該文件系統,如果用戶確認無誤,可以使用“umount -f”命令強行卸載共享的目錄。
6測試
第一種方法)showmount -e
第二種方法)自己掛載
$ mount -t nfs 127.0.0.1:/nfsboot /mnt/xxx
注意:必須是超級用戶權限
連接串口和板子,運行串口通信程序(putty在工具),設置相關參數。
圖8
圖9
然后開發板上電,在如圖10所示的界面中,選擇2。
圖10
在圖10所示界面中,我們輸入y以確定我們是要燒寫固件到Flash中。接著便會進入到如圖11所示界面。
圖11
1).如圖11所示的1中,輸入設備IP,這個IP可以是任意的,但是必須要和2中輸入的服務器IP是同一個網段;
2).如圖11所示的2中,輸入服務器IP;
3).如圖11所示的3中,輸入我們要下載的固件的名字。以上3點設置好以后,最后回車,便開始下載程序了。如圖12所示。
圖12下載過程
注意:
1).出現#####,表示下載正在下載,一切正常;出現TTTTT,則說明我們哪里設置不對,需要從頭重新設置一下。
2).如圖12所示,當串口打印出raspi_erase信息的時候,表示正在擦除Flash中的數據,此時一定不要強行斷電和退出,否則開發板就變磚了。
3.2 通過tftpd32軟件
Tftpd32軟件適用于32位系統和部分64位系統。首先啟動軟件,Tftpd32的界面如下。
圖13 Tftpd32界面
①對應的CurrentDirectory用于選擇固件所在的目錄,通過Browse按鈕來進行選擇設置。比如,我將固件放在了G:盤的tftpboot目錄,則需要進行如圖2所示的設置。
②對應的Serverinterface用于選擇服務器的IP地址。此時,如果你是通過網線和開發板或者路由器進行連接,那么這里就應該選擇為本地有線網卡的IP地址;如果是通過WiFi和路由器進行連接,那么這里應該選擇為無線網卡的IP地址。
注意:電腦的IP地址通過在運行(win+R就可打開,方法很多)中CMD中輸入ipconfig命令得到,如圖14所示。
圖14查看電腦IP
當Tftpd32軟件設置完成以后,接下來就是將開發板的Mini-USB口通過USB線和電腦的USB口進行連接,然后安裝串口驅動和設置好相應的串口(8N1,57600),然后開發板上電,在如圖15所示的界面中,選擇2。
圖15
在圖15所示界面中,我們輸入y以確定我們是要燒寫固件到Flash中。接著便會進入到如圖16所示界面。
圖16
1).如圖16所示的1中,輸入設備IP,這個IP可以是任意的,但是必須要和2中輸入的服務器IP是同一個網段;
2).如圖16所示的2中,輸入服務器IP;
3).如圖16所示的3中,輸入我們要下載的固件的名字。以上3點設置好以后,最后回車,便開始下載程序了。如圖17所示。
圖17下載過程
注意:
1).出現#####,表示下載正在下載,一切正常;出現TTTTT,則說明我們哪里設置不對,需要從頭重新設置一下。
2).如圖17所示,當串口打印出raspi_erase信息的時候,表示正在擦除Flash中的數據,此時一定不要強行斷電和退出,否則開發板就變磚了。
3.3 通過3CDaemon軟件
3CDaemon適用于64位系統。首先啟動軟件,3CDaemon的界面如下。
圖18 CDaemon軟件界面
當我們啟動好3CDaemon軟件以后,我們發現它監聽了電腦上所有網卡的IP地址,這也是較Tftpd32軟件好的地方,不用我們自己選擇指定IP。但是,任然需要我們來設置固件所在目錄。點如圖18所示的,點擊“設置TFTP服務器”按鈕,會彈出如圖19所示的對話框。在該對話框中選中固件的存放目錄即可。
圖19設置固件的目錄
當3CDaemon軟件設置好以后,接下來的操作又和使用Tftpd32軟件的過程一樣了。開發板上電,選2,輸入y,設置設備IP、服務器IP、固件的名字。
注意:對于不會從Ubuntu下載固件的朋友,編者也將固件放在附件里,直接使用就行了。但是想更好地掌握openwrt的朋友,還是要多學習啊。
審核編輯:湯梓紅
-
嵌入式系統
+關注
關注
41文章
3570瀏覽量
129251 -
內核
+關注
關注
3文章
1366瀏覽量
40234 -
Linux
+關注
關注
87文章
11232瀏覽量
208949 -
燒寫
+關注
關注
0文章
57瀏覽量
14264 -
OpenWrt
+關注
關注
10文章
128瀏覽量
39268
發布評論請先 登錄
相關推薦
評論