Серийный номер процессора FreeBSD

Вопрос или проблема

Я пытаюсь прочитать информацию о серийном номере процессора с сервера, на котором установлена FreeBSD.

Я попробовал следующее, но без результата:

  • sysctl
  • dmesg
  • cpucontrol

Эти утилиты не существуют на системе:

  • Dmidecode
  • Cpuinfo
  • cpuid
  • директория /proc

Я не могу установить какое-либо программное обеспечение на сервер.

Есть идеи, как это решить?

Спасибо!

Пакет “cpuid” существует на FreeBSD, но не входит в базовую систему.

Пример вывода:

root@freeBSD > cpuid
 eax in    eax      ebx      ecx      edx
00000000 00000005 756e6547 6c65746e 49656e69
00000001 000106e5 01040800 00000201 178bfbff
00000002 55035a01 00f0b2e4 00000000 09ca212c
00000003 00000000 00000000 00000000 00000000
00000004 0c000021 01c0003f 0000003f 00000000
00000005 00000000 00000000 00000000 00000000
80000000 80000008 00000000 00000000 00000000
80000001 00000000 00000000 00000001 28100800
80000002 65746e49 2952286c 726f4320 4d542865
80000003 37692029 55504320 20202020 20202020
80000004 30363820 20402020 30382e32 007a4847
80000005 00000000 00000000 00000000 00000000
80000006 00000000 00000000 01006040 00000000
80000007 00000000 00000000 00000000 00000000
80000008 00003024 00000000 00000000 00000000

Идентификатор производителя: "GenuineIntel"; уровень CPUID 5

Специфичные функции Intel:
Версия 000106e5:
Тип 0 - Оригинальный OEM
Семейство 6 - Pentium Pro
Модель 30 - процессор Intel Core i7 или Xeon, 45 нм
Шаг 5
Резерв 0

Расширенная строка бренда: "Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz"
Размер кэш-линии инструкции CLFLUSH: 8
Начальный идентификатор APIC: 1
Потоки гипертехнологии: 4

Флаги функций: 178bfbff:
FPU    Устройство с плавающей запятой
VME    Усовершенствования виртуального режима 8086
DE     Расширения отладки
PSE    Увеличения размера страницы
TSC    Счетчик временных меток
MSR    Регистры специфичные для модели
PAE    Расширение физического адреса
MCE    Исключение проверки машины
CX8    Инструкция COMPXCHG8B
APIC   На чипе присутствует и включен продвинутый программируемый контроллер прерываний
SEP    Быстрый системный вызов
MTRR   Регистры диапазона типов памяти
PGE    Глобальный флаг PTE
MCA    Архитектура проверки машины
CMOV   Условные перемещения и инструкции сравнения
FGPAT  Таблица атрибутов страницы
PSE-36 Увеличение размера страницы 36 бит
CLFSH  Инструкция CFLUSH
MMX    Набор инструкций MMX
FXSR   Быстрая FP/MMX потоковая SIMD расширения сохранения/восстановления
SSE    Набор инструкций потоковых SIMD расширений
SSE2   Расширения SSE2
HT     Гипертехнология

Флаги функций установленного набора 2: 00000201:
SSE3     Расширения SSE3
SSSE3    Дополнительное потоковое SIMD расширение 3

Расширенные флаги функций: 28100800:
SYSCALL   Инструкции SYSCALL/SYSRET
XD-bit    Бит отключения выполнения
RDTSCP    RDTSCP и IA32_TSC_AUX доступны
EM64T     Расширенная память Intel 64 технологии

Расширенные флаги функций установленного набора 2: 00000001:
LAHF      LAHF/SAHF доступны в режиме IA-32e

Информация о TLB и кэше:
5a: TLB данных: 2MB или 4MB страницы, 4-кратная ассоциативность, 32 записи
03: TLB данных: 4KB страницы, 4-кратная ассоциативность, 64 записи
55: TLB команд: 2MB или 4MB страницы, полностью ассоциативный, 7 записей
e4: Кэш третьего уровня: 8MB, 16-кратная ассоциативность, 64 байта размер линии
b2: TLB команд: 4-KB страницы, 4-кратная ассоциативность, 64 записи
f0: 64 байта предвыборки
2c: Первичный кэш данных: 32-KB, 8-кратная ассоциативность, 64 байта размер линии
21: L2 (MLC) 256-KB, 8-кратная ассоциативность, 64 байта размер линии
ca: Общий TLB второго уровня: 4-KB страницы, 4-кратная ассоциативность, 512 записей
09: Первичный кэш команд: 32KB, 4-кратная ассоциативность, 64 байта размер линии
Серийный номер процессора: 0001-06E5-0000-0000-0000-0000

Я думаю, что значение, которое вы ищете, это “Серийный номер процессора”. Поэтому простой cpuid | grep "Серийный номер процессора" справится с задачей.

