Skopiuj całą hierarchię systemu plików z jednego dysku na drugi


95

Chciałbym skopiować całą hierarchię systemu plików z jednego dysku na drugi ... zawartość każdego katalogu, a także zwykłe pliki na platformie Linux. Byłbym wdzięczny, gdyby wiedział, jak to zrobić za pomocą wbudowanych funkcji Linuksa. System plików to rodzina ext.


1
Umm ... gdzie jest miłość dd? dd if=/dev/sda1 of=/dev/sdb1 bs=4096
juniorRubyist

@juniorRubyist +1 dla dd. Zawsze tego używam. Ale jakich flag użyć? Używam conv=notrunc,noerror,sync.
BeniBela

-1 z dd2 powodów: po pierwsze, złym pomysłem jest wykonanie kopii blokowej systemu plików, który jest zamontowany (co ma miejsce w przypadku /), a po drugie ddnie kopiuje danych ze źródeł zamontowanych w systemie plików, takich jak /booti /home.
Eric

Odpowiedzi:


33

Często używam

> cp -ax / /mnt

Zakładając, że / mnt jest nowym dyskiem zamontowanym na / mnt i nie ma innych montowań na /.

-x utrzymuje go w jednym systemie plików.

Oczywiście należy to zrobić jako root lub używając sudo.

Ten link ma kilka alternatyw, w tym powyższą

http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html


podczas gdy ten jest martwy stary odpowiedź jest nadal warto zauważyć, że zazwyczaj nie chcemy skopiować cały materiał przedstawić w /wyłączeniem czyli /dev, /sys, /procitd. W związku z tym, że przed wydaniem cpProponuję poszukiwania lepszych rozwiązań (również za pomocą rsync)
Marcin Orłowski

2
@MarcinOrlowski Użycie flagi WolfJM -xoznacza, że ​​wspomniane syntetyczne systemy plików nie zostaną skopiowane.
Jim L.

192

To, czego chcesz, to rsync .

Za pomocą tego polecenia można zsynchronizować folder, a także wznowić kopiowanie, gdy zostanie przerwane do połowy. Polecenie skopiowania jednego dysku to:

rsync -avxHAX --progress / /new-disk/

Dostępne są następujące opcje:

-a  : all files, with permissions, etc..
-v  : verbose, mention files
-x  : stay on one file system
-H  : preserve hard links (not included with -a)
-A  : preserve ACLs/permissions (not included with -a)
-X  : preserve extended attributes (not included with -a)

Aby poprawić szybkość kopiowania, dodaj -W( --whole-file), aby uniknąć obliczania różnic / różnic plików. Jest to ustawienie domyślne, gdy zarówno źródło, jak i miejsce docelowe są określone jako ścieżki lokalne, ponieważ prawdziwą zaletą algorytmu rsync delta-transfer jest zmniejszenie zużycia sieci.

Należy również rozważyć dodanie, --numeric-idsaby uniknąć mapowania wartości UID / GID według nazwy użytkownika / grupy.


1
Geniusz, dziękuję. Btw, skończyłem używać, rsync -avxHAWX --numeric-ids --progress / mnt/ale powinienem był to zrobić rsync -avxHAWX --numeric-ids --progress / mnt/ > ~/rsync.out. Podejrzewam, że nalewanie danych wyjściowych do terminala spowolniło proces. : D
Chris K

28
--info=progress2zamiast --progressjest przydatny przy dużych transferach, ponieważ daje ogólny postęp, zamiast (miliony linii dla) pojedynczych plików.
Florian

3
Musiałem wymienić Xi Az E, ponieważ rozszerzone atrybuty i ACL są objęte Ena moim mac. Testowane:rsync version 2.6.9 protocol version 29
Jonathan Komar

1
Oprócz > ~/rsync.out, 2> ~/rsync.errpozwoli zaoszczędzić jakieś błędy w oddzielnym pliku.
Aneel

2
Jeśli kopiujesz z innego folderu niż /, pamiętaj, że ukośnik końcowy (lub nie) w katalogu źródłowym robi różnicę: rsync source/ dest/kopiuje wszystko source/do wewnątrz dest/, a rsync source dest/kopiuje folder sourcei wszystko do wewnątrz dest/.
pół-zewnętrzny zewnętrzny

45

Odpowiedź Michaela Aarona Safyana nie uwzględnia rzadkich plików. -Sopcja naprawia to.

Również ten wariant nie spamuje przy każdym postępującym pliku i nie wykonuje synchronizacji delta, co zabija wydajność w przypadkach niesieciowych.

Idealny do kopiowania systemu plików z jednego dysku lokalnego na inny dysk lokalny.

rsync -axHAWXS --numeric-ids --info=progress2

1
Niesamowity. To naprawdę dobra robota
Gildas,

1
To powinna być zaakceptowana odpowiedź, działa świetnie. Przykład55,431,669,792 57% 97.47MB/s 0:06:56 xfr#2888, ir-chk=5593/8534)
Drew

1
<3 to jest idealne
Tim Strijdhorst

6

Dla jednej kopii lokalnej kopii z jednego dysku na drugi, myślę, że cp wystarczy, jak opisano powyżej Wolfmann.

W przypadku większych prac, takich jak na przykład lokalne lub zdalne kopie zapasowe, najlepszym rozwiązaniem jest rsync .

Oczywiście rsync jest znacznie bardziej skomplikowany w użyciu.

Dlaczego rsync:

  • pozwala to skopiować (synchronizowane kopiowanie) cały dysk A lub jego część na dysk B, z wieloma opcjami, takimi jak wykluczenie niektórych katalogów z kopii (na przykład wykluczenie / proc).

  • Inną dużą zaletą jest to, że to natywne narzędzie monitoruje przesyłanie plików: np. W przypadku dużych transferów, jeśli połączenie zostanie przerwane, będzie kontynuowane od punktu przerwania.

  • I wreszcie, rsync używa połączenia ssh, dzięki czemu można uzyskać zdalnie zsynchronizowane zabezpieczone „kopie”. Wystarczy popatrzeć na stronie człowieka , a także tutaj kilka przykładów .


4

Jak sugeruje powyżej Michael Safyan, wykorzystałem rsyncdo tego celu. Sugeruję użycie dodatkowych opcji, aby wykluczyć katalogi, których prawdopodobnie nie chcesz kopiować.

Ta wersja jest dość specyficzna dla systemów opartych na Gnome i Debian / Ubuntu, ponieważ zawiera podkatalogi katalogów domowych użytkowników, które są specyficzne dla Gnome, a także pamięć podręczną pakietów APT.

Ostatni wiersz wyklucza każdy katalog o nazwie cache / Cache / .cache, który może być zbyt agresywny dla niektórych zastosowań:

rsync -WavxHAX --delete-excluded --progress \
  /mnt/from/ /mnt/to/
  --exclude='/home/*/.gvfs' \
  --exclude='/home/*/.local/share/Trash' \
  --exclude='/var/run/*' \
  --exclude='/var/lock/*' \
  --exclude='/lib/modules/*/volatile/.mounted' \
  --exclude='/var/cache/apt/archives/*' \
  --exclude='/home/*/.mozilla/firefox/*/Cache' \
  --exclude='/home/*/.cache/chromium'
  --exclude='home/*/.thumbnails' \
  --exclude=.cache --exclude Cache --exclude cache

2

Dodanie dwóch użytecznych bitów do ponownej synchronizacji wątku: zmiana szyfru i użycie --update:

Zgodnie z postem Wolfmana, cp -axjest elegancki i fajny dla lokalnych rzeczy.

Jednak rsyncjest także niesamowity. W nawiązaniu do Michaela odpowiedzi re -W, zmieniając Cypher może również przyspieszyć (czytaj na wszelkie względy bezpieczeństwa, chociaż).

rsync --progress --rsh="ssh -c blowfish" / /mnt/dest -auvx

Istnieje kilka dyskusji (i benchmarki) wokół miejsca o powolnym procesora będącego faktycznym gardłem, ale wydaje mi pomóc, gdy maszyna jest załadowana się robi inne rzeczy współbieżnych.

Jednym z innych ważnych powodów używania rsync w tak dużej, rekurencyjnej kopii, jak ta, jest przełącznik -u (lub --update ). Jeśli podczas kopiowania wystąpi problem, możesz go naprawić, a rsync przejdzie do miejsca, w którym zostało przerwane (nie sądzę, że scp ma to). Robiąc to lokalnie, cp ma również przełącznik -u.

(Nie jestem pewien, jakie są implikacje --update i - cały plik razem, ale zawsze wydają się one działać rozsądnie dla mnie w tego rodzaju zadaniu)

Zdaję sobie sprawę, że nie jest to wątek na temat funkcji rsync, ale niektóre z najczęściej używanych do tego są:

  • --delete-after itp. (jak Michael wspomniał w dalszym ciągu), jeśli chcesz zsynchronizować nowy system z powrotem do pierwotnego miejsca lub czegoś takiego. I,
  • --exclude - do pomijania katalogów / plików, w przypadkach takich jak kopiowanie / tworzenie nowego systemu do nowego miejsca podczas pomijania katalogów domowych użytkowników itp. (albo montujesz domy skądinąd, albo tworzysz nowych użytkowników itp.).

Nawiasem mówiąc, jeśli kiedykolwiek muszę korzystać z systemu Windows, używam rsync z cygwina, aby robić duże rekurencyjne kopie, ponieważ odkrywca jest nieco oszołomiony, aby zacząć od początku (chociaż uważam, że Finder jest OS X jeszcze gorszy)


2

rsync

„To podejście jest uważane za lepsze niż klonowanie dysku za pomocą dd, ponieważ pozwala na użycie innego rozmiaru, tablicy partycji i systemu plików, a także lepsze niż kopiowanie za pomocą cp -a, ponieważ pozwala na większą kontrolę nad uprawnieniami do plików, atrybutami , Listy kontroli dostępu (ACL) i rozszerzone atrybuty. ”

Od:

https://wiki.archlinux.org/index.php/Full_system_backup_with_rsync

Strona man tutaj


2

Jak wspomniano w komentarzach juniorRubyist, preferowanym podejściem powinno być tutaj dd. Głównym powodem jest wydajność, jest to kopia blok po bloku zamiast pliku po pliku.

Klonowanie partycji

# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress

Klonowanie całego dysku

# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress

Bibliografia

  1. https://wiki.archlinux.org/index.php/disk_cloning

ddjest bardzo złym pomysłem z dwóch powodów: po pierwsze wykonanie kopii na poziomie bloku zamontowanego systemu plików (co ma miejsce /), najprawdopodobniej spowoduje błędy w docelowym systemie plików, a po drugie ddnie skopiuje danych ze źródeł zamontowanych w obrębie system plików jak /booti /home. Twój link dotyczy klonowania dysku, a nie klonowania „hierarchii plików”
Eric

1

„dd” jest niesamowite, ale ddrescue (apt install gddrescue) jest jeszcze lepszy. Jeśli dd zostanie przerwane, nie ma możliwości ponownego uruchomienia (kolejny dobry powód, aby użyć rsync). Gdy używasz ddrescue z plikiem dziennika, śledzi on, które bloki zostały skopiowane.

Podczas tworzenia kopii zapasowej systemu Windows / Linux z podwójnym uruchomieniem używam ntfsclone dla partycji Windows i ddrescue dla partycji Linux i dd dla MBR. (Nie próbowałem wykonać kopii zapasowej systemu podwójnego rozruchu przy użyciu GPT / UEFI.)

Chciałbym zobaczyć to narzędzie ddrescue, które może tworzyć pliki takie jak ntfsclone, w których nieprzydzielone miejsce jest oznaczone znakami kontrolnymi. To sprawia, że ​​obraz nie jest montowany bezpośrednio, ale pozwala, aby był tak duży jak zawarte w nim dane.

Niech ktoś zaproponuje „specjalny format obrazu” ntfsclone dla ddrescue ...


0

rsync jest idealnym rozwiązaniem, jak wyjaśniono powyżej.

Dodałbym tylko -Sdo „ wydajnej obsługi rzadkich plików ” w przypadku, gdy istnieje wolumin devicemapper dokera lub podobny do skopiowania.


0

Próbowałem zaproponowanych tutaj poleceń rsync, ale w końcu uzyskałem znacznie czystsze i szybsze wyniki partclone. Odmontuj partycje źródłowe i docelowe, a następnie uruchom następujące czynności:

partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
e2fsck -f /dev/sd(target)
resize2fs /dev/sd(target)

Wykonuje to następujące kroki:

  1. Klonuj (tylko używane części) partycji
  2. upewnij się, że system plików jest w porządku (resize2fs wymusza ten krok)
  3. zmień rozmiar partycji do nowego systemu plików

Powyższe działa w przypadku, gdy partycja docelowa jest tego samego rozmiaru lub większa niż źródło. Jeśli cel jest mniejszy niż źródło (ale pasuje do wszystkich danych), wykonaj następujące czynności:

e2fsck -f /dev/sd(target)
resize2fs -M /dev/sd(target)
partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
resize2fs /dev/sd(target)

resize2fs -M zmniejsza system plików do minimalnego rozmiaru przed klonowaniem danych.

Uwaga: partclonenie jest instalowana domyślnie w większości systemów. Użyj dystrybucji na żywo, takiej jak clonezilla, lub zainstaluj partclone ze swojego menedżera pakietów dystrybucyjnych ( apt-get install partclonena sytsemach opartych na Debianie).

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.