如何在Linux中获得USB驱动器标签

How to get USB Drive Label in Linux?

本文关键字:USB 驱动器 标签 Linux      更新时间:2023-10-16

我正在尝试在我的c/c++应用程序中获取USB驱动器的标签。我正在使用libudev来获取usb的详细信息。但它没有提供驱动器标签。有人知道如何获得驱动器标签吗。我在嵌入式平台上工作,它没有/dev/disk文件夹。请帮忙。内核版本:3.3.8

通常,usb文件系统上有一个vfat分区,使其在msdos、windows、linux和mac体系结构之间兼容。

标签是vfat文件系统的一个属性。它通常显示为根目录中的第一个目录条目,并标记为文件系统标签。msdos文件系统的最新实现(仅vfat exfat和fat32)也将其写入该分区的引导记录的固定部分,因此您可以从那里读取它。

您在分区的第一个扇区中具有偏移量为0x43(4字节)的卷序列号。您在第一个扇区中也有偏移量为0x47的卷标副本(11字节长)

诀窍是:通常情况下,usb棒是分区的(只有一个分区),你必须:

  1. 在usb棒的第一个扇区中查找分区表并找到第一个分区
  2. 然后,在该分区的第一个扇区中查找字节偏移量0x43,并使用这四个字节作为卷序列号(它与/etc/fstab linux文件中的UUID="…"匹配)和卷标签后面的十一个字节

备注

请注意,NTFS不会将该位置用于此目的,在那里写入可能会损坏NTFS分区。只是从那个地方读。

注2

此外,即使在vfat文件系统中也不要尝试写入该位置,因为它们还在文件系统的根目录中维护卷标的副本。

注3

在linux中获取dos文件系统(以及ext[234]、ntfs等)标签的最简单方法是使用命令blkid(8),它会给出以下ind输出:

/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" 

正如您所看到的,最后一个条目是针对vfat-usbpendrive的,但您必须解析这个输出(我认为这并不难)

您可以使用blkid读取USB设备标签:

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

我相信磁盘的"标签"是由它所使用的文件系统维护的属性,即它不在USB级别。

您将需要适当的文件系统实现,即"装载"磁盘。