Ubuntu 22.04 nfs-kernel-server troubleshooting

발단

임베디드에서 필수적이지만 tftp 와 함께 말썽 일이키는 투탑 nfs-kernel server

어째 tftp 는 쉽게 넘어가나 했더니 nfs가 안되네...

기록을 남기고자하는 목적으로 블로깅

전개

nfs-kernel-server 설치하고

$ sudo apt install nfs-kernel-server

/etc/exports 에 설정 넣고

/home/username/work/nfs 192.168.0/24(rw,no_root_squash,no_all_squash,async,no_subtree_check)

전에는192.168.0.* 이었는데 ip/netmask로 바뀜

nfs-kernel-server 실행

$ sudo service nfs-kernel-server restart

nfs-common 설치해서 로컬에서 nfs mount 확인

$ sudo apt install nfs-common

$ mkdir mnt

$ sudo mount <ipaddr>:<host_directory> mnt/

$ ls mnt

잘 되네

위기

[    4.407126] IP-Config: Complete:

[    4.410342]      device=eth0, hwaddr=00:03:22:81:81:ab, ipaddr=192.168.0.208, mask=255.255.0.0, gw=192.168.0.1

[    4.419981]      host=192.168.0.208, domain=, nis-domain=(none)

[    4.425795]      bootserver=255.255.255.255, rootserver=192.168.0.202, rootpath=

또 여기서 멈추네.. 
임베디드 타겟에 ping 때려보면 잘 되지만 nfs mount는 안됨
수없이 많이 봐왔던거지만 당할때마다 매번 미치겠다 ㅠㅠ

절정

방법은...
- /etc/exports 에서 옵션을 계속 바꿔본다.
- 임베디드 타겟쪽 nfs 옵션을 계속 바꿔본다.
뭘 해도 얻는 것도 없는 재미없는 작업 ㅠㅠ

NFSv4

그래! 새로운걸 해보는거야!
뭐야 쉽네 /etc/exports 에 fsid=0 만 넣으면 됨
테스트
$ sudo mount -t nfs4 <ipaddr>:<host_directory> mnt/
mount.nfs4: mounting <ipaddr>:<host_directory> failed, reason given by server: No such file or directory

뭐야 안되네..

타겟 호스트 커널 설정에 nfsv4가 들어가있어서 되면 괜찮겠는데....

CONFIG_NFS_V4=y

Ubuntu Official NFSv4Howto

어 이거 생각보다 복잡하다..빠른 포기

다시 NFSv3


그래 역시 오피셜 문서지
sudo systemctl start nfs-kernel-server.service
서버 시작하는 방법이 좀 다르네. 오피셜 따라야지 ㅇㅇ
$ sudo exportfs -a
$ sudo exportfs -v # 설정 확인
설정 적용
$ sudo mount <ipaddr>:<host_directory> mnt/
되는거 확인하고

임베디드 타겟!
IP-Config: Complete:
     device=eth0, hwaddr=00:03:22:81:81:ab, ipaddr=192.168.0.208, mask=255.255.0.0, gw=192.168.0.1
     host=192.168.0.208, domain=, nis-domain=(none)
     bootserver=255.255.255.255, rootserver=192.168.0.202, rootpath=
또 안되네 ㅠㅠ

/etc/exports 옵션 변경

(rw,sync,no_subtree_check)
기본값 안됨
(rw,no_root_squash,no_all_squash,async,no_subtree_check)
어디서 굴러다니던 옵션. 안됨
(rw,async,no_subtree_check)
async로 변경해봄. 안됨



U-Boot nfsboot 옵션 변경

