Man вики
Advertisement

Сценарии

Предположим, что у нас имеется сервер на базе OS Ubuntu server или Debian 6 установленный и работающий на одном физическом жестком диске. Мы хотим защитить увеличить или ускорить дисковую систему этого сервера. Каждый сценарий подразумевает свой эффект от использования.

Увеличение надежности за счет добавления второго диска

  1. Добавить физический диск равного (до байта) или меньшего размера чем исходный, но не меньше, чем объём имеющихся данных.
  2. Создать рейд массив первого уровня (зеркальный) в который включить только один (новый) диск
  3. Произвести копирование всех данных на него и сделать его загрузочным
  4. Проверить, что все работает с нового диска и если да то
  5. Очистить исходный (старый) диск и присоединить его к зеркальному массиву

Перенос системы на одиночный диск большей ёмкости

  1. Добавляем новый диск большего размера чем исходный
  2. Переносим данные и делаем загрузочным
  3. Отключаем исходный диск

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

Увеличение объема и скорости

  1. Добавить к системе несколько идентичных дисков и объединить их в массив 1,5 или 10 го уровня
  2. Перенести на этот массив систему сделав каждый диск загрузочным
  3. Убрать исходный диск

Структурное описание

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

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

Первый сценарий

Описание выполнения переноса системы на raid1 в соответствии с первым сценарием. Все блоки команд вводятся как есть, копировать -> вставить. Изменять нужно только выделенные жирным значения.

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

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 в режиме деградации

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

  • 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
update-initramfs -u

LVM

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

  • lv_swap для подкачки в начале диска размером 8 Гб (8192 Мб)
lv_swap=8192
  • Выделим отдельный раздел lv_add для хранения данных, которые могут переполнить диск под или которые особо ценные, например /var/spool и установим ему размер 70% от размера диска. Это позволит избежать ситуаций с переполнением диска и отказом всей системы. Кроме того, данный раздел будет отформатирован в высоконадежную систему jfs оптимизированную для хранения огромного числа мелких файлов.
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