Монтирование тома GlusterFS в LXC контейнере

Перевод статьи Claudio Kuenzler от 01.09.2014

К сожалению, смонтировать том GlusterFS в контейнере LXC не так просто, как с другим устройством, например с дополнительным логическим томом. Сначала я попробовал это с файлом fstab LXC:

cat /var/lib/lxc/lxcname/fstab
localhost:/vol1 mnt glusterfs defaults,_netdev 0 2

Это должно теоретически смонтировать том 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 вручную:

mount.glusterfs 10.10.11.10:/vol1 /mnt
Mount failed. Please check the log file for more details.

Опять ошибка:

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 внутри контейнера:

mknod /dev/fuse c 10 229

Пробуем монтировать вновь.

mount.glusterfs 10.10.11.10:/vol1 /mnt

Теперь все хорошо - ошибок нет.

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».

Источник