Как клонировать локальный диск (например, / dev / sda) в NAS через сеть

0

У меня есть диск (A) (жесткий диск SATA 2 ТБ 3.5), и у меня есть NAS D-Link DNS-320L (с точной моделью жесткого диска SATA 2 ТБ 3.5). Оба подключены к роутеру (локальной сети) 192.168.1.3и 192.168.1.2соответственно.

Как я могу клонировать диск A ( /dev/sda) на моем NAS ( //192.168.1.2/disk) с dd?

Гипотетический пример (это не работает):

sudo dd if=/dev/sda |pv|dd of=//192.168.1.2/disk bs=1M conv=notrunc,noerror

Примечание: мне нужно клонировать (реплицировать) весь HD "A" в HD "B" . HD "A" содержит SO Ubuntu 16.04 x64, swap, MBR и другие разделы.

Цель: если в «А» есть повреждение, быстро замените его на «В».

ajcg
источник
2
Я бы не стал пытаться. Такая копия низкого уровня кажется плохим выбором при перемещении между системами. Я бы использовал инструмент более высокого уровня, например, rsyncдля копирования содержимого, оставляя тип файловой системы, геометрию и т. Д. Целевых дисков на NAS. Таким образом, вы получаете возможность восстановления, если процесс требует перезапуска и проверки целостности на уровне файлов.
Фрэнк Томас
ттт. Пожалуйста, дайте мне пример вашего предложения
ajcg
1
Пара вещей - 1 - Вы не должны "dd" живой диск (то есть / dev / sda) - он может работать, но это приведет к некоторому повреждению файловой системы, потому что все изменится, незамеченным, на базовом диске, пока dd Бег. 2 - Если вы пытаетесь создать образ, вы должны смонтировать точку монтирования, затем dd в файл на точке монтирования, в противном случае используйте другой механизм для зеркалирования файлов, а не блочное устройство. 192.168.1.2/disk - это не блочное устройство, а общая папка, и именно поэтому вы не можете сделать его копию.
Давидго
1
@bdc: Ваш подход вполне выполним; Я сделал нечто подобное для создания резервных копий на основе изображений. Тем не менее, вы не можете просто сказать "of = 192.0.2.1". Вместо этого вы пропускаете "of =" и передаете вывод в другую программу (pv - отличный выбор, но тогда вам нужно передать в другую программу), которая может работать с сетью, например, ssh или nc. (На самом деле, метод, который я использовал (и документировал), использует как ssh, так и nc.)
TOOGAM
Я рекомендую вам установить новый диск в NAS, отформатировать его и настроить корневой ресурс. на компьютере смонтируйте где-нибудь общий ресурс и rsync -axHAWXS --numeric-ids --info=progress2 /path/to/src /path/to/share/mount/
Фрэнк Томас,

Ответы:

0

Мне нужно клонировать (реплику) весь HD "A" в HD "B".

Извлеките HD «B» из своего NAS и подключите его непосредственно к системе, в которой находится HD «A». Тогда вы можете клонировать с pvили dd, ddrescueили даже с cpили catя думаю, и это может быть так же просто, как

sudo dd if=/dev/sda of=/dev/sdb

Используйте параметры, которые вам нужны. (Кстати, в вашем примере conv=notrunc,noerrorэто не имеет смысла. Это будет иметь смысл с первым dd.)

И это правда, вы не должны делать это, когда любая файловая система /dev/sdaсмонтирована с правами на запись или /dev/sdbкаким-либо образом смонтирована. Это то, что происходит, когда ваш источник может измениться во время последовательного клонирования .

Ваш целевой диск (его разделы, файловые системы и файлы) может или не может быть увиден NAS при переустановке диска там. NAS может записать некоторые изменения и испортить клон (например, он может изменить или не изменить данные загрузчика в MBR и последующих секторах).


Я знаю, что вам нужно решение, в котором целевой диск постоянно находится внутри NAS. Это сложно, потому что ваш NAS не раскрывает диск (устройство) для вас, ни его раздел (ы), ни файловую систему (ы). Он предоставляет файлы (существующие в файловой системе EXT3) с использованием CIFS / SMB, NFS, AFP или HTTP / HTTPS. Чтобы клонировать диск, вы должны иметь возможность записи на него на уровне секторов - я думаю, что ваш NAS не позволит вам сделать это просто так.

Я сказал «это сложно», а не «невозможно», потому что, если вы сможете получить доступ к SSH (или через telnet, или около того) к вашему NAS, вы сможете записать на диск на уровне сектора. Вы можете найти оболочку Linux (?) Со стандартными инструментами и, возможно, вы можете сделать что-то похожее на это (из живого дистрибутива Linux на ПК, где HD "A"):

sudo dd if=/dev/sda bs=1M conv=notrunc,noerror | pv | ssh root@192.168.1.2 "dd of=/dev/your_target_disk bs=1M"

Или используйте ncдля потоковой передачи ваших данных.

Редактировать 1. Хотя я не уверен, что это будет работать с рассматриваемым NAS (или любым другим NAS), я добавляю ncрешение на основе, потому что OP явно запросил его (в комментариях). Следующее решение наверняка подойдет для «NAS» - обычного компьютера с Linux.

Прежде чем вы скажете своему NAS, чтобы он прослушивал входящие данные и передавал их на устройство, вы должны убедиться, что никакой другой процесс не записывает на целевой диск; umountэто если вы можете или хотя бы отменить совместное использование устройства в конфигурации NAS. Затем:

# log in to NAS
nc -l 3210 | dd of=/dev/sda

Номер 3210является номером порта, вы можете выбрать его из диапазона 1024..65535. Замените /dev/sdaстроку с нужным устройством. С этого момента ваш NAS ожидает входящего соединения. Если кто-то подключится к нему через выбранный порт, его данные будут записаны на устройство, но в домашней среде это вряд ли является проблемой. Однако, если вас это беспокоит, вы должны знать, ncчто примет только одно соединение (одно за раз и одно в общем, то есть оно завершится после завершения первого соединения). Таким образом, если вы успешно подключитесь на следующем шаге, то вы будете знать, что никто другой не сделал.

Затем скажите вашей ОС с исходным диском (HD «A») прочитать его и отправить данные на прослушивание ncна NAS. Как /dev/sdaне должно быть смонтировано (строго: оно может быть смонтировано, но только для чтения), вам лучше выполнить этот шаг из некоторого живого дистрибутива Linux.

# where HD "A" is
dd if=/dev/sda | nc 192.168.1.2 3210

Используйте ddпараметры, которые вам нужны (как conv=notrunc,noerror). Обратите внимание на 3210номер порта прослушивания, который я выбрал на предыдущем шаге.

На практике вы можете следить за прогрессом, поэтому лучшей командой может быть:

dd if=/dev/sda | pv | nc 192.168.1.2 3210

Или вы можете запросить ddотчет о его прогрессе, передав ему USR1сигнал. Запустите следующее в другом терминале:

kill -s USR1 $(pidof dd)

и информация появится в терминале, где ddработает.

После ddзавершения и ошибки нет (ни на одной из сторон), вам следует изящно перезагрузить NAS . Очень важно, чтобы это syncбыл целевой диск, поэтому не просто отключайте питание. Используйте любой способ правильной перезагрузки или завершения работы вашего NAS.

Правка 1 заканчивается здесь.

Если вам это удастся, то обычные операции NAS могут или не могут испортить что-то в клоне, как если бы вы переустанавливали диск, клонированный напрямую.


Несколько комментариев предложили смонтировать общий ресурс и записать его на уровне файлов. У вас есть как минимум два варианта:

  • вы копируете файлы (например, с помощью rsync);
  • или вы записываете весь образ вашего HD "A" в виде файла, помещенного в файловую систему на HD "B".

Оба метода могут быть полезны, но ни один не клонирует. Вы не сможете заменить HD "A" просто на HD "B", как хотите. Более того, последний метод не будет работать вообще в вашем конкретном случае, потому что ему требуется свободное место в файловой системе HD «B», чтобы быть больше, чем весь HD «A» (это ограничение может не действовать, если вы используете разреженный файл, но вы не можете использовать один с NFS, SMB и т. д., вы можете?). Вы можете написать сжатый файл, и он может соответствовать, но это еще дальше от клонирования.

Камиль Мачоровски
источник
Спасибо за ваш ответ. Это хорошо задокументировано и имеет смысл. Однако я должен подождать несколько дней, чтобы увидеть, есть ли какие-либо предложения, которые не были рассмотрены. В противном случае я выберу ваш ответ как лучший. Кстати. Есть еще один способ сделать это с Netcat, но я не уверен, насколько это надежно. clona.pbworks.com/w/page/7807251/Por%20red%20con%20netcat
ajcg
Пожалуйста. Добавьте альтернативное решение netcat + partclone к своему ответу, чтобы выбрать его как лучший. Спасибо
ajcg
@ BDC я никогда не использовал, partcloneпоэтому я не буду включать его в свой ответ. Ответ теперь расширен за счет общего ncрешения.
Камиль Мачоровски