【硬創邦】跟hoowa學做智能路由(五):熟悉OpenWRT

題記:呦呦鹿鳴,食野之蘋。我有嘉賓,鼓瑟吹笙。

從本章開始,我們要更多的瞭解系統的特性,以及不論是智能路由還是智能傢居,我們用路由器的處理器到底能做多少事情。

系統結構

在上一章我們已經完成瞭刷機工作,這個時候系統進行瞭首次啟動,並且格式化瞭它的”可寫”分區。那麼在設備裡分區到底是怎麼樣進行的呢?我們首先需要知道:不同的處理器下OpenWRT分區是略微有所區別,不是所有的分區都完全相同的。在路由器的FLASH上,內核中所使用的驅動是MTD設備驅動。

MTD(Memory Technology Devices,內存技術設備)是用於訪問內存類設備(ROM、FLASH)的Linux驅動子系統。它的主要目的使FLASH類設備更加容易被訪問,為此它在硬件和上層提供瞭一個抽象的接口,使得在操作系統下我們可以像操作硬盤一樣操作這個設備。仔細觀察過Linux啟動信息的朋友會看到這麼一段話:

[ 0.690000] 5 tp-link partitions found on MTD device spi0.0
[ 0.700000] Creating 5 MTD partitions on “spi0.0″:
[ 0.700000] 0×000000000000-0×000000020000 : “u-boot”
[ 0.710000] 0×000000020000-0x00000012a290 : “kernel”
[ 0.730000] 0x00000012a290-0x0000007f0000 : “rootfs”
[ 0.760000] 0×000000300000-0x0000007f0000 : “rootfs_data”
[ 0.760000] 0x0000007f0000-0×000000800000 : “art”
[ 0.770000] 0×000000020000-0x0000007f0000 : “firmware”

這些信息表示當前系統識別到的FLASH分區。我們可以用電腦中的計算器計算一下,打開計算器,選擇科學型、十六進制,輸入名為art的分區容量用(800000-7f0000)結果為10000(十六進制),這個時候點擊十進制,系統會自動將結果轉換為十進制,再除以1024結果為64(K)表示這個分區容量為64k。在openwrt的系統中現在對atheros方案實現瞭自動查找分區結尾。



上面的幾個分區,我來說明下(分區名稱、分區容量、分區作用):

  • “u-boot”:128KB,設備初始化程序+引導程序代碼本身
  • “kernel” :1MB,存放系統內核的二進制代碼,按照x86下的講法是Raw分區,就是這裡隻有內核的二進制,不存在文件系統。
  • “rootfs”:6.7MB,完整的系統文件包含隻讀和可寫
  • “rootfs_data”:4.9MB,在rootfs中的可寫部分的位置
  • “art”:64KB,EEPROM分區,在Atheros的方案中這個分區保存瞭無線的硬件參數
  • “firmware”:7.9MB,完整的固件位置包含瞭除”u-boot”和”art”之外全部的內容

看的暈瞭? 這,我馬上畫個簡單的圖給大傢看看:

5-a

這個是它的分區邏輯。請不要太在意這個地方,有點暈也沒關系,繼續往後面看,這個地方留著後邊慢慢理解。

在系統中,可以執行以下指令查看當前系統分區:

root@OpenWrt:/tmp# cat /proc/mtd
dev: size erasesize name
mtd0: 00020000 00010000 “u-boot”
mtd1: 0010a290 00010000 “kernel”
mtd2: 006c5d70 00010000 “rootfs”
mtd3: 004f0000 00010000 “rootfs_data”
mtd4: 00010000 00010000 “art”
mtd5: 007d0000 00010000 “firmware”

root@OpenWrt:/tmp# cat /proc/partitions
major minor #blocks name

31 0 128 mtdblock0
31 1 1064 mtdblock1
31 2 6935 mtdblock2
31 3 5056 mtdblock3
31 4 64 mtdblock4
31 5 8000 mtdblock5

每個分區在flash中的位置是/dev/mtdblockX這樣的位置,比如你想把art分區裡的數據讀出來看看,那麼就執行:

root@OpenWrt:/tmp# dd if=/dev/mtdblock4 of=/tmp/1
128+0 records in
128+0 records out

然後執行hexdump -C /tmp/1就可以看到這個分區的內容瞭。

系統的文件結構

好瞭,我們這一節將的非常重要。上一節說過系統在第一次啟動的時候會格式化”可寫分區”,這在邏輯上到底是啥關系呢?

首先uboot啟動瞭kernel完成之後,由kernel加載”ROM分區”(就是rootfs減去rootfs_data得到的那一塊分區),ROM分區采用的是Linux內核支持的squashFS文件系統,squashFS文件系統是一種壓縮隻讀文件系統。加載完畢後將其掛載到/rom目錄。系統將使用JFFS2文件系統格式化rootfs_data這部分並且將這部分掛載到/overlay目錄。然後將一部分內存掛載為/tmp目錄。

這個時候大傢一定有一個問題:到底根文件系統是哪個?這個是OpenWRT設計的一個優點,它采用瞭一種叫Overlay透明掛載技術,首先將/rom掛載為/根文件,然後再用/overlay覆蓋在/之上,這樣,當你進行文件系統的變更,修改,所做的操作將在overlay中記錄。rom是不改變的。而最簡單的恢復出廠設置方法,即是刪除掉/overlay下所有文件。

1

大致上而言,系統的啟動流程類似CentOS這類x86下的發行版。由於本文讀者多是熟悉linux的朋友,關於系統的啟動流程不做詳細解釋瞭。

基本指令

OpenWRT下系統的基本指令沒有使用x86下的指令包,因為那些指令包容量太大。它使用的是Busybox項目。

Busybox是一個集成瞭一百多個常用Linux命令和工具的軟件包(OpenWRT下編譯可以選擇要哪些指令)。除瞭包含常規指令之外,Busybox還包含瞭grep、find、mount以及telnet、http等復雜工具。其被戲稱為Linux下的瑞士軍刀。

2

通過列表大傢可以看到,在bin下大部分都是軟連接,這些軟連接幾乎都連接到Busybox中。是的,Busybox就是以檢測用戶執行的是什麼名稱來識別用戶需要啥指令。

3

hoowa要告訴大傢,Busybox在80%的情況下與x86下的標準指令是完全相同的,有20%的情況一些指令的細節參數是不支持的。

常用來需要配置的文件夾和內容:

/etc/ 存放著系統全部的配置文件
/etc/init.d/ 存放著啟動的服務腳本
/etc/config/ 存放著OpenWRT的配置文件包括網絡等等
/tmp/ 臨時文件之外還存放著動態的配置文件
/tmp/TZ 就是系統啟動後所使用的時區參數
…..

其它還有很多,我們就不一一介紹,用到哪個時再講。

讓設備連入網絡

以上已經完成後,可以將電腦與設備之間那根網線可以拔掉瞭。

將你的外網網線插入M150開發版的WAN口(WAN口位置請參考之前章節的介紹),這時系統將通過putty面板刷下屏,信息提示已插入網線。

通過執行指令可以看到是否當前設備被分配瞭IP地址:

4

其中eth0就是WAN口,其它的暫時不講解。

軟件包管理

在OpenWRT下使用的軟件包管理技術叫做OPKG,它是一個輕量級的軟件包技術,已經成為開源嵌入式的事實標準,它類似CentOS下的yum,可以實現對預編譯的二進制軟件下載。

輸入opkg即可看到整個軟件的完整幫助信息。語法格式:opkg [參數…] 子命令 [子參數…],參數有:

update 下載服務器上可用的軟件包列表
upgrade <包名> 升級軟件包
install <包名> 安裝軟件包
configure <包名> 配置某一個軟件包
remove <包名> 卸載軟件包
info [pkg|regexp] 顯示出指定軟件包的信息

系統命令遠比我介紹的要多的多,而且這些命令是我們最常用的。本著深入淺出的態度,大傢根據自己的能力,希望學更多的童鞋可以自己詳細查看下opkg的幫助文檔。

接下來我們來安裝一個vmstat。在OpenWRT下如果你要對你的程序進行負載檢測,vmstat是一個非常實用的工具。(由於軟件包列表可能會比較大因此並不保存在系統中,每次啟動需要首先執行opkg update取得最新的軟件包。)

root@OpenWrt:/# opkg update
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/Packages.gz.
Updated list of available packages in /var/opkg-lists/barrier_breaker.
root@OpenWrt:/# opkg install procps-vmstat
Installing procps-vmstat (3.2.8-1) to root…
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/procps-vmstat_3.2.8-1_ar71xx.ipk.
Installing procps (3.2.8-1) to root…
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/procps_3.2.8-1_ar71xx.ipk.
Installing libncurses (5.9-1) to root…
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/libncurses_5.9-1_ar71xx.ipk.
Installing terminfo (5.9-1) to root…
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/terminfo_5.9-1_ar71xx.ipk.
Configuring terminfo.
Configuring libncurses.
Configuring procps.
Configuring procps-vmstat.

這樣就安裝完成瞭,可以執行vmstat 1看看效果。別忘瞭如果要退出vmstat 1,可按鍵盤Ctrl+C中斷。安裝後軟件包會被保存在/overlay的分區中,不會丟失。

OPKG配置:

root@OpenWrt:/# cat /etc/opkg.conf
src/gz barrier_breaker http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay

這裡有列表出opkg的配置,第一句那個地址是表示當前這臺機器下載的二進制包所使用的服務地址,因為處理器指令集不一樣,所以地址很豐富的。也就是說,你可以自己給自己的智能路由產品搭建一個軟件包服務器。如果大傢想知道有多少軟件可以安裝,就可以用你的瀏覽器直接訪問那個地址,即可列表出全部的可用軟件包。

關於軟件包

在未來的章節中,我們將會再次介紹OPKG相關的內容,我們會介紹如何自己制作OPKG軟件包,以及自己搭建OPKG服務器的步驟和方法。屆時,你可以更容易的移植x86下的軟件到OpenWRT中,也可以選擇哪些軟件包是要打到固件的ROM中、哪些是要動態安裝的。

本章到這裡結束瞭,介紹的知識點不多,但是內容其實還是挺多的。關於軟件包部分希望大傢能多多練習,還是那句話,不怕弄壞瞭,壞瞭就重新刷。

最後,大傢現在可以開始提問,在雷鋒網文章評論、公眾號「宅客」:letshome、QQ群:196302618、郵箱:DIYRouter#163.com都可以提交,問題我將會在下章的時候統一解答。需要提醒下,我並不是高手,我回答問題有三個原則:1、我會的我直接回答 2、我不太會的我看著回答 3、我不會的我瞎忽悠。所以我給的答案是否正確需要大傢自行判斷。

qrcode_for_gh_55cd9ad5ea6d_430

Comments are closed.