- PVSM.RU - https://www.pvsm.ru -

Переводим работающую систему Debian 7 на софтовый raid1/10 на примере хостинга от Leaseweb

Переводим работающую систему Debian 7 на софтовый raid1/10 на примере хостинга от Leaseweb

Сегодня, уважаемые читатели и гости хабра, я поделюсь с вами рассказом о том как я строил свой лунапарк с блекджеком и девушками. Т.е. как я переводил свой выделенный сервер [1], полученный от Leaseweb, на софтовый raid1/10 и lvm.

Зачем нужна данная статья?
Так уж сложилось что Leaseweb, наверное, один из самых вредных хостеров, т.к. поставить систему сразу с готовым raid нельзя, по имеющейся у меня информации техподдержка тоже этого не делает. KVM можно взять далеко не для всех серий серверов, да и денег он стоит немаленьких. В итоге, из желания глубже познать linux, я стал разбираться сам в этой теме.
В интернете я находил множество статей как это сделать, но у них было две основных проблемы: для них требуют возможности доступа в BIOS для изменения порядка загрузки (коего у нас нет) или используется GRUB legasy (версии до 1), которые не используется в Debian 7.
Результатом двух недель жизни в гугле, курения мануалов, википедии и множества опытов стала данная инструкция «для чайников».

Данная статья ни в коем случае не является рекламой хостинга [1] от Leaseweb. Почему я не взял сервер у ресселеров с русской поддержкой? Или почему не взял хостинг [1] от другой компании, где в автомате можно установить raid или доступен KVM? Так исторически получилось и с этим нужно было что-то делать.

Так как на момент решения данной проблемы я сам обладал крайне скромными познаниями в linux, в данной статье я буду стараться рассказать более подробнее процесс перевода работающей системы на raid [2] 1/10 + lvm [3]. В мануале используется разбивка диска с mbr. Работоспособность с GPT не проверялась.

Итак, вводные условия: Есть выделенный сервер [1] от Leaseweb, в котором 4 HDD и установлена Debian 7.0 64-bit. Разбивка разделов “Custom”:

1 раздел – boot (100 мегабайт)
2 раздел – swap – 4 гигабайта
3 раздел – основной – оставшееся пространство, его мы включим в lvm.

Надо:
Раздел boot делаем массивом raid 1 на 4 диска.
Два раздела swap по 4 гигабайта в два raid1 массива (если swap не выносить на raid1, то при поломке диска можно получить неработающую систему из-за повреждения swap).
Оставшееся пространство организовываем в raid10 bp 4-разделов на разных дисках и используем его уже под lvm, что бы иметь возможность изменять размеры разделов.

ВНИМАНИЕ! Выполнение любых операций указанных ниже может привести к потере данных! Перед выполнение указанных действий убедитесь в наличии (если это необходимо) резервных копий данный и целостности этих копий.

0. Подготовка

ДАННЫЙ ПУНКТ ВЫПОЛНЯЕТСЯ ТОЛЬКО ПРИ УСТАНОВКЕ НА НОВЫЙ СЕРВЕР! Если вы переводите работающий сервер, то переходите к пункту 1.

Мне сервер достался с уже попользованными дисками (наработка не более 1000 часов у каждого) и с учетом того, что sda (первый диск) был с установленной системой и разделом mbr, а второй (sdb), третий (sdc) и четвертый(sdd) диски были с gpt я решил полностью удалить всю информацию c дисков.

Для этого нам надо загрузиться в режиме восстановления (я использовал Rescue amd64). Через SCC запускаем режим восстановления и через SSH клиент (я использую putty) подключаемся к серверу.

Далее используя команды зануляем поверхности дисков (операция занимает время, на дисках 500 гигабайт это порядка 2-х часов на каждый диск).
Для тех кто поспорит, что достаточно стереть таблицу разделов (первые 512 байт диска), то я лично столкнулся с ситуацией, когда я после предыдущих опытов создал по новой таблицу разделов идентичную той, которую использовал в предыдущем опыте, я получил всё содержимое диска обратно. Поэтому я занулял диски полностью:

dd if=/dev/zero of=/dev/sda bs=4k
dd if=/dev/zero of=/dev/sdb bs=4k
dd if=/dev/zero of=/dev/sdc bs=4k
dd if=/dev/zero of=/dev/sdd bs=4k

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

