Ubuntu перенос на raid

Обновлено: 02.07.2024

1. Необходимые знания
2. Постановка задачи
3. Установка ПО и подготовка дисков
4. Создание массива и перенос данных на него
5. Настройка системы и загрузчика на использование массива в качестве корневого раздела системы, перезагрузка в новую систему
6. Подготовка и подключение исходного диска к массиву в качестве второго диска в зеркале
7. Доказательство выполнения поставленной задачи
8. Дополнение
9. Используемая литература

1. Необходимые знания

Для наилучшего понимания необходимо прочитать следующие статьи:
Установка программ, управление пакетами и системные обновления (apt, dpkg)
Инструменты администратора
Установка программ, управление пакетами и системные обновления (apt, dpkg)
Работаем с накопителями (fdisk, mount)
Программный RAID - шпаргалка (mdadm)

2. Постановка задачи

Дано: Есть система (ubuntu server), установленная на 1 жесткий диск с авторазбитием при установке ( /=ext4 + swap ). Имеется второй жесткий диск такого же объема. Пустой.
Цель: Перенести систему на raid-зеркало из двух дисков, попутно сменив файловую систему на reiserfs. При этом не переустанавливать систему, а именно перенести существующую со всеми настройками и данными, которые в ней могли бы быть.
Доказательством достижения цели будет демонстрация вывода команд:
mount - корень должен быть на /dev/md0, файловая система reiserfs
fdisk -l - разделы на обоих дисках будут Linux Raid Autodetect, наличие устройства /dev/md0
mdadm --detail /dev/md0 - в составе массива будут разделы с обоих дисков /dev/sda1 и /dev/sdb1, их состояние будет active sync
cat /proc/mdstat - уровень raid-массива будет raid1 (зеркало), целостность массива [UU] - не нарушена.
lsblk - наглядное интуитивнопонятное отображение
swapon -s - использование разделов на обоих дисках под своп
free - размер свопа равен сумме размеров своп-разделов обоих дисков

3. Установка ПО и подготовка дисков

Диск /dev/sda: 8589 МБ, 8589934592 байт
255 головок, 63 секторов/треков, 1044 цилиндров, всего 16777216 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x000c0f42

Устр-во Загр Начало Конец Блоки Id Система
/dev/sda1 * 2048 15728639 7863296 83 Linux
/dev/sda2 15730686 16775167 522241 5 Расширенный
/dev/sda5 15730688 16775167 522240 82 Linux своп / Solaris

Диск /dev/sdb: 8589 МБ, 8589934592 байт
255 головок, 63 секторов/треков, 1044 цилиндров, всего 16777216 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x00015df5

Устр-во Загр Начало Конец Блоки Id Система

Диск /dev/sdb: 8589 МБ, 8589934592 байт
255 головок, 63 секторов/треков, 1044 цилиндров, всего 16777216 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x00015df5

Устр-во Загр Начало Конец Блоки Id Система
/dev/sdb1 2048 15362047 7680000 fd Автоопределение Linux raid
/dev/sdb2 15362048 16777215 707584 82 Linux своп / Solaris

4. Создание массива и перенос данных на него

Так как у нас только 1 свободный жесткий диск, то мы не сможем создать массив из двух дисков сразу. Вместо второго мы укажем missing, это будет означать "отсутствует". Потом, когда загрузимся в систему на массиве и освободим первый диск, мы его подключим к массиву.
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 missing
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

Update Time : Tue Dec 11 16:11:42 2012
State : clean, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 0
Spare Devices : 0

Name : ubuntu:0 (local to host ubuntu)
UUID : ee15f1d8:f12fdd83:b3bcfbca:8d295a36
Events : 0

Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 0 0 1 removed

unused devices: <none>

Подчеркнутые degraded, removed, [2/1] [U_] говорят о том, что целостность массива нарушена (из двух дисков только один присутствует). Это как раз и есть результат нашего missing.

A pair of credits:
Elena Gryaznova performed testing and benchmarking.


Guessing about desired format.. Kernel 3.2.0-23-generic-pae is running.
Format 3.6 with standard journal
Count of blocks on the device: 1918960
Number of blocks consumed by mkreiserfs formatting process: 8270
Blocksize: 4096
Hash function used to sort names: "r5"
Journal Size 8193 blocks (first block 18)
Journal Max transaction length 1024
inode generation number: 0
UUID: 6fc39ba1-9d56-4b8b-807f-605fcb703519
ATTENTION: YOU SHOULD REBOOT AFTER FDISK!
ALL DATA WILL BE LOST ON '/dev/md0'!
Continue (y/n):y
Initializing journal - 0%. 20%. 40%. 60%. 80%. 100%
Syncing..ok
ReiserFS is successfully created on /dev/md0.

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

