Pull to refresh

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

Reading time10 min
Views20K


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

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

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

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

Итак, вводные условия: Есть выделенный сервер от 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 на неработающий диск, что может вызвать ошибку). Swap можно сделать меньше или не располагать на raid массиве, но тогда рекомендую почитать что такое swap, как он используется, т.е. однозначного ответа что лучше нет.
Оставшееся пространство организовываем в raid10 bp 4-разделов на разных дисках и используем его уже под lvm, что бы иметь возможность изменять размеры разделов.

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

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

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

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

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

Далее используя команды зануляем поверхности дисков (операция занимает время, на дисках 500 гигабайт это порядка одного часа на каждый диск).
Для тех кто поспорит, что достаточно стереть таблицу разделов (первые 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 клиента.

Полезное дополнение от Meklon:

можно использовать команду

nohup dd if=dev/zero of=/dev/sda bs-4k &

Если упрощенно, то команда nohup убирает вывод информации на экран и отправляет ту информацию, которую команда выводит на экран в файл /home/имя пользователя/nohup.out или /root/nohup.out, если мы работает от пользователя root. Это позволяет нам не прекратить работу команды в случае обрыва связи. Знак амперсанда (&) в конце команды запустит команду в фоновом режиме, что позволит продолжить работать с системой не дожидаясь окончания работы команды.

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

fdisk /dev/sda

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

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

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

reboot (или shutdown –r now)

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

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



Раздел 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

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

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

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

Articles

Change theme settings