Скопіюйте всю ієрархію файлової системи з одного диска на інший


95

Я хотів би скопіювати всю ієрархію файлової системи з одного диска на інший .. вміст кожного каталогу, а також звичайні файли на платформі Linux. Було б вдячно знати найкращий спосіб зробити це за допомогою можливо вбудованих функцій Linuxes. Файлова система - це сімейство ext.


1
Гм ... де любов dd? dd if=/dev/sda1 of=/dev/sdb1 bs=4096
молодшийРубіїст

@juniorRubyist +1 для дд. Я завжди цим користуюся. Але які прапори використовувати? Я використовую conv=notrunc,noerror,sync.
BeniBela

-1 з dd2 причин: по-перше, це погана ідея виконати блокову копію встановленої файлової системи (що має місце /), а по-друге dd, не копіювати дані з джерел, встановлених у файловій системі, як /bootі /home.
Ерік

Відповіді:


33

Я часто використовую

> cp -ax / /mnt

Презумпція / mnt - це новий диск, встановлений на / mnt, і немає інших кріплень на /.

-x зберігає його в одній файловій системі.

Це, звичайно, потрібно робити як root або використовуючи sudo.

Це посилання має деякі альтернативи, включаючи вищевказану

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


хоча це мертва стара відповідь, все-таки варто зауважити, що ви зазвичай НЕ хочете копіювати всі наявні матеріали /, виключаючи, тобто /dev, /sysі /procт. д. Тому перед тим, як видавати, cpя пропоную шукати кращі підходи (також використовуючи rsync)
Марцін Орловський,

2
Використання прапора @MarcinOrlowski WolfJM -xозначає, що синтетичні файлові системи, які ви згадуєте, не буде скопійовано.
Джим Л.

192

Те, що ви хочете, - rsync .

Ця команда може використовуватися для синхронізації папки, а також відновлення копіювання, коли вона перервана на півдорозі. Команда скопіювати один диск:

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

Варіанти:

-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)

Щоб підвищити швидкість копіювання, додайте -W( --whole-file), щоб уникнути обчислення дельта / різниці файлів. Це за замовчуванням, коли і джерело, і пункт призначення визначені як локальні шляхи, оскільки реальна користь алгоритму передачі дельта передачі rsync - зменшення використання мережі.

Також розглянути можливість додавання, --numeric-idsщоб уникнути відображення значень uid / gid за іменем користувача / групи.


1
Геній, дякую. До речі, я в кінцевому рахунку використовував, rsync -avxHAWX --numeric-ids --progress / mnt/але я повинен був це зробити rsync -avxHAWX --numeric-ids --progress / mnt/ > ~/rsync.out. Я підозрюю, що виливання виходу в термінал уповільнило процес. : D
Кріс К

28
--info=progress2замість --progressкорисний для великих передач, оскільки він дає загальний прогрес, а не (мільйони рядків для) окремих файлів.
Флоріан

3
Мені довелося замінити Xі Aна E, оскільки розширені атрибути та ACL охоплені Eмоїм mac. Тестовано:rsync version 2.6.9 protocol version 29
Джонатан Комар

1
Крім того > ~/rsync.out, 2> ~/rsync.errзбереже всі помилки в окремому файлі.
Анеель

2
Якщо ви копіюєте з якої - небудь інший папки , ніж /, зверніть увагу , що наявність слеша (чи ні) на вихідному каталозі робить різницю: rsync source/ dest/копіює все всередині , source/щоб dest/, в той час як rsync source dest/копіює папку sourceі все всередині в dest/.
напів зовнішній

45

Відповідь Майкла Аарона Саф'яна не враховує рідкісні файли. -Sваріант виправляє це.

Також цей варіант не спамує при прогресуванні кожного файлу і не робить дельта-синхронізацію, що вбиває продуктивність у немережевих випадках.

Ідеально підходить для копіювання файлової системи з одного локального диска на інший локальний диск.

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

1
Дивовижний. Це справді добре справляється
Gildas

1
Це має бути прийнята відповідь, чудово працює. Приклад55,431,669,792 57% 97.47MB/s 0:06:56 xfr#2888, ir-chk=5593/8534)
Дрю

1
<3 це ідеально
Тім Стрійдхорст

6

Для однієї зніманої локальної копії з одного диска на інший, я думаю, вистачить cp, як описано тут у Вольфмана.

Наприклад, для великих робіт, таких як локальні або віддалені резервні копії, найкращим є rsync .

Звичайно, rsync є значно складнішим у використанні.

Чому rsync:

  • це дозволяє копіювати (синхронізовану копію) весь або частину вашого диска A на диск B з багатьма параметрами, як-от виключення деяких каталогів із копії (наприклад, виключення / proc).

  • Ще одна велика перевага полягає в тому, що цей нативний інструмент контролює передачу файлів: наприклад, для масових передач, якщо з'єднання буде перервано, воно продовжиться з точки розриву.

  • І останнє, але не менш важливе, rsync використовує ssh-з'єднання, так що це дозволяє досягти віддалених синхронізованих захищених "копій". Перегляньте сторінку чоловіка , а також тут кілька прикладів .


4

Як Михайло Сафян пропонує вище, я використовував rsyncдля цієї мети. Я пропоную скористатися деякими додатковими параметрами, щоб виключити каталоги, які ви, мабуть, не хочете копіювати.

