老柯修机铺

通讯行老师傅的手机软件笔记——每款 App 装过、用过,才敢写下来

BusyBox長期使用報告,從嵌入式到Android的一個文件工具集

用了BusyBox好幾年,從路由器改固件到手機root後調試,這是一份真實的長期體驗報告,談談這個只有4MB的工具集到底值不值得留在手機裡。

什麼是BusyBox

BusyBox這個名字,老嵌入式圈的朋友應該都不陌生——它把超過三百個常用Unix命令打包成單一可執行文件,體積最小可以做到兩百KB,默認配置也就一點MB出頭。說白了,就是「一個文件裝下/bin裡幾乎所有工具」,省空間、好維護、升級只換一個文件,更多細節可以參考BusyBox官網。

最初設計是給嵌入式系統用的——路由器、IoT設備、OpenWrt這類場景,Flash存儲空間寶貴到每KB都要算。後來被移植到Android上,只要手機root了,裝上BusyBox就能在終端裡跑幾乎所有Linux命令,不用一個一個單獨裝。

我第一次接觸BusyBox是在改路由器固件的時候,那時候為了在LEDE上裝一個自動重啟腳本,發現固件裡已經自帶了busybox二進制——busybox sh就能進shell,busybox crontab就能設定時任務。當時覺得這東西太神奇了,一個文件頂一整套coreutils+util-linux+findutils,後來就順手在手機上也裝了一份,沒想到一用就是好幾年。

安裝

BusyBox在Android上的安裝其實沒什麼難度,但有一個前置條件你得先搞清楚——手機必須root。沒有root權限的話,裝了也跑不起來,Android的安全機制會擋住它訪問系統級的命令。

具體安裝步驟:先從應用商店或者開源社區找一個BusyBox的APK下載(我當時裝的版本包名是stericson.busybox.donate,不過現在也可以從BusyBox下載獲取第三方打包版),下載完直接點安裝就行,APK大小才4MB出頭,一秒鐘裝完。安裝完打開應用,它會自動檢測手機有沒有root,有的話會引導你把busybox二進制部署到/system/xbin/或者/data/local/xbin/,部署完成後會彈一個「Applets列表」——就是它給你安上的那三百多個命令。

首次啟動建議先看一眼Applets列表,確認你常用的命令都在裡面——比如我比較在意nc、wget、httpd這幾個網路工具,有的版本編譯時可能沒開這些功能,列表裡找不到的話就得換另一個編譯配置的版本。

Applets列表,我的手機上BusyBox列出的全部可用命令

當初為什麼裝上它

說實話,剛裝BusyBox的時候我對它的預期還挺模糊的——就是覺得「既然root了,裝個工具集備著」,有點像買了工具箱再補一把萬能扳手的心態。真正讓我開始用起來的原因很簡單:那次我要在一個沒有文件管理器的場景下把手機裡的某個配置文件複製出來,用ES文件瀏覽器操作被權限擋了好幾次,最後打開termux敲了一行busybox cp /data/system/xxx.xml /sdcard/Download/就完事了。

這種「越過GUI直接用命令解決問題」的感覺一旦嘗過就回不去了。之後那段時間我經常在外面跑調試,手機上裝BusyBox慢慢從「備用」變成「主力」——有一次在朋友家路由器壞了,我掏出手机用termux+busybox nc掃了一下路由器的端口,發現80端口沒響應但22端口能進,推測是Web服務進程掛了,遠端重啟了一下httpd就恢復了。那種時刻你會感嘆,這麼小的東西真能解大問題。

越用越順手的地方

最讓我驚喜的是它在Android上的穩定度。我這台手機換過好幾個ROM,從官方MIUI到AOSP衍生的LineageOS,每次重裝系統後第一件事就是裝BusyBox,前後經歷了Android 11到15的五個大版本更新,busybox的兼容性好到沒出現過任何一次啟動失敗——跟某些root工具一更新就報錯的體驗完全兩回事。

第二個讓我用得越來越勤的是它的shell(ash)。跟termux自帶的bash比起來,busybox的ash啟動速度快很多,佔用記憶體也小,在我那台只有4GB RAM的舊手機上,開ash寫腳本的體驗比bash流暢不少。剛開始我也嫌ash太精簡,好多bash腳本跑不起來,但用久了發現真正經常在寫的腳本也就那麼幾個,改成POSIX兼容寫法反而讓腳本更輕量。

第三個是檔案操作效率。手機GUI裡複製/移動一個大文件夾總讓我莫名緊張——界面容易卡、進度條經常失靈。用busybox cp/mv就沒這些問題,命令一敲就跑完,跑完就算完。我甚至用busybox dd做過手機儲存卡的寫入速度測試,比任何第三方基準測試應用都靠譜。

越用越煩的地方

說到這裡好像都是好話,但長期用下來,幾個問題也慢慢暴露出來了。