$ sudo mount -t nfs -o vers=2 <ipaddr>:<host_directory> mnt/
mount.nfs: requested NFS version or transport protocol is not supported
오..그럴듯? 
vers=4 설정
안됨
vers=3 설정
안됨
nfsvers=4 설정
안됨
nfsvers=3 설정
안됨
mountvers=3 
안됨
mountvers=4
NFS: bad mount option value specified: mountvers=4
안됨
아 진짜!!!!
$ sudo cat /proc/fs/nfsd/versions
+3 +4 +4.1 +4.2
vers=4.2
안됨
대체 정확한 옵션이 뭐야? 커널 문서 찾아봄
Documentation/filesystems/nfs/nfsroot.txt
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

  If the `nfsroot' parameter is NOT given on the command line,
  the default "/tftpboot/%s" will be used.

  <server-ip> Specifies the IP address of the NFS server.
The default address is determined by the `ip' parameter
(see below). This parameter allows the use of different
servers for IP autoconfiguration and NFS.

  <root-dir> Name of the directory on the server to mount as root.
If there is a "%s" token in the string, it will be
replaced by the ASCII-representation of the client's
IP address.

  <nfs-options> Standard NFS options. All options are separated by commas.
The following defaults are used:
port = as given by server portmap daemon
rsize = 4096
wsize = 4096
timeo = 7
retrans = 3
acregmin = 3
acregmax = 60
acdirmin = 30
acdirmax = 60
flags = hard, nointr, noposix, cto, ac
헐 version 이 없다..
NFS root mounts are handled by nfsmount which is part of the klibc-utils package. nfsmount only accepts integers for the 'vers' argument. And only values 2 and 3 are valid:

$ ./usr/bin/nfsmount -o vers=4.1
4.1: invalid value for vers
$ ./usr/bin/nfsmount -o vers=4
./usr/bin/nfsmount: bad NFS version '4'
$ ./usr/bin/nfsmount -o vers=3
./usr/bin/nfsmount: need a path

The kernel does support NFSv4:
./lib/modules/5.13.0-1011-raspi/kernel/fs/nfs/nfsv4.ko
vers=3이 맞네.
그럼 vers=2를 해보자.
안됨

외부서버에서 접속 시도

같은 커맨드로 외부에서 접속 해봄
-vvvv 옵션 켜면 좀 더 자세한 로그를 볼 수 있음
$ sudo mount -vvvv <ipaddr>:<host_directory> mnt/
mount.nfs: access denied by server while mounting 10.0.125.202:/home2/sjpark/work/nfs/loki

access denied라고? 장난이 너무 심하네.. ufw도 꺼져있는데?
$ sudo ufw status
상태: 비활성
꺼져있음
혹시 몰라서 추가해봄
$ sudo ufw allow from 192.168.0.0/24 to any port nfs
[sudo] 암호: 
존재하는 규칙을 추가하는 걸 건너뜁니다
끙..

다시 nfsv4

/etc/export 에 nfsv4 설정 넣어봄
/home2/username/work/nfs 192.168.0.0/16(fsid=0,rw,sync,no_root_squash)
/home2/username/work/nfs/target 192.168.0.0/16(rw,sync,no_root_squash)
다른 서버에서 연결해봄
sudo mount -t nfs -vvvv 192.168.125.202:/home2/username/work/nfs/target mnt/
mount.nfs: timeout set for Thu Jul 11 02:08:03 2024
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.125.202,clientaddr=192.168.121.9'
mount.nfs: mount(2): No such file or directory
mount.nfs: trying text-based options 'addr=192.168.125.202'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.125.202 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.125.202 prog 100005 vers 3 prot UDP port 54122
오 된다.
그럼 임베디드 타겟에서!
vers=4
안됨
vers=4.2
안됨
nfsvers=4
안됨
mountvers=4
NFS: bad mount option value specified: mountvers=4
안됨
위에 -vvvv 옵션 보니 vers=3 으로 했네?
안됨
vers=3,prot=6
안됨
vers=3,prot=17
안됨
vers=4,tcp

결말

왜 됐는지 이유도 모르겠고, nfs 정말 싫다..

댓글

이 블로그의 인기 게시물

WSL2 Ubuntu 20.04 및 네트워크 설정

리눅스 멀티코어를 사용하는 tar 압축/해제

WSL에 X-Window로 Terminator 설치하고 Minicom까지