如何通过块设备打开文件

时间:2013-12-20 20:22:19

标签: c linux file-io io

this article开始,它会比较常规文件系统上的写入:

fd = open("/media/mount1/file", O_SYNC);

写入块设备:

fd = open("/dev/sda", O_SYNC)

如何通过块设备在HDD内打开相同的file

4 个答案:

答案 0 :(得分:2)

本文不会通过文件系统将文件写入文件与通过对块设备的原始访问写入同一文件进行比较,而是比较一些因素,例如write操作时的数据完整性和速度使用文件系统在常规文件中执行,而对块设备执行write。它不会使用这两种方法打开同一个文件。事实上,编写常规文件与写入块设备的方式不同。这就是Linux公开设备的方式,它允许相同的系统调用使用相同的语义,但使用不同的设备。 fprintf()打印到控制台,打印机,串行端口或文件的方式大致相同:相同的功能,相同的语义,只有一个参数指定目的地。

正如文章所示,通过文件系统的write操作通常更快(对用户而言),因为系统调用在执行实际写入磁盘之前返回。这意味着存在(通常很小的)时间量,其中计划写入的内容尚未写入,因此电力短缺可能导致数据丢失。另一方面,对块设备的写入可确保数据完整性,因此,在将数据实际写入磁盘(或该磁盘的高速缓存)后,系统调用将返回

答案 1 :(得分:0)

Linux中的块设备使您可以访问设备上的原始字节,而无需文件系统转换。

要访问块设备的字节流内的文件,您必须在程序中实现文件系统本身的逻辑,即使是部分实现。

所以,排序的答案是,如果你不得不问这个问题,那是不可能的: - )

即使某些文件系统具有简单的逻辑(想想FAT 32),你也无法在用户空间上获得模拟FS逻辑的任何东西。

例外情况是,您的应用程序将使用自定义数据结构组织块设备本身的数据,而不是依赖于任何文件系统(某些RDBMS的高性能配置方案会执行此类操作)。但这不是你的情况。

答案 2 :(得分:0)

使用用户空间文件系统。这是GNU Hurd(永远未完成)和QNX使用的微内核操作系统方法的基础。它也可用作Linux的保险丝,例如熔丝NTFS。

答案 3 :(得分:0)

您问题的直接答案是“您无法通过块设备界面直接打开相同的文件。”

声明“文件的O_SYNC不保证数据对存储设备的非易失性存储介质的承诺”没有任何限定条件的说法是可疑的。存储设备可以采用或者可以被配置为采用直写高速缓存并且仅在实际提交给物理介质时指示写入的完成。此外,OS(取决于文件系统)可以通过显式调用存储驱动器的cache-flush命令来实现O_SYNC选项。

存在存储设备,尤其是那些由NAND闪存支持的存储设备,例如人们通常称之为“USB密钥”或SD卡的存储设备,它们抵制任何实现事务的尝试(即,他们声称支持缓存刷新命令但在数据实际提交之前返回)但磁盘支持的系统应该可以配置,以便文件上的O_SYNC(与块设备相比)保证对物理介质的承诺。