Могу ли я создать программный RAID 1 с одним устройством

20

У меня есть один диск, из которого я хочу создать зеркало; давайте назовем этот диск sda. Я только что купил еще один диск одинакового размера, который мы можем назвать sdb. sdaи sdbодин раздел называется sda1и sdb1соответственно.

При создании рейда я не хочу стирать свою sdaчистоту и начинать заново, я просто хочу, чтобы она начала зеркалировать sdb. Мой ход мыслей должен был сделать:

mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=1 /dev/sda1

... чтобы создать массив без sdbдиска, затем запустите что-то вроде (я думаю вслух следующую команду, потому что я не уверен, как выполнить этот шаг)

mdadm /dev/md0 --add /dev/sdb1

sdb1Предполагается, что примечание отформатировано аналогичноsda1

Это возможно?

кто я
источник
Да, ты можешь. Это не так просто --add, и вам нужно быть осторожным, но это не очень сложно. Смотрите Как настроить зеркалирование дисков в Ubuntu? (Я не могу предложить этот вопрос в качестве дубликата из-за новых правил.)
Жиль "ТАК - перестань быть злым"

Ответы:

28

Простой ответ на вопрос в заголовке «Да». Но то, что вы действительно хотите сделать, - это следующий шаг - зеркальное отображение существующих данных.

Можно конвертировать существующий диск, но, как уже упоминалось, это рискованно из-за расположения метаданных. Намного лучше создать пустое (разбитое) зеркало с новым диском и скопировать на него существующие данные. Затем, если это не сработает, вы просто загрузитесь обратно к неотраженному оригиналу.

Во-первых, инициализируйте /dev/sdb1как новый /dev/md0с отсутствующим диском и инициализируйте файловую систему (я полагаю, ext3, но выбор за вами)

mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sdb1 missing
mkfs -text3 /dev/md0

Теперь, /dev/sda1скорее всего, ваша корневая файловая система ( /), поэтому в целях безопасности вы должны сделать следующий шаг с живого компакт-диска, аварийного диска или другой загрузочной системы, которая может получить доступ к обоим, /dev/sda1и /dev/md0хотя я успешно сделал это, перейдя в однопользовательский режим.

Скопируйте все содержимое файловой системы /dev/sda1в /dev/md0. Например:

mount /dev/sda1 /mnt/a       # only do this if /dev/sda1 isn't mounted as root
mount /dev/md0 /mnt/b
cd /mnt/a                    # or "cd /" if it's the root filesystem
cp -dpRxv . /mnt/b

Отредактируйте /etc/fstabили иным образом убедитесь, что при следующей загрузке /dev/md0вместо /dev/sda1. Ваша система, вероятно, настроена на загрузку, /dev/sda1и параметры загрузки, вероятно, задают это как корневое устройство, поэтому при перезагрузке вы должны вручную изменить это так, чтобы root был /dev/md0(при условии, что /dev/sda1это root). После перезагрузки проверьте, что /dev/md0теперь смонтировано ( df) и работает ли оно как ухудшенное зеркало ( cat /proc/mdstat). Добавьте /dev/sda1в массив:

mdadm /dev/md0 --add /dev/sda1

Поскольку перестройка будет перезаписывать /dev/sda1, то какая версия метаданных вы используете, не имеет значения. Как всегда при внесении серьезных изменений, сделайте полную резервную копию (если возможно) или, по крайней мере, убедитесь, что все, что не может быть воссоздано, безопасно.

Вам нужно будет восстановить свою загрузочную конфигурацию, чтобы использовать ее в /dev/md0качестве пользователя root (если он /dev/sda1был root), и, возможно, потребуется восстановить его, mdadm.confчтобы убедиться, что /dev/md0он всегда запущен.

