четверг, 28 января 2010 г.

Неинтерактивная установка RedHat систем на mdraid: решение проблемы с GRUB

Когда сейчас пересматривала свои кикстарты, вспомнила, что сабж просто так не гуглится.

Конструкция вида

bootloader --location=mbr --driveorder=md0

В кикстарте не решает проблему: grub все равно поставится на первый(в нумерации BIOS) диск. то есть загрузчик попадет и на второй, а вот stage2, уже нет.

При вылете диска первого диска, с данными не случается ничего, но система загрузиться не может, а возня в "боевых" условиях с live-cd, особенно с VirtualMedia может быть чревата большими-большими проблемами.

Добавлю, что с Lilo такой проблемы нет, но Lilo уже прошлый век.

Собственно, решением проблемы является режим grub-batch (командный режим работы grub). В кикстарт можно положить вот такой код:

#re-Install grub in mdraid
grub --batch <<EOF
device (hd0) /dev/sda
device (hd1) /dev/sdb
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
EOF


У меня для этого есть специальный snippet cobbler'а(используется у нас как сервер инсталляций):


#re-Install grub in mdraid

##Get system disks lists and types. As default, we use one SATA/SCSI/SAS drive
#set disks = $getVar('$disks', 'sda,sdb')

##Get mdraid level, as default we don't use mdraid
#set raid = $getVar('$raid', '1')

#if $raid == '1'
grub --batch <<EOF
device (hd0) /dev/${disks.split(',')[0]}
device (hd1) /dev/${disks.split(',')[1]}
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
EOF

[.... сюда можно вставить условие для десятого и пятого рейдов...]
#end if


Не забудьте после замены выллетевшего диска установить на новый диск grub!

Так же не забываем, что [b]grub можно ставить только на зеркало (mdraid1)[b], так как BIOS понятия не имеет, что есть md-девайсы, и любой другой типу рейда не сможет загрузиться с одного, выбранного BIOS, рейда.

Если хочется пятый, десятый или шестой рейд под систему (или под /var/lib/mysql какой-нибудь) можно и нужно разбивать диски на неравные части: первые 100-200 мегебайт под зеркало для /boot (в этот md лучше вставить 100Mb куски _всех_ дисков, что бы потом не пытаться вспомнить, какой диск в /boot, а какой нет), а уже оставшуюся часть дисков разметить под нужный тип md. Кстати, никто не запрещает коомбинировать mdraid10 для приложений, часто дергающих диск(например, в геометрическом начале дисков) и mdraid5/6 в остальной части для всего остального

Подробнее см. официальный guide


У меня для зеркала используется такой сниппет (точнее, это кусочек "большого" дискового сниппета):


#set hostnm = $getVar('$system_name')

##Get system disks lists and types. As default, we use one SATA/SCSI/SAS drive
#set disks = $getVar('$disks', 'sda')

[...]

##Get mdraid level, as default we don't use mdraid
#set raidlevel = $getVar('$raid', 'false')

##Get lvm need. Default, we don't use LVM
#set lvm = $getVar('$lvm', 'false')

##Set disk max size
#set disksize = $getVar('$disksize', '452000')

[...]

#else if $st == 'vz' and $raid == '1'


clearpart --all --initlabel
##Creating /boot part
part raid.10 --size 100 --asprimary --ondrive=${disks.split(',')[0]}
part raid.11 --size 100 --asprimary --ondrive=${disks.split(',')[1]}
raid /boot --fstype ext3 --device md0 --level=RAID1 raid.10 raid.11
bootloader --location=mbr --driveorder=md0
zerombr yes

##creating work part
part raid.20 --size $disksize --asprimary --ondrive=${disks.split(',')[0]}
part raid.21 --size $disksize --asprimary --ondrive=${disks.split(',')[1]}

raid pv.01 --fstype ext3 --device md1 --level=RAID1 raid.20 raid.21
##fix to volume group name for include hostname
volgroup $hostnm pv.01
logvol / --fstype=ext3 --vgname=$hostnm --size=3500 --name=root
logvol /home --fstype=ext3 --vgname=$hostnm --size=2000 --name=home
##Create partition to save free space for making snapshots in future
logvol /mnt/4remove --fstype=ext3 --vgname=$hostnm --size=700 --name=4remove
##Create partition to save free space for making snapshots in future
logvol /vz --fstype=ext3 --vgname=$hostnm --size=1 --grow --name=vz
logvol swap --fstype=swap --vgname=$hostnm --recommended --name=swap
[...]