Jak zamontować zewnętrzny system plików ZFS bez blokowania / zmiany obecnego lub zewnętrznego systemu plików

11

Używam FreeBSD 10.2, używając ZFS na root jako system plików (zroot01) . Mam zewnętrzny dysk twardy z systemem plików ZFS z innego systemu FreeBSD 10.2 (zroot02), który chcę tymczasowo zamontować, tylko do odczytu, aby móc z niego usunąć niektóre pliki, a następnie odłączyć je. I nie chcą zewnętrzny system ZFS clobber lub wymienić mój obecny system plików, ani nie chcę dane na zewnętrznym zostać uszkodzony / albo zmienione.

Aby zademonstrować, co próbuję osiągnąć, gdybym używał UFS, zrobiłbym coś takiego:

mount -t ufs -o ro /dev/ada0s2 /mnt/my-fun-mountpoint

... gdzie /dev/ada0s2jest partycja na moim dysku zewnętrznym i /mnt/my-fun-mountpointznajduje się w /mntkatalogu mojego istniejącego systemu operacyjnego.

Całe wyszukiwanie i czytanie strony podręcznika nie zapewniło krystalicznie czystej metody. Odpowiedzi, które znalazłem, doprowadziły do ​​przejęcia mojego obecnego systemu plików i uszkodzenia go nie do naprawienia - oczywiście nie takiego rezultatu, którego szukam. Próbowałem tego jakiś czas temu, więc niestety nie pamiętam, które polecenia wypróbowałem.

Czy możesz podać jakieś jasne wskazówki, jak to zrobić? Z góry dziękuję za pomoc.

Czy B.
źródło

Odpowiedzi:

13

Cóż, to naprawdę zależy od tego, jak chcesz, aby pula była tylko do odczytu. I nie, to nie żart.

Najpierw trochę terminologii: w ZFS importujesz pulę i opcjonalnie montujesz w niej (dowolne) systemy plików. Można importować basen bez montowania żadnych systemów plików przekazując -Ndo zpool import, a następnie później zamontować dowolne systemy plików użyciu zfs mount. (Jest to całkowicie poprawny scenariusz, jeśli na przykład chcesz uzyskać dostęp tylko do jednego systemu plików spośród wielu lub jeśli chcesz zrobić coś przypominającego szorowanie puli w trybie offline.)

ZFS nie jest wielkim fanem dostępu tylko do odczytu. Na przykład, jeśli ZFS wykryje błąd, który jest w stanie naprawić, uważam, że naprawi błąd i zapisze naprawione dane na dysku, nawet jeśli zaimportujesz pulę jako tylko do odczytu. Rozumiem, że w systemie ZFS „tylko do odczytu” dotyczy tylko widocznego dla użytkownika stanu puli i jej zestawów danych. Jeśli z drugiej strony utworzysz kopię binarną dysku do pliku (lub zestawu plików), sprawisz, że te pliki będą naprawdę tylko do odczytu i spróbujesz zaimportować stamtąd stamtąd, ZFS nie będzie mógł zaimportować gromadzić w ogóle, bez względu na to, jak bardzo się starasz. Jeśli sprawisz, że pliki będą zapisywane, będzie działać poprawnie. (Właściwie próbowałem tego zaledwie kilka tygodni temu, chociaż używając Zvola, a ZFS gwałtownie odmówiłaby zaimportować pulę. Kiedy ustawiłem zvol na odczyt / zapis zamiast tylko do odczytu, pula zaimportowała się dobrze.) Inne systemy plików, takie jak (w Linuksie) ext4 i prawdopodobnie inne poradzą sobie z tą sytuacją nieco wdzięcznie, ale ZFS się zawiesza.

