Монтирование тома GlusterFS в LXC контейнере
Перевод статьи Claudio Kuenzler от 01.09.2014
К сожалению, смонтировать том GlusterFS в контейнере LXC не так просто, как с другим устройством, например с дополнительным логическим томом. Сначала я попробовал это с файлом fstab LXC:
Это должно теоретически смонтировать том GlusterFS «vol1» с локального хоста в контейнер LXC с точкой монтирования /mnt. Да, отсутствующая косая черта верна, учитывая относительный путь к контейнеру LXC. Но, к сожалению, это не сработало, так как запуск контейнера в режиме отладки показал:
lxc-start -n lxcname -o /var/lib/lxc/lxcname/stdout.log -l debug
cat /var/lib/lxc/lxcname/stdout.log
[...]
lxc-start 1409577107.058 ERROR lxc_conf - No such device - failed to mount 'localhost:/vol1' on '/usr/lib/x86_64-linux-gnu/lxc/mnt'
lxc-start 1409577107.058 ERROR lxc_conf - failed to setup the mounts for 'lxcname'
lxc-start 1409577107.058 ERROR lxc_start - failed to setup the container
lxc-start 1409577107.058 ERROR lxc_sync - invalid sequence number 1. expected 2
[...]
В качестве второй попытки я попробовал это в контейнере LXC (как с обычным хостом Linux) в /etc/fstab:
cat /etc/fstab
# UNCONFIGURED FSTAB FOR BASE SYSTEM
10.10.11.10:/vol1 /mnt glusterfs defaults,_netdev 0 0
Где 10.10.11.10 физического хоста, на котором размещен контейнер. Перед перезагрузкой контейнера я попытался смонтировать том gluster вручную:
Опять ошибка:
cat /var/log/glusterfs/mnt.log
[...]
I [glusterfsd.c:1910:main] 0-/usr/sbin/glusterfs: Started running /usr/sbin/glusterfs version 3.4.2 (/usr/sbin/glusterfs --volfile-id=/vol1 --volfile-server=10.10.11.10 /mnt)
E [mount.c:267:gf_fuse_mount] 0-glusterfs-fuse: cannot open /dev/fuse (No such file or directory)
E [xlator.c:390:xlator_init] 0-fuse: Initialization of volume 'fuse' failed, review your volfile again
Действительно, в контейнере отсутствует специальное символьное устройство /dev/fuse, хотя на физическом хосте оно существует. Сначала я подумал, что это проблема с правами доступа к устройству, которую нужно решить в файле конфигурации контейнера, но соответствующая конфигурация для /dev/fuse уже есть по умолчанию:
cat /usr/share/lxc/config/ubuntu.common.conf | grep -A 1 "## fuse"
## fuse
lxc.cgroup.devices.allow = c 10:229 rwm
Затем я наткнулся на эту проблему Github, где Стефан Грабер, один из основных разработчиков LXC, ответил на это:
Некоторые модули также потребуют создания узлов устройств в контейнере, что вам нужно будет сделать вручную или с помощью сценариев инициализации. Чтобы решить эту проблему, необходимо создать устройство /dev/fuse внутри контейнера:
Пробуем монтировать вновь.
Теперь все хорошо - ошибок нет.
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/lxc/lxcname 20G 830M 18G 5% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
none 13G 60K 13G 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 63G 0 63G 0% /run/shm
none 100M 0 100M 0% /run/user
10.10.11.10:/vol1 99G 60M 99G 1% /mnt
Конечно, устройство /dev/fuse можно создать во время «lxc-create».