问题标签 [block-device]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4706 浏览

windows - 如何在 Windows 中创建“块设备”

对于熟悉 Linux 的人来说,可以创建一个模块并将其注册为块设备。这允许用户将其安装为普通磁盘(而所有块 I/O 都由模块处理,例如 USB 大容量存储)。

有没有办法在 Windows 中做到这一点?(需要创建一个Windows可挂载的卷。原始数据将来自专有接口)。

0 投票
2 回答
1916 浏览

c - 使用块特殊文件/设备来实现文件系统

我已经使用 FUSE 实现了一个基本的文件系统,实现了所有可预见的 POSIX 功能[当然我什至还没有分析过;)]。目前我能够在常规文件上运行文件系统(st_mode & S_IFREG),但下一步开发是将其托管在实际的块设备上。按原样运行我的代码,st_size在调用fstat设备后立即读取失败。当然,我不希望问题就此止步:

  • 与常规文件相比,在块设备上操作需要哪些更改?
  • 关于性能、限制、特殊功能等,我需要做哪些特别考虑?
  • 是否有处理块特殊文件的教程和参考资料?谷歌搜索几乎没有用处。我只有背景知识(讽刺的是,在我黑暗的过去来自 MSDN)和联机帮助页中的一些少量信息。

更新0

  • 我已经指出了“常规文件”的含义。
  • 我不想专注于获取设备大小,我想要常规文件和设备文件在性能和使用方面的差异的一般准则。
0 投票
2 回答
2637 浏览

linux - 在 Linux 中编写由多个文件组成的环回设备

嘿嘿,

losetup在 Linux中使用文件来模拟块设备相对容易:

如果我想根据我从中获取内容的几个文件对自己的块设备进行编程,谁能给我一个提示?为了您的理解,我想假设从 file1 中获取字节 1-500 和 1.000-3.000,从 file2 中获取字节 501-999 和字节 3.001 到 5.000,以将它们作为组合块设备提供。我最喜欢的编程语言是 Python,我想尽可能在​​用户空间中编写我的程序。

对于 Windows,我找到了这样的实现。它被称为 FileDisk 和 HttpDisk,可以在这里找到:

在此先感谢和问候,雷纳

0 投票
4 回答
5203 浏览

linux - 文件级 USB 大容量存储

挑战:我有一个 Linux 手持设备,它记录数据并将其存储到磁盘中。它应该通过 USB 与 Windows 应用程序交换这些数据。当用户可以访问此数据时(例如通过 USB 大容量存储),必须对其进行加密。它应该开箱即用,适用于各种操作系统,也适用于 citrix 终端会话等。

计划:我使用FUSE在用户空间创建一个文件系统,并通过大容量存储将其提供给 Windows。每当 Windows 访问一个文件时,我都会收到一个回调并即时加密数据。此外,我们可以有一些动态内容——例如,当一些密码被写入文件时,会显示更多内容。

问题:当使用大容量存储小工具(例如g_file_storage)时,它只接受文件或块设备 - 但不接受文件系统(目录)。为什么?

[...] 它提供了一个简单的接口来读取和写入数据扇区——很像用于访问任何硬盘驱动器的低级接口 [...]。操作系统可能会将 USB 驱动器视为硬盘驱动器,并且可以使用它们喜欢的任何文件系统对其进行格式化。(来自维基百科

所以没有机会通过大容量存储来拥有动态文件系统......这似乎是为什么我的安卓手机在连接到 PC 时会卸载手机上的所有数据的原因。

选项

  • 在用户空间中创建一个“块设备” - 类似于 FUSE(当我想动态提供文件时,需要一个反向 FAT 驱动程序)
  • 实现我自己的 nbd-server 以创建块设备(还需要反向 FAT 驱动程序吗?)
  • 我将加密文件保存到一个分区,并将这个分区传递给大容量存储小工具(问题是性能和缺乏动态交互)
  • 不要提供大容量存储设备并注意其他想法(eth over USB)

目前,只有最后一个选项似乎是现实的 - 或者你有另一个提示给我吗?

我将感激不尽!

查理

0 投票
2 回答
920 浏览

linux - 如何将多个 struct BIO 组合成一个 struct 请求?

我正在开发 Linux 内核版本 2.6.39.1,并且正在开发块设备驱动程序。对此,我想将多个struct bios 组合成一个 s struct request,然后request_queue由设备驱动添加到进行处理,即 -- scsi_request_fn()

我尝试使用->bi_nextof 字段struct bio来链接struct bio我已经组成的多个 s,从而创建了一个 s 的链表struct bio。当我打电话submit_bio()向 I/O 的块设备层提交 bio 时, BUG_ON()会被触发,因为代码期望bio->bi_nextNULL.

有没有办法在将几个s发送到较低层进行服务之前将其链接struct bio成一个?struct request

0 投票
2 回答
3917 浏览

linux - 如何识别 linux 块设备的请求队列

我正在研究通过网络连接硬盘的驱动程序。有一个错误,如果我在计算机上启用两个或更多硬盘,则只有第一个硬盘才能查看和识别分区。结果是,如果我在 hda 上有 1 个分区,在 hdb 上有 1 个分区,只要我连接 hda,就会有一个可以挂载的分区。所以 hda1 一安装就得到一个 blkid xyz123 。但是当我继续安装 hdb1 时,它也出现了相同的 blkid,事实上,驱动程序是从 hda 读取它,而不是 hdb。

所以我想我找到了司机搞砸的地方。下面是一个调试输出,包括一个 dump_stack,我把它放在第一个似乎访问错误设备的地方。

这是代码部分:

这是一个日志输出。我添加了一些评论,以帮助了解正在发生的事情以及糟糕的电话似乎出现在哪里。

我希望这是足够的背景信息。也许此时一个明显的问题是“request_queues 分配的时间和地点?”

好吧,这是在 add_disk 函数之前处理的。添加磁盘,是日志输出的第一行。

据我所知,这是标准操作。所以回到我原来的问题。我可以在某处找到请求队列并确保它对于每个新设备都是递增的或唯一的,或者 Linux 内核是否只为每个主要编号使用一个队列?我想了解为什么这个驱动程序在两个不同的块存储上加载相同的队列,并确定这是否导致在初始注册过程中出现重复的 blkid。

感谢您为我查看这种情况。

0 投票
1 回答
2524 浏览

c - Concurrent writes to a file using multiple threads

I have a userlevel program which opens a file using the flags O_WRONLY|O_SYNC. The program creates 256 threads which attempt to write 256 or more bytes of data each to the file. I want to have a total of 1280000 requests, making it a total of about 300 MB of data. The program ends once 1280000 requests have been completed.

I use pthread_spin_trylock() to increment a variable which keeps track of the number of requests that have been completed. To ensure that each thread writes to a unique offset, I use pwrite() and calculate the offset as a function of the number of requests that have been written already. Hence, I don't use any mutex when actually writing to the file (does this approach ensure data integrity?)

When I check the average time for which the pwrite() call was blocked and the corresponding numbers (i.e., the average Q2C times -- which is the measure of the times for the complete life cycle of BIOs) as found using blktrace, I find that there is a significant difference. In fact, the average completion time for a given BIO is much greater than the average latency of a pwrite() call. What is the reason behind this discrepancy? Shouldn't these numbers be similar since O_SYNC ensures that the data is actually written to the physical medium before returning?

0 投票
2 回答
1054 浏览

c - 按设备名称获取设备标志

希望你能帮助我:我正在尝试确定设备是否可移动,我所拥有的只是设备名称(/dev/sdc)。实际上,我需要通过该文件的完整路径来确定该文件何时在可移动媒体或本地磁盘上。

我尝试在 current->fs->pwd中搜索,但 我只能在这里找到一组标志:*current->fs->pwd.mnt->mnt_sb->s_bdev->bd_disk->flags*其中 GENHD_FL_REMOVABLE 设置为可移动设备

但是我总是设置相同的标志(据我所知,s_bdev 总是指向同一个设备(/dev/sda))。

所以现在我通过解析 mtab 获得了包含我的文件的设备名称(/dev/sdc),但仍然无法找到,是否可以删除它。

是否有可能通过设备名称获取 block_device 结构?(例如,可以通过调用 fd = open("name") fl = fged(fd) 获得“file”结构,其中 fl 指向“file”结构)

0 投票
1 回答
892 浏览

windows - ec2 块设备映射列表和 Windows 驱动器之间的映射

ec2 块设备映射列表和 Windows 驱动器之间的映射是如何发生的?

例如,如果我指定-b "/dev/sdb=snap-XXXXXXX" -b "/dev/sdc=ephemeral0"

在启动 Windows 实例时,它将 D:\ 映射到 EBS 卷快照,并将 E:\ 映射到临时存储。当我以相反的顺序指定映射时,它也是如此。想知道这种映射在 Windows 驱动器上是如何发生的吗?知道临时存储映射到哪个驱动器对我来说实际上很重要,因为我需要在实例启动后在其中存储一些东西。

谢谢!

0 投票
2 回答
5508 浏览

linux - 在 Linux 中不挂载的块设备信息

我正在尝试在 C++ 中获取 linux 中块设备的一些信息(特别是块大小)。是否可以在不安装设备并且可能不查看动态文件(如 中的文件/sys)的情况下获取设备的块大小,但仅使用系统调用。

我正在尝试使用,但如果我询问stat它,它会返回有关文件系统的数据。/dev/dev/sdb2

如果系统调用不可能,我应该在哪里查看动态文件(也无法找到它。)