3
votes

I am trying to get USB drive's Label in my c/c++ Application. I am using libudev to get the usb details. But it doesn't provides the drives Label. Does any one have an idea on how to get the drive Label. I am working on embedded platform, it doesn't have a /dev/disk folder. Please Help. Kernel Version : 3.3.8

3
On linux system the file /proc/mounts contains the details about each filesystem mounted from which you can easily parse the one of interest.David C. Rankin

3 Answers

2
votes

Normally, a usb filesystem has a vfat partition on it to make it compatible between msdos, windows, linux and mac architectures.

The label is a property of the vfat filesystem. It appears normaly as the first directory entry in the root directory and marked as a filesystem label. Recent implementations of msdos filesystems (merely vfat exfat and fat32) write it also in a fixed part of the boot record for that partition, so you can read it from there.

You have volume serial-number at offset 0x43 (4 bytes) in the first sector of the partition. You have also a copy of the volume label at offset 0x47 in that first sector also (11 bytes length)

The trick is: as normally a usb stick is partitioned (with only one partition) you have to:

  1. look in the first sector of the usb stick for the partition table and locate the first parition.
  2. then, look in the first sector of that parition, locate byte offset 0x43 and use that four bytes as volume serial number (it matches UUID="..." in /etc/fstab linux file) and the eleven bytes that follow for the volume label.

Note

Be careful that NTFS doesn't use that place for that purpose and you can damage a NTFS partition writing there. Just read from that place.

Note 2

Also, don't try to write to that place even in vfat filesystems, as they also maintain a copy of the volume label in the root directory of the filesystem.

Note 3

The easiest way to get the label of a dos filesystem (and ext[234], ntfs, etc) in linux is with the command blkid(8) it gives the followind output:

/dev/sda1: UUID="0b2741c0-90f5-48d7-93ce-6a03d2e8e9aa" TYPE="ext4" 
/dev/sda5: UUID="62e2cbf2-d847-4048-856a-a90b91116285" TYPE="crypto_LUKS" 
/dev/mapper/sda5_crypt: UUID="vnBDh3-bcaR-Cu7E-ok5D-oeFp-5SyP-MmAEsb" TYPE="LVM2_member" 
/dev/mapper/my_vg-root: UUID="1b9f158b-35b5-490e-b914-bdc70e7f5c28" TYPE="ext4" 
/dev/mapper/my_vg-swap_1: UUID="36b8ac81-7043-42ae-9f2a-908d53e2a2b3" TYPE="swap" 
/dev/sdb1: LABEL="K003_1G" UUID="641B-80BF" TYPE="vfat" 

As you can see, the last entry is for a vfat usb pendrive, but you have to parse this output (I think is not difficult to do)

1
votes

I believe the "label" of a disk is a property maintained by the file system it's using, i.e. it's not at the USB level.

You're going to need the proper file system implementation, i.e. "mount" the disk.

1
votes

You can use blkid to read the USB device label:

blkid USB_PATH | grep -o ""LABEL.*"" | cut -d'\"' -f2