2011-07-07 03:30:57 +0000 2011-07-07 03:30:57 +0000
100
100

Kopiowanie całej hierarchii systemu plików z jednego dysku na drugi

Chciałbym skopiować całą hierarchię systemu plików z jednego dysku na drugi…tj. zawartość każdego katalogu jak również zwykłych plików w platformie Linux. Byłbym wdzięczny za poznanie najlepszego sposobu na zrobienie tego przy użyciu prawdopodobnie wbudowanych funkcji Linuxa. System plików jest rodziną ext.

Odpowiedzi (11)

208
208
208
2011-07-07 03:36:43 +0000

To czego chcesz to rsync .

To polecenie może być użyte do synchronizacji folderu, a także do wznowienia kopiowania, gdy zostanie przerwane w połowie drogi. Polecenie kopiujące jeden dysk to:

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

Opcje to:

-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 deltas/diffs plików. Jest to wartość domyślna, gdy zarówno źródło jak i miejsce docelowe są określone jako ścieżki lokalne, ponieważ prawdziwą korzyścią z algorytmu delta-transferu rsync jest zmniejszenie użycia sieci.

Rozważ także dodanie --numeric-ids aby uniknąć mapowania wartości uid/gid przez nazwę użytkownika/grupy.

56
56
56
2017-03-05 10:42:04 +0000

Odpowiedź Michaela Aarona Safyana nie uwzględnia plików sparse. Opcja -S to naprawia.

Również ten wariant nie spamuje z każdym plikiem postępu i nie robi synchronizacji delta, która 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
35
35
35
2011-07-07 03:42:40 +0000

Często używam

> cp -ax / /mnt

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

-x utrzymuje go na jednym systemie plików.

To oczywiście musi być zrobione jako root lub przy użyciu sudo.

Ten link ma kilka alternatyw, w tym jedną powyżej http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html

6
6
6
2011-07-07 20:53:25 +0000

Dla jednorazowej lokalnej kopii z jednego dysku na drugi, myślę, że cp wystarczy, jak opisał Wolfmann tutaj powyżej.

Dla większych prac, takich jak lokalne lub zdalne kopie zapasowe, najlepszy jest rsync.

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

Dlaczego rsync :

  • pozwala na kopiowanie (kopia zsynchronizowana) całości lub części dysku A na dysk B, z wieloma opcjami, jak np. wykluczenie niektórych katalogów z kopii (np. wykluczenie /proc).

  • Kolejną dużą zaletą jest to, że to natywne narzędzie monitoruje transfer plików: np. dla masowych transferów, jeśli połączenie zostanie przerwane, będzie kontynuowane od punktu przerwania.

  • I na koniec, ale nie mniej ważne, rsync używa połączenia ssh, więc pozwala to na osiągnięcie zdalnej synchronizacji zabezpieczonych “kopii”. Zajrzyj do strony man jak również tutaj dla kilku przykładów .

5
5
5
2014-02-06 06:11:42 +0000

Jak Michael Safyan sugeruje powyżej, użyłem rsync do tego celu. Sugeruję użycie kilku 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, jak również pamięć podręczną pakietów APT.

Ostatnia linia wykluczy każdy katalog o nazwie cache/Cache/.cache, co może być zbyt agresywne 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
2
2
2012-03-19 23:53:05 +0000

Dodanie dwóch przydatnych elementów do wątku o rsync: zmiana szyfru i użycie --update:

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

Jednakże, rsync jest również świetne. W nawiązaniu do odpowiedzi Michaela dotyczącej -W, zmiana cypher może również przyspieszyć rzeczy (przeczytaj jednak o wszelkich implikacjach bezpieczeństwa).

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

There is some discussion (and benchmarks) around the place about a slow CPU being the actual bottleneck, but it does does seem to help me when machine is loaded up doing other concurrent things.

