标签: block-device

如何读/写块设备?

如何读/写块设备?我听说我像普通文件一样读/写,所以我设置了一个循环设备

sudo losetup /dev/loop4 ~/file
Run Code Online (Sandbox Code Playgroud)

然后我在文件上运行应用程序然后循环设备

sudo ./a.out file
sudo ./a.out /dev/loop4
Run Code Online (Sandbox Code Playgroud)

文件执行得很完美.循环设备读取0个字节.在这两种情况下,我得到FP == 3和off == 0.该文件正确获取字符串长度并打印字符串,而循环得到0并且不打印任何内容

如何读/写块设备?

#include <fcntl.h>
#include <cstdio>
#include <unistd.h>

int main(int argc, char *argv[]) {
    char str[1000];

    if(argc<2){
        printf("Error args\n");
        return 0;
    }

    int fp = open(argv[1], O_RDONLY);
    printf("FP=%d\n", fp);
    if(fp<=0) {
        perror("Error opening file");
        return(-1);
    }
    off_t off = lseek(fp, 0, SEEK_SET);
    ssize_t len = read(fp, str, sizeof str);
    str[len]=0;
    printf("%d, %d=%s\n", len, static_cast<int>(off), str);

    close(fp);
}
Run Code Online (Sandbox Code Playgroud)

c linux block-device

6
推荐指数
1
解决办法
2975
查看次数

内核块设备

我目前正在尝试实现一个(不是那个?)简单的内核块设备驱动程序.

我的灵感主要来自Linux设备驱动程序,第3版,这本书在2005年发布时已不再完全更新了.

无论如何,逻辑仍然存在,我从中学到了很多东西.然而,自2005年以来,许多事情都发生了变化,因此实例并不真

我找到了一个github存储库,其中应该更新示例以处理最近的内核,但我认为还有一些事情需要更新,因为我无法调整示例以使其在内核4.9.0运行

以下是我的模块的制作方法:

初始化时:

  • 将模块注册为块设备 register_blkdev
  • 分配设备数据缓冲区
  • 初始化自旋锁
  • 初始化请求队列
  • 配置请求队列
  • 分配gendisk结构
  • 填充gendisk结构
  • 使用创建磁盘 add_disk

然后我实现了一个函数来处理来自请求队列的请求事件,并处理块设备上的读写事件.

这是函数:(它受LLD-3rd的高度启发,经过一些修改以匹配当前的内核函数)

