czy można użyć „dd” do sklonowania na mniejszy dysk twardy, wiedząc, że partycje będą wymagały edycji?


14

Użyłem dddo dysków klonów, takich jak ten:

 dd if=/dev/sdb of=/dev/sda bs=4096 conv=notrunc,noerror,sync

I zawsze działało dobrze. Wszystkie dokumenty na „dd” starają się przypomnieć, że dysk docelowy musi być tego samego rozmiaru lub większy niż źródło. Czy to absolutnie musi być prawda?

Teraz całkiem rozumiem, że jeśli sklonuję na mniejszy dysk, nie mogę oczekiwać, aby partycje, które są nawet częściowo poza granicami celu, pozostały nietknięte.

Jednak wiedząc doskonale, że będę musiał później edytować partycje na celu, usuwając te „poza granicami”, czy nadal będę mógł użyć „dd”, aby wykonać brutalną kopię źródła do granic fizyczny rozmiar celu? A może „dd” zredukuje cel do stosu wraków, gdy osiągnie granicę swojej wielkości ;-)

BTW, to badania, widziałem wartości zalecanych dla bs=wszystkiego z bs=1024poprzedzającym bs=32M, co naprawdę jest najlepszy?


Uwaga: jeśli przydatne jest dd obliczanie optymalnego rozmiaru bloku
Wilf

Odpowiedzi:


7

Dysk fizyczny nie powinien przynajmniej zacząć palić, ale są bardzo duże szanse, że twój system plików przestanie działać (mam na myśli docelowy system plików; jeśli właśnie skopiowałeś i nie dotknąłeś niczego w źródle, samo źródło powinno być w porządku ). Dane wewnątrz partycji niekoniecznie są przydzielane w kolejności rosnącej. Niektóre z nich mogą znajdować się na końcu partycji, nawet jeśli partycja nie jest pełna (tak naprawdę myślę, że dzieje się to deterministycznie w przypadku niektórych systemów plików, ale nie wiem wystarczająco dużo, aby uzyskać szczegółowe informacje). Dane tam mogą być niezbędne dla integralności systemu plików. Dlatego zdecydowanie odradzam poleganie na takiej kopii.

Jeśli chcesz wykonać tę kopię, musisz najpierw zmniejszyć partycję za pomocą jakiegoś narzędzia, które jest świadome swojej wewnętrznej struktury i jest w stanie zamapować wszystko w odpowiedniej kolejności na mniejszą partycję. Następnie możesz wykonać kopię. gpartedjest dobrym interfejsem GUI do robienia takich rzeczy.

Jeśli chodzi o tę bswartość, zwykle najlepszym pomysłem jest przeprowadzenie kilku testów przed rozpoczęciem prawdziwej kopii. Istnieje kilka narzędzi, które pomagają zautomatyzować tę kontrolę, ale nie pamiętam nazwy. Z mojego doświadczenia wynika, że ​​najlepszy zakres wynosi zwykle od 4 do 16 mln. Co więcej, nie zarabiasz już dużo. Ale to zależy od wielu rzeczy, w tym od samych dysków. Na przykład rzadko pracowałem z prawdziwymi dyskami wysokiej klasy, które mogą być odpowiednie dla wyższych wartości ze względu na większą prędkość i rozmiar pamięci podręcznej.

EDYCJA Jeśli partycja jest w całości skopiowana, możesz z niej korzystać bez problemów. Jednak, jak podkreślili inni, musisz także upewnić się, że tablica partycji jest nienaruszona (przynajmniej odpowiednie wpisy). Z czterema podstawowymi partycjami MBR nie ma problemów, ponieważ są one opisane w pierwszych 512 bajtach dysku. Partycje logiczne są opisane w całej partycji rozszerzonej, więc wpisy mogą zostać utracone (ale opisałyby partycje, które i tak zostałyby utracone). W przypadku GPT istnieje kopia tabeli partycji zarówno na początku, jak i na końcu dysku. Tracisz drugi, ale możesz go odbudować od pierwszego. Oczywiście wskazane jest, aby zrobić to jak najszybciej; inne odpowiedzi były bardziej precyzyjne.


Zobacz edytowane pytanie :)
Ray Andrews,

