LPIC201/202 あずき本 ch11 ファイル共有 (2/2)

LPIC202NFS勉強メモ資格勉強

出典: 

11.3 NFSサーバの構築

  • Windowsが絡む場合はSamba
  • Unix系同士: 古来よりNFSが使われる

11.3.1 NFSとは

NFS: Network File System

  • バージョン

    • v3: legacy
    • v4: あたらしい
  • クライアント-サーバアーキテクチャ
  • NFSの構成

    • portmap: RPCプログラム番号をTCP/IPポート番号に変換
    • nfsd: ファイルシステムのエクスポートとクライアント要求の処理
    • mountd: リモートシステムのマウントおよびアンマウント

RPC: Remote Procedure Call

cat /etc/rpc
#ident	"@(#)rpc	1.11	95/07/14 SMI"	/* SVr4.0 1.2	*/
#
#	rpc
#
portmapper	100000	portmap sunrpc rpcbind
rstatd		100001	rstat rup perfmeter rstat_svc
rusersd		100002	rusers
nfs		100003	nfsprog
ypserv		100004	ypprog
mountd		100005	mount showmount
ypbind		100007
walld		100008	rwall shutdown
yppasswdd	100009	yppasswd
etherstatd	100010	etherstat
rquotad		100011	rquotaprog quota rquota
sprayd		100012	spray
3270_mapper	100013
rje_mapper	100014
selection_svc	100015	selnsvc
database_svc	100016
rexd		100017	rex
alis		100018
sched		100019
llockmgr	100020
nlockmgr	100021
x25.inr		100022
statmon		100023
status		100024
bootparam	100026
ypupdated	100028	ypupdate
keyserv		100029	keyserver
sunlink_mapper	100033
tfsd		100037
nsed		100038
nsemntd		100039
showfhd		100043	showfh
ioadmd		100055	rpc.ioadmd
NETlicense	100062
sunisamd	100065
debug_svc 	100066  dbsrv
ypxfrd		100069  rpc.ypxfrd
bugtraqd	100071
kerbd		100078
event		100101	na.event	# SunNet Manager
logger		100102	na.logger	# SunNet Manager
sync		100104	na.sync
hostperf	100107	na.hostperf
activity	100109	na.activity	# SunNet Manager
hostmem		100112	na.hostmem
sample		100113	na.sample
x25		100114	na.x25
ping		100115	na.ping
rpcnfs		100116	na.rpcnfs
hostif		100117	na.hostif
etherif		100118	na.etherif
iproutes	100120	na.iproutes
layers		100121	na.layers
snmp		100122	na.snmp snmp-cmc snmp-synoptics snmp-unisys snmp-utk
traffic		100123	na.traffic
nfs_acl		100227
sadmind		100232
nisd		100300	rpc.nisd
nispasswd	100303	rpc.nispasswdd
ufsd		100233	ufsd
fedfs_admin	100418
pcnfsd		150001	pcnfs
amd		300019  amq
sgi_fam		391002	fam
bwnfsd		545580417
fypxfrd		600100069 freebsd-ypxfrd

nfsは

nfs		100003	nfsprog

RPCまわりのパッケージ導入

yum provides portmap
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ty1.mirror.newmediaexpress.com
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: ty1.mirror.newmediaexpress.com
 * updates: ty1.mirror.newmediaexpress.com
rpcbind-0.2.0-49.el7.x86_64 : Universal Addresses to RPC Program Number Mapper
Repo        : base
Matched from:
Provides    : portmap = 0.2.0-49.el7



rpcbind-0.2.0-49.el7.x86_64 : Universal Addresses to RPC Program Number Mapper
Repo        : @base
Matched from:
Provides    : portmap = 0.2.0-49.el7
yum provides rpcinfo
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ty1.mirror.newmediaexpress.com
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: ty1.mirror.newmediaexpress.com
 * updates: ty1.mirror.newmediaexpress.com
rpcbind-0.2.0-49.el7.x86_64 : Universal Addresses to RPC Program Number Mapper
Repo        : base
Matched from:
Filename    : /usr/sbin/rpcinfo

いずれも rpcbindパッケージで入る

sudo yum -y install rpcbind
rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper

portmapper: RPCプログラムとTCP/IPポート番号をマッピングするサービス

