Набор данных Mount ZFS в непривилегированных контейнерах

Сначала немного информации о моей конфигурации:

  • Ubuntu 15.10
  • Создан пул ZFS
  • Контейнеры LXC, хранящиеся в пуле / lxc
  • Набор данных, созданный в pool/mydataset принадлежащем пользователю1

Теперь мне нужен один из контейнеров для доступа к файлам / папкам в pool/mydataset . Я попробовал следующее:

  • Создал пользователь user1 внутри контейнера
  • pool/lxc/mycontainer/config и добавлен:

     lxc.mount.entry = /pool/mydataset mnt/mydataset none rw,bind 0 0 

Когда я запускаю контейнер, набор данных монтируется, но ls -la /mnt/mydataset в контейнере показывает nobody:nogroup вместо user1:user1 , что означает, что все файлы доступны только для чтения.

Любая идея, как получить правильные разрешения в смонтированном каталоге?

Если mycontainer действительно непривилегирован, то его владелец может не иметь доступа к пути /pool/mydataset . Пользователи в непривилегированных контейнерах имеют свой uid-смещение на хосте у владельца контейнера uid, поэтому user1 внутри контейнера не совпадает с user1 на хосте.

  1. Вы можете проверить, какой пользователь на хосте принадлежит контейнеру с помощью sudo ls -l /pool/lxc | grep mycontainer sudo ls -l /pool/lxc | grep mycontainer ( sudo может не потребоваться, в зависимости от разрешений /pool/lxc , но ls должен быть достаточно безопасным для запуска как root в любом случае. Идти вперед, опускайте sudo если желательно, если разрешения делают это возможным). Например, я получаю

     drwxr-xr-x 4 100000 100000 5 Apr 22 11:37 mycontainer 

    показывая, что uid и gid владельца контейнера 100000 (мы видим uid вместо имени, так как пользователь не существует на хосте).

  2. /pool/mydataset Test /pool/mydataset с sudo ls -l /pool | grep mydataset sudo ls -l /pool | grep mydataset (или sudo ls -l /pool/mydataset для его содержимого).

    Если вы хотите, чтобы файлы были доступны для записи из контейнера, вы должны убедиться, что любой пользователь внутри mycontainer вы хотите записать в /pool/mydataset имеет права на это на хосте. Например, root на mycontainer имеет uid 100000 на хосте, и если mycontainer в mycontainer имеет uid 1001 (тест с id user1 из контейнера ), то на хосте его uid будет 101001.


Вы можете сделать это, разрешив всем на хосте писать в /pool/mydataset с помощью

 sudo chmod -R o+w /pool/mydataset 

(обратите внимание: это добавит рекурсивные разрешения в /pool/mydataset ), или, возможно, лучше убедиться, что пользователи в группе user1 имеют права на запись (рекурсивно настройте его с помощью sudo chmod -R g+w /pool/mydataset если нет), затем добавьте владелец контейнера для группировки user1 с

 sudo usermod -a -G user1 <username> 

(В моем случае выше мы видели, что ни один пользователь на хосте не владеет контейнером, поэтому мы должны сначала создать пользователя с uid и gid 100000 с

 adduser --no-create-home --uid 100000 --disabled-password --disabled-login <username> 

Конечно, вы можете предоставить разрешения только пользователю1 внутри контейнера, поэтому создайте пользователя с его uid хоста и добавьте его для группировки user1 на хосте, например, 101001.)

Вы также можете получить ядерные /pool/mydataset и передать права собственности /pool/mydataset на mycontainer корень с помощью

 sudo chown -R 100000:100000 /pool/mydataset 

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


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