问题标签 [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 投票
1 回答
297 浏览

linux - 在 Linux 上使用 libaio 发送 FUA 请求

我正在尝试使用 libaio 访问块设备(例如 /dev/sdb)。我工作正常,但我想知道如何使用 libaio 的 API 执行 FUA(强制单元访问)。

我必须说我在该主题上找到的文档很差,希望你们中的一个能够帮助我。

0 投票
2 回答
1095 浏览

linux-device-driver - Linux内核:如何从分区磁盘获取整个磁盘的dev_t?

鉴于磁盘上的分区,我想检索dev_t整个磁盘的结构。这是给blkext司机的,比如nvme.

就像是:

我希望我的界面get_whole_disk_dev_t()是:

参数dev_t::part_disk
返回dev_t::whole_disk

我提出的算法:

  1. dev_t从即“/dev/nvme1n1p3”获取分区磁盘的路径。我找不到任何 API 来获取路径dev_t
  2. 做一些字符串操作来删除“p3”,给出整个磁盘的路径
  3. 传递整个磁盘的 path_nameblk_lookup_devt以获取整个磁盘的路径dev_t
    IEwhole_disk=blk_lookup_devt(path_name,0)

这是正确的方法还是有更好的方法?如果是前者,那么我该如何获取路径dev_t

PS:我需要在设备驱动程序中实现它(即在内核上下文中)。在用户空间中,我知道我可以使用udevAPI。

0 投票
2 回答
6840 浏览

cygwin - Cygwin 相当于 Linux /dev/sda、/dev/sdb 等

在 Linux 上,我可以通过 /dev/sdX 访问硬盘。这会忽略任何分区表、文件系统等,而只是逐块访问驱动器。Cygwin 中的等价物是什么?我已经搜索了谷歌,但找不到任何有效的东西。

我希望能够(例如)使用类似的东西创建闪存驱动器的图像

我知道有 Windows 程序可以读取和写入硬盘驱动器图像。dd 命令只是一个说明性的例子。我不是在创建驱动器映像之后。我在设备名称之后。

0 投票
1 回答
268 浏览

python - 将 Windows CDROM 驱动器视为块文件?

我正在尝试使用 Python 模块(确切地说是python-dvdvideo)来克隆 ISO 映像。如果我将文件路径传递给我计算机上已经存在的 ISO 文件,则提供的类可以正常工作,但如果我尝试将我的 CDROM 驱动器的驱动器号传递给它,则会引发异常。

在快速检查库的代码后,我确定该类需要一个常规文件或一个块特殊设备文件,如下所示:

这引出了我的问题:有没有办法将 Windows CDROM 驱动器视为其中之一?我对 Linux 在这方面的工作方式有点熟悉(它将 CDROM 驱动器视为 /dev/* 下的块设备文件),但不熟悉 Windows 如何看待驱动器。

0 投票
1 回答
2564 浏览

android - Android:在启动时挂载不同的用户数据分区

在我的三星 Note 10.1 上,我希望能够挂载不同的用户数据分区。我的目标是通过修改init.rc脚本在启动时实现这一点,因为这似乎是设置所有文件系统并挂载用户数据、系统等分区。例如,有一行mkdir /data 0771 system system,在我听来好像它为 userdata 分区设置了挂载点。userdata 分区对应块设备/dev/block/mmcblk0p12

现在,我想要的不是安装,而是mmcblk0p12安装一个图像mmcblk0p12,我已将其放置在插入设备的 µSD 卡上。µSD 卡可通过块设备访问/dev/block/vold/179:17。这意味着我首先需要安装 µSD 卡,然后是 µSD 卡上的映像。

但这是我失败的地方。我不知道如何在 中安装 µSD 卡,init.rc更不用说之后如何安装映像了。我已经mount -t ext4 /dev/block/vold/179\:17 /mnt/extSdCard多次添加该行,但它给我的只是一个引导循环。

那么,有谁知道如何做到这一点?

EDIT1:显然分区安装在fstab.sdmk4x12,所以我添加了行/dev/block/vold/179\:17 /mnt/extSdCard ext 4 noatime,nosuid,nodev,discard,noauto_da_alloc,journal_async_commit,erros=panic wait,check。不幸的是,这不起作用,但内核日志给了我Cannot mount filesystem on /dev/block/vold/179\:17 at /mnt/extSdCard.

EDIT2:愚蠢的我不使用/dev/block/mmcblk1p1,这是μSD卡的分区。这样,我现在可以通过修改fstab.sdmk4x12文件来安装 µSD 卡。

EDIT3:在我能够挂载μSD卡之后,如何挂载图像的问题仍然存在。我已经修改了挂载 userdata 分区的行。该行与 EDIT1+2 中的行相同,但使用图像/storage/extSdCard/userdata.img将其挂载到/data. 但我想它显然无法安装图像。设备启动,但显示一些错误,说明用户数据分区已损坏。它还为我提供了重置它的选项,但当然这只会影响 userdata 分区,并且一旦我重新启动,它就会尝试再次挂载我的映像,失败并再次向我显示此错误。

0 投票
2 回答
1880 浏览

linux-kernel - blockdev --flushbufs 是否可靠地同步到磁盘?

blockdev --flushbufs /dev/mmcblk0p1在我们的一个 shell 脚本中使用。

我假设它与原始块设备访问的同步具有相同的效果。

blockdev --flushbufs我想知道在该设备的所有延迟写入结束时假设是否安全?

(手册页提到了 ioctls,所以我认为它应该是阻塞的?)

0 投票
1 回答
451 浏览

c - Linux 块设备驱动程序请求排序 - Raw?

我正在编写一个 Linux 块设备驱动程序,它通过注册的函数接收请求blk_init_queue()

我的硬件设备对请求重新排序,因此为了避免读写冲突,需要write(lba x)在发出之前等待完成read(lba x)

我的问题:Linux 块层是否会跟踪 RaW 冲突,并且在收到前一个的请求完成(通过)之前它不会发出,还是我必须在我的驱动程序中这样做?read(lba x)__blk_end_request_all(req r)write(lba x)

0 投票
2 回答
12691 浏览

performance - 为什么在我的实验中 virtio-scsi 比 virtio-blk 慢得多(over and ceph rbd image)?

嗨,我最近通过 qemu 目标做了一个 virtio-scsi over rbd 的实验(为了它的 DISCARD/TRIM 支持),并将吞吐量和 iops 与同一台机器上的 rbd 设置的 virtio-blk 的吞吐量和 iops 进行比较,在客户机中使用 fio . 结果顺序读写的吞吐量小 7 倍(42.3MB/s vs 309MB/s),随机读写的 iops 小 10 倍(546 vs 5705)。

我所做的是使用 OpenStack Juno 设置虚拟机,它为我提供了 virtio-blk over rbd 设置。然后我修改了libvirt configure xml中的相关部分,从这里:

对此:

软件版本为:

qem 2.5.1

libvirt 1.2.2

内核3.18.0-031800-generic #201412071935 SMP Mon Dec 8 00:36:34 UTC 2014 x86_64(Ubuntu 14.04 内核)

管理程序是 KVM。

我认为 virtio-scsi 和 virtio-blk 之间的性能差异可能不会那么大。所以请指出我做错了什么,以及如何达到合理的表现。

一个限制是我想要一个适用于 OpenStack 的解决方案(如果适用于 Juno 则理想),而无需大量修补或编码。例如,我听说过 virtio-scsi + vhost-scsi + scsi-mq,但现在在 OpenStack 中似乎不可用。

0 投票
1 回答
238 浏览

linux - 在 Windows docker 工具箱上阻止设备访问

docker安装了我的机器

  1. ubuntu 12.04(MAC 上的虚拟机)
  2. Windows 7(本机)

和 Docker 图像如下..

ubuntu 12.04 基础 docker 镜像

当我在 Ubuntu 12.04 上运行 Docker 映像并插入 Micro SD 卡时,Docker 映像可以访问此块设备。

Docker 映像执行命令为 ...

docker run --privileged -i -t --cidfile ${ID_FILE} $1

并输入 lsblk 命令(在 docker 图像上)结果为 ..

root@4373a704da4a:/# lsblk

名称 MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sda 8:0 0 64G 0 磁盘

|-sda1 8:1 0 63G 0 部分

|-sda2 8:2 0 1K 0 部分

`-sda5 8:5 0 1022M 0 部分 [交换]

sdb 8:16 1 3.8G 0 磁盘

`-sdb1 8:17 1 3.8G 0 部分

sr0 11:0 1 1024M 0 只读存储器

sr1 11:1 1 1024M 0 只读存储器

sdb 是微型 SD 卡。

但是当我在 Windows docker 工具箱(上图相同)上厌倦了这个时,sd 卡不会出现。

Windows 7和docker工具箱执行的docker镜像可以访问块设备吗?

谢谢你。

0 投票
0 回答
47 浏览

linux-kernel - 用于协议特定驱动程序的块层开关

我正在学习神秘​​的块层,我尝试挂钩到generic_make_request函数并查看请求属于哪个块设备。

就我而言,我有一个 /dev/sda scsi 设备,我可以看到方向 READ | WRITE 以及请求的其他详细信息。

我现在想更深入地研究这个块请求,关于内核如何决定哪个设备特定的驱动程序应该处理一个请求。

例如,如果我有 2 个设备一个 scsi 和一个 IDE,我将有 2 个块设备,/dev/sda 和 /dev/hd0。

从通用块层切换到设备或协议特定层(scsi.c 和 ide.c)的确切位置,使用什么信息。