Я изучал это в течение нескольких часов, кажется, метод sd_bus_start был изменен, чтобы включить дополнительные проверки. Я не смог определить, что еще он ищет, однако я смог найти более элегантное решение для выполнения той же задачи с помощью удаленных команд systemctl вместо монтирования всех каталогов с хоста.
Удаленная системаctl
systemctl
поддерживает удаленные команды через --хост / -Х
флаг. Он использует ssh для подключения к удаленному хосту, поэтому потребуется пара ключей ssh. Поскольку мы контролируем хост, на котором находимся, это довольно просто настроить.
Команда Docker (или аргумент Kubernetes)
Вот полная команда, которую можно использовать, я разберу каждую часть ниже. Предполагается, что контейнер имеет systemctl
и ssh
установлен, контейнер работает в хост-сети и что корень
домашний каталог учетной записи смонтирован (вы можете использовать его по-другому, если хотите).
(ls ~/.ssh/id_rsa || ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "")
&& (grep -qxF $(cat ~/.ssh/id_rsa.pub) ~/.ssh/authorized_keys || echo $(cat ~/.ssh/id_rsa.pub) > ~/.ssh/authorized_keys)
&& (grep -qxF "StrictHostKeyChecking no" ~/.ssh/config || echo "StrictHostKeyChecking no" >> ~/.ssh/config)
&& (grep -qxF "UserKnownHostsFile /dev/null" ~/.ssh/config || echo "UserKnownHostsFile /dev/null" >> ~/.ssh/config)
&& systemctl -H [email protected] запустить nfs-server.service
Эта команда проверяет, ~/.ssh/id_rsa
файл существует, в противном случае создайте его.
(ls ~/.ssh/id_rsa || ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "")
Теперь мы добавляем наш открытый ключ к нашим авторизованным ключам, если он еще не существует в файле.
(grep -qxF "$(cat ~/.ssh/id_rsa.pub)" ~/.ssh/authorized_keys || echo "$(cat ~/.ssh/id_rsa.pub)" > ~/.ssh/authorized_keys)
Вероятно, это можно сделать более безопасным, поместив его в раздел конфигурации ssh только для 127.0.0.1
, но нам нужно
(grep -qxF "StrictHostKeyChecking no" ~/.ssh/config || echo "StrictHostKeyChecking no" >> ~/.ssh/config)
&& (grep -qxF "UserKnownHostsFile /dev/null" ~/.ssh/config || echo "UserKnownHostsFile /dev/null" >> ~/.ssh/config)
Наконец-то мы имеем настоящее systemctl
команда. Обратите внимание на -H корень@127.0.0.1
.
systemctl -H [email protected] запустить nfs-server.service
Для максимальной безопасности было бы лучше сначала настроить ключи и пользователей за пределами контейнеров (через Ansible или аналогичный) и разрешить только systemctl -H
команда внутри контейнера.