Przejdź do treści

Partycja Linuksa (btrfs) z Windows — WinBtrfs

Ten dokument opisuje, jak przy dual boocie Windows + Linux dostać się z Windows do partycji Linuksa sformatowanej jako btrfs: najpierw tylko do odczytu, a opcjonalnie także z zapisem. Służy do tego sterownik WinBtrfs (Mark Harmstone). Opis powstał na wersji 1.10.

Skrypty, o których mowa niżej, leżą w repo w scripts/windows/winbtrfs/.

Znaczniki użyte w dokumencie

Znacznik Co to jest Skąd wziąć
<litera_btrfs> Litera dysku, którą Windows nada partycji btrfs Get-Volume \| Where-Object FileSystem -eq Btrfs po instalacji
<użytkownik_linux> Nazwa konta na Linuksie whoami na Linuksie
<UID> / <GID> Identyfikatory tego konta na Linuksie id na Linuksie albo <litera_btrfs>:\etc\passwd (u Fedory: <litera_btrfs>:\root\etc\passwd, bo / to subwolumin root)
<katalog_sterownika> Rozpakowane wydanie WinBtrfs, katalog z btrfs.inf archiwum z GitHub Releases

1. Wymagania i ryzyka

  • Partycja btrfs nie może być zaszyfrowana (LUKS). WinBtrfs czyta tylko surowy btrfs.
  • Subwoluminy są widoczne jako zwykłe katalogi. U Fedory / to root, a /home to home, więc katalog domowy będzie pod <litera_btrfs>:\home\<użytkownik_linux>\.
  • Tylko do odczytu jest bezpieczne. Zapis to sterownik spoza Microsoftu, pracujący na systemie plików Linuksa. Przed włączeniem zapisu zrób backup danych, które będziesz zmieniać z Windows.
  • Dual boot: oba systemy nie działają jednocześnie, więc nie ma ryzyka równoczesnego montażu. Jeśli Windows ma włączoną hibernację albo Fast Startup, zamknij go zwykłym „Uruchom ponownie”, a nie „Zamknij”. Sprawdzenie: powercfg /a.

2. Pobranie i weryfikacja sterownika

  1. Pobierz archiwum wydania z https://github.com/maharmstone/btrfs/releases i rozpakuj je.
  2. Sprawdź podpis plików sterownika:

    Get-AuthenticodeSignature <katalog_sterownika>\btrfs.cat, <katalog_sterownika>\amd64\btrfs.sys |
        Format-Table Status, SignerCertificate -AutoSize
    

    Oczekiwany Status to Valid, a wystawca to Mark Harmstone.

Dla wersji 1.10 archiwum btrfs-1.10.zip ma sha256 82303494b4fd4c23ad7c6fd69a886cb1a317a0293ee6e283b7c009117133b0c3 (Get-FileHash).

3. Instalacja tylko do odczytu

Uruchom jako administrator:

powershell -ExecutionPolicy Bypass -File scripts\windows\winbtrfs\install-winbtrfs-ro.ps1 `
    -DriverDir <katalog_sterownika>

Skrypt najpierw ustawia Readonly=1 w kluczu usługi HKLM\SYSTEM\CurrentControlSet\Services\btrfs, a dopiero potem instaluje sterownik (pnputil /add-driver … /install). Dzięki tej kolejności już pierwszy montaż jest tylko do odczytu.

Restart zwykle nie jest potrzebny, bo partycja dostaje literę od razu. Sprawdzenie:

Get-Volume | Where-Object FileSystem -eq Btrfs
Get-ChildItem <litera_btrfs>:\home

4. Włączenie zapisu (opcjonalnie)

Pliki zapisane z Windows muszą trafić na Linuksie do właściwego konta. WinBtrfs tłumaczy identyfikatory Windows (SID) na linuksowe UID/GID według dwóch kluczy rejestru:

Klucz pod …\Services\btrfs Mapuje Wartość
Mappings SID → UID (właściciel pliku) DWORD = <UID>
GroupMappings SID → GID (grupa pliku) DWORD = <GID>

Mapować trzeba więcej niż jeden SID. Obie poniższe pułapki zostały sprawdzone w praktyce:

  • Właściciel przy podniesionych uprawnieniach. Proces uruchomiony „jako administrator” (UAC) tworzy pliki jako BUILTIN\Administrators (S-1-5-32-544), a nie jako konto użytkownika. Bez mapowania tego SID-u pliki z takiego terminala dostaną na Linuksie obcego właściciela.
  • Grupa podstawowa to często samo konto, a nie „None”. Grupą pliku zostaje grupa podstawowa z tokenu procesu. Przy kontach lokalnych powiązanych z kontem Microsoft jest nią zwykle SID samego konta, a nie …-513 („None”). Bez mapowania plik dostaje domyślny GID 100 (users) z fabrycznego wpisu WinBtrfs (S-1-5-32-545 → 100).

Skrypt enable-winbtrfs-rw.ps1 sam odczytuje SID konta i grupę podstawową z tokenu. Mapuje konto, BUILTIN\Administrators, grupę podstawową i „None”, po czym ustawia Readonly=0. Uruchom go jako administrator z konta, które będzie pracować na partycji:

powershell -ExecutionPolicy Bypass -File scripts\windows\winbtrfs\enable-winbtrfs-rw.ps1 `
    -Uid <UID> -Gid <GID>