1
@rayandrews Nie jestem pewien, jakiej aktualizacji oczekujesz, ale w zasadzie ddkopiuje bajty. Rozpocznie się od bajtu 0 i będzie kontynuował kopiowanie, aż coś (w twoim przypadku, koniec nośnika w miejscu docelowym) go zatrzyma. To pozostawi Ci tabelę partycji, która określa dysk większy niż rzeczywistość i partycje poza dyskiem ... ale jeśli to naprawisz, powinno być w porządku. Chociaż prawdopodobnie łatwiej byłoby użyć dd na partycję do skopiowania danych. [To także pozostawi ci wszystkie normalne problemy z dd, takie jak zduplikowane UUID]
derobert

Podoba mi się to, że tworzy i opisuje partycje i systemy plików na bieżąco - bardzo oszczędza czas. Tuż o identyfikatorach UUID.
Ray Andrews

1
jak przywrócić drugą tabelę gpt?
user230910,

2

Chociaż na początku proponowane „wyzwanie” może wydawać się trudne, niewykonalne lub naiwne, jak niektórzy komentowali, tak nie jest. Główną ideą przy użyciu dd do migracji z większego dysku na mniejszy jest całkowicie w porządku i ma korzyści z migracji danych. Oczywiście niezbędne jest posiadanie wystarczającej ilości wolnego miejsca, aby zajmowane dane mieściły się na dysku docelowym.

Chodzi o to, aby pomyśleć o utworzeniu każdej partycji z osobna, a nie całego dysku naraz, jak pierwotnie zaproponowano. Jeszcze więcej można osiągnąć: partycje, które zostaną obcięte, można również bezpiecznie migrować za pomocą narzędzi do zmiany rozmiaru systemu plików. Rzeczywiście, tego rodzaju migracja jest interesująca, aby zachować matadane systemu plików i rozszerzone atrybuty plików, których nie można łatwo skopiować za pomocą narzędzi takich jak cp, rsync, pax, ... które działają w warstwie systemu plików, a nie blokują warstwy urządzenia. Użycie dd eliminuje potrzebę ponownej instalacji systemu operacyjnego lub konieczności ponownego oznakowania FS, aby uniknąć problemów z SELinux.

Poniżej znajduje się to, co zwykle robię, aby wykonać podobne zadania:

1) Najpierw zmniejsz system (-y) plików w partycjach, których dotyczy problem, które zostałyby obcięte. W tym celu skorzystaj z narzędzia resize2fs (zakładając, że mówimy o ext2 / ext3 / ext4 fs - inne współczesne FS również mają narzędzia zmiany rozmiaru do tego samego celu). Zauważ, że chociaż - z oczywistych powodów - system plików nie może być większy niż partycja, na której się on znajduje, może być bezpiecznie mniejszy. Sztuczka bezpieczeństwa polega na zmniejszeniu „więcej niż to konieczne”. Na przykład: wyobraź sobie, że masz system plików o pojemności 1 TB, który chcesz przenieść na dysk 500 Gig. W takim przypadku sugeruję zmniejszenie fs, powiedzmy, do 450 Gig (musisz mieć wystarczająco dużo wolnego miejsca na to oczywiście, tj. Aktualnie zajęte miejsce w tym systemie plików nie może przekroczyć 450 Gig). Pozornie zmarnowane 50 gigabajtów miejsca zostanie naprawione po migracji danych.

2) Podziel dysk docelowy na odpowiednią geometrię, biorąc pod uwagę ograniczenia przestrzeni;

3) dd dane za pomocą urządzeń partycji, a nie urządzenia dyskowego (tj. Użyj dd if=/dev/sda# of=/dev/sdb#dla każdej partycji zamiast używać if=/dev/sda of=/dev/sdb). UWAGA: sda i sdb tutaj są tylko przykładami; WAŻNA UWAGA: Kiedy dd'ing z większego na mniejsze urządzenie partycjonujące, dd będzie narzekać na próbę zapisu postu na końcu urządzenia blokowego, to w porządku, ponieważ dane systemu plików zostałyby całkowicie skopiowane przed osiągnięciem tego punktu. Aby uniknąć takiego komunikatu o błędzie, możesz określić rozmiar kopii za pomocą bs=i count=parametry, aby dopasować rozmiar skurczonego systemu plików, ale będzie to wymagało pewnych (prostych) obliczeń, ale jeśli zostanie wykonane nieprawidłowo, możesz zaryzykować dane.

4) Po dodaniu danych ponownie zmień rozmiar odpowiedniego systemu plików w docelowej partycji za pomocą resize2fs. Tym razem nie określaj nowego rozmiaru systemu plików. Po uruchomieniu bez specyfikacji rozmiaru resize2fs powiększa system plików, dzięki czemu zajmuje maksymalny dozwolony rozmiar, więc w tym przypadku system plików 450 Gig ponownie wzrośnie, aby zająć całą partycję 500 Gig i nie zostanie zmarnowany żaden bajt. (Podejście „zmniejsz więcej niż potrzeba” pozwala uniknąć przypadkowego nieprawidłowego określenia rozmiarów i zaryzykowania danych. Pamiętaj, że jednostki GB vs GiB mogą być trudne).

