1P by GN⁺ | ★ favorite | 댓글 1개
  • WinBtrfs v1.9는 Linux 파일시스템 Btrfs를 Windows에서 읽고 쓸 수 있게 하는 드라이버이며, Linux 커널 코드를 쓰지 않고 처음부터 다시 구현됨
  • Windows XP 이후 버전에서 동작해야 하며, 무료 운영체제 ReactOS에도 포함되어 있고, Linux의 MD 소프트웨어 RAID 위에 있는 Btrfs는 별도 WinMD가 필요함
  • 기능 범위는 읽기/쓰기, RAID0/1/10/5/6, 서브볼륨·스냅샷, reflink copy, send/receive, zlib/LZO/Zstd 압축, LXSS 지원, ACL·ADS·권한 매핑까지 포함함
  • 설치는 최신 릴리스를 내려받아 btrfs.inf를 설치하거나 Chocolatey·Scoop을 사용할 수 있으며, Windows 10/11의 Secure Boot 환경에서는 레지스트리 변경이나 Secure Boot 비활성화가 필요할 수 있음
  • 프로젝트는 LGPL로 배포되지만 파일시스템 손상에 대한 책임을 지지 않으며, 일상 사용에 적합해야 한다고 하면서도 백업을 권장함

WinBtrfs가 하는 일

  • WinBtrfs는 Linux의 차세대 파일시스템인 Btrfs를 위한 Windows 드라이버임
  • Linux 커널 코드를 포함하지 않고 처음부터 다시 구현됐으며, Windows XP 이후 버전에서 동작해야 함
  • 무료 운영체제 ReactOS에도 포함되어 있음
  • Btrfs 파일시스템이 Linux에서 만든 MD 소프트웨어 RAID 장치 위에 있으면 Windows에서 보이게 하려면 WinMD가 필요함
  • 관련 프로젝트로 Windows를 Btrfs에서 부팅할 수 있게 하는 실험적 부트로더 Quibble, NTFS 파일시스템을 제자리 변환하는 Ntfs2btrfs가 있음

지원 기능

  • 기본 기능
    • Btrfs 파일시스템 읽기와 쓰기
    • Windows가 일반적으로 무시할 Btrfs 파티션 발견
    • 파티션 없는 Btrfs 볼륨
    • 비동기 읽기와 쓰기
    • 캐싱, free-space cache, free space tree
  • RAID와 볼륨 관리
    • RAID0, RAID1, RAID10
    • RAID5, RAID6
    • Linux에서 시작한 balance 재개를 포함한 balancing
    • 장치 추가와 제거
    • degraded mount
    • 볼륨 축소와 확장
  • 파일시스템 기능
    • 서브볼륨과 스냅샷 생성·식별을 위한 셸 확장
    • 하드 링크, 심볼릭 링크, reparse point
    • sparse file, preallocation
    • reflink copy
    • subvolume send와 receive
    • scrubbing, TRIM/DISCARD
  • Windows·Linux 상호운용
    • ACL을 xattr security.NTACL로 가져오고 설정
    • Alternate Data Streams를 xattr로 저장하며, 예를 들어 :Zone.Identifieruser.Zone.Identifier로 저장
    • Linux 사용자와 Windows 사용자 매핑
    • LXSS, 즉 “Ubuntu on Windows” 지원
    • LXSS용 권한 등 메타데이터 passthrough
    • Windows 10의 대소문자 구분 디렉터리 플래그 지원
  • 압축과 호환 기능
    • zlib, LZO, Zstd 압축
    • Metadata UUID incompat flag는 Linux 5.0 기준 지원
    • 3·4디스크 RAID1, xxhash·sha256·blake2 checksum은 Linux 5.5 기준 지원
    • block group tree는 Linux 6.1 기준 지원

아직 남은 작업

  • fs-verity 전체 지원은 Linux 5.15 항목으로 남아 있음
  • Zoned 지원은 Linux 5.11 항목으로 남아 있으며, HM-SMR이 Windows에서 지원되지 않을 수 있다는 단서가 있음
  • 조각 모음, Btrfs quota, 전체 transaction log 지원, Windows transactions인 TxF 지원이 할 일 목록에 있음