Jednym z innych ważnych powodów używania rsync w dużych, rekurencyjnych kopiach jak ta jest przełącznik -u (lub –update). Jeśli podczas kopiowania wystąpi jakiś problem, możesz go naprawić, a rsync podejmie pracę tam, gdzie ją zakończył (nie sądzę, żeby scp miał taką możliwość). Robiąc to lokalnie, cp ma również przełącznik -u.

(nie jestem pewien, jakie są implikacje –update i –whole-file razem, ale zawsze wydają się działać sensownie dla mnie w tego typu zadaniach)

Zdaję sobie sprawę, że to nie jest wątek o funkcjach rsync, ale niektóre z najczęstszych, których używam do tego celu to:

  • –delete-after etc (jak wspomniał Michael w kontynuacji), jeśli chcesz zsynchronizować nowy system z powrotem do oryginalnego miejsca lub czegoś w tym stylu. I,
  • –exclude - dla pomijania katalogów/plików, dla przypadków takich jak kopiowanie/tworzenie nowego systemu w nowe miejsce z pominięciem katalogów domowych użytkowników itp (albo montujesz katalogi domowe z innego miejsca, albo tworzysz nowych użytkowników itp).

Nawiasem mówiąc, jeśli kiedykolwiek będę musiał używać windows, używam rsync z cygwin do robienia dużych kopii rekurencyjnych, z powodu nieco bezmózgiej chęci explorera do zaczynania od początku (chociaż uważam, że Finder w OS X jest jeszcze gorszy)

2
2
2
2015-05-18 15:45:08 +0000

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, listami kontroli dostępu (ACL) i atrybutami rozszerzonymi.”

From: https://wiki.archlinux.org/index.php/Fullsystembackupzrsync

Man Page tutaj .

2
2
2
2018-06-14 17:30:20 +0000

Jak wspomniano w komentarzach juniorRubyist, preferowanym podejściem tutaj powinno być użycie dd. Głównym powodem jest wydajność, jest to kopiowanie blok po bloku, a nie plik 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

Referencje

  1. https://wiki.archlinux.org/index.php/disk_cloning
1
1
1
2019-01-27 21:53:49 +0000

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

Kiedy tworzę kopię zapasową systemu dual boot Windows/Linux, używam ntfsclone dla partycji Windows, ddrescue dla partycji Linux i dd dla MBR. (Nie próbowałem tworzyć kopii zapasowej systemu dual boot używając GPT/UEFI.)

Co chciałbym zobaczyć, to narzędzie ddrescue, które może tworzyć pliki jak ntfsclone, gdzie nieprzydzielone miejsce jest oznaczone znakami kontrolnymi. To sprawia, że obraz nie jest bezpośrednio montowalny, ale pozwala mu być tylko tak duży jak zawarte w nim dane.

Niech ktoś wymyśli “specjalny format obrazu” ntfsclone dla ddrescue…

1
1
1
2019-07-31 21:30:35 +0000

Próbowałem proponowanych tutaj komend rsync, ale ostatecznie uzyskałem znacznie czystsze i szybsze rezultaty z partclone . Odmontuj partycje źródłową i docelową, a następnie uruchom następujące polecenie:

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 czynności:

  1. sklonuj (tylko używane części) partycję
  2. upewnij się, że system plików jest o.k. (resize2fs wymusza ten krok)
  3. zmień rozmiar partycji na nowy system plików

Powyższe działa w przypadku, gdy partycja docelowa ma taki sam rozmiar lub większy niż źródłowa. Jeśli docelowa partycja jest mniejsza niż źródłowa (ale mieści wszystkie dane), 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 kurczy system plików do minimalnego rozmiaru przed klonowaniem danych.

Zauważ, że partclone nie jest domyślnie zainstalowany w większości systemów. Użyj live distro jak clonezilla lub zainstaluj partclone z menedżera pakietów twojej dystrybucji (apt-get install partclone na systemach opartych na debian).

0
0
0
2015-08-07 18:04:55 +0000

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

Dodałbym tylko -S do “handle sparse files efficiently” na wypadek, gdyby istniał wolumin docker devicemapper lub podobny, który ma zostać skopiowany.