我有一个磁盘,比如 /dev/sda。
这是 fdisk -l:
Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 27 209920 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 27 525 4000768 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 27 353 2621440 83 Linux
/dev/sda6 353 405 416768 83 Linux
/dev/sda7 405 490 675840 83 Linux
/dev/sda8 490 525 282624 83 Linux
我需要制作一个映像存储在我们的文件服务器上,以便用于刷新我们正在制造的其他设备,因此我只想要使用的空间(仅约 4gb)。我想保留 mbr 等...因为此设备应在复制完成后立即准备好启动。
有什么想法吗?我以前一直在使用dd if=/dev/sda of=[//fileserver/file]
,但那时我的主副本在 4gb 闪存 ide 上。
答案1
以前我遇到过与嵌入式 Linux 发行版类似的问题 - 在压缩图像之前清除所有垃圾。
dd if=/dev/zero of=asdf.txt
。等它死掉。删除asdf.txt。
您刚刚将设备上的所有可用空间都写入零。
现在获取磁盘映像并通过 gzip 运行它。瞧,稀疏映像。
如果您实际需要写入磁盘,则可能无法很好地扩展并可能导致问题,但是嘿。
您可以将磁盘的 rsync 快照拍摄到另一个卷,将其清零,然后获取该磁盘映像。
注意:可能对 SSD 有害,用户在提交之前应考虑此操作。
答案2
假设您想要保存/dev/sdXN
并且/tgtfs/image.raw
您是 root:
mkdir /srcfs && mount /dev/sdXN /srcfs
使用
zerofill
,zerofree
或者仅:
dd if=/dev/zero of=/srcfs/tmpzero.txt
用零填充未使用的块;等待它完全填满文件系统然后:
rm /srcfs/tmpzero.txt
使用 dd 获取图像并使用 conv=sparse 即时打零:
dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw
如果您想使用压缩,则不需要使用 dd 来打零,因为零块具有高度可压缩性:
dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw
PS:请注意,在基于闪存的存储介质(即源文件系统是 SSD)上定期进行此操作(用零填充文件系统)并不是一个好主意,因为这会导致对 SSD 进行大量写入并缩短其使用寿命。(但偶尔传输数据是可以的)
答案3
使用 dd,带有 count 选项。
在您的例子中,您使用的是 fdisk,因此我将采用该方法。您的“sudo fdisk -l”产生了:
Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 27 209920 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 27 525 4000768 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 27 353 2621440 83 Linux
/dev/sda6 353 405 416768 83 Linux
/dev/sda7 405 490 675840 83 Linux
/dev/sda8 490 525 282624 83 Linux
您应该注意的两件事是 1) 单位大小,以及 2) “结束”列。在您的例子中,您的磁柱大小等于 8225280 字节。在“结束”列中,sda8 终止于 525(即 525[单位]*16065*512 = ~4.3GB)
dd 可以做很多事情,例如在偏移量之后开始,或在特定数量的块之后停止。我们将使用 dd 中的 count 选项执行后者。命令如下所示:
sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526
其中 -bs 是块大小(最简单的方法是使用 fdisk 使用的单位,但只要在这些单位中声明了 count 选项,任何单位都可以),count 是我们要复制的单元数(请注意,我们将计数增加 1 以捕获最后一个块)。
答案4
你不能。dd
是一个非常低级的工具,它无法区分文件和空白空间。
另一方面,空白空间将会被压缩得非常好,所以如果您只关心存储空间,而不是写入时间,那么只需通过 gzip 进行传输即可。