我有200 GB的可用磁盘空间,16 GB的RAM(其中约1 GB被台式机和内核占用)和6 GB的交换空间。
我有一个240 GB的外部SSD,其中70 GB已使用1,其余的则免费,我需要备份到磁盘上。
通常,我会dd if=/dev/sdb of=Desktop/disk.img
先将磁盘压缩,然后再压缩它,但首先制作映像不是一个选择,因为这样做会比我需要更多的磁盘空间,即使压缩步骤会导致压缩可用空间,因此最终存档可以轻松放入我的磁盘中。
dd
默认情况下会写入STDOUT,并且gzip
可以从STDIN读取,因此从理论上讲,我可以进行写入dd if=/dev/sdb | gzip -9 -
,但是gzip
读取字节所需的时间比dd
产生字节的时间长得多。
来自man pipe
:
写入管道写入端的数据由内核缓冲,直到从管道读取端读取数据为止。
我将一个|
虚拟的管道想象成一个真实的管道-一个应用程序将数据放入管道,另一个应用程序将数据尽快从管道队列中取出。
当左侧的程序比管道的另一端希望更快地写入更多数据时,怎么办?它会导致过多的内存使用或交换使用,还是内核会尝试在磁盘上创建FIFO,从而填满磁盘?还是SIGPIPE Broken pipe
如果缓冲区太大会失败?
基本上,这可以归结为两个问题:
- 将更多数据放入管道中比一次读取更多的含义和结果是什么?
- 将数据流压缩到磁盘而不将整个未压缩的数据流放在磁盘上的可靠方法是什么?
注意1:由于碎片等原因,我不能完全复制前70个已使用的GB并期望得到一个工作系统或文件系统,这需要完整的内容。
lzop
而不是gzip
; 它的压缩速度要快得多,压缩率却低得多。我发现它非常适合压缩速度可能成为瓶颈的磁盘映像。