LINUX.ORG.RU

чем заменить name_to_handle_at и open_by_handle_at

 ,


0

1

Я жру кактус и хочу (не то чтобы сильно нужно, но скорее хочется) запустить nfs в докере. Хочу nfs v4, чтобы не было никаких портмапперов и всё работало на одном порту (проще написать правила файрвола)

Ядерный nfs — даже и говорить об этом кошмаре не хочется =)

Нашел вроде бы работающий nfs-ganesha.

У него есть два места, которые делают его несовместимым с докером:

https://github.com/phdeniel/nfs-ganesha/blob/master/src/FSAL/FSAL_VFS/os/linux/handle_syscalls.c#L191

https://github.com/phdeniel/nfs-ganesha/blob/master/src/FSAL/FSAL_VFS/os/linux/handle_syscalls.c#L314

вызовы name_to_handle_at и open_by_handle_at надежно забанены в докере.

Я сходу не могу понять, зачем они вообще нужны userspace демону, задача которого открыть файл, прочитать из него и закрыть. Т.е. мне nfs сервер нужен примерно в таком же сценарии, как и какой-нибудь http сервер с range requests.

Что вообще эти вызовы делают? Может их на какую-нибудь иноду или кеш имен поменять?

UPD: получилось обойтись без этого, собрав overlayfs с явными ключами разрешающими работу NFS

Я сходу не могу понять, зачем они вообще нужны userspace демону.

TL;DR

These system calls are designed for use by user-space file servers. For example, a user- space NFS server might generate a file handle and pass it to an NFS client. Later, when the client wants to open the file, it could pass the handle back to the server. This sort of functionality allows a user-space file server to operate in a stateless fashion with respect to the files it serves.

TL;DR

Варианта пожалуй три:

  1. Разрешить name_to_handle_at, open_by_handle_at и CAP_DAC_READ_SEARCH для контейнера.
  2. вынуть ганешу из докера.
  3. спрыгнуть с nfs.
Deleted ()
Ответ на: комментарий от max_lapshin

проблема то не в Operation not permitted, а Operation not supported.

Тогда понятно, а то уже хотел твои руки поругать )

В докере overlayfs, а с этой фс не работают эти вызовы

Ну наверное тебе не нужны оверлеи для файловой системы экспортируемой через nfs?

В целом, если нужна read-only раздача через nfs/cifs с минимизацией рисков взлома, то (imho) лучше сделать в гипервизоре с полностью read-only данными (все изменяемое только в памяти). Как вариант OpenBSD или последнее ядро с lockdown и fs-verify.

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от max_lapshin

Используй докер с сторадж драйвером devicemapper вместо overlay2. Этот драйвер использует thin provision снапшоты с обычными ext4 или xfs внутри.

iliyap ★★★★★ ()
Последнее исправление: iliyap (всего исправлений: 1)
Ответ на: комментарий от Deleted

нет

https://github.com/nfs-ganesha/nfs-ganesha/issues/511#issuecomment-560523801

авторы единственного работающего userspace NFS сервера рассказывают, что они готовы защищать невозможность работы NFS сервера из под докера любой ценой.

Как по мне, так какие-то странные аргументы. Можно пойти и напрогать костыли, всё таки это докер и бодаться с ним мягко говоря странно.

По сути надо запилить костыль вокруг недоступности нужных вызовов в overlay и сделать всё на простых колхозных open/pread, не выежываясь с всякими там непонятными handle_at

max_lapshin ★★★ ()
Ответ на: комментарий от max_lapshin

ffilz многобуквенно, но достаточно точно описал ситуацию.

Переход между stateless и statefull всегда болезнен, порождает массу регресов и трудоемок в тестировании. Поэтому крайне маловероятно, что кто-то решится гвоздями прибивать в этом месте statefull только ради того, чтобы ганеша заработал поверх overlayfs. Наверное даже проще поддержать open_by_handle_at в overlayfs, нежели калечить sateless-часть nfs-сервера.

Думаю тебе придется отказаться от overlayfs (использовать devicemapper), либо отказаться от doker-а, либо от nfs (использовать smb/cifs).

Deleted ()
Ответ на: комментарий от max_lapshin

Хотя вот подумалось - а ты пробовал собрать ганешу без болезненных open_by_handle_at и т.п.?

Эти системные вызовы есть не везде, а ганеша вроде-бы работает не только на linux. Соответственно, вполне возможно что достаточно покалечить какой-нибудь configure или CMakeLists.txt чтобы open_by_handle_at с друзьями считался отсутствующим.

Deleted ()
Ответ на: комментарий от max_lapshin

Тоже глянул (пока другой мой тест работал).

Гипотетически можешь попробовать собрать дремучую версию возле тега version_1_0_3, когда этих syscall-ов еще не было.

Но использовать это можно только в доверенной среде (как telnet для рута и без пароля).

Deleted ()