osnosn

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

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 命令 unraid6.9没有,unraid6.12有。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/ .


posted on 2021-11-08 16:01  osnosn  阅读(11574)  评论(0编辑  收藏  举报