openwrt_21.02_img_空間擴容_分區擴容_改分區表大小


openwrt_21.02_img_空間擴容_分區擴容_改分區表大小

轉載注明來源: 本文鏈接 來自osnosn的博客,寫於 2021-11-08.

其他文章

環境

  • 擴容的操作是在命令行下的
  • 這是在 unraid 6.9 的終端內操作的,用到的命令 unraid 系統中都有,無需額外安裝。
  • 理論上,在Linux的終端下,比如 debian,centos,應該是一樣的。
    • qemu-img 命令: debain 裝 apt install qemu-utils, centos8 裝 yum install qemu-img
  • 擴容后的 img 就可以在 unraid 中創建虛擬機。啟動它了。
  • 以下測試成功了四個 img 映像文件。
    • 兩個是 MBR 分區格式的。unraid 創建虛擬機時,BIOS:SeaBIOS
    • 兩個是 GPT 分區格式的。並且在unraid 中 以 UEFI 方式成功啟動。
      unraid 中要用 uefi 啟動,創建虛擬機時,BIOS:要選擇OVMFOVMF TPM
  • 如果要對硬盤,或者sd卡上的openwrt擴容,此文也有參考價值。
    • 先把 img 寫入磁盤,然后掛在Linux系統下,從修改分區表開始做。

虛擬機中安裝openwrt的步驟

  • 去官網下載 x86-64 的 xxxx.img.gz 的映像壓縮包。
  • 解壓開來,變成 xxxx.img 映像文件。
  • copy到 unraid 中,或者別的什么Linux 系統中,進行擴容。
  • 把擴容之后的 img 文件,copy 到你的虛擬機系統,比如 unraid 中,用它創建 openwrt的虛擬機。
  • 然后啟動它,配置它,使用它。

擴容 openwrt-21.02.1-x86-64-generic-ext4-combined-efi.img

----擴容開始----
qemu-img resize xxxxxxxx.img 200M #擴容映像本身, 根據你自己的需要,確定擴容的大小
losetup -f xxx.img #掛載到 loop 設備。losetup -Pf xxx.img 會順便讀取分區信息,加載到系統。
losetup -a #查看掛在哪個 loop 設備上了,我這是 loop4
partx -a /dev/loop4 #讀取分區信息,加載到系統
使用 fdisk 或 parted 都可以。我分別測試過,都能成功啟動,擴容結果一樣。parted做法見下文【其他嘗試-parted 命令】。
fdisk /dev/loop4 #分區擴容,顯示這個映像是gpt格式的
m 顯示fdisk的命令幫助,任何時候都可以用 m看看幫助
x 進入高級菜單
p 列出分區表, 看看分區2的 Start, Name, Type-UUID, UUID, 抄下 Name。通常 Name是空值。
r 返回基本菜單
p 列出分區表, 看看分區Type, 大小
i 2 顯示分區2的信息 抄下 Start, Type, UUID, 馬上會用到。"Type-UUID"不用抄,沒用。
    (擴 ext4-combined.img,UUID不用抄,因為fdisk看不到,也不用改。見下文)
---下面開始改分區表---
d 2 刪除分區2
n 2 創建分區2

  • 開始扇區,抄原來的分區2的 Start, 一定要一樣
  • 結束扇區,默認 或者自己定義大小,但要比原來的大
  • 有個警告,已經有文件系統,是否清除它的簽名/標記, 選"否","No"

t 2 修改分區2的類型

  • 11 改類型為11 (Microsoft basic data),我的是11。這個根據你自己的情況,改回原來的 Type
       op23的官方版,類型為20 (Linux filesystem), 默認就是,不用改了。
  • L查看所有可選擇的類型。
  • q不改類型。

