Alpine Linux 3.12.0 -> NFSMount не работает из-за того, что rpc.statd не запускается

Alpine Linux 3.12.0 -> NFSMount не работает из-за того, что rpc.statd не запускается

Я поискал довольно много и нашел похожие проблемы, но ни одна из них не содержала решения, которое, по-видимому, помогло бы мне.

Я запускаю Alpine LXC на Proxmox. Это привилегированные контейнеры и NFS Mounts включены.

Я могу вручную смонтировать свой ресурс NFS с помощью команды mount. С тех пор я добавил монтирование в свой /etc/fstab, и это работает, за исключением перезагрузок.

Я читал, что мне нужно запустить / включить службу nfsmount, чтобы справиться с этим при загрузке. Однако при попытке включить эту службу я столкнулся со следующим.

 * Starting NFS statd ...
 * start-stop-daemon: failed to start `/usr/sbin/rpc.statd'                                                                                                         [ !! ]
 * ERROR: rpc.statd failed to start
 * ERROR: cannot start nfsmount as rpc.statd would not start

Проверка каталога /usr/sbin показывает, что rpc.statd отсутствует. Репозиторий для Alpine показывает, что его следует добавить при установке nfs-utils, другие каталоги rpc установлены.

Я добавил репозиторий для предыдущей версии Alpine и установил откат nfs-utils. Это успешно предоставило мне файл rpc.statd в /usr/sbin, но все равно не запускается.

решение1

Итак, я не решил основную проблему, nfsmount по-прежнему не запускается.

Однако для тех, кто ищет способ автоматического монтирования общих ресурсов NFS в контейнере LXC, у меня есть решение.

Сначала я попытался добавить скрипт в папку if-up.d, но, похоже, контейнеры LXC не запускают все разделы init, которые запускает типичная установка.

Моим решением было включить службу local.d с помощью rc-update add local default

Затем я поместил файл в /etc/local.d/ под названием «fstab.local» в качестве bash-скрипта, который вызывает опцию mount -a после проверки работоспособности сетевого интерфейса.

решение2

Ответ немного устарел, но применим.

Для автоматического запуска NFS Alpine необходимы «возможности файла», которые по умолчанию отключены в файле /usr/share/lxc/config/alpine.common.conf.

lxc.cap.drop = setpcap

См. man capabilitiesобъяснение битов возможностей. Есть несколько способов исправить это, вы можете обновить файл alpine.common.conf, закомментировав строку выше (мой выбор, так как большинство моих контейнеров alpine используют NFS), но будьте осторожны, что обновление сбросит его, поэтому вам придется не забыть проверить/изменить файл после обновления, или вы можете изменить файл .conf отдельных контейнеров, который должен быть найден в /etc/pve/lxc/####.conf, где #### — это идентификатор контейнера. Вам нужно сбросить возможности, а затем повторно сбросить возможности в соответствии с общими и alpine конфигурациями. Я использовал следующее, чтобы сделать это, когда делал отдельные файлы, они были сохранены как /usr/local/bin/alpine-enable-nfs.sh в моей системе, поэтому я мог ввести, alpine-enable-nsf.sh 1492и контейнер 1492 будет иметь возможности, установленные для разрешения NFS:

#!/bin/bash
defdir=/usr/share/lxc/config
cfile=/etc/pve/lxc/${1}.conf
if [ ! -r ${cfile} ] ; then
  echo "usage: ${0##*/} IDNO"
  exit
fi
if grep -q "lxc.cap.drop" ${cfile} ; then
  echo "File has lxc.cap.drop configurations already"
  exit
fi
if ! grep -q "ostype: alpine" ${cfile} ; then
  echo "Container ID: ${1} is not alpine."
  exit
fi
echo "# Reset capabilities" >> ${cfile}
echo "lxc.cap.drop:" >> ${cfile}
grep cap ${defdir}/common.conf >> ${cfile}
sed -n "/cap/{/setpcap/s/^/#/;p}" ${defdir}/alpine.common.conf >> ${cfile}
grep cap ${cfile}
echo -e "\nNFS should now be available in container #${1}"

На момент написания статьи в конфигурацию вашего контейнера должно быть добавлено следующее:

# Reset capabilities
lxc.cap.drop:
# Drop some harmful capabilities
lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio
# Drop another (potentially) harmful capabilities.
lxc.cap.drop = audit_write
lxc.cap.drop = ipc_owner
lxc.cap.drop = mknod
#lxc.cap.drop = setpcap
lxc.cap.drop = sys_nice
lxc.cap.drop = sys_pacct
lxc.cap.drop = sys_rawio
lxc.cap.drop = sys_resource
lxc.cap.drop = sys_tty_config
lxc.cap.drop = syslog
lxc.cap.drop = wake_alarm

Обратите внимание, что строка setpcap закомментирована (# в начале)

Вам нужно будет ОСТАНОВИТЬ и ЗАПУСТИТЬ ваши контейнеры, чтобы это вступило в силу (перезагрузка контейнера не подхватит изменения, его необходимо остановить и запустить снова)

Некоторые люди предлагают «правильный» способ сделать что-то — смонтировать общий ресурс NFS на хосте, но для меня это проблематично, поскольку у меня есть пара десятков контейнеров Alpine, которые монтируют разные общие ресурсы NFS с нескольких разных серверов для разных целей, включая те, которые недоступны напрямую на хосте, отсюда и такой подход.

Связанный контент