如何为自定义device mapper target设置指定扇区大小?
自定义Device Mapper Target设置4K扇区大小的方法
你在用户态libdevmapper、cryptsetup源码中找不到对应配置逻辑是正常的:扇区大小的设置逻辑在内核侧的DM Target实现代码中,用户态工具仅负责传递块大小参数给内核,不做实际配置。
具体实现步骤如下:
- 在内核Target的
.ctr(构造)回调函数中调用块设备队列配置接口或者DM封装接口设置扇区参数,参考代码如下:
// 方法1:使用DM封装的通用接口,直接对当前target对应的设备设置块大小 dm_set_block_size(ti, 4096); // 方法2:直接操作块设备队列,可更精细控制各参数 struct request_queue *q = bdev_get_queue(你的底层块设备的bdev指针); blk_queue_logical_block_size(q, 4096); // 逻辑扇区大小 blk_queue_physical_block_size(q, 4096); // 物理扇区大小 blk_queue_io_min(q, 4096); // 最小I/O大小 blk_queue_io_opt(q, 4096); // 最优I/O大小
- 同步修改Target的I/O处理逻辑:所有下发到该Target的bio请求必须满足4K对齐要求,你需要在
.map回调中处理非对齐的I/O(拆分/补全/直接返回错误),否则会触发内核I/O异常。 - 创建设备时的参数注意:
dmsetup create命令中指定的设备长度单位固定为512字节,和你设置的扇区大小无关,只要保证总长度是4096的整数倍即可。 - 验证修改:重新编译加载你的Target内核模块,删除原有映射设备后重新创建,执行
fdisk -l即可看到扇区大小已更新为4096字节。
dm-verity的对应逻辑也在内核源码的drivers/md/dm-verity.c的verity_ctr函数中,它会读取verity超级块中的块大小配置,调用上述接口完成扇区大小设置。
内容的提问来源于stack exchange,提问作者Durgod
相关产品推荐
相关产品推荐

