홈으로 돌아가기

Samba, ZFS, VirtioFS: ACL 및 XATTR을 사용한 파일 서버 설정

KVM에서 VirtioFS를 통해 Samba와 ZFS를 통합하는 상세 가이드, Windows 호환 액세스 권한 및 섀도우 복사본을 위한 ACL 및 xattr 문제 해결.

Samba, ZFS 및 VirtioFS: NAS에서 ACL 및 xattr 문제 심층 분석
Advertisement 728x90

VirtioFS 환경에서 Samba와 ZFS 완벽 통합: ACL 및 XATTR 난제 극복 가이드

KVM 가상화 환경에서 VirtioFS를 활용하여 ZFS 스토리지를 기반으로 고성능 SMB 파일 서버를 구축하는 것은 Windows 클라이언트와의 완벽한 호환성을 위해 접근 제어 목록(ACL)과 확장 속성(xattr)을 정확하게 처리해야 하는 특별한 난관에 부딪히게 됩니다. 이 글에서는 이러한 핵심 장애물을 극복하고 파일 공유의 완전한 기능과 안정적인 운영을 보장하기 위한 구성 과정과 해결책을 상세히 다룹니다.

스토리지 가상화를 위한 VirtioFS 선택

ZFS 기반의 네트워크 연결 스토리지(NAS)를 구축하고 Samba를 통해 공유 폴더를 설정할 때, ZFS 풀을 가상 머신(VM)에 효율적으로 연결하는 방법이 필요합니다. 처음에는 NFS를 포함한 다양한 접근 방식이 고려되었지만, KVM 하이퍼바이저가 제공하는 직접 디렉터리 패스스루(pass-through) 방식이 특히 주목받았습니다. virtio-9pVirtioFS와 같은 사용 가능한 옵션 중에서 후자가 선택되었습니다.

virtio-9p는 불안정성, 제한적인 POSIX 지원, 그리고 낮은 성능으로 인해 중요한 파일 서버 작업에는 부적합하다고 판단되어 배제되었습니다. 반면 VirtioFS는 가상 머신이 호스트의 파일 시스템에 고성능으로 직접 접근할 수 있도록 하는 아키텍처 덕분에 훨씬 더 큰 잠재력을 보여주었습니다.

Google AdInline article slot

하지만 VirtioFS는 분명한 장점에도 불구하고 몇 가지 특이한 점이 있었습니다. 표준 virt-manager 설정에서는 Samba가 Windows 클라이언트와 올바르게 작동하는 데 필수적인 확장 속성(xattr) 및 접근 제어 목록(ACL) 지원을 활성화하는 옵션을 제공하지 않았습니다. 확장 속성은 추가 파일 정보를 저장할 수 있게 해주며, ACL은 사용자 및 그룹에 대한 세부적인 접근 권한을 정의하여 Windows의 NTFS 권한의 기반을 형성합니다. 이러한 기능 없이는 Samba와 ZFS의 완전한 통합은 불가능했을 것입니다.

ACL 및 XATTR 지원을 위한 VirtioFS 구성

주요 과제는 호스트에서 실행되는 virtiofsd 데몬이 필요한 --xattr--posix-acl 매개변수와 함께 시작되도록 하는 것이었습니다. libvirt 또는 Qemu를 통해 VM의 XML 구성을 직접 편집하는 것은 virtiofsd 시작에 필요한 모든 매개변수를 올바르게 전달할 수 없었기 때문에 효과적이지 않았습니다.

해결책은 래퍼(wrapper)를 사용하는 것이었습니다. 래퍼는 원하는 플래그와 함께 virtiofsd를 실행하는 간단한 스크립트입니다. 이 접근 방식은 libvirt의 한계를 우회하고 패스스루 디렉터리에 대한 완전한 ACL 및 xattr 지원 활성화를 보장했습니다. 래퍼를 생성하고 적용하는 과정은 다음 단계를 포함합니다:

Google AdInline article slot
  • 래퍼 스크립트 생성:

다음 내용을 포함하는 /usr/libexec/virtiofsdfix 파일을 생성합니다:

```bash

#!/bin/bash

Google AdInline article slot

exec /usr/libexec/virtiofsd "$@" --xattr --posix-acl --sandbox none

```

--sandbox none 매개변수는 실험 중에 추가되었으며, 경우에 따라 중요할 수 있는 격리(isolation) 기능을 비활성화하기 위한 것입니다.

  • 권한 설정:

스크립트에 실행 권한을 부여하고 원본 virtiofsd 데몬에서 보안 컨텍스트를 복사합니다:

```bash

sudo chmod +x /usr/libexec/virtiofsdfix

sudo chcon --reference=/usr/libexec/virtiofsd /usr/libexec/virtiofsdfix

```

  • VM 구성 수정:

가상 머신의 XML 구성(virt-manager 또는 virsh edit을 통해)에서 생성된 래퍼 스크립트의 경로를 주 VirtioFS 모듈로 지정합니다.

이러한 단계를 거치면 VirtioFS는 활성화된 xattr 및 POSIX ACL 지원과 함께 호스트의 파일 시스템을 가상 머신으로 올바르게 전달할 것입니다. 이는 ZFS 및 Samba와의 추가 통합을 위한 기본적인 토대를 마련합니다.

올바른 ACL 작동을 위한 ZFS 구성

VirtioFS가 확장 속성 및 POSIX ACL을 올바르게 전달하도록 구성되었더라도, ZFS 파일 시스템은 이러한 기능을 완벽하게 지원하기 위해 특정 구성이 필요합니다. ZFS 데이터셋이 Windows에서 사용되는 ACL(NTFS ACL)과 유사한 ACL을 올바르게 처리할 수 있도록 하려면 몇 가지 주요 속성을 설정해야 합니다:

  • zfs set acltype=posixacl pool/smbfs:

이 속성은 지정된 데이터셋에 대해 표준 Linux POSIX ACL 지원을 활성화합니다. 이는 getfaclsetfacl과 같은 명령이 올바르게 작동하도록 허용하며, Samba의 전제 조건입니다.

  • zfs set aclinherit=passthrough pool/smbfs:

이 속성은 ACL 상속 동작을 정의합니다. passthrough 값은 데이터셋 내에서 새 파일이나 디렉터리가 생성될 때 부모 디렉터리로부터 접근 권한을 자동으로 상속받도록 보장합니다. 이는 파일 구조 내에서 일관된 권한을 유지하는 데 중요하며, 특히 Windows 공유 환경에서 더욱 그렇습니다.

  • zfs set aclmode=passthrough pool/smbfs:

이 속성은 ACL에 대한 ZFS의 비간섭 모드를 설정합니다. passthrough 모드에서 ZFS는 ACL을 해석하거나 수정하려고 시도하지 않고 있는 그대로 전달합니다. 이는 자체 ACL을 관리하는 Samba와 같은 외부 시스템과의 최대 호환성을 보장합니다.

ZFS와 VirtioFS를 구성한 후, 남은 유일한 단계는 게스트 VM 내부에 패스스루된 디렉터리를 마운트하는 것입니다. 이는 /etc/fstab에 적절한 줄을 추가하여 수행할 수 있습니다:

fs   /fs   virtiofs   rw,noatime,_netdev,nofail

mount -a를 실행한 후, ZFS 디렉터리는 VM의 /fs에서 접근 가능하며 Samba에서 사용할 준비가 됩니다.

acl_xattrsecurity.NTACL 관련 Samba 문제

기본 VirtioFS 및 ZFS 설정이 완료되면 다음 단계는 Samba 구성입니다. vfs objects = acl_xattr을 포함하는 로컬 디렉터리에 대한 일반적인 설정은 완벽하게 작동하여 Samba가 Windows ACL에 사용되는 것을 포함한 확장 속성을 쓸 수 있도록 합니다. 그러나 이 구성을 VirtioFS를 통해 패스스루된 디렉터리에 적용하려고 하면 문제가 발생합니다: Samba가 XATTR 속성, 특히 security.NTACL을 쓰기를 거부합니다.

이 문제는 POSIX ACL에 대한 표준 setfacl 명령은 로컬 디스크와 VirtioFS 모두에서 올바르게 작동하지만, security.NTACL과 같은 Samba 특정 속성 쓰기는 실패하는 것으로 나타납니다. 이는 Samba가 필요한 보안 설명자 정보를 저장할 수 없으므로 Windows 권한과의 완전한 기능을 방해합니다. 호스트에서 SELinux를 비활성화해도 원하는 결과를 얻지 못했습니다.

Samba 속성 쓰기를 시뮬레이션하기 위해 setfattr로 수행된 테스트는 핵심 문제를 드러냈습니다. 도메인 사용자로 security.NTACL 속성을 쓰려고 시도했을 때, 로컬 파일과 VirtioFS의 파일 모두에서 작업이 실패했습니다. 그러나 슈퍼유저(root)로 동일한 작업을 수행했을 때, 로컬 디스크에서는 security.NTACL 쓰기가 성공했지만, VirtioFS에서는 여전히 실패했습니다.

이는 확장 속성이 처리되는 방식에 근본적인 차이가 있음을 나타냅니다:

  • security.NTACL: 이 속성은 security 네임스페이스에 존재하며 Samba가 Windows 권한(NTFS ACL)을 저장하는 데 사용됩니다. 이 네임스페이스에 대한 쓰기는 엄격하게 제한되며 root 권한과 동등한 CAP_SYS_ADMIN 권한이 필요합니다. 일반 사용자, 심지어 파일 소유자도 이 속성을 직접 수정하거나 삭제할 수 없습니다.
  • user.NTACL: 이 속성은 user 네임스페이스에 존재합니다. 파일에 대한 쓰기 권한이 있는 모든 사용자는 이 네임스페이스의 속성을 수정할 수 있습니다.

VirtioFS에서 실패하는 주된 이유는 --sandbox none 매개변수를 사용하고 root 권한(via sudo)으로 쓰기를 시도했음에도 불구하고, VirtioFS가 커널 수준 또는 자체 구현에서 security.NTACL 네임스페이스에 대한 쓰기를 명백히 차단하기 때문입니다. 이는 Samba의 Windows 권한이 올바르게 저장되는 것을 방해합니다.

해결책: security.NTACLuser.NTACL로 리디렉션 및 ZFS 스냅샷 통합

Samba가 VirtioFS를 통해 security.NTACL 네임스페이스에 속성을 올바르게 쓸 수 없으므로, 유일한 실행 가능한 해결책은 이러한 속성을 user.NTACL 사용자 네임스페이스로 리디렉션하는 것입니다. 이는 근본적인 VirtioFS 문제에 대한 완전한 해결책이라기보다는 임시방편이지만, Samba가 필요한 모든 Windows 권한 정보를 저장할 수 있도록 합니다. 이 접근 방식은 사용자가 SMB를 통해서만 서버와 상호 작용하고 호스트 또는 게스트 VM의 파일 시스템에 직접 접근하지 않을 때 허용된다는 점에 유의해야 합니다.

이 해결책을 구현하려면 다음 매개변수를 Samba 구성 파일(smb.conf)에 추가해야 합니다:

[VirtioFS]
    path = /fs
    writable = yes
    admin users = "domain\admin-domain" "superadmin"

    vfs objects = acl_xattr shadow_copy2

    # user.NTACL
    acl_xattr:security_acl_name = user.NTACL
    acl_xattr:ignore system acls = yes


    shadow:basedir = /fs
    shadow:snapdir = .zfs/snapshot
    shadow:format = GMT-%Y.%m.%d_%H.%M.%S
    shadow:sort = desc
    shadow:localtime = yes

여기서 핵심적인 줄은 다음과 같습니다:

  • acl_xattr:security_acl_name = user.NTACL: Samba에게 보안 설명자를 저장할 때 security.NTACL 대신 user.NTACL을 사용하도록 지시합니다.
  • acl_xattr:ignore system acls = yes: 이 매개변수는 Samba에게 시스템 ACL을 무시하고 권한 저장을 위해 자체 메커니즘에 의존하도록 지시합니다.

Samba와 ZFS 스냅샷 통합

Windows 클라이언트에 섀도 복사본(Shadow Copies) 기능을 제공하여 사용자가 이전 파일 버전을 복원할 수 있도록 하려면 shadow_copy2 모듈이 사용됩니다. 이 모듈은 ZFS의 스냅샷 기능과 통합됩니다. 제공된 구성에서:

  • vfs objects = acl_xattr shadow_copy2: shadow_copy2 모듈을 활성화합니다.
  • shadow:basedir = /fs: 섀도 복사본의 기본 디렉터리를 지정합니다.
  • shadow:snapdir = .zfs/snapshot: ZFS가 스냅샷을 저장하는 하위 디렉터리를 정의합니다. 올바른 작동을 위해 ZFS 풀에는 listsnapshots=on 속성이 설정되어 있어야 합니다(예: zpool set listsnapshots=on pool_name). 이는 Samba가 사용 가능한 스냅샷을 검색하고 표시할 수 있도록 합니다.
  • shadow:format, shadow:sort, shadow:localtime: 스냅샷의 표시 형식과 정렬을 구성합니다.

따라서 이 구성은 security.NTACL과 관련된 초기 어려움에도 불구하고 VirtioFS를 통해 ZFS 상에 완전한 기능을 갖춘 Samba 파일 서버를 생성하여 Windows ACL 및 섀도 복사본과 함께 올바르게 작동하도록 보장합니다.

핵심 요약

  • VirtioFS 및 ACL/xattr: VirtioFS를 통해 Windows ACL과 함께 Samba의 완전한 기능을 사용하려면 virtiofsd 데몬이 --xattr--posix-acl 매개변수와 함께 시작되어야 하며, 종종 래퍼 스크립트가 필요합니다.
  • ZFS 구성: Samba 공유에 사용되는 ZFS 데이터셋은 올바른 ACL 처리를 위해 acltype=posixacl, aclinherit=passthrough, aclmode=passthrough 속성으로 구성되어야 합니다.
  • security.NTACL 문제: Samba는 기본적으로 Windows 보안 설명자를 security.NTACL에 쓰려고 시도하는데, 이는 root 권한이 필요하며 VirtioFS에 의해 차단될 수 있습니다.
  • user.NTACL을 통한 해결책: 효과적인 해결책은 acl_xattr:security_acl_name = user.NTACL 매개변수를 통해 Samba가 보안 속성 저장을 위해 user.NTACL을 사용하도록 리디렉션하는 것입니다.
  • ZFS 스냅샷 및 Samba: Windows 섀도 복사본을 위한 ZFS 스냅샷 통합은 Samba의 shadow_copy2 모듈을 통해 이루어지며, 적절한 ZFS 풀 속성 구성이 필요합니다.

— Editorial Team

Advertisement 728x90

다음 읽기