Перезагружаемся. grub2 не перенастроен на загрузку системы с массива. Но это не беда. Во время отображения меню загрузки нажмем 'c' и попадём в консоль. Далее 'ls' - grub не видит md-устройства (md/0)
c
ls
(hd0) (hd0,msdos1) (hd0,msdos5) (hd1) (hd1,msdos1) (hd1,msdos2)

Надо загрузить модуль mdraid1x
insmod mdraid1x
ls
(md/0) (hd0) (hd0,msdos1) (hd0,msdos5) (hd1) (hd1,msdos1) (hd1,msdos2)

Теперь вводим следующие команды (можно пользоваться табом [TAB] для завершения имён файлов vmlinuz и initrd). Так как целостность массива у нас нарушена, добавим опцию bootdegraded=true в конец строки linux, чтоб не было ошибок при загрузке. Обратите внимание на /dev/md127 - это и есть устройство нашего массива. Именно его нужно указывать.
set root=(md/0)
linux /boot/vmlinuz-3.2.0-23-generic-pae root=/dev/md127 bootdegraded=true
initrd /boot/initrd.img-3.2.0-23-generic-pae
boot
Пошла загрузка системы, расположенной на массиве.

6. Подготовка и подключение исходного диска к массиву в качестве второго диска в зеркале

Disk /dev/sda: 1044 cylinders, 255 heads, 63 sectors/track
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

Re-reading the partition table .

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)

добавляем его в /etc/fstab
proc /proc proc nodev,noexec,nosuid 0 0
UUID=6fc39ba1-9d56-4b8b-807f-605fcb703519 / reiserfs notail,acl 0 1
UUID=6aa1ddea-2cd6-4f7c-b0de-823eccccd8dd none swap sw 0 0
UUID=09050439-69a3-4eba-b39e-7f34c929e9af none swap sw 0 0

unused devices: <none>

7. Доказательство выполнения поставленной задачи

Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders, total 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c0f42

Device Boot Start End Blocks Id System
/dev/sda1 2048 15362047 7680000 fd Linux raid autodetect
/dev/sda2 15362048 16777215 707584 82 Linux swap / Solaris

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders, total 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x744af781

Device Boot Start End Blocks Id System
/dev/sdb1 2048 15362047 7680000 fd Linux raid autodetect
/dev/sdb2 15362048 16777215 707584 82 Linux swap / Solaris

Disk /dev/md127: 7860 MB, 7860060160 bytes
2 heads, 4 sectors/track, 1918960 cylinders, total 15351680 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/md127 doesn't contain a valid partition table


mdadm --detail /dev/md0 - в составе массива будут разделы с обоих дисков /dev/sda1 и /dev/sdb1, их состояние будет active sync

Update Time : Wed Dec 12 15:50:25 2012
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Name : ubuntu:0 (local to host ubuntu)
UUID : 6fc39ba1-9d56-4b8b-807f-605fcb703519
Events : 281

Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
2 8 1 1 active sync /dev/sda1


cat /proc/mdstat - уровень raid-массива будет raid1 (зеркало), целостность массива [UU] - не нарушена.

unused devices: <none>

8. Дополнение

Ситуация: продакшн-сервер, один диск, что с бэкапами - неизвестно.

Задача: добавить в систему два новых диска, объединить их в RAID-1 (зеркало), перенести на них систему со всеми потрохами с минимальным даунтаймом, старый диск использовать под бэкапы. Железного RAID нет, только fake raid, поэтому выкручиваемся при помощи mdadm.

Система: Ubuntu Server 12.04 LTS

Основной, с рабочей системой - sda, один раздел sda1, система ext4

До начала операции

Обязательно бэкапим все нужное.

Обновляем систему и устанавливаем необходимые пакеты

Добавляем диски в систему

Если сервер поддерживает hot spare - мы на коне. Если нет - можно подключить через USB или иным способом, но в случае большого количества и/или объема данных процесс будет крайне длительным и время простоя будет оочень большим. Не подходит ни один из вариантов? Выключаем сервер и добавляем диски добрым старым способом.

Проверяем все ли диски увиделись:

Убедимся что текущий системный диск это sda:

Создаем файловые системы

Повторяем то же самое для диска №2:

Создаем RAID-1 (зеркало)

Какое-то время будет создаваться рейд, в этом можно убедиться глядя на индикаторы обращения к дискам. Посмотреть текущий статус можно так:

Добавляем информацию о новом массиве в конфигурационный файл:

Проверяем название массива - оно должно быть прописано правильно! В противном случае мы получим так называемую проблему «md127» (массив виден, но его имя /dev/md127).

Создаем разделы

Смотрим какие разделы были созданы на основном диске:

и создаем такие же на новом RAID-массиве:

Размер выбираем по желанию.

Создаем файловые системы

У меня один общий раздел / и один раздел swap, так что в этом случае все просто:

Переносим файловую систему

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

Если есть желание следить за происходящим, нужно добавить –progress в команду rsync

Подключаем системные каталоги, входим в новую систему

Теперь необходимо сделать настройки в новой системе, при этом не трогая оригинал. Для этого подключаем системные каталоги и переходим в новую систему.

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

Вносим изменения в fstab

Чтобы система смогла загрузиться из нового места ей необходимо объяснить где у нас будут устройства (диски).

Теперь правим fstab: закомментариваем старые UUID, добавляем вместо них новые. Крайне желательно не ошибаться, иначе система просто не загрузится.

Настраиваем и устанавливаем Grub

Чтобы загружаться с нового массива нам нужно а)установить загрузчик и б)правильно его сконфигурировать.

Сначала обновляем конфигурацию:

Необходимо убедиться что новый UUID есть в обновленном конфигурационном файле!

Теперь пора установить загрузчик на наши новые диски:

Обновляем конфигурацию модулей ядра

Это нужно сделать для нормальной работы mdadm, иначе получим вышеописанную проблему «md127»

Выходим в реальную систему

Восстановление рабочих данных

Наступило время восстановления рабочих данных - СУБД и прочее. Но тут каждый все делает самостоятельно.

Перезагрузка в новую систему

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

Ага, все хорошо, все заработало.

Заключение

Осталось протестировать работу системы и придумать что сделать с освободившимся диском: пустить его в hot swap, под хранение данных или просто выкинуть.

Данная статья детально описывает, как перенести Linux систему на RAID1 без переустановки, добавив схожий по характеристикам жесткий диск к тому, на котором установлена система. Все операции будут проводиться на системе с двумя IDE-HDD, операционная система CentOS 5.1.

Просмотрим таблицу разделов:


По полученным данным видно, что установлены два идентичных жестких диска объемом 80 Гб. На первом диске создано 2 раздела: корневая файловая система и SWAP-раздел. Второй жесткий диск абсолютно пуст. Диски определены системой как hda и hdb.

Первым делом нам необходимо создать таблицу разделов на втором диске, идентичной первому.

Опция -d делает дамп таблицы разделов.


Посмотрим теперь, что представляют диски, установленные в системе:


Видно, что таблица разделов на втором диске полностью соответствует таблице разделов на первом диске.

Теперь изменим тип таблицы разделов на втором диске на Linux raid autodetect:


На запрос введем t. Пункт t — это изменение id системы раздела.

Выбираем номер раздела (напомню в нашем случае их 2).

Вводим шестнадцатеричный id код. Т.к. нам нужно Linux raid autodetect, то выбираем fd.


То же самое повторяем и для второго раздела:


Теперь записываем таблицу разделов на диск и выходим, выбрав опцию w.


Теперь загоним разделы нашего второго диска в массивы. Статус RAID намеренно выбран degraded.

mdadm: array /dev/md0 started.


При попытке повторить то же самое для второго раздела:

mdadm: error opening /dev/md1: No such file or directory

Мы воспользуемся опцией —auto:

mdadm: array /dev/md1 started.


Теперь выполним команду cat /proc/mdstat и убедимся, что наш деградировавший рейд работает:

md1 : active raid1 hdb2[1]

522048 blocks [2/1] [_U]

md0 : active raid1 hdb1[1]

77617920 blocks [2/1] [_U]

По статусу _U видим, что с первым диском у нас проблемы, что естественно, ведь его в массиве нет, а вот со вторым все ОК.


Теперь создадим файловые системы в наших массивах: ext3 в первом массиве и swap по втором:


Теперь создадим директорию для монтирования первого массива и смонтируем его туда:


Создаем файл конфигурации mdadm — /etc/mdadm.conf:


