根文件系统挂载在NVMe设备上时,如何正确绑定SPDK驱动?
根文件系统挂载在NVMe设备上时,如何正确绑定SPDK驱动?
兄弟,你的核心问题出在根本没法卸载根文件系统啊!你想想,当前的shell、systemd还有一大堆系统进程都依赖着根目录/,就算你执行了umount /,实际上系统也不会真正卸载它——设备依然被内核占用着,SPDK自然没法绑定成功。而且你强行操作后出现的设备改名、文件系统只读,都是内核检测到设备异常后的保护机制,只能重启恢复。
给你几个可行的解决方案,按操作复杂度排序:
方案一:利用NVMe的空闲空间创建独立命名空间(推荐)
你的NVMe有1.5T,根LV只用到200G,剩下的空间完全可以单独划出来给SPDK用,不用动现有系统。步骤如下:
- 先安装NVMe管理工具:
sudo apt install nvme-cli - 查看当前设备的命名空间:
你会看到默认的命名空间sudo nvme list-ns /dev/nvme0nsid=1,对应nvme0n1(就是你装系统的那个)。 - 创建新的命名空间(比如1T大小,按自己需求调整):
先算好扇区数——假设你的NVMe扇区是512B,1T就是1024*1024*1024*1024 / 512 = 1953125000个扇区。执行命令:sudo nvme create-ns /dev/nvme0 --size=1953125000 --cap=1953125000 - 把新命名空间挂载到控制器:
执行完上一步会返回新的nsid(比如2),然后执行:sudo nvme attach-ns /dev/nvme0 -n 2 - 此时系统会出现新的设备
nvme0n2,确认它没有被挂载(lsblk看它下面没有挂载点)。 - 最后用SPDK的脚本绑定这个独立的命名空间:
(如果你的SPDK用的是uio驱动,把sudo ./scripts/setup.sh bind -b vfio-pci /dev/nvme0n2vfio-pci换成uio_pci_generic就行)
这样操作完全不会影响你的根文件系统,SPDK只操作新的nvme0n2设备,测试完想恢复的话,直接解绑并删除命名空间就行:
sudo ./scripts/setup.sh reset /dev/nvme0n2 sudo nvme detach-ns /dev/nvme0 -n 2 sudo nvme delete-ns /dev/nvme0 -n 2
方案二:用Live USB/CD启动系统
如果你需要测试SPDK对整个NVMe设备的完整功能,可以用Ubuntu Live USB启动系统——此时系统运行在内存里,原来的NVMe设备完全空闲,没有任何挂载的文件系统。
启动后直接安装SPDK依赖、编译SPDK,然后用setup.sh绑定整个/dev/nvme0控制器就行,测试完成后重启回到自己的系统,一切都不会变。
方案三:迁移根文件系统到其他磁盘
如果长期需要用SPDK独占这个NVMe设备,最彻底的办法是把根文件系统迁移到其他磁盘(比如SATA SSD或者机械硬盘),这样整个NVMe设备就可以完全交给SPDK使用,不用再担心分区或命名空间的问题。
避坑提醒
绝对不要尝试绑定正在使用根文件系统的NVMe控制器!一旦你把/dev/nvme0整个绑定给SPDK,内核会立即失去对根分区的访问,系统直接崩溃,只能硬重启。
备注:内容来源于stack exchange,提问作者Sadman Sakib
相关产品推荐
相关产品推荐

