樹莓派擴大boot分區,真的是boot不是root

最近用樹莓派在做一套天文操作系統,其中有一塊需求是需要把拍攝的天文數據放在FAT32分區中,方便Windows系統讀取。起初的做法是把在主分區後面擴出一塊FAT分區,這種方法用了一段時間都很正常,直到遇見了Win7操作系統。
在Win7操作系統中,如果一張SD卡分了N個區,如果前面有一塊是Ext或其他格式的分區,那後面的所有FAT分區都無法識別。這就尷尬了……

所以想到了能否通過擴展boot分區的方式解決問題,因爲boot分區在第一個位置,而且把SD卡插入Win7後也能識別出boot(但沒辦法識別後面的主分區)。
在網上搜了很多帖子,基本上都是boot和root分不清,清一色的都是擴展根分區的,到目前爲止(2019年9月16日),沒有一個帖子是解決擴展boot分區問題的,所以如果你近期看到了這個帖子,應該就是網上唯一一個擴展boot分區的帖子。

思路:
1. 把原來的根分區挪到SD卡最後嘛
2. 把boot引導指向修改到移動的位置
3. 擴展中間一段爲boot分區

爲了保證鏡像文件足夠小,我們的操作系統是在4GSD卡中做的,但最終使用的時候要放到32G或更大的SD卡中,系統會自動擴展空間,這是前提。如果你已經把系統燒到目標SD卡中,raspbian在第一次啓動的時候會自動把剩餘空間擴展到主分區中,也就是/mmcblk0p2,所以想擴展boot首先要縮減/mmcblk0p2的大小,這種操作度娘有很多,這裏不講了。


以我4G做的系統燒到128G爲例,系統啓動後發現主分區(/mmcblk0p2)大小是3.4G,後面還有100多G沒有用。
所以我們具體計劃如下:
1. 備份boot分區
    1. 修改/etc/fstab分區綁定
    2. 修改/boot/cmdline.txt主分區指向
    3. 將boot分區備份到主分區的一個文件中
2. 複製mmcblk0p2分區
    1. 在SD卡末尾創建一個mmcblk0p3分區,大小和mmcblk0p2相同
    2. 把mmcblk0p2分區內容複製到mmcblk0p3
3. 擴展boot分區
    1. 刪除原來mmcblk0p1和mmcblk0p2分區
    2. 從mmcblk0p1起始位置(8192)創建分區,大小爲剩餘空間大小
    3. 設置mmcblk0p1分區類型爲c
    4. 格式化mmcblk0p1分區
    5. 把備份的boot分區內容複製回mmcblk0p1中
4. 收尾

1. 備份boot分區
樹莓派BootLoader啓動後會到第一個分區(8192起始位置)尋找啓動文件對linux進行啓動,所以boot分區的起始位置不能變,但裏面的內容存放位置無所謂,只要保證有那些文件就行了,其中有兩個文件比較重要,/etc/fstab和/boot/cmdline.txt,這兩個文件現在修改和事後修改都一樣,只要保證內容就行了。

/etc/fstab,好像是分區加載表一類的東西,裏面需要修改PARTUUID=d95d41c7-02爲PARTUUID=d95d41c7-03,因爲我們要把mmcblk0p2的內容移到mmcblk0p3中,中間mmcblk0p2就沒有了(有強迫症的自行在解決),如果不修改這行,會導致重啓的時候報兩個失敗:
1. Failed to start dphys-swapfile mnt/unmount,and delete a swapfile. See'systemctl status dphys-swapfile. service' for details.
2. Failed to start Hostname Service.See ' systemctl status systemd-hostnamed.service' for details.

這兩個失敗會導致主分區的內容無法修改,具體原因沒有深究,各位有精力的大神可以科普一下。
d95d41c7-03這個編號不知道是不是每張SD卡都不一樣,總之就是吧後面的02改成03吧。

/boot/cmdline.txt,這是啓動完boot後用於加載主分區的,同樣吧PARTUUID=d95d41c7-02爲PARTUUID=d95d41c7-03,不修改的話啓動失敗,找不到主分區。

修改完這兩個文件後開始對boot進行備份,因爲內容與位置無關,所以我們直接用cp命令把boot內容備份到一個文件就行了
# sudo cp /boot ~/boot -Rf

2. 複製mmcblk0p2分區
首先我們用fdisk命令查看一下現在的分區
# sudo fdisk /dev/mmcblk0

進入後輸入p<回車>,記住兩個數,上面紅框中是SD卡的總大小,下面紅框是主分區現在的大小,因爲我們要在SD卡最後面創建一個同樣的小的分區mmcblk0p3,所以用128043712512-7203840=242881536‬,這個得數就是我們要創建的mmcblk0p3的大小。按一下命令操作
n<回車>
p<回車>
3<回車>
242881536<回車>
<回車>

這時候在用p<回車>命令查看,就可以看到在末尾有個同樣大小的分區了,記得輸入w<回車>保存分區表,q<回車>退出命令即可

接下來就是複製分區,我們用dd命令操作
# sudo dd if=/dev/mmcblk0p2 of=/dev/mmcblk0p3
這個命令時間較長,我三星128G的卡大概持續了七分半,有可能更慢,耐心等待。
這裏需要重啓一次,重啓前保證第一部中兩個文件已經修改完畢了。

3. 擴展boot分區
重啓後再次進入分區管理
# sudo umount /boot
首先卸載boot分區
# sudo fdisk /dev/mmcblk0
把第一和第二分區都刪除了
d<回車>
1<回車>
d<回車>
2<回車>

然後重新創建第一分區:
n<回車>
p<回車>
1<回車>
8192<回車>
<回車>

創建完畢後用p命令查看,已經把第一分區擴大出來了,大小爲115.8G

這裏需要注意一下,8192這個數字應該是raspbian默認的位置,具體還需要在刪除mmcblk0p1之前查看Start位置指向的是什麼,跟這個一致就可以了。
輸入t<回車>選擇第一分區,將第一分區類型設置爲c,這時候再看分區類型已經轉換爲FAT32格式

輸入w<回車>保存分區並退出
# sudo mkfs.vfat /dev/mmcblk0p1
# sudo mount /dev/mmcblk0p1 /boot
# sudo cp ~/boot/* /boot

4.收尾
把~/boot刪了,屁股擦乾淨

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章