前幾篇好多人都說路由器的內存太小了,FLASH太小了怎么辦。那我們這章就介紹下怎么給路由器擴充內存和存儲器。 站在玩家興趣身份上來說,這章的內容會讓以后更精彩,操作技術上也存在一些難度,請大家認真操作一次。 實現原理在M150開發(fā)板上我們擁有3個USB接口以及1個TF卡接口,這些接口足夠我們連接各種外部存儲設備。 使用Linux的SWAP技術 (交換內存分區(qū)技術,類似Windows虛擬內存) 還可以讓外部存儲設備承擔一部分內存工作,慢是慢了點,但是聊勝于無啊。 至于擴展Flash的容量,我們有兩種技術: - 外部磁盤替換/overlay可寫分區(qū),這樣不論多大的數據就都是存儲在外部磁盤上了。
- 使用16MB的SPI Flash,這樣不用擴展外置磁盤了, 但是要是做網絡存儲還是不夠。
- 外置磁盤不替換任何存儲,只加載為/mnt/extdisk一個文件夾,需要的數據可以移動到/mnt/extdisk中。
關于供電部分,外置磁盤的供電在開發(fā)板上三個USB口也就差不多1A,移動硬盤要消耗500ma,而外置音箱也要消耗500ma,如果所接入的外置設備比較多,要解決供電問題,唯一的方法就是采用獨立供電。很多外置磁盤帶獨立供電的,可以單獨連接一個電源。 外部磁盤替換FLASH可寫分區(qū)的原理在我們沒有啟用外置磁盤之前系統是這樣啟動的: 從內核首先啟動加載了只讀分區(qū)部分,然后再掛載可寫分區(qū)部分,一直到之后的亂七八糟工作……
kernel–>rootfs(/rom)–>FLASH可寫分區(qū)(/overlay)–>….. (/overlay=mtd3)
在我們啟動了外置磁盤之后是這樣的順序: 從內核首先啟動加載了只讀分區(qū)部分,然后再掛載可寫分區(qū)部分,在可寫分區(qū)中發(fā)現了fstab(文件系統加載配置)配置,通過該配置掛載外部磁盤為可寫分區(qū)(卸載掉之前掛載的可寫分區(qū)),一直到之后的亂七八糟工作……
kernel–>rootfs(/rom)–>FLASH可寫分區(qū)(/overlay)–>fstab–>外部磁盤(/overlay) (/overlay=/dev/sd[N][X])
最大的區(qū)別在于,當FLASH可寫分區(qū)被掛載之后(外部磁盤模式)將通過fstab重新的將外部磁盤掛載為/overlay替換掉FLASH可寫分區(qū)的位置。 存儲器選型介紹移動硬盤:在M150的電路板上有三個USB2.0接口均可以用來連接移動硬盤,請使用2.5寸或1.8寸移動硬盤,M150的外部供電至少要達到12V 1A才能帶動一塊硬盤,推薦使用支持獨立供電的移動硬盤。硬盤的優(yōu)勢是,沒有擦寫次數限制,速度快,并且性能也比較好。 FLASH閃存:閃存技術存儲現在很普遍,M150支持TF卡和U盤兩種閃存存儲方式,閃存選購時請注意數據存儲技術有區(qū)別: - SLC: Single Layer Cell 單層單元, SLC的特點是成本高、容量小、速度快,每個存儲單元有1bit數據,每個單元可擦寫次數可達到10萬次,一般使用在工業(yè)級產品和服務器級的SSD中,如果你的設備主要提供頻繁擦寫,使用SLC比較適合,但是其價格也要貴很多。
- MLC: Multi-Level Cell多層單元,在相同的單元密度下可存儲2bit數據,這個是目前市面上消費級SSD使用的最主要存儲技術,但是由于密度增加和算法原因,每個單元理論可擦寫次數為3000-10000次。
- TLC: Triple-level cell多倍單元,在相同的單元密度下可存儲3bit數據,這個是目前低價位U盤常用的,其特點是密度大成本低,缺點是速度慢,容易損壞,每個單元理論可擦寫次數為500-1000次。
所以在這里hoowa推薦,如果你要做網絡存儲,使用移動硬盤是寫文件最快的(最好獨立給移動硬盤有一個供電),理論連續(xù)寫速度可以達到20MB/s(實際在10MB/s以內,USB的限制);如果使用U盤或TF卡,寫速度相對比較慢,如果不做網絡存儲也無所謂了。 讓系統識別外置磁盤在這里到以后的操作流程需要保證設備連接外網,如果你的外網連接有問題,請參考前幾章的教程重新排查。 第一步: 安裝驅動和工具包在保證設備已經能連接外網的情況下執(zhí)行以下指令:
root@SmartRouter:/# opkg update
root@SmartRouter:/# opkg install kmod-usb-core kmod-usb-ohci kmod-usb-uhci kmod-usb2
root@SmartRouter:/# opkg install kmod-usb-storage kmod-usb-storage-extras kmod-fs-ext4 kmod-fs-vfat kmod-nls-utf8 kmod-nls-cp437
root@SmartRouter:/# opkg install usbutils fdisk block-mount e2fsprogs blkid
執(zhí)行過程中會有很多安裝包安裝狀態(tài)提示,只要提示不是報錯就不用理會。 重新啟動系統使相關驅動加載進入內核:
root@SmartRouter:/# reboot
第二步: 檢測外置磁盤檢測U盤和移動硬盤的方法一樣,直接插入存儲設備,等待片刻后執(zhí)行以下指令看到(40G 1.8寸移動硬盤舉例):
root@SmartRouter:/# fdisk -l Disk /dev/mtdblock0: 128 KiB, 131072 bytes, 256 sectors
….. Disk /dev/sdb: 37.3 GiB, 40007759872 bytes, 78140156 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x13015f0b ….
檢測TF卡方式有點區(qū)別,TF卡沒有自動上電功能,首先給開發(fā)板斷電,然后插入TF卡,然后再給開發(fā)板上電,之后執(zhí)行以下指令:
root@SmartRouter:/# fdisk -l Disk /dev/mtdblock0: 128 KiB, 131072 bytes, 256 sectors
…… Disk /dev/sda: 3.7 GiB, 3995074560 bytes, 7802880 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0×00000000 ….
以上檢測其中的Disk /dev/sda的/dev/sda就是外置磁盤的設備符號,這個設備符號不是固定不變的,隨著驅動順序可能會產生變化,但是現在我們要記住這個設備符號。 在我們的開發(fā)板上,設備符號總是以/dev/sd[X][n]方式顯示的。其中X表明設備符號,n表明分區(qū)符號。 每個插入系統的存儲設備根據順序是有變化的,在開發(fā)板上: - /dev/sda 第一個插入的USB存儲設備,也可能是TF卡
- /dev/sda1 第一個插入的USB存儲設備的第一個分區(qū)
- /dev/sda2 第一個插入的USB存儲設備的第二個分區(qū)
- /dev/sdb 第二個插入的USB存儲設備,也可能是TF卡
- /dev/sdc 第三個插入的USB存儲設備,也可能是TF卡
- …..
切記: 1. 如果設備重啟,順序可能會產生變化,/dev/sda可能會變成/dev/sdb的,不過后續(xù)我們有辦法解決。
2. 在下面的操作流程,不論是TF卡,還是U盤或移動硬盤,都是相同的,唯一不同的就是設備符號,每次檢查設備符號都要使用fdisk -l這個指令。
3. 再嘮叨一次,設備符號是會變化的,每次操作時候要fdisk -l查看。 格式化和分區(qū)hoowa使用了一個320GB的2.5寸移動硬盤做演示,各位用什么都可以,沒有硬性規(guī)定(硬盤速度快點)。 第一步: 對設備進行分區(qū)hoowa計劃的分區(qū)結構是這樣:2GB SWAP交換內存分區(qū),余下的容量作為新的外置可寫分區(qū)系統。 我們使用linux下的分區(qū)指令fdisk來進行操作,這次啟動hoowa磁盤被識別成為了/dev/sda(記住這里要看你自己的設備符號是什么,不能直接抄h(huán)oowa的舉例): 輸入p指令查看當前磁盤分區(qū)情況: 輸入d指令刪除掉舊分區(qū)(如果你有多個分區(qū)刪除程序會讓你輸入刪除哪一個范圍是1到4,如果只有一個會默認刪除掉): 一直刪除到沒有分區(qū)為止: 輸入n指令創(chuàng)建分區(qū): 輸入p創(chuàng)建主”分區(qū)1″: 輸入開始位置直接回車,結束位置填寫+2G表示容量為2GB: 輸入t指令修改這個分區(qū)類型為SWAP交換內存(編號為82的分區(qū)類型): 再創(chuàng)建第二個分區(qū): 在結束位置這里直接按回車,表示使用全部容量: 查看當前分區(qū)是否OK: 保存分區(qū)到磁盤上: 重新啟動系統,有時候這一步的操作會出現內核表沒有更新:
root@SmartRouter:/# reboot
第二步: 格式化sda2分區(qū)是用來存放數據的,因此需要格式化。
hoowa向大家推薦使用ext3或ext4分區(qū)類型進行格式化,這樣速度和穩(wěn)定性都比較好。 由于重新啟動后磁盤的設備符號可能變化,因此這里hoowa又看了一次當前的狀態(tài):
root@SmartRouter:/# fdisk -l
……
這里/dev/sda1的類型為82,Linux swap表示它是交換內存分區(qū);/dev/sda2的類型是83, Linux表示它是文件系統分區(qū)。 使用ext4文件系統格式化/dev/sda2作為外置可寫分區(qū): 格式化swap交換分區(qū)/dev/sda1: 用外置磁盤替換FLASH可寫分區(qū)第一步: 將/overlay內容都復制到外置磁盤上這里hoowa的外置磁盤上根分區(qū)設備符號為/dev/sda2(記住上面講的,要看你自己的設備符號是什么,不能直接抄h(huán)oowa的舉例sda2)。 創(chuàng)建和掛載外部磁盤的文件分區(qū):
root@SmartRouter:/# mkdir /mnt/extdisk
root@SmartRouter:/# mount /dev/sda2 /mnt/extdisk
復制文件:
root@SmartRouter:/# tar -C /overlay -cvf – . | tar -C /mnt/extdisk -xf -
root@SmartRouter:/# sync
卸載外部磁盤:
root@SmartRouter:/# umount /mnt/extdisk
第二步: 讀取出外置磁盤的UUID編號使用磁盤設備符號掛載太危險了,因為它可能變化,這次是/dev/sda下次你隨便接入個其他什么設備可能變成/dev/sdb了,這怎么得了啊。 我們要用UUID了,UUID編號的作用就像身份證,不論磁盤的設備符號怎么變化,UUID是不改變的(如果改變了跟順序沒關系,可能是分區(qū)本身有變化了)。 先讀出UUID我們下一步要使用: 每個分區(qū)的UUID都不同,這里我們記住/dev/sda2的,因為這個是我們要準備做可寫分區(qū)的部分。在hoowa的這個硬盤上它是”0af3648e-a204-4e8d-b6a1-31cb6e8ce3ed”,每臺機器不一樣,這玩意不能直接抄啊。 第三步: 設置系統啟動自動掛載外部磁盤現在我們寫的文件還是FLASH可寫分區(qū)。/etc/config/fstab配置文件是掛載記錄(現在還是修改FLASH可寫分區(qū)的,只有這么修改才能實現轉換,記得10.2咋講的不)。 文件結構:
#自動掛載部分
config global automount
……
#自動交換區(qū)掛載
config global autoswap
……
#靜態(tài)掛載(匿名段配置,可以有多個相同的)
config mount
……
fstab配置config global automount段 可選參數:
鍵 值 必須設置 說明
from_fstab 1 是 在hotplug執(zhí)行的時候掛載,值為1表示打開,可選參數: 0 禁用,1 啟用
anon_mount 0 是 當hotplug執(zhí)行到掛載的時候,自動掛載匿名(無config mount配置)的磁盤到/mnt/下??蛇x參數: 0 禁用,1 啟用 fstab配置global autoswap段 可選參數:
鍵 值 必須設置 說明
from_fstab 1 是 在hotplug執(zhí)行的時候掛載,值為1表示打開,可選參數: 0 禁用,1 啟用
anon_swap 1 是 自動掛載任何一個外置磁盤上的交換區(qū),可選參數: 0 禁用,1 啟用 fstab配置config mount段 該段為匿名段可重復存在,可選參數:
鍵 值 必須設置 說明
target 字符串 是 被掛載的位置
device 字符串 否 被掛載的設備符號,如果采用uuid方式掛載可以不配置,可選參數通過fdisk -l查看具體要掛載設備符號
uuid 字符串 否 被掛載的設備UUID號,不能跟device一起使用。
fstype 字符串 是 分區(qū)文件系統類型,可選參數: ext4 / ext3 / fat32
options 字符串 否 掛載時候所使用的參數,如果是ext3 / ext4 可以填寫: rw,sync 表示同步允許讀寫,如果是只讀修改為ro,sync
enabled 數值 是 是否啟用,可選參數: 0 禁用,1 啟用
enabled_fsck 數值 是 是否在掛載的時候檢測文件系統是否異常,可選參數: 0 禁用,1 啟用
舉例:使用UCI直接修改/etc/config/fstab配置文件清理掉fstab舊配置:
root@SmartRouter:/# echo > /etc/config/fstab
root@SmartRouter:/# uci set fstab.automount=global
root@SmartRouter:/# uci set fstab.automount.from_fstab=1
root@SmartRouter:/# uci set fstab.automount.anon_mount=0
root@SmartRouter:/# uci set fstab.autoswap=global
root@SmartRouter:/# uci set fstab.autoswap.from_fstab=1
root@SmartRouter:/# uci set fstab.autoswap.anon_swap=1
root@SmartRouter:/# uci add fstab mount cfg044d78
上面這個cfg044d78是hoowa這臺機器在創(chuàng)建mount時候產生的唯一值,因為mount是屬于匿名段(還記得之前章節(jié)里介紹過UCI部分的匿名段嗎)。也就是說后續(xù)的增加參數操作使用這個cfg044d78代表當前mount操作就行,請注意啊各位,這個cfg開頭的名字在每臺機器上都不一樣各位不要直接抄這部分的指令啊,要變通修改為自己的啊。 UUID填寫剛才blkid取到的那個UUID,其他參考這個設置:
root@SmartRouter:/etc/config# uci set fstab.cfg044d78.uuid=0af3648e-a204-4e8d-b6a1-31cb6e8ce3ed
root@SmartRouter:/etc/config# uci set fstab.cfg044d78.target=/overlay
root@SmartRouter:/etc/config# uci set fstab.cfg044d78.fstype=ext4
root@SmartRouter:/etc/config# uci set fstab.cfg044d78.options=rw,sync
root@SmartRouter:/etc/config# uci set fstab.cfg044d78.enable=1
root@SmartRouter:/etc/config# uci set fstab.cfg044d78.enabled_fsck=0
保存全部fstab的配置:
root@SmartRouter:/etc/config# uci commit fstab
重新啟動系統使一些生效:
root@SmartRouter:/# reboot
/overlay是否已經到磁盤上(如下顯示表示掛載):
root@SmartRouter:/# mount|grep sda2
/dev/sda2 on /overlay type ext4 (rw,sync,relatime,user_xattr,barrier=1,data=ordered)
我們來檢測下是否swap已經工作了(Swap部分的free有了值表示生效):
root@SmartRouter:/# free
total used free shared buffers
Mem: 61664 19184 42480 0 1708
-/+ buffers: 17476 44188
Swap: 1048572 0 1048572
外置磁盤掛載后要注意事項事項A: 事實就是系統已經變了從本節(jié)開始,到以后我們再也不用操作FLASH原有的可寫分區(qū)了,也就是說同樣的/etc/config/fstab這個文件,上面的修改永久的保存在了FLASH可寫分區(qū)里,下面我們再做修改就都是針對外置磁盤的了。 事項B: 外置磁盤拔掉會如何如果拔掉了,系統會默認使用FLASH的可寫分區(qū)來作為/overlay掛載,這樣系統將恢復到10.6節(jié)之前的系統了。如果你的系統被玩壞了,你可以重復操作本章的這個流程,這樣就相當于重新做系統了。 事項C: 插入其他設備系統報錯了這是因為供電和啟動的原因導致磁盤順序瞬間變化,這個時候hoowa建議你關機,再重新開機。UUID會再次找到你的那個磁盤的。 事項D: 檢查你的/etc/config/fstab文件現在你已經是外置磁盤的文件系統了,而那個文件里可能保留著FLASH上的那個加載/overlay的語法(已經是外置了還加載個鳥)。如果有問題就這么清理(UCI命令舉例):
root@SmartRouter:/# echo > /etc/config/fstab
root@SmartRouter:/# uci set fstab.automount=global
root@SmartRouter:/# uci set fstab.automount.from_fstab=1
root@SmartRouter:/# uci set fstab.automount.anon_mount=0
root@SmartRouter:/# uci set fstab.autoswap=global
root@SmartRouter:/# uci set fstab.autoswap.from_fstab=1
root@SmartRouter:/# uci set fstab.autoswap.anon_swap=1
root@SmartRouter:/# uci commit fstab
重啟生效:
root@OpenWrt:/# reboot
本章尾記:經過以上操作以后,我們的系統以后安裝軟件都將自動安裝到外置的磁盤上,而內存也通過Swap方式增加了2G容量。為我們后續(xù)玩更多的功能打好了基礎。經過這樣設置后,這個外置磁盤就不能斷開連接,否則系統將崩潰。
|