x 進入高級菜單
u 修改分區2的UUID,抄原來的分區2,不改回,啟動失敗; 或者修改分區1中boot/grub/grub.cfg中的PARTUUID
n 修改分區2的Name,原來的分區2沒Name。這項可以跳過。
r 返回基本菜單, 才能寫盤保存
w 保存
這個時候,有個警告,但又顯示寫成功了。不理它。
----分區表修改完成---
partx -u /dev/loop4 #更新系統中的分區信息,一定要更新,否則后面擴容會失敗
e2fsck /dev/loop4p2 #檢查ext4 文件系統, 帶上-f參數更省事
resize2fs /dev/loop4p2 #ext4 文件系統擴容
partx -d /dev/loop4 #卸載系統中的分區信息
losetup -d /dev/loop4 #卸載 loop 設備
----擴容完成----

  • ext4 格式的img,沒擴容顯示 /dev/root 總 Size 是 102.4MB。
  • img擴到200MB的結果,以uefi方式啟動成功,擴容成功。空間大了不少。顯示:
    Filesystem     Size   Used  Available  Use%   Mounted on  ​
    /dev/root    180.2M  15.7M     160.9M    9%   /
    

對於 ext4 格式的 img 文件,啟動運行過之后,再次擴容:

  • 把上面的步驟再做一遍就行了。
  • 理論上,op 系統中曾經修改過的東西,再擴容后,會被保留,不會丟失。

擴容 openwrt-21.02.5-x86-64-generic-ext4-combined.img

MBR 分區。擴容操作與 ext4-combined-efi.img 一樣。擴大映像文件,分區擴容,文件系統擴容。

  • 分區擴容: 用fdisk或cfdisk或parted都可以。cfdisk方便快捷,parted比較方便。
    不用設置分區2的 UUID。因 MBR 分區的也不能改UUID。
  • 文件系統擴容: e2fsck 和 resize2fs 這兩步要做,不能省略。

擴容 openwrt-21.02.1-x86-64-generic-squashfs-combined-efi.img

也是 gpt 分區。擴容操作與 ext4-combined-efi.img 一樣。擴大映像文件,分區擴容。

  • 分區擴容: 分別使用 cfdisk, fdisk, parted。其中 cfdisk 不行,fdisk和parted都OK。
    • 嘗試用 cfdisk,先sort,再resize。結果做出來的img無法啟動。
    • fdisk 修改分區表OK,能啟動。擴容結果與 parted 一樣。
    • parted 修改分區表OK,能啟動。具體做法見下文【其他嘗試-parted 命令】。
  • 無需做文件系統擴容,跳過 e2fsck 和 resize2fs 這兩步。
  • squashfs 沒擴容是多大,忘了記錄。
  • img擴到200MB的結果,以uefi方式啟動成功,擴容成功。空間利用率比ext4差了點。顯示:
    Filesystem            Size   Used  Available  Use%   Mounted on  ​
    /dev/loop0          177.5M  75.7M     101.8M   43%   /overlay
    Overlayfs:/overlay  177.5M  75.7M     101.8M   43%   /
    

擴容 openwrt-21.02.5-x86-64-generic-squashfs-combined.img

MBR 分區。擴容操作與 ext4-combined-efi.img 一樣。擴大映像文件,分區擴容。

  • 分區擴容: 我分別用 fdisk, parted, cfdisk 做了一次。都能成功啟動。
    映像文件都是擴到200M,啟動后看到的: cfdisk做的總空間是177.0M,fdisk,parted做的總空間是177.5M。
    • 用 cfdisk 直接對第二分區 resize,方便快捷。
    • 用 fdisk 除了不用設置分區2的 UUID 和 Name,其他步驟一樣。
      分區1中boot/grub/grub.cfg也是通過PARTUUID掛載。
      但 MBR 的文件系統 UUID,就是 PTUUID 加一個后綴,不會變的。
    • 用 parted 對分區2 resize,比較方便。具體做法見下文【其他嘗試-parted 命令】。
  • 無需做文件系統擴容,跳過 e2fsck 和 resize2fs 這兩步。
  • img擴到200MB的結果(用 cfdisk),啟動成功,擴容成功。顯示:
    Filesystem                Size      Used Available Use% Mounted on 
    /dev/loop0              177.0M     75.2M    101.8M  42% /overlay
    overlayfs:/overlay      177.0M     75.2M    101.8M  42% /
    

