MacOS: NFS/Autofs 설정

예전 글도 있긴 한데, 새롭게 다시 정리해본다.


NFS 서버 설정은 넘긴다. 다만, 권한 문제는 SetGID로 풀어가기로 한다.
SetGID 를 쓰면, macOS 의 uid 때문에 좀 모호한 상황에 처하게 되긴 한다. 예를 들어, PC 가 총 3대이고, 모두 리눅스 계열을 쓴다고 가정한다면, 그 사용자의 uid 는 모두 1000 (대체로 이렇다.) 이 되기 때문에, 어느 기기에서 NFS 에 접근하든, 모두 Owner 로서 권한을 갖게 된다.

허나, macOS 에선 기본 사용자 uid 를 501 로 정해놨다. 이걸 1000 으로 바꿀 수 있긴 한데.. 예전에 그렇게 해봤더니 로그인이 살짝 어려워지는(?)등 자잘한 문제가 있었다.
그래서 그냥, 이런 저런 해법을 뒤로 하고 SetGID 를 쓰기로 했다. 다만, 이 방법은 개인 환경에서나 적합한 방식이다. (큰 규모로 사용하려면.. 각 PC 마다 uid 를 다르게 해서 사용하고, NFS 서버에도 동일한 uid 로 사용자를 만들고??)
(이는 내 알 바 아니니 넘어가고..)

** umask 설정

SetGID 를 쓰려면 Group Write 이 허가권이 필요한데, macOS 는 umask 가 022 로 돼 있다.
이걸 002 로 바꿔줘야 한다.

sudo launchctl config user umask 002

nfs 설정?

적어도 macOS 13 까지는, nfs 와 autofs 가 기본 설치 되어 있다. 이후에는 달라질 수도 있다는 내용이 man page(man nfs)에 나와있다.

As part of macOS Ventura (macOS 13.0), NFS client code was moved out from kernel into kernel extension (kext). The new kext is now loaded by default on boot. Hence, from the user perspective, there is no difference from the previous releases. This behavior will change in a future release, i.e., NFS kext will not be loaded on boot but automatically when mount_nfs is called ( NetFSFramework and autofs use mount_nfs in order to mount) or manually using kextload tool. This means that mount(“nfs”, …) syscall would fail with ENODEV and NFS client sysctl parameters will not be available until kext is up.

man page : nfs

이건 나중 얘기이므로, 지금은 별 관계없겠으나.. 찾아낸 게 아까와서 적어둔다.

autofs

NFS 서버가 24시간 돌아간다면, 그냥 영구 마운트로 쓰면 되겠지만, 나처럼 서버를 껐다 켰다하는 상황에서는 autofs 를 써야만 한다.
autofs 설정 파일은 모두 /etc 에 있는데, 다음과 같이 3개다.

/etc/autofs.conf
/etc/auto_home
/etc/auto_master

autofs.conf 는 딱히 건드릴게 없다.
auto_home 은 /home 디렉토리를 위한 설정이므로 건드리면 안되겠고.
내게 필요한 설정은 바로 auto_master 다.
여기에 원하는 디렉토리(/nfs)와, 그에 따른 설정(autofs_big_rego)를 추가한다.

단, /nfs 디렉토리는 실제로 만들 필요는 없고, 여기에 설정한 후 재부팅하면 알아서 만들어진다. 또, macOS Catalina(?)부턴가, 루트 디렉토리엔 직접 파일을 만들 수가 없다.

** macOS 판올림이 되면 이 파일이 원 상태로 바뀐다!
얘들은 도대체 왜 이리 사용자 사생활(?)을 간섭하는지..
13.3.1(22E261) 로 올라갔을 때도 그랬고, 13.4 로 바뀐 지금도 그렇다.
따라서, 이 파일 보관본을 만들 필요가 있겠다.

#
# Automounter master map
#
+auto_master		# Use directory service
#/net			-hosts		-nobrowse,hidefromfinder,nosuid
/home			auto_home	-nobrowse,hidefromfinder
/Network/Servers	-fstab
/-			-static

# 아래 행의 의미는, '/nfs 아래 마운트될 nfs 설정은 /etc/autofs_big_repo 를 따른다.'가 된다.
/nfs    autofs_big_repo			-nobrowse

위에서 언급한 auto_home 이 여기에 설정되어 있다.
여기에, 내게 필요한 디렉토리를 추가해본다. 내가 원하는 것은?

nfs 연결을, /nfs 산하에 두고 싶고, 자세한 설정은 autofs_big_repo 에서 하려고 한다. (이 방식을 Indirect Map 이라고 한다.)

이게 위에 있는 모든 내용이다. 선택사항으로 nobrowse, hidefromfinder 등이 있는데.. man page(auto_master)를 읽어봐도 뭔 내용인지..

The nobrowse option is used on maps that have the potential to produce entries too numerous for browsing to be practical. This option as used in the master map is distinct from nobrowse used as a Mac OS X mount option, which affects the visibility of the mount to the Finder. The hidefromfinder option is used on maps that shouldn’t show up as folders in the Finder; it causes the UF_HIDDEN flag to be set on the root directory of the map.

