storage / knowledge

dataset의 NFSv4 ACL을 POSIX로 바꾸기

paul 2026.01.21 266words (1m)

SMB preset으로 만든 dataset은 ACL Type이 NFSv4다. 리눅스 쪽에서 NFS로 붙여 쓰기 시작하니 이게 걸렸다. POSIX로 바꾸려는데 방법이 두 가지다.

acltype만 바꾸면 안 되는 이유

ZFS에서 acltype 속성 자체는 쉽게 바꿀 수 있다. 그런데 그렇게 하면 기존에 걸려 있던 NFSv4 ACL 항목이 파일마다 그대로 남는다. 속성만 POSIX로 바뀌고 실제 데이터는 예전 것이 붙어 있는 상태다.

깔끔하지 않아서 새 dataset을 만들어 파일 단위로 옮기는 쪽을 택했다.

현재 상태 확인

console
$ sudo zfs get acltype vault/photos
NAME          PROPERTY  VALUE     SOURCE
vault/photos  acltype   nfsv4     local
console
$ nfs4xdr_getfacl /mnt/vault/photos/
# File: /mnt/vault/photos/
# owner: 0
# group: 0
# mode: 0o40770
# trivial_acl: false
# ACL flags: none
            owner@:rwxpDdaARWcCos:fd-----:allow
            group@:rwxpDdaARWc--s:fd-----:allow
group:builtin_administrators:rwxpDdaARWcCos:fd-----:allow

trivial_acl: false 가 실제 ACL 항목이 붙어 있다는 뜻이다. 이게 그대로 남는 게 문제다.

새 dataset 만들기

원하는 위치에 dataset을 새로 만들고 ACL을 POSIX로 잡는다. 상속 옵션을 켜두면 안으로 들어오는 파일에 자동으로 적용된다.

옮기기

며칠 걸릴 수 있으니 tmux 안에서 돌린다.

console
$ sudo rsync -avP --no-A --no-X /mnt/vault/photos/ /mnt/vault/media/photos/

--no-A--no-X 가 핵심이다.

  • --no-A — ACL을 옮기지 않는다
  • --no-X — extended attribute를 옮기지 않는다

-a 에는 이 둘이 포함되어 있어서 그냥 두면 원본의 NFSv4 ACL이 그대로 따라온다. 그러면 dataset만 새로 만든 의미가 없다. 명시적으로 꺼야 새 dataset의 기본 ACL이 적용된다.

확인

console
$ sudo zfs get acltype vault/photos
$ ls -al /mnt/vault/media/photos
$ getfacl /mnt/vault/media/photos

NFSv4일 때는 nfs4xdr_getfacl 로 봐야 했지만 POSIX가 되면 일반 getfacl 로 보인다. 이게 바뀌었으면 제대로 넘어간 것이다.

빠진 게 없는지는 -n 을 붙여 다시 돌려본다.

console
$ sudo rsync -avPn --no-A --no-X /mnt/vault/photos/ /mnt/vault/media/photos/

아무것도 안 나오면 끝이다.