- 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.Identifier는user.Zone.Identifier로 저장 - Linux 사용자와 Windows 사용자 매핑
- LXSS, 즉 “Ubuntu on Windows” 지원
- LXSS용 권한 등 메타데이터 passthrough
- Windows 10의 대소문자 구분 디렉터리 플래그 지원
- ACL을 xattr
- 압축과 호환 기능
- 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
- Chocolatey:
- 제거는
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를 지정해 특정 사용자가 만든 파일이 특정 그룹에 속하게 할 수 있음
- 기본 항목은 Windows의 Users 그룹을 Linux에서 보통
- User Access Control 토큰으로 실행되는 프로세스는 사용자 계정이 아니라
BUILTIN\AdministratorsSID로 파일을 생성한다는 주의점이 있음
WSL/LXSS 지원
- 드라이버는 최신 LXSS 버전에 Linux 메타데이터를 passthrough할 수 있음
- 이를 사용하려면 Windows의 Bash 프롬프트에서
/etc/wsl.conf를 다음 형태로 설정함[automount]enabled = trueoptions = "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\Policy에UpgradedSystemDWORD를 만들고 1로 설정한 뒤 재부팅하는 것 - 또는 BIOS에서 Secure Boot를 끌 수 있음
- 우회 방법은
- LXSS에서 드라이브 루트가 대소문자를 구분하지 않는 것은 Microsoft가 하드코딩한 동작임
- Windows 자체 포맷 대화상자에는 Btrfs를 추가할 수 없으며, 파일시스템 목록이 하드코딩되어 있음
- Btrfs 포맷은 포함된
mkbtrfs.exe를 사용함 - Btrfs 전용 옵션이 필요 없으면
format /fs:btrfs도 가능함
- 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: 루트로 마운트할 서브볼륨 IDSkipBalance: 마지막 종료 시 진행 중이던 balance 재개를 건너뜀NoTrim: TRIM 지원 비활성화AllowDegraded: 장치가 빠진 degraded 볼륨 마운트 허용NoDataCOW: 새 파일에 copy-on-write를 비활성화하며 Linux의nodatacow플래그와 같음
라이선스와 책임 범위
- 전체 프로젝트는 GNU Lesser General Public Licence, 즉 LGPL로 배포됨
- 소프트웨어 사용은 사용자 책임이며, 파일시스템에 생길 수 있는 손상에 대해 책임지지 않는다고 명시함
- 일상 사용에 적합해야 한다고 하면서도 백업을 하라고 권장함
- 포함된 제3자 코드로 Zlib, LZO, Zstd, BLAKE2, SHA256 관련 저작권·라이선스 고지가 포함되어 있음