Wiki

Clone wiki

comp-house.repo / grub2-on-lvm-on-raid-on-gpt

1.Разметка диска с помощью parted

Для начала создаем разметку диска в gpt вместо устаревшей msdos

parted /dev/sda 
mklabel gpt  

В пазметке gpt нет места для размещения загрузчика, поэтому необходимо явно создать раздел под него. Для определенности, так и назовем его - "grub". Места под загрузчик надо немного, так что 1 дорожки будет достаточно. Чтобы grub2 смог найти свой раздел, необходимо поднять на нем флаг "bios_grub":

mkpart grub ext2 1 2
set 1 bios_grub on

Затем можно размечать диск под данные и систему. В данном случае есть винчестера, и мои задачи требуют, чтобы я использовал два раида - надежное зеркало под систему и быстрый стрип для обработки рабочих данных.

mkpart system ext2   2 200G 
set 2 raid on
mkpart tmp ext2   200G -1 
set 3 raid on

И второй винчестер /dev/sdb с аналогичной разметкой, чтобы винчестеры были полностью взаимозаменяемы и проще было разбираться с разметкой раидов в случае поломок:

parted /dev/sdb 
mklabel gpt
mkpart grub ext2 1 2
set 1 bios_grub on
mkpart system ext2   2 200G 
set 2 raid on
mkpart tmp ext2   200G -1 
set 3 raid on

В итоге диски в глазах parted выглядят следующим образом:

[root@localhost ~]# parted /dev/sda print
Модель: ATA ST3250820AS (scsi)
Диск /dev/sda: 250GB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: gpt

Номер  Начало  Конец   Размер  Файловая система  Имя     Флаги
 1     1049kB  2097kB  1049kB                    grub    bios_grub
 2     2097kB  200GB   200GB                     system  raid
 3     200GB   250GB   50,1GB                    tmp     raid

[root@localhost ~]# parted /dev/sdb print
Модель: ATA ST3250620AS (scsi)
Диск /dev/sdb: 250GB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: gpt

Номер  Начало  Конец   Размер  Файловая система  Имя     Флаги
 1     1049kB  2097kB  1049kB                    grub    bios_grub
 2     2097kB  200GB   200GB                     system  raid
 3     200GB   250GB   50,1GB                    tmp     raid

За что мы любим gpt, в любом случае получается простая плоская таблица, в которой может быть больше 4 разделов и каждый раздел имеет не только номер, но и вменяемое имя, а внутри себя еще и точный UUID. Флаги raid необязательны, но упрощают автоопределение своего содержимого, а флаг bios_grub, как мы уже говорили, нужен pагрузчику grub и он-то как раз обязателен.

2.Создаем Raid

В загрузке участвует только системный зеркальный раид - его и создадим.

 mdadm -C /dev/md/system --level 1 -n 2 /dev/sd[ab]2
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md/system started.

mdraid предупреждает, что используется новый суперблок версии 1.2. В этой версии суперблок раида расположен в начале диска, что не позволяет прозрачно использовать его для загрузки, как это было раньше, когда загрузчик мог вообще ничего не зная о раиде просто обращаться к любому из дисков напрямую.

Но grub2 умеет явно грузиться с раида, так что все в порядке, говорим "y" и идем дальше.

3. Создаем LVM

[root@localhost ~]# pvcreate /dev/md/system 
  Physical volume "/dev/md/system" successfully created
[root@localhost ~]#vgcreate system /dev/md/system 
  Volume group "system" successfully created
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  system   1   0   0 wz--n- 186,26g 186,26g
[root@localhost ~]# lvcreate -L 50G -n root system
  Logical volume "root" created
[root@localhost ~]# lvcreate -L 200g -n home system
  Insufficient free extents (34882) in volume group system: 51200 required
[root@localhost ~]# lvcreate -l 34882  -n home system
  Logical volume "home" created
[root@localhost ~]# lvs 
  LV   VG     Attr   LSize   Origin Snap%  Move Log Copy%  Convert
  home system -wi-a- 136,26g                                      
  root system -wi-a-  50,00g                                      

4. Ставим систему

Лично я в бесконечном стремлении упрстить свою жизнь просто копирую образ файловой системы, который лежит в подходящем исошнике live-cd федоры.

[root@localhost ~]#dd if=/home/avl/network/fw/ext3fs.img of=/dev/system/root
6291456+0 записей считано
6291456+0 записей написано
 скопировано 3221225472 байта (3,2 GB), 397,584 c, 8,1 MB/c

[root@localhost ~]# resize2fs /dev/system/root 
resize2fs 1.41.10 (10-Feb-2009)
Please run 'e2fsck -f /dev/system/root' first.

[root@localhost ~]# fsck -f /dev/system/root 
fsck from util-linux-ng 2.17.2
e2fsck 1.41.10 (10-Feb-2009)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
_Fedora-16-x86_6: 71697/196608 files (0.2% non-contiguous), 502914/786432 blocks

[root@localhost ~]# resize2fs /dev/system/root 
resize2fs 1.41.10 (10-Feb-2009)
Resizing the filesystem on /dev/system/root to 13107200 (4k) blocks.
The filesystem on /dev/system/root is now 13107200 blocks long.

5. Ставим grub

Начиная с fedora 16 grub2 уже установлен в системе.

Все, что нужно, это скопировать модули в стандартное место

cp /usr/lib/grub2/i386-pc/* /boot/grub2/

сгенерировать и почистить меню grub.cfg

grub2-mkconfig -o /boot/grub2/grub.cfg 

Теперь самое сложное, создать образ загрузчика. Дело в том, что grub2 имеет модульную структуру и поэтому для создания образа нам необходимо подобрать последовательность загрузки модулей, после прохождения которой будет доступен каталог /boot/grub2 .

Логика подбора последовательности проста:

  1. грузим модуль biosdisk, чтобы добраться до дисков.
  2. грузим part_gpt чтобы добраться до разделов gpt на дисках
  3. грузим mdraid1x чтобы добраться до содержимого раидов
  4. грузим lvm чтобы увидеть логические тома
  5. грузим ext2, поскольку /boot вместе с корешком у нас отформатированы в ext4
  6. грузим normal, который грузит и исполняет /boot/grub2/grub.cfg

Все, это минимум, необходимый для доступа груба к своим модулям в /boot/grub2/*.mod и автоматического показа меню сгенереного на лету скриптом /boot/grub2/grub.cfg.

Остальные модули можно грузить уже вручную командой insmod.

На самом деле, проще всего отладить эту последовательность, сделав загрузку по сети. В этом случае в образе будет только один модуль pxe. А затем загрузившись, можно экспериментировать с загрузкой модулей. Очень удобный режим, учитывая тот факт, что модули можно загрузить только один раз и выгрузки их тоже не предусмотрено, так что загрузив даже правильные модули в неверной последовательности, например, сначала lvm, а затем raid, мы не получим ничего, поскольку на момент инициализации модуля lvm партиции с ним будут недоступны.

Короче говоря, создаем образ загрузчика:

grub2-mkimage  -O i386-pc --prefix='(system-root)/boot/grub2' --output=/boot/grub2/core.img biosdisk part_gpt mdraid1x lvm  ext2  normal configfile linux  boot 

И устанавливаем его на оба диска, поскольку мы же хотим, чтобы они были взаимозаменяемы?

[root@localhost grub2]# grub2-setup '(hd0)'
[root@localhost grub2]# grub2-setup '(hd1)'

Отображение грубовской нотации дисков (hd0) и (hd1) на реальные диски прописано в файле /boot/grub2/device.map. Этот файл автоматически создается командой grub2-menuconfig.

[root@localhost grub2]# cat /boot/grub2/device.map 
(hd0)	/dev/disk/by-id/ata-ST3250820AS_9QE0M7AX
(hd1)	/dev/disk/by-id/ata-ST3250620AS_3QE0EV4D

Все, можно перезагружаться и смотреть, что там и как там.

Для отладки опять таки очень удобно использовать pxe-загрузку с тем же grub2. Это позволит грузиться в систему вообще не используя загрузчик на жестком диске и тестировать разные конфигурации.

PS

Fedora 17 has rename grub-setup to grub-bios-setup.

Updated