NFSの必要サービスを起動して再度見てみる

sudo systemctl start {rpcbind,nfs-server,nfs-lock,nfs-idmap}

rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  54009  status
    100024    1   tcp  40295  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  48407  nlockmgr
    100021    3   udp  48407  nlockmgr
    100021    4   udp  48407  nlockmgr
    100021    1   tcp  36763  nlockmgr
    100021    3   tcp  36763  nlockmgr
    100021    4   tcp  36763  nlockmgr

抜粋

    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl

NFSv4でポートが2049固定になったそうな

  • Firewallの設定がやりやすい

TCP Wrapper (/etc/{hosts.allow,hosts.deny})でアクセス制御可能

portmap: 172.16.0.

172.16.0.0/24ネットワーク内のホストのみアクセス許可する例

11.3.2 NFSサーバの設定

エクスポート

エクスポート: NFSサーバで特定のディレクトリを公開すること

exprotfs: エクスポート状況確認、設定変更反映等の管理コマンド

ないので入れる

yum provides exportfs
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ty1.mirror.newmediaexpress.com
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: ty1.mirror.newmediaexpress.com
 * updates: ty1.mirror.newmediaexpress.com
1:nfs-utils-1.3.0-0.68.el7.x86_64 : NFS utilities and supporting clients and daemons for the
                                  : kernel NFS server
Repo        : base
Matched from:
Provides    : exportfs = 1:1.3.0-0.68.el7

nfs-utilsパッケージで入る

sudo yum -y install nfs-utils

エクスポート設定ファイル: /etc/exports

sudo mkdir -m 777 /share
sudo mkdir -m 777 /pub

cat /etc/exports
/share	172.16.0.0/255.255.0.0(rw)
/pub	*.example.com(ro) localhost(rw,no_root_squash)
  • /shareディレクトリを172.16.0.0/255.255.0.0ネットワークのホストに読み書き可能でエクスポート
  • /pubディレクトリを*.example.comドメインのすべてのホストに読み取り専用でエクスポート
  • /pubディレクトリをlocalhostホストに読み書き可能、rootログイン時はroot権限でアクセスするようにエクスポート

exportfs -v: 上記の設定を詳細に展開

sudo exportfs -v
/pub          	localhost(sync,wdelay,hide,no_subtree_check,sec=sys,rw,no_root_squash,no_all_squash)
/share        	172.16.0.0/255.255.0.0(sync,wdelay,hide,no_subtree_check,sec=sys,rw,root_squash,no_all_squash)
/pub          	*.example.com(sync,wdelay,hide,no_subtree_check,sec=sys,ro,root_squash,no_all_squash)

全てエクスポート

sudo exportfs -a

showmount: エクスポート確認

  • -e: 指定したホストでエクスポートしているディレクトリ表示
showmount -e localhost
Export list for localhost:
/share 172.16.0.0/255.255.0.0
/pub   *.example.com,localhost

ホスト名省略可能

  • $(hostname)が補われるっぽい
showmount -e
Export list for lpic2-study-1:
/share 172.16.0.0/255.255.0.0
/pub   *.example.com,localhost
  • -a: クライアントのホスト名とディレクトリ表示

    • 機能としてはfuser -uのNFS版という感じ
showmount -a
All mount points on lpic2-study-1:

nfsstat: NFS統計情報取得

  • デフォルト: server/client両方についてrpc/nfsの統計表示
nfsstat
Server rpc stats:
calls      badcalls   badclnt    badauth    xdrcall
58         0          0          0          0       

Server nfs v4:
null         compound     
1         1% 57       98% 

Server nfs v4 operations:
op0-unused   op1-unused   op2-future   access       close        commit       
0         0% 0         0% 0         0% 4         2% 1         0% 0         0% 
create       delegpurge   delegreturn  getattr      getfh        link         
0         0% 0         0% 0         0% 47       26% 7         3% 0         0% 
lock         lockt        locku        lookup       lookup_root  nverify      
0         0% 0         0% 0         0% 4         2% 0         0% 0         0% 
open         openattr     open_conf    open_dgrd    putfh        putpubfh     
1         0% 0         0% 0         0% 0         0% 47       26% 0         0% 
putrootfh    read         readdir      readlink     remove       rename       
4         2% 0         0% 2         1% 0         0% 0         0% 0         0% 
renew        restorefh    savefh       secinfo      setattr      setcltid     
0         0% 0         0% 0         0% 0         0% 1         0% 0         0% 
setcltidconf verify       write        rellockowner bc_ctl       bind_conn    
0         0% 0         0% 0         0% 0         0% 0         0% 0         0% 
exchange_id  create_ses   destroy_ses  free_stateid getdirdeleg  getdevinfo   
1         0% 1         0% 0         0% 0         0% 0         0% 0         0% 
getdevlist   layoutcommit layoutget    layoutreturn secinfononam sequence     
0         0% 0         0% 0         0% 0         0% 2         1% 55       30% 
set_ssv      test_stateid want_deleg   destroy_clid reclaim_comp 
0         0% 0         0% 0         0% 0         0% 1         0% 

Client rpc stats:
calls      retrans    authrefrsh
59         0          59      

Client nfs v4:
null         read         write        commit       open         open_conf    
0         0% 0         0% 0         0% 0         0% 1         1% 0         0% 
open_noat    open_dgrd    close        setattr      fsinfo       renew        
0         0% 0         0% 1         1% 1         1% 6        10% 0         0% 
setclntid    confirm      lock         lockt        locku        access       
0         0% 0         0% 0         0% 0         0% 0         0% 3         5% 
getattr      lookup       lookup_root  remove       rename       link         
13       22% 4         7% 2         3% 0         0% 0         0% 0         0% 
symlink      create       pathconf     statfs       readlink     readdir      
0         0% 0         0% 4         7% 2         3% 0         0% 2         3% 
server_caps  delegreturn  getacl       setacl       fs_locations rel_lkowner  
10       17% 0         0% 0         0% 0         0% 0         0% 0         0% 
secinfo      exchange_id  create_ses   destroy_ses  sequence     get_lease_t  
0         0% 0         0% 1         1% 1         1% 0         0% 3         5% 
reclaim_comp layoutget    getdevinfo   layoutcommit layoutreturn getdevlist   
0         0% 1         1% 0         0% 0         0% 0         0% 0         0% 
(null)       
2         3% 

-o net: ネットワーク層の統計情報

nfsstat -o net
Server packet stats:
packets    udp        tcp        tcpconn
59         0          59         1       

Client packet stats:
packets    udp        tcp        tcpconn
0          0          0          0       

表示を絞れる

  • -n: nfs
  • -s: server side
nfsstat -ns
Server nfs v4:
null         compound     
1         1% 57       98% 

Server nfs v4 operations:
op0-unused   op1-unused   op2-future   access       close        commit       
0         0% 0         0% 0         0% 4         2% 1         0% 0         0% 
create       delegpurge   delegreturn  getattr      getfh        link         
0         0% 0         0% 0         0% 47       26% 7         3% 0         0% 
lock         lockt        locku        lookup       lookup_root  nverify      
0         0% 0         0% 0         0% 4         2% 0         0% 0         0% 
open         openattr     open_conf    open_dgrd    putfh        putpubfh     
1         0% 0         0% 0         0% 0         0% 47       26% 0         0% 
putrootfh    read         readdir      readlink     remove       rename       
4         2% 0         0% 2         1% 0         0% 0         0% 0         0% 
renew        restorefh    savefh       secinfo      setattr      setcltid     
0         0% 0         0% 0         0% 0         0% 1         0% 0         0% 
setcltidconf verify       write        rellockowner bc_ctl       bind_conn    
0         0% 0         0% 0         0% 0         0% 0         0% 0         0% 
exchange_id  create_ses   destroy_ses  free_stateid getdirdeleg  getdevinfo   
1         0% 1         0% 0         0% 0         0% 0         0% 0         0% 
getdevlist   layoutcommit layoutget    layoutreturn secinfononam sequence     
0         0% 0         0% 0         0% 0         0% 2         1% 55       30% 
set_ssv      test_stateid want_deleg   destroy_clid reclaim_comp 
0         0% 0         0% 0         0% 0         0% 1         0% 
  • -r: rpc
  • -c: client side
nfsstat -rc
Client rpc stats:
calls      retrans    authrefrsh
60         0          60  

サーバサイドのネットワーク統計情報

