拍摄当前工作驱动器的驱动器映像是否安全?


12

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

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

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

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


重要的是您正在使用哪个文件系统,对哪个感兴趣?有些具有此任务的特定功能。

Answers:


11

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

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

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

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

最后一点- dd可能不是最好的备份方法。它会复制一个完整的磁盘,这通常在您复制“垃圾”时也很浪费。如果您需要磁盘映像,则像partimage这样的映像可能会更好。如果您没有更好的选择,请使用rsync,差分/增量模式下的tar等,或者使用完整的备份系统,例如baculatarsnap或许多其他备份系统。重复数据删除可能会为备份的大小带来奇迹。


1
+1这是实际尝试回答此问题的唯一答案,非常适合实际阅读操作员所问的内容,而不是对dd的不良影响感到厌恶。
价2014年

+1是个好答案。但我不同意这种说法。dd还不错。这样做是不合适的,并解释为什么会这样是一件好事。
Hennes

项目符号第4点与#2具有相同的限制,对吧?一个应用程序可能在发出写操作的中间,而快照对应用程序级事务一无所知。
Ben Voigt 2014年

谢谢,它的确回答了这个问题。goldilocks的回答也很好,但是我不仅想备份我的硬盘,还想备份其他存储设备,也许我以前不得不写它。
Marco Sulla 2014年

@BenVoigt-在某种程度上-它消除了一层(文件系统),而AFAIK是“更脆弱”的一层。仍然在某些情况下,您可以找到半写入的文件,但是如果应用程序不处理它们,则在许多其他情况下(OOM,崩溃等)文件也可能损坏,因此正确编写的应用程序应该处理它。
Maciej Piechotka 2014年

7

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

  • 复制分区的空白部分将浪费大量时间。

  • 如果当前已安装文件系统,可能会导致不一致,部分原因是它是操作系统级别的实体,并且可能与基础块设备不同步。sync由于此过程不是瞬时的,因此最初调用不会有太大帮助。

使用cp -arsync代替。然后,您当然需要创建目标分区,因此它并不是那么简单,但却更加安全和灵活。如果您需要创建文件系统映像,请参见下文。

如果您打算复制根文件系统,则绝对不要使用dd。您必须使用类似rsync -ax(或cp -ax在单独的顶层目录上)的东西,因为其中有一堆必须不包含在副本中的东西。在Linux上,这包括:

/dev
/lost+found
/mnt
/proc
/run
/sys
/tmp

其中一些实际上是内核接口,而不是磁盘上的真实目录。如果您复制它们,那么您将复制一堆将不适用于该副本的信息。如果尝试使用该系统运行系统,则将浪费空间,因为实际接口将安装在顶部。其他的则包含正在运行的进程正在使用的临时信息,而这些问题就更成问题了,因为如果您复制这些信息,系统将无法清理垃圾。

如果要创建根文件系统(或任何文件系统)的映像文件,请创建一个空的映像文件-这适合用于dd

dd if=/dev/zero of=whatever.img bs=1024 count=1000000

那是一个1024 MB的图像(1000000 * 1024)。调整count是否需要其他尺寸。在ext文件创建一个文件系统:

mke2fs whatever.img

它会警告您这不是真正的阻止设备。继续。现在挂载映像文件:

mount whatever.img /mnt/img

/mnt/img必须存在,但可以。您现在可以rsync(或cp -a)进入/mnt/imgwhatever.img卸载时,内容将保留在内部。

然而...

为了清楚起见,如果出于任何原因绝对需要映像文件,请仅使用刚刚描述的文件系统映像方法。如果您的目标是将分区复制到另一个硬盘驱动器,则不需要映像:在该驱动器上创建一个空文件系统的新分区,将其挂载并复制到其中。您可以将文件系统内容放到一个空目录中并进行存档:

tar -czf myarchive.tar.gz [the directory path]

然后,可以将其放置在现有(空或其他)分区中,方法是将其放在顶层并使用:

tar -xzf myarchive.tar.gz

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


+1写入空图像文件非常灵活,但是与保存到.tar或.tgz归档文件相比,这有什么优点?
小河

@Creek除了可安装映像外,它没有任何优势。我补充说,如果OP的目标是生成可以原始使用的图像。否则,最好使用档案,因为档案的大小不是固定的。我将对此进行更清楚的说明。
goldilocks 2014年

哎呀,我不这么认为。仍然是存储文件的一种很酷的方法。
小河

2
@mpy GNU coreutils cp和rsync都可以选择-x避免递归到其他文件系统。Maciej的答案最好地解释了为什么dd这里绝对不适当(除非您采取Mark列出的预防措施,否则几乎可以保证产生不可用的副本,因为在复制过程中可能会发生写操作)。
吉尔(Gilles)'所以

