Мой файловый сервер просто имеет один большой раздел, разделяющий вещи в /exports. Поэтому, используя старый стиль экспорта NFSv3, у меня было:
/exports/home 192.168.1.0/24(rw,sync,no_subtree_check)
/exports/root 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
Поэтому я решил перейти на стиль NFSv4 и изменил его на:
/exports 192.168.1.0/24(ro,fsid=0,no_subtree_check)
/exports/home 192.168.1.0/24(rw,sync,no_subtree_check)
/exports/root 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
#/etc 192.168.1.0/24(ro,no_subtree_check) # Test entry to check export root is working.
Затем я изменил команды монтирования, чтобы исключить /exports
. Конечно, монтирование /etc
было невозможным (хотя это не было ошибкой, оно просто блокировалось до прерывания). Однако, как я и ожидал, /exports
ACL 'а все еще наследовались сверху вниз, все общие ресурсы были только для чтения, а root был везде подавлен.
Я также пробовал изменить ACL для /exports/root
одной машины, но это не помогло.
Таким образом, помимо возможности предоставления уникального идентификатора для тех файловых систем, где такой идентификатор не может быть определен, какой смысл определять корень экспорта с помощью fsid=0
:
- Это снижает гибкость с точки зрения настройки общих ресурсов (т. е. проблемы наследования, если только вы не используете разные файловые системы
nocrossmount
?). - Если предположить, что используется старая версия NFSv3, вы все равно не сможете монтировать,
/etc
так какую дополнительную безопасность она обеспечивает?
Имеет ли это fsid=0
смысл только тогда, когда /exports
это просто область монтирования для отдельных файловых систем, которые монтируются туда и экспортируются с разными списками контроля доступа?
Мне кажется, что настройка серверов NFS перевернута. Раньше на Solaris все общие файлы напрямую монтировались под /export
и выкладывались наружу. Сервер был бы /home/user
смонтирован с привязкой к /export/home/user
. Но теперь /home
это реальное место монтирования файловой системы, и оно смонтировано с привязкой к /exports
.
Это верно?
Пожалуйста, обрати внимание: Приведенные выше примеры приведены только для иллюстрации, поэтому, пожалуйста, не комментируйте целесообразность не использования no_squash_root
, я знаю.
Большое спасибо.
решение1
Это архитектурное изменение в работе протокола «монтирования» NFS.
В NFSv2/v3 был совершенно отдельный протокол RPC 'MOUNT', который позволял клиенту получать дескриптор файла любой экспортированной файловой системы по ее пути. Но в последующем WebNFS – и позже в NFSv4 – монтирование было изменено на внутриполосную операцию NFS, и в то же время операция была изменена на возврат одного «корневого» дескриптора файла, из которого затем исходят все поиски путей. (На самом деле в WebNFS было два таких корня, другой был «публичным» корнем для URL-адресов nfs://, который не попал в NFSv4.)
Итак, для того, чтобы операция «PUTROOTFH» сработала, необходимобытькорневая файловая система какого-либо рода, поскольку больше невозможно пропускать шаги – все обходы пути представляют собой серию составных операций [PUTROOTFH, LOOKUP, LOOKUP, ..., LOOKUP, OPEN]. Это отражает Plan9's 9p, а также SMBv2/3.
(Все это подразумевает, что в этом стиле экспортированные пути файловой системы становятся относительными к корню, например, ваш /exports/home монтируется как "foo:/home",неткак "foo:/exports/home".)
Отсутствие операции MOUNT(path) также является причиной того, что подразумевается "crossmnt", посколькуне являетсявсе, что осталось смонтировать, это просто «ПРОСМОТР» вниз от корня.
На практике NFSv4 может использовать любой стиль — если экспорт «fsid=0» не определен, ядро Linux (2.6.33 или более поздняя версия)автоматически сгенерирует /
для вас виртуальный коренькоторый не содержит ничего, кроме монтирований для ваших обычных экспортированных расположений. (Это также имеет преимущество сохранения идентичных путей монтирования между NFSv3 и NFSv4.) Другими словами, вы действительно можете продолжать использовать свою исходную конфигурацию в стиле v3.