Man вики
Advertisement

Задача[]

Произвести перенос рабочей операционной системы на RAID массив любого уровня по следующей схеме:

  • Структура разделов на физических носителях GPT (снимает ограничение в 2 Тб на носитель)
    • 1 раздел для обеспечения поддержки загрузки BIOS компьютера и размещения менеджера загрузки Linux
    • 2. раздел является хранилищем зеркального тома RAID1 и расположен на каждом физическом диске
    • 3. раздел является хранилищем RAID любого уровня внутри которого располагается LVM структура
  • LVM содержит том для данных и для файла подкачки.

Загрузка и обновление компонентов[]

apt-get update
apt-get install -y mdadm initramfs-tools lvm2 atop htop sysstat smartmontools rsync parted jfsutils

Определения[]

Проверим список доступных в системе дисков

fdisk -l|grep Диск

Уточним, какой диск является рабочим, то-есть диск, с которого загрузилась система

echo Системный `df -h|grep -Po "/dev/..."`

Задаем диски, который будем готовить под RAID

workdsk=sda # Системный
newdsk=sdb  # Новый (дополнительный) диск, на который будем копировать данные

Создание разметки под RAID[]

Очищаем таблицу разделов на указанном жестком диске и размечаем диск в GPT.

dd if=/dev/zero of=/dev/$newdsk bs=512 count=1
parted /dev/$newdsk mklabel gpt

Определяем максимальный размер диска и создаем разделы на нем

sizedsk=`parted /dev/$newdsk print -m | grep "/dev/$newdsk" | awk -F ":" '{print $2}'`
parted /dev/$newdsk mkpart primary 1M 10M
parted /dev/$newdsk set 1 bios_grub on
parted /dev/$newdsk mkpart primary 10М 128M
parted /dev/$newdsk mkpart primary 128M $sizedsk
parted /dev/$newdsk print

Предварительная настройка RAID в режиме деградации[]

Создаем массивы в деградированном состоянии на диске sdb:

  • md0 для загрузки (обязательно зеркало -level=1) расположен во 2м разделе GPT
  • md1 массив для данных, может быть любого уровня (в примере 1) расположен в 3м, наибольшем разделе GPT
mdadm --create /dev/md0 --metadata=0.90 --level=1 --raid-devices=2 missing /dev/${newdsk}2
mdadm --create /dev/md1 --metadata=0.90 --level=1 --raid-devices=2 missing /dev/${newdsk}3

Сохраним параметры массива в конфигурационном файле:

mdadm --detail --scan >> /etc/mdadm/mdadm.conf

LVM[]

Создадим структуру разделов в LVM:

  • lv_swap для подкачки в начале диска размером 8 Гб (8192 Мб)
lv_swap=8192
  • Выделим отдельный раздел lv_add для хранения данных, которые могут переполнить диск под, например /var/spool и установим ему размер 70% от размера диска. Это позволит избежать ситуаций с переполнением диска и отказом всей системы.
lv_add_dir=/var/spool
lv_add_size=70%FREE
  • lv_root оставшееся место под корневую систему
pvcreate /dev/md1
vgcreate lv /dev/md1
lvcreate -L$lv_swap lv -n lv_swap
lvcreate -l$lv_add_size lv -n lv_add
lvcreate -l100%FREE lv -n lv_root
vgchange -a y lv

Работа с дополнительным диском[]

Форматирование разделов

  • Загрузочный раздел форматируем в ext2, корень системы в ext4, а рабочие данные будут в файловой системе jfs
mkfs.ext2 /dev/md0
mkfs.ext4 /dev/lv/lv_root
mkfs.jfs  /dev/lv/lv_add -ff
mkswap /dev/lv/lv_swap

Создадим точки монтирования созданных разделов и примонтируем их

mkdir /mnt/lv_boot
mkdir /mnt/lv_root
mkdir /mnt/lv_add

mount /dev/md0 /mnt/lv_boot
mount /dev/lv/lv_root /mnt/lv_root
mount /dev/lv/lv_add /mnt/lv_add

Произведем копирование загрузочных файлов и остальных данных исключая служебные каталоги в соответвтующие разделы