這個擴到 200M 的 squashfs格式的 img 文件,啟動運行過之后,再次擴容:

  • qemu-img resize xxxxxxxx.img 250M 繼續擴到 250MB。
  • 用 fdisk或parted 對分區擴容。(我測試時,img 掛在 /dev/loop0,squashfs分區就是 /dev/loop0p2)
  • squashfs文件系統,用 e2fsck, resize2fs 都會報錯,不能用。
  • 這個時候,把img文件拿去啟動。啟動成功,但是空間沒變,還是 177.0M 。
  • 轉到debian系統,下面用到的兩個軟件包,unraid 沒有。
  • 裝 f2fs-tools, 發現 fsck.f2fs, resize.f2fs 也報錯,不能用。
  • 裝 squashfs-tools , 只包含兩個命令,mksquashfs 和 unsquashfs 。
    unsquashfs -stat /dev/loop0p2  #查看文件系統超級塊信息,看到"Compression xz"
    unsquashfs -l /dev/loop0p2     #查看文件系統內的文件列表
    unsquashfs  /dev/loop0p2       #解壓所有文件到當前目錄的"squashfs-root/"中
    mksquashfs squashfs-root /dev/loop0p2 -comp xz -noappend   #用xz壓縮,再把文件寫回去,以防op內核只支持這種壓縮
    #卸載loop0后,拿去啟動
    
  • 這個 250MB 文件,成功啟動,擴容成功。不過原來修改過的數據沒了(恢復出廠設置了)。顯示:
    Filesystem                Size      Used Available Use% Mounted on
    /dev/loop0              227.1M     81.3M    145.8M  36% /overlay
    overlayfs:/overlay      227.1M     81.3M    145.8M  36% /
    
  • 對於 openwrt-XX-squashfs-combined-efi.img 使用過后,再次擴容。也是一樣的。
    對分區2 擴容,然后重寫分區2 的squashfs的文件系統,即可。
  • 如果要保留文件系統中修改過的內容
    在重寫squashfs之前,先掛載(mount)這個分區,備份這個分區中的文件。如:upper/work/目錄。
    tar czvf bak.tgz -C /掛載點 ./cd /掛載點; find ./ |cpio -ov > .../bak.cpio
    重寫squashfs之后,再掛載(mount)這個分區,恢復這些備份文件。
    cd /掛載點; tar zxvf .../bak.tgzcd /掛載點; cpio -idv < .../bak.cpio

