2

В настоящее время я пытаюсь создать доверенное файловое хранилище для механизма лицензирования FlexNET в контейнере Docker. Проблема заключается в том, что механизм лицензирования требует от меня постоянных UUID, VMID и MAC-адреса.

Я нашел, как установить MAC-адрес контейнера. Но у меня проблемы с настройкой UUID и VMID контейнера Docker.

Насколько я вижу, механизм лицензирования считывает UUID из:

/sys/class/dmi/id/product_uuid 

Который связан с ядром и поэтому не может быть изменен напрямую.

Итак, мой вопрос: есть ли способ изменить содержимое этого файла из Docker без необходимости перестраивать ядро операционной системы?

1 ответ1

0

Я могу придумать два способа изменить product_uuid , если я правильно понимаю ваш вопрос.

Монтирование над product_uuid

Вы можете привязать файл с хоста к этому пути в контейнере. Поэтому вместо вызова sysfs при чтении этого пути он будет читать смонтированный файл.

Например:

$ echo "new-uuid" > /var/tmp/product_uuid
$ docker run --rm -ti -v /var/tmp/product_uuid:/sys/class/dmi/id/product_uuid centos bash
[root@217e12a74e74 /]# cat /sys/class/dmi/id/product_uuid
new-uuid

chroot внутри изображения

Если вы не хотите монтировать в файл и хотите, чтобы это полностью содержалось в контейнере, другой способ сделать это - использовать chroot при построении изображения.

Ниже приведен пример Dockerfile, который устанавливает оболочку внутри chroot :

FROM centos:7

RUN mkdir -p /chroot /chroot/sys/class/dmi/id \
  && cp -al /lib /lib64/ /usr/ chroot/ || echo "Ignoring linking issues ..." \
  && echo "new-uuid" > /chroot/sys/class/dmi/id/product_uuid

CMD chroot /chroot sh

Когда мы запускаем это, он запускает оболочку по умолчанию внутри нашего chroot:

$ docker run -ti --rm uuid-test 
sh-4.2# cat /sys/class/dmi/id/product_uuid
new-uuid

Для вашего случая использования вам также нужно добавить ваше приложение и его зависимости в chroot , а также заменить sh на команду запуска приложений. Также обратите внимание, что это означает, что /sys/ будет содержать только файл /sys/class/dmi/id/product_uuid .

Другие способы?

Сверх того, я не уверен в каком-либо другом простом способе сделать это, так как docker всегда будет монтировать sysfs в /sys - если вы не укажете /sys как VOLUME в Dockerfile, но я не думаю, что помогите здесь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .