openwrt_21.02_img_空间扩容_分区扩容_改分区表大小
转载注明来源: 本文链接 来自osnosn的博客,写于 2021-11-08.
其他文章
- 实体路由器刷op后扩容,见【newifi_D2_新3_lede_插U盘扩容overlay_装可道云】
- 【OpenWRT(x86_64)中squashfs固件磁盘空间扩容方法:Overlay扩容,带有efi的和不带efi的】
环境
- 扩容的操作是在命令行下的
- 这是在 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的虚拟机。然后启动,配置,使用。
unraid中使用后再次扩容,先停掉vm,再对img扩容。 - pve 的虚拟机,使用后再次扩容,见【PVE_LXC_CT_VM_虚拟机的空间扩容】。
- 比如: unraid 中,用它创建 openwrt的虚拟机。然后启动,配置,使用。
扩容 IMG 映像
扩容 openwrt-21.02.1-x86-64-generic-ext4-combined-efi.img
----扩容开始----
qemu-img resize xxxxxxxx.img 200M
#扩容映像本身, 根据你自己的需要,确定扩容的大小。个人认为190MB够用了。
losetup -f xxx.img
#挂载到 loop 设备。losetup -Pf xxx.img
会顺便读取分区信息,加载到系统。
losetup -a
#查看挂在哪个 loop 设备上了,我这是 loop4
partx -a /dev/loop4
#读取分区信息,加载到系统
使用 fdisk 或 parted 都可以。我分别测试过,都能成功启动,扩容结果一样。parted做法见下文【其他尝试-parted 命令】。cfdisk不行。
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。
非efi,建议用 cfdisk 修改分区。更方便。 - sfdisk 好复杂,不会用。sgdisk 也不会用。
- parted 命令 unraid6.9没有,unraid6.12有。debian中有。parted简单,仅两步即可完成分区扩容。
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/ .