Как вы сказали, вы не можете установить что-то на своем сервере, вы все еще можете:

  • найти тихое место, например /tmp (если хотите оставить след/мусор небольшой),
  • получить предварительно скомпилированный пакет:

    fetch ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages/misc/cpuid-3.3_6.tbz
    

    (откорректируйте URL в зависимости от архитектуры вашего сервера – см. uname -a для получения дополнительной информации)

  • извлечь бинарный файл “cpuid” из него:

    tar -jxvf cpuid-3.3_6.tbz bin/cpuid`
    
  • и выполнить его локально:

    ./bin/cpuid
    

Я пробовал […] cpucontrol

Что ж, вы не потрудились прочитать его справочную страницу. Всегда была ссылка на cpuctl(4).

  1. Убедитесь, что cpuctl модуль ядра загружен
    kldload cpuctl
    

    и будет загружен после перезагрузки

    cat >> /boot/loader.conf < 'EOT'
    cpuctl_load="YES"
    EOT
    

    cpuctl не является частью сборки GENERIC. Если cpuctl не загружен или встроен, нет устройств /dev/cpuctl*. Поэтому cpucontrol не может работать.

  2. Определите номер уровня для запроса серийного номера процессора. Для процессоров x86 это 0x03
    cpucontrol -i 3 /dev/cpuctl0
    

    Вы можете заметить, что он показывает все нули. На самом деле серийный номер процессора был отменен в пользу конфиденциальности.

Так что вы хотите достигнуть, получив PSN? Если вам просто нужен идентификатор, который имеет большую вероятность быть уникальным в вашей сети, но не важен конкретный процессор, вы можете использовать:

  • /etc/hostid (заполняется /etc/rc.d/hostid)
  • sysctl kern.hostuuid
  • kenv smbios.system.uuid

“Серийный номер процессора”, сообщаемый инструментом cpuid, представленным в ответе Ouki, на самом деле представляет собой просто информацию о версии процессора с некоторыми лишними нулями. Вы можете получить те же данные (без дефисов) с cpucontrol:

cpucontrol -i 1 /dev/cpuctl0 | {
    read -r line
    # Удалите префикс “cpuid level 0x1: ”.
    printf "${line#*: }" | {
        read -r EAX EBX ECX EDX dummy
        [ "${dummy}" ] && { printf 'Неожиданный формат вывода.\n.' ; exit 1 ; }
        # Серийный номер `cpuid.0x03` имел 96 значимых бит = 24 шестнадцатеричных знака.
        printf '%08x%016x\n' "${EAX:?Неожиданный формат вывода.}" '0'
    }
}

Если вы не хотите мириться с cpucontrol, информация обычно также сообщается при загрузке, как уже указывал arved.

grep -F 'Id=' /var/run/dmesg.boot  # не гарантируется, что покажет строку

Ответ или решение

Чтобы извлечь серийный номер процессора на сервере с операционной системой FreeBSD, необходимо учитывать ограничения, которые вы упомянули: недоступность ряда утилит и невозможность установки программного обеспечения. Давайте подробно разберем возможные подходы к решению вашей задачи.

Использование утилиты cpuid

Хотя утилита cpuid не входит в базовую сборку FreeBSD, её можно загрузить как предварительно скомпилированный пакет. Выполните следующие шаги:

  1. Скачивание пакета:
    Используйте команду fetch для получения необходимого пакета. В зависимости от архитектуры вашего сервера команда может выглядеть так:

    fetch ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages/misc/cpuid-3.3_6.tbz
  2. Извлечение утилиты:
    После скачивания распакуйте пакет с помощью команды:

    tar -jxvf cpuid-3.3_6.tbz bin/cpuid
  3. Запуск утилиты:
    Сейчас вы можете запустить утилиту cpuid:

    ./bin/cpuid

Таким образом, вы получите информацию о процессоре, включая его серийный номер. Смотрите строку, содержащую "Processor serial", для получения нужного значения.

Альтернативы при отсутствии cpuid

Если по каким-то причинам вы не можете использовать вышеупомянутый метод, у вас есть другие варианты:

  1. Загрузка и установка модуля cpuctl:
    Для этого выполните следующую команду для загрузки модуля:

    kldload cpuctl

    Чтобы модуль загружался после перезагрузки, добавьте в файл /boot/loader.conf строку:

    echo 'cpuctl_load="YES"' >> /boot/loader.conf
  2. Использование cpucontrol:
    После загрузки модуля cpuctl, можно проверять серийный номер с помощью cpucontrol:

    cpucontrol -i 3 /dev/cpuctl0

Обратите внимание, что в современных процессорах серийные номера часто не доступны по соображениям конфиденциальности и могут возвращать нулевые значения.

Альтернативные идентификаторы

Если вам нужно просто уникально идентифицировать сервер без использования серийного номера процессора, вот несколько альтернатив:

  • /etc/hostid: Это файл, который содержит уникальный идентификатор системы.
  • Команда sysctl для получения UUID системы:
    sysctl kern.hostuuid
  • Команда kenv, если вы используете поддержку ACPI:
    kenv smbios.system.uuid

Эти методы предоставят вам уникальный идентификатор системы, который может быть использован для ваших целей.

Заключение

Хотя чтение серийного номера процессора на FreeBSD может представлять некоторую сложность, особенно с ограничениями на установку пакетов, вышеприведенные методы позволяют вам получить необходимую информацию. Выбор конкретного способа зависит от вашей ситуации и доступных инструментов. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за подробностями или уточнениями.

Оцените материал
Добавить комментарий

Капча загружается...