我正在从硬盘上进行一些数据恢复。 该磁盘上有大约300GB的数据,但我缺less另一个有300GB可用空间的硬盘。
我有三个HD,有150,40和120 GB的空闲空间。
为了创build第一个块,我正在考虑这样做:
sudo dd if=/dev/sdf1 bs=4096 count=150G | gzip > img1.gz
我应该在其他机器上运行“去掉我离开的地方”?
你可能要考虑使用tar ,正如KPWINC所说,但要直接回答你的问题,你想使用dd的“skip”选项。
如果你说的第一条命令是:
sudo dd if=/dev/sdf1 bs=4096 count=150GB | gzip > img1.gz
那么你的第二个将是:
sudo dd if=/dev/sdf1 bs=4096 skip=150GB count=40GB | gzip > img2.gz
第三:
sudo dd if=/dev/sdf1 bs=4096 skip=190GB count=120GB | gzip > img3.gz
也就是说,我不确定“GB”后缀是否符合你的意图。 我认为它只是对它所遵循的根号码进行粗略的math计算,而不知道如何从你提供的块大小中得到那么多千兆字节。 我会做这样的事情:
dd if=/dev/sdf1 bs=`expr 10 * 1024 * 1024` count=`expr 15 * 1024 * 1024 * 1024`
只是为了确定math。
哦,并确保您的设备不会因为您复制而在您之下改变。 那会很糟糕。
一个简单的解决scheme可能是使用“/ usr / bin / split”。 它只是把文件分解成碎片。 您可以使用“ – ”作为input文件名称从标准input读取。 关于split的好处在于它很简单,它不会以任何真实的方式影响工具链,只需使用“cat”将它们回到一起(或者将它们传递给另一个应用程序)即可“join”文件。
这里有几件事情。 首先,你列出的命令可能不会像你期望的那样工作。 看起来你想要达到150GB,但是你需要考虑块大小和计数(count是块大小的块数)。 所以如果你想要150GB,你可以做bs=1GB count=150 。 然后,您可以在第二次运行时joinskip=150跳过150个块(每个1GB),然后从中提取。 此外,要使gzip将其输出标准输出到标准输出,您需要将其传递给-c选项。
但是,在你这样做之前,还有其他一些问题。 你在这里使用dd,因为文件系统已损坏/损坏/等,你需要一点点的精确的磁盘映像副本呢? 或者你只是试图获取数据? 文件系统感知工具可能更有效。 特别是如果源文件系统不满。 选项包括焦油,或者你可能想看看像Clonezilla , Partclone , Partimage ,或更多的Windows特定的选项来直接访问Windows文件系统, Linux-NTFS (注意前面提到的工具可以处理Windows文件系统不同程度的也是)。
如果你在一个非文件系统感知程序的分区上运行,那么使用你的dd行(正如上面修改的那样)是可能的。 很难说它会压缩多less,但它应该比原来的文件系统小。 如果您对原始文件系统具有读写访问权限,那么使用写入/ dev / zero的文件来填充可用空间,以便在用dd保存之前将未使用的空间清零。 这将增强gzip压缩磁盘映像中可用空间的能力。
要在第二个块上操作,只需在第二个dd调用中添加一个skip=XXX位,其中'XXX'等于您第一次给出的count=值。 如果你想在第一个上做150GB,在第二个上做40个,你可以这样做:
sudo dd if=/dev/sdf1 bs=1GB count=150 | gzip -c > img1.gz
其次是:
sudo dd if=/dev/sdf1 bs=1GB skip=150 count=40 | gzip -c > img2.gz
柏油
我tar可以解决你的问题。 它有能力将文件分解成多个卷。
看看这个链接:
来自页面:
除了标准语法之外,需要使用的两个额外的命令行选项是-M( – 多卷),它告诉Tar要将文件分割到多个介质磁盘上。 然后你需要告诉Tar有多大的媒体,以便它可以创build正确大小的文件。 要做到这一点,你使用–tape-length选项,你传递的值是x 1024个字节。
下面的例子显示了使用的语法。 可以说largefile.tgz是150兆,我们需要在两个100兆邮编驱动器上的文件。
tar -c -M –tape-length = 102400 –file = disk1.tar largefile.tgz
值102400是1024 x 100,这将创build一个名为disk1.tar的100兆文件,然后焦油将提示音量2,如下所示: –
为disk1.tar准备卷#2并点击return:
在磁带驱动器的时候,你会把第一盘磁带带出机器,插入一个新的磁带,然后按回车继续。 正如我们希望Tar在一个单独的文件中创build剩余的50 Meg,我们发出以下命令: –
disk2.tar
这指示Tar继续将剩余的50兆largefile.tgz写入名为disk2.tar的文件。 然后你会被提示下面一行,你现在可以返回继续。
为disk2.tar准备卷#2并按回车键:
你会重复这个过程,直到你的大文件被完全处理,每次提示时增加文件名中的磁盘编号。
为晚会迟到,但我不得不做一个这样的脚本来备份FAT32棒上的未知文件系统。
这个简单的脚本适用于我:
# Sets pipefail so failed dd makes the whole pipe command fail set -o pipefail dd_result=0 split=0 filenameSplit= while [ $dd_result == 0 ] do cmd="dd if=/dev/sdX bs=2G count=1 skip=$split | pigz --fast > \"2G.$filenameSplit.myharddisk.gz\"" echo $cmd eval $cmd dd_result=$? split=$((split + 1)) filenameSplit=$split done
编辑:上传了一个基本的备份还原脚本,使用dd,pigz或gzip压缩,并将文件分割成可以在命令行设置的块。 脚本在这里find: github.com/deajan/linuxscripts