Uwaga na bardziej złożone operacje: jeśli masz menedżera rozruchu, który zamierzasz skopiować, co jest bardzo prawdopodobne, możesz dodać pierwsze kilka KB dysku za pomocą urządzenia dyskowego zamiast urządzeń partycjonujących (takich jak dd if=/dev/sda of=/dev/sdb bs=4096 count=5), a następnie ponownie skonfiguruj geometrię w / dev / sdb (która będzie tymczasowo zawierać nieprawidłową geometrię dla nowego dysku, ale nienaruszony i prawidłowy menedżer rozruchu). Na koniec kontynuuj korzystanie z urządzeń partycjonujących, jak opisano powyżej, do tworzenia partycji na raz. Robiłem takie operacje wiele razy. Całkiem niedawno z powodzeniem przeprowadziłem złożoną migrację podczas aktualizacji z dysku twardego zawierającego mieszankę instalacji MacOSX i Linux na mniejszy SDD w moim MacMini6,2. W tym przypadku musiałem uruchomić Linuksa z dysku zewnętrznego, uruchomiłem bootmanagera, uruchomiłem gdisk, aby naprawić GPT na nowym dysku, i na końcu wykonałem każdą partycję zawierającą tylko zmniejszone pliki. (Należy pamiętać, że schemat partycji GPT przechowuje dwie kopie tabeli partycji, jedną na początku, a drugą na końcu dysku. gdisk bardzo narzeka, ponieważ nie może znaleźć drugiej kopii PT i ponieważ partycje przekraczają rozmiar dysku, ale poprawnie rozwiązuje problem kopiowania PT po ponownym zdefiniowaniu geometrii dysku). To był o wiele bardziej skomplikowany przypadek, ale warto o nim wspomnieć, ponieważ pokazuje, że ten rodzaj operacji jest również całkowicie wykonalny.

Powodzenia! ... a co najważniejsze pamiętaj, aby wykonać kopię zapasową wszystkich ważnych danych przed tego rodzaju operacją. Błąd i na pewno możesz nieodwracalnie uszkodzić swoje dane.

Na wszelki wypadek nie podkreśliłem wystarczająco: wykonaj kopię zapasową danych przed migracją! :)


Bardzo dobre wytłumaczenie, dzięki!
nirvana-msu

1

Jeśli chcesz zmieścić samochód w korytarzu o 20 cm węższym niż samochód, a przecinasz lewe 20 cm samochodu, czy samochód będzie nadal działał? Prawdopodobnie nie.

Jeśli skopiujesz początek dysku na inny dysk i skrócisz kopię, ponieważ dysk docelowy jest mniejszy, wynik nie zadziała. Nawet jeśli będzie wystarczająca ilość miejsca, aby zmieścić wszystkie pliki na dysku docelowym, cięcie po N bajtach od początku dysku nie zapewni działającego systemu plików.

Jeśli dysk jest podzielony na partycje typu PC (GPT lub MBR), wszystkie partycje, które mieszczą się w całości na obiekcie docelowym, będą działać. Jest jeden wyjątek: w przypadku partycji MBR, jeśli partycje logiczne nie są ponumerowane w kolejności dysków, to gdy tylko łańcuch opuści obszar docelowy, partycje nie będą już wyświetlane. (Jeśli tego nie rozumiesz, to jeszcze jeden powód, aby nie robić częściowej kopii dysku.) Bardziej sensowne byłoby kopiowanie partycji, które chcesz zachować, zamiast kopiowania od początku i kończenia na tym, co pasuje. . Częściowo skopiowana partycja na końcu nie będzie użyteczna.

Jeśli dysk lub partycja częściowa jest woluminem fizycznym LVM i utworzysz częściową kopię tego woluminu fizycznego, nie możesz być pewien, czy uzyskasz przydatne wyniki z wyniku.

