如果dd零到dd所在的驱动器会发生什么情况?


10

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

Answers:


40

可能会发生三件事:

  1. 该命令将启动,一直运行到完成,然后您将返回到提示符。由于磁盘已被有效擦除,因此您在此之后不能做很多事情,尽管您可能会幸运地获得一些shell内置命令。
  2. 命令启动。在某些时候,由于内存压力,该页面被调出。通常这不是问题,因为可以从swap的磁盘(未更改的数据)中重新加载其中的一部分。但是,如果仅擦除了这些内容,则尽管dd填充了磁盘,但dd命令将部分失败。
  3. 第三个选项来自BSD。保护已装载磁盘上的MBR不会被覆盖。即使您以root身份运行命令。有数十种Linux发行版,所有发行版都略有不同。他们中的某些人很有可能效仿这一点。


到目前为止,对于该理论。现在进行实际测试。

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

dd命令成功完成,我退回似乎正常的提示符。我可以输入新命令,尽管由于明显的原因它们会失败。

擦除磁盘后的Ubuntu VM屏幕快照


9
大+1进行实际测试!
Doug Harris

10
我看到了Segmentation fault,您声称它已成功完成...?
Alvin Wong

1
嗯 它使磁盘不可读。我认为那是目标。对于安全擦除,您确实应该尝试其他操作(例如安全擦除命令)。
Hennes 2013年

我得到的最好的答案之一。谢谢!
2013年

6

在使用Damn Small Linux的虚拟机中进行的快速实验表明,dd命令确实已按预期完成。该程序最初被加载到内存中运行,并且在此过程中一次又一次地加载可执行文件几乎没有意义。最终,dd将退出并报告“设备上没有剩余空间”。

此后,乍看之下,操作系统似乎可以正常运行,但是由于明显的原因,该命令无法执行,因此挂起,并且无响应。对硬盘驱动器内容的简短检查显示分区确实已归零。


4

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调用中缓存。


1

是。当然,这也会花费您大部分文件系统,但想必您已经知道...


0

我最近犯了一个错误。我打算将2 GB img dd放入SD卡,但误将其存入sda dd if=rasberrypi.img of=/dev/sda。意识到了我的错误并取消了dd,但是到那时,已经写入了约600MB(在使用了约500GB的磁盘上)。分区表被毁了。

台式机(具有10 GB的内存,最多可以使用数周)可以连续工作几个小时,好像什么也没发生。设法将最近更改的重要文件放入保管箱,通常在chrome中浏览。实际上,我可以按照我原先的要求将dd运行到SD卡,效果很好。

几个小时后,我的文件系统进入只读模式,并且随机程序开始死亡。我被驱赶到许多其他系统中,可以继续使用这些会话,但是进行新的会话时会出现错误,提示它找不到ssh程序。此时,我可以在chrome中切换打开的标签页,但是标签页的内容似乎已“挂起”。如果刷新,我将永远显示白屏。rsyslogd由于某种原因占用了100%的cpu(1个内核),可能是因为它无法将日志刷新到磁盘而感到困惑……也许。

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

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

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

磁盘上的大多数内容仍然可以恢复,但由于(希望)我关心的所有内容都已备份,因此我不会打扰。


-1

它很可能不会完成,因为其他一些正在执行的组件将请求丢失的文件并使内核崩溃。如果您真的想将磁盘归零,请使用实时CD。否则,您将永远无法保证结果。


2
请求丢失的文件不会使内核崩溃。如果这样做的话,如果机器只有一个不可靠的磁盘,它们将崩溃。
David Schwartz

@DAvid Schwartz,如果是这种情况,那么#rm -rf /实际上将删除整个文件系统。从实验中我知道并非如此。除非实施某种非标准的ramdisk技术,否则系统无法完全依靠ram长时间运行。
Frank Thomas

@FrankThomas:内核是否感到恐慌?
David Schwartz

是的,黑屏关闭。
Frank Thomas
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.