Ця версія досить специфічна для систем на базі Gnome та Debian / Ubuntu, оскільки включає в себе підкаталоги домашніх каталогів користувачів, специфічні для Gnome, а також кеш пакетів APT.

Останній рядок буде виключати будь-який каталог з назвою кеш / Кеш / .cache, який може бути занадто агресивним для деяких застосувань:

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

Додавання двох корисних бітів до потоку повторної синхронізації: зміна cypher та використання --update:

Відповідно до публікації Вольфмана, cp -axце елегантно та здорово для місцевих речей.

Однак, rsyncце також дивовижно. Відповідно до відповіді Майкла -W, зміна кофа може також прискорити роботу (хоча читайте про будь-які наслідки щодо безпеки).

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

Місцями є певна дискусія (і орієнтири) про те, що повільний процесор є фактичним вузьким місцем, але, здається, це допомагає мені, коли машина завантажується, роблячи інші одночасні речі.

Однією з інших великих причин використання rsync у великій, рекурсивній копії, як це, є через перемикач -u (або - update ). Якщо під час копіювання виникла проблема, ви можете її виправити, і rsync підбере там, де вона припинилася (я не думаю, що у scp цього є). Робити це локально, cp також має комутатор -u.

(Я не впевнений, які наслідки мають --update та --whole-файл разом, але вони, як видається, завжди спрацьовують для мене в цьому типі завдань)

Я усвідомлюю, що це не нитка про особливості rsync, але деякі з найбільш поширених для цього я використовую:

  • --delete-after тощо (як Михайло згадував у подальшій роботі), якщо ви хочете синхронізувати нову систему до початкового місця чи щось подібне. І,
  • --exclude - для пропускання каталогів / файлів, для таких випадків, як копіювання / створення нової системи на нове місце, одночасно пропускаючи домашні каталоги користувачів тощо (або ви монтуєте будинки з іншого місця, або створюєте нових користувачів тощо).

Між іншим, якщо мені колись доведеться використовувати Windows, я використовую rsync від cygwin, щоб робити великі рекурсивні копії, через те, що злегка мозок у дослідника хоче почати з самого початку (хоча мені здається, що Finder OS X ще гірший)


2

rsync

"Цей підхід вважається кращим, ніж клонування диска з dd, оскільки він дозволяє використовувати інший розмір, таблицю розділів і файлову систему, а також краще, ніж копіювати за допомогою cp -a, тому що він дозволяє більше контролювати дозволи файлів, атрибути , Списки контролю доступу (ACL) та розширені атрибути. "

Від:

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

Сторінка людини Тут


2

Як згадується в коментарях juniorRubyist, переважним підходом тут має бути використання dd. Основна причина - продуктивність, це копія по блоку замість файлу за файлом.

Клонування перегородки

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

Клонування всього диска

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

Список літератури

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

ddце дуже погана ідея з 2 причин: по-перше, виконання копіювання на рівні блоку встановленої файлової системи (як це стосується /) більш ніж ймовірно призведе до помилок цільової файлової системи, а по-друге dd, не буде копіювати дані з джерел, встановлених в межах файлова система, як /bootі /home. Ваше посилання дійсне для клонування дисків, а не клонування "ієрархії файлів"
Ерік

1

'dd' є дивним, але ddrescue (apt install gddrescue) ще кращий. Якщо DD перерветься, немає можливості перезапустити (ще одна вагома причина використовувати rsync). Коли ви використовуєте ddrescue з лог-файлом, він відстежує, які блоки були скопійовані.

Під час створення резервної копії подвійної завантажувальної системи Windows / Linux я використовую ntfsclone для розділів Windows та ddrescue для розділу Linux та dd для MBR. (Я не намагався створити резервну копію подвійної системи завантаження за допомогою GPT / UEFI.)

Що я хотів би побачити - це інструмент ddrescue, який може створювати такі файли, як ntfsclone, де нерозподілений простір позначений контрольними символами. Це робить зображення не монтується безпосередньо, але дозволяє воно бути таким же великим, як і містяться дані.

Хтось, будь ласка, придумав ntfsclone "спеціальний формат зображення" для ddrescue ...


0

rsync є ідеальним рішенням, як пояснено вище.

Я б просто додати -Sдо " ефективної обробки розріджених файлів " у випадку, якщо є копіювальний об'єм докерівного пристрою або подібний для копіювання.


0

Я спробував запропоновані тут команди rsync, але в підсумку я отримав набагато чистіші та швидші результати partclone. Відключіть джерело та цільові розділи та запустіть наступне:

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

Це виконує такі кроки:

  1. Клоніруйте (лише використані частини) розділу
  2. переконайтеся, що файлова система в порядку (resize2fs виконує цей крок)
  3. змінити розмір розділу до нової файлової системи

Вищезазначене працює в тому випадку, якщо цільовий розділ має той самий розмір або більше, ніж джерело. Якщо ваша ціль менша за вихідну (але відповідає всім даним), виконайте наступне:

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 скорочує файлову систему до мінімального розміру перед клонуванням даних.

Зауважте, що partcloneне встановлено за замовчуванням у більшості систем. Використовуйте дистрибутив в реальному часі, як клонезіла, або встановіть частину з вашого диспетчера пакетів дистрибутивів ( apt-get install partcloneна синтезованих на основі debian).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.