rsync -aHEAXh --progress /boot/* /mnt/lv_boot
rsync -aHEAXh --progress / /mnt/lv_root \
--exclude '/boot' \
--exclude '/mnt' \
--exclude '/proc' \
--exclude '/dev' \
--exclude 'lost+found' \
--exclude '/sys' \
--exclude $lv_add_dir
rsync -aHEAXh --progress $lv_add_dir/* /mnt/lv_add

Создадим новые служебные каталоги и назначим на них права

mkdir /mnt/lv_root/dev 
mkdir /mnt/lv_root/proc 
mkdir /mnt/lv_root/sys 
mkdir /mnt/lv_root/boot 
mkdir /mnt/lv_root/mnt
mkdir /mnt/lv_root/$lv_add_dir

Войдем в окружение созданой копии системы

mount /dev /mnt/lv_root/dev -o bind
mount /proc /mnt/lv_root/proc -o bind
mount /sys /mnt/lv_root/sys -o bind
echo "export workdsk=$workdsk" > /mnt/lv_root/tmp/wvars
echo "export newdsk=$newdsk">> /mnt/lv_root/tmp/wvars
echo "export lv_add_dir=$lv_add_dir">> /mnt/lv_root/tmp/wvars

Переходим в окружение скопированной системы[]

chroot /mnt/lv_root /bin/bash

Восстанавливаем переменные

`cat < /tmp/wvars`

Создадим файл монтирования файловых систем при загрузке

echo "" > /etc/fstab
echo  "proc            /proc           proc    nodev,noexec,nosuid     0       0" >> /etc/fstab
echo  "/dev/md0        /boot           ext2    defaults                0       2" >> /etc/fstab
echo  "/dev/lv/lv_swap none            swap    sw                      0       0" >> /etc/fstab
echo  "/dev/lv/lv_root  /              ext4    errors=remount-ro       0       1" >> /etc/fstab
echo  "/dev/lv/lv_add $lv_add_dir      jfs     errors=remount-ro       0       1" >> /etc/fstab

Разрешим системе автоматически запускаться, если один из дисков вышел из строя или отсутствует (по умолчанию при загрузке будет выдаваться запрос на разрешение запуска)

echo "BOOT_DEGRADED=true" > /etc/initramfs-tools/conf.d/mdadm

Подмонтируем загрузочный раздел в соответствии с указанными параметрами fstab с генерируем загрузочное ядро

mount /boot
mkinitramfs -o /boot/initrd.img-`uname -r`

Отключим графический режим загрузчика из-за которого система может не загружаться с рейда.

echo "GRUB_TERMINAL=console" >> /etc/default/grub

Выполним запись в загрузочный сектор второго жесткого диска и обновление параметров загрузчика

grub-install --recheck /dev/$newdsk
update-grub

В результате проделанных действий мы получили систему, которая должна запускать с RAID массива, но при этом сам массив находится в состоянии деградации и ожидает, когда будет доступен новый физический диск. В качестве такого диска теперь можно использовать как новый диск, так и диск с исходной системой, который надо предварительно очистить.

Очищаем таблицу разделов на исходном диске. Все данные на нем будут уничтожены! Все изменения в файлах произошедшие со времени начала копирования данных с него на второй диск будут потеряны.

dd if=/dev/zero of=/dev/$workdsk bs=512 count=1

Перезагружаем систему.

reboot

ВНИМАНИЕ. Если процесс выполняется удаленно, что выполнено условие: В БИОС компьютера должен быть настроен режим последовательной загрузки с жестких дисков, т.е. если загрузиться с первого диска не удалось, должна произойти автоматическая загрука со второго. Если это не так, и система не загружается, необходимо переключить загрузку на второй диск или поменять местами интерфейсные кабели.

Подключение или замена диска в RAID[]

  • Далее все действия идентичны как для первичного добавления диска, так и для замены вышедшего из строя

Проверим список дисков в системе

fdisk -l 2>/dev/null|grep -s Диск|grep -s -Pv "md|lv"

Диск который будет добавляться в массив, на данном этапе не должен быть быть членом рейда. Проверим, какой диск в рейде:

cat /proc/mdstat|grep md0|grep -Po "raid1 ..."

Чтобы не ошибиться в дальнейших действиях и не испортить данные создадим переменные с именами дисков.

workdsk=sdb  # Диск, который подключен к массиву и содержит систему
cleandsk=sda # чистый (пустой) диск, который будет добавлен

Произведем копирование структуры разделов с рабочего на чистый диск и подключим его к массиву

dd if=/dev/$workdsk of=/dev/$cleandsk bs=512 count=34
blockdev --rereadpt /dev/$cleandsk
mdadm --add /dev/md0 /dev/${cleandsk}2
mdadm --add /dev/md1 /dev/${cleandsk}3

Установим загрузчик на добавленный диск

grub-install /dev/$cleandsk

На этом действия по переносу системы на рейд массив завершены, осталось дождаться окончания синхронизации массива. Контролировать процесс можно с помощью команды:

watch cat /proc/mdstat
Advertisement