Вопрос или проблема
Я хочу запустить виртуальную машину с Alpine Linux и подключить TPM хоста к ВМ. Хост основан на x86_64. Команда для qemu:
qemu-system-aarch64 \
-m 1024 -cpu cortex-a57 -M virt \
-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \
-drive file=disk.qcow2,if=virtio,format=qcow2 \
-cdrom alpine-3.21.3-aarch64.iso \
-nographic \
-device virtio-net-device,netdev=n0 \
-netdev user,id=n0 \
-tpmdev type=passthrough,id=tpm0,path=/dev/tpmrm0,cancel-path=/dev/tpmrm0 \
-device tpm-tis-device,tpmdev=tpm0
Что касается установочного диска alpine-3.21.3-aarch64.iso
, я пробовал как “стандартную”, так и “virt” версию с этого сайта. Они обе загружаются нормально, установка также проходит успешно, но ни одна из них не позволяет мне получить доступ к tpm хоста. На хосте TPM работает нормально, что я могу проверить, например, с помощью tpm2_getrandom 8 --hex
и факта наличия /dev/tpm0
и /dev/tpmrm0
.
На ВМ эти два устройства отсутствуют, и я не могу заставить это работать. Вот некий вывод отладки с ВМ:
$ dmesg | grep -i tpm
[ 0.000000] efi: SMBIOS 3.0=0x7fed0000 TPMFinalLog=0x7c3e0000 MEMATTR=0x7e227018 ACPI 2.0=0x7c3d0018 TPMEventLog=0x7c3d9098 INITRD=0x7c3c9b18 MEMRESERVE=0x7c3c9b98
[ 0.000000] ACPI: TPM2 0x000000007C3DE898 00004C (v04 BOCHS BXPC 00000001 BXPC 00000001)
Я уже добавил модуль ядра tpm_tis_spi
в /etc/modules
. Поэтому я вижу:
$ lsmod | grep -i tpm
tpm_tis_spi 20480 0
tpm_tis_core 28672 1 tpm_tis_spi
tpm 102400 2 tpm_tis_core,tpm_tis_spi
rng_core 20480 1 tpm
Кажется, имеются некоторые доступные драйверы:
$ find /lib/modules/$(uname -r) -name '*tpm*'
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm/tpm.ko.gz
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm/tpm_tis_spi.ko.gz
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm/tpm_tis_core.ko.gz
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm/tpm_atmel.ko.gz
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm/xen-tpmfront.ko.gz
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm/tpm_infineon.ko.gz
/sys/class/tpm/
и /sys/class/tpmrm/
существуют, но пусты.
На хосте, из tpm2_getcap properties-fixed
, я выяснил, что TPM – это Infineon SLB9670. На ВМ это просто выдает сообщение об ошибке (как и ожидалось):
$ tpm2_getcap properties-fixed
ERROR:tcti:src/tss2-tcti/tcti-device.c:455:Tss2_Tcti_Device_Init() Failed to open specified TCTI device file /dev/tpmrm0: No such file or directory
ERROR:tcti:src/tss2-tcti/tctildr-dl.c:149:tcti_from_file() Could not initialize TCTI file: device
ERROR:tcti:src/tss2-tcti/tctildr.c:477:tctildr_init_context_data() Failed to instantiate TCTI
ERROR: Could not load tcti, got: "(null)"
Что я упускаю?
Основываясь на некоторых аналогичных проблемах, с которыми я сталкивался в прошлом, я предполагаю, что существует несоответствие между архитектурой ВМ и эмуляцией устройства TPM.
Вы пытаетесь использовать хост на основе x86_64
, но ваша ВМ является ARM:
QEMU может эмулировать как 32-битные, так и 64-битные процессоры Arm. Используйте qemu-system-aarch64 для симуляции 64-битной машины Arm.
Это означает, что passthrough для TPM не такой простой, каким бы он был в противном случае, так как (насколько я помню) -device tpm-tis-device
предназначено для машин x86. Эта документация предполагает, что sysbus
может быть подходящим вариантом для машины ARM; однако, когда я попытался проверить это на своей машине, это не было доступной опцией:
$ qemu-system-aarch64 -device help | grep tpm
name "tpm-tis-device", bus System
name "tpm-tis-i2c", bus i2c-bus
Так что мое первое предложение, если это возможно, – пробовать запускать Alpine VM, которая не использует ARM. На сайте загрузки, который вы привели, доступны как x86_64
, так и x86
опции, и я бы предположил, что они будут работать проще в данном случае.
Если вам нужен ARM, к сожалению, у меня закончились идеи, я тоже уже час ломаю над этим голову.
Ответ или решение
Определение серверной среды и использование технологий виртуализации, таких как QEMU, в сочетании с аппаратными модулями безопасности, например, чипами TPM (модули доверенной платформы), — это современный подход к IT-инфраструктуре, который требует внимательного подхода к настройке и интеграции. Давайте рассмотрим вашу ситуацию более подробно.
Теория
Во-первых, разберемся с основными компонентами. TPM (Trusted Platform Module) служит для выполнения криптографических операций и обеспечивает безопасность на уровне оборудования. Он часто используется для хранения криптографических ключей, которые необходимы для шифрования данных и обеспечения безопасности на уровне операционной системы. QEMU, с другой стороны, — это программное обеспечение с открытым исходным кодом, которое позволяет запускать виртуальные машины. Оно часто используется вместе с KVM (модуль ядра для виртуализации в Linux) для достижения более высокой производительности.
Вашей задачей является запуск виртуальной машины под управлением Alpine Linux на архитектуре ARM64 (aarch64) с подключением хостового чипа TPM, который находится на платформе x86_64. Это поднимает несколько технических вызовов, особенно в связи с различиями архитектур и особенностями эмуляции TPM в QEMU.
Пример
На практике ваш текущий подход включает использование команды следующим образом:
qemu-system-aarch64 \
-m 1024 -cpu cortex-a57 -M virt \
-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \
-drive file=disk.qcow2,if=virtio,format=qcow2 \
-cdrom alpine-3.21.3-aarch64.iso \
-nographic \
-device virtio-net-device,netdev=n0 \
-netdev user,id=n0 \
-tpmdev type=passthrough,id=tpm0,path=/dev/tpmrm0,cancel-path=/dev/tpmrm0 \
-device tpm-tis-device,tpmdev=tpm0
Команда создает виртуальную машину с эмуляцией ARM, где используется эллиптическая прошивка UEFI для ARM, и осуществляется попытка сквозного подключения TPM с помощью параметров -tpmdev
и -device
.
Хотя TPM и доступен на хосте, он не отображается в гостевой системе, что означает, что передача не настраивается надлежащим образом. Должны быть созданы устройства /dev/tpm0
или /dev/tpmrm0
в гостевой системе, но они отсутствуют, что вызывает именно ту ошибку, которую вы наблюдаете:
ERROR:tcti:src/tss2-tcti/tcti-device.c:455:Tss2_Tcti_Device_Init() Failed to open specified TCTI device file /dev/tpmrm0: No such file or directory
Применение
Проблема заключается в потенциальной несовместимости архитектуры QEMU и TPM. tpm-tis-device
обычно используется для x86 машин. Для ARM систем лучше подходит использование tpm-tis-i2c
или sysbus
. Однако нужно учитывать, что ARM-стек поддержки для TPM в qemu может не быть столь же зрелым, как для x86.
Ваша гостевая система загружает модули ядра для поддержки TPM, такие как tpm_tis_spi
и tpm_tis_core
, но без подключения аппаратного устройства TPM они не смогут создать соответствующие устройства в файловой системе Linux.
Рекомендации
-
Проверить архитектуру VM:
Рассмотрите возможность перейти на Alpine Linux с архитектурой x86_64, если это не принципиально — это значительно упростит интеграцию с TPM. -
Эмуляция TPM:
Рассмотрите возможность использования эмуляции TPM, а не сквозного подключения. QEMU поддерживает эмуляцию TPM, что может быть альтернативой:-tpmdev emulator,id=tpm0,chardev=chrtpm \ -chardev socket,id=chrtpm,path=/var/tmp/swtpm-sock
Это создаст локальное программное обеспечение TPM (swtpm), которое может быть использовано для разработки и тестирования функций, зависящих от TPM.
-
Проверка версии QEMU:
Убедитесь, что ваша версия QEMU поддерживает нужный функционал для работы с ARM и TPM. Обновление до последней версии QEMU может содержать исправления и новые функции для ARM эмуляции. -
Discussion with TPM specifics:
При необходимости обратитесь к документации TPM производителя и сообществу QEMU, чтобы узнать о возможных обновлениях и новых методах интеграции для ARM.
Эти шаги могут помочь в решении проблемы и успешной интеграции TPM в виртуальную машину под управлением Alpine Linux на архитектуре aarch64.