Sklonuj całą partycję lub dysk twardy do rzadkiego pliku

35

Lubię klonować całą partycję lub cały dysk twardy na większy dysk zewnętrzny, ale lubię tworzyć rzadkie pliki. Często używam dddo klonowania, ale nie obsługuje rzadkich plików. Jako obejście zastosowałem coś takiego:

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

Jest to jednak zbyt trudne dla mojego gustu i nie pozwala mi wznowić procesu, jeśli zostanie przerwane. Zabawne, że istnieje narzędzie NTFS do tego ( ntfsclone), ale nie ma takiego narzędzia dla rodzimych systemów plików Linux (EXT2-4).

Czy jest na to jakieś lepsze narzędzie, np. ddWariant z niewielkim wsparciem? Nie szukam prawnie zastrzeżonego oprogramowania do tworzenia kopii zapasowych dysków, ale po prostu chcę zrobić rzadką kopię do klonowania, którą w razie potrzeby mogę zamontować jako urządzenie pętlowe.

Martin Scharrer
źródło
7
+1 za twórcze użycie cp, nigdy nie przyszło mi do głowy, że możesz sparse-skopiować obraz dysku. Zawsze je tylko kompresowałem, gdy potrzebowałem oszczędzać miejsce. Dlaczego to pytanie nie jest odpowiedzią?
Caleb

Odpowiedzi:

21

Chcesz dd_rescue.

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw
Steven Pritchard
źródło
1
Świetny! Instrukcja mówi: „Jeśli proces kopiowania zostanie przerwany przez użytkownika, można później kontynuować w dowolnej pozycji”. i „-a zapisywanie pliku spArse (domyślnie = nie)”. Dokładnie to, czego chcę! Dzięki!
Martin Scharrer
3
Szukając dd_rescueonline dowiedziałem się, że istnieje również inne narzędzie o nazwie ddrescue(bez podkreślenia), które zostało opracowane niezależnie od, dd_rescueale wydaje się, że robi to w zasadzie to samo. Wspominam o tym tutaj jako o ogólnym FYI.
Martin Scharrer
Tak, dd_rescuei ddrescueto nie to samo. Teoretycznie wykonują tę samą pracę, ale ogólnie mam więcej szczęścia ze starszym / oryginalnym dd_rescue.
Steven Pritchard
1
Jeśli ktoś się zastanawia, możesz zatrzymać kopiowanie w dowolnym momencie za pomocą Ctrl-C. Pokaże ci twoją aktualną pozycję i możesz użyć tej wartości, aby zrestartować, dodając -si pozycję do pierwotnego polecenia. (Tak by to wyglądało dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw.)
Steven Pritchard,
1
@Steven Pritchard: Nie musisz pamiętać pozycji. Podaj trzecią nazwę pliku, która będzie plikiem dziennika, a po ponownym uruchomieniu odczyta ją i przejdzie do miejsca, w którym została przerwana.
Tanith Rosenbaum,
20

Tylko dla kompletności wezwanie do ratowania . --sparseLub -Sflag pozwala docelowy być napisany słabo:

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

Lub z długą opcją:

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

Lub jeśli wolisz MiB :

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

Aby umożliwić przerwanie i wznowienie ratowania, możesz również skorzystać z pliku dziennika:

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

Zauważ, że GNU ddrescuei dd_rescuesą różnymi programami. Ale GNU ddrescuewydaje się być bardziej rozpowszechnione. Na przykład jest już zapakowany w GRML .

maxschlepzig
źródło
Czy podczas przywracania konieczne jest specjalne traktowanie obrazu, czy możesz podać polecenie użyte do przywrócenia ddrescue?
użytkownik12439,
W teorii nośnik pamięci używasz na ratunek ma być bardziej niezawodne, dzięki czemu można zazwyczaj wystarczy użyć dd do zapisu na dysku zastępczego: dd if=sda1.raw of=/dev/sdb1. Aby jednak użyć narzędzia ddrescue do przywracania, wystarczy zmienić źródło / miejsce docelowe użyte do ratowania na nowe źródło / miejsce docelowe, najlepiej z nowym plikiem dziennika. Jeśli to możliwe (często nie), możesz oczywiście użyć narzędzia ddrescue, aby skopiować dane bezpośrednio z uszkodzonego dysku źródłowego na dysk zastępczy.
zaTricky
3

