在Ubuntu WSL的(micro)K8s环境下为Ceph创建适配的/dev/sd块设备
WSL2 环境下 MicroK8s 部署 Rook Ceph 的 OSD 存储适配指南
核心方案判定
直接把两个路径的可行性说透:
- 将Windows物理主机上自建的未格式化分区映射为WSL内的
/dev/sdX块设备的方案,完全不满足当前场景的运行要求,不可行 - 在WSL2环境内部基于虚拟磁盘创建独立无文件系统的块设备,是当前唯一能稳定跑通Rook Ceph OSD配置的方案
为什么映射Windows物理分区的路径走不通
WSL2的块设备机制有三个绕不开的硬性限制:
- 透传范围限制:WSL2目前仅支持将整盘格式的VHD/VHDX虚拟磁盘文件直通为WSL内的块设备节点,不支持将Windows物理磁盘上的单个独立分区(哪怕是未格式化状态)透传进WSL的设备命名空间。物理机上的未格式化分区默认被Windows卷管理器锁定,WSL侧没有权限直接读取块级数据。
- 性能不达标:就算通过手动直通整块物理磁盘的方式把设备映射进WSL,跨Windows内核的磁盘I/O会带来极高的随机写入延迟,远达不到Ceph OSD要求的亚毫秒级fsync性能阈值,会频繁触发OSD掉线,集群永远无法稳定运行。
- 扫描规则不匹配:日志里提到的被跳过的
/dev/sda、/dev/sdb带ext4文件系统的设备,本质就是WSL2为根文件系统分配的默认虚拟磁盘分区,本身带文件系统签名,Rook的默认存储扫描逻辑会自动排除这类带文件系统签名的设备,完全符合预期规则。
正确的WSL内部OSD存储配置步骤
结合日志里提到的loop、ram设备被跳过的问题,按步骤操作即可:
- 调整Rook的存储扫描规则:
Rook默认的UseAllDevices策略会自动排除所有loop、ram类型的虚拟设备,光靠默认扫描规则永远匹配不到后续创建的WSL内块设备。需要在CephCluster的自定义存储配置里打开两个开关:- 设置
ignoreLoopDevice: true,跳过对loop类型设备的排除逻辑 - 设置
minimumDeviceSize: "5GB",刚好匹配日志里的最低容量阈值,避免容量不达标被筛掉
- 设置
- 创建符合Rook要求的无文件系统块设备:
- 在WSL的临时虚拟文件系统目录(不要存在Windows挂载的
/mnt/c这类9p挂载路径下)创建OSD后端磁盘镜像,容量至少10GB,执行命令:truncate -s 10G /mnt/wsl/osd-ceph-0.img - 把镜像文件映射为独立的loop块设备,不创建任何分区、不格式化任何文件系统,执行命令:
losetup -fP /mnt/wsl/osd-ceph-0.img - 用
lsblk确认:刚映射的loop设备没有挂载点、没有文件系统签名、容量大于5GB,就满足Rook的OSD设备准入要求
- 在WSL的临时虚拟文件系统目录(不要存在Windows挂载的
- MicroK8s权限适配:
MicroK8s作为snap打包的容器运行时,默认的沙箱隔离规则会拦截容器对loop设备的访问,需要给Rook的OSD节点服务配置特权模式权限,不然就算扫到了设备,OSD Pod也会因为拿不到设备访问权限持续报错。
常见踩坑提醒
- 不要尝试把Windows侧的目录通过9p挂载映射成块设备,9p协议只支持文件级交互,不支持块级设备透传
- 不要误把带文件系统签名的设备指定为OSD后端,Rook会无提示擦除设备上的全部数据,一旦指定了WSL根文件系统对应的sda/sdb设备,会直接破坏WSL的系统文件
- 不要把OSD镜像存在Windows侧的挂载路径下(比如
/mnt/c/xxx.img),9p挂载的随机写入延迟会直接拖垮Ceph的性能
内容的提问来源于stack exchange,提问作者a11hard
相关产品推荐
相关产品推荐

