Новый OpenVZ 7.0 является гибридом старого доброго OpenVZ и коммерческого Virtuozzo. Хотелось бы думать, что он взял лучшее от обоих родителей, но это не так. В данном случае под нож попал функционал Shared Folders.
Ранее в OpenVZ данная задача решалась .mount-файлами (подробнее тут). Но теперь контейнеры называются как-нибудь так «600adc12-0e39-41b3-bf05-c59b7d26dd73» и создание файла 600adc12-0e39-41b3-bf05-c59b7d26dd73.mount проблему не решает, он просто игнорируется при запуске. Конечно, наличие папки /vz/private/600adc12-0e39-41b3-bf05-c59b7d26dd73/scripts намекает, что возможен запуск каких-то скриптов, но найти документацию об этом не удалось.
В Virtuozzo Shared Folders были реализованы через prlctl set, но в OpenVZ этот функционал портирован не был. Не верите — проверка под катом.
В этом можно убедится введя:
prlctl set СTname --shared
prlctl set СTname --shared-profile
prlctl set СTname --sharedfolder-add
prlctl set СTname --shf-host-add
Никакая из этих команд не работает.
Что же делать?
- Поднять NFS сервер на физическом сервере и NFS клиент внутри контейнера. Как я понял, это официально рекомендуемый вариант. Но NFS даст дополнительные задержки и дополнительную нагрузку на систему.
- С помощью prlctl --device-add подключить дисковое устройство непосредственно к контейнеру. К сожалению только к одному и при этом от физического сервера его придется отключить, одну папку так тоже не подключишь.
- С помощью prlctl --device-add подключить дисковое устройство (переформатировав его в какю-нибудь кластерную файловую систему, например, GFS или OCFS2) непосредственно к контейнеру. Можно подключить к нескольким контейнерам и физическому серверу. Но папку подключить также не удастся
- Вернуть старый (не нагружающий систему) функционал Bind mounts вручную.
Первые три способа описаны в официальной документации и есть много информации в интернете. А вот про четвертый способ и расскажет эта статья.
Если коротко, то мы будем из контейнера по ssh запускать скрипт на физическом сервере, делающий bind mount.
Для примера возьмем физический сервер с ip 192.168.0.11 и контейнер 192.168.0.22 UUID 600adc12-0e39-41b3-bf05-c59b7d26dd73 с установленным samba сервером и systemd
- Заведем на физическом сервере пользователя mount для ssh подключения
HN# useradd mount
- Сгенерируем rsa ключи для пользователя root в контейнере
CT# ssh-keygen –t rsa
- Скопируем содержимое файла /root/.ssh/id_rsa.pub в контейнере в /home/mount/.ssh/authorized_keys на физическом сервере. Должно получится что-то типа:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXPMfZ+9Og1uY+Eq2QE85AxO+0DM0wfejNuIEZfRUi9FZj8/3BLM9u1GrmOKSMRTGIXA3yfyfep+hAm0/phuaqqG8wU2YAai/8aF4PXokeYVPzQqsbK8fK1wLYWgTO3RCtojfpoHPvdQMt28+GFRj4CTRuktUSx63XswNjzPWlqfUjiEnLZRdwbaB6ZKeepdGUmzgYq7dhMxdl3VvtAWahGnkGnn7eXT49Z9SekvFPUL77BsHwQXgspuSosg31YE09+spyA6khzwJKEqPXHRniv4H5DUzdZiQXx3tkGheGCO6JTDmcSElZyWwC9h+H7ZEEJ4IO3RRnDcsxgkW+ixij root@container
- Убедимся, что не напутали с правами на физическом сервере:
HN# ls -al /home/mount/.ssh/ total 12 drwx------ 2 mount users 4096 Sep 10 18:54 . drwx------ 5 mount users 4096 Sep 10 18:04 .. -rw------- 1 mount users 485 Sep 10 18:54 authorized_keys
- Проверим что можем без пароля по ключу подключится к физическому серверу из контейнера:
CT# ssh mount@192.168.0.11
- Создадим в контейнере точку монтирования:
CT# mkdir /data
- Создадим на физическом сервере.mount скрипт /vz/samba.mount:
HN# cat <<EOF > /vz/samba.mount #!/bin/bash mount -n --bind /data /vz/root/600adc12-0e39-41b3-bf05-c59b7d26dd73/data EOF chmod +x /vz/samba.mount
- На физическом сервере добавим его в sudoers для пользователя mount:
HN# echo "mount ALL=NOPASSWD: /vz/*.mount" > /etc/sudoers.d/mount
- На физическом сервере для запуска скрипта по ssh отключим requiretty в sudoers
HN# sed -i 's/^Defaultss+requiretty/#Defaults requiretty/' sudoers
- Запретим на физическом сервере пользователю mount запускать что-либо кроме / bin/sudo /vz/samba.mount. Дописав в /home/mount/.ssh/authorized_keys текст command="/bin/sudo /vz/samba.mount",no-port-forwarding,no-X11-forwarding,no-agent-forwarding
HN# echo "command="/bin/sudo /vz/samba.mount",no-port-forwarding,no-X11-forwarding,no-agent-forwarding $(cat /home/mount/.ssh/authorized_keys)" > /home/mount/.ssh/authorized_keys
- В контейнере создадим юнит для автомонтирования. Обратите внимание, он запускается ДО запуска samba сервера.
CT# cat <<EOF > /etc/systemd/system/mount.service2 [Unit] Description=Mount from Hardware node After=network.target Before=smbd.service [Service] Type=oneshot ExecStart=/usr/bin/ssh mount@192.168.77.11 [Install] WantedBy=multi-user.target EOF
- Включим созданный сервис автомонтирования:
CT# systemctl enable mount.service
Всё. Теперь можно перезагружать контейнер и радоваться монтированию папки /data.
Автор: zystem