그냥 nobrowse 만 붙였다. 이걸 붙여주면, 실제로 마운트되기 전까진 마운트 포인트들이 보이지 않는다. 뭔 소린가 하면..

/nfs/Video 라는 마운트 포인트가 있을 때, 실제로 마운트 되기 전까진 ls /nfs 해도 보이지 않는다는 뜻이다. 마운트를 하고 나면 당연히 보인다.
안보이는데 어떻게 마운트를 하냐고? 그 디렉토리가 있는 듯 명령을 내려주면 된다. (cd /nfs/Video 등)

마운트 (Indirect Map)

/etc/autofs_big_repo 에는 이런 형식으로 내용을 넣어준다.

storage -fstype=nfs,rw,nfc,soft,locallocks 서버주소:<디렉토리>

맨 앞 ‘storage’ 는, 마운트 포인트를 나타내는데, auto_master 에 /nfs 가 언급돼 있으므로, 최종 마운트 포인트 위치는 /nfs/storage 가 된다.

옵션은 man mount_nfs 에서 자세히 알 수 있는데.. 간단히 정리해본다.

  • fstype=nfs : nfs 로 마운트하겠다는 뜻. smb 등 다른 것을 쓸 땐 그에 맞는 용어를 써줘야 한다. nfs 일 땐 안 넣어줘도 된다.
  • rw : read / wright 로 마운트.
  • nfc : UTF8 정규화 방식. 이걸 해줘야 문제가 없다.
  • soft : soft mount 라고 하는데.. 사실 잘 모르겠다.
  • locallocks : 역시 잘 모름~ lock 을 Client 에서 할 지 Server 에서 할 지를 정하는 거라는데..

또 한가지. 워낙에 macOS 에선 resvport 를 붙여줘야 리눅스 서버에 접속할 수 있는데, iOS 에서 내가 쓰는 nfs 클라이언트는 이걸 붙여줄 방법이 없다. 따라서, nfs 서버에서 insecure 를 붙여주고, macOS 에선 resvport 를 안쓰는 방법을 택했다.

위에 언급한 대로, nfs 일 경우 fstype=nfs 를 빼줘도 된다. 따라서 위 행은 다음과 같이 써도 된다.

서버주소:<디렉토리> 는 그대로 써주면 된다. 192.168.0.55:/storage/Video 등.

storage -rw,nfc,soft,locallocks 서버주소:<디렉토리>

비슷한 내용을 정리한 글도 있으니 참고.

한글 디렉토리명 문제?

리눅스에는 이런 문제가 전혀 없는데…

강좌            -soft,nfc,rw,locallocks nfs-srv:/storage/강좌

이렇게 설정했다면 마운트에 문제가 생긴다. 앞 ‘강좌’가 아닌, 뒷 ‘강좌’에서. 즉, 마운트 포인트는 한글로 넣어도 관계없지만, nfs 서버쪽 디렉토리에 한글이 있으면 오류가 발생한다.
이 내용을 열심히 찾아봤지만, 답은 찾지 못했다.

그래서?? 한글로 된 걸 다 영어로 바꿔야 하나??
다른 글에서도 썼지만, 궁하면 통한다고, 편법으로 해결할 수 있었다.

서버에 심볼릭 링크를 만들면 된다.
즉, /storage/강좌 를, /storage/Lectures 등으로 심볼릭 링크 시켜주고, autofs 설정엔 그 디렉토리를 추가해주면 된다. /etc/exports 를 수정하지 않아도 된다. 그냥 심볼릭 링크만 만들어주면 끝.
다시 말해서, 서버에 영어로 심볼릭 링크를 만들고, 클라이언트에선 이렇게 설정해주면 된다.

강좌            -soft,nfc,rw,locallocks nfs-srv:/storage/Lectures

이 사항은 마운트 되는 디렉토리명에만 해당되고, 그 이하 디렉토리들엔 한글이 들어가 있어도 관계가 없다. 즉, /storage/강좌/영어, /storage/강좌/수학 등이 있어도 관계가 없다.

Auto Mount 는 어떻게?

설정을 바꿨는데 뭔가 제대로 적용이 안된 듯 하다면, 다음 두 명령어로 재시작 할 수 있다.

sudo launchctl stop com.apple.autofsd
sudo automount -vcu

마운트 하려면, 위에서도 얘기했듯 그 디렉토리로 이동하면 된다. 헌데, nobrowse 를 해줬기 때문에 Finder 로는 찾아갈 수가 없다. KDE Plasma Dolphin 에선 이걸 좀 쉽게 할 수 있긴 한데.. (마운트를 한 상태에서 즐겨찾기로 설정해놓으면, 다음부턴 그냥 클릭만으로 마운트가 된다.)

허나 macOS Finder 로는 이게 불가능했다. 따라서, 터미널을 열고, 해당 디렉토리를 ls 나 cd 로 하나 하나 명령을 내려줘야 했는데.. (alias 나 script 를 만들어놓으면 어느 정도 편하게 쓸 수 있긴 하다.)
그래도 좀 더 쉽게 쓸 수 있는 방법은 없으려나???
나중에 방법을 찾게 되면 추가해보기로.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.