3

udev、特に pyudev を使用してコンピューター上のすべてのハードディスクを列挙してすべてを列挙しようとしています。

import pyudev

context = pyudev.Context()

for device in context.list_devices(subsystem='block', DEVTYPE='disk'):
    print "{}, ({})".format(device.device_node, device.device_type)

これにより、次のように出力されます。

/dev/sdb (disk)
/dev/sdc (disk)
/dev/sda (disk)
/dev/sr0 (disk)
/dev/loop0 (disk)
/dev/loop1 (disk)
/dev/loop2 (disk)
/dev/loop3 (disk)
/dev/loop4 (disk)
/dev/loop5 (disk)
/dev/loop6 (disk)
/dev/loop7 (disk)
/dev/ram0 (disk)
/dev/ram1 (disk)
/dev/ram10 (disk)
/dev/ram11 (disk)
/dev/ram12 (disk)
/dev/ram13 (disk)
/dev/ram14 (disk)
/dev/ram15 (disk)
/dev/ram2 (disk)
/dev/ram3 (disk)
/dev/ram4 (disk)
/dev/ram5 (disk)
/dev/ram6 (disk)
/dev/ram7 (disk)
/dev/ram8 (disk)
/dev/ram9 (disk)

私は主に実際のドライブに関心があり、光ディスク ドライブ、ループバック デバイス、または RAM デバイスには関心がないので、どうすれば結果をフィルタリングして実際の物理メディアだけを取得できますか?

4

2 に答える 2

2

udev(少なくとも現時点では) Linux カーネルでのみ実行されるため、すべての SCSI/SATA ディスク ドライバー ベースのデバイスを表すフィルターで除外できますMAJOR number 8

for device in context.list_devices(MAJOR='8'):
    if (device.device_type == 'disk'):
        print "{}, ({})".format(device.device_node, device.device_type)

私のシステムでは、コードは次を出力します。

/dev/sda, (disk)
/dev/sdf, (disk)
/dev/sdb, (disk)
/dev/sdc, (disk)
/dev/sdd, (disk)
/dev/sde, (disk)
/dev/sr0, (disk)
/dev/loop0, (disk)
/dev/loop1, (disk)
/dev/loop2, (disk)
/dev/loop3, (disk)
/dev/loop4, (disk)
/dev/loop5, (disk)
/dev/loop6, (disk)
/dev/loop7, (disk)

メジャー番号 8 でフィルタリングすると、次の出力が表示されます。

/dev/sda, (disk)
/dev/sdf, (disk)
/dev/sdb, (disk)
/dev/sdc, (disk)
/dev/sdd, (disk)
/dev/sde, (disk)

USB ハード ドライブと USB スティックもリストに表示されることに注意してください。これらは同じ SCSI ディスク ドライバを使用する傾向があるためです。

sdXIDE ハード ドライブが最新の 2.6またはhdX3.x カーネルとしてマップされているかどうかはよくわかりません。検証するIDEハードドライブがなく、長い間所有していました。:D

更新:同じデバイス番号のページ リスト/dev/hdXが、IDE ハード ドライブで使用されるものであることが示されています (また、IDE cdrom もそうである可能性があります)。これらもフィルタリングしたい場合は、次のようなことができると思います。

for device in context.list_devices(DEVTYPE='disk'):
    major = device['MAJOR']
    if major == '8' or major == '3':
        print "{}, ({})".format(device.device_node, device.device_type)
于 2013-04-11T06:52:03.360 に答える