Как скопировать всю корневую файловую систему Linux на новый жесткий диск с помощью ssh и tar

18

Мне нужно перенести всю корневую файловую систему Linux с неисправного жесткого диска на другой компьютер с открытым доступным разделом. Я уверен, что это включает в себя tarи ssh, но я не могу вспомнить, как именно это сделать.

Я, вероятно, представляю себе, используя live cd на новом / целевом хосте, чтобы запустить что-то вроде этого:

ssh user@failingharddrivehost "some tar command | piped into something else"

CHK
источник
не по теме. не вопрос программирования. но попробуйтеssh user@failingsys "tar cfz - /" > oldsys.tar.gz
Вы хотите позаботиться о том, чтобы вы не использовали tar / dev / (например, / dev / random, / dev / sdX, ...). То же самое / proc /
Hennes

Ответы:

19

Используйте rsync. С нового хоста вы можете использовать

rsync -avP --numeric-ids --exclude='/dev' --exclude='/proc' --exclude='/sys' root@failedharddrivehost:/ /path/to/destination/

Я не стал бы пытаться использовать что-то вроде tar, потому что это, вероятно, не будет работать, когда есть битые файлы

etagenklo
источник
Закончилось использованием rsync, как описано выше etagenklo и @Hennes. Миграция прошла хорошо. Просто нужно починить личинку, но это не должно быть слишком плохо.
ЧК
8
Я бы добавил -AHX в качестве флагов к rsync, чтобы сохранить acls, xattrs и жесткие ссылки, в результате чего получилась еще более точная копия оригинального fs.
Александр Ремеш
5
Я бы добавил -x, чтобы игнорировать элементы не в корневой файловой системе, тогда вы можете пропустить аргументы --exclude для различных путей.
Алекс
4

Если оба компьютера находятся в одной (безопасной) локальной сети, я рекомендую использовать другой подход netcat. Это обычно намного быстрее, так как не шифрует данные.

root@good_host$ cd good_partition; netcat -l -p 1234 | tar xvpmf -
root@bad_host$ tar -cv -f- --exclude=/proc --exclude=/sys / | netcat good_host.ip 1234

который открывает прослушивающий порт 1234 на хорошем компьютере netcat -l -p 1234и tarпередает входящие данные для извлечения (с сохранением mtime и разрешений). Плохой хост отправляет данные на этот порт, также используя tarи netcat. Я включил некоторые --excludeпараметры, так как /procи /sysявляюсь виртуальными файловыми системами и, следовательно, бесполезен на новом хосте. (особенно файл, представляющий вашу оперативную память в ( /proc/kcore) добавит ненужный объем данных).

Тем не менее, вы должны (также) рассмотреть возможность создания ddдампа разделов неисправного диска:

user@good_host$ cd good_partition; netcat -l -p 1234 > dump_of_bad_partition_1.dd
root@bad_host$ dd if=/dev/sda1 | netcat good_host.ip 1234

где вы должны были принять /dev/sda1правильное устройство. Сделайте то же самое с другими разделами на неисправном диске.

С этим дампом вы уверены, что не пропустили никаких важных метаданных (например, ACL), которые tarне будут записываться.

МРУ
источник
3

Почему вы сочетаете с каталогом, кроме? Не лучше ли смонтировать это устройство в другой каталог? современные ядра позволяют так. например, вы установили

/ dev / sda1 как / затем выполните: mkdir / CLEANROOT mount / dev / sda1 / CLEANROOT

после этого у вас есть: / dev / sda1 как / / dev / sda1 как / CLEANROOT

Это та же файловая система, видимая в двух местах, но / CLEANROOT не имеет аддитивного монтирования. Затем вы можете использовать tar или rsync / CLEANROOT без каких-либо исключений вместо копирования / с исключениями.

Конечно, вы должны скопировать другие разделы данных, когда у вас есть.

Копирование раздела - это первый шаг к восстановлению сервера. другой - восстановить загрузочные секторы, иначе система не загрузится с скопированного диска. Полезным является режим восстановления при загрузке с установочного / аварийного CD или pendrive.

Znik
источник
1

У вас есть физический доступ к отказавшему хосту?

Если вы это сделаете, то загрузитесь с live CD. Тогда используйте:

  • dump (сбросить / восстановить целые файловые системы, включая их разрешения).
  • Тар с / dev исключен. Вы можете совместить это с выводом на std_out и трубопроводов , что хотя Netcat
    исключающий синтаксис: tar --exclude='/dev'.
  • или rsync с тем же исключением. Например
    rsync -zvr --exclude /dev/ / destination_computer_name_or_ip
  • или используйте dd так:
    nc -l 4242 | gunzip | cat > my_full_disk_backup_of_PC_named_foo
    dd if=/dev/sda of=- bs=1M | gzip | nc -p 4242 name_of_the_destination

Если вы не можете загрузиться с живого компакт-диска, некоторые из приведенных выше решений останутся прежними, но:

  1. Некоторые файлы могут быть использованы / заблокированы.
  2. Убедитесь, что вы исключили не только / dev /, но и / proc /.
    Напримерtar --exclude='/dev' --exclude='/proc'
Hennes
источник
Да, у меня есть физический (и root) доступ к обоим хостам. Собираюсь попробовать с rsync. по неизвестной причине сбой netcat произошел из-за сбоя. целевая файловая система не хочет монтироваться. это терпит неудачу с: #mount /dev/sda1 /mnt/fedora mount: unknown filesystem type 'LVM2_member'
CHK
1

Вот описание того, как копировать файлы, используя tarи ssh. По сути, вы должны выполнить одно из следующих действий, в зависимости от того, хотите ли вы скопировать локальный -> удаленный или удаленный -> локальный:

tar cf - files... | ssh remotehost -c 'cd /destination && tar xvf -'

ssh remotehost -c 'cd /destination && tar cf - files' | tar xvf -
Kenster
источник
0

вы должны рассмотреть возможность использования rsync

следующая команда предполагает 2 вещи:

  1. вы находитесь в системе с неисправным жестким диском
  2. Новый раздел имеет минимальную установку Linux с включенным ssh.

rsync / new_partition:/wherever/you/want/

Примечание: конечный / важен, иначе ваши файлы окажутся на одном уровне каталогов выше

MelBurslan
источник
OP, вероятно, хочет использовать -aпараметр (и, возможно, -A), поскольку он сохраняет время, владельца, символические ссылки (и, возможно, ACL) и т. Д., А также -e sshпараметр, поскольку данные должны передаваться на другой компьютер. Итакrsync -aAv -e ssh root@failingharddrivehost:/ /good_computer/newpartition_mountpoint
mpy