Answers:
可能会发生三件事:
到目前为止,对于该理论。现在进行实际测试。
我在VM上安装了新的Ubuntu 12.10。(使用默认选项和10 GB虚拟磁盘的win7-x64上的VMware工作站)。
dd命令成功完成,我退回似乎正常的提示符。我可以输入新命令,尽管由于明显的原因它们会失败。
Segmentation fault
,您声称它已成功完成...?
从mmap
Linux上的页面:
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
调用中缓存。
我最近犯了一个错误。我打算将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正常关闭系统,没有错误。
因此,这不能完全回答您的问题,但会告诉您如果擦除磁盘的开头会发生什么。
磁盘上的大多数内容仍然可以恢复,但由于(希望)我关心的所有内容都已备份,因此我不会打扰。
它很可能不会完成,因为其他一些正在执行的组件将请求丢失的文件并使内核崩溃。如果您真的想将磁盘归零,请使用实时CD。否则,您将永远无法保证结果。