첫째, 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 모델에서이 기능을 구현하지 않습니다.
구문 분석 된 CPU를 직접 cat /proc/cpuinfo
또는 심지어 수행하여 볼 수도 있습니다 lscpu
.
이것은 리눅스 커널이 인식하는 네트워크 인터페이스에 대한 모든 MAC 주소를 얻는다.
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
임의로 생성 된 MAC을 가진 가상 nic를 포함 할 수있는 경우이 목록을 필터링해야합니다. ip
직접 호출 할 때 플래그를 사용하여이 작업을 수행 할 수 있습니다 . ip a help
그렇게하는 방법에 대한 정보는 참조하십시오 .
또한이 문제는 고유하지 않으며 , ip
사용하는 경우에도 처리해야 ifconfig
하지만 ip
, iproute2
네트워크 제품군의 일부이며 ifconfig
구성원 인 경우보다 더 안정적으로 처리 할 수 있습니다. 의 net-tools
패키지 리눅스와 마지막 톱 2001 년 출시 . 마지막 릴리스 이후 커널의 기능 변경으로 인해 일부 네트워킹 기능 플래그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를 살펴 보십시오 .