Mar*_*lla 12 backup dd disk-image
我必须备份我的硬盘。我想使用dd
并将图像放在外部硬盘上。
dd
硬盘本身的操作系统来执行此操作,还是必须从其他设备(例如 LiveCD)启动?dd
怎么办?我确信这rsync
是用于备份的最佳工具,特别是增量备份。
但我对 感兴趣dd
,因为我还想备份其他存储设备,并且它还复制存储在未分区空间上的数据。例如,我的电子书阅读器使用一个未分区的空间来存储 uboot、内核和其他数据。
Mac*_*tka 11
一般来说是不安全的。FS 假设操作是按一定顺序写入的,因此它可以写入文件的新数据,然后从其他数据中创建一个指向它的指针,具体细节取决于文件系统。想象一下,如果发生以下情况:
dd
从包含垃圾或一些数据的位置 X 读取dd
从位置 X+1 读取链接到位置 X从备份的角度来看,您会得到垃圾数据。但是有几种方法可以解决它:
xfs_freeze
是一个,我不知道其他任何一个 - 但这种选项至少在理论上存在)最后一点 -dd
可能不是最好的备份方式。它复制一个完整的磁盘,这在您复制“垃圾”时通常是浪费的。如果你需要一个磁盘映像,像partimage这样的东西可能会更好。如果你没有更好的选择,要么使用 rsync、差异/增量模式下的 tar 等,要么使用完整备份系统,如bacula、tarsnap或许多其他系统之一。重复数据删除可能会对备份的大小产生奇迹。
这取决于分区的确切用途以及副本的目的。但是,我会说一般来说这dd
是一个不合适的备份文件系统的工具。这也不是它的目的。
复制分区的空白部分会浪费很多时间。
如果文件系统当前已挂载,则可能会导致不一致,部分原因是它是操作系统级别的实体,可能与底层块设备不同步。sync
最初调用不会对此有太大帮助,因为该过程不是即时的。
使用cp -a
或rsync
代替。然后,您当然需要创建目标分区,所以它并不那么容易,但它更安全、更灵活。如果您需要创建文件系统映像,请参见下文。
如果您打算复制根文件系统,绝对不要使用dd
. 您必须使用类似rsync -ax
(或cp -ax
在单个顶级目录上)的东西,因为有一堆东西不能在 copy 中。在 Linux 上,这包括:
/dev
/lost+found
/mnt
/proc
/run
/sys
/tmp
Run Code Online (Sandbox Code Playgroud)
其中一些实际上是内核接口,而不是磁盘上的实际目录。如果你复制它们,你就是在复制一堆在副本中不适用的信息;如果您尝试使用它运行一个系统,它只会浪费空间,因为真正的接口将安装在顶部。其他的包含正在运行的进程正在使用的临时信息,这些信息更像是一个问题,因为如果您复制这些信息,系统将无法整理垃圾。
如果要创建根文件系统(或任何文件系统)的映像文件,请创建一个空映像文件——这适用于dd
:
dd if=/dev/zero of=whatever.img bs=1024 count=1000000
Run Code Online (Sandbox Code Playgroud)
这是一个 1024 MB 的图像 (1000000 * 1024)。count
如果你想要其他尺寸,请调整。在ext
文件中创建例如一个文件系统:
mke2fs whatever.img
Run Code Online (Sandbox Code Playgroud)
它会警告你这不是一个真正的块设备。继续。现在挂载镜像文件:
mount whatever.img /mnt/img
Run Code Online (Sandbox Code Playgroud)
/mnt/img
必须存在,但可以是任何东西。您现在可以rsync
(或cp -a
)进入/mnt/img
. whatever.img
当您卸载它时,内容将保留在里面。
为了清楚起见,如果您出于任何原因绝对需要图像文件,请仅使用刚刚描述的文件系统图像方法。如果您的目标是将分区复制到另一个硬盘驱动器,则不需要映像:在该驱动器上创建一个具有空文件系统的新分区,安装它,然后复制到那里。您可以改为将文件系统内容放入一个空目录并将其存档:
tar -czf myarchive.tar.gz [the directory path]
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过将其放置在顶层并使用以下命令将其部署在现有(空或其他)分区中:
tar -xzf myarchive.tar.gz
Run Code Online (Sandbox Code Playgroud)
请注意,如果现有文件的路径与存档中的某些内容匹配,则会覆盖现有文件。否则,它会使现有的目录层次结构保持不变。