系統(tǒng)擴(kuò)容實(shí)戰(zhàn)指南)
1. 為什么OES Plus刷完Armbian必須做系統(tǒng)擴(kuò)容網(wǎng)心云OES Plus這臺(tái)小機(jī)器在二手市場(chǎng)火起來(lái)不是沒(méi)有道理的。瑞芯微RK3568四核A55、2G/4G內(nèi)存可選、自帶一個(gè)SATA位、千兆網(wǎng)口、金屬外殼被動(dòng)散熱這個(gè)配置放在輕量NAS、旁路由、下載機(jī)、Docker小主機(jī)的場(chǎng)景里性?xún)r(jià)比確實(shí)能打。原廠系統(tǒng)是網(wǎng)心云自己的那套跑量業(yè)務(wù)固件很多人拿到手第一件事就是刷成Armbian把它變成一臺(tái)真正自己能掌控的Linux小主機(jī)。但刷完Armbian之后幾乎所有人都會(huì)撞上同一堵墻系統(tǒng)盤(pán)空間不夠用。OES Plus的板載eMMC通常只有8GB到16GB刷完Armbian系統(tǒng)本身加上基礎(chǔ)軟件包可用空間往往只剩幾個(gè)GB。你想裝Docker、想跑幾個(gè)容器、想放點(diǎn)下載緩存很快就紅了。這時(shí)候機(jī)器上那個(gè)SATA硬盤(pán)位就成了救命稻草——但問(wèn)題在于很多人以為插上SATA硬盤(pán)系統(tǒng)就自動(dòng)用上了實(shí)際上Armbian默認(rèn)并不會(huì)把SATA盤(pán)掛載到系統(tǒng)關(guān)鍵目錄你插上去的盤(pán)只是一個(gè)外掛存儲(chǔ)跟系統(tǒng)擴(kuò)容是兩碼事。這篇內(nèi)容要解決的就是把SATA硬盤(pán)真正變成系統(tǒng)的一部分讓根目錄、Docker數(shù)據(jù)目錄、用戶(hù)目錄這些吃空間的大戶(hù)遷移到SATA盤(pán)上實(shí)現(xiàn)真正意義上的系統(tǒng)擴(kuò)容。適合已經(jīng)刷好Armbian、手上有OES Plus和一塊SATA硬盤(pán)、但被空間問(wèn)題卡住的玩家。我會(huì)把整個(gè)遷移過(guò)程拆開(kāi)講清楚包括分區(qū)方案怎么選、遷移哪些目錄、fstab怎么寫(xiě)、遷移過(guò)程中哪些坑必須避開(kāi)。先說(shuō)一個(gè)核心認(rèn)知系統(tǒng)擴(kuò)容不等于簡(jiǎn)單掛載。掛載只是讓硬盤(pán)能被訪(fǎng)問(wèn)擴(kuò)容是讓系統(tǒng)運(yùn)行時(shí)的讀寫(xiě)真正落到這塊盤(pán)上。這兩者的差別決定了你是多了一塊存儲(chǔ)還是系統(tǒng)真的變大了。2. 遷移前的整體方案設(shè)計(jì)與選型考量2.1 三種擴(kuò)容思路的取舍在動(dòng)手之前得先想清楚用哪種方式擴(kuò)容。我實(shí)際折騰下來(lái)常見(jiàn)的有三條路第一種是整盤(pán)掛載到某個(gè)目錄比如掛到/mnt/sata然后把Docker的data-root指過(guò)去。這種方式最安全系統(tǒng)本身不動(dòng)只是把吃空間的業(yè)務(wù)數(shù)據(jù)挪過(guò)去。缺點(diǎn)是系統(tǒng)根目錄還是那么小apt裝個(gè)大點(diǎn)的包照樣爆。第二種是遷移關(guān)鍵目錄把/var/lib/docker、/home、/opt這些大戶(hù)通過(guò)bind mount或者直接軟鏈接遷到SATA盤(pán)。這種方式兼顧了系統(tǒng)盤(pán)瘦身和業(yè)務(wù)數(shù)據(jù)外移是絕大多數(shù)人的選擇。第三種是直接把根文件系統(tǒng)整個(gè)搬到SATA盤(pán)讓系統(tǒng)從SATA啟動(dòng)。這種方式最徹底但OES Plus的引導(dǎo)鏈對(duì)SATA啟動(dòng)支持并不總是穩(wěn)定而且一旦SATA盤(pán)出問(wèn)題系統(tǒng)直接起不來(lái)風(fēng)險(xiǎn)太高。除非你有明確的整盤(pán)遷移需求否則我不建議新手走這條路。綜合下來(lái)第二種方案是性?xún)r(jià)比最高的風(fēng)險(xiǎn)可控、效果明顯、可回退。下面所有操作都圍繞這個(gè)思路展開(kāi)。2.2 分區(qū)方案怎么定一塊SATA盤(pán)拿到手第一件事是分區(qū)。這里有個(gè)經(jīng)驗(yàn)不要整塊盤(pán)只分一個(gè)區(qū)然后全給數(shù)據(jù)。我建議至少分兩個(gè)區(qū)一個(gè)給Docker和業(yè)務(wù)數(shù)據(jù)一個(gè)留給普通文件存儲(chǔ)。原因是Docker的overlay2層在頻繁讀寫(xiě)時(shí)對(duì)文件系統(tǒng)壓力比較大單獨(dú)分區(qū)能避免它把整個(gè)盤(pán)的文件系統(tǒng)元數(shù)據(jù)搞亂出問(wèn)題也好單獨(dú)處理。具體分區(qū)大小以一塊500G的盤(pán)為例分區(qū)大小用途文件系統(tǒng)/dev/sda1200GDocker數(shù)據(jù)、容器、鏡像ext4/dev/sda2剩余約290G普通文件、下載、備份ext4文件系統(tǒng)選ext4而不是btrfs或者xfs理由很實(shí)際Armbian內(nèi)核對(duì)這些文件系統(tǒng)的支持都OK但ext4在ARM平臺(tái)上的穩(wěn)定性和工具鏈成熟度最好出問(wèn)題用fsck修起來(lái)也最省心。btrfs雖然快照香但在這種小機(jī)器上跑內(nèi)存占用和碎片問(wèn)題反而添亂。提示分區(qū)操作會(huì)清空硬盤(pán)數(shù)據(jù)動(dòng)手前務(wù)必確認(rèn)盤(pán)里沒(méi)有要保留的東西。新盤(pán)無(wú)所謂舊盤(pán)一定要先備份。2.3 遷移哪些目錄最劃算不是所有目錄都值得遷。我列一下實(shí)際遷移收益最高的幾個(gè)/var/lib/dockerDocker的鏡像、容器、卷全在這動(dòng)輒幾十G必遷。/home用戶(hù)數(shù)據(jù)、下載、腳本看使用習(xí)慣建議遷。/opt自己裝的一些第三方軟件可選。/var/log日志一般不大但如果你跑了很多服務(wù)日志也能吃掉幾個(gè)G可選。/swapfile如果開(kāi)了swapswap文件也可以放SATA盤(pán)減少eMMC寫(xiě)入。/usr、/etc、/bin這些系統(tǒng)核心目錄絕對(duì)不要?jiǎng)舆w了必出問(wèn)題。系統(tǒng)盤(pán)保留這些容量壓力其實(shí)不大。3. SATA硬盤(pán)識(shí)別、分區(qū)與格式化實(shí)操3.1 確認(rèn)硬盤(pán)被正確識(shí)別OES Plus的SATA接口是原生SATA不是USB轉(zhuǎn)的所以識(shí)別一般沒(méi)問(wèn)題。插上盤(pán)、通電開(kāi)機(jī)后先確認(rèn)lsblk正常的話(huà)你會(huì)看到類(lèi)似這樣的輸出NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT mmcblk0 179:0 0 14.6G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 14.3G 0 part / sda 8:0 0 465.8G 0 disksda就是你的SATA盤(pán)。如果沒(méi)看到先檢查盤(pán)有沒(méi)有插緊、供電是否正常。OES Plus的SATA供電是板載的一般不用額外接電源但有些大容量機(jī)械盤(pán)啟動(dòng)電流大可能會(huì)識(shí)別不穩(wěn)定這種情況換塊盤(pán)或者用帶獨(dú)立供電的硬盤(pán)盒測(cè)試一下。也可以用dmesg | grep -i sata看內(nèi)核日志確認(rèn)鏈路協(xié)商速率。正常應(yīng)該是SATA link up 6.0 Gbps或者3.0 Gbps。3.2 分區(qū)操作用fdisk或者parted都行我習(xí)慣用parted因?yàn)閷?duì)GPT支持更友好sudo parted /dev/sda進(jìn)入交互后mklabel gpt mkpart primary ext4 0% 40% mkpart primary ext4 40% 100% quit這里40%對(duì)應(yīng)500G盤(pán)的200G左右你可以按自己盤(pán)的大小調(diào)整比例。分完之后sudo partprobe /dev/sda讓內(nèi)核重新讀取分區(qū)表然后lsblk確認(rèn)sda1和sda2都出來(lái)了。3.3 格式化與掛載點(diǎn)準(zhǔn)備格式化sudo mkfs.ext4 -L docker_data /dev/sda1 sudo mkfs.ext4 -L file_store /dev/sda2-L給分區(qū)打標(biāo)簽后面fstab里可以用LABEL來(lái)掛載比用/dev/sda1這種設(shè)備名更穩(wěn)因?yàn)樵O(shè)備名在加盤(pán)或者換接口時(shí)可能變。創(chuàng)建掛載點(diǎn)sudo mkdir -p /mnt/sata/docker sudo mkdir -p /mnt/sata/files先臨時(shí)掛載測(cè)試sudo mount /dev/sda1 /mnt/sata/docker sudo mount /dev/sda2 /mnt/sata/files df -h確認(rèn)容量對(duì)得上讀寫(xiě)正常再往下走。注意格式化前一定用lsblk再確認(rèn)一遍設(shè)備名別把eMMC給格了。我見(jiàn)過(guò)有人手快把mmcblk0當(dāng)sda格了的系統(tǒng)直接沒(méi)了。4. 系統(tǒng)目錄遷移的核心操作與細(xì)節(jié)4.1 Docker數(shù)據(jù)目錄遷移這是收益最大的一步。先停Dockersudo systemctl stop docker sudo systemctl stop docker.socket確認(rèn)Docker真的停了ps aux | grep docker沒(méi)有殘留進(jìn)程后開(kāi)始遷移。用rsync而不是cp因?yàn)閞sync能保留權(quán)限、屬主、時(shí)間戳還能斷點(diǎn)續(xù)傳sudo rsync -avxP /var/lib/docker/ /mnt/sata/docker/-a歸檔模式-x不跨文件系統(tǒng)-P顯示進(jìn)度并支持續(xù)傳。這一步根據(jù)數(shù)據(jù)量可能要幾分鐘到幾十分鐘耐心等。遷移完成后把原目錄改名備份sudo mv /var/lib/docker /var/lib/docker.bak然后創(chuàng)建新的掛載點(diǎn)并掛載sudo mkdir /var/lib/docker sudo mount /dev/sda1 /var/lib/docker這時(shí)候/var/lib/docker里應(yīng)該是空的因?yàn)閽燧d覆蓋了但實(shí)際數(shù)據(jù)在SATA盤(pán)上。驗(yàn)證一下ls /var/lib/docker應(yīng)該能看到overlay2、containers、image這些目錄。啟動(dòng)Dockersudo systemctl start docker sudo systemctl start docker.socket然后docker ps和docker images確認(rèn)容器和鏡像都在。如果一切正常原來(lái)的/var/lib/docker.bak可以保留幾天再刪作為回退保險(xiǎn)。4.2 /home目錄遷移/home遷移邏輯類(lèi)似但要注意如果當(dāng)前有用戶(hù)登錄著直接遷會(huì)出問(wèn)題。最好在root下操作或者確保沒(méi)有普通用戶(hù)會(huì)話(huà)。sudo rsync -avxP /home/ /mnt/sata/files/home/ sudo mv /home /home.bak sudo mkdir /home sudo mount /dev/sda2 /home這里我把/home掛到了sda2文件存儲(chǔ)分區(qū)因?yàn)橛脩?hù)數(shù)據(jù)更適合放這個(gè)區(qū)。你也可以按自己的分區(qū)規(guī)劃調(diào)整。4.3 用fstab固化掛載臨時(shí)掛載重啟就沒(méi)了必須寫(xiě)進(jìn)/etc/fstab。先拿到分區(qū)的UUIDsudo blkid /dev/sda1 sudo blkid /dev/sda2輸出里會(huì)有UUIDxxxx-xxxx復(fù)制下來(lái)。然后編輯fstabsudo nano /etc/fstab在末尾加上UUID你的sda1_UUID /var/lib/docker ext4 defaults,noatime 0 2 UUID你的sda2_UUID /home ext4 defaults,noatime 0 2noatime是個(gè)實(shí)用參數(shù)表示不記錄文件訪(fǎng)問(wèn)時(shí)間能減少大量無(wú)謂的寫(xiě)入對(duì)SATA盤(pán)壽命和性能都有好處。0 2里的2表示開(kāi)機(jī)時(shí)fsck檢查順序非根分區(qū)用2。寫(xiě)完后不要急著重啟先測(cè)試sudo mount -a如果沒(méi)有報(bào)錯(cuò)說(shuō)明fstab寫(xiě)得對(duì)。有報(bào)錯(cuò)就趕緊改別帶著錯(cuò)誤重啟否則可能進(jìn)不了系統(tǒng)。提示改fstab之前先備份一份sudo cp /etc/fstab /etc/fstab.bak萬(wàn)一寫(xiě)錯(cuò)了還能救。4.4 驗(yàn)證遷移結(jié)果重啟一次然后逐項(xiàng)檢查df -h看/var/lib/docker和/home是不是掛在SATA分區(qū)上。docker info | grep Docker Root Dir確認(rèn)Docker根目錄指向正確。systemctl status docker確認(rèn)Docker服務(wù)正常。如果都OK系統(tǒng)擴(kuò)容就算完成了。原來(lái)的/var/lib/docker.bak和/home.bak確認(rèn)沒(méi)問(wèn)題后再刪釋放eMMC空間。5. 常見(jiàn)問(wèn)題排查與避坑經(jīng)驗(yàn)5.1 遷移后Docker起不來(lái)最常見(jiàn)的原因是權(quán)限問(wèn)題。rsync雖然保留了權(quán)限但如果你中途用了cp或者手動(dòng)改過(guò)目錄可能導(dǎo)致/var/lib/docker屬主不對(duì)。Docker要求這個(gè)目錄屬主是root:root權(quán)限710sudo chown -R root:root /var/lib/docker sudo chmod 710 /var/lib/docker另一個(gè)原因是SELinux或者AppArmor不過(guò)Armbian默認(rèn)一般不開(kāi)這些遇到概率低。5.2 fstab寫(xiě)錯(cuò)導(dǎo)致進(jìn)不了系統(tǒng)這是最嚇人的情況。如果fstab里UUID寫(xiě)錯(cuò)或者掛載點(diǎn)不存在開(kāi)機(jī)可能卡在emergency mode。解決辦法如果能進(jìn)emergency shell直接nano /etc/fstab改回來(lái)。如果進(jìn)不去用另一臺(tái)電腦讀卡器掛載eMMC或者用Armbian的U盤(pán)啟動(dòng)盤(pán)進(jìn)救援模式改。實(shí)在不行重刷系統(tǒng)但數(shù)據(jù)在SATA盤(pán)上還在損失可控。預(yù)防措施就是前面說(shuō)的改完fstab先mount -a測(cè)試別直接重啟。5.3 SATA盤(pán)識(shí)別不穩(wěn)定有些機(jī)械盤(pán)在OES Plus上會(huì)出現(xiàn)掉盤(pán)、識(shí)別慢的問(wèn)題。排查思路換一根SATA線(xiàn)試試線(xiàn)材質(zhì)量影響很大??磀mesg里有沒(méi)有l(wèi)ink reset、ata error之類(lèi)的報(bào)錯(cuò)。如果是2.5寸盤(pán)確認(rèn)供電夠3.5寸盤(pán)一般需要獨(dú)立供電OES Plus板載供電可能帶不動(dòng)。試試在Armbian里關(guān)掉SATA的電源管理hdparm -B 255 /dev/sda防止盤(pán)因?yàn)槭‰姴呗孕菝邔?dǎo)致掉盤(pán)。5.4 遷移后空間沒(méi)變化有時(shí)候你遷完了df -h看根目錄還是滿(mǎn)的。原因通常是原目錄沒(méi)刪干凈或者有進(jìn)程還占著被刪除的文件。用sudo du -sh /var/lib/docker.bak sudo lsof | grep deleted找到占用已刪除文件的進(jìn)程重啟對(duì)應(yīng)服務(wù)或者重啟系統(tǒng)釋放。5.5 常見(jiàn)問(wèn)題速查表現(xiàn)象可能原因解決方向Docker啟動(dòng)失敗目錄權(quán)限不對(duì)chown root:root chmod 710開(kāi)機(jī)卡emergencyfstab錯(cuò)誤救援模式改fstabSATA盤(pán)時(shí)有時(shí)無(wú)供電/線(xiàn)材/省電策略換線(xiàn)、關(guān)電源管理根目錄沒(méi)釋放舊目錄未刪或進(jìn)程占用du lsof排查遷移后數(shù)據(jù)丟失rsync未完成就刪源從.bak恢復(fù)6. 幾個(gè)提升穩(wěn)定性的進(jìn)階技巧6.1 給SATA盤(pán)加個(gè)健康監(jiān)控機(jī)械盤(pán)最怕突然壞。裝個(gè)smartmontools定期看SMARTsudo apt install smartmontools sudo smartctl -a /dev/sda重點(diǎn)看Reallocated_Sector_Ct和Current_Pending_Sector這兩個(gè)漲了就說(shuō)明盤(pán)要不行了趕緊備份。6.2 用tmpfs減少eMMC寫(xiě)入系統(tǒng)盤(pán)是eMMC寫(xiě)入壽命有限??梢园岩恍└哳l寫(xiě)入的臨時(shí)目錄掛到內(nèi)存tmpfs /tmp tmpfs defaults,noatime,size256M 0 0 tmpfs /var/log tmpfs defaults,noatime,size128M 0 0不過(guò)/var/log掛tmpfs后重啟日志就沒(méi)了看你怎么取舍。我一般只掛/tmp。6.3 定期備份fstab和關(guān)鍵配置系統(tǒng)配置改多了容易忘。我習(xí)慣把/etc/fstab、/etc/docker/daemon.json這些關(guān)鍵文件定期拷到SATA盤(pán)上sudo cp /etc/fstab /mnt/sata/files/backup/fstab.$(date %F)出問(wèn)題的時(shí)候直接對(duì)照恢復(fù)比回憶改了啥靠譜得多。6.4 關(guān)于飛牛OS和其他系統(tǒng)的兼容性最近不少人問(wèn)OES Plus刷飛牛OS的事。飛牛OS本質(zhì)也是基于Linux的NAS系統(tǒng)擴(kuò)容思路和Armbian是相通的都是把數(shù)據(jù)目錄遷到SATA盤(pán)。區(qū)別在于飛牛OS有自己的存儲(chǔ)管理界面可能不需要手動(dòng)改fstab但底層邏輯一樣。如果你是從Armbian轉(zhuǎn)飛牛SATA盤(pán)上的數(shù)據(jù)一般能保留但Docker數(shù)據(jù)目錄的路徑可能不同遷移前先確認(rèn)新系統(tǒng)的目錄結(jié)構(gòu)。至于統(tǒng)信系統(tǒng)能不能給系統(tǒng)盤(pán)擴(kuò)容那是另一套邏輯統(tǒng)信是桌面級(jí)系統(tǒng)擴(kuò)容方式和服務(wù)器場(chǎng)景差別很大不在這次討論范圍內(nèi)。7. 我實(shí)際折騰下來(lái)的幾點(diǎn)體會(huì)OES Plus這臺(tái)機(jī)器最大的價(jià)值就是那個(gè)SATA位。eMMC那點(diǎn)空間注定只能裝系統(tǒng)真正干活的數(shù)據(jù)必須外移。我前后折騰過(guò)三臺(tái)第一臺(tái)沒(méi)做遷移Docker跑了兩個(gè)容器就滿(mǎn)了天天清日志第二臺(tái)按上面的方案遷了Docker和home穩(wěn)定跑了小半年沒(méi)出過(guò)空間問(wèn)題第三臺(tái)試過(guò)整盤(pán)遷移根文件系統(tǒng)結(jié)果SATA盤(pán)一次意外斷電后系統(tǒng)起不來(lái)又刷回eMMC了。所以我的建議很明確別貪心遷移關(guān)鍵目錄就夠了根文件系統(tǒng)留在eMMC上。eMMC雖然小但勝在穩(wěn)定系統(tǒng)核心不動(dòng)出問(wèn)題也好恢復(fù)。SATA盤(pán)負(fù)責(zé)數(shù)據(jù)壞了換一塊重新掛載就行系統(tǒng)不受影響。還有一點(diǎn)遷移操作最好在系統(tǒng)剛刷好、還沒(méi)裝太多東西的時(shí)候做。這時(shí)候數(shù)據(jù)量小rsync幾分鐘就完事風(fēng)險(xiǎn)也低。等裝了一堆容器再遷數(shù)據(jù)量大、依賴(lài)多出問(wèn)題的概率成倍上升。最后提醒一句任何涉及分區(qū)和fstab的操作動(dòng)手前先備份、先測(cè)試別嫌麻煩。我踩過(guò)的坑希望你別再踩一遍。