如果我将零输入到 dd 所在的驱动器,会发生什么情况?

如果我将零输入到 dd 所在的驱动器,会发生什么情况?

如果 dd 命令最初位于 /dev/sda 上,此命令会dd if=/dev/zero of=/dev/sda bs=1M成功吗?这会完成吗?因为 dd 当时在内存中?

答案1

有三种情况可能会发生:

  1. 命令启动,运行直至完成,然后返回提示符。由于磁盘已被有效擦除,因此此后您无法执行太多操作,尽管您可能会幸运地使用一些 shell 内置命令。
  2. 命令启动。在某个时候,由于内存压力,它会被调出页面。通常这不是问题,因为它的部分内容可以从磁盘(未更改的数据)或交换中重新加载。但是,如果您只是擦除了这些内容,那么 dd 命令将部分失败,尽管会填满磁盘。
  3. 第三个选项来自 BSD。已安装磁盘上的 MBR 受到保护,不会被覆盖。即使您以 root 身份运行命令。有几十个 Linux 发行版,它们都略有不同。其中一些很可能模仿了这一点。


理论讲完了。现在进行实际测试。

我在虚拟机上安装了全新的 Ubuntu 12.10。(win7-x64 上的 VMware 工作站,使用默认选项和 10 GB 虚拟磁盘)。

dd 命令成功完成,我回到了看似可以正常工作的提示符。我可以输入新命令,但由于显而易见的原因,它们会失败。

擦除磁盘后的 Ubuntu VM 的屏幕截图

答案2

使用 Damn Small Linux 在虚拟机中快速试验表明,dd 命令确实按预期完成;程序最初加载到内存中运行,在此过程中反复加载可执行文件毫无意义。最终,dd 将退出并报告“设备上没有剩余空间”。

之后,操作系统乍一看似乎运行正常,但由于显而易见的原因,在第一个无法再执行的命令之后挂起并变得无响应。对硬盘内容的简单检查显示分区确实已被清零。

答案3

来自mmapLinux 页面:

MAP_SHARED Share this mapping.  Updates to the mapping are visible to other processes that map this  file,
           and  are  carried  through  to the underlying file.  The file may not actually be updated until
           msync(2) or munmap() is called.


MAP_PRIVATE
           Create a private copy-on-write mapping.  Updates to the mapping are not visible to other  pro‐
           cesses  mapping  the  same  file,  and  are  not carried through to the underlying file.  It is
           unspecified whether changes made to the file after the mmap() call are visible  in    mapped
           region.

内核通过对mmap函数的内部调用将可执行文件映射到内存。MAP_PRIVATE请求类型映射(查看fs/binfmt_elf.c内核源代码树)。

因此,它归结为以下行为mmap:文件中的更改或该文件所引用的底层块设备中的更改是否传播回已分页且存在的映射页面。

该页面基于 API 标准,而不是内核行为,因此是“未指定”。实际行为是,对文件的更改不会传播回已经存在的页面。当然,如果程序突然跳转到尚未分页的代码页面,并且擦除已经发生,那么它将获得一个全零的页面。

但是,很有可能,到擦除本身时dd,它已经调入了继续擦除循环所需的所有代码页。循环终止后,它可能会碰到一些不在当前页中的代码:比如,某个函数跨越了页边界,因此要到达返回指令,必须获取一个页。

但该页面也可能是从以前的dd调用缓存的。

答案4

我最近犯了一个错误。我本想将 2 GB 的 img 添加到 SD 卡上,但却错误地将其添加到了 sda 上dd if=rasberrypi.img of=/dev/sda。我意识到了自己的错误并取消了 dd,但那时已经写入了约 600MB(在已使用约 500GB 的磁盘上)。分区表已损坏。

桌面(内存为 10 GB 及以上,已使用数周)继续运行了几个小时,好像什么都没发生一样。设法将最近更改的重要文件放入 Dropbox,在 Chrome 中正常浏览。事实上,我可以按照我最初想要的方式将 dd 运行到 SD 卡,运行正常。

几个小时后,我的文件系统进入只读模式,随机程序开始死机。我通过 ssh 连接到许多其他系统,我可以继续使用这些会话,但创建新会话时出现错误,提示无法找到 ssh 程序。此时我可以在 chrome 中切换打开的选项卡,但选项卡的内容似乎“挂起”。如果我刷新,就会永远看到白屏。rsyslogd 由于某种原因占用了 100% 的 CPU(1 个核心),可能是它搞不清楚为什么无法将日志刷新到磁盘……也许吧。

我在 VLC 中打开(并暂停)了一个 350 MB 的视频,我仍然可以播放它,并跳转到视频的任何部分。可能是因为它是最近下载的。

我可以使用 GUI 正常关闭系统,没有错误。

因此,这并不能准确回答您的问题,但却告诉了如果您擦除磁盘的开头会发生什么。

磁盘上的大部分内容仍然可以恢复,但我不会费心,因为(希望)我关心的所有内容都已备份。

相关内容