openwrt_21.02_img_空間擴容_分區擴容_改分區表大小
轉載注明來源: 本文鏈接 來自osnosn的博客,寫於 2021-11-08.
其他文章
- 實體路由器刷op后擴容,見【newifi_D2_新3_lede_插U盤擴容overlay_裝可道雲】
環境
- 擴容的操作是在命令行下的
- 這是在 unraid 6.9 的終端內操作的,用到的命令 unraid 系統中都有,無需額外安裝。
- 理論上,在Linux的終端下,比如 debian,centos,應該是一樣的。
- qemu-img 命令: debain 裝
apt install qemu-utils
, centos8 裝yum install qemu-img
。
- qemu-img 命令: debain 裝
- 擴容后的 img 就可以在 unraid 中創建虛擬機。啟動它了。
- 以下測試成功了四個 img 映像文件。
- 兩個是 MBR 分區格式的。unraid 創建虛擬機時,
BIOS:
選SeaBIOS
。 - 兩個是 GPT 分區格式的。並且在unraid 中 以 UEFI 方式成功啟動。
unraid 中要用 uefi 啟動,創建虛擬機時,BIOS:
要選擇OVMF
或OVMF TPM
。
- 兩個是 MBR 分區格式的。unraid 創建虛擬機時,
- 如果要對硬盤,或者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.tgz
或cd /掛載點; 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 不行。
- cfdisk 不能對分區2直接 resize。因為openwrt-21版的分區2沒有排在最后。
- 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的uuid,是文件系統的uuid。 fdisk中看不到。=># 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的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.mk
或target/linux/ramips/image/Makefile
中有沒有地方修改。
比如IMAGE_SIZE := 32448k
。
- 對於x86 或 x86_64, 修改
- 參考【用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/ .