Хороший заголовок для сіквелу фільму жахів, еге-ж?
У мене тут нещодавно був трьохтижневий марафон із цим клятим софтом. Там пишуть шо він усе вміє, тільки не літає. І що нарешті вміє з рейдів грузитись. Так от, не вірте написаному. Гроб2 писали інженєрішкі, які ні біса не розуміють у програмуванні. Я майже тиждень боровся з такою помилкою:
warn: no signature
error: embedding is not possible, but is required for cross-disk install
Дуже красномовно, еге-ж? Ну прямо одразу все зрозуміло. Як водиться, гугль знає все. Тільки про цю помилку нічого не знає. Точніше вона за законом всесвітньої подлості виникала тільки у бубунтоїдів на бубунтофорумі, а як відомо на бубунтофорумі проблеми не вирішують - вони там або ігноруються або зникають самі.
В результаті пари днів копирсання у grub2 за допомогою gdb (sic!) було встановлено наступне:
1. Цитую із сорсів:
/* TRANSLATORS: cross-disk refers to /boot being on one disk
but MBR on another. */
grub_util_error ("%s", _("embedding is not possible, but this is required for "
"cross-disk install"));
Бачите які негідники?! Чого було не вивести це на екран? Чому я повинен розгрібати їхні говнокоди що зрозуміти що мається на увазі? Одне слово - інженєрішкі.
2. Гроб2 вміє рейд тільки у тому випадку коли таблиця розділів знаходиться ззовні рейду. Тобто, якщо у вас так:
/dev/sda
/dev/sdb
/dev/md0p1
/dev/md0p2
/dev/md0p3
- дулю вам з маком, а не гроб на рейді! Не вміє він такого! І знаєте що значить те саме „no signature“? Воно значить що гроб не зміг знайти MBR! Що по вказаному зміщенню замість сигнатури 0xaa55 знаходиться якесь лайно. Треба робити таблицю розділів тільки ззовні, тоді він схаває:
/dev/sda1, /dev/sda2, /dev/sda3
/dev/sdb1, /dev/sdb2, /dev/sdb3
/dev/md1, /dev/md2, /dev/md3
Тут проблема така: раніше у mdadm була metadata 0.90, і тоді навіть якщо таблицю розділів робити всередині - на RAID1 її було видно ззовні. Це, до речі, дозволяло ставити на рейд класичний гроб, який офіційно рейди не міг. Але починаючи з metadata 1.0 ззовні замість таблиці розділів видно якесь лайно, а гроб тупий. Йому хоч і кажеш шо там рейд - він все одно шукає таблицю розділів.
Зацініть ось ще говнокодець:
for (i = 0; i < 4; i++)
>-------if (mbr.entries[i].flag & 0x7f)
>------- return grub_error (GRUB_ERR_BAD_PART_TABLE, "bad boot flag");
/* Analyze DOS partitions. */
for (i = 0; i < 4; i++)
>-------{
>------- e = mbr.entries + i;
>------- if (!grub_msdos_partition_is_empty (e->type)
>------- && end > offset + grub_le_to_cpu32 (e->start))
>------- end = offset + grub_le_to_cpu32 (e->start);
>------- /* If this is a GPT partition, this MBR is just a dummy. */
>------- if (e->type == GRUB_PC_PARTITION_TYPE_GPT_DISK && i == 0)
>------- return grub_error (GRUB_ERR_BAD_PART_TABLE, "dummy mbr");
>-------}
/* Find an extended partition. */
for (i = 0; i < 4; i++)
>-------{
>------- e = mbr.entries + i;
>------- if (grub_msdos_partition_is_extended (e->type))
>------- {
>------- offset = ext_offset + grub_le_to_cpu32 (e->start);
>------- if (! ext_offset)
>------->-------ext_offset = offset;
>------- break;
>------- }
>-------}
Стрілочками на початку рядків відмічено символи табуляції - на лице мікс стилів! Але вбиває навіть не це. І навіть не лихий пробіл після знаку оклику у останньому if. У них тут 3 (три!) цикли, які роблять абсолютно незалежні речі на одними і тими ж (одними і тими ж!) даними! Інженєрішкі!
А ще я у них там бачив саморобні таблиці віртуальних методів. Капець.
На цей гроб я витратив реально два дні. А на всю задачу (збільшити розділ під дані з 2 Тб до 4 Тб) я убив три тижні. Причому перед тим як приступити я трошки побоювався LVM - воно було абсолютно не знайоме для мене. Але виявилось що саме LVM писали реальні чоткі пацани, а не якісь там задроти. Все по ділу, все працює, на все є прекрасна документація. І просте як сокира. І логічне як сокира. І надійне як та сама сокира. Бо навіть після того як я випадково замочив половину PVs воно без проблем прочухалось. Цим хлопцям треба пам’ятник ставити. А гнутий гроб закопати у лісі - най там гниє! Все одно ера завантажувачів проходить, наступають UEFI.
Не повторюйте моїх помилок.