dd: writing `/dev/sdd': No space left on device
122096647+0 records in
122096646+0 records out
500107862016 bytes (500 GB) copied, 4648.04 s, 108 MB/s

Для тех, кто не готов ждать много времени, данный процесс можно запустить в параллель, запустив 4 копии ssh клиента.

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

fdisk /dev/sda

далее нажимаем w для сохранения результата

Повторяем операцию для дисков sdb, sdc, sdd

Перезагружаем сервер.

reboot (или shutdown –r now)

1. Установка системы.

Теперь делаем чистую установку операционной системы. Заходим в SSC, в раздел управления сервером, жмём «reinstall», выбираем операционную систему Debian 7.0 (x86_64). Если вы не планируете использовать более 3 гигабайт оперативной памяти, то можете установить версию x86. Далее выбираем разбивку жесткого диска «Custom partition».

Переводим работающую систему Debian 7 на софтовый raid1/10 на примере хостинга от Leaseweb

Раздел tmp убираем совсем, при необходимости его вынесем отдельно, но уже на lvm разделе.

Жмём установить, ждём окончания установки и заходим в систему.

2. Установка необходимых модулей

Устанавливаем модули raid.

apt-get install mdadm

Устанавливаем lvm.

apt-get install lvm2

3. Копирование таблицы разделов на второй, третий и четвертый диски

На данный момент мы уже имеем на первом диске (sda) структуру разделов, созданную автоматически. Посмотреть её можно командой

fdisk -l /dev/sda

Вывод её получается такой:

Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 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: 0x00095cbf

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048        4095        1024   83  Linux
/dev/sda2   *        4096      616447      306176   83  Linux
/dev/sda3          618494   976771071   488076289    5  Extended
/dev/sda5          618496     9003007     4192256   82  Linux swap / Solaris
/dev/sda6         9005056   976771071   483883008   83  Linux

Из представленной структуры разделов нам нужны:
— отмеченный звездочкой загрузочный раздел – это будет boot
— раздел sda5 с типом 82 – Linux swap – это соответственно swap
— раздел sda6 – это основной раздел.

Так как мы делаем зеркальные массивы, то нам на втором, третьем и четвертом дисках нужна идентичная структура разделов.

sfdisk -d /dev/sda | sfdisk --force /dev/sdb

Повторяем процедуру, заменяя sdb на sdc и sdd.

Для версии Grub, используемой в Debian 7.0 нет необходимости использовать какие-либо дополнительные ключи типа –metadata=0.9 при создании raid-массива, на версии superblock 1.2 всё прекрасно работает, а соответственно поэтому нет необходимости менять тип раздела на fd (raid autodetect).

4. Создание raid-массивов

Создаем (ключ -C) массив с именем md0 типа raid1 для 4-х разделов с одним отсутствующим (missing) – это будет раздел boot (раздел 2 на дисках). Отсутствующий раздел добавим позже.

mdadm -C /dev/md0 --level=1 --raid-devices=4 missing /dev/sdb2 /dev/sdc2 /dev/sdd2

Первый массив для swap (напомню, я буду использовать их два)
mdadm -C /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb5

Второй массив для swap
mdadm -C /dev/md2 --level=1 --raid-devices=2 /dev/sdc5 /dev/sdd5

Теперь создаем основной raid-массив типа raid10, на который мы потом установим lvm
mdadm -С /dev/md3 --level=10 --raid-devices=4 missing /dev/sdb6 /dev/sdc6 /dev/sdd6

5. Создание lvm раздела.

Для начала добавим получившийся основной массив md3 в Phisical Volume (группа физических томов)

pvcreate /dev/md3

Теперь создадим группу логических томов vg0 (название можно использовать любое) на величину всего массива md3.

vgcreate vg0 /dev/md3

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

lvcreate -L50G -n root vg0

-L50G – ключ указывает на размер раздела в 50 гигабайт, так же можно использовать буквы K,M – килобайты и мегабайты соответственно
-n root — ключ указывает, что у созданного раздела будет имя, в данном случае root, т.е. обращаться к нему мы сможем по имени /dev/vg0/root
И данный раздел создается на группе логических томов vg0 (если вы использовали в предыдущей команде другое имя, то вы вписываете его вместо vg0 в данной команде).

Если вы создаете отдельные разделы под /tmp, /var, /home и так далее, то по аналогии создаете нужные разделы.

6. Создание файловых систем на разделах

На разделе boot (массив md0) мы будем использовать файловую систему ext2

mkfs.ex2 /dev/md0

Создаем swap

mkswap /dev/md1
mkswap /dev/md2

и включаем их с равными приоритетами использования (ключ –p и цифра приоритета, если приоритет будет разный, то один swap будет использоваться, а второй будет простаивать, пока не переполниться первый. А это неэффективно)

swapon -p1 /dev/md1
swapon -p1 /dev/md2

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

mkfs.ext 4 /dev/vg0/root

7. Обновление в системе информации о созданных raid-массивах

Сохраним оригинальный конфигурационный файл массива, он нам понадобиться далее.

cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig

Теперь допишем в него актуальную на данный момент информацию.

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

8. Настройка автоматического монтирования (подключения) дисков при старте системы

В Linux можно двумя способами задать имя диска или раздела — в символьном виде типа /dev/sda6 или по UUID. Я выбрал для использования второй способ, по идее он должен помочь избежать ряда проблем, когда может поменяться обозначение диска или раздела. И в конце-концов сейчас это общепринятая практика.

Получим UUID нужных нам «разделов» md0 (boot), md1 (swap), md2 (swap), vg0/root (root) с помощью команды

blkid /dev/md0

Получаем такой вывод

/dev/md0: UUID="420cb376-70f1-4bf6-be45-ef1e4b3e1646" TYPE="ext2"

В данном случае нас интересует UUID=420cb376-70f1-4bf6-be45-ef1e4b3e1646 (именно без кавычек) и тип файловой системы — ext2.

Выполняем данную команду для /dev/md1, /dev/md2, /dev/vg0/root и сохраняем полученные значения (в putty можно выделить мышкой и нажать Ctrl+c, вставка производится одинарным нажатием правой кнопки мыши. Ну а для особых мазохистов — переписывать вручную :)

Далее открываем файл fstab на редактирование

nano /etc/fstab

и редактируем файл до следующего вида, подставляя нужные UUID:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda6 during installation
UUID=fe931aaf-2b9f-4fd7-b23b-27f3ebb66719 /               ext4    errors=remount-ro 0       1
# /boot was on /dev/sda2 during installation
UUID=420cb376-70f1-4bf6-be45-ef1e4b3e1646 /boot           ext2    defaults        0       2
# swap was on /dev/sda5 during installation
UUID=80000936-d0b7-45ad-a648-88dad7f85361 none            swap    sw              0       0
UUID=3504ad07-9987-40bb-8098-4d267dc872d6 none            swap    sw              0       0

Если будете подключать другие разделы, то формат строки таков:

UUID точка монтирования тип файловой системы параметры монтирования 0 2

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

Для сохранения файла нажимаете «ctrl+x» – «y» — «enter»

9. Монтирование разделов

Создаем папки, в которых примонтируем корневой раздел и раздел boot

mkdir /mnt/boot
mkdir /mnt/root
mount /dev/md0 /mnt/boot
mount /dev/vg0/root /mnt/root
10. Обновление загрузчика и загрузочного образа

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

update-grub

Если всё идёт успешно, то на экране получим такой вывод

Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.2.0-4-amd64
Found initrd image: /boot/initrd.img-3.2.0-4-amd64
Found Debian GNU/Linux (7.4) on /dev/mapper/vg0-root
done

И обновляем загрузочный образ под измененные условия

update-initramfs -u

11. Копирование содержимое первого диска на raid

Копируем содержимое корневого раздела установленной системы ( / ) на раздел root, расположенный на lvm

cp -dpRx / /mnt/root

Далее переходим в каталог boot и копируем его содержимое на отдельно примонтированный раздел boot, расположенный на raid-массиве /dev/md0

cd /boot
cp -dpRx . /mnt/boot
12. Установка обновленного загрузчика на все диски массива

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

grub-install /dev/sda

Эту же команду выполняем для дисков sdb, sdc, sdd

После чего перезагружаем сервер

reboot

Ждём минут 10 и через SelfServiceCenter запускаем режим восстановления Rescue(x64) или если вы устанавливали 32-битную версию, то соответствующую версию Rescue.
Если его запуск не будет произведен, то через SSC перезагружаем сервер и пробуем снова. У меня лично с первого раза не запустилось.

13. Монтируем диски для обновления конфигурации сервера

Этими командами мы монтируем корневой раздел и раздел boot с raid-массивов и служебные файловые системы /dev, /sys, /proc

mount /dev/vg0/root /mnt
mount /dev/md0 /mnt/boot
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount --bind /proc /mnt/proc
14. Смена shell'а и смена окружения пользователя root

В линуксе мы имеем возможность сказать системе, что сейчас пользователь root работает в следующей установленной (но не запущенной) системе.
Для этого нам надо выполнить команду chroot. Но режим восстановления по умолчанию запускается с шеллом zsh, а в нем нельзя выполнить команду chroot, по крайней мере я не нашел как. Для этого нам надо сначала сменить используемый шелл, а затем выполнить команду chroot

SHELL=/bin/bash
chroot /mnt

15. Добавление первого диска sda в созданные raid-массивы

Добавляем раздел boot в соответствующий массив

mdadm --add /dev/md0 /dev/sda2

Добавляем раздел swap в первый массив swap
mdadm --add /dev/md1 /dev/sda5

Добавляем основной раздел в массив основного раздела
mdadm --add /dev/md3 /dev/sda6

После выполнения этих команд запускается синхронизация и восстановление массива, этот процесс занимает длительное время. У меня добавление жесткого диска размером 500 гигабайт заняло примерно 1,5 часа.

Наблюдать как идёт процесс можно командой

watch cat /proc/mdstat

После завершения синхронизации массивов, мы получим такой вывод:

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md3 : active raid10 sda6[4] sdb6[1] sdd6[3] sdc6[2]
      967502848 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]

md2 : active raid1 sdc5[0] sdd5[1]
      4190144 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sda2[4] sdb2[1] sdd2[3] sdc2[2]
      305856 blocks super 1.2 [4/4] [UUUU]

md1 : active raid1 sda5[2] sdb5[1]
      4190144 blocks super 1.2 [2/2] [UU]

unused devices: <none>

Вернуться к командной строке можно сочетанием клавиш ctrl + c

16. Обновление в системе информации о созданных raid-массивах

Подобную операцию мы уже проводили. Теперь восстанавливаем оригинальный конфигурационный файл и в него дописываем актуальную информацию о raid-массивах

cp /etc/mdadm/mdadm.conf_orig /etc/mdadm/mdadm.conf
mdadm --examine --scan >> /etc/mdadm/mdadm.conf

17. Обновление загрузчика и загрузочного образа

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

update-grub

и загрузочный образ системы

update-initramfs -u

18. Установка обновленного загрузчика и завершение обновления параметров системы

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

grub-install /dev/sda
grub-install /dev/sdb
grub-install /dev/sdc
grub-install /dev/sdd

Затем выходим из текущего окружения

exit

и перезагружаем сервер

reboot

УРА! После перезагрузки мы получаем работающий сервер на raid и lvm.

Приложение:

Подробнее об использовании команд менеджера raid-массивов mdadm [4]

Подробнее об использовании команд менеджера логических томов lvm [5]

Подробнее о файла fstab, опциях монтирования [6]

PS: Если в каких-то местах получился велосипедистый велосипед или была использована не совсем верная терминология, то просьба сделать скидку на слабое знание линукса и подсказать true way.
Ошибки вычитывал, правда на статье такого объема мог что-то и пропустить.

Автор: WolfTheGrey

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/news/54768

Ссылки в тексте:

[1] выделенный сервер: https://www.reg.ru/?rlink=reflink-717

[2] raid: http://ru.wikipedia.org/wiki/RAID

[3] lvm: https://www.ibm.com/developerworks/ru/library/l-lvm2/

[4] Подробнее об использовании команд менеджера raid-массивов mdadm: http://xgu.ru/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D1%8B%D0%B9_RAID_%D0%B2_Linux

[5] Подробнее об использовании команд менеджера логических томов lvm: http://xgu.ru/wiki/LVM

[6] Подробнее о файла fstab, опциях монтирования: https://wiki.archlinux.org/index.php/Fstab_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)

[7] Источник: http://habrahabr.ru/post/212269/