Как правильно экспортировать и импортировать общие папки NFS с подкаталогами в качестве точек монтирования?

21

Сервер Aэкспортирует каталог /srvчерез NFS с опцией nohide. Подкаталог внутри /srv, /srv/foo- это точка монтирования для другого расположения на сервере NFS с использованием --bindопции, например

server# mount --bind /bar/foo/ /srv/foo/

Клиент Bимпортирует A:/srvи монтирует его при /mnt/srvиспользовании NFS. Содержание /mnt/srvявляется содержанием A:/srv.

Проблема в том, что /mnt/srv/fooпусто, а я ожидаю увидеть там содержимое A:/bar/foo/.

Как правильно экспортировать и импортировать общие папки NFS с подкаталогами в качестве точек монтирования?

mbaitoff
источник
Может, проще просто использовать символическую ссылку на A from /srv/foo --> /bar/foo?
чхан
1
Я попробовал это. Это будет пытаться получить /bar/fooна клиентском компьютере B, а не на сервере A.
mbaitoff

Ответы:

27

crossmnt твой друг.

/srv        *(rw,fsid=0,no_subtree_check,crossmnt)
анатолий техтоник
источник
10

Я столкнулся с этой проблемой, следуя руководству по Diskless Arch , и это действительно замедлило меня. Я собираюсь поделиться своими выводами здесь, так как мне любопытно, будет ли это работать для кого-то еще.

В соответствии с руководством по бездисковым системам у меня есть корневая файловая система бездискового клиента (фактические данные, которые мне нужно экспортировать) в образе обратной петли, который был смонтирован на /srv/des1:

/srv/des1.img on /srv/des1 type btrfs (rw,relatime,compress=lzo,discard,space_cache)

Затем я создал точку монтирования, /nfs/des1затем запустил монтирование и подтвердил, что могу видеть все:

# mkdir -p /nfs/des1 
# mount --bind /srv/des1 /nfs/des1
# ls -l /nfs/des1
bin  boot  dev  usr  #[SNIP]

Обратившись к руководству Arch NFS , я добавлю /etc/exportsна сервер следующее:

/nfs/      *(rw,no_root_squash,no_subtree_check,fsid=root)
/nfs/des1/ *{rw,no_root_squash,no_subtree_check,nohide)

Затем я запустил exportfs -ravна сервере, чтобы применить эти изменения.

Однако затем я смонтировал общий ресурс на тестовом клиенте с помощью: mount server:/des1 /mnt/tmponly, чтобы найти пустой каталог, когда ожидал, что там будет находиться diskless-root-filesystem.

На этом этапе я попробовал почти все, пока что-то не привело меня к этой опции на exportsстранице руководства :

crossmnt
    This option is similar to nohide but it makes it possible for clients
    to move from the filesystem marked with crossmnt to exported filesystems
    mounted on it. Thus when a child filesystem "B" is mounted on a parent "A",
    setting crossmnt on "A" has the same effect as setting "nohide" on B. 

Так что, попробовав все остальное, я поменял местами так, чтобы мой /etc/exportsбыл похож

/nfs/      *(rw,no_root_squash,no_subtree_check,fsid=root,crossmnt)
/nfs/des1/ *{rw,no_root_squash,no_subtree_check)

Прочитав запись справочной страницы, вы подумали, что это будет иметь тот же эффект, что и предыдущий код, но когда я exportfs -ravснова запустился, чтобы зарегистрировать изменения, затем попытался перемонтировать их с клиента, и это сработало!

v25
источник
8

Похоже, что каждая точка монтирования должна быть экспортирована сервером NFS, чтобы быть видимой для клиентов. В ситуации выше /etc/exportsфайл должен выглядеть следующим образом:

/srv        *(rw,fsid=0,nohide,no_subtree_check)
/srv/foo    *(rw,nohide,no_subtree_check)

Затем, импорт /srvна клиенте с опцией -t nfsсделает /srvи /srv/fooправильно, и доступным.

редактировать с помощью OP

эта линия

    /srv/foo    *(rw,fsid=0,nohide,no_subtree_check)

работал в моем случае вместо

    /srv/foo    *(rw,nohide,no_subtree_check) 
mbaitoff
источник
1
в корне?
17
2

Я действительно хотел сделать это тоже, но, похоже, есть проблемы с этой идеей, потому что клиенты NFS ожидают, что номера инодов файлов будут уникальными в представлении клиента об одном монтировании.

Проблемы подробно описаны в этом блоге (не мной): http://utcc.utoronto.ca/~cks/space/blog/unix/MultiFilesystemNFSIssue

Я решил смонтировать файловые системы отдельно и соединить их вместе, что должно работать для всех клиентов NFS.

Bluby
источник
1
Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
SLM
0

ПРИМЕЧАНИЕ: включен только один пользователь

Он добавляет набор изменений на стороне сервера и на стороне клиента. На стороне сервера /etc/exportsи /etc/fstabна стороне клиента.

Серверная сторона

  • Linux Mint 18.3 Sylvia 32-битная
  • Ядро Linux 4.4.0-138-универсальный i686
  • Asus eeepc

    $ cat /etc/exports 
    #insert shares (one for each mounted partition sub-folder):      
    /nfsshare/ /192.168.1.155(rw,no_root_squash,no_subtree_check,fsid=root,crossmnt)
    /nfsshare/media/ 192.168.1.155(rw,no_root_squash,no_subtree_check)
    /nfsshare/extra/ /192.168.1.155(rw,no_root_squash,no_subtree_check)   
    
    $ cat /etc/fstab  
    #shared media files on /media/ed/
    /media/ed/ /nfsshare/ nfs bind 0 0
    /media/ed/media/ /nfsshare/media/ nfs bind 0 0
    /media/ed//extra /nfsshare/extra/ nfs bind 0 0
    

Сторона клиента

  • Linux Mint 19 Tara 64-битная
  • Ядро Linux 4.15.0-38-generic x86_64

    $ cat /etc/fstab
    #NFS Shares line added
    192.168.1.158:/nfsshare /mnt/share nfs rw,soft,intr,noatime,x-gvfs-show
    
Эд Иглхарт
источник
1
Что это? Это один файл? Много файлов? Пожалуйста, используйте инструменты форматирования, чтобы отформатировать ваш ответ для ясности. Не могли бы вы отредактировать и объяснить, как ваш ответ отвечает на вопрос?
Terdon
(1) Используйте ваши слова. (2) Что означает это предложение, которое еще не было представлено?
G-Man говорит: «Восстановите Монику»
извиняюсь за это.
Эд Иглхарт