擦除硬盘时“验证写入”是啥意思?

Posted

技术标签:

【中文标题】擦除硬盘时“验证写入”是啥意思?【英文标题】:What means "Verifies the write" when erasing hdd's?擦除硬盘时“验证写入”是什么意思? 【发布时间】:2017-04-29 17:12:15 【问题描述】:

我正在查看一些用于(安全)擦除硬盘的代码。我注意到在查看不同方法(Infosec 5DoD 5220.22-M 等)时,我读到了“验证写入”。

例子:

https://www.lifewire.com/dod-5220-22-m-2625856

Pass 3:写入一个随机字符并验证写入

https://en.wikipedia.org/wiki/Infosec_Standard_5#cite_note-5

无论使用哪个级别,都需要验证以确保 覆盖成功。

我的问题是,它技术意味着什么?

    当你写入一个数据块时,你是否只检查写入的字节是否等于块的大小(似乎很快)?

    您是否回读您写入的块并比较(memcmp?)是否与写入的数据块完全相同?

    还有其他我忽略的解决方案吗?

这里有一些示例代码来说明我的问题。哪个解决方案会指示“写时验证”?如果您只检查返回值(来自write)可以您确定,只要匹配所有字节确实写入的块的长度?

// erasure example
// erasure single block, start from 0

// block size
unsigned long block_size = 512;

// data-block we will write
char block[block_size];

// zero the block
bzero(&block, block_size);

// open device
int fd = open('/dev/sdb', O_RDWR);   

// write 1st block
int bytes_written = write(fd, &block, block_size);  

// verify option: A
if (bytes_written == block_size) 
    // all good


// verify option B
// go back the number of bytes-wtitten from the current pos.
lseek(fd, -1 * bytes_written);
// read the same number of bytes
int bytes_read = read(fd, &block, bytes_written);  

// should be same
if (bytes_read == bytes_written) 
    // here code to check i block indeed contains zero's    
    // use memcmp ?

【问题讨论】:

【参考方案1】:

擦除硬盘时“验证写入”是什么意思?

来自Here

write(...) 函数尝试将 nbytes 从缓冲区写入 与句柄关联的文件。在文本文件上,它将每个 LF 扩展为 CR/LF。

函数返回写入文件的字节数。回报 值为 -1 表示错误,并适当设置了 errno。

所以在你的例子中,int bytes_written = write(fd, &block, block_size); bytes_written 的值,如果等于块大小,验证块的所有内存位置都已写入。

并回答您的其他问题:

(1) 始终检查非 void 函数的返回值,并且通过简单地比较两个 int 值没有明显的效率或速度损失。您甚至可以一步完成,但我不确定这是否会提高效率(查看程序集以确认)。所以而不是:

// verify option: A if (bytes_written == block_size) // all good //可以在同一行进行比较:

if(write(fd, &block, block_size) == block_size) // all good

(2) 可选。它提供了一个额外的验证内存块包含新的内容。

您可以在 this Linux man page 中找到关于 write() 的更详细说明。

【讨论】:

谢谢,我的意思是,返回值(如果 block_size == write(...))是否符合擦除规范的要求。 @Rogier - 是的,任何一种方法,if(block_size == write(...))if(bytes_written == block_size) 都清楚地表明 (validation) 已经进行了 更改 .诸如memcmp(...) 之类的其他步骤只会提供额外的验证,并且对于您的目的是完全可选的,IMO。我已经修改了我的答案,试图让这些想法更清楚。 @Rogier - 我很好奇你的头像是Thunder Mustang,还是一架完整的二战飞机? 我不确定,我在某个地方捡到了它:o 我认为它是 P51(完整)。我确实有我的 PPL。 P51 在我的遗愿清单上!你飞了一个实验/套件? @Rogier - 酷。是的,我愿意。刚卖了一辆塞斯纳,想购买一辆部分建造的 RV-8。

以上是关于擦除硬盘时“验证写入”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

vivo手机的QxdmLog是啥意思?

硬盘4K对齐是啥意思?具体该怎么做?

睡眠 休眠 关闭硬盘 分别是啥意思?

erasure是啥意思

unknown error是啥意思

硬盘阵列模式RAID 0,RAID 1,RAID 5,RAID 10是啥意思?