上書きせずにUSBフラッシュドライブにカスタムシリアル番号を保存する

上書きせずにUSBフラッシュドライブにカスタムシリアル番号を保存する

私はUSBフラッシュドライブの多くを使用しています。 USBドライブのイベントを追跡したいです。具体的にはテストを行いf3、ドライブをフォーマットし、ドライブにデータを書き込みます。

シリアル番号をそのまま維持しながら、ドライブでさまざまな操作を実行できるように、ドライブにデジタルタグを付ける方法(UUIDなど)を探しています。他の人がドライブを使用してフォーマットした後でも、後でシリアル番号を読むことができたらと思います。

USBデバイスで報告されたシリアル番号を試してみましたが、ほとんどのドライブには一意の識別情報が保存されていないことをすぐに見つけました。

だから私は自分のCRCと接続を使ってUUIDを生成するのに苦労しました。

ただし、シリアル番号をファイルシステムに書き込むことは、ドライブがいっぱいになるとシリアル番号のすべてのコピーが上書きされることを意味します。

最近のアイデアは、シリアル番号を保存できるようにドライブを分割し、分割されていない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

次に、シリアル番号のリストを取得し、一致するチェックサムがある番号が見つかるまで評価します。

潜在的に欠陥のあるドライブを使用しているため、少なくとも1つのコピーが維持されるように、複数のコピーにシリアル番号を記録する必要があります。

もちろん、Flashを自分で作成せずに自分がやろうとしていることを達成するためのより良い方法があるかどうか疑問に思います。

編集者:ウッドワード

一意の識別子を取得するために、ドライブ自体のさまざまな読み取り専用情報を試すことができます。

$ 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

しかし、ここでは、同じ値を返す多くのドライブに会うことになると確信しています。これにより、このアプローチは役に立ちません。

編集2:

ほぼ1600個のデータポイントを蓄積し、ほとんどのドライブは独自のハッシュを生成しているようですが、まだ同じハッシュを返すドライブは約400個あるため、この方法では不十分です。

答え1

装置のIDは、ID_SERIALしばしば装置の身元を確認するために使用することができる。

これはデバイス自体のプロパティなので、さまざまな形式にわたって持続しますが、私が知っている限り、同じ理由で変更することはできません。

以下を実行して取得できます。udevadm info /dev/sdX | grep ID_SERIAL=

答え2

永続的なデバイス命名(異なるマウントポイントに同じ名前)は達成するのが難しい目標です。以下のように、複数のUUIDが複数のコンテナ(ファイルシステム、マウントポイントなど)に作成されます。詳細な説明はこちら

UUID(実際にはWWID(Worldwide Identifier))USBデバイスのハードウェアによって提供される接続は次のように提供できます。

ls -l /dev/disk/by-id/

ただし、すべてのデバイスがこれらの番号をサポートしているわけではありません。

答え3

一部のフラッシュドライブはフォーマット後に一意に識別できません。最善の方法は、カスタムパーティションUUIDを設定するか、より良いストレージにアップグレードすることです。

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

関連情報