설치와 제거

  • 설치는 최신 릴리스를 내려받아 압축을 풀고 btrfs.inf를 우클릭해 Install을 선택함
  • 드라이버는 서명되어 있어 최신 Windows에서는 바로 동작해야 함
  • Windows 10 또는 11에서 Secure Boot가 켜져 있으면 드라이버 로드를 위해 레지스트리 변경이 필요할 수 있음
    • 더 쉬운 방법으로 BIOS에서 Secure Boot를 끄는 방법도 제시됨
    • Windows 11은 설치 시 Secure Boot를 약하게 요구하지만, 설치 후에는 꺼도 동작한다고 되어 있음
  • 패키지 매니저 설치도 가능함
    • Chocolatey: choco install winbtrfs
    • Scoop: scoop bucket add nonportable, scoop install winbtrfs-np -g
  • 제거는 RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultUninstall 132 btrfs.inf 명령이나 Device Manager의 “Btrfs controller” 제거로 수행 가능함
  • 레지스트리로 제거해야 하면 HKLM\SYSTEM\CurrentControlSet\services\btrfs\Start 값을 4로 설정해 서비스를 비활성화한 뒤 재부팅 후 키와 C:\Windows\System32\drivers\btrfs.sys를 삭제함

빌드와 사용자 매핑

  • Visual C++ 2019로 빌드하려면 디렉터리를 열고 CMake가 처리하게 하면 되며, Windows DDK가 제대로 설치되어 있으면 동작해야 함
  • Linux에서 GCC로 빌드하려면 i686-w64-mingw32 또는 x86_64-w64-mingw32 크로스 컴파일러가 필요함
  • 사용자 매핑은 HKLM\SYSTEM\CurrentControlSet\services\btrfs\Mappings 레지스트리 키에 저장됨
    • Windows SID 이름의 DWORD를 만들고 Linux uid 값을 넣음
    • 현재 SID는 wmic useraccount get name,sid로 확인 가능함
  • 그룹 매핑은 GroupMappings 아래에 저장됨
    • 기본 항목은 Windows의 Users 그룹을 Linux에서 보통 users인 gid 100에 매핑함
    • 사용자 SID를 지정해 특정 사용자가 만든 파일이 특정 그룹에 속하게 할 수 있음
  • User Access Control 토큰으로 실행되는 프로세스는 사용자 계정이 아니라 BUILTIN\Administrators SID로 파일을 생성한다는 주의점이 있음

WSL/LXSS 지원

  • 드라이버는 최신 LXSS 버전에 Linux 메타데이터를 passthrough할 수 있음
  • 이를 사용하려면 Windows의 Bash 프롬프트에서 /etc/wsl.conf를 다음 형태로 설정함
    • [automount]
    • enabled = true
    • options = "metadata"
    • mountFsTab = false
  • 변경 사항은 다음 재부팅 때 적용됨
  • 실제 Linux 설치 환경으로 chroot할 수 있어야 한다고 되어 있음

명령줄 작업

  • shellbtrfs.dll은 GUI 인터페이스를 제공하지만 rundll32.exe로 일부 작업을 명령줄에서 실행할 수 있음
  • rundll32는 오류 코드를 반환할 방법이 없어서 명령이 조용히 실패할 수 있음
  • 일반 명령
    • CreateSubvol <path>
    • CreateSnapshot <source> <destination>
    • ReflinkCopy <source> <destination>이며 와일드카드와 여러 원본 파일을 받을 수 있음
  • 관리자 권한이 필요한 명령
    • SendSubvol <source> [-p <parent>] [-c <clone subvol>] <stream file>
    • RecvSubvol <stream file> <destination>
    • StartScrub <drive>
    • StopScrub <drive>

문제 해결에서 중요한 제약

  • 파일명은 모두 UTF-8로 인코딩됐다고 가정함
  • Secure Boot가 켜진 Windows 10 후반 버전에서는 Microsoft의 서명 요구사항 때문에 오픈소스 드라이버에서 사용할 수 없는 것으로 보이는 조건이 생겼다고 되어 있음
    • 우회 방법은 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CI\PolicyUpgradedSystem DWORD를 만들고 1로 설정한 뒤 재부팅하는 것
    • 또는 BIOS에서 Secure Boot를 끌 수 있음
  • LXSS에서 드라이브 루트가 대소문자를 구분하지 않는 것은 Microsoft가 하드코딩한 동작임
  • Windows 자체 포맷 대화상자에는 Btrfs를 추가할 수 없으며, 파일시스템 목록이 하드코딩되어 있음
    • Btrfs 포맷은 포함된 mkbtrfs.exe를 사용함
    • Btrfs 전용 옵션이 필요 없으면 format /fs:btrfs도 가능함
  • Synology NAS는 블록 장치에 LVM을 쓰는 것으로 보여 Windows용 LVM 드라이버가 없으면 마운트할 수 없음
  • Thecus NAS는 Linux MD RAID를 쓰므로 WinMD를 함께 설치해야 함
  • Windows와 POSIX 권한 모델은 서로 너무 달라 실용적인 매핑이 없으며, Windows에서 편집하지 못하게 하고 싶은 파일에는 Windows ACL을 만들 수 있음

