如何擦除硬盘驱动器

Joh*_*gan 5 c linux erase hard-drive

这是一个奇怪的问题,但在这里.我想写一个程序来闪存我的外部硬盘1s然后0s完全清理它所以我可以卖它.现在,为什么我要编写自己的软件而不是仅仅使用DBAN?

  1. 据我所知,DBAN删除了它检测到的所有硬盘.我只想清理我的外部.

  2. DBAN闪烁七次.我认为这对我的目的来说有点过分,因为我的外部不包含非法材料或信用卡信息.

  3. 说实话,我实际上对固件如何工作很好奇.

谷歌没有出现太多(愚蠢的Adobe Flash).我更喜欢在C/C++中这样做,但其他语言也适用,包括汇编.

Nik*_* C. 5

好吧,在C中做这件事很容易.首先,在写入模式下打开相应的设备文件:

int fd = open("/dev/sdc", O_WRONLY);
Run Code Online (Sandbox Code Playgroud)

你只需要write()512字节的块就可以了,直到你不能再写了.较新的磁盘使用4096字节扇区,但操作系统通常将它们视为具有512字节扇区,因此512是最安全的值.这是一个完成这个的C程序:

(注意:要非常小心选择正确的/ dev设备文件,否则你要擦除错误的磁盘!)

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(void)
{
    int fd = open("/dev/sdd", O_WRONLY);
    if (fd < 0) {
        fprintf(stderr, "Error opening device file.\n");
        return EXIT_FAILURE;
    }

    // Write 0's all over the disk, in chunks of 512 bytes.
    char* zeros = calloc(1, 512);
    ssize_t written, total = 0;
    do {
        total += written = write(fd, zeros, 512);
        printf("\rBytes written: %ld", total);
    } while (written == 512);
    printf("\nDone!\n");

    close(fd);
    free(zeros);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果你删除printf()它可能会加速,虽然看到进展发生时很酷.您可能还应该在结尾处执行其他错误检查(如果written为-1,则发生错误,您应该检查errno.)

请注意,由于缓存,程序在打印"完成"后可能会在结束时挂起一段时间.它并没有真正悬挂,只是写操作的缓存阻塞它,直到它们全部完成.