空间不足时,解包修改后重新打包镜像
侧边栏壁纸
  • 累计撰写 19 篇文章
  • 累计收到 2 条评论

空间不足时,解包修改后重新打包镜像

admin
2025-08-29 / 0 评论 / 3 阅读 / 正在检测是否收录...

您提到在编译和修改 rootfs 分区时可能会遇到空间不足的问题。直接挂载镜像文件进行操作时,分区的大小是固定的,无法动态扩展。为了解决这个问题,您可以按照以下步骤在更大的空间中进行编译和修改,然后再将修改后的内容打包回镜像文件:


1. 挂载镜像文件

运行以下命令挂载镜像文件:

# 创建挂载点目录
sudo mkdir -p /mnt/hd9901

# 使用 losetup 挂载镜像文件
sudo losetup -fP hd9901.img

# 查找 loop 设备名(如 /dev/loop0)
sudo losetup -a

# 挂载分区(以 rootfs 分区为例)
sudo mount /dev/loop0p5 /mnt/hd9901

2. 将 rootfs 分区的内容复制到临时目录

运行以下命令将 rootfs 分区的内容复制到宿主机的临时目录中:

# 创建临时目录
sudo mkdir -p /tmp/rootfs_temp

# 使用 rsync 复制内容
sudo rsync -a /mnt/hd9901/ /tmp/rootfs_temp/

3. 使用 chroot 环境进行编译和修改

在临时目录中设置 chroot 环境,以便在类似目标系统的环境中进行编译和修改:

# 示例:在 chroot 环境中安装软件包
sudo chroot /tmp/rootfs_temp
mount -t proc proc /proc
mount -t sysfs sys /sys
mount -t devtmpfs dev /dev
mount -t devpts pts /dev/pts

# 在 chroot 环境中执行命令(如安装编译工具)
apt update
apt install -y build-essential

# 退出 chroot 环境
exit

4. 卸载镜像文件

完成修改后,运行以下命令卸载镜像:

sudo umount /mnt/hd9901
sudo losetup -d /dev/loop0

5. 重新打包镜像文件

使用 mksquashfstar 命令将修改后的内容重新打包成镜像文件:

# 确保镜像文件大小与原文件一致
dd if=/dev/zero of=hd9901_new.img bs=1M count=1944

# 使用 losetup 重新挂载新镜像文件
sudo losetup -fP hd9901_new.img

# 查找新的 loop 设备名(如 /dev/loop1)
sudo losetup -a

# 将原镜像的分区表复制到新镜像
sudo gdisk /dev/loop0
  • gdisk 交互界面中,输入 r 进入恢复菜单,然后选择 d 恢复分区表,最后选择 w 写入并退出。

6. 验证镜像文件

使用 gdiskfdisk 验证新镜像的分区表和内容:

sudo gdisk -l hd9901_new.img

注意事项

  • 数据备份:在重新打包前,确保已备份重要数据。
  • 镜像大小:确保新镜像文件大小与原文件一致,以避免数据丢失。
  • 分区表:在重新打包时,确保正确复制原镜像的分区表。

如果问题仍未解决,请提供以下信息以便进一步诊断:

lsblk
fdisk -l hd9901.img

根据您的描述,您已经完成了对 /dev/loop0p5(即 rootfs 分区)的修改,并希望将修改后的内容重新打包回镜像文件。以下是详细的后续操作步骤:


1. 挂载新镜像文件

1.1 创建与原镜像文件大小相同的新镜像文件

# 确保新镜像文件大小与原文件一致(例如 1944MB)
dd if=/dev/zero of=hd9901_new.img bs=1M count=1944

1.2 使用 losetup 挂载新镜像文件

sudo losetup -fP hd9901_new.img

1.3 查找新的 loop 设备名

sudo losetup -a
  • 假设新镜像文件的 loop 设备名为 /dev/loop1

2. 复制分区表

2.1 使用 gdisk 复制原镜像的分区表

sudo gdisk /dev/loop0
  • gdisk 交互界面中:

    • 输入 r 进入恢复菜单。
    • 选择 d 恢复分区表。
    • 选择 w 写入并退出。

2.2 将分区表写入新镜像文件

sudo gdisk /dev/loop1
  • gdisk 交互界面中:

    • 输入 r 进入恢复菜单。
    • 选择 d 恢复分区表。
    • 选择 w 写入并退出。

3. 挂载新镜像的 rootfs 分区

3.1 查找新镜像的 rootfs 分区设备名

sudo losetup -a
  • 假设新镜像的 rootfs 分区设备名为 /dev/loop1p5

3.2 挂载新镜像的 rootfs 分区

sudo mkdir -p /mnt/hd9901_new
sudo mount /dev/loop1p5 /mnt/hd9901_new

4. 将修改后的内容复制回新镜像的 rootfs 分区

4.1 使用 rsync 同步内容

sudo rsync -a /tmp/rootfs_temp/ /mnt/hd9901_new/

5. 卸载镜像文件

5.1 卸载新镜像的 rootfs 分区

sudo umount /mnt/hd9901_new

5.2 解除 loop 设备与新镜像文件的关联

sudo losetup -d /dev/loop1

6. 验证新镜像文件

6.1 检查分区表

sudo gdisk -l hd9901_new.img

6.2 检查 rootfs 分区内容

# 重新挂载新镜像文件
sudo losetup -fP hd9901_new.img
sudo mount /dev/loop1p5 /mnt/hd9901_new

# 列出分区内容
ls /mnt/hd9901_new

# 卸载新镜像文件
sudo umount /mnt/hd9901_new
sudo losetup -d /dev/loop1

注意事项

  • 数据备份:在重新打包前,确保已备份重要数据。
  • 镜像大小:确保新镜像文件大小与原文件一致,以避免数据丢失。
  • 分区表:在重新打包时,确保正确复制原镜像的分区表。

如果问题仍未解决,请提供以下信息以便进一步诊断:

lsblk
fdisk -l hd9901_new.img
0

评论 (0)

取消