我有一个 USB 软盘驱动器(至于原因,不要问)。当将其插入装有 Debian 和 udev 的现代 PC 时,每隔几秒钟就会有东西 ping 驱动器 --- 我相信它是在查看驱动器中是否有磁盘。
这会导致驱动器发出咔嗒声,非常烦人。
blktrace
已经确认有东西正在通过网络发送命令:
8,64 7 3 2.047998323 2930 I N 0 [kworker/7:0]
8,64 7 4 2.048002857 2930 D N 0 [kworker/7:0]
8,64 5 2 2.094203959 36 C N [65531]
8,64 7 5 4.095999615 2930 I N 0 [kworker/7:0]
8,64 7 6 4.096004486 2930 D N 0 [kworker/7:0]
8,64 5 3 4.142187593 36 C N [65531]
(ETC)
不幸的是,进程 2930 是一个通用的 kworker,而进程 36 是 ksoftirqd,所以我只能说它来自内核的某个地方。
搜索互联网后发现,udev 曾经像这样进行媒体轮询,但自 2014 年左右以来,它已被内核媒体轮询所取代。进一步搜索发现,可以使用命令禁用此功能hal-disable-polling
。然而,进一步搜索显示,这些命令已从 Debian 中删除。我还没有弄清楚它们被什么取代了。
有谁知道如何做到这一点?
答案1
您应该能够使用以下命令停止该设备:
# udisks --inhibit-polling /dev/your_device
或适用于所有具有以下功能的设备:
# udisks --inhibit-all-polling
答案2
我找到了解决此问题的部分方法:
该解决方案已在 Ubuntu 14.04 下测试过,并且也适用于较新版本的 Ubuntu 或 Debian。
此解决方案仅适用于廉价的 Teac USB 软盘控制器(对于其他 USB 控制器,您可能必须自行调整解决方案):
在终端中只需输入
lsscsi
(如果尚未安装,请输入 sudo apt-get install lsscsi):
Output: [6:0:0:0] disk TEAC USB UF000x 0.00
如果在软盘驱动器连接时没有看到 TEAC 和 USB UF000x,则此解决方案不适合您。
使用管理员权限创建此文件:/etc/udev/rules.d/00-teacfloppy.rules
粘贴此行:
ACTION=="add", SUBSYSTEM=="block", ATTR{removable}=="1", ATTRS{idVendor}=="0644", ATTRS{idProduct}=="0000", ATTR{events_poll_msecs}="-1"
保存并重新启动。
驱动器将搜寻几秒钟然后电机将快速停止。
答案3
配置内核轮询间隔的另一种方法是通过/sys
sysfs 文件系统。
找到路径的最简单方法是:
find /sys -name events_poll_msecs
此后,可以使用以下命令更改间隔:
echo 0 > /sys/devices/..../block/sr0/events_poll_msecs
值 0 表示禁用轮询,值 -1 表示使用默认值/sys/module/block/parameters/events_dfl_poll_msecs
。