Сегодня, уважаемые читатели и гости хабра, я поделюсь с вами рассказом о том как я строил свой лунапарк с блекджеком и девушками. Т.е. как я переводил свой
Зачем нужна данная статья?
Так уж сложилось что Leaseweb, наверное, один из самых вредных хостеров, т.к. поставить систему сразу с готовым raid нельзя, по имеющейся у меня информации техподдержка тоже этого не делает. KVM можно взять далеко не для всех серий серверов, да и денег он стоит немаленьких. В итоге, из желания глубже познать linux, я стал разбираться сам в этой теме.
В интернете я находил множество статей как это сделать, но у них было две основных проблемы: для них требуют возможности доступа в BIOS для изменения порядка загрузки (коего у нас нет) или используется GRUB legasy (версии до 1), которые не используется в Debian 7.
Результатом двух недель жизни в гугле, курения мануалов, википедии и множества опытов стала данная инструкция «для чайников».
Данная статья ни в коем случае не является рекламой
Так как на момент решения данной проблемы я сам обладал крайне скромными познаниями в linux, в данной статье я буду стараться рассказать более подробнее процесс перевода работающей системы на raid 1/10 + lvm. В мануале используется разбивка диска с mbr. Работоспособность с GPT не проверялась.
Итак, вводные условия: Есть
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».
Раздел 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.
Ошибки вычитывал, правда на статье такого объема мог что-то и пропустить.
Автор: WolfTheGrey