我正在处理大量的USB闪存。我希望能够跟踪有关USB驱动器的事件。具体来说:我执行f3
测试,格式化驱动器并向它们写入数据。
我正在寻找一种方法,以数字标记驱动器(例如,用一个UUID),以便我可以执行各种行动的驱动器,同时保持序列号完好无损。希望也有其他人使用和格式化的驱动器,仍然允许我读取他们的序列号以后。
我尝试使用USB设备报告的序列号,但我很快发现大多数驱动器中没有唯一的标识信息存储在其中。
因此,我已经厌倦了生成一个UUID,它与它自己的CRC和连接,这样我就可以将该字符串写入驱动器并读取它,验证它是否被正确存储。
但是,将序列号写入文件系统意味着,一旦驱动器被填满,序列号的每个副本都将被覆盖。
我的最新想法是对驱动器进行分区,留下1MB未分区的空空间,这样我就可以将序列号存储在那里。
这将对驱动器的有用性产生轻微的影响,但应该允许我在一定程度上可靠地识别驱动器,只要驱动器不会被重新分区。
理想情况下,每个驱动器将有一个UUID写到大容量存储驱动芯片,并将报告-但我不制造驱动器。
我想要生成这样的序列号(Bash):
UUID=$(uuidgen)
CK=$(echo "$UUID" | cksum | cut -c -8)
SN="SN:$UUID:$CK;"
echo $SN
这将生成一个UUID,计算该UUID的CRC和,只留下该和的8个前字符(因为长度可能会变化,我们需要一个常量长度来有效地搜索模式)。然后将其与一些标记连接起来,这些标记可用于提取数据流中的数字,并验证它是否损坏。
示例序列号:
SN:7199e42e-465b-4baf-96b6-a109247d3f4b:39272476;
SN:aa795142-fa2e-4929-b93b-e991f95a74cd:40619286;
SN:43f93702-eda9-4089-9a81-d21172e051bf:37174302;
然后我可以验证序列号的完整性,如下所示:
SN="SN:7199e42e-465b-4baf-96b6-a109247d3f4b:39272476;"
UUID=$(echo "$SN" | cut -d':' -f2)
CK=$(echo "$SN" | cut -d':' -f3 | cut -d';' -f1)
if [[ $(echo "$UUID" | cksum | cut -c -8) == $CK ]]; then
echo "SN is fine"
else echo "SN is corrupted"; fi
我还可以使用grep
从驱动器中提取序列号:
cat /dev/sdX | grep -E "SN:.{8}-.{4}-.{4}-.{4}-.{12}:.{8};" -o
然后我会得到一个序列号的列表,并对它们进行评估,直到我找到一个匹配的校验和。
因为我工作的驱动器可能有问题,所以我需要在多个拷贝中写入序列号,这样至少有一个拷贝才能存活下来。
我想知道是否有更好的方法来实现我想做的事情--当然不用制造我自己的闪存,
EDIT: UDEVADM
我可以尝试使用驱动器本身的各种只读信息获取唯一标识符:
$ udevadm info /dev/sdd | grep -e "ID_MODEL" -e "ID_SERIAL" -e "ID_VENDOR"
E: ID_MODEL=Flash_Disk
E: ID_MODEL_ENC=Flash\x20Disk\x20\x20\x20\x20\x20\x20
E: ID_MODEL_ID=6387
E: ID_SERIAL=Generic_Flash_Disk_97C06F44-0:0
E: ID_SERIAL_SHORT=97C06F44
E: ID_VENDOR=Generic
E: ID_VENDOR_ENC=Generic\x20
E: ID_VENDOR_ID=058f
$ udevadm info /dev/sdd | grep -e "ID_MODEL" -e "ID_SERIAL" -e "ID_VENDOR" | md5sum | cut -d' ' -f1
7b7f63b829b6301cdf35d71eed9bb707
然而,我几乎可以肯定,我会在这里遇到许多返回相同值的驱动器--使这种方法毫无用处。
EDIT2:
我在这方面积累了将近1600个数据点,大多数驱动器似乎产生唯一的散列,但我仍然得到了大约400个返回相同散列的驱动器,因此仅用这个方法是不够的。
发布于 2018-06-08 15:31:44
设备的ID_SERIAL
通常用于验证设备的标识。
因为它是设备本身的属性,所以它跨格式是持久的;但是,afaik,由于同样的原因,您不能更改它。
您可以通过运行:udevadm info /dev/sdX | grep ID_SERIAL=
获得它。
发布于 2018-06-08 21:53:39
持久化设备命名(不同挂载点的名称相同)是一个难以实现的目标。有几个UUID作为在这里详细描述在几个容器(文件系统、挂载点等)中创建。
连接的UUID (实际上是一个世界性标识符) 由USB设备的硬件给出可以给出:
ls -l /dev/disk/by-id/
但是要明白,并不是所有的设备都支持这样的编号。
发布于 2018-06-11 10:32:47
有些闪存在格式之后是不可唯一标识的,最好的方法是设置自定义分区UUID或升级到更好的存储。
https://superuser.com/questions/1247972/change-uuid-of-vfat-partition
https://unix.stackexchange.com/questions/448660
复制相似问题