2
dd不会复制磁盘上不是真实目录的内容,因此我不确定您的第一点来自哪里。例如,安装在/mnt,中的节点/proc等中的设备将不会成为所获取数据的一部分,dd因为它不在磁盘上。对于卸载的文件系统dd是完全有效的;您最终得到完全相同的副本。不适合挂载的文件系统的唯一原因是,系统上的数据可能会在很长一段时间内发生更改/部分写入dd
Jason C

1

rsync是备份文件系统的首选工具,它可以对当前正在运行的OS进行可引导备份。

一些警告:

  • 您必须添加适当的字母汤选项
  • 路径很关键
  • 排除列表是必需的,并且每个操作系统和每个配置可能都不相同

rsync优于tar等其他方法的一些优点:

  • 您可以随时停止并开始备份
  • 处理替换文件的许多选项,例如按需删除,之前删除,移动.....
  • 恢复(或重复)备份为比其他方法更快,因为以前复制的文件被跳过。(通常将速度提高20倍)
  • --link-dest选项可以创建版本备份,而仅实际复制新文件

映像备份有其位置,但是它们完全照原样复制驱动器,包括您可能遇到的任何问题。文件备份将创建一个新目录,并且具有在此过程中线性化(碎片整理)驱动器的副作用。如果要为当前操作系统制作10个相同的副本,我将rsync用作复制主副本,然后将dd(或类似名称)用作其余副本。


1

这取决于您所说的“当前工作系统”。如果您只是想避免使用启动盘,并且不关心计算机上正在运行的服务受到干扰,则可以:

  1. 关闭所有不必要的程序(基本上,除了您正在使用的root shell以外的所有内容-请勿从X终端尝试此操作,请使用真实的控制台shell)。单用户模式可能对此有所帮助。
  2. 如果安装的磁盘不是系统根目录,请卸载它们。不要卸载虚拟文件系统,例如/ proc,/ sys或/ dev。
  3. 刷新剩余磁盘上的缓存数据: sync
  4. 将根文件系统重新挂载为只读:mount -o ro /
  5. 挂载外部硬盘驱动器(您可能会收到有关无法写入的警告/etc/mtab;请忽略它)。
  6. 进行备份。
  7. 卸载外部硬盘驱动器。
  8. 重启。您到这里来使您的系统变得一团糟,重新启动是使其恢复正常的最快方法。

我使用这种方法对刚刚升级的计算机进行存档,并且不希望使用更多计算机。对于正在使用的系统来说,这不是一个很好的方法:它很慢(需要花费数小时或数天),备份非常大(因此您不能保留多于几个),并且使用要备份的系统极具破坏性起来。对于日常备份,我建议在文件系统级别使用某些功能,例如rsnapshot


请注意,第4步在某些文件系统上可能很危险,因为即使在只读模式下,它们也会写入。同样,在更现代的系统(Linux 3.some)上,您也可以链接/etc/mtab/proc/self/mount-即使您拥有chroots或fs命名空间之类的东西也可以使用。
Maciej Piechotka 2014年

1
@MaciejPiechotka我不知道任何文件系统的写入安装,而在只读模式,我会觉得很奇怪。如果以前未彻底卸载文件系统,则某些文件系统会以只读模式安装时进行写入,因此该步骤mount -o remount,ro /可能会写入。但是一旦返回该命令,在什么情况下会发生后续写入?
吉尔(Gilles)“所以,别再邪恶了”

至关重要的是,要关闭的“非必需程序”必须包括日志记录子系统,我认为这不是必需的。
吉尔(Gilles)'所以

@Gilles,为了制作启动盘的磁盘映像,任何与映像创建无关的程序都不是必需的。
2014年

可能值得一提的是单用户模式可以在这里有所帮助。
价格

1

认真使用Clonezilla。它是类似Linux的最佳开源,基于Norton Ghost的实用程序。它将完成分区到磁盘的全盘克隆或磁盘到文件系统(另存为文件)的完整磁盘克隆。它支持大多数Linux文件系统,NTFS,FAT32等。它可以保存到内部磁盘,外部驱动器,甚至可以通过SMB或NFS共享上的网络保存。

它非常易于使用,可以节省大量时间。

编辑:要回答这个问题,不,您不能在dd大多数文件系统挂载时使用它,因为从块设备读取数据不是原子操作,因此冒着最终导致文件系统副本不一致的风险。例如,如果您要复制100个块,则系统可能仅在中途才更新了第一个块和最后一个块,这意味着您的副本将包括修改后的最后一个块,但不包括第一个块。


+1:它不能回答问题,但这似乎是硬盘备份的一个好建议。
Marco Sulla 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.