先說明這篇不是教學文. 坦白說, 為了增加 1GB 空間要搞這麼複雜, 真的有點無聊, 純粹是為了研究而已. 但如果你覺得內部儲存空間比外加記憶卡方便些, 又有工程技術底及實驗精神, 可以繼續看下去. 此外, 這作法並不限 D838, LG 其他機種甚至其他廠牌, 都有機會試試.
背景
以前就注意到 D838 浪費了不少空間在 system partition 內, 該 partition 固定為 3.25 GB, 但 LG Kitkat 10f 韌體的 system 內容物只有約 2.1GB, 這回推出 Lollipop 20c 韌體, 經分析其 system 內容竟又再縮減了 400MB, 也就是說 system partition 浪費了約 1.4 ~ 1.5 GB. 這兩天有空升級 20c 時, 發現一些不穩定現象, 覺得既然要備份資料並重置手機, 乾脆 repartition 以便將 system partition 挪出 1GB 給 data partition, 這樣手機裡的 internal sdcard 自然就多了 1GB 可用了.
過程
首先, 我以保留 CWM recovery 的方式升級到 Lollipop 20c 韌體, 接著備份好自己 internal sdcard 的資料, 並將 internal sdcard 清出至少 3GB 以上空間, 供後面操作的暫存用途. 然後進入 CWM recovery, 在 PC 上以 adb shell 連上手機, 於 shell 中執行以下命令檢視 partition 狀況:
parted /dev/block/mmcblk0 此命令係針對 mmcblk0 進入 parted 執行後續操作
unit s 此命令係在 parted 中選定顯示的大小以 sector (512 bytes) 為單位
print all 此命令係在 parted 中列出目前所有的 partitions 狀況.
quit 此命令離開 parted, 回到 shell
可以看到如下圖的資料, 其中每筆資料分別是 partition 編號, 起始 sector, 結束 sector, 以 sector 為單位的 partition 大小, partition 類型, 最後是 partition 名稱.
![[經驗談]為可憐的16GB G Pro2 (D838)擠出額外的1GB內部儲存空間](http://attach.mobile01.com/attach/201502/mobile01-699ed553ccd4ab582f69c9188bd199df.png)
以我的 D838 來看, 我有興趣的是編號 34 到 39 的 partition, 目標是將 34 system 縮減 1GB ( 也就是 2097152s ), 將 35 到 38 往前移位, 然後把 39 userdata (對應為系統的 /data) 往前移位並加大 1GB.
接著必須先備份編號 34 和 36 ~ 38 等 partition 內容 (35 cache 不需備份, 反正系統是要重置的). 其中 34 system 最方便的備份方法是在手機端以 CWM 裡面的 custom backup 選擇僅備份 system 即可. 至於 36 到 38 的備份, 必須先在手機 CWM 上確認 data 已 mount, 然後在 PC adb shell 上執行 dd 命令以備份在 /data 上的任何位置, 命令如我的下圖所示 (注意: dd 命令有 if= 和 of= 兩參數, 畫面上有些可能被拆成兩行, 但實際上是一個命令寫過去, 不換行).
![[經驗談]為可憐的16GB G Pro2 (D838)擠出額外的1GB內部儲存空間](http://attach.mobile01.com/attach/201502/mobile01-b859951e9bd79aef1097669fd5ee6b85.png)
再來開始最危險的 repartition 動作, 由於剛才的備份動作都是將資料備份在 /data 也就是 userdata partition 中, 所以必須將 repartition 分兩次進行, 首先 repartition 編號 34 到 38, 重新 reboot recovery, 還原或格式化 34 到 38, 再針對 userdata 作 repartition 並 reboot recovery 及格式化.
這裡先說明一下 repartition 所需要的命令, 這些命令是在 parted 中進行, 進入 parted 要指定裝置, 所以命令與前面相同, 並且每次都先執行變更單位的 unit 命令:
parted /dev/block/mmcblk0
unit s
以編號 34 system 為例, 執行以下命令
rm 34 此命令刪除編號 34 的 partition
mkpartfs 此命令以交談式的方式建立一個 partition, 會詢問名稱, 種類 (回答 ext2 沒關係), 起始以及結束位置
name 34 system 此命令是將該 partition 命名
我使用的 CWM 內附的 parted 有瑕疵, mkpartfs 不接受正常參數在命令列, 只好以交談式回答之, 且輸入名稱無用, 故後面必須再下 name 命名, 此外種類不接受 ext4, 只能先輸入 ext2, 再於 CWM 上格式化自然就變成 ext4. 另外對於以 dd 方式備份的 36 到 38, 可以使用 mkpart 取代 mkpartfs, 但我使用的 parted 仍然會詢問 ext2 的問題, 不過並未作用.
大致上的 repartition 及還原過程是:
1. 先將 34 到 38 依序 repartition, 其中 34 system 的起點 start 不動, 終點則減 2097152s, 其他 35 到 38 則起點和終點都減去 2097152s.
2. reboot recovery 以便重新載入 partition 資訊.
3. 在 CWM 端格式化 system 和 cache, 並以 custom restore 選單來回復先前備份的 system nandroid backup.
4. 確認 /data 為 mounted 狀態, 然後在 PC 以 adb shell 下 dd 命令還原 36 到 38 的資料. 以 cust partition 為例, 命令是 "dd if=cust of=/dev/block/platform/msm_sdcc.1/by-name/cust"
5. Repartition 39 userdata partition, 其中起點減 2097152s, 終點則不動.
6. reboot recovery 以便重新載入 partition 資訊.
7. 在 CWM 端格式化 /data.
8. 到此也等同於重置過手機, 重開機開始恢復正軌.
可以收工開始享受多了很微小 1GB 容量的手機了, 以我的 D838 16 GB 為例, 內部儲存空間由 9.8 GB 變成 10.8 GB.
![[經驗談]為可憐的16GB G Pro2 (D838)擠出額外的1GB內部儲存空間](http://attach.mobile01.com/attach/201502/mobile01-97f892f90ac0e3f4b77b686e8c515dbd.png)
後記
1. 這樣處理完, 還能不能重燒 KDZ 或 TOT 回復? 我 "猜測" "有可能" 可以, 每個 KDZ 和 TOT 都內附 partition table, 如果整個燒錄 KDZ 或 TOT 的動作是連 partition table 一起重燒就 OK.
2. 現在 system partition 只剩下 2.2 GB 左右, 以後會不會不夠? 有可能不夠, 但似乎機會不大, 目前的 KK 10f 或 Lollipop 20c 都夠, 尤其 20c 還有 500MB 以上空間, 未來的 5.x 升級, 要塞爆似乎機會不大.
3. 未來升級怎麼辦, 官方 KDZ 取出的 system.img 都是 3.x GB ?! 答案是... 找一台 Linux 系統, 把 system.img 利用 resize2fs 縮小 1GB 即可.
新增
4. 若還想要額外的 data 空間, 有沒有機會? 可以參考我在 #4 樓的想法, 由 cache partition 下手.