И вносим в него такую строку: DEVICE partitions


Теперь заносим информацию о RAID массивах в файл конфигурации mdadm:


Теперь правим файл /etc/fstab:


И приводим в соответствие с подчеркнутыми значениями:


Теперь необходимо отредактировать конфигурационный файл загрузчика GRUB:


Делаем две копии конфигурации текущего раздела.

Значения которые подлежат изменению подчеркнуты красным.


Создаем новый образ initrd командой:


Теперь переносим данные нашей системы на массив:


Теперь настроим загрузчик на второй диск, введя команду grub:


Работать будем с меню GRUB:


Теперь перезагружаемся и выбираем для загрузки второй ядро:



Теперь изменим тип таблицы разделов на перовом диске на Linux raid autodetect:


На запрос введем t. Пункт t — это изменение id системы раздела.

Выбираем номер раздела (напомню в нашем случае их 2).

Вводим шестнадцатеричный id код. Т.к. нам нужно Linux raid autodetect, то выбираем fd.


То же самое повторяем и для второго раздела:


Теперь записываем таблицу разделов на диск и выходим, выбрав опцию w.


Теперь добавляем первый раздел на первом диске в наш первый массив (извините за тавтологию):



Сейчас начался ребилдинг массива. Процесс достаточно длительный и зависит от емкости диска. За процессом можно наблюдать:


Теперь выполним команду cat /proc/mdstat и убедимся, что наш первый диск добавлен в массив:


Следующим шагом нам необходимо изменить файл конфигурации mdadm:


Нам необходимо либо удалить, либо закомментировать строки с параметрами дисков:


Сохраняем изменения и выходим.

Теперь соберем новые данные о массивах:


И пересоберем образ ядра. Обратите внимание на опцию -f, она позволит перезаписать существующие данные.

Приведу пример миграции работающей системы Ubuntu на программный RAID1.
В процессе необходимо будет выполнить две перезагрузки.

Первым делом переключимся на root пользователя если еще не под ним:

Посмотрим список дисков и разделов:

Предположим что в системе используется один диск, например /dev/sda и имеет один основной раздел /dev/sda1.
Для теста установил чистый Ubuntu Server 18.04, диск так был размечен по умолчанию, swap был файлом на этом же разделе.

Чтобы создать рейд, подключим еще один диск такого же размера, он будет называться /dev/sdb.

Установим mdadm и необходимые утилиты (обычно они установлены по умолчанию):

Для того чтобы удостовериться, что все необходимые модули и компоненты установлены, выполним следующую команду:

Если необходимые модули не загружены, то загрузим их:

Разобьем новый диск /dev/sdb аналогично установленному:

Создадим массив md0 используя опцию missing:

Если что-то не получилось, то можно удалить рейд и попробовать снова:

Укажем файловую систему массива:

Сделаем резервную копию файла конфигурации mdadm и добавим информацию о новом массиве:

Смонтируем /dev/md0 в систему:

У меня отобразилось в конце списка:

В файле /etc/fstab комментируем строки о /dev/sda и добавим о массиве:

Посмотрим файл /etc/mtab есть ли там запись о рейде:

Посмотрим точные имена файлов /vmlinuz, /initrd.img:

Создадим файл с меню загрузки GRUB2 и откроем его в редакторе:

Добавим содержимое (вместо /vmlinuz и /initrd.img укажем правильные имена если они другие):

Откроем в текстовом редакторе файл /etc/default/grub:

Раскомментируем пару строк:

Установим загрузчик на оба диска:

Скопируем все данные на примонтированный ранее массив md0:

При запуске системы, в меню загрузки будет первым меню /etc/grub.d/09_raid1_test, если будут проблемы с загрузкой, то можно будет выбрать загрузку с /dev/sda.

Убедимся что система запущена с /dev/md0:

Снова переключимся на root пользователя если не под ним:

Изменим тип раздела старого жесткого диска:

Добавим к массиву старый диск:

Обновим информацию о массиве в файле конфигурации mdadm:

Удалим наше временное меню GRUB, оно больше не нужно:

Снова обновим и установим GRUB:

Перезагрузим систему чтобы убедится что она успешно запускается:

На этом миграция работающей системы Ubuntu на программный RAID1 завершена.
Если один из дисков, /dev/sda или /dev/sdb перестанет работать, то система будет работать и загружаться.
Для стабильности можно добавить в массив еще дисков аналогичного размера.

Читайте также: