我有一个磁盘,说/ 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上。
早在我遇到了embedded式Linux发行版的类似问题之前 – 在压缩映像之前摆脱所有垃圾。
dd if=/dev/zero of=asdf.txt
。 等到它死亡。 删除asdf.txt。
您已经将零写入设备上的所有可用空间。
现在拿一个磁盘映像并通过gzip运行。 瞧,稀疏的形象。
如果你真的需要写入磁盘,可能不会很好地扩展,并可能导致问题,但是,嘿。
您可以将磁盘的rsync快照转换为另一个卷,然后获取该磁盘映像。
注意:可能对SSD有危险,用户应该考虑这个操作。
假设你想把/dev/sdXN
保存到/tgtfs/image.raw
,你是root:
mkdir /srcfs && mount /dev/sdXN /srcfs
使用zerofill或者只是: 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)
假设驱动器的其余部分是空的(全零),你可以通过gzip来pipeDD,这应该很好地压缩空的空间。 你可以使用像zerofree这样的工具,以确保你的空白空间实际上是空白的,所以它压缩很好。
如果您使用像partimage , clonezilla或其他一些linux克隆工具的工具,他们会自动为您处理大部分这些工具。
你不能。 dd
是一个非常低级别的工具,它无法区分文件和空白空间。
另一方面,空的空间将会非常好地压缩,所以如果你只关心存储空间,而不是写时间,那么只需通过gzippipe道。
虽然/dev/zero
可用磁盘空间并使用dd conv=sparse
/ gz -c
是可能的,但是在空闲空间运行在100 GB的巨大磁盘上, /dev/zero
ing会非常慢 – 更不用说了作为其他答案指出, /dev/zero
SDD到EOF。
这是我遇到这种情况时所做的:
在一张lubuntu live CD上,使用gparted
将磁盘“缩小”到最小可能的大小,剩下的空间未被分配
用过的
dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz
dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz
来创build快速压缩的图像(不用说,如果您有足够的空间存储原始数据(或者倾向于减lessCPU负载),则可能需要跳过压缩)
dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
将数据复制回不同的磁盘 gparted
来“扩大”分区 我还没有尝试过多个分区,但我相信上面的过程可以适应复制“分区”,如果目标磁盘上的分区表首先创build,只有分区中包含的数据通过dd
复制 – 读取/写入偏移量(分别为dd
skip
/ seek
选项)将被要求。
使用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来捕获最后一个块)。