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