【问题标题】:Direct access to hard disk with no FS from C program on LinuxLinux下C程序直接访问无FS硬盘
【发布时间】:2011-04-01 00:45:49
【问题描述】:

我想直接从 C 程序访问整个硬盘。上面没有 FS,也永远不会成为一个。

我只想打开 /dev/sda(例如)并在磁盘的块/扇区级别执行 I/O。

我打算写一些程序来学习Linux环境下的C编程(我知道C语言、Python、Perl和Java),但对Linux环境缺乏信心。

出于学习目的,我正在考虑使用kyoto-cabinet并将与计算出的哈希对应的值直接保存到硬盘的“块/扇区”中,记录对:“哈希,块/扇区引用" 到一个京都内阁哈希数据库文件中。

我不知道使用标准 C I/O 函数是否可行,否则我必须编写“设备驱动程序”或类似的东西......

【问题讨论】:

    标签: c linux hard-drive


    【解决方案1】:

    由于驱动器的设备文件(例如/dev/sda)是块设备,这意味着您可以像普通文件一样打开、查找和使用该文件。

    【讨论】:

      【解决方案2】:

      正如在其他地方提到的,在 *NIX 系统下,像 /dev/sda 这样的块设备可以作为普通文件访问。请注意,如果文件系统是从设备上挂载的,则将其作为文件打开以进行写入将失败。

      如果你想玩块设备,我建议首先使用loop device,它将一个普通文件作为块设备呈现。例如:

      dd if=/dev/zero of=./loop_file_10MB bs=1024 count=10K
      losetup /dev/loop0 $PWD/loop_file_10MB
      

      之后,/dev/loop0 的行为就好像它是一个块设备,但所有写入的信息都将存储在文件中。

      【讨论】:

      • 感谢大家的快速回答。我先用循环设备试一试。
      【解决方案3】:

      是的,正如其他人所说,您可以简单地打开块设备。

      但是,在块边界和整个块上执行 IO(无论如何都写)是一个非常好的主意。您可以使用 pread() 和 pwrite() 之类的东西来执行这些 IO,或者 mmap 部分或全部设备。

      有很多 ioctl 可以使用,更多信息请参见“man sd”。它们似乎并没有全部记录在同一个地方。

      在 linux/fs.h 中定义了 BLKROSET 和一堆其他的 ioctl,你必须四处看看如何使用它们。你可以做一些有用的事情,比如找出设备有多大,块大小是多少。

      util-linux-ng 包的源代码是你的朋友,它包含示例。

      【讨论】:

        猜你喜欢
        • 2010-11-01
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 2015-02-01
        • 1970-01-01
        • 2011-04-12
        • 2012-03-27
        • 2010-11-26
        相关资源
        最近更新 更多