我正在尝试禁用运行 Debian 测试的 MBP (5,3) 中的内置读卡器。我注意到 powertop 将读卡器列为唤醒事件的主要贡献者,并且想禁用它,因为我很少需要读取 SD 卡。
我用“dmesg”找到了这个:
scsi 6:0:0:0: 直接访问 APPLE SD 读卡器 1.00 PQ: 0 ANSI: 0
这是来自“sg_scan -i”的结果:
/dev/sg2:scsi6 channel=0 id=0 lun=0 [em] APPLE SD 读卡器 1.00 [rmb=1 cmdq=0 pqual=0 pdev=0x0]
我不知道在 /proc 中哪里可以找到该设备,并且没有为该设备加载模块(我猜测它已编译到内核中支持该设备)。
因此,理想情况下,我希望能够在不重新编译内核的情况下启用/禁用此设备。这可能吗?
答案1
读卡器很可能是 USB 存储设备。但是,它本身不会引起唤醒 — 相反,HAL 或 udisks 需要轮询它以检测介质变化,并且此轮询显示在 powertop 中。可以禁用此轮询,但这样将无法检测到介质变化(但是,设备仍将工作,通常会尝试访问 /dev/sdX将导致内核检测媒体变化并检测分区,然后就可以挂载这些分区)。
您可以在系统上查找轮询进程 - HAL 和 udisks 在输出中可见的命令行中显示轮询的设备名称ps
:
ps ax | grep /dev/sdX
使用 HAL 时,每个轮询设备都有一个单独的进程;使用 udisks 时,系统中的所有轮询设备hald-addon-storage
都有一个单独的进程。udisks-daemon
禁用 HAL 轮询很容易 - 有一个特殊命令:
hal-disable-polling --设备/dev/sdX
如果您想要稍后重新启用轮询,请使用带有附加--enable-polling
选项的相同命令。
对于较新的 udisks,情况更为复杂。首先,您需要一个足够新的 udisks 包:Debian bug #559562 表示需要 udisks >= 1.0.0~git20100223.a38230-2。接下来,您需要为您的设备添加一条 udev 规则,如中所述http://bugs.freedesktop.org/show_bug.cgi?id=26508#c0。对于您的设备,规则可能应该是这样的:
SUBSYSTEM=="block", ENV{ID_VENDOR}=="APPLE*", ENV{ID_MODEL}=="SD 卡读卡器*", ENV{UDISKS_DISABLE_POLLING}="1"
将此规则放入新创建的文件中/etc/udev/rules.d/
(例如99-local.rules
)。