StarNamer
источник
Совершенно точно, что мне нужно: D
whoami
2
Не используйте cpдля копирования файловых систем, вы упустите некоторые вещи, такие как жесткие ссылки, расширенные атрибуты ... Используйте tarили rsyncс соответствующими параметрами. При загрузке Live CD помните, что сопоставление uid-user отличается (см. Параметры --numeric-owner в tar / rsync). Смотрите также clone2fs для клонирования файловых систем extx.
Стефан Шазелас
1
Варианты cpобработки сохранения ссылок (-d), режима, владельца и временных меток (-p), рекурсивного выполнения (-R) и пребывания в одной файловой системе (-x), но я думаю, что вы можете быть правы насчет жестких ссылок и расширенных атрибутов.
StarNamer
rsync -aH --delete /mnt/olddisk/ /mnt/newarray/хороший вариант Добавьте, -vih --progressесли вы действительно хотите увидеть, что он делает.
rudolfbyker
4

Конечно, вы можете создать его, указав, что второй диск в настоящее время missing:

mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 missing /dev/sda1
eppesuig
источник
Сладкая благодарность, я, вероятно, являюсь здесь ОКР, но есть ли причина, по которой вы добавили недостающие слова перед / dev / sda1, важен ли порядок?
Whoami
Я думаю, что порядок не имеет значения.
eppesuig
3
Осторожнее с этим! с --metadata = 1.2 (новое значение по умолчанию) метаданные RAID (1 МБ) будут вставлены в начале (переопределяя содержимое там). И запуск массива md начнется на 1 МБ в / dev / sda1 (/ dev / md0 будет на 1 МБ короче, чем / dev / sda1). При метаданных = 0,9 (старое значение по умолчанию) метаданные (64 КБ) будут вставлены в конце, переопределяя то, что есть. Поэтому используйте --metadata = 0.9 и сначала измените размер FS. Что бы вы ни делали, сделайте резервную копию заранее.
Стефан Шазелас
3

Вы можете сделать это. Вы должны быть немного осторожнее, но это не опасно - если вы очень осторожны, чтобы ничего не набирать, и это не оставляет никаких ошибок в настройке.

Я настоятельно рекомендую не делать никаких манипуляций с живой системой. В некоторых случаях это возможно, но требует дополнительной осторожности. Загрузитесь с liveCD / liveUSB, такого как Parted или SystemRescueCD .

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

Вы должны убедиться, что последние 128 КБ от блочного устройства не используются, чтобы освободить место для суперблока. Так что вам нужно сжать файловую систему на/dev/sda1 . Если это файловая система ext2 / ext3 / ext4, получите текущий размер файловой системы с помощью tune2fs /dev/sda1, а затем запустите, resize2fs /dev/sda1 NNNгде NNN - это размер минус 128 КБ. Вы можете сделать это с помощью Parted вместо этого. Если вам нужно сжать файловую систему extN, вам сначала нужно ее отключить; файловая система btrfs может быть сжата вживую.

Убедившись, что последние 128 КБ блочного устройства свободны, позвоните, mdadm --createчтобы создать том RAID-1. Это не касается какой-либо части громкости, кроме суперблока. Первоначально том будет иметь один компонент: все остальные будут определены как сбойные. Вы должны пройти --level=1(или эквивалентно -n 1) (этот подход работает только для RAID-1) и --metadata=0.9или--metadata=1.0 (формат суперблока по умолчанию 1.2 устанавливает суперблок в начале устройства, что может перезаписывать данные). Аргументом --raid-devices( -n) является количество компонентов (включая отсутствующие) в томе RAID.

mdadm --create /dev/md0 --level=1 --raid-devices=2 --metadata=1.0 /dev/sda1 missing

Теперь вы можете активировать массив и добавить другие компоненты.

mdadm --add /dev/md0 /dev/sdb1

Примечание по загрузчикам: Grub2 понимает Linux RAID-1 и может загружаться с него. Загрузчики, такие как Grub1, которые не понимают RAID, прозрачно читают с зеркальных томов, но ваша система не загрузится, если диск, с которого загрузчик считывает данные, выходит из строя. Если том RAID находится в разделе, обязательно установите загрузочный сектор Grub на оба диска.

¹ Обязательно иметь резервные копии. «Не опасно» означает «вы, вероятно, не будете нуждаться в них», а не «играть в свои данные».

Переписан и немного адаптирован из Как настроить зеркалирование диска (RAID-1)

Жиль "ТАК - прекрати быть злым"
источник