在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)
最好的办法是
复制保留元数据的所有分区中的所有文件
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/
提取MBR
sudo dd if=/dev/sdX of=myimage/mbr.img bs=446 count=1
替换/dev/sdX为相应的设备.
将目标磁盘分区为大小大于复制数据的分区,并且应使用相同的格式和相同的标志gparted.谷歌如何分区磁盘.
挂载新格式化的分区磁盘.在大多数计算机上,您只需要连接磁盘,就可以在/media文件夹中找到已安装的分区.
使用以下命令将以前复制的数据复制到目标分区
sudo cp -rf --preserve=all myimage/partition1/* /media/mount_point_partition1/
sudo cp -rf --preserve=all myimage/partition2/* /media/mount_point_partition2/
复制MBR
sudo dd if=myimage/mbr.img of=/dev/sdX bs=446 count=1
现在njoy Ur新盘!
在尝试了多种不同的方法后,我发现了以下文章:
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
使用 的bs和count参数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应该不上挂载的分区,我遵循的,因为它似乎直觉正确执行; 这似乎更像是试图在镜子中绘制自己的草图,而您正在制作的草图也在草图中可见。这有点粗略。
| 归档时间: |
|
| 查看次数: |
55505 次 |
| 最近记录: |