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
/toroot, a/hometohome, 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
- Pobierz archiwum wydania z https://github.com/maharmstone/btrfs/releases i rozpakuj je.
-
Sprawdź podpis plików sterownika:
Get-AuthenticodeSignature <katalog_sterownika>\btrfs.cat, <katalog_sterownika>\amd64\btrfs.sys | Format-Table Status, SignerCertificate -AutoSizeOczekiwany
StatustoValid, 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:
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=1wHKLM\SYSTEM\CurrentControlSet\Services\btrfsi zrestartuj Windows. - Odinstalowanie:
pnputil /enum-drivers→ odszukaj wpis zbtrfs.inf(np.oem42.inf) →pnputil /delete-driver oem42.inf /uninstalljako administrator, potem restart.