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

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

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

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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

Если оба компьютера находятся в одной (безопасной) локальной сети, я рекомендую использовать другой подход 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 не захватит

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

Если вы это сделаете, то загрузитесь с 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'

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

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

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

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

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

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

rsync / new_partition:/wherever/you/want/

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

Другие вопросы по тегам