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

4

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


在Linux系统中,文件/proc/mounts包含有关每个已挂载的文件系统的详细信息,您可以轻松解析感兴趣的文件系统。 - David C. Rankin
3个回答

2
你可以使用blkid来读取USB设备标签:
blkid USB_PATH | grep -o ""LABEL.*"" | cut -d'\"' -f2

2
通常,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),它给出以下输出:
/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 USB闪存驱动器的,但您需要解析此输出(我认为这并不难)


1
我认为磁盘的“标签”是由其使用的文件系统维护的属性,即不属于USB级别。
您需要正确的文件系统实现,即“挂载”磁盘。

请您能否详细说明一下? - jsaji
这是每个分区的。他指的是像“名称”一样的标签。 - SwiftMango

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接