nfsstat -o net -s
Server packet stats:
packets    udp        tcp        tcpconn
59         0          59         1       

11.3.3 NFSクライアントの設定

マウントしてみる

sudo mkdir -p /mnt/nfs/pub

sudo mount -t nfs localhost:/pub /mnt/nfs/pub
df -T
Filesystem     Type     1K-blocks    Used Available Use% Mounted on
devtmpfs       devtmpfs    498768       0    498768   0% /dev
tmpfs          tmpfs       506896       0    506896   0% /dev/shm
tmpfs          tmpfs       506896    6768    500128   2% /run
tmpfs          tmpfs       506896       0    506896   0% /sys/fs/cgroup
/dev/sda2      xfs       20754432 5418236  15336196  27% /
/dev/sda1      vfat        204580   11440    193140   6% /boot/efi
tmpfs          tmpfs       101380       0    101380   0% /run/user/1000
localhost:/pub nfs4      20754432 5418112  15336320  27% /mnt/nfs/pub
cd /mnt/nfs/pub
touch piyo
ls -la
total 0
drwxrwxrwx. 2 root root 18 Jan  6 17:19 .
drwxr-xr-x. 3 root root 17 Jan  6 17:17 ..
-rw-rw-r--. 1 wand wand  0 Jan  6 17:19 piyo

wand:wand (1000:1000)でファイル生成した

  • NFSクライアント側のUID:GIDで生成されることに注意する

  • 特にroot:root(0:0)でこれが起きるとセキュリティ上問題なので、エクスポートオプションで制御可能

    • no_root_squash: root:root(0:0)のまま
    • root_squash: nfsnobody等になる
    • all_squash: 一般ユーザも全員nfsnobody等になる

読み取り専用を試してみる

sudo umount /mnt/nfs/pub

vi /etc/exports
  /share	172.16.0.0/255.255.0.0(rw)
- /pub	*.example.com(ro) localhost(rw,no_root_squash)
+ /pub	*.example.com(ro) localhost(ro,no_root_squash)

exportfs

  • -a: all
  • -r: re-mount
sudo exportfs -ar

sudo mount -t nfs localhost:/pub /mnt/nfs/pub

cd /mnt/nfs/pub
ls -ld
drwxrwxrwx. 2 root root 18 Jan  6 17:19 .

ファイル生成を試みてみる

touch hoge
touch: cannot touch 'hoge': Read-only file system

Read-onlyだから駄目だぞと怒られる。OK


all_squash試してみる

sudo umount /mnt/nfs/pub

vi /etc/exports
  /share	172.16.0.0/255.255.0.0(rw)
- /pub	*.example.com(ro) localhost(ro,no_root_squash)
+ /pub	*.example.com(ro) localhost(rw,all_squash)
sudo mount -t nfs localhost:/pub /mnt/nfs/pub

cd /mnt/nfs/pub
touch fuga
ls -la
total 0
drwxrwxrwx. 2 root      root      30 Jan  6 18:01 .
drwxr-xr-x. 4 root      root      29 Jan  6 17:20 ..
-rw-rw-r--. 1 nfsnobody nfsnobody  0 Jan  6 18:01 fuga
-rw-rw-r--. 1 wand      wand       0 Jan  6 17:19 piyo

新たに作ったファイルfugaが nfsnobody:nfsnobodyでできた。OK

grep -e nobody /etc/passwd 
nobody:x:99:99:Nobody:/:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

ソフトマウント/ハードマウント

NFSサーバが応答しないとき…

  • ソフトマウント: タイムアウト
  • ハードマウント: 再試行し続ける (ハングアップしているように見える)

    • 中断できるようにintrマウントオプションの設定が重要
    • さもないとSIGINTが通らなくなる
sudo mount -o hard,intr -t nfs localhost:/pub /mnt/nfs/pub

ハードマウント、かつintrオプション有効で割り込み許可

NFSのマウントオプション

  • bg/fg: background/foreground
  • soft/hard: ソフトマウント/ハードマウント (前述)
  • intr: ハードマウント時の割り込み許可
  • retrans: ソフトマウントで諦めてタイムアウトになるまでの再試行回数 多分 re-transmitの意
  • nolock: ファイルのロックを行わない
  • rsize=バイト数/wsize=バイト数: 読み込み/書き込みブロックサイズ