Chcę celowo uszkodzić plik, aby przetestować twierdzenia, że btrfs może się wyleczyć . Artykuł mówi o zdjęciu systemu plików, uszkodzeniu zdjęcia poprzez „odwrócenie” go i ponowne zamontowanie. W starszych systemach plików byłoby to po prostu uszkodzone, ale powinno naprawić się w btrfs. Teoretycznie ma to sens, ale naprawdę chcę to przetestować.
Problem polega na tym, że artykuł nie wyjaśnia, jak to zrobić.
Jak mógłbym zmienić pojedynczy bit w bardzo określonej części systemu plików?
Powinienem również zaznaczyć, że należy to zrobić w systemie plików offline, aby btrfs nie widział mojego zapisu jako celowego.
Edycja: Podczas gdy pytanie (i dyskusja) dużo mówi o btrfs, chciałbym wiedzieć, czy istnieją niezależne od systemu plików metody implementacji tego rodzaju uszkodzenia (aby można je było porównać z różnymi typami RAID / kontrolerów / itp.).
źródło
filefrag -v
aby dowiedzieć się, gdzie dokładnie znajduje się plik.Odpowiedzi:
Nie jestem ekspertem, ale
btrfs-progs
pakiet faktycznie zawiera narzędzie specjalnie do tego celu, chociaż być może będziesz musiał zbudować ze źródła. W każdym razie, po zainstalowaniu lub zbudowaniubtrfs-progs
, powinieneś być w stanie użyć narzędziabtrfs-corrupt-block
, które jest używane przez programistów btrfs do testowania systemu plików.Teraz, jak powiedziałem, nie miałem dużo czasu na zabawę z btrfs, więc nie znam dokładnego użycia tego narzędzia. Ale dzięki niemu powinieneś być w stanie uszkodzić system plików offline, który zostanie naprawiony, gdy uszkodzony plik zostanie odczytany (zakładając, że skonfigurowałeś RAID lub coś takiego, aby była inna kopia do użycia).
źródło
btrfs-corrupt-block
tak naprawdę został napisany jako prawdziwy test, a nie „sztuczka” deweloperów btrfs, powinno to dokładnie pasować do rachunku.btrfs-corrupt-block
jest używany przez programistów, więc nie byłby bardzo użyteczny, gdyby to była sztuczka :)btrfs-corrupt-block
nie jest to szczery test, ponieważ ktoś bardzo szybko odkryje to źródło i użyje go jako negatywnego PR przeciwko Oracle (przynajmniej; jak również innym programistom / współpracownikom btrfs). To był zwykły komentarz.Uzyskaj wartość pojedynczego sektora na urządzeniu blokowym (np.
/dev/sda1
) Z przesunięciem o 1 milion przesunięć sektorów (tylko przykład):To dowolnie wybrane przesunięcie 1M * 512 bajtów ma na celu upewnienie się, że nie znajdujesz się w części systemu plików metadanych, a faktycznie w sektorze, który zawiera dane.
Edytuj surowe dane sektora, zmieniając treść za pomocą edytora szesnastkowego. Zobacz na przykład Potrzebujesz dobrego edytora szesnastkowego dla systemu Linux .
Umieść sektor na dysku z odwróconymi argumentami
if
iof
:źródło
@Oli - cześć, jestem Jim Salter, facet, który napisał ten artykuł. Pracowałem z maszyną wirtualną, co upraszczało sprawę. Zacząłem od pliku JPEG i otworzyłem go w edytorze szesnastkowym. Tym, którego użyłem, był Bless, który możesz zainstalować w Ubuntu za pomocą zwykłego blessa instalacyjnego apt-get .
Po otwarciu pliku JPEG w programie Bless kilka razy przewróciłem stronę w dół, aby dobrze zagłębić się w „mięso” pliku JPEG, a następnie podświetliłem dane o wartości około pięćdziesięciu bajtów, skopiowałem je i wkleiłem w edytorze tekstu (w moim sprawa, gEdit). To dało mi coś do wyszukiwania.
Teraz zapisałem JPEG w każdej tablicy na maszynie wirtualnej. Za tablicami znajdowała się seria plików .qcow2. Kiedy już zapisałem JPEG w tablicach, mogłem załadować pliki .qcow2 związane z każdą tablicą do Bless i przeszukać je - nie były bardzo duże, nie były niczym innym jak JPEG i metadanymi - dla tego pięćdziesięciobajtowego wzorca Podkreśliłem i skopiowałem z JPEG. Voila, miałem blok do zepsucia! W tym momencie mogłem po prostu ręcznie edytować poszczególne bajty JPEG zapisane na dysku wirtualnym maszyny wirtualnej za pomocą Bless - i, co ważne, zrobić to w dokładnie taki sam sposób dla każdej tablicy.
Jedynym zmarszczeniem jest to, że w przypadku testowanej w artykule macierzy RAID5 musiałem upewnić się, że edytowałem rzeczywistą kopię danych w pasku, a nie parzystość dla samego paska - był to mały obraz na w przeciwnym razie pusta tablica, więc w bloku FOLLOWING w pasku nie było żadnych danych, dzięki czemu blok parzystości zawiera dane niezmienione z bloku danych. Gdybym przypadkowo edytował blok parzystości zamiast bloku danych, obraz byłby wyświetlany jako niezmieniony.
Ostatnia uwaga - nie potrzebujesz do tego maszyn wirtualnych - możesz robić te same rzeczy w ten sam sposób z gołym metalem; byłoby to bardziej kłopotliwe w tyłku, ponieważ musiałbyś pracować z całymi surowymi dyskami zamiast z ładnymi małymi plikami .qcow2, i musiałbyś albo wyciągnąć dyski i umieścić je na innej maszynie, lub uruchom się w środowisku na żywo (lub po prostu innym), aby z nimi zadzierać. (Testowałem uzdrawianie danych ZFS właśnie w ten sposób, ale na prawdziwych maszynach bez systemu metalowego, 7 lat temu, kiedy po raz pierwszy zainteresowałem się systemami plików nowej generacji.)
Mam nadzieję że to pomoże!
źródło
Możesz wypróbować mały program, który będzie działał na otwartym pliku.
FIBMAP
ioctl(2)
Dzięki szybkiemu wyszukiwaniu w Internecie znalazłem ten post na blogu http://smackerelofopinion.blogspot.tw/2009/06/fibmap-ioctl-file-system-block-number.html szczegółowo opisujący, jak to zrobić - poda nawet link do przykładowego programu, który możesz samodzielnie skompilować i uruchomić.
Dokładnie tak
hdparm --fibmap
jest zaimplementowany (wspomniany przez @falconer).Po znalezieniu numerów bloków możesz użyć
dd
gongfu do modyfikacji pliku, na przykład naszkicowany @gertvdijk. A może możesz po prostu zmodyfikowaćfibmap.c
powyższy program, aby wykonać bit flip dla siebie, bezpośrednio zapisując do pliku urządzenia z pominięciem warstwy systemu plików (trzy parametry dla programu: 1. ścieżka do pliku, 2. plik urządzenia zawierający plik system, 3. offset i bit, który chcesz zmodyfikować).( Oświadczenie: Nie testowałem i nie mogę zagwarantować, że
FIBMAP
ioctl(2)
będzie działał dla pliku w urządzeniu z pętlą zwrotną lub w systemie plików btrfs, ale zdecydowanie bym się tego spodziewał. Zgaduję,hdparm
że sprawdzę typ urządzenia przed wykonaniemioctl(2)
pliku i dlatego jest w braku.)źródło
poda LBA, w których znajduje się plik. Następnie możesz użyć odpowiedzi @gertvdijk.
źródło
0,39: device not found in /dev
albo dlatego, że jest to btrfs, albo (bardziej prawdopodobne), ponieważ używam go do plików przechowywanych w pętli zwrotnej. Spróbuję to zrobić z „właściwą” maszyną wirtualną.hdparm
działa na każdym systemie plików, ale może tak nie jest.