まず、CPUIDは間違いであることに注意を喜ばない、後のIntel Pentium III以上の任意のシステムのために一般的にアクセス可能一意に識別マーカー。MACアドレスでハッシュすることで確実に一意のマーカーが得られる可能性がありますが、これはMAC自体の一意の品質のみによるものであり、その場合のCPUIDは状況にすぎません。さらに、結果のハッシュはマザーボードのUUIDよりも一意である可能性は低く、それを取得する方がはるかに簡単であり、プロセスのエラーがはるかに少なくなります。wikipedia.org/wiki/cpuidから:
EAX = 3:プロセッサーのシリアル番号
参照:Pentium III§プライバシーの問題に関する論争
これは、プロセッサのシリアル番号を返します。プロセッサのシリアル番号はIntel Pentium IIIで導入されましたが、プライバシーの問題により、この機能は後のモデルでは実装されなくなりました(PSN機能ビットは常にクリアされます)。TransmetaのEfficeonおよびCrusoeプロセッサもこの機能を提供します。ただし、AMD CPUは、どのCPUモデルにもこの機能を実装していません。
解析したcpuidを自分で表示することcat /proc/cpuinfo
も、単に実行することもできますlscpu
。
これにより、Linuxカーネルによって認識されるネットワークインターフェイスのすべてのMACアドレスが取得されます。
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
ランダムに生成されたMACを持つ仮想NICが含まれている可能性がある場合、そのリストをフィルタリングする必要があります。これを行うには、ip
直接呼び出しのフラグを使用します。ip a help
その方法については、を参照してください。
また、この問題は固有のものではなく、ip
使用する場合にも対処する必要がありますが、ネットワークスイートの一部であり、アクティブに維持される- メンバーifconfig
よりも確実に処理できることに注意してくださいパッケージと最後ののこぎり、Linuxの2001年にリリース。前回のリリース以降にカーネルの機能が変更されたため、一部のネットワーク機能フラグを誤って報告することが知られており、可能な限りその使用を避ける必要があります。ip
iproute2
ifconfig
net-tools
ifconfig
ただし、カーネルインターフェイス名のようなフィルタリングeth[0-9]
はそうするための信頼できる手段ではないことを理解してください。これらudev
はブートプロセス中の並列検出の順序に基づいて変化する可能性があるためです。詳細については、予測可能なネットワーク名を参照してください。
dmidecode
システムにインストールされていないため、最初に次のように生成されたハードディスクシリアルのリストをハッシュ化することを考えました。
lsblk -nro SERIAL
くださいlsblk --help
ディスクの種類によって、言う-精錬そのリストにいくつかの手がかりを。またlspci
、および/またはlsusb
多分を検討してください。
それらを組み合わせるのは簡単です:
{ ip a | sed ... ; lsblk ... ; } | #abbreviated... for brevity...
tr -dc '[:alnum:]' | #deletes all chars not alphanumeric - including newlines
sha256sum #gets your hash
通知されたように、ユーザーのリソースを一意のIDにキー入力しているため、ハードディスクが存在することに依存できないため、タックを変更することを考えました。
それを考慮して、私はファイルシステムをもう一度調べて、/sys/class/dmi/id
フォルダーを見つけました。私はいくつかのファイルをチェックしました:
cat ./board_serial ./product_serial
###OUTPUT###
To be filled by O.E.M.
To be filled by O.E.M.
ただし、これはかなり良いようですが、出力を公開しません。
sudo cat /sys/class/dmi/id/product_uuid
dmidecode
とにかく多くの情報を取得する場所であり、実際にはそのように見えます。man dmidecode
また、引数を指定することにより、そのツールの使用を大幅に簡素化することができます:
dmidecode -s system-uuid
ただし、さらにシンプルなのは、ファイルを読むだけです。この特定のファイルは、マザーボードを明確に識別することに注意してください。これらは、仮想ファイルシステムへのこれらのエクスポートを最初に実装した2007カーネルパッチからの抜粋/sysfs
です。
+DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor, 0444, DMI_BIOS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_version, 0444, DMI_BIOS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_date, 0444, DMI_BIOS_DATE);
+DEFINE_DMI_ATTR_WITH_SHOW(sys_vendor, 0444, DMI_SYS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(product_name, 0444, DMI_PRODUCT_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(product_version, 0444, DMI_PRODUCT_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(product_serial, 0400, DMI_PRODUCT_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(product_uuid, 0400, DMI_PRODUCT_UUID);
+DEFINE_DMI_ATTR_WITH_SHOW(board_vendor, 0444, DMI_BOARD_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(board_name, 0444, DMI_BOARD_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(board_version, 0444, DMI_BOARD_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(board_serial, 0400, DMI_BOARD_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(board_asset_tag, 0444, DMI_BOARD_ASSET_TAG);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_vendor, 0444, DMI_CHASSIS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_type, 0444, DMI_CHASSIS_TYPE);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_version, 0444, DMI_CHASSIS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_serial, 0400, DMI_CHASSIS_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_asset_tag, 0444, DMI_CHASSIS_ASSET_TAG);
マザーボードが十分であれば、そのデータを単独で使用してシステムを識別できる場合があります。ただし、この情報をシステムのMACと組み合わせることができます。これは、ハードディスクで行う可能性があることを示しました。
sudo sh <<\CMD | tr -dc '[:alnum:]' | sha256sum
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
cat /sys/class/dmi/id/product_uuid
CMD
LinuxカーネルはUUIDを生成することもできます:
cat /proc/sys/kernel/random/uuid #new random uuid each time file is read
または:
cat /proc/sys/kernel/random/boot_id #randomly generated per boot
確かに、それはランダムに生成され、IDの割り当てを再考する必要がありますが、少なくとも簡単に取得できます。そして、それをキーイングする手段を見つけることができれば、それはかなりしっかりしているはずです。
最後に、UEFIシステムでは、これがはるかに簡単になります-すべてのEFIファームウェア環境変数には独自のUUIDが含まれているためです。環境変数{Platform,}LangCodes-${UUID}
はすべてのUEFIシステムに存在する必要があり、再起動およびほとんどのファームウェアのアップグレードと変更を維持する必要があり、efivarfs
モジュールがロードされたLinuxシステムはいずれかまたは両方の名前を単純に次のようにリストできます。
printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*
古い形式- LangCodes-${UUID}
明らかに非推奨になり、新しいシステムでは廃止されるはずですPlatformLangCodes-${UUID}
が、仕様によれば、いずれかのUEFIシステムにいずれかが存在する必要があります。わずかな労力で、独自の再起動永続変数を定義でき、その方法でカーネルのUUIDジェネレーターをさらに活用できます。興味があれば、efitoolsを調べてください。