У меня есть диск (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 и другие разделы.

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

1 ответ1

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 и т. д., вы можете?). Вы можете написать сжатый файл, и он может соответствовать, но это еще дальше от клонирования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .