試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

GUdevライブラリでGNU/Linuxシステム上のデバイス情報を取得する(ページ3/3)

GUdevライブラリでGNU/Linuxシステム上のデバイス情報を取得する(ページ2/3)」の続き。

例2

1つ目の例ではデバイスファイルを指定してその情報を表示したが、今回の例ではコマンド行引数に指定した名前のサブシステム(例:block,net,soundなど)に属する全てのデバイスの情報を取得し、表示する。引数を付けないで実行すると全てのサブシステムの全てのデバイスの情報を取得・表示する。
前回と同様、コードのコンパイルにはGUdevライブラリの開発パッケージも必要。
[任意]ファイル名: gudevtest2.vala

/*
 * GUdevのテスト2
 * システム上の全てのデバイスの情報を表示する
 * コマンド行引数でサブシステム名による絞り込みが可能
 *
 * valac --pkg posix --pkg gudev-1.0 gudevtest2.vala -o gudevtest2
 */

using Posix;
using GUdev;

namespace GUdevTest2
{
  int
  main (string[] args)
  {
    // デバイス情報を問い合わせるクライアント(GUdev.Clientクラス)
    var c = new GUdev.Client (null);
    // 全ての情報(GUdev.Deviceクラスのリスト)を得る
    GLib.List<GUdev.Device> devs;
    if (args.length < 2)
      devs = c.query_by_subsystem (null);
    else
      devs = c.query_by_subsystem (args[1]);  // 特定のサブシステムの項目のみを得る
    if (devs.length () == 0)
    {
      printerr ("No devices found in subsystem \"%s\"\n", args[1]);
      return EXIT_FAILURE;
    }
    foreach (GUdev.Device d in devs)
    {
      // 種類や名前はメンバ関数で取り出すことができる
      if (d.get_devtype () == null)
        print ("----- %s : %s -----\n", d.get_name (), d.get_subsystem ());
      else
        print ("----- %s (%s) : %s -----\n", d.get_name (), d.get_devtype (), d.get_subsystem ());
      // 全ての項目名(キー)を得て各項目ごとに処理する
      foreach (string? key in d.get_property_keys ())
      {
        // それぞれの情報(値)を取り出す
        // 種類や名前の情報もこの中に含まれる
        if (key != null)
          print ("%s: %s\n", key, d.get_property (key));
      }
    }
    return EXIT_SUCCESS;
  }
}

下は実行結果例。今回もVirtualBox上のGNU/Linuxの中で実行した結果から貼り付ける。例1と同様、環境によって出力内容は変わる。コマンド行引数を付けない場合の出力は非常に長くなるため、一部のみを貼り付ける。

(「net」を指定した例)
$ ./gudevtest2 net
----- eth0 : net -----
UDEV_LOG: 3
DEVPATH: /devices/pci0000:00/0000:00:03.0/net/eth0
INTERFACE: eth0
IFINDEX: 2
SUBSYSTEM: net
ID_VENDOR_FROM_DATABASE: Intel Corporation
ID_MODEL_FROM_DATABASE: 82540EM Gigabit Ethernet Controller
ID_BUS: pci
ID_VENDOR_ID: 0x8086
ID_MODEL_ID: 0x100e
----- lo : net -----
UDEV_LOG: 3
DEVPATH: /devices/virtual/net/lo
INTERFACE: lo
IFINDEX: 1
SUBSYSTEM: net

(無指定の例)
$ ./gudevtest2
----- LNXSYSTM:00 : acpi -----
UDEV_LOG: 3
DEVPATH: /devices/LNXSYSTM:00
MODALIAS: acpi:LNXSYSTM:
SUBSYSTEM: acpi
----- LNXPWRBN:00 : acpi -----
UDEV_LOG: 3
DEVPATH: /devices/LNXSYSTM:00/LNXPWRBN:00
DRIVER: button
MODALIAS: acpi:LNXPWRBN:
SUBSYSTEM: acpi
----- input0 : input -----
UDEV_LOG: 3
DEVPATH: /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
PRODUCT: 19/0/1/0
NAME: "Power Button"
PHYS: "LNXPWRBN/button/input0"
EV: =3
KEY: =100000 0 0 0
MODALIAS: input:b0019v0000p0001e0000-e0,1,k74,ramlsfw
SUBSYSTEM: input
----- event0 : input -----
UDEV_LOG: 3
DEVPATH: /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0/event0
MAJOR: 13
MINOR: 64
DEVNAME: /dev/input/event0
SUBSYSTEM: input
ID_INPUT: 1
ID_INPUT_KEY: 1
XKBMODEL: pc105
XKBLAYOUT: jp
DEVLINKS: /dev/char/13:64
DMI_VENDOR: innotek GmbH
----- LNXSLPBN:00 : acpi -----
UDEV_LOG: 3
DEVPATH: /devices/LNXSYSTM:00/LNXSLPBN:00
DRIVER: button
MODALIAS: acpi:LNXSLPBN:
SUBSYSTEM: acpi
----- input1 : input -----
UDEV_LOG: 3
DEVPATH: /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1
PRODUCT: 19/0/3/0
NAME: "Sleep Button"
PHYS: "LNXSLPBN/button/input0"
EV: =3
KEY: =4000 0 0 0 0
MODALIAS: input:b0019v0000p0003e0000-e0,1,k8E,ramlsfw
SUBSYSTEM: input
----- event1 : input -----
UDEV_LOG: 3
DEVPATH: /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1/event1
MAJOR: 13
MINOR: 65
DEVNAME: /dev/input/event1
SUBSYSTEM: input
ID_INPUT: 1
ID_INPUT_KEY: 1
XKBMODEL: pc105
XKBLAYOUT: jp
DEVLINKS: /dev/char/13:65
DMI_VENDOR: innotek GmbH
(中略)
----- sda (disk) : block -----
(中略)
----- sda1 (partition) : block -----
UDEV_LOG: 3
DEVPATH: /devices/pci0000:00/0000:00:01.1/host0/target0:0:0/0:0:0:0/block/sda/sda1
MAJOR: 8
MINOR: 1
DEVNAME: /dev/sda1
DEVTYPE: partition
SUBSYSTEM: block
ID_ATA: 1
ID_TYPE: disk
ID_BUS: ata
ID_MODEL: VBOX_HARDDISK
ID_MODEL_ENC: VBOX\x20HARDDISK\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
ID_REVISION: 1.0
ID_SERIAL: VBOX_HARDDISK_VBa43f2b61-9e54e516
ID_SERIAL_SHORT: VBa43f2b61-9e54e516
ID_ATA_WRITE_CACHE: 1
ID_ATA_WRITE_CACHE_ENABLED: 1
ID_ATA_FEATURE_SET_PM: 1
ID_ATA_FEATURE_SET_PM_ENABLED: 1
ID_SCSI_COMPAT: SATA_VBOX_HARDDISK_VBa43f2b61-9e54e516
ID_PATH: pci-0000:00:01.1-scsi-0:0:0:0
ID_PART_TABLE_TYPE: dos
UDISKS_PRESENTATION_NOPOLICY: 0
UDISKS_PARTITION: 1
UDISKS_PARTITION_SCHEME: mbr
UDISKS_PARTITION_NUMBER: 1
UDISKS_PARTITION_TYPE: 0x05
UDISKS_PARTITION_SIZE: 3647932416
UDISKS_PARTITION_FLAGS: boot
UDISKS_PARTITION_SLAVE: /sys/devices/pci0000:00/0000:00:01.1/host0/target0:0:0/0:0:0:0/block/sda
UDISKS_PARTITION_OFFSET: 63488
UDISKS_PARTITION_ALIGNMENT_OFFSET: 0
DEVLINKS: /dev/block/8:1 /dev/disk/by-id/ata-VBOX_HARDDISK_VBa43f2b61-9e54e516-part1 /dev/disk/by-id/scsi-SATA_VBOX_HARDDISK_VBa43f2b61-9e54e516-part1 /dev/disk/by-path/pci-0000:00:01.1-scsi-0:0:0:0-part1
----- sda2 (partition) : block -----
UDEV_LOG: 3
DEVPATH: /devices/pci0000:00/0000:00:01.1/host0/target0:0:0/0:0:0:0/block/sda/sda2
MAJOR: 8
MINOR: 2
DEVNAME: /dev/sda2
DEVTYPE: partition
SUBSYSTEM: block
ID_ATA: 1
ID_TYPE: disk
ID_BUS: ata
ID_MODEL: VBOX_HARDDISK
ID_MODEL_ENC: VBOX\x20HARDDISK\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
ID_REVISION: 1.0
ID_SERIAL: VBOX_HARDDISK_VBa43f2b61-9e54e516
ID_SERIAL_SHORT: VBa43f2b61-9e54e516
ID_ATA_WRITE_CACHE: 1
ID_ATA_WRITE_CACHE_ENABLED: 1
ID_ATA_FEATURE_SET_PM: 1
ID_ATA_FEATURE_SET_PM_ENABLED: 1
ID_SCSI_COMPAT: SATA_VBOX_HARDDISK_VBa43f2b61-9e54e516
ID_PATH: pci-0000:00:01.1-scsi-0:0:0:0
ID_PART_TABLE_TYPE: dos
ID_FS_UUID: 1130b63a-5297-4913-b8f8-d5e8b2c7e73e
ID_FS_UUID_ENC: 1130b63a-5297-4913-b8f8-d5e8b2c7e73e
ID_FS_VERSION: 1.0
ID_FS_TYPE: ext4
ID_FS_USAGE: filesystem
UDISKS_PRESENTATION_NOPOLICY: 0
UDISKS_PARTITION: 1
UDISKS_PARTITION_SCHEME: mbr
UDISKS_PARTITION_NUMBER: 2
UDISKS_PARTITION_TYPE: 0x83
UDISKS_PARTITION_SIZE: 645922816
UDISKS_PARTITION_SLAVE: /sys/devices/pci0000:00/0000:00:01.1/host0/target0:0:0/0:0:0:0/block/sda
UDISKS_PARTITION_OFFSET: 3647995904
UDISKS_PARTITION_ALIGNMENT_OFFSET: 0
DEVLINKS: /dev/block/8:2 /dev/disk/by-id/ata-VBOX_HARDDISK_VBa43f2b61-9e54e516-part2 /dev/disk/by-id/scsi-SATA_VBOX_HARDDISK_VBa43f2b61-9e54e516-part2 /dev/disk/by-path/pci-0000:00:01.1-scsi-0:0:0:0-part2 /dev/disk/by-uuid/1130b63a-5297-4913-b8f8-d5e8b2c7e73e
----- sda5 (partition) : block -----
UDEV_LOG: 3
DEVPATH: /devices/pci0000:00/0000:00:01.1/host0/target0:0:0/0:0:0:0/block/sda/sda5
MAJOR: 8
MINOR: 5
DEVNAME: /dev/sda5
DEVTYPE: partition
SUBSYSTEM: block
ID_ATA: 1
ID_TYPE: disk
ID_BUS: ata
ID_MODEL: VBOX_HARDDISK
ID_MODEL_ENC: VBOX\x20HARDDISK\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
ID_REVISION: 1.0
ID_SERIAL: VBOX_HARDDISK_VBa43f2b61-9e54e516
ID_SERIAL_SHORT: VBa43f2b61-9e54e516
ID_ATA_WRITE_CACHE: 1
ID_ATA_WRITE_CACHE_ENABLED: 1
ID_ATA_FEATURE_SET_PM: 1
ID_ATA_FEATURE_SET_PM_ENABLED: 1
ID_SCSI_COMPAT: SATA_VBOX_HARDDISK_VBa43f2b61-9e54e516
ID_PATH: pci-0000:00:01.1-scsi-0:0:0:0
ID_PART_TABLE_TYPE: dos
ID_FS_UUID: 8d43ae5f-6d02-4836-a1ce-e5564430f126
ID_FS_UUID_ENC: 8d43ae5f-6d02-4836-a1ce-e5564430f126
ID_FS_VERSION: 1.0
ID_FS_TYPE: ext2
ID_FS_USAGE: filesystem
UDISKS_PRESENTATION_NOPOLICY: 0
UDISKS_PARTITION: 1
UDISKS_PARTITION_SCHEME: mbr
UDISKS_PARTITION_NUMBER: 5
UDISKS_PARTITION_TYPE: 0x83
UDISKS_PARTITION_SIZE: 65737728
UDISKS_PARTITION_SLAVE: /sys/devices/pci0000:00/0000:00:01.1/host0/target0:0:0/0:0:0:0/block/sda
UDISKS_PARTITION_OFFSET: 64512
UDISKS_PARTITION_ALIGNMENT_OFFSET: 0
DEVLINKS: /dev/block/8:5 /dev/disk/by-id/ata-VBOX_HARDDISK_VBa43f2b61-9e54e516-part5 /dev/disk/by-id/scsi-SATA_VBOX_HARDDISK_VBa43f2b61-9e54e516-part5 /dev/disk/by-path/pci-0000:00:01.1-scsi-0:0:0:0-part5 /dev/disk/by-uuid/8d43ae5f-6d02-4836-a1ce-e5564430f126
(中略)
----- card0 : sound -----
UDEV_LOG: 3
DEVPATH: /devices/pci0000:00/0000:00:05.0/sound/card0
SUBSYSTEM: sound
SOUND_INITIALIZED: 1
ID_VENDOR_FROM_DATABASE: Intel Corporation
ID_MODEL_FROM_DATABASE: 82801AA AC'97 Audio Controller
ID_BUS: pci
ID_VENDOR_ID: 0x8086
ID_MODEL_ID: 0x2415
ID_PATH: pci-0000:00:05.0
SOUND_FORM_FACTOR: internal
(中略)
----- vcsa7 : vc -----
UDEV_LOG: 3
DEVPATH: /devices/virtual/vc/vcsa7
MAJOR: 7
MINOR: 135
DEVNAME: /dev/vcsa7
SUBSYSTEM: vc
DEVLINKS: /dev/char/7:135
----- vtcon0 : vtconsole -----
UDEV_LOG: 3
DEVPATH: /devices/virtual/vtconsole/vtcon0
SUBSYSTEM: vtconsole
----- vtcon1 : vtconsole -----
UDEV_LOG: 3
DEVPATH: /devices/virtual/vtconsole/vtcon1
SUBSYSTEM: vtconsole

sda1に関する情報にID_FS_TYPE(ファイルシステム名)やID_FS_UUID(ファイルシステムのUUID)などの項目がないが、これは実行した環境においてsda1のパーティションが拡張領域の全体を構成するパーティションであるためで、この中の個別のsda5やsda6などのパーティションには存在する。
ネットワークカードの情報については、virtio-netを用いていると

----- eth0 : net -----
UDEV_LOG: 3
DEVPATH: /devices/virtio-pci/virtio0/net/eth0
INTERFACE: eth0
IFINDEX: 2
SUBSYSTEM: net

のようになり、ベンダやモデルの情報はない。
なお、無効なサブシステム名を指定すると

$ ./gudevtest2 foo
No devices found in subsystem "foo"

エラーメッセージを出力してプロセスの戻り値がEXIT_FAILUREとなる。

関連記事:

使用したバージョン:

  • Vala 0.9.8
  • GUdev 151