Еще одна часто встречающаяся задача – обмен файлами между контейнером и хостом, особенно когда надо передать большие объемы данных и сеть для этого не очень подходит.
Для этого можно воспользоваться монтированием, попробуем смонтировать файл с хоста в контейнер, это может быть архив с дистрибутивом некоторого ПО. Для этого в конфигурационный файл
/etc/pve/lxc/nnn.conf (где nnn – ID контейнера) добавим:lxc.mount.entry = /home/file1.tgz home/file1.tgz none bind,optional,create=file
Обратите внимание, что путь к файлу на хосте мы указываем от корня, а в контейнере без указания начального слеша.
Далее коротко пройдемся по опциям:
▫️none – тип файловой системы, в данном случае мы монтируем не ФС, а файл (аналогично и директориями).
▫️ bind – указывает на связывание, мы явно связываем файл в контейнере с файлом на хосте.
▫️ optional - необязательность монтирования, если файл на хосте отсутствует монтирование произведено не будет, блокировки загрузки контейнера не произойдет.
▫️ create – создать объект указанного типа (файл) в контейнере при его отсутствии.
Теперь примонтируем директорию, это также просто:
lxc.mount.entry = /home/dir1 home none bind,optional ,create=dir
А вот задача посложнее – смонтируем LVM раздел с файловой системой ext4:
lxc.mount.entry = /dev/mapper/ lvm-vg-myvolume1 home/myvolume1 ext4 defaults 0 0
Здесь мы вместо none указываем явно тип файловой системы и параметры монтирования также как мы это делаем в fstab.
А если нам нужно монтировать раздел блочного устройства, допустим у нас есть /dev/sda3 с типом файловой системы XFS. Здесь нам потребуется уже две строки:
lxc.mount.entry = /dev/sda3 home/volume3 xfs defaults 0 0
lxc.cgroup.devices.allow = b 8:3 rwm
Вторая строка разрешает доступ к устройству, где
b 8:3 rwm означает: ▫️ b – блочное устройство
▫️ 8:3 – номер устройства, можно узнать командной
ls -l /dev/sda3▫️ rwm – набор прав: чтение, запись, создание специальных файлов устройства.
А теперь к несколько неожиданному, как мы помним в Linux все есть файл и если мы хотим поднять в контейнере сервис, который создает собственные сетевые устройства, скажем OpenVPN или WireGuard, то мы должны предоставить этим устройствам связь с внешним миром через хост. А для этого снова используем монтирование:
lxc.mount.entry: /dev/net dev/net none bind,create=dir
lxc.cgroup2.devices.allow: c 10:200 rwm
Мы смонтировали при помощи связывания специальную директорию /dev/net хоста в контейнер и выдали на нее права второй строкой. Единственное отличие
с вместо b так как устройство у нас не блочное, а символьное. Теперь мы можем создавать в контейнере собственные сетевые интерфейсы и они получат доступ во внешний мир через сетевую систему хоста.
