201503230130古董Android手機如何透過在SD卡增加SWAP提昇可用性

透過設定SWAP(如同Windows的pagefile),讓記憶體不足的老手機也能回春。此處以ㄇㄒㄈ Desire S為例,主要針對以Swapper for root或其他app設定SWAP卻無法運作的情況、透過在 init.d 掛載script的方式運作SWAP。

因所有操作幾乎透過終端機指令(CLI)進行、包含後日後可能進行的空間調整,若不習於CLI操作、請迴避此篇。

系統在SD卡掛載SWAP的狀態下、如同使用Link2SD,SD卡必須設定為MTP模式與其他裝置連線;否則以USB大容量儲存裝置連線,將會中斷SD卡與手機連結、而導致手機系統運作錯誤。此外高速SD卡也是必須的、建議Class 10以上,否則可能因IO瓶頸導致效能低落甚至運作錯誤。

先介紹先以SWAP檔案運作SWAP、同時可以此方式先確認系統是否支援SWAP、以及是否換用高速SD卡。

首先手機當然得root,接著由Google Play Store安裝Busybox(免費版預設條件安裝於/system/xbin/即可,若修改安裝位置則 init.d 運作極可能失效)、Android終端機(如Terminal Emulator for Android),以及安裝檔案瀏覽/編輯/權限設定工具、推薦TotalCommander

接著請參考此教學SU(root)身份操作模擬終端機,輸入以下指令在SD card上建立SWAP檔。

dd if=/dev/zero of=/mnt/sdcard/swapfile bs=1048576 count=X

count=X的X為所需SWAP檔的大小、單位為MB(小於或等於4096)。指令執行後、可至SD卡跟目錄察看是否存在名為swapfile的檔案。

接著在終端機輸入以下指令啟用SWAP

mkswap /mnt/sdcard/swapfile

swapon /mnt/sdcard/swapfile

指令執行後、請以另一指令 free -m 確認 SWAP 的運作情況,若查詢結果 SWAP total > 0且趨近於swapfile檔大小,表示SWAP成功運作(設定範例為2048MB實際可用2046MB、見圖)假若為0、表示無法啟用SWAP,很遺憾、可能所刷ROM的kernel不支援SWAP功能。換刷個版本、或者放棄......如果能自行cmplie kernel支援SWAP功能應該也不會來看這篇了。


可接著設定以Linux swap分割區運作SWAP、或直接將以上指令寫入 init.d script 執行(只需mkswapswapon兩項)。

init.d 設置請參造後述的SWAP分割區 init.d script 設置、修改相關參數。

接著介紹如何以專屬Linux swap割區運作SWAP。

透過此方式可建立超過4GB的SWAP(不過一般而言Android SWAP應當不會搞到這麼大......)、跨越Swapper for root以及上述SWAP檔在FAT32分割區單檔4GB的限制。

缺點則是一開始就得劃定專用的分割區無法隨意調整容量,即便透過指令調低可用SWAP、剩餘的空間依然無法做為其他用途。

接著進行SWAP分割區設定,參考來源請見XDA的教學,首先針對SD卡進行分割操作。最重要的、請先備份SD卡資料!!因得重新配置SD卡分割區(任何磁碟操作前備份都是必要的)。

一般常透過Windows以Minitools Partition Wizard Free進行,可在手機進入具有支援SD卡USB大容量儲存裝置的Recovery模式中與Windows連線操作。不懂操作的請速迴避、或以SWAP檔方式運行SWAP實際操作上、採用GParted相對能搾出更多空間、能對Linux相關分割區更直接的操作,尤其若日後要動態調整Linux相關分割。但需VM掛載Live CD image操作或者重開機以Live CD執行,FAT32分割區容量調整後也可能發生成為RAW格式的情況需在Windows重新格式化

假設已經完成SD Card的分割作業,依序分別為FAT32 / EXT4(若使用Link2SD之類的儲存容量擴增工具)/SWAP三個分割。

接著以SU(root)身份操作模擬終端機、或者透過adb shell,以指令 fdisk -l /dev/block/mmcblk* 列出所有儲存裝置的分割配置。

由清單當中、找出Id為82、System為 Linux swap 的裝置,記下它的名稱(提示:列出的資訊不少,但只要分割操作正確、SD卡上一定有FAT32分割區,只要找到「Win95 FAT32」就是SD卡的訊息區塊,下面也會有Linux swap)。以本人的Desires S在此次的操作為例,查出SWAP是在/dev/block/mmcblk1p3

