如何在不包含可用空间的情况下创建光盘(SD卡)的.IMG图像?

Nec*_*twi 31 linux image dd

在Linux中,我们可以做到

dd if=/dev/sdb of=bckup.img
Run Code Online (Sandbox Code Playgroud)

但是如果磁盘是32GB而只使用了4GB,那么32GB的图像文件就浪费了时空.有没有办法或工具来创建只有有效数据的图像?

mvp*_*mvp 33

处理这个问题的好方法很简单,只需通过gzip管道,如下所示:

# dd if=/dev/sdb | gzip > backup.img.gz
Run Code Online (Sandbox Code Playgroud)

这样,您的图像将被压缩,并且很可能未使用的空间将被挤压到几乎没有.

您可以使用它来恢复此类图像:

# cat backup.img.gz | gunzip | dd of=/dev/sdb
Run Code Online (Sandbox Code Playgroud)

一个注意事项:如果您有很多最近删除的文件,图像大小可能仍然很大(删除文件不一定会使底层扇区归零).您可以通过创建并立即删除包含零的大文件来擦除可用空间:

# cd /media/flashdrive
# dd if=/dev/zero of=bigfile bs=1M     # let it run and quit by disk full error
# rm bigfile
Run Code Online (Sandbox Code Playgroud)

  • 并且您的解决方案仍将 32GB 的数据写入 SD 卡。一个非常耗时的过程。 (4认同)
  • 全新的sd卡剩余空间为零吗? (2认同)
  • 好吧,你可以简单地`tar cvfz mybackup.tar.gz/media/flashdrive`.它将捕获除可启动USB驱动器之外的所有内容,它们将失去可启动状态 (2认同)
  • 是的,'tar`会失去MBR,你需要使用[`boot-repair`](https://help.ubuntu.com/community/Boot-Repair)让驱动器再次启动.但是,除此之外,tar应该保留所有内容,操作系统应该是完全可用的(但一定要将tar作为**root**运行!). (2认同)
  • 您通常可以使用“fstrim”将现代 sdcard 上的可用空间清零,这具有速度快许多倍的优点,还可以避免闪存磨损。对于 VFAT 分区上的 fstrim 支持,您至少需要 Linux 内核版本 4.19。不幸的是,许多 USB SD 卡读/写器不支持丢弃/修剪。如果你想试试这个,试试 `fstrim -v /path-to-mounted-filesystem/`。我在我专业工作的嵌入式空气质量传感器上制作图像时使用它。 (2认同)

Nec*_*twi 7

最好的办法是

  1. 复制保留元数据的所有分区中的所有文件

    mkdir -p myimage/partition1

    mkdir myimage/partition2

    sudo cp -rf --preserve=all /media/mount_point_partition1/* myimage/partition1/

    sudo cp -rf --preserve=all /media/mount_point_partition2/* myimage/partition2/

  2. 提取MBR

    sudo dd if=/dev/sdX of=myimage/mbr.img bs=446 count=1

    替换/dev/sdX为相应的设备.

  3. 将目标磁盘分区为大小大于复制数据的分区,并且应使用相同的格式和相同的标志gparted.谷歌如何分区磁盘.

  4. 挂载新格式化的分区磁盘.在大多数计算机上,您只需要连接磁盘,就可以在/media文件夹中找到已安装的分区.

  5. 使用以下命令将以前复制的数据复制到目标分区

    sudo cp -rf --preserve=all myimage/partition1/* /media/mount_point_partition1/ sudo cp -rf --preserve=all myimage/partition2/* /media/mount_point_partition2/

  6. 复制MBR

    sudo dd if=myimage/mbr.img of=/dev/sdX bs=446 count=1

现在njoy Ur新盘!


hak*_*kel 6

在尝试了多种不同的方法后,我发现了以下文章:

https://medium.com/platformer-blog/creating-a-custom-raspbian-os-image-for-production-3fcb43ff3630

它的创建目的是缩小和调整树莓派图像的大小(首次启动时),但可以轻松调整以适应任何其他 Linux 发行版。我成功地让它在基于 ARM 的定制芯片上与 Debian 9 一起工作。

pishrinkrc.local脚本创建的文件首先用于调整 rootfs 的大小,然后回退到使用的方法(我必须提前在我的计算机上安装)。我注释掉了其中的代码部分raspi-configpartedraspi-config

我的 SD 卡映像从 15 GB 缩小到 1.1 GB。我用etcher刷新了缩小的 SD 卡映像。完整的 15 GB 映像花费了不到 5 分钟的时间,而不是半个小时以上


小智 5

使用 的bscount参数dd,您可以限制图像的大小,如答案 1665017 的步骤 2 中所示

您可能已经知道要创建多大尺寸的图像。如果没有,您可以从df以下方面获得一个好主意:

df -H --total /
Run Code Online (Sandbox Code Playgroud)

替换/为与磁盘分区相关的所有挂载点的空格分隔列表。

更准确的方法可能是使用fdisk或您喜欢的分区编辑器并忙于使用计算器。

$ fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00057540

Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1        2048  186367  184320   90M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      186368 3667967 3481600  1.7G  5 Extended
/dev/mmcblk0p5      188416 3667967 3479552  1.7G 83 Linux
Run Code Online (Sandbox Code Playgroud)

以字节为单位的总已用空间 = 最后一个分区的结束扇区 X 扇区大小(这里是 3667967 x 512)。

以 GB 为单位的总已用空间 = 以字节为单位的总已用空间 / 1024 3(此处为 1.749023 GB)。

例如,如果您决定您的图像应该正好是 2 GB,则以下命令将执行此操作:

dd if=/dev/mmcblk0 of=/path/to/pi_updated.img bs=1M count=2048
Run Code Online (Sandbox Code Playgroud)

生成的图像还将包括超出最后一个分区最大范围的随机噪声。

sudo如果您的帐户还没有足够的权限,请不要忘记执行上述命令。

出于我的目的,我不需要完美修剪到最后一位数据的图像,因此当实际大小为 1.75 GB 时,2 GB 的图像对我来说已经足够了。这会减少图像中其他 6 GB(或 30 GB 或任何设备的空闲空间)的未使用空间。

我在很多地方看到的建议dd应该上挂载的分区,我遵循的,因为它似乎直觉正确执行; 这似乎更像是试图在镜子中绘制自己的草图,而您正在制作的草图也在草图中可见。这有点粗略。

  • 恕我直言,在计算时,扇区大小应该基于一个 End+1 而不是 End。在您的情况下,它应该是 3667968。 (2认同)