W 2007 r. Oferowana była łatka zapewniająca rzadką obsługę plików w GNU dd, ale wygląda na to, że nie została wprowadzona do coreutils (przynajmniej od wersji 8.4). Wątpię, czy dd zmieniło się zbytnio od tego czasu, łatka może zostać zastosowana do bieżącej wersji bez większego nakładu pracy.

Jestem również pod wielkim wrażeniem kreatywnego wykorzystania cptwojego pytania i dzięki temu mogłem użyć go do wznowienia (tutaj wznawianie od ~ 80M do źródła):

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

Edycja: podrap to. Drugim ddbyłoby oczywiście szukanie niewłaściwej pozycji w pliku wyjściowym, ponieważ nie jest on tej samej długości co plik wejściowy.

Eli Heady
źródło
1
Podobnie jak w przypadku odpowiedzi bhinesleya, najlepiej byłoby zapisać postępy dd w celu dokładnego wznowienia. Jeśli miałbyś zastosować to podejście zarówno dla pierwszego uruchomienia, jak i wznowienia, i rejestrować niezależnie oba równoległe dd, to możesz wiedzieć, jak daleko szukać. Jeśli będę miał czas, spróbuję to poprawić.
Eli Heady
2
Dzięki za link do łatki. Zaczynałem myśleć o samodzielnym programowaniu czegoś takiego :-) Nie można przesyłać rzadkich plików, aby kod nie działał.
Martin Scharrer
Tak, właśnie to odkryłem. No cóż, fajnie było znaleźć szalone nowe zastosowania cp- dzięki!
Eli Heady
1
dd commit at 2012: git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd: dodaj obsługę opcji conv = sparse" ("(iwrite): Konwertuje zapis bloku NUL na szukanie na żądanie. ”)
osgx
1

Właśnie dodając moje 2 centy. Innym sposobem utworzenia rzadkiego pliku z surowego dysku jest użycie qemu-img przy użyciu czegoś takiego:

qemu-img convert -f raw /dev/sda /tmp/sda.raw

Możesz użyć tego również na jednej partycji. Możesz także przekonwertować surowy dysk / partycję na dowolny inny format obsługiwany przez qemu-img (QCOW2, VHD [x], vmdk itp.)

Gabriel Samfira
źródło
1

Inną opcją jest rsync . Na przykład:

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

Wyjaśnienie:

  • -S/ --sparseaby pominąć rzadkie bloki podczas zapisu
  • -P/, --partial --progressaby pokazać postęp i zachować częściowo przesłane pliki
  • --copy-devices aby skopiować zawartość urządzenia

Możesz dodać, --appendaby wznowić przerwaną kopię (lub --append-verifypotwierdzić sumę kontrolną zarówno dla nowych, jak i starych danych).

Edycja : Właśnie zdałem sobie sprawę, że copy-devices.diff jest rozważane i może nie być obecny na wielu systemach (chociaż jest zawarty w Fedorze , Ubuntu , Debianie i innych)

Kevinoid
źródło
0

Uwaga: to nie działa z powodów opisanych w komentarzach, zostawiam to tutaj w celach informacyjnych.

Monitoruj statystyki dd przy użyciu kill -USR1:

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Wznów za pomocą przeskocz / szukaj:

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Bez $ i_bytes trudniej byłoby wznowić. Prawdopodobnie najłatwiej jest zapisać statystyki dd w pliku na wypadek awarii komputera lub czegoś innego.

Bhinesley
źródło
Drugi cppo prostu nadpisze istniejący plik, prawda? Znam skipi inne opcje dd. Problem jest cpczęścią.
Martin Scharrer
Hmm, tak, masz rację.
bhinesley
0

Istnieją xfsdump i xfsrestore dla XFS, który jest rodzimym systemem plików Linuksa od dłuższego czasu.

Cristian Ciupitu
źródło
0

Dlaczego nie po prostu:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
Zaz
źródło