最大的問題是很多命令的選項被裁得太乾淨。比如busybox的wget不支援遞迴下載(-r),也沒有斷點續傳(-c),我有次想在手機上遞迴抓一個網頁下的所有靜態資源,結果wget只下了首頁就停了,折騰半天最後還是換成了termux裡的完整wget。BusyBox的nc也只支援基本的TCP連接和端口掃描,UDP測試要加額外參數,跟我在路由器上用的版本選項還不一樣——不同編譯配置的差異是BusyBox最大的隱患,你永遠不知道對端機器上的那個busybox到底開了哪些功能。

第二個讓我惱火的是權限和SELinux。Android從8.0開始對SELinux策略越來越嚴格,busybox雖然能跑到root權限,但某些系統目錄的寫入操作還是會被SELinux擋住,需要用chmod 755加restorecon一起搞才行——我有次把一個腳本複製到/system/etc/init.d/下,腳本權限設對了但SELinux上下文沒對,init就是不起來,查了半天才發現是這個問題。

第三個是文檔不足。BusyBox的官方文檔基本只講編譯和部署,每個Applet的具體用法和GNU原版有什麼差異,大多數情況下得自己試,好在社區裡有有心人整理的BusyBox文檔可以參考,不用全靠翻GitHub issue。我有次寫busybox sed替換腳本,GNU sed能用的正則表達式在busybox裡就是報語法錯,最後翻了好幾個論壇才知道busybox的sed用的是POSIX正則而非PCRE。

哪個功能成了每日必用

如果說BusyBox三百多個命令裡讓我離不開的,那絕對是ps + top。

手機上的應用跑多了容易卡,以前我總是去設置裡看後台進程清佔用,那個界面又慢又含糊。現在只需要打開termux敲busybox top,一秒鐘就能看到哪個進程在瘋狂吃CPU、哪個在偷偷掛著沒退出,發現不對就直接busybox kill帶走。這招在我那台舊手機上特別管用,MIUI的後台管理經常把真正卡的進程藏起來,busybox top直接看穿。

還有一個沒那麼頻繁但每次用都救我一命的——tar + gzip。有次我的手機內存卡突然讀不到了,插上電腦顯示文件系統損壞,我就是用busybox tar把整個/data分區備份出來,然後換了一張卡恢復,數據全保住了。那時候如果沒有busybox,termux自帶的tar版本舊得讀不了某些特殊檔案權限,恢復起來得多花好幾小時。

哪個功能再沒碰過

與之相反,httpd這個功能我裝上後一次都沒真正用過。它理論上是一個輕量HTTP服務器,把某個目錄掛到80端口就能通過瀏覽器訪問裡面的文件。聽起來很酷對吧?但實際在手機上跑httpd有太多限制——手機熱點的端口轉發不好搞、移動網路大多數情況下是NAT後面的私網IP、而且手機螢幕小得要命,在瀏覽器裡看手機上的靜態網頁有什麼實際意義?我試過一次,折騰了半小時沒搞定端口映射,後來就再也沒碰了。

長期下來的觀感修正

剛裝上BusyBox的時候我覺得它是「Android上的Linux Swiss Army Knife」——什麼都能幹,全能解決所有問題。用了兩三年後,我的看法變了:它更像是一個精銳工具集合,每個工具都砍了非核心功能,留給你的是最常用的那百分之八十。你不能指望它替代完整的GNU coreutils套件,但它給你的那百分之八十在絕大多數場景下已經足夠。

我之前甚至想過在手機上裝一個完整的Linux發行版(比如Termux+proot跑Ubuntu),後來放棄了——太重,啟動慢,記憶體佔用大,跟手機本身的輕量定位衝突。BusyBox的哲學跟Android手機的使用節奏反而很契合:開得快、跑得起、解決關鍵問題就好,不求完美。

結論:會不會卸載

短答案:不會。

長答案:BusyBox在我的手機上已經變成了一個「存在感很低但離不開」的存在——它安靜地躺在/system/xbin/裡,平時不佔用多少空間也不跑後台,只有當我需要用它的時候才響應。這跟那些動輒幾百MB、天天推送通知、偷跑後台的應用完全兩回事。

但我也能理解有人會卸載它——如果你從不碰termux、不寫腳本、不知道root除了裝主題還能幹嘛,那BusyBox確實一點用都沒有,留著反而浪費那4MB存儲(雖然4MB真的可以忽略)。

什麼情況下我會真的考慮卸載它?大概是手機換成了完全不支援root的版本、或者我對手機的使用退化到「純社交+看影片」這麼簡單的時候吧——顯然這兩件事在可預見的未來都不會發生,所以BusyBox會一直在。

本文为个人基于网络公开资料整理编写,非官方内容,仅供学习交流参考;软件版权归原作者所有,请支持正版;使用过程中遇到问题请查阅官方渠道,本文不承担任何责任。

同类文章