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

标签 c++ c linux linux-kernel udev

我正在尝试在我的 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. 在 U 盘的第一个扇区中查找分区表并找到第一个分区。
  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 pendrive,但你必须解析这个输出(我认为这并不难)

关于c++ - 如何在 Linux 中获取 USB 驱动器标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25563007/

相关文章:

C++:将成员函数作为普通函数指针传递的闭包

c++ - 将未初始化的内存用于变量 ans

CvCreateMatND 直接访问

linux - 如何在不删除原始文件的情况下使用cat追加一个文件

c - 将十六进制写入 C 文件(不是 ASCII)

c++ - CMake - 使用 find_package 中的变量链接用于调试和发布版本的不同库

c++ - 从 WinRT 中的异步任务 lambda 更新 UI

立即减法和后减法时出现困惑

c - 结构体可以包含的成员数量或变量类型是否有大小限制?

c++ - openmp Linux 中的段错误