如何在Linux中获得USB驱动器标签
How to get USB Drive Label in Linux?
我正在尝试在我的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棒是分区的(只有一个分区),你必须:
- 在usb棒的第一个扇区中查找分区表并找到第一个分区
- 然后,在该分区的第一个扇区中查找字节偏移量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级别。
您将需要适当的文件系统实现,即"装载"磁盘。
相关文章:
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- 是否可以使用winusb同时与多个相同的usb设备进行通信
- 插入或删除时获取usb的dos_name
- 使用 VID、PID、+SN 查找 USB 端口号
- USB传输的LibUSB C++格式不同
- 如何确定SSD驱动器是固定驱动器还是连接在USB上
- Qt驱动器下拉列表仅列出USB记忆棒
- 检测是否从 USB 驱动器运行
- 获取<whatever>包含正在运行的可执行文件的 USB 驱动器C++ /dev/
- 插入加密的 USB 驱动器后,如何使用 WMI 查找"启动器"逻辑磁盘?
- C++MFC将文件写入插入的USB驱动器
- C++Win32 有关所有驱动器的信息:硬盘驱动器、USB 驱动器、光盘驱动器、软盘驱动器等
- 如何限制 MFC 应用程序仅从已知的 USB 闪存驱动器运行
- 如何在C++中找到连接到USB端口(HID或磁盘驱动器)的设备
- 使用libusb从USB闪存驱动器读取数据
- 如何在Linux中获得USB驱动器标签
- Windows XP:如何从磁盘驱动器号获取USB设备位置
- 如何在Qt中获得Linux上USB驱动器的路径
- 如何使用C++将包含多个分区的映像写入Windows上的USB闪存驱动器
- USB 上C++编译器(无需安装计算机(c 驱动器、PATH 等))的可移植 Eclipse CC++ 配置