Linux中块设备挂载异常时,若内核已识别设备但udev未生成节点,可用mknod手动创建:先用lsblk或/sys/block/确认主次设备号,再执行sudo mknod /dev/vdb b 252 16并设置权限,最后验证fdisk -l或blkid是否可读;此为临时方案,应优先修复udev规则或virtio_blk模块加载问题。

在Linux中,当虚拟化环境(如KVM、QEMU或容器)中出现块设备挂载异常(例如宿主机识别到磁盘但客户机内无法访问 /dev/vdb 或 /dev/sdb),而 udev 未自动生成对应设备节点时,可使用 mknod 手动创建块设备节点。但需注意:这仅适用于内核已识别该设备、仅缺用户空间节点的场景;若设备根本未被探测(如未加载驱动、PCIe设备未绑定、virtio-blk未初始化),mknod 无效。
确认设备是否已被内核识别
在执行 mknod 前,必须验证目标设备确实存在于内核设备模型中:
- 运行
lsblk或cat /proc/partitions,查找目标设备名(如vdb、sdb)及其主/次设备号(MAJ:MIN) - 检查
/sys/block/下是否存在对应目录(如/sys/block/vdb/),存在即说明内核已注册该块设备 - 若
ls -l /sys/block/vdb/dev可读,其内容即为major:minor(如252:16),这是mknod的关键参数
使用 mknod 创建块设备节点
语法为:mknod [节点路径] b [主设备号] [次设备号]。常见示例:
- 创建
/dev/vdb(假设主设备号252、次设备号16):sudo mknod /dev/vdb b 252 16 - 创建分区节点(如
/dev/vdb1):sudo mknod /dev/vdb1 b 252 17(次设备号通常为主设备号+分区序号) - 设置正确权限与属组(通常需
root:disk,且可读写):sudo chown root:disk /dev/vdb && sudo chmod 660 /dev/vdb
验证与后续处理
创建后需立即验证可用性:
- 运行
file /dev/vdb应返回 “block special file” - 尝试
sudo fdisk -l /dev/vdb或sudo blkid /dev/vdb,确认能读取设备信息 - 若用于虚拟机磁盘,确保客户机内也同步创建(或由 udev 规则自动处理),否则挂载仍会失败
- 注意:手动创建的节点在重启后消失,如需持久化,应排查 udev 规则缺失或设备热插拔事件未触发的根本原因,而非依赖
mknod
替代方案与注意事项
mknod 是临时补救手段,生产环境应优先修复自动发现机制:
- 检查 udev 是否运行:
systemctl status systemd-udevd - 触发设备重扫描:
sudo udevadm trigger --subsystem-match=block,再执行sudo udevadm settle - 查看 udev 日志:
udevadm monitor --subsystem=block,确认设备事件是否发出 - 若为 virtio 设备,确认客户机内已加载
virtio_blk模块:lsmod | grep virtio_blk


















