获取当前工作驱动器的驱动器映像是否安全?

Mar*_*lla 12 backup dd disk-image

我必须备份我的硬盘。我想使用dd并将图像放在外部硬盘上。

  • 我可以使用dd硬盘本身的操作系统来执行此操作,还是必须从其他设备(例如 LiveCD)启动?
  • 一般来说,如果设备已安装并正常工作,拍摄设备图像是否安全?
  • 如果设备已安装,但我确定在运行时没有其他 I/O 操作dd怎么办?

我确信这rsync是用于备份的最佳工具,特别是增量备份。

但我对 感兴趣dd,因为我还想备份其他存储设备,并且它还复制存储在未分区空间上的数据。例如,我的电子书阅读器使用一个未分区的空间来存储 uboot、内核和其他数据。

Mac*_*tka 11

一般来说是不安全的。FS 假设操作是按一定顺序写入的,因此它可以写入文件的新数据,然后从其他数据中创建一个指向它的指针,具体细节取决于文件系统。想象一下,如果发生以下情况:

  1. dd 从包含垃圾或一些数据的位置 X 读取
  2. 文件系统写入位置 X
  3. 文件系统写入位置 X+1 指向位置 X 的指针
  4. dd 从位置 X+1 读取链接到位置 X

从备份的角度来看,您会得到垃圾数据。但是有几种方法可以解决它:

  • 通过文件系统特定命令冻结文件系统(我相信xfs_freeze是一个,我不知道其他任何一个 - 但这种选项至少在理论上存在)
  • 创建 lvm 快照并从中复制。副本将就像您重新启动计算机一样(减去硬盘重新排序),因此它将是一个脏文件系统,但副本将是原子的。请注意,某些文件系统(如 XFS)需要先冻结。
  • 按照其他人的建议使用 rsync。现在副本是安全的,您不需要 LVM 但副本不是原子的。因此,虽然它在文件系统级别避免了上述问题,但它仍然可能会遇到文件问题(不太可能,但可以想象当 mv 在后台执行时丢失文件)
  • 使用带有快照的文件系统,例如btrfstux3zfsnilfs ......然后你就可以避免这两个问题——你可以创建一个快照并通过具有完全原子性的 rsync 从中复制。但是请注意,此类文件系统通常是实验性的。

最后一点 -dd可能不是最好的备份方式。它复制一个完整的磁盘,这在您复制“垃圾”时通常是浪费的。如果你需要一个磁盘映像,像partimage这样的东西可能会更好。如果你没有更好的选择,要么使用 rsync、差异/增量模式下的 tar 等,要么使用完整备份系统,如baculatarsnap或许多其他系统之一。重复数据删除可能会对备份的大小产生奇迹。

  • +1这是真正尝试回答这个问题的唯一答案,非常适合实际阅读操作员的要求,而不是抱怨 dd 有多糟糕。 (2认同)

gol*_*cks 8

这取决于分区的确切用途以及副本的目的。但是,我会说一般来说这dd是一个不合适的备份文件系统的工具。这也不是它的目的。

  • 复制分区的空白部分会浪费很多时间。

  • 如果文件系统当前已挂载,则可能会导致不一致,部分原因是它是操作系统级别的实体,可能与底层块设备不同步。sync最初调用不会对此有太大帮助,因为该过程不是即时的。

使用cp -arsync代替。然后,您当然需要创建目标分区,所以它并不那么容易,但它更安全、更灵活。如果您需要创建文件系统映像,请参见下文。

如果您打算复制根文件系统,绝对不要使用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)

请注意,如果现有文件的路径与存档中的某些内容匹配,则会覆盖现有文件。否则,它会使现有的目录层次结构保持不变。

  • @mpy GNU coreutils 的 `cp` 和 rsync 都有选项 `-x` 以避免递归到其他文件系统。[Maciej 的回答](http://unix.stackexchange.com/a/141037) 最好地解释了为什么 `dd` 在这里绝对不合适(除非您采取 [Mark](http ://unix.stackexchange.com/a/141032),因为在复制期间会发生写入)。 (2认同)
  • `dd` 不会复制磁盘上不是真正目录的东西,所以我不确定你的第一点来自哪里。例如,挂载在`/mnt` 中的设备、`/proc` 中的节点等不会是`dd` 抓取的数据的一部分,因为它不在磁盘上。对于未挂载的文件系统,`dd` 是完全有效的;你最终会得到一个完全相同的副本。它不适合挂载的文件系统的唯一原因是系统上的数据可能会在 `dd` 运行的很长一段时间内更改/部分写入。 (2认同)