Моя установка: Virtualbox с хостом Windows и гостевым сервером Ubuntu. Ubuntu теперь 21.04, но проблема существовала до обновления с 20.04. А на сервере Ubuntu я запускаю Docker.
Проблема: общие ресурсы виртуального бокса, которые, как мне кажется, монтируются гостевыми аддонами Vbox, монтируются только после запуска Docker. Контейнеры запускаются нормально, поскольку их конфигурация находится в / home, который является локальным диском, однако у них есть данные на общем ресурсе. Поскольку Docker запускается до монтирования общих ресурсов, контейнеры привязываются к точке монтирования как к каталогу, а не к монтированию, и они могут записывать на диск, заполняя корневую файловую систему невидимыми файлами.
В последнее время я не вносил никаких изменений, кроме того, что следил за обновлениями Ubuntu, но мне кажется, что я мог где-то в прошлом уснуть, чтобы обойти это. Я мог бы попробовать сделать это снова, но это кажется довольно неэлегантным, и я подумал, может ли быть лучший способ через systemd или иначе.
Я безуспешно пробовал использовать директивы number или systemd. RequiresMountsFor и ConditionPathIsMountPoint - вот два, которые, как я думал, могут сработать. Я также попытался указать службе докеров, чтобы она запускалась после гостевой службы vbox, но это тоже не сработало.
Есть предложения?
Решением было переопределить служебный файл systemd для containerd.
run
systemctl edit containerd
добавьте следующее в место, указанное в комментариях.
[Unit]
After=
After=network.target local-fs.target vboxadd-service.service
Requires=vboxadd-service.service
Первый After = очищает эту директиву и готов к новой. Требуются и After, и Requires. Сохраните этот файл и перезапустите хост.
Работает без проблем и подтверждается "systemd-analysis plot", которая является очень полезной командой для проверки вашего порядка выполнения systemd. Этот метод переживет обновления программного обеспечения