v1.9 변경점

  • v1.9는 2024년 3월 15일 릴리스됨
  • Linux 6.1의 block group tree 지원이 추가됨
  • 시스템이 높은 부하 상태일 때 멈추는 문제가 수정됨
  • mkbtrfs/blockgrouptree, /freespacetree 옵션이 추가됨
  • mkbtrfs에서 /noholes 기본값을 Linux처럼 켜짐으로 맞춤
  • aarch64에서 CRC32C 명령 지원이 추가됨

디버그와 마운트 옵션

  • WinBtrfs는 디버그 메시지를 errors/FIXMEs, warnings, traces의 세 단계로 나눔
  • 릴리스 버전 드라이버는 errors와 FIXMEs만 DbgPrint로 기록하며, Microsoft DebugView로 볼 수 있음
  • 문제 보고 시 전체 디버그 로그를 첨부하려면 디버그 버전 드라이버와 레지스트리 설정을 사용함
    • DebugLogLevel: 0은 메시지 없음, 1은 errors/FIXMEs, 2는 warnings 포함, 3은 traces까지 전부
    • LogDevice: 선택 사항이며 출력할 직렬 장치
    • LogFile: 선택 사항이며 출력할 파일
  • 마운트 옵션은 HKLM\SYSTEM\CurrentControlSet\Services\btrfs 아래 각 파일시스템 UUID 하위 키에 저장됨
  • 주요 옵션
    • Ignore: 해당 파일시스템을 로드하지 않음
    • Readonly: Linux의 ro 플래그처럼 쓰기를 허용하지 않음
    • Compress, CompressForce, CompressType: 기본 압축, 강제 압축, 선호 압축 방식 설정
    • FlushInterval: 메타데이터 flush 간격이며 기본값은 Linux와 같은 30초
    • SubvolId: 루트로 마운트할 서브볼륨 ID
    • SkipBalance: 마지막 종료 시 진행 중이던 balance 재개를 건너뜀
    • NoTrim: TRIM 지원 비활성화
    • AllowDegraded: 장치가 빠진 degraded 볼륨 마운트 허용
    • NoDataCOW: 새 파일에 copy-on-write를 비활성화하며 Linux의 nodatacow 플래그와 같음

라이선스와 책임 범위

  • 전체 프로젝트는 GNU Lesser General Public Licence, 즉 LGPL로 배포됨
  • 소프트웨어 사용은 사용자 책임이며, 파일시스템에 생길 수 있는 손상에 대해 책임지지 않는다고 명시함
  • 일상 사용에 적합해야 한다고 하면서도 백업을 하라고 권장함
  • 포함된 제3자 코드로 Zlib, LZO, Zstd, BLAKE2, SHA256 관련 저작권·라이선스 고지가 포함되어 있음

댓글과 토론