Jeśli chcesz skopiować tylko niektóre dane z dużego dysku na mniejszy dysk, utwórz partycje na mniejszym dysku. Jeśli chcesz skopiować partycję na partycję tego samego rozmiaru, możesz to zrobić za pomocą cat. Jeśli chcesz skopiować partycję na mniejszą partycję, utwórz system plików na partycji docelowej i wykonaj kopię na poziomie pliku za pomocą czegoś takiego jak cp -alub pax -rw -pe -t.

Możesz użyć ddzamiast, catjeśli jesteś masochistą. ddma dziwną składnię i jest zwykle wolniejszy niż,cat chyba że znajdziesz odpowiedni rozmiar bufora. Nie ma jednej optymalnej wartości rozmiaru bufora, zależy to od charakterystyki twojego sprzętu. Jeśli rozmiar jest zbyt mały, ddzmarnujesz czas na wiele drobnych transferów. Jeśli rozmiar jest zbyt duży, ddzmarnuje czas na pełne odczytanie jednego bufora przed rozpoczęciem zapisywania następnego. Optymalny rozmiar transferu z dysku na dysk to zwykle kilka megabajtów (1024 bajty są absurdalnie małe). catwybierze przyzwoity rozmiar bez wysiłku z twojej strony.


Tak, nie mam nic przeciwko utracie ostatnich partycji. Na wszystkich moich dyskach wszystkie ważne rzeczy zawsze mieszczą się w rozmiarze nawet najmniejszego z moich dysków. Poza tym partycje są zawsze nieistotne. Rzecz z „cat” polega na tym, że nie będzie tworzyć partycji ani MBR (chyba że się mylę)
Ray Andrews

@rayandrews Jeśli uruchomisz catna całym dysku, utworzy on te same partycje (z zastrzeżeniem dla partycji MBR, zobacz moją edycję). To samo dotyczy dd, używanie ddjest po prostu skomplikowanym sposobem cat. Jeśli działasz catna partycji, to oczywiście nie będzie ona tworzyć partycji; użyj do tego fdisk / gdisk / parted /…
Gilles 'SO - przestań być zły'

Bardzo interesujące. OK, pokaż mi przykładowe polecenie, a następnie wypróbuję je, a jeśli jest dobre, jest to najlepsze rozwiązanie.
Ray Andrews

@rayandrews Przykładowe polecenie, co zrobić?
Gilles „SO- przestań być zły”

Tylko przykładowe polecenie z użyciem „cat” do sklonowania dysku. Uczyń to nową odpowiedzią, abym mógł ją zaakceptować.
Ray Andrews,

0

Chciałbym podzielić się swoim doświadczeniem z tym tematem, jeśli okaże się to przydatne dla innego czytelnika. Ostatnio użyłem DDRESCUE do odzyskania pierwszej 1/3 partycji NTFS z uszkodzonego dysku twardego i z powodzeniem przebudowałem odzyskany segment partycji na mniejszy dysk twardy - ratując w ten sposób przechwycone pliki (i tracąc resztę). Oto kroki, które podjąłem (zdecydowanie podejście HACKSAW !!) ...

Źródłowy dysk twardy składał się z 750 GB sformatowanych w systemie plików NTFS z możliwością pliku MBR. Użyłem go tylko kilka razy, aby wykonać kopię zapasową plików, więc większość plików znajdowała się na początku dysku, około 160 GB. Członek rodziny zwalił dysk twardy (zamontowany zewnętrznie) na podłogę - potem już nigdy nie działał poprawnie! Korzystając z ddrescue (skrupulatnie) udało mi się odzyskać dużą część początku dysku. Z powodu uszkodzeń fizycznych bardzo często zamykał się w trakcie całego procesu ...

Miałem mały dysk twardy do laptopa o pojemności 150 GB (zamontowany zewnętrznie), do którego wyodrębniłem dane ddrescue bezpośrednio. Alternatywnie mogłem wyodrębnić dane do pliku obrazu, a później zamontować plik, jednak pomyślałem, że zapisanie danych bezpośrednio na dysku twardym może być prostsze.

Kluczową sztuczką w ratowaniu była ręczna edycja zarówno MBR, jak i danych sektora rozruchowego NTFS na ratunkowym dysku twardym. Bez tego dysk twardy nie jest rozpoznawany przez żaden system operacyjny. Nie byłem w stanie znaleźć odpowiedniego programu do Linuksa, aby to zrobić, więc zwróciłem się do systemu Windows. Istnieje przydatny pakiet o nazwie Narzędzia obsługi systemu Windows, który nie jest już obsługiwany, ale nadal jest użyteczny (patrz link poniżej)! Narzędziem, którego użyłem do edycji partycji, jest Disk Probe. Upewnij się, że znasz wartość końcową sektora twojego dysku twardego (użyłem fdisk -l w Ubuntu)

https://en.wikipedia.org/wiki/Windows_Support_Tools

Korzystając z dobrego kalkulatora i odrobiny kreatywności, załadowałem i zamontowałem dysk twardy w Disk Probe w systemie Windows i dokonałem edycji wartości sektorów końcowych. W MBR należało zmienić dwa zestawy wartości, a) a) sektor końcowy dysku twardego i b) sektor końcowy partycji NTFS. W sektorze rozruchowym NTFS wartość całkowitej liczby sektorów partycji musiała zostać zmieniona. W każdym przypadku wartość liczbowa była zmniejszana w celu dopasowania do zmniejszonego „wymiaru” mniejszego dysku twardego (sektory końcowe zmieniono z 750 GB na 150 GB). Kliknij kartę Widok, aby edytować te wartości.

Oto obraz Disk Probe w akcji edytują dane sektora rozruchowego NTFS Narzędzia obsługi systemu Windows - sonda dyskowa

Po edycji wyżej wymienionych pól system Windows rozpoznał partycję jako prawidłową, choć uszkodzoną. Wszedłem do wiersza poleceń i uruchomiłem program Windows Chkdsk na uszkodzonym dysku twardym (chdsk D :). Cieszyło mnie, że partycja powraca do życia, plik po pliku! Program odbudował tablicę partycji i pomyślnie mapował ponownie wszystkie pliki, które zostały skopiowane z uszkodzonego dysku twardego. Pliki, które były poza zasięgiem (nie zostały skopiowane), nie zostały znalezione i dlatego zostały wyeliminowane.

Następnej części nie rozumiem powodu, ponieważ system Windows pomyślnie odbudował dysk twardy o pojemności 150 GB z dołączonymi plikami. Niemniej jednak Windows natywnie nie był w stanie otworzyć partycji dysku twardego do przeglądania plików (wystąpił błąd). Jednak Ubuntu na ratunek! Uruchomiłem ponownie system Ubuntu, zamontowałem zewnętrzny dysk twardy i bez problemu wszystkie odzyskane pliki pojawiły się!

Mam nadzieję, że ta metoda odzyskiwania plików z dużego dysku twardego na mniejszy dysk twardy przyda się innej biednej duszy poza mną. Twoje zdrowie!


1
W tej odpowiedzi wyraźnie zastanawiasz się. Niestety tak naprawdę nie odpowiada na pytanie. „ ddrescuenie jest pochodną ddani nie jest ddw żaden sposób z tym związany, z wyjątkiem tego, że oba mogą być używane do kopiowania danych z jednego urządzenia na drugie. Różnica polega na tym, że ddrescue używa zaawansowanego algorytmu do kopiowania danych z uszkodzonych dysków, powodując, że są one tak małe uszkodzenia, jak to możliwe. ” - Wikipedia. Co więcej, twoja odpowiedź wydaje się być skoncentrowana głównie na środowisku operacyjnym Windows, co nie jest tutaj typową konfiguracją
Fox

1
Jako pierwotny pytający uważam jednak, że doświadczenie Dana jest najbardziej pomocne, dobrze jest wiedzieć, co można zrobić w rozpaczliwej sytuacji, choć oczywiście wiąże się to ściśle z tym konkretnym wątkiem, ale nie bądźmy zbyt surowi.
Ray Andrews,

0

Najpierw musisz zmniejszyć partycje w źródle (lub usunąć te poza granicami).
Następnie ddi prawdopodobnie będziesz musiał naprawić tabelę partycji za pomocą, gdisk /dev/sd<target>
a sekwencja klawiszy do naprawy tabeli jest v r d w
sugerowana, aby shring partycje nieco mniejsze niż potrzebne i po rozwinięciu ich z powrotem do pełnego rozmiaru dysku docelowego.
(Ta odpowiedź jest oparta na moich osobistych doświadczeniach podczas klonowania dysku twardego na mniejszy dysk SSD)


+1. Ta metoda też działa dla mnie: klonowanie działa, gdy wszystkie partycje mieszczą się w dysku docelowym :-) Tylko jeden komentarz: Musisz naprawić tabelę partycji kopii zapasowej tabeli partiiton GUID (GPT), ale jeśli jest stary MSDOS tablica partycji, nie ma zapasowej tabeli partycji do naprawy.
sudodus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.