首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将自定义序列号存储在USB闪存驱动器上,不受覆盖。

将自定义序列号存储在USB闪存驱动器上,不受覆盖。
EN

Unix & Linux用户
提问于 2018-06-08 15:10:06
回答 3查看 4.5K关注 0票数 4

我正在处理大量的USB闪存。我希望能够跟踪有关USB驱动器的事件。具体来说:我执行f3测试,格式化驱动器并向它们写入数据。

我正在寻找一种方法,以数字标记驱动器(例如,用一个UUID),以便我可以执行各种行动的驱动器,同时保持序列号完好无损。希望也有其他人使用和格式化的驱动器,仍然允许我读取他们的序列号以后。

我尝试使用USB设备报告的序列号,但我很快发现大多数驱动器中没有唯一的标识信息存储在其中。

因此,我已经厌倦了生成一个UUID,它与它自己的CRC和连接,这样我就可以将该字符串写入驱动器并读取它,验证它是否被正确存储。

但是,将序列号写入文件系统意味着,一旦驱动器被填满,序列号的每个副本都将被覆盖。

我的最新想法是对驱动器进行分区,留下1MB未分区的空空间,这样我就可以将序列号存储在那里。

这将对驱动器的有用性产生轻微的影响,但应该允许我在一定程度上可靠地识别驱动器,只要驱动器不会被重新分区。

理想情况下,每个驱动器将有一个UUID写到大容量存储驱动芯片,并将报告-但我不制造驱动器。

我想要生成这样的序列号(Bash):

代码语言:javascript
运行
复制
UUID=$(uuidgen)
CK=$(echo "$UUID" | cksum | cut -c -8)
SN="SN:$UUID:$CK;"
echo $SN

这将生成一个UUID,计算该UUID的CRC和,只留下该和的8个前字符(因为长度可能会变化,我们需要一个常量长度来有效地搜索模式)。然后将其与一些标记连接起来,这些标记可用于提取数据流中的数字,并验证它是否损坏。

示例序列号:

代码语言:javascript
运行
复制
SN:7199e42e-465b-4baf-96b6-a109247d3f4b:39272476;
SN:aa795142-fa2e-4929-b93b-e991f95a74cd:40619286;
SN:43f93702-eda9-4089-9a81-d21172e051bf:37174302;

然后我可以验证序列号的完整性,如下所示:

代码语言:javascript
运行
复制
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从驱动器中提取序列号:

代码语言:javascript
运行
复制
cat /dev/sdX | grep -E "SN:.{8}-.{4}-.{4}-.{4}-.{12}:.{8};" -o

然后我会得到一个序列号的列表,并对它们进行评估,直到我找到一个匹配的校验和。

因为我工作的驱动器可能有问题,所以我需要在多个拷贝中写入序列号,这样至少有一个拷贝才能存活下来。

我想知道是否有更好的方法来实现我想做的事情--当然不用制造我自己的闪存,

EDIT: UDEVADM

我可以尝试使用驱动器本身的各种只读信息获取唯一标识符:

代码语言:javascript
运行
复制
$ 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个返回相同散列的驱动器,因此仅用这个方法是不够的。

EN

回答 3

Unix & Linux用户

发布于 2018-06-08 15:31:44

设备的ID_SERIAL通常用于验证设备的标识。

因为它是设备本身的属性,所以它跨格式是持久的;但是,afaik,由于同样的原因,您不能更改它。

您可以通过运行:udevadm info /dev/sdX | grep ID_SERIAL=获得它。

票数 1
EN

Unix & Linux用户

发布于 2018-06-08 21:53:39

持久化设备命名(不同挂载点的名称相同)是一个难以实现的目标。有几个UUID作为在这里详细描述在几个容器(文件系统、挂载点等)中创建。

连接的UUID (实际上是一个世界性标识符) 由USB设备的硬件给出可以给出:

代码语言:javascript
运行
复制
ls -l /dev/disk/by-id/

但是要明白,并不是所有的设备都支持这样的编号。

票数 0
EN

Unix & Linux用户

发布于 2018-06-11 10:32:47

有些闪存在格式之后是不可唯一标识的,最好的方法是设置自定义分区UUID或升级到更好的存储。

https://superuser.com/questions/1247972/change-uuid-of-vfat-partition

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/448660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档