將此值分別套入指令 mkswap swapon 依序執行

mkswap /dev/block/mmcblk1p3

swapon /dev/block/mmcblk1p3

接著透過指令 free -m 查看 swap total值是否 >0、略小於分割空間。若是、那麼裝置設定參數無誤。

最後init.d script的配置作業。

init.d 的運作相關資訊請見此XDA教學、或者安裝Play Store上的Universal init.d

SWAP測試完成後、參考另一XDA的教學所提供的script範例00userinit.txt(稍後掛載在init.d的必須不含副檔名txt),將正確參數的00userinit檔(當中所有的裝置路徑、如分割區mmcblk_p_或檔案swapfile指定都要正確一致!)置入手機的/system/etc/init.d/路徑中、權限設定為rwxr-xr-x(755)。

以檔案運作SWAP的 init.d script 可參考範例script 00userinit.txt、將其中的 /dev/block/mmcblk_p_ 以 /mnt/sdcard/swapfile 替換。但由於SD card FAT32開機掛載延遲可能導致swapfile掛載失敗,可在script內先執行 sleep s 指令延遲執行s為延遲秒數請自行按情況調整。

請注意其中的 echo 60 > /proc/sys/vm/swappiness 的swapiness,範圍由0至100、範例預設是60。swapiness值愈高、系統對於SWAP的依賴愈重,若SD卡效能欠佳、可能因過度運用SWAP反而導致效能低落甚至異常。請依實際使用情況調整、或者設置為20。

假若以Windows記事本編輯、因無法儲存為Linux可接受的script格式,建議透過Notepad++編輯、或者直接將網站上的00userinit直接下載至手機編輯(記得移除副檔名txt)。

另XDA的範本開頭缺少「#!/system/bin/sh」,請自行補上,否則即便檔案格式正確、執行也會發生No such file or directory錯誤。若系統已存在00userinit、可嘗試將此SWAP script檔名的00改為01或其他不重複數字。

完成所有動作後,因前面測試已先開啟SWAP、可先以指令 swapoff 關閉SWAP(指令格式同swapon、差別在於on改為off)。free指令若顯示SWAP total為0表示SWAP關閉。接著透過指令 run-parts /system/etc/init.d/free 查詢SWAP狀態、測試 init.d 中的script是否能正確執行。init.d 測試無誤後、重開手機即可。

 

照舊提供本人正常運作SWAP分割區的script當作範例、可由此下載(00userinit已改名為00swapinit)。

隨件的term-init.sh為啟動init.d用、勿一併置入/system/etc/init.d/。

 

後記:前述提到使用GParted會導致FAT分割區(FAT32/FAT16)成為RAW格式的情況,請注意以下操作--請勿針對FAT分割區進行複製作業(CLONE-Copy&Paste);請勿對FAT分割區使用GParted的分割區檢查(CHECK)功能請勿對FAT分割區使用GParted的分割區調整(RESIZE / MOVE)功能,尤其對於容量256MB以下的分割區調整、或者將FAT分割區調整至256M以下,會導致作業失敗而中斷總之、若要避免FAT分割區成為RAW格式、則GParted對於FAT分割區的操作限於建立與設定啟動(Manage Flags -> Boot)。對於成為RAW格式而無法以Windows檢視磁碟內容的FAT分割區,可透過GParted本身的終端機mount分割區、以cp將資料複製至其他可用分割區(注意特殊字元檔名可能導致的操作錯誤),再重新格式化該分割區。容量調整至256MB以下導致作業失敗、無法繼續以GParted操作的FAT分割區、請透過其他磁碟管理工具調整或刪除。

另若打算賦予SWAP分割區標籤(label),在已安裝busybox的情況下、可將上述的mkswap指令改為"busybox mkswap -L label_name /swap_partition"。label_name為所欲賦予的標籤名稱、/swap_partiton為SWAP分割區。

此外若也欲賦予SD-EXT分割區名稱、因android欠缺e2label、也可透過終端機模式以tune2fs指令完成,指令為"tune2fs -L label_name /ext_partition"。類似於賦予SWAP分割區標籤、label_name為所欲賦予的標籤名稱、/ext_partition為EXT2/3/4格式的SD-EXT分割區。

欲檢視分割區標籤、也可透過終端機模式以指令"blkid"查詢。

回應
    沒有新回應!
關鍵字





Powered by Xuite