Jeśli UAC prosi o hasło innego konta administratora, skrypt widzi tamto konto. Wtedy podaj SID właściwego konta ręcznie przez -UserSid (odczyt: whoami /user z tego konta).

Zmiany w rejestrze zadziałają po zwykłym restarcie Windows. Zobacz też punkt 6.

5. Czego z Windows nie da się ustawić

Co Dlaczego Naprawa po stronie Linuksa
Etykiety SELinux WinBtrfs obsługuje tylko xattry security.NTACL (windowsowy ACL) i user.*. security.selinux jest poza zasięgiem, więc plik z Windows ma na Linuksie typ unlabeled_t. restorecon -R <katalog> na katalogach zmienianych z Windows
Prawa POSIX Modele uprawnień Windows i POSIX są zbyt różne. WinBtrfs nie ma opcji umask ani mode. Nowe pliki dostają 0600. W razie potrzeby chmod

Na systemach bez SELinux (Debian, Ubuntu, Arch) pierwszy wiersz nie dotyczy.

6. ⚠ Nigdy nie przemontowuj partycji w locie

Nie używaj fsutil volume dismount <litera_btrfs>: ani mountvol /p jako zamiennika restartu. Odmontowanie się udaje, ale ponowny montaż przy pierwszym dostępie do partycji kończy się BSOD-em:

SYSTEM_SERVICE_EXCEPTION (3b), c0000005
nt!ObQueryNameStringMode+0x9d
  ← FLTMGR!FltpGetObjectName ← FLTMGR!FltpFsControlMountVolume ← nt!IopMountVolume

Analiza zrzutu pokazuje, że Filter Manager przy montażu pyta o nazwę obiektu urządzenia woluminu btrfs i dostaje pusty wskaźnik. Dane na btrfs nie są uszkodzone, bo awaria następuje przy montażu, a nie przy zapisie. Każdą zmianę w rejestrze btrfs włączaj zwykłym restartem.

7. Weryfikacja

Na Windows, ze zwykłego terminala, a potem z terminala administratora:

Set-Content <litera_btrfs>:\home\<użytkownik_linux>\winbtrfs-test.txt "test z Windows"
Get-Content <litera_btrfs>:\home\<użytkownik_linux>\winbtrfs-test.txt

Na Linuksie:

ls -ln ~/winbtrfs-test.txt                # oczekiwane: <UID> <GID>
ls -Z  ~/winbtrfs-test.txt                # na SELinux: unlabeled_t, aż do restorecon
getfattr -d -m - ~/winbtrfs-test.txt      # security.NTACL dopisany przez WinBtrfs
sudo btrfs device stats /                 # wszystkie liczniki = 0
rm ~/winbtrfs-test.txt

8. Powrót do trybu tylko do odczytu albo odinstalowanie

  • Tylko do odczytu: ustaw Readonly=1 w HKLM\SYSTEM\CurrentControlSet\Services\btrfs i zrestartuj Windows.
  • Odinstalowanie: pnputil /enum-drivers → odszukaj wpis z btrfs.inf (np. oem42.inf) → pnputil /delete-driver oem42.inf /uninstall jako administrator, potem restart.