Hacker News 의견들
  • 한동안 써보고 싶었지만 GitHub 이슈를 훑어보니 바로 포기하게 됐음
    블루스크린, 잠김, 사용량 급증, 손상 같은 문제가 보였고, 안정적인 btrfs/ZFS 드라이버가 있다면 기꺼이 돈을 낼 생각임
    왜 이런 프로젝트들이 더 주목받지 못하는지 이해가 잘 안 됨

    • “기꺼이 돈을 낼 생각”이라면 후원 링크가 있음: https://github.com/maharmstone/btrfs?tab=readme-ov-file#dona...
    • Microsoft가 지원하지 않고, 드라이버 개발자들이 Windows 커널 코드를 읽을 수 없기 때문임
      그래서 앞서 말한 문제들이 고쳐져도 Windows를 btrfs에서 부팅하는 건 여전히 어려울 가능성이 큼
      로마에 가면 로마법을 따르라니까, Windows는 그냥 가상화해서만 돌려야 할지도 모름
  • Linux 코드를 쓰지 않고 완전 재구현했다는 점이 정말 멋지고, XP/2k3와 ReactOS까지 지원한다는 점도 훌륭함
    오래된 머신 중 하나에서 한번 써봐야겠음

    • Rust 쪽에서 흥미로운 패턴으로 입출력 없는 라이브러리가 늘고 있음
      이 현상을 어디에 링크하는 게 좋을지는 모르겠지만, 2019년에 올라온 입출력 없는 QUIC 라이브러리 이슈가 있음: https://github.com/aiortc/aioquic/issues/4
      파일 시스템도 이런 패턴을 따르면 정말 좋겠음
      파일 시스템 로직을 재사용하면서 Windows, FUSE, Linux, wasm의 선형 주소 저장소 등에 적용할 수 있다면, 이식성과 재사용, 해킹 가능성이 엄청나게 커질 수 있음
    • ReactOS는 Windows와 API 호환을 목표로 하니, XP/2k3와 ReactOS를 모두 지원하는 게 아주 놀랍지는 않음
  • 관련 글:
    WinBtrfs – A Windows driver for the next-generation Linux filesystem Btrfs - https://news.ycombinator.com/item?id=15177002 - 2017년 9월, 댓글 100개
    WinBtrfs v0.7 - https://news.ycombinator.com/item?id=12794214 - 2016년 10월, 댓글 1개

  • 몇 주 전에 btrfs 하드드라이브에서 써보려 했지만 제대로 동작시키지 못했음
    이후 WSL로 접근했는데 몇 번은 잘 되다가 점점 실패하기 시작했고, 나중에는 마운트조차 되지 않았음
    결국 Linux 라이브 ISO로 부팅해서 Windows 드라이브와 btrfs 드라이브 사이에 파일을 복사/이동하면 된다는 걸 깨달았고, 지금은 Ventoy USB의 Fedora Workstation 라이브 ISO를 쓰고 있음

    • 진짜 같은 경험으로 들림
      이제 Windows에서도 btrfs로 데이터를 잃을 수 있게 됐음 :-D
  • 이 드라이버를 노트북에서 한동안 쓰고 있음
    Linux에서는 업무용 코딩에, Windows에서는 게임·영화·미디어용으로 같이 쓰는 환경임
    btrfs 파티션과 드라이브의 데이터 손상이 걱정된다면 README의 마운트 옵션에 집중하면 됨
    Arch Linux 시스템 파티션에는 Ignore를 쓰고, 나머지는 전부 Readonly를 쓰면 됨
    다만 20TB 외장 HDD에 btrfs zstd:2 압축을 걸어 완전히 마운트해 쓰면서도 CPU 급증이나 손상은 겪지 않았음

  • README를 모두 읽어보는 걸 추천함
    작성자가 궁금했던 질문들과 그보다 더 많은 내용을 답해놨음

  • 이건 어떻게 “기본 및 고급” RAID 5/6을 지원한다고 하는지 궁금함
    btrfs 자체는 그렇지 않은데, 여기서 말하는 “기본/고급”이 뭘 뜻하는지도 애매함: https://btrfs.readthedocs.io/en/latest/btrfs-man5.html#raid5...

    • 그건 정확히 맞지는 않음
      Linux btrfs도 일반적으로 RAID5를 지원하지만, 안전하게 쓰기 어렵게 만드는 알려진 경계 사례가 있음
      사실상 “사용 가능하지만 실험적이고 개발자 전용”에 가까움
      WinBtrfs는 RAID5 모드를 기능 중 하나로 적고 있을 뿐, 얼마나 잘 동작하는지는 제대로 다루지 않음
      관련 이슈의 질문들도 실질적인 답 없이 닫혔음: https://github.com/maharmstone/btrfs/issues/293
      개발자에게 상태와 테스트에 대해 확실한 답을 듣기 전에는 RAID 5/6에 데이터를 맡기지 않겠음
    • RAID0/1/10을 “기본” RAID라고 부르고 RAID5/6을 “고급” RAID라고 부르는 듯함
      왜 그런지는 모르겠지만, 전자는 “고급” 패리티 계산 같은 게 필요 없어서일지도 모름
  • Steam Deck에서 라이브러리를 미리 채워 넣으려고 이 드라이버와 btrfs를 썼음
    네트워크로 받으면 너무 오래 걸렸고, 당시 인터넷으로는 그보다 100배는 더 걸렸을 것 같았음
    이게 FAT 이후로 nix, Mac, Windows에서 그냥 동작하는 첫 파일 시스템이 될 수도 있음

    • 다들 항상 UDF를 잊어버림
  • 훌륭함
    장기간 또는 프로덕션에서 쓰는 사람이 있다면 실제로 어땠는지 궁금함
    TRIM은 지원되는 걸 봤는데, RETRIM도 지원되는지 궁금함
    처음에 명령 큐가 꽉 차서 TRIM되지 못한 영역을 드라이브 최적화 중에 해제하는 데 필요한 기능 말임
    ReFS를 싫어하는 사람에게 데이터 패리티가 있는 NTFS 대체재로 쓸 만한지도 궁금하고, Windows용 ZFS와 비교해 얼마나 성숙한지도 알고 싶음

    • 몇 년 동안 메인 머신에서 가볍게 써왔음
      Windows 파티션, Linux 파티션(LUKS 위의 btrfs), 그리고 파일을 보관하는 세 번째 btrfs 파티션이 있는 구성임
      자주 쓰지는 않지만, 쓸 때는 존재를 의식하지도 못할 정도임
      Windows가 원래부터 btrfs를 네이티브로 읽을 수 있었던 것처럼 느껴졌고, 단순히 파일 접근·수정·삭제만 하는 수준의 사용에서는 별다른 “고급” 기능을 쓰지 않았음
    • 한 번은 실수로 Visual Studio 빌드를 메인 NTFS 드라이브가 아니라 btrfs의 git 클론에서 돌렸음
      알아차리고 빌드를 취소했을 때, 이름은 같은데 내용이 다른 폴더가 두 개 생겨 있었고 같은 폴더 이름을 두 번 삭제해야 했음
      이 드라이버에는 동시성 문제가 있는 것 같음
    • WinBTRFS와 OpenZFS on Windows를 함께 설치하면 문제가 생길 수 있음
      “Win OpenZFS driver and WinBtrfs driver dont play well with each other”
      https://github.com/openzfsonwindows/openzfs/issues/364
    • ReFS와 Storage Spaces가 이미 이 목적을 충족하고, 통합되어 있으며 완전히 지원됨
      들은 바로는 BTRFS는 조금만 잘못 건드려도 멈추거나 데이터를 손상시키는 결함 목록이 말도 안 되게 길다고 함
      네이티브 운영체제에서도 신뢰성이 의심스러운 걸 Windows에 억지로 끼워 넣어 쓰는 건 미친 짓에 가까움
      재미로 해보는 건 괜찮지만, 실제 데이터는 절대 이 조합에 맡기지 않겠음
      “내 2디스크 미러에서는 잘 된다”는 건 일화일 뿐 데이터가 아님
  • 이걸 쓰면 btrfs로 포맷한 Windows USB 스틱에서 Windows 10/11 부팅이 가능해지는지 궁금함

    • Rufus를 써서 USB SATA/NVMe 드라이브 인클로저에 10/11을 “Windows To Go”로 설치할 수 있음
      한동안 Windows 10을 매일 그렇게 써본 경험으로는 꽤 괜찮게 동작했지만, 몇 가지 주의점이 있음
      안정적인 USB 연결이 필요하고, 컨트롤러 칩이 안정적이며 과열되지 않는 USB 드라이브 인클로저가 필요함
      드라이브는 전원 손실에 강해야 함
      아쉽게도 전원 손실 처리 능력을 평가해주는 자료는 아는 게 없음
      일부 드라이브는 갑작스러운 전원 차단에 크게 문제를 겪을 수 있음
      Intel 엔터프라이즈 SATA SSD와 커패시터가 있는 Dockcase의 NVMe 드라이브에서는 좋은 경험을 했음
      드라이브가 보이지 않게 되면 전원 재인가가 도움이 될 수 있음: https://dfarq.homeip.net/fix-dead-ssd/
      자동 백업도 설정해둬야 함
      성능 테스트나 Windows 전용 하드웨어 펌웨어 업데이트에 매우 유용함
      컴퓨터를 바꿔가며 쓸 때는 부팅 후 Windows가 헷갈려하다가 재부팅해야 하는 경우가 많고, 그다음에는 동작함
      다만 WinBTRFS나 별도 부트로더 프로젝트를 써본 경험은 없고, 그 부트로더는 몇 달 전부터 현재 깨져 있는 듯함
      Ventoy로 Windows VHD 파일을 부팅하는 것도 괜찮은 선택지일 수 있음
    • 그 자체만으로는 안 됨
      별도의 부트로더도 필요함
      작성자가 Quibble이라는 구현을 만들었고, 이것도 btrfs를 지원함
      [0] https://github.com/maharmstone/quibble