Jeśli masz pecha i nie masz zainstalowanej pamięci ECC RAM w systemie, w którym importujesz pulę, wówczas próba naprawienia napotkanych błędów przez ZFS może pogorszyć sytuację , choć opinie różnią się, czy jest to realne ryzyko w praktyce. Osobiście jestem zdania, że ​​wszelkie dane, na których mi zależy, do ochrony za pomocą ZFS i migawek oraz nadmiarowości i kopii zapasowych na poziomie pamięci masowej i kopii zapasowych, a także zasługuje na ochronę oferowaną przez pamięć RAM ECC, ale wiele komputerów nie ma pamięci ECC RAM.

Tak, można importować z basenu w trybie tylko do odczytu, ze szczególnym alternatywnym korzenia, aby zapobiec jego natrafienia na coś innego palce, ale trzeba mieć świadomość, że niekoniecznie jest to naprawdę tylko do odczytu w sensie kryminalistycznych. (Zapewni to jednak, że nie zmienisz przypadkowo niczego w puli.) Aby wykonać import tylko do odczytu, zakładając, że pula jest nazwana tanki węzły urządzenia są dostępne /dev, należy użyj polecenia takiego jak:

# zpool import tank -d /dev -o readonly=on -R /mnt/someplace

Spowoduje to wyszukanie /devwszystkiego, co zawiera pulę ZFS o nazwie tank, zaimportuje ją, tymczasowo ustawi właściwość puli readonlyna on(co oznacza, że ​​wszystkie zapisy zainicjowane przez użytkownika zostaną odrzucone) i tymczasowo ustawi jej altrootwłaściwość na /mnt/someplace. (Te wartości właściwości są „tymczasowe” w tym sensie, że nie są utrwalane na dyskach jako bieżące wartości właściwości, więc jeśli eksportujesz i ponownie importujesz pulę bez nich, wartości wrócą do normy. Mogą one być może zostaną zapisane w historii puli, którą można importować po zaimportowaniu pulizpool history tank jeśli masz na to ochotę.) Po zaimportowaniu puli zobaczysz swoje pliki w / mnt / someplace i będziesz mieć do nich normalny dostęp tylko do odczytu, w tym wszelkie migawki, które zostały już utworzone w zestawach danych w puli.

Biorąc pod uwagę twój przykład, podejrzewam, że użyłbyś czegoś podobnego do:

# zpool import zroot02 -d /dev -o readonly=on -R /mnt/my-fun-mountpoint

Po zakończeniu pamiętaj o czystym wyeksportowaniu puli:

# zpool export tank

a może

# zpool export zroot02

Spowoduje to odmontowanie wszystkich systemów plików i innych zestawów danych w puli, opróżnienie wszystkich buforów (w zakresie, w jakim przede wszystkim należy opróżnić), oznaczenie puli jako niezaimportowanej na wszystkich urządzeniach składowych i wykonanie innych niezbędnych zadań porządkowych w celu zapewnienia że pulę można bezpiecznie przenieść do innego systemu i zaimportować tam później.

CVn
źródło
1
Jeśli naprawdę jesteś pewien, że to, co podałeś w trzecim akapicie, jest poprawne, byłby to błąd w implementacji BSD ZFS. Import tylko do odczytu puli ZFS został zaprojektowany tak, aby był naprawdę tylko do odczytu, tzn. Nigdy nie próbuje zapisywać ani naprawiać żadnych danych ani metadanych, w tym historii puli. Zobacz arc.stillopensolaris.org/txt/PSARC_2010_306.txt
jlliagre
1
@jlliagre Jestem całkiem pewien, ale mogło to mieć miejsce w kontekście innej implementacji ZFS. Nie do końca rozumiem, dlaczego różnią się tak fundamentalnym aspektem; Wierzę, że wszystkie implementacje ZFS typu open source dzielą znaczną ilość kodu, który śledzi jego rodowód z powrotem do Sun. Mogę po prostu skonfigurować do tego jakieś środowisko testowe i szturchać go kijem, a potem zobaczyć, co się stanie, ale minie trochę czasu, zanim będę mógł poświęcić czas na to.
CVn