static void block_mod_request(struct request_queue *queue)
{
    printk(KERN_NOTICE "Entering request function\n");
    struct request *request;

    while(NULL != (request = blk_fetch_request(queue)))
    {
        blk_mod_t *self = request->rq_disk->private_data;
        // Check if request is a filesystem request (i.e. moves block of data)
        if(REQ_TYPE_FS != request->cmd_type)
        {
            // Close request with unsuccessful status
            printk(KERN_WARNING "Skip non-fs request\n");
            __blk_end_request_cur(request, …
Run Code Online (Sandbox Code Playgroud)

c linux linux-device-driver linux-kernel block-device

6
推荐指数
1
解决办法
661
查看次数

Ceph CSI (rbd.csi.ceph.com) 与 Ceph RBD (kubernetes.io/rbd)

我使用kubernetes v1.16.10Ceph 13.2.2 Mimic集群通过ceph -csi进行动态卷配置。

但后来我找到了ceph-rbd

Ceph RBD (kubernetes.io/rbd)

https://kubernetes.io/docs/concepts/storage/storage-classes/#ceph-rbd

根据:

Ceph CSI (rbd.csi.ceph.com)

https://docs.ceph.com/docs/master/rbd/rbd-kubernetes/#block-devices-and-kubernetes

您可以通过 ceph-csi 将 Ceph 块设备映像与 Kubernetes v1.13 及更高版本一起使用,该映像动态提供 RBD 映像以支持 Kubernetes 卷,并将这些 RBD 映像映射为工作节点上的块设备(可选择挂载包含在映像中的文件系统)运行引用 RBD 支持的卷的 pod。

那么……我应该使用哪一种?

优点缺点?

提前致谢。

provisioning block-device ceph kubernetes persistent-volumes

6
推荐指数
1
解决办法
365
查看次数

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

嘿嘿,

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

如果我想根据我从中获取内容的多个文件对自己的块设备进行编程,任何人都可以给我一个提示,告诉我要寻找什么吗?为了您的理解,我想说从 file1 中取出字节 1-500 和 1.000-3.000,从 file2 中取出字节 501-999 和字节 3.001 到 5.000,将它们作为组合块设备提供。我最喜欢的编程语言是 Python,我希望尽可能在用户空间中编写程序。

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

预先致谢并致以问候,雷纳

linux raid file block-device

5
推荐指数
1
解决办法
3096
查看次数

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

我正在研究Linux内核版本2.6.39.1,并正在开发一个块设备驱动程序.在这方面,我想将多个struct bios合并为一个struct request,然后将其添加到request_queue设备驱动程序进行处理,即 - scsi_request_fn().

我尝试使用->bi_next字段struct bio来链接struct bio我编写的多个s,从而创建一个struct bios 的链接列表.当我打电话submit_bio()提交生物块设备层的I/O, BUG_ON()是触发,因为代码预计bio->bi_nextNULL.

有没有办法在将几个struct bios struct request发送到较低层进行维护之前将它们链接成一个?

linux storage linux-device-driver linux-kernel block-device

5
推荐指数
1
解决办法
840
查看次数

无需安装即可阻止设备信息(在linux中)

我试图在Linux中用C++获取块设备的一些信息(特别是块大小).是否可以在不安装设备的情况下获得设备的块大小,并且可能无需查看动态文件(如中的那些/sys),但仅限系统调用.

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

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

linux block-device

5
推荐指数
1
解决办法
4533
查看次数

wait_for_completion为make_request中的submit_bio没有返回

我正在Linux内核和我的make_request例程中编写自定义块驱动程序,在写入时我需要在写入新数据之前读取bio的指定扇区(来自物理驱动器)的数据.我的下面的摘录展示了我想要完成的大部分内容,但无论出于何种原因,我都没有从wait_for_completion获得回报.一旦I/O执行到块设备.它在submit_bio之后挂起,永远不会继续.每隔120秒,我会得到一个堆栈转储和消息,说明任务是如何被阻止的.有任何想法吗?思考?

... in make_request ....

if(rw != READ){
    struct completion event;
    struct bio *biow = bio_alloc(GFP_NOIO, bio_segments(bio));
    biow->bi_bdev = bio->bi_bdev;
    biow->bi_sector = bio->sector;
    biow->bi_rw = READ_SYNC;
    biow->bi_vcnt = bio_segments(bio);
    biow->bi_size = bio->bi_size;
    init_completion(&event);
    biow->bi_private = &event;
    biow->bi_end_io = bi_complete;
    submit_bio(READ_SYNC, biow);
    wait_for_completion(&event);
    .... some more magic occurs here ....
}
generic_make_request(bio);
Run Code Online (Sandbox Code Playgroud)

kernel device-driver linux-device-driver linux-kernel block-device

5
推荐指数
1
解决办法
1028
查看次数

NodeJS:无法写入Windows 8块设备

我期待直接写入原始的Windows块设备.

我可以使用dd for windows成功完成此操作:

> dd.exe if=myData.dat of=\\.\PhysicalDrive1
Run Code Online (Sandbox Code Playgroud)

但是我无法使用NodeJS这样做.我以下列方式使用node-blockdevice:

var device = new BlockDevice({
  path: '\\\\.\\PhysicalDrive1',
  mode: 'w+',
  size: 512
});

device.write(0, myBuffer, callback);
Run Code Online (Sandbox Code Playgroud)

device.write 正确返回写入的字节数,但它实际上并没有向设备写入任何内容.

请注意,确切的代码工作成功地在Mac OS X(代\\\\.\\PhysicalDrive1/dev/diskN当然的):写入我的数据,我可以在Windows 8中查看它没有任何问题.

我究竟做错了什么?

我也尝试过:

  • 不转义反斜杠(\\.\PhysicalDrive1)但导致EINV错误.
  • 使用逻辑名称:\\\\.\\E:.
  • mountvol X: /D在尝试读/写之前卸载卷.

我可以正确地确认我想要写入的设备的ID:

wmic diskdrive list brief
Run Code Online (Sandbox Code Playgroud)

我也试着设置moders+.读取操作似乎有效,但保存的数据包含以下与故障相关的数据:

?X?MSDOS5.0?
??????:?)??xNO NAME    FAT32   3???{???|?V@?N?V@?A??U?r??U?u
??t?F?-?V@?s?????f??@f?????????Af??f??f?F?~u9?~*w3f?Ff??
                                                        ????,???}??|???t<?t   ??????}??}?????f`?~? fjfPSfh?B?V@???fXfXfXfX?3f;F?r??*f3?f?Nf????f??f???v??V@????
 ??fa?t???f@Iu??BOOTMGR
Disk error?
Press any key to restart
??U?% …
Run Code Online (Sandbox Code Playgroud)

windows node.js block-device

5
推荐指数
0
解决办法
294
查看次数

Linux块设备-寻找一个简单的例子

我正在尝试使用linux虚拟块设备,我的要求是在运行cat / dev / mydevice时必须返回我在内核程序中创建的一些字符串,(我不必写入任何数据来驱动,基本上创建了一个块设备可以帮助以了解阻止设备的工作原理)。

我尝试了此博客中提供的示例。但是一旦我运行cat / dev / sbd0,它将进入无限循环。而且我没有从块驱动程序中的任何方法获取任何日志来了解块驱动程序中的流程如何发生。

可以解释一下Linux内核中块设备中的流程如何发生吗?

我也尝试了Link +编辑器,但在Link +示例中仍然找不到任何示例块设备。我可以在网上看到很多sbd.c程序,但是由于与最新内核的库兼容性,大多数都没有编译(我是linux天真用户)。

我正在使用的内核在Ubuntu 16.04中为4.4

kernel block-device

5
推荐指数
0
解决办法
710
查看次数

从实例元数据端点检索正确的Amazon连接的EBS设备

编辑和TL; DR:

ubuntu@ip-172-31-19-77:~/.aws$ aws ec2 describe-instances | jq . | grep -i device
          "BlockDeviceMappings": [],
          "RootDeviceType": "ebs",
          "RootDeviceName": "/dev/sda1",
                "DeviceIndex": 0,
          "BlockDeviceMappings": [
              "DeviceName": "/dev/sda1",
              "DeviceName": "/dev/xvdb",
          "RootDeviceType": "ebs",
          "RootDeviceName": "/dev/sda1",
                "DeviceIndex": 0,
          "BlockDeviceMappings": [
              "DeviceName": "/dev/sda1",
          "RootDeviceType": "ebs",
          "RootDeviceName": "/dev/sda1",
                "DeviceIndex": 0,
          "BlockDeviceMappings": [
              "DeviceName": "/dev/xvda",
          "RootDeviceType": "ebs",
          "RootDeviceName": "/dev/xvda",
                "DeviceIndex": 0,
          "BlockDeviceMappings": [
              "DeviceName": "/dev/sda1",
              "DeviceName": "/dev/sdf",
          "RootDeviceType": "ebs",
          "RootDeviceName": "/dev/sda1",
ubuntu@ip-172-31-19-77:~/.aws$ aws ec2 describe-volumes | jq . | grep -i device
          "Device": "/dev/sda1"
          "Device": "/dev/sdf"
          "Device": "/dev/xvda" …
Run Code Online (Sandbox Code Playgroud)

amazon-ec2 amazon-web-services block-device

5
推荐指数
2
解决办法
1035
查看次数