от Иво Гелов(26-01-2008)

рейтинг (10)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

Настоящата статия не е изчерпателно ръководство по темата, а просто споделен опит.
Не претендирам, че съм познавач и специалист в областта.

ИСТОРИЯ
Сървърът, за който се грижа има 2 твърди диска, които са конфигурирани като софтуерен RAID-1 масив.
Потребителите ми имат доста голям поток от входящи и изходящи писма, и естеството на работа е такова,
че те трябва да са постоянно налични. Поради тези фактори, файловата система започна все по-бързо да се запълва.
Прецених, че ще бъде по-добре да направя Upgrade сега и да не чакам до последния момент.
Тъй като сървърът ми е с кутия 1U (за монтаж в шкаф) - в нея има място само за 2 диска, и вариантът за добавяне
на още дискове отпадна. Ровейки се в GOOGLE, попаднах на статии за 2 други варианта:

1. Увеличаване на размера на нужните раздели (partitions) върху нови дискове
2. Добавяне на нови раздели - или като ново RAID устройство, или като част от LVM

Идеята за LVM ми се стори изключително перспективна и скалируема.
До сравнително неотдавна беше невъзможно софтуерните RAID масиви да се разделят на дялове, както физическите
устройства - тоест, веднъж създаден от изходните физически дялове, RAID масивът винаги си остава с размера на
най-малкия от съставящите го раздели (в новите ядра това вече е възможно, но не зная до каква степен е тествано).
LVM (Logical Volume Management) решава този проблем, като се явява междинно звено между физическите дялове и RAID масива.
Тоест - с LVM можем динамично да обединяваме дялове в една логическа група (Volume), която след това се използва като
база за създаване на RAID масив. Повече информация може да се открие тук
http://www.gagme.com/greg/linux/raid-lv...
http://www.open-organizations.org/view/...
http://www.linux.com/base/ldp/howto/Sof...
http://www.debian-administration.org/ar...
На мен обаче този вариант ми се стори по-сложен (макар и по-хубав), а пък просто трябваше да си реша проблема
(не задължително по най-елегантния начин). Тепърва да започвам да си правя експерименти със сървъра беше недопустимо.
Избрах средния вариант - увеличаване на размера на запълващият се раздел върху нови дискове.

ИЗХОДНИ ДАННИ
Два SATA диска по 120 GB със следните дялове:
+-----------+-----------+----------+----------+----------+----------+
| SATA - 0  | SATA - 1  | RAID - 1 | Тип дял  | Bootable | Монтиран |
+-----------+-----------+----------+----------+----------+----------+
| /dev/sda1 | /dev/sdb1 | /dev/md0 | Primary  |    Да    | /boot    |
+-----------+-----------+----------+----------+----------+----------+
| /dev/sda2 | /dev/sdb2 | /dev/md1 | Primary  |          | /        |
+-----------+-----------+----------+----------+----------+----------+
| /dev/sda3 |           |          | Primary  |          | Swap     |
+-----------+-----------+----------+----------+----------+----------+
|           | /dev/sdb3 |          | Primary  |          | Swap     |
+-----------+-----------+----------+----------+----------+----------+
| /dev/sda4 |           |          | Extended |          |    -     |
+-----------+-----------+----------+----------+----------+----------+
|           | /dev/sdb4 |          | Logical  |          |    -     |
+-----------+-----------+----------+----------+----------+----------+
| /dev/sda5 | /dev/sdb5 | /dev/md3 | Logical  |          | /var     |
+-----------+-----------+----------+----------+----------+----------+
| /dev/sda6 | /dev/sdb6 | /dev/md2 | Logical  |          | /usr     |
+-----------+-----------+----------+----------+----------+----------+
| /dev/sda7 |           |          | Logical  |          | /tmp     |
+-----------+-----------+----------+----------+----------+----------+
|           | /dev/sdb7 |          | Logical  |          | /var/tmp |
+-----------+-----------+----------+----------+----------+----------+

ПЛАН за РЕШЕНИЕ на ЗАДАЧАТА
Съставих си план от следните точки:

1. Създаване на раздели върху новите дискове, които да са големи или точно колкото съществуващите раздели,
или съвсем малко по-големи (изключение прави раздела за /var - защото тъкмо него трябваше да разширявам;
него го направих толкова голям, колкото позволяваше свободното пространство на диска) и в АБСОЛЮТНО същата
последователност (при друга последователност просто щях излишно да си утежня живота, без да спечеля нищо)

2. Ръчно деградиране на RAID масивите - логическо извеждане на втория диск от масива

3. Подмяна на стария диск SATA-1 с нов (естествено при изключена машина)

4. Задаване на типове на разделите (тази стъпка ми е необходима, понеже щях да създам разделите на новите
дискове с PartitionMagic под ДОС, вместо с fdisk под Linux - а пък PartitionMagic не може да съзвада раздели
от тип Linux Autodetect Software RAID)

5. Ръчно включване на новия диск в съществуващите RAID масиви - масивът се самосинхронизира, като копира
данните от стария диск SATA-0 на новия SATA-1

6. Временно забраняване на автоматичното монтиране на "/var" - това е необходимо, защото промяната на размера
на файловата система с resize2fs може да се осъществи само ако разделът не се използва в момента. А пък
промяната (увеличението) на файловата система се налага, защото при създаването на новия RAID масив от
новите по-големи раздели не води до АВТОМАТИЧНО увеличаване на файловата система ext3

7. Тук теоретично следва да се направи ръчно деградиране на RAID масивите, за да се изведе този път първия диск,
само че аз в бързината пропуснах тази стъпка - за мое щастие това не доведе до злощастни последици

8. Подмяна на стария диск SATA-0 с нов (пак при изключена машина)

9. Стартиране в еднопотребителски режим - за да не се стартират автоматично всички обичайни сервизи (SSH, Postfix,
Apache, MySQL и т.н.)

10. Отново задаване на типове на разделите

11. Ръчно включване на новия диск в RAID масивите - тук се натъкнах на подводен камък, въпреки че точно следвах
инструкциите в една от статиите в GOOGLE (http://www.steveglendinning.com/2007/10...)
Проблемът беше, че resize2fs просто не свърши нищо - със съобщение от рода "Nothing to grow". Разбрах защо,
едва след като разгледах параметрите на RAID масивите (mdadm --detail /dev/md3) - Array size и Device Size си бяха
със старите стойности (съответстващи на старите дискове).
Поблъсках си главата около час, прерових MAN страниците на MDADM (програмата за обслужване на RAID масиви) и
накрая стигнах до следното заключение:

Въпреки, че е откопиран върху по-големи от оригиналния размер раздели - RAID масивът си остава със същата големина,
с каквато е създаден навремето от по-малките раздели. С простото създаване на нов RAID масив (този път от новите
раздели) той вече беше с необходимия увеличен размер. И сега resize2fs сработи.

12. Възстановяване на автоматичното монтиране на "/var", и промяна на правата на "/tmp" и "/var/tmp" на 0777 (тъй като
ги форматирах от името на ROOT потребителя)

13. Настройване на GRUB да зарежда и от SATA-1, ако случайно SATA-0 сдаде багажа. Тъй като GRUB е настроен да стартира
от (hd0), а пък в "/boot/grub/device.map"е описано, че "/dev/sdb" съответства на (hd1) - следвайки инструкциите от
http://grub.enbug.org/MirroringRAID
настроих GRUB да зарежда и от втория диск.

ДЕТАЙЛИ
Следва описание на стъпките от гореописания план с повече подробности.

1. Предполагам, че с PartitionMagic би се справил всеки Linux потребител

2. Деградиране на масивите

mdadm --fail /dev/md0 --remove /dev/sdb2
mdadm --fail /dev/md1 --remove /dev/sdb1
mdadm --fail /dev/md2 --remove /dev/sdb6
mdadm --fail /dev/md3 --remove /dev/sdb5
swapoff /dev/sdb3

Последната команда за спиране на SWAP устройството (аз имах 2) просто я видях в една от статиите в Интернет. Мисля,
че дори да липсва - това няма да повлияе на цялата процедура.

4. Задаването на типове за разделите става с команда "t" на fdisk - съответно с FD се маркират разделите, които ще
участват в бъдещите RAID масиви; с 83 се маркират двата Linux-native дяла (за /tmp и /var/tmp - sda7 и sdb7);
с 5 маркирах Extended дяла, понеже PartitionMagic го беше създал като тип 4 (не съм се замислял дали Linux щеше да
работи при тип 4 - просто на старите дискове беше тип 5, затова го направих така и при новите)
Форматирах /sdb7 като ext3 файлова система - команда "mke2fs -j /dev/sdb7"

5. Ръчно добавяне на новия диск в RAID масивите

mdadm /dev/md0 --add /dev/sdb2
mdadm /dev/md1 --add /dev/sdb1
mdadm /dev/md2 --add /dev/sdb6
mdadm /dev/md3 --add /dev/sdb5

Тъй като това обикновено са бавни команди, и се изпълняват на заден план (background) - няма смисъл да ги пускате
всички наведнъж, по-добре е да се изчаква всяка от тях да завърши. Това се проверява периодично с командата
"cat /proc/mdstat" - за съответния масив трябва да пише [2/2] [UU]

md1 : active raid1 sdb1[0] sda1[1]
     128384 blocks [2/2] [UU]

6. Закоментирах редa в /etc/fstab за монтирането на /var

8. Изключих сървъра, извадих /dev/sda, на негово място сложих току-що записания 500 GB диск, а вместо /dev/sdb
сложих втория (все още празен) 500 GB диск

9. Включих сървъра в еднопотребителски режим. За GRUB това се прави по следния начин:

а) по време на началното зареждане се натиска произволен клавиш
б) в резултат се появява менюто за избор на ядро
в) със стрелките се избира желаното ядро (моето беше SMP)
г) натиска се клавиш "е", появяват се параметрите за зареждане на ядрото
д) със стрелките се отива на реда, на който е посочено ядрото
      kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/md0
е) натиска се отново клавиш "e", за да влезе в режим на редактиране
ж) накрая на реда се добавя интервал и думата "single" (или само "s")
з) натиска се ENTER, за да излезе от режим на редактиране
и) натиска се клавиш "b", за да започне зареждане на избраното ядро

Тази промяна важи само веднъж, до следващия рестарт - защото GRUB не е записал настройките в конфигурационния си файл.
При стартирането се появяват грешки, че липсват директории /var/lib и /var/run, но може смело да се игнорират.

11. Ръчно добавяне на новия диск в RAID масивите

mdadm /dev/md0 --add /dev/sdb2
mdadm /dev/md1 --add /dev/sdb1
mdadm /dev/md2 --add /dev/sdb6

Нарочно не написах последната команда "mdadm /dev/md3 --add /dev/sdb5", защото както обясних по-горе това се оказа
подводен камък. Правилната поредица от команди е

mdadm --stop /dev/md3
mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/sd[ab]5

Последната команда е най-важна в цялото това упражнение, защото без нея resize2fs няма да може да
свърши нищо - RAID масивът си остава със старата големина, въпреки че се намира в нов и по-голям раздел.
Изпълнението й е доста бавно, за разлика от "mdadm --add" - 132 минути срещу 26 минути.
След като всички RAID масиви бяха синхронизирани, изпълних командата "resize2fs /dev/md3".
Точно заради нея по-горе закоментирах монтирането на /var в /etc/fstab. При първото й изпълнение тя поиска да
пусна "e2fsck -f /dev/md3" - направих го.

12. Махнах коментара за монтирането на /var от /etc/fstab, промених правата на /tmp и /var/tmp да бъдат 0777 и рестартирах

13. Настройка на GRUB за дуално стартиране от кой да е диск (sda или sdb)
От командният ред се изпълнява команда grub, с която влизаме в нещо като елементарен BASH шел и се изпълнява следната
поредица команди:

device (hd0) /dev/sdb
root (hd1,0)
setup (hd1)
quit

Сега GRUB е инсталиран на двата диска, и sdb е насочен към (hd0).

Готово - df би трябвало да показва, че /var е с новата големина.


<< Конвертиране на видеофайлове в 3gp формат | >>