Skip to content

May 7, 2009

How to extract storage device information without using dmesg

by Joe Kuan

ubuntulogoI come across this problem in one of my projects. How can I easily retrieve storage device information (such as brand, partition, label, filesystem etc) and integrate to another program ? E.g If an USB storage device is plugged into a machine or a LiveCD is running on an unknown machine and trying to detect what storage devices are connected.

I searched for some answers on the internet but the typical and obvious response is to parse the output from the dmesg command. I find that approach ugly. The dmesg utility is for showing users descriptive system messages since the machine is started and it is event based. In my opinon, the output is not unix commands friendly because the format is not consistent. Hence I need to write more code for the sake of parsing the output. There got to be another simpler way to do it. There must be a command which gives better output than dmesg

I stumble across several utilities which are pretty useful to dig up the device information and of course, they produce easier output for parsing.

udevinfo

udevinfo – part of the udev package. You can request specific system information under the sysfs directories, /sys/…

Suppose you want to query information inside a storage device, /dev/sda

udevinfo -a -p /sys/block/sda/sda1 –query=env

This gives the following output in name and value pairs:

DEVTYPE=partition
ID_VENDOR=ATA
ID_MODEL=ST380815AS
ID_REVISION=4.AA
ID_SERIAL=1ATA_ST380815AS_9QZ8VEQT
ID_SERIAL_SHORT=ATA_ST380815AS_9QZ8VEQT
ID_TYPE=disk
ID_BUS=scsi
ID_ATA_COMPAT=ST380815AS_9QZ8VEQT
ID_PATH=pci-0000:00:0e.0-scsi-1:0:0:0
ID_EDD=int13_dev80
ID_FS_USAGE=filesystem
ID_FS_TYPE=ext3
ID_FS_VERSION=1.0
ID_FS_UUID=32c25ac1-9d49-42a6-8bca-081433130cdc
ID_FS_UUID_ENC=32c25ac1-9d49-42a6-8bca-081433130cdc
ID_FS_LABEL=
ID_FS_LABEL_ENC=
ID_FS_LABEL_SAFE=

As you can see, the output is pretty well self descriptive with information like: filesystem, disk label, the hardware model, etc. You can either use awk or source the output inside a shell script to process the data.

With udevinfo, you can also find out the following

  • how many storage devices and what partitions are available
  • which partition is mountable

First, you can run the following command to list all the available partitions for all the detected devices:

ls -d /sys/block/[sh]d[a-z]*/[sh]d[a-z]*[0-9]*

Then issues the above udevinfo command for each of the partition directory returned from the above ls command.

If the value of ID_FS_USAGE is ‘filesystem’, then the partition is mountable. As long as ID_FS_TYPE has the filesystem type supported by the kernel.

lshw
lshw is another tool that offers rich information on hardware devices. The information is organised in tree style that you can output in pure text or in xml/html format. Here is an example of trimmed output:

    configuration: driver=usb-storage
*-disk
         description: SCSI Disk
         product: USB2FlashStorage
         vendor: Ut163
         logical name: /dev/sdb
        size: 963MiB (1010MB)
        capabilities: removabl
        *-medium
                   logical name: /dev/sdb
                   size: 963MiB (1010MB)
                   capabilities: partitioned partitioned:dos
              *-volume
                       description: Windows FAT volume
                       logical name: /dev/sdb1
                       logical name: /media/usb0
                      version: FAT16
                      serial: 4918-195d 
                      size: 399MiB

lshw and udevinfo offers similar detail level on hardware data. However, if you are thinking of integrating the output to another program, perhaps udevinfo’s output is simpler to parse because everything is in name and value pair. On the other hand, lshw gives you the full picture of all the hardware detail in one command.

hwinfo

Alternatively, if you only want hardware level information, another obvious choice is to use hwinfo utility. Simply do, hwinfo –disk. Following is an example of trimmed output:

33: IDE 100.0: 10600 Disk
[Created at block.222]
UDI: /org/freedesktop/Hal/devices/storage_serial_1ATA_ST380815AS_9QZ8VEQT
 Hardware Class: disk
Model: “ST380815AS”
 Geometry (Logical): CHS 9729/255/63
Size: 156301488 sectors a 512 bytes
Geometry (BIOS EDD): CHS 155058/16/63
Size (BIOS EDD): 156299375 sectors
Geometry (BIOS Legacy): CHS 1024/255/63
Config Status: cfg=new, avail=yes, need=no, active=unknown
Attached to: #14 (IDE interface)

As you can see hwinfo does what it say on the tin, it returns information: disk model and geometry whereas udevinfo and lshw returns additional information on the filesystem level.

Conclusion

Depending on how much information you need to request for the hardware and what to do with the output, both udevinfo and lshw offers higher detail than hwinfo. With udevinfo, you need to drill down to specific level in the sysfs hierarchy but the output is in name and value pairs which is more unix command friendly comparing to lshw. If you need to integrate information for another program, then perhaps udevinfo is a better choice. On the other hand, lshw gives a slightly higher hardware detail (such as partition size) than udevinfo and a single command will extract the whole hierarchy of hardware class, not only storage. Then perhaps worth writing extra code to parse the xml output from lshw.

I work for iTrinegy and here are my other technical blogs

About these ads

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Note: HTML is allowed. Your email address will never be published.

Subscribe to comments

Follow

Get every new post delivered to your Inbox.

Join 33 other followers

%d bloggers like this: