Linux内核从2.6.13-rc3开始,提供了在用户空间,可动态的绑定和解绑定设备和设备驱动之间关系的功能。在这之前,只能通过insmod(modprobe)和rmmod来绑定和解绑,而且这种绑定和解绑都是针对驱动和所有设备的。而新的功能可以设置驱动和单个设备之间的联系。
这里,我们以pci总线的nvme ssd为例,首先执行lspci显示所有的nvme ssd。
# lspci | grep memory
01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a802 (rev 01)
09:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a802 (rev 01)
有如上这么多nvme ssd,那么我们就可以在/dev下看到多个nvme设备(OS启动后默认加载nvme驱动)。
# ls /dev/nvme*
/dev/nvme0 /dev/nvme0n1p2 /dev/nvme0n1 /dev/nvme0n1p3 /dev/nvme0n1p1 /dev/nvme1 /dev/nvme1n1
同时,对于所有的nvme设备(这里我们以pci总线bdf号为09:00.0的ssd为例),都可以在nvme驱动下看到。其中,bind和unbind文件就是涉及到绑定和解绑的关键文件。
/sys/bus/pci/drivers/nvme# ll
total 0
drwxr-xr-x 2 root root 0 Jan 4 17:10 ./
drwxr-xr-x 30 root root 0 Jan 4 17:10 ../
lrwxrwxrwx 1 root root 0 Jan 4 20:49 0000:01:00.0 -> ../../../../devices/pci0000:00/0000:00:01.0/0000:01:00.0/
lrwxrwxrwx 1 root root 0 Jan 4 20:49 0000:09:00.0 -> ../../../../devices/pci0000:00/0000:00:03.0/0000:05:00.0/0000:06:0a.0/0000:07:00.0/0000:08:01.0/0000:09:00.0/
--w------- 1 root root 4096 Jan 4 20:46 bind
lrwxrwxrwx 1 root root 0 Jan 4 20:49 module -> ../../../../module/nvme/
--w------- 1 root root 4096 Jan 4 20:49 new_id
--w------- 1 root root 4096 Jan 4 20:49 remove_id
--w------- 1 root root 4096 Jan 4 17:10 uevent
--w------- 1 root root 4096 Jan 4 17:10 unbind
解绑一个nvme设备,只需将设备的pci总线bdf号写入/sys/bus/pci/drivers/nvme(不同的设备驱动不同)/unbind即可:
/sys/bus/pci/drivers/nvme# echo -n "0000:09:00.0" > unbind
解除绑定成功,再查看目录下文件,该驱动下不再有对应的设备。同时,/dev下也没有对应的nvme设备了。
/sys/bus/pci/drivers/nvme# ll
total 0
drwxr-xr-x 2 root root 0 Jan 4 20:51 ./
drwxr-xr-x 30 root root 0 Jan 4 20:49 ../
lrwxrwxrwx 1 root root 0 Jan 4 20:49 0000:01:00.0 -> ../../../../devices/pci0000:00/0000:00:01.0/0000:01:00.0/
--w------- 1 root root 4096 Jan 4 20:46 bind
lrwxrwxrwx 1 root root 0 Jan 4 20:49 module -> ../../../../module/nvme/
--w------- 1 root root 4096 Jan 4 20:49 new_id
--w------- 1 root root 4096 Jan 4 20:49 remove_id
--w------- 1 root root 4096 Jan 4 20:49 uevent
--w------- 1 root root 4096 Jan 4 20:51 unbind
绑定一个nvme设备,和解绑类似,将设备的pci总线bdf号写入/sys/bus/pci/drivers/nvme(不同的设备驱动不同)/bind:
/sys/bus/pci/drivers/nvme# echo -n "0000:09:00.0" > bind
绑定成功,再次展示该目录下所有文件,可以发现对应设备再次出现。
/sys/bus/pci/drivers/nvme# ll
total 0
/sys/bus/pci/drivers/nvme# ll
total 0
drwxr-xr-x 2 root root 0 Jan 5 09:13 ./
drwxr-xr-x 30 root root 0 Jan 4 20:49 ../
lrwxrwxrwx 1 root root 0 Jan 4 20:49 0000:01:00.0 -> ../../../../devices/pci0000:00/0000:00:01.0/0000:01:00.0/
lrwxrwxrwx 1 root root 0 Jan 5 09:13 0000:09:00.0 -> ../../../../devices/pci0000:00/0000:00:03.0/0000:05:00.0/0000:06:0a.0/0000:07:00.0/0000:08:01.0/0000:09:00.0/
--w------- 1 root root 4096 Jan 5 09:13 bind
lrwxrwxrwx 1 root root 0 Jan 4 20:49 module -> ../../../../module/nvme/
--w------- 1 root root 4096 Jan 4 20:49 new_id
--w------- 1 root root 4096 Jan 4 20:49 remove_id
--w------- 1 root root 4096 Jan 4 20:49 uevent
--w------- 1 root root 4096 Jan 4 20:51 unbind
Linux驱动手动绑定和解绑定
发表于:2017-08-08
作者:styshoo
来源:
 相关文章
Linux入门指南:轻松掌握基础,开启你... 一图看懂 Linux 文件系统的组成 在Linux服务器上部署容器化的企业级文... 在Linux服务器上部署容器化的分布式缓... 利用Linux中断处理机制提高系统性能 利用Linux虚拟化技术实现资源隔离和管理- 周排行
- 月排行
-   2020年程序员须关注的8个重量级开源项目!
-   DevOps失败了!
-   用了10年Windows后,我最终转向Linux
-   UPS电源预防性维护七大技巧
-   微信每天都用,这16个能提升幸福感的...
-   服务器装什么操作系统更好?常见的有...
-   服务器维护日常需做哪些工作?
-   Windows 10技巧:如何加快笔记本电脑速度
-   从四种场景出发,详细解读无服务器架...
-   发展基础软件生态,建设自主创新根技术
-   用于Kubernetes的Linux操作系统指南
-   运维必看:日志标准化必须面对的 4 类问题
-   浅谈SDN架构下的运维
-   如何认识服务器的一些基本的知识原理
