Server A
exportuje adresář /srv
via NFS s volbou nohide
. Podadresář uvnitř /srv
, /srv/foo
, je přípojný bod pro jiné umístění na serveru NFS pomocí --bind
možnost, jako
server# mount --bind /bar/foo/ /srv/foo/
Klient B
importuje A:/srv
a připojí jej na /mnt/srv
pomocí NFS. Obsah /mnt/srv
jsou obsahem A:/srv
.
Problém je v tom, že /mnt/srv/foo
je prázdné, zatímco očekávám, že uvidím obsah A:/bar/foo/
tam.
Jak správně exportovat a importovat NFS sdílené položky, které mají také podadresáře jako připojovací body?
Vypadá to, že každý bod připojení musí být exportován serverem NFS, aby byl pro klienty viditelný. V situaci nad /etc/exports
soubor by měl vypadat takto:
/srv *(rw,fsid=0,nohide,no_subtree_check)
/srv/foo *(rw,nohide,no_subtree_check)
Poté importuje /srv
na klientovi s možností -t nfs
udělá obojí /srv
a /srv/foo
správně dostupné.
tento řádek
/srv/foo *(rw,fsid=0,nohide,no_subtree_check)
pracoval v mém případě místo
/srv/foo *(rw,nohide,no_subtree_check)
crossmnt
je váš přítel.
/srv *(rw,fsid=0,no_subtree_check,crossmnt)
Narazil jsem na tento problém, když jsem sledoval průvodce Diskless Arch a opravdu mě to zpomalilo. Zde se budu podělit o svá zjištění, protože jsem zvědavý, jestli to bude fungovat pro kohokoli jiného.
Podle průvodce bezdiskového systému mám kořenový souborový systém klienta bez disků (skutečná data, která potřebuji exportovat) v obrazu zpětné smyčky, který byl připojen na /srv/des1
:
/srv/des1.img on /srv/des1 type btrfs (rw,relatime,compress=lzo,discard,space_cache)
Poté jsem vytvořil přípojný bod /nfs/des1
poté spusťte připojení a potvrďte, že vidím vše:
# mkdir -p /nfs/des1
# mount --bind /srv/des1 /nfs/des1
# ls -l /nfs/des1
bin boot dev usr #[SNIP]
S odkazem na průvodce Arch NFS jsem do /etc/exports
na serveru:
/nfs/ *(rw,no_root_squash,no_subtree_check,fsid=root)
/nfs/des1/ *{rw,no_root_squash,no_subtree_check,nohide)
Pak jsem spustil exportfs -rav
na serveru použít tyto změny.
Poté jsem však připojil sdílenou složku na testovacího klienta pomocí: mount server:/des1 /mnt/tmp
jen abych našel prázdný adresář, když jsem očekával, že tam bude bezdiskový kořenový souborový systém.
V této fázi jsem se snažil téměř o všechno, dokud mě něco nevedlo k této možnosti na stránce exports
man:
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.
Takže když jsem vyzkoušel všechno ostatní, vyměnil jsem to, takže můj /etc/exports
vypadalo takto:
/nfs/ *(rw,no_root_squash,no_subtree_check,fsid=root,crossmnt)
/nfs/des1/ *{rw,no_root_squash,no_subtree_check)
Po přečtení položky manuálové stránky byste si mysleli, že by to mělo stejný účinek jako předchozí kód, ale když jsem spustil exportfs -rav
znovu zaregistrovat změny, pak se pokusil znovu připojit od klienta a fungovalo to!
Opravdu jsem to chtěl také udělat, ale zdá se, že s tímto nápadem jsou problémy, protože klienti NFS očekávají, že počty souborů inode budou jedinečné v klientských pohled na jeden držák.
Problémy jsou podrobně popsány v tomto příspěvku na blogu (nikoli mně): http://utcc.utoronto.ca/~cks/space/blog/unix/MultiFilesystemNFSIssue
Rozhodl jsem se připojit souborové systémy samostatně a symlink je dohromady, což by mělo fungovat pro všechny klienty NFS.
POZNÁMKA: povolen pouze jeden uživatel
To, co přidá, je sada úprav na straně serveru a na straně klienta. Na straně serveru /etc/exports
a /etc/fstab
na straně klienta.
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
Kernel 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