
1. 為什么要在無外掛存儲的Padavan上折騰opkg手里有一臺刷了Padavan的老路由比如K2P、新路由3、小娛C1這類機器USB口要么沒有要么被占著要么插了U盤之后供電不穩(wěn)老掉盤。這種場景下想裝個插件第一反應通常是“沒硬盤裝不了opkg”。其實Padavan本身就是一個精簡的嵌入式Linux系統(tǒng)內核支持tmpfs內存就是現(xiàn)成的“硬盤”。把opkg的安裝目錄掛到tmpfs上插件照樣跑重啟前把關鍵文件備份到閃存里斷電恢復也不是沒辦法。這個思路解決的核心問題是在物理存儲受限的嵌入式設備上利用內存文件系統(tǒng)擴展軟件安裝能力。適合手里有Padavan設備、想裝Entware插件但不想外掛U盤的人也適合想理解嵌入式Linux存儲分層邏輯的玩家。前提是你得接受一個事實——tmpfs里的東西斷電就沒了所以恢復方案是必選項不是可選項。我自己的主力測試機是一臺改了128MB內存的K2P閃存只有16MBUSB口焊盤還在但沒引出來。之前一直用U盤跑Entware后來U盤接觸不良頻繁掉盤才轉向tmpfs方案。實測下來裝幾個輕量級插件完全夠用內存占用可控。2. tmpfs方案的整體設計與選型考量2.1 為什么是tmpfs而不是其他內存文件系統(tǒng)Linux下常見的內存文件系統(tǒng)有ramfs和tmpfs兩種。ramfs不限制大小寫滿內存直接死機tmpfs有大小上限可以掛載時指定超了會報“No space left on device”系統(tǒng)不會崩。Padavan內核默認編譯了tmpfs支持mount -t tmpfs直接可用不需要額外裝模塊。選tmpfs的另一個原因是它支持動態(tài)伸縮。你掛載時給個上限比如32MB實際用多少占多少內存不是一次性吃掉32MB。這對內存緊張的路由器很關鍵。ramfs雖然也能用但風險太高不推薦。還有一個隱藏優(yōu)勢tmpfs支持mode和uid/gid掛載參數可以直接把目錄權限設好省去后面chmod的麻煩。比如mount -t tmpfs -o size32M,mode0755 tmpfs /opt掛完就是755權限opkg安裝時不會因為權限問題報錯。2.2 目錄結構怎么規(guī)劃才不亂Padavan的根文件系統(tǒng)是只讀的squashfs可寫分區(qū)通常只有/etc/storage和/tmp。/tmp本身就是tmpfs但它是系統(tǒng)臨時目錄重啟會清空而且很多進程往里寫東西不適合直接拿來裝opkg。我的做法是新建一個獨立掛載點比如/opt。Padavan默認沒有/opt目錄需要先創(chuàng)建。但根目錄只讀不能直接mkdir /opt。解決辦法是在啟動腳本里先mkdir -p /tmp/opt然后mount --bind或者直接掛tmpfs到/tmp/opt再用軟鏈接指向/opt。不過軟鏈接在opkg安裝時可能出問題更穩(wěn)妥的方式是直接掛載到/opt但需要先解決根目錄只讀的問題。實測可行的方案是在/etc/storage下建一個opt目錄然后啟動時把它掛載為tmpfs。/etc/storage是可寫的JFFS2分區(qū)重啟后文件還在但掛載tmpfs后原內容被覆蓋相當于一個“可寫掛載點”。具體命令mkdir -p /etc/storage/opt mount -t tmpfs -o size32M,mode0755 tmpfs /etc/storage/opt ln -sf /etc/storage/opt /opt這樣/opt就指向了tmpfs空間。軟鏈接對opkg來說透明安裝路徑寫/opt即可。2.3 內存容量與插件體積的平衡K2P改128MB內存后系統(tǒng)跑起來大概占40-50MB剩余70MB左右可用。tmpfs給32MB裝Entware基礎環(huán)境加幾個插件夠用。如果內存只有64MB建議tmpfs不超過16MB只裝最核心的插件。Entware基礎安裝包opkg 核心工具大概占8-12MB具體看版本。裝完之后剩余空間裝插件單個插件通常幾百KB到幾MB。比如curl約1MBwget約500KBopenssl-util約2MB。32MB空間裝5-8個輕量插件沒問題。需要警惕的是日志文件。有些插件默認往/opt/var/log寫日志tmpfs寫滿會導致插件異常。建議把日志目錄軟鏈接到/tmp或者定期清理。3. 手把手實操從零搭建tmpfs版opkg環(huán)境3.1 確認固件版本與內核支持先SSH登錄路由器執(zhí)行uname -a cat /proc/filesystems | grep tmpfs如果輸出里有tmpfs說明內核支持。Padavan大部分版本都支持但個別精簡版可能裁掉了。如果沒有這個方案直接放棄換固件或者外掛存儲。還要確認/etc/storage可寫touch /etc/storage/test rm /etc/storage/test沒報錯就說明可寫。如果報“Read-only file system”需要先在Padavan管理頁面“系統(tǒng)管理-配置管理”里點擊“保存內部存儲到閃存”來激活可寫分區(qū)。3.2 創(chuàng)建掛載點與自動掛載腳本Padavan的啟動腳本放在/etc/storage/started_script.sh這個文件在重啟后會執(zhí)行。如果不存在就新建cat /etc/storage/started_script.sh EOF #!/bin/sh # tmpfs opkg 掛載腳本 mkdir -p /etc/storage/opt mount -t tmpfs -o size32M,mode0755 tmpfs /etc/storage/opt ln -sf /etc/storage/opt /opt # 恢復備份的opkg數據 if [ -f /etc/storage/opt_backup.tar.gz ]; then tar -xzf /etc/storage/opt_backup.tar.gz -C /etc/storage/opt fi EOF chmod x /etc/storage/started_script.sh這段腳本做了三件事建目錄、掛tmpfs、從備份恢復。備份文件放在/etc/storage下重啟后還在解壓到tmpfs里就恢復了之前的安裝狀態(tài)。注意started_script.sh在Padavan啟動流程中的執(zhí)行時機比較早如果此時/etc/storage還沒掛載好腳本會失敗。實測在K2P上沒問題但不同機型可能有差異。保險做法是在腳本開頭加sleep 5等系統(tǒng)穩(wěn)定后再執(zhí)行。3.3 安裝Entware基礎環(huán)境Entware官方提供了一鍵安裝腳本但默認裝到/opt正好符合我們的掛載點。執(zhí)行opkg_install.sh如果提示找不到命令手動下載cd /tmp wget http://bin.entware.net/mipselsf-k3.4/installer/opkg chmod x opkg ./opkg -VPadavan的CPU架構通常是mipsel或arm需要選對源。K2P是MT7621屬于mipsel用mipselsf-k3.4源。新路由3是MT7621同樣。如果是ARM架構的機器比如某些高通方案用armv7sf-k3.2源。安裝完成后/opt/bin/opkg應該存在。把它加入PATHexport PATH/opt/bin:/opt/sbin:$PATH echo export PATH/opt/bin:/opt/sbin:$PATH /etc/profile然后opkg update更新軟件列表。如果報SSL錯誤先裝openssl-util和ca-certificatesopkg install openssl-util ca-certificates3.4 安裝常用插件與空間監(jiān)控基礎環(huán)境好了之后裝幾個常用插件測試opkg install curl wget-ssl htop nano裝完用df -h看tmpfs占用df -h | grep opt輸出類似tmpfs 32.0M 12.3M 19.7M 38% /etc/storage/opt12.3MB是基礎環(huán)境加幾個插件的體積剩余19.7MB還能裝不少東西。監(jiān)控內存使用free -m如果可用內存低于10MB就要考慮減少tmpfs大小或者卸載不用的插件。4. 斷電恢復方案讓tmpfs數據“活”過重啟4.1 備份策略與自動化腳本tmpfs斷電即失所以必須在重啟前把/opt下的關鍵數據打包到/etc/storage。手動備份命令tar -czf /etc/storage/opt_backup.tar.gz -C /etc/storage/opt .但手動備份容易忘最好做成定時任務。Padavan自帶crontab加一條每小時備份echo 0 * * * * tar -czf /etc/storage/opt_backup.tar.gz -C /etc/storage/opt . /etc/storage/cron/crontabs/admin不過每小時備份會頻繁寫閃存JFFS2分區(qū)有擦寫壽命限制。更合理的做法是只在關機或重啟前備份。Padavan的關機腳本放在/etc/storage/shutdown_script.sh可以在這里觸發(fā)備份cat /etc/storage/shutdown_script.sh EOF #!/bin/sh tar -czf /etc/storage/opt_backup.tar.gz -C /etc/storage/opt . sync EOF chmod x /etc/storage/shutdown_script.sh但斷電是突發(fā)的關機腳本不一定執(zhí)行。所以還需要一個“定期備份手動備份”的組合策略。我的做法是每天凌晨3點備份一次平時裝完新插件手動執(zhí)行一次備份。這樣即使斷電最多丟失一天內的變更。4.2 恢復流程與驗證方法重啟后started_script.sh會自動解壓備份到tmpfs。驗證恢復是否成功ls /opt/bin/opkg /opt/bin/opkg list-installed | head如果opkg存在且能列出已安裝包說明恢復成功。如果失敗檢查備份文件是否存在ls -lh /etc/storage/opt_backup.tar.gz手動恢復tar -xzf /etc/storage/opt_backup.tar.gz -C /etc/storage/opt注意備份文件本身也占/etc/storage空間。如果閃存剩余空間不足備份會失敗。K2P的16MB閃存/etc/storage可用空間通常只有幾MB備份文件要控制在3MB以內。如果超過考慮只備份/opt/etc和/opt/lib等關鍵目錄不備份二進制文件重啟后重新opkg install。4.3 閃存壽命與備份頻率的權衡JFFS2的擦寫壽命一般在10萬次左右但實際受寫入放大影響可能更低。每天備份一次一年365次對閃存壓力不大。但如果每小時備份一年8760次加上其他寫入閃存可能提前報廢。我的建議是只在插件變更后備份不做定時備份。裝完插件、改完配置手動執(zhí)行一次備份腳本。這樣備份次數最少閃存壽命最長。代價是斷電后可能丟失最后一次變更但插件配置通常不頻繁改可以接受。如果實在擔心斷電可以加一個“檢測到電源異常時立即備份”的機制但Padavan沒有UPS支持實現(xiàn)難度大。折中方案是每天備份一次時間選在凌晨低峰期。5. 常見問題與排查技巧實錄5.1 opkg安裝報“No space left on device”這是tmpfs空間不足。先df -h確認占用然后清理opkg clean rm -rf /opt/var/log/* rm -rf /opt/tmp/*如果還是不夠卸載不用的插件opkg remove 插件名或者擴大tmpfs。但擴大tmpfs會占用更多內存可能導致系統(tǒng)OOM。K2P 128MB內存下tmpfs最大不要超過48MB。5.2 重啟后opkg命令找不到檢查/opt軟鏈接是否失效ls -l /opt如果顯示/opt - /etc/storage/opt但目錄不存在說明掛載腳本沒執(zhí)行。手動執(zhí)行mkdir -p /etc/storage/opt mount -t tmpfs -o size32M,mode0755 tmpfs /etc/storage/opt然后檢查started_script.sh是否有執(zhí)行權限以及Padavan是否啟用了自定義腳本。在管理頁面“系統(tǒng)管理-腳本”里確認“啟動后執(zhí)行”已開啟。5.3 插件運行時報“Segmentation fault”通常是架構不匹配。Padavan的CPU架構和Entware源必須對應。用uname -m查看架構mips→ 用mipselsf-k3.4源armv7l→ 用armv7sf-k3.2源aarch64→ 用aarch64-k3.10源如果源選錯卸載重裝opkg remove 插件名 sed -i s/舊源地址/新源地址/g /opt/etc/opkg.conf opkg update opkg install 插件名5.4 內存占用過高導致系統(tǒng)卡頓tmpfs用的是內存裝太多插件會擠占系統(tǒng)內存。用free -m監(jiān)控如果可用內存低于15MB就要精簡。優(yōu)先卸載體積大且不常用的插件比如python3約20MB、node約30MB。輕量插件如curl、wget、nano可以保留。還可以調整tmpfs大小把上限從32MB降到16MB強制限制占用。但降太小會導致安裝失敗需要根據實際插件體積調整。5.5 備份文件損壞導致恢復失敗備份時如果斷電tar包可能不完整?;謴颓跋闰炞Ctar -tzf /etc/storage/opt_backup.tar.gz /dev/null echo OK || echo FAIL如果FAIL刪除損壞備份重新安裝插件。為了避免這種情況備份時先寫到臨時文件再原子替換tar -czf /tmp/opt_backup.tar.gz -C /etc/storage/opt . mv /tmp/opt_backup.tar.gz /etc/storage/opt_backup.tar.gz這樣即使備份過程中斷電原備份文件不受影響。6. 進階技巧讓tmpfs方案更穩(wěn)的幾個細節(jié)6.1 用zram壓縮內存變相擴大tmpfs如果內存實在緊張可以啟用zram。zram把一部分內存壓縮后當塊設備用再在上面建tmpfs相當于用CPU換空間。Padavan內核可能沒編譯zram模塊需要先確認modprobe zram ls /dev/zram*如果有/dev/zram0就可以echo 32M /sys/block/zram0/disksize mke2fs -t ext4 /dev/zram0 mount /dev/zram0 /etc/storage/opt這樣32MB的zram實際可能只占16MB物理內存因為壓縮率通常2:1左右。但CPU占用會上升MT7621的性能足夠影響不大。6.2 把日志和緩存重定向到/tmp/tmp本身就是tmpfs而且系統(tǒng)會自動清理。把opkg的日志和緩存目錄軟鏈接到/tmp可以節(jié)省/opt空間mkdir -p /tmp/opt_log /tmp/opt_cache ln -sf /tmp/opt_log /opt/var/log ln -sf /tmp/opt_cache /opt/var/cache這樣日志和緩存不占/opt的tmpfs空間重啟自動清空不用手動清理。6.3 用opkg的--dest參數安裝到其他位置如果/opt空間不夠可以把部分插件裝到/tmp下的另一個tmpfs。比如mkdir -p /tmp/opt2 mount -t tmpfs -o size16M tmpfs /tmp/opt2 opkg install --dest /tmp/opt2 插件名但這樣插件的可執(zhí)行文件不在PATH里需要手動加export PATH/tmp/opt2/bin:/tmp/opt2/sbin:$PATH而且重啟后/tmp/opt2消失需要重新安裝。適合臨時測試插件不適合長期使用。6.4 監(jiān)控tmpfs使用率并自動告警寫一個簡單的監(jiān)控腳本每小時檢查一次超過80%就寫日志#!/bin/sh usage$(df -h /etc/storage/opt | awk NR2 {print $5} | tr -d %) if [ $usage -gt 80 ]; then logger -t tmpfs_monitor tmpfs usage: ${usage}% fi加到crontab里echo 0 * * * * /etc/storage/tmpfs_monitor.sh /etc/storage/cron/crontabs/admin這樣能提前發(fā)現(xiàn)空間不足避免插件突然掛掉。7. 個人實操體會與幾個不推薦的做法這套方案我用了大半年K2P上跑著curl、wget、htop、nano和一個小型HTTP服務內存占用穩(wěn)定在20MB左右系統(tǒng)負載正常。最久一次連續(xù)運行47天沒重啟tmpfs沒出過問題。唯一一次故障是裝了一個Python插件內存直接爆了系統(tǒng)卡死只能斷電重啟。從那以后我就定了個規(guī)矩tmpfs方案只裝C語言寫的輕量插件不碰Python、Node這類運行時。不推薦的做法有幾個。一是把tmpfs掛到/tmp下因為/tmp會被系統(tǒng)清理插件可能突然消失。二是備份文件放/tmp重啟就沒了等于沒備份。三是用ramfs代替tmpfs風險太高寫滿直接死機。四是頻繁定時備份閃存壽命扛不住。如果閃存空間夠其實更推薦把Entware裝到/etc/storage下不用tmpfs重啟后數據還在省去備份恢復的麻煩。但/etc/storage空間通常只有幾MB裝不下完整Entware。所以tmpfs方案是空間和便利性之間的折中。最后分享一個小技巧裝完插件后用opkg list-installed /etc/storage/opkg_list.txt把已安裝列表存到閃存里。萬一tmpfs數據丟了照著列表重新opkg install就行不用一個個回憶裝了什么。這個列表文件很小幾KB不占空間但恢復時能省不少事。