其他嘗試

  • 對於 ext4-combined-efi.img 和 squashfs-combined-efi.img 這兩個映像都是 gpt 分區。分別有三個分區,(1,2,128)。
    • cfdisk 不能對分區2直接 resize。因為openwrt-21版的分區2沒有排在最后。
      cfdisk 需要重新排序分區表(sort),才能resize分區。嘗試排序后resize,發現映像無法啟動。
      efi文件不能使用cfdisk,否則無法啟動。
    • gdisk 打開時說GPT分區表損壞。主表存在,但備份表沒有。cgdisk 也是這個提示。
      gdisk 刪除分區2,重新創建分區2時,不能識別剩余空間,無法擴容。新建的分區可以修改UUID。
      cgdisk 刪除2,重新創建2時,不能識別剩余空間,無法擴容。沒地方修改分區的UUID。也不能對現有的分區resize。
      所以 gdisk 和 cgdisk 不行。
  • ext4-combined.img 和 squashfs-combined.img ,這兩個映像都是 MBR 分區格式。分別有兩個分區,(1,2)。
    gdisk 和 cgdisk 說要幫你轉換成 gpt 格式。不能用於 mbr 的分區格式。
    fdisk 看不到有 uuid。
    cfdisk 可以看到有uuid,並且可以直接對第二分區 resize。
    建議用 cfdisk 修改分區。更方便。
  • sfdisk 好復雜,不會用。sgdisk 也不會用。
  • parted 命令 unraid 中沒有。debian中有。簡單,僅兩部即可完成分區擴容
    efi文件(GPT),非efi文件(MBR) 都能用。GPT的要回答兩個問題,MBR的不會問。
    建議只resize分區2,分區類型不變,分區的uuid不變。另外 parted 沒有修改/設置uuid的功能。
    =># parted /dev/loop1 print free
    Error: 備份GPT corrupt,主GPT OK, 是否用主的.
    OK/Cancel? o     #回答ok
    Warning: 似乎沒有使用所有可用空間,是否修復GPT以使用所有空間?
    Fix/Ignore? f    #回答fix
    Number  Start   End     Size    File system  Name  Flags
      ......
     2      17.0MB  126MB   109MB                   #這是分區2 的信息
            126MB   210MB   83.6MB  Free Space      #記住 free 空間的 End = 210M
    =># parted /dev/loop1 resizepart  2  210M       #這里的 210M 就是 free空間的 End
    
    # 完成了,分區2的uuid沒變,不用修改,也沒法改。繼續后續步驟,
    #  ext4無論是否啟動過都要resize2fs。squashfs未啟動過,就免了,如果啟動過,要重建squashfs文件系統。
    # 卸載loop設備,拿去刷機啟動吧。
    
  • kpartx 可以直接操作 img 文件,它會自動掛載到 loop 設備上。但 unraid 中沒這個命令。
  • 對於efi的映像,
    =># lsblk -o path,uuid,ptuuid,pttype /dev/loop1
    PATH           UUID        PTUUID                               PTTYPE
    /dev/loop1                 c120d9f5-d6f9-d15b-05a7-0d348f8a4b00 gpt
    /dev/loop1p1   1234-ABCD   c120d9f5-d6f9-d15b-05a7-0d348f8a4b00 gpt
    /dev/loop1p2               c120d9f5-d6f9-d15b-05a7-0d348f8a4b00 gpt
    /dev/loop1p128             c120d9f5-d6f9-d15b-05a7-0d348f8a4b00 gpt
    =># lsblk -o path,parttype,partuuid /dev/loop1
    PATH           PARTTYPE                             PARTUUID
    /dev/loop1
    /dev/loop1p1   0fc63daf-8483-4772-8e79-3d69d8477de4 c120d9f5-d6f9-d15b-05a7-0d348f8a4b01
    /dev/loop1p2   0fc63daf-8483-4772-8e79-3d69d8477de4 c120d9f5-d6f9-d15b-05a7-0d348f8a4b02
    /dev/loop1p128 21686148-6449-6e6f-744e-656564454649 c120d9f5-d6f9-d15b-05a7-0d348f8a4b80
    =># fdisk -o device,type-uuid,uuid -l /dev/loop1
    Disklabel type: gpt
    Disk identifier: C120D9F5-D6F9-D15B-05A7-0D348F8A4B00
    
    Device         Type-UUID                            UUID
    /dev/loop1p1   0FC63DAF-8483-4772-8E79-3D69D8477DE4 C120D9F5-D6F9-D15B-05A7-0D348F8A4B01
    /dev/loop1p2   0FC63DAF-8483-4772-8E79-3D69D8477DE4 C120D9F5-D6F9-D15B-05A7-0D348F8A4B02
    /dev/loop1p128 21686148-6449-6E6F-744E-656564454649 C120D9F5-D6F9-D15B-05A7-0D348F8A4B80
    
    lsblk的uuid,是文件系統的uuid。 fdisk中看不到。
    lsblk的ptuuid = fdisk的Disk identifier。
    lsblk的parttype = fdisk的Type-UUID。
    lsblk的partuuid = fdisk的UUID。
  • boot/grub.cfg 與 partuuid 的關系,看【用編譯好的kernel-Image和rootfs制作img啟動映像】。

映像文件轉換格式

  • 請看:【映像文件轉換格式
  • 可以把 img 的 raw格式轉為 hyper-v(vhdx), vmware(vmdk), virtualbox(vdi), xen(img)... 使用的格式。

用ImageBuilder打包自定義img

  • 自定義packages。
  • 自己定義生成的img大小。
    • 對於x86 或 x86_64, 修改 .config 文件中,
      CONFIG_TARGET_ROOTFS_PARTSIZE=104,root分區104MB。
      CONFIG_TARGET_KERNEL_PARTSIZE=16, boot分區16MB。
    • 對於其他架構,找找類似target/linux/ramips/image/mt7621.mktarget/linux/ramips/image/Makefile中有沒有地方修改。
      比如 IMAGE_SIZE := 32448k
  • 參考【用ImageBuilder打包自定義img】。

自己手工制作啟動映像

  • 去官網下載 kernel-image,和rootfs,自己制作 啟動映像。想做多大做多大。
    比如: openwrt-22.03.2-x86-64-generic-kernel.bin, openwrt-22.03.2-x86-64-generic-ext4-rootfs.img.gz,
  • 參考【制作img啟動映像】。

轉載注明來源: 本文鏈接 https://www.cnblogs.com/osnosn/p/15524655.html
來自 osnosn的博客 https://www.cnblogs.com/osnosn/ .



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM