由于udev下的设备管理非常灵活,可能依赖于安装的udev规则/lib/udev/rules.d
or /etc/udev/rules.d
决定您可以过滤哪些键。
您可以使用udevadm
获取设备列表及其关联的 udev 密钥。
sudo udevadm info --export-db
同样,您的脚本可以修改为输出此信息,如下所示:
#!/usr/bin/env python
import pyudev
context = pyudev.Context()
for device in context.list_devices(subsystem='block', DEVTYPE='disk'):
for key, value in device.iteritems():
print '{key}={value}'.format(key=key, value=value)
print
这将允许您确定哪些键可用于过滤。在我的 Debian 系统上,一些条目如下所示:
# Loop device
UDEV_LOG=3
DEVPATH=/devices/virtual/block/loop0
MAJOR=7
MINOR=0
DEVNAME=/dev/loop0
DEVTYPE=disk
SUBSYSTEM=block
UDISKS_PRESENTATION_NOPOLICY=1
DEVLINKS=/dev/block/7:0
#cdrom
UDEV_LOG=3
DEVPATH=/devices/pci0000:00/0000:00:01.1/host1/target1:0:0/1:0:0:0/block/sr0
MAJOR=11
MINOR=0
DEVNAME=/dev/sr0
DEVTYPE=disk
SUBSYSTEM=block
ID_CDROM=1
ID_CDROM_DVD=1
ID_CDROM_MRW=1
ID_CDROM_MRW_W=1
ID_SCSI=1
ID_VENDOR=VBOX
ID_VENDOR_ENC=VBOX\x20\x20\x20\x20
ID_MODEL=CD-ROM
ID_MODEL_ENC=CD-ROM\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
ID_REVISION=1.0
ID_TYPE=cd
ID_BUS=scsi
ID_PATH=pci-0000:00:01.1-scsi-1:0:0:0
GENERATED=1
UDISKS_PRESENTATION_NOPOLICY=0
DEVLINKS=/dev/block/11:0 /dev/scd0 /dev/disk/by-path/pci-0000:00:01.1-scsi-1:0:0:0 /dev/cdrom /dev/dvd
TAGS=:udev-acl:
# hard disk
UDEV_LOG=3
DEVPATH=/devices/pci0000:00/0000:00:0d.0/host2/target2:0:0/2:0:0:0/block/sda
MAJOR=8
MINOR=0
DEVNAME=/dev/sda
DEVTYPE=disk
SUBSYSTEM=block
ID_ATA=1
ID_TYPE=disk
ID_BUS=ata
可以过滤这些键/值对以仅返回那些真实的磁盘。这UDISKS_PRESENTATION_NOPOLICY
例如,条目可用于过滤掉循环设备。您可以仔细阅读 udev 规则来确定它如何尝试区分真实/虚拟磁盘。
像这样的东西会过滤掉 cdrom 和循环设备:
devices = []
for device in context.list_devices(subsystem='block', DEVTYPE='disk'):
# Filter out cd drives, loop devices.
if device.get('ID_TYPE', '') == 'cd':
continue
if device.get('UDISKS_PRESENTATION_NOPOLICY', '0') == '1':
continue
devices.append(device)
print "HARD DISKS:"