29

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

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

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

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

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

4

3 回答 3

29

正如其他地方提到的,在 *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它的行为就好像它是一个块设备,但所有写入的信息都将存储在文件中。

于 2010-08-19T10:07:35.693 回答
11

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

于 2010-08-19T09:41:12.230 回答
8

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

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

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

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

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

于 2010-08-19T16:36:59.900 回答