從本章開始,我們要更多的了解系統(tǒng)的特性,以及不論是智能路由還是智能家居,我們用路由器的處理器到底能做多少事情。 系統(tǒng)結(jié)構(gòu)在上一章我們已經(jīng)完成了刷機工作,這個時候系統(tǒng)進(jìn)行了首次啟動,并且格式化了它的”可寫”分區(qū)。那么在設(shè)備里分區(qū)到底是怎么樣進(jìn)行的呢?我們首先需要知道:不同的處理器下OpenWRT分區(qū)是略微有所區(qū)別,不是所有的分區(qū)都完全相同的。在路由器的FLASH上,內(nèi)核中所使用的驅(qū)動是MTD設(shè)備驅(qū)動。 MTD(Memory Technology Devices,內(nèi)存技術(shù)設(shè)備)是用于訪問內(nèi)存類設(shè)備(ROM、FLASH)的Linux驅(qū)動子系統(tǒng)。它的主要目的使FLASH類設(shè)備更加容易被訪問,為此它在硬件和上層提供了一個抽象的接口,使得在操作系統(tǒng)下我們可以像操作硬盤一樣操作這個設(shè)備。仔細(xì)觀察過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”
這些信息表示當(dāng)前系統(tǒng)識別到的FLASH分區(qū)。我們可以用電腦中的計算器計算一下,打開計算器,選擇科學(xué)型、十六進(jìn)制,輸入名為art的分區(qū)容量用(800000-7f0000)結(jié)果為10000(十六進(jìn)制),這個時候點擊十進(jìn)制,系統(tǒng)會自動將結(jié)果轉(zhuǎn)換為十進(jìn)制,再除以1024結(jié)果為64(K)表示這個分區(qū)容量為64K。在openwrt的系統(tǒng)中現(xiàn)在對atheros方案實現(xiàn)了自動查找分區(qū)結(jié)尾。 上面的幾個分區(qū),我來說明下(分區(qū)名稱、分區(qū)容量、分區(qū)作用): - “u-boot”:128KB,設(shè)備初始化程序+引導(dǎo)程序代碼本身
- “kernel” :1MB,存放系統(tǒng)內(nèi)核的二進(jìn)制代碼,按照x86下的講法是Raw分區(qū),就是這里只有內(nèi)核的二進(jìn)制,不存在文件系統(tǒng)。
- “rootfs”:6.7MB,完整的系統(tǒng)文件包含只讀和可寫
- “rootfs_data”:4.9MB,在rootfs中的可寫部分的位置
- “art”:64KB,EEPROM分區(qū),在Atheros的方案中這個分區(qū)保存了無線的硬件參數(shù)
- “firmware”:7.9MB,完整的固件位置包含了除”u-boot”之外全部的內(nèi)容
看的暈了? 這,我馬上畫個簡單的圖給大家看看: 這個是它的分區(qū)邏輯。請不要太在意這個地方,有點暈也沒關(guān)系,繼續(xù)往后面看,這個地方留著后邊慢慢理解。 在系統(tǒng)中,可以執(zhí)行以下指令查看當(dāng)前系統(tǒng)分區(qū):
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
每個分區(qū)在flash中的位置是/dev/mtdblockX這樣的位置,比如你想把art分區(qū)里的數(shù)據(jù)讀出來看看,那么就執(zhí)行:
root@OpenWrt:/tmp# dd if=/dev/mtdblock4 of=/tmp/1
128+0 records in
128+0 records out
然后執(zhí)行hexdump -C /tmp/1就可以看到這個分區(qū)的內(nèi)容了。 系統(tǒng)的文件結(jié)構(gòu)好了,我們這一節(jié)將的非常重要。上一節(jié)說過系統(tǒng)在第一次啟動的時候會格式化”可寫分區(qū)”,這在邏輯上到底是啥關(guān)系呢? 首先uboot啟動了kernel完成之后,由kernel加載”ROM分區(qū)”(就是rootfs減去rootfs_data得到的那一塊分區(qū)),ROM分區(qū)采用的是Linux內(nèi)核支持的squashFS文件系統(tǒng),squashFS文件系統(tǒng)是一種壓縮只讀文件系統(tǒng)。加載完畢后將其掛載到/rom目錄。系統(tǒng)將使用JFFS2文件系統(tǒng)格式化rootfs_data這部分并且將這部分掛載到/overlay目錄。然后將一部分內(nèi)存掛載為/tmp目錄。 這個時候大家一定有一個問題:到底根文件系統(tǒng)是哪個?這個是OpenWRT設(shè)計的一個優(yōu)點,它采用了一種叫Overlay透明掛載技術(shù),首先將/rom掛載為/根文件,然后再用/overlay覆蓋在/之上,這樣,當(dāng)你進(jìn)行文件系統(tǒng)的變更,修改,所做的操作將在overlay中記錄。rom是不改變的。而最簡單的恢復(fù)出廠設(shè)置方法,即是刪除掉/overlay下所有文件。 大致上而言,系統(tǒng)的啟動流程類似CentOS這類x86下的發(fā)行版。由于本文讀者多是熟悉linux的朋友,關(guān)于系統(tǒng)的啟動流程不做詳細(xì)解釋了。 基本指令OpenWRT下系統(tǒng)的基本指令沒有使用x86下的指令包,因為那些指令包容量太大。它使用的是Busybox項目。 Busybox是一個集成了一百多個常用Linux命令和工具的軟件包(OpenWRT下編譯可以選擇要哪些指令)。除了包含常規(guī)指令之外,Busybox還包含了grep、find、mount以及telnet、http等復(fù)雜工具。其被戲稱為Linux下的瑞士軍刀。 通過列表大家可以看到,在bin下大部分都是軟連接,這些軟連接幾乎都連接到Busybox中。是的,Busybox就是以檢測用戶執(zhí)行的是什么名稱來識別用戶需要啥指令。 hoowa要告訴大家,Busybox在80%的情況下與x86下的標(biāo)準(zhǔn)指令是完全相同的,有20%的情況一些指令的細(xì)節(jié)參數(shù)是不支持的。 常用來需要配置的文件夾和內(nèi)容:
/etc/ 存放著系統(tǒng)全部的配置文件
/etc/init.d/ 存放著啟動的服務(wù)腳本
/etc/config/ 存放著OpenWRT的配置文件包括網(wǎng)絡(luò)等等
/tmp/ 臨時文件之外還存放著動態(tài)的配置文件
/tmp/TZ 就是系統(tǒng)啟動后所使用的時區(qū)參數(shù)
…..
其它還有很多,我們就不一一介紹,用到哪個時再講。 讓設(shè)備連入網(wǎng)絡(luò)以上已經(jīng)完成后,可以將電腦與設(shè)備之間那根網(wǎng)線可以拔掉了。 將你的外網(wǎng)網(wǎng)線插入M150開發(fā)版的WAN口(WAN口位置請參考之前章節(jié)的介紹),這時系統(tǒng)將通過putty面板刷下屏,信息提示已插入網(wǎng)線。 通過執(zhí)行指令可以看到是否當(dāng)前設(shè)備被分配了IP地址: 其中eth0就是WAN口,其它的暫時不講解。 軟件包管理在OpenWRT下使用的軟件包管理技術(shù)叫做OPKG,它是一個輕量級的軟件包技術(shù),已經(jīng)成為開源嵌入式的事實標(biāo)準(zhǔn),它類似CentOS下的yum,可以實現(xiàn)對預(yù)編譯的二進(jìn)制軟件下載。 輸入opkg即可看到整個軟件的完整幫助信息。語法格式:opkg [參數(shù)...] 子命令 [子參數(shù)...],參數(shù)有:
update 下載服務(wù)器上可用的軟件包列表
upgrade <包名> 升級軟件包
install <包名> 安裝軟件包
configure <包名> 配置某一個軟件包
remove <包名> 卸載軟件包
info [pkg|regexp] 顯示出指定軟件包的信息
系統(tǒng)命令遠(yuǎn)比我介紹的要多的多,而且這些命令是我們最常用的。本著深入淺出的態(tài)度,大家根據(jù)自己的能力,希望學(xué)更多的童鞋可以自己詳細(xì)查看下opkg的幫助文檔。 接下來我們來安裝一個vmstat。在OpenWRT下如果你要對你的程序進(jìn)行負(fù)載檢測,vmstat是一個非常實用的工具。(由于軟件包列表可能會比較大因此并不保存在系統(tǒng)中,每次啟動需要首先執(zhí)行opkg update取得最新的軟件包。)
root@OpenWrt:/# opkg update
Downloading http://downloads.openwrt.org/sna ... ckages/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/sna ... 3.2.8-1_ar71xx.ipk.
Installing procps (3.2.8-1) to root…
Downloading http://downloads.openwrt.org/sna ... 3.2.8-1_ar71xx.ipk.
Installing libncurses (5.9-1) to root…
Downloading http://downloads.openwrt.org/sna ... s_5.9-1_ar71xx.ipk.
Installing terminfo (5.9-1) to root…
Downloading http://downloads.openwrt.org/sna ... o_5.9-1_ar71xx.ipk.
Configuring terminfo.
Configuring libncurses.
Configuring procps.
Configuring procps-vmstat.
這樣就安裝完成了,可以執(zhí)行vmstat 1看看效果。別忘了如果要退出vmstat 1,可按鍵盤Ctrl+C中斷。安裝后軟件包會被保存在/overlay的分區(qū)中,不會丟失。 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的配置,第一句那個地址是表示當(dāng)前這臺機器下載的二進(jìn)制包所使用的服務(wù)地址,因為處理器指令集不一樣,所以地址很豐富的。也就是說,你可以自己給自己的智能路由產(chǎn)品搭建一個軟件包服務(wù)器。如果大家想知道有多少軟件可以安裝,就可以用你的瀏覽器直接訪問那個地址,即可列表出全部的可用軟件包。 關(guān)于軟件包在未來的章節(jié)中,我們將會再次介紹OPKG相關(guān)的內(nèi)容,我們會介紹如何自己制作OPKG軟件包,以及自己搭建OPKG服務(wù)器的步驟和方法。屆時,你可以更容易的移植x86下的軟件到OpenWRT中,也可以選擇哪些軟件包是要打到固件的ROM中、哪些是要動態(tài)安裝的。 本章到這里結(jié)束了,介紹的知識點不多,但是內(nèi)容其實還是挺多的。關(guān)于軟件包部分希望大家能多多練習(xí),還是那句話,不怕弄壞了,壞了就重新刷。
|