TL;DR: автор сокрушается о том, что GRUB не может жить полноценно с LVM и с удивлением открывает, что это отлично умеет заброшенный в 2015 году загрузчик lilo.
MBR?
Мало кто знает и понимает, что MBR по сути своей есть величайшая ошибка человечества. Ну послушайте, ну серьезно, кому в голову пришло смешивать в одном блоке данные, необходимые для загрузки системы и сведения о разделах?
Я еще раз повторю, не надо сейчас мне говорить «так сложилось», а включите логику. MBR ужасна.
Еще ужаснее то, что она пытается исправлять ошибки проектирования костылями. Чтобы избежать идиотского ограничения в 4 раздела в одной MBR-записи нужно предложить концепцию «расширенного» раздела (логически), обманывая и создавая кучу полупустых MBR по всему диску (физически). Опять же, не буду на этом подробно останавливаться, специалисты поймут, остальным неважно.
Еще одна проблема MBR заключается в том, что разделы нельзя просто так увеличивать (ну, кроме последнего). Хотите изменить размер раздела? Ну, это просто — нужно удалить его и заново создать, передвинув его конец. Глубокоуважаемый товарищ amarao запилил прекрасную утилиту ptmax, которая позволяет хоть как-то снять эту боль, но послушайте, еще раз, ведь есть же другой путь!
Отдельным пунктом идет прекрасное поведение загрузчика GRUB с MBR. Ну, поскольку загрузчику мало 446 байт для полноценной жизни, он помещает свой core.img в «зазор» между окончание MBR и началом первого раздела (который предлагается начинать с 1 мегабайта, хотя раньше было ближе).
GPT?
Эээээ, нет. GPT лечит проблему того, что в MBR в одном флаконе собран уж и еж. GPT как бы говорит нам, что теперь нет никаких скрытых областей, куда GRUB будет что-то писать, вот для него отдельный раздел. Отлично. Но куда деваться от того, что разделы все равно нельзя увеличить?
Ну, например, поставил я систему. Выделил под rootfs 32 Гб, а завтра понял, что мне надо 64. И как жить? Что делать? Если я создал после rootfs раздел под swap, то расширение раздела под rootfs выглядит вот так:
1. Выключить swap
2. Снести раздел под swap
3. Изменить размер раздела под rootfs
4. Расширить файловую систему rootfs
5. Создать раздел под swap
6. Включить swap
Все бы хорошо, но если у меня за rootfs создан раздел с данными и передвинуть его я не могу? Ну, тогда нужно страдать.
LVM
О да, вот это уже круто! Ведь тут вопрос разделов вынесен за скобки вообще. Я могу создать сколько угодно разделов и не задумываться о том, как их потом увеличивать. Круто? Да.
Но к сожалению, логика того, что LVM заменяет собой MBR и GPT приходит не ко всем. До сих пор целый ряд подходов системных администраторов косно крутится вокруг логики «давайте создадим раздел на весь диск, а раздел добавим в LVM».
Ну и крутотенюшка заканчивается, когда Вы хотите отказаться от MBR или GPT полностью, а остаться только с LVM.
Попытка с инсталлятором Ubuntu
Note: здесь и далее я буду говорить про Ubuntu, если уважаемое сообщество подскажет, как обстоят дела с этим вопросом в других дистрибутивах, буду рад.
«В чем проблема? Я ж видел даже в инсталляторе Ubuntu строчку про LVM!» — скажет любой, кто устанавливал хоть раз, например, Ubuntu и будет прав.
Да, ну давайте посмотрим, какой ад вариант нам предложит инсталлятор.
Здесь прекрасно все. От мелочей до важного.
Для начала, оцените иронию — под LVM отдан раздел, а не диск. Почему? Я оставлю это на совести тех, кто это придумал. Особый цинизм в том, что раздел расширенный, т.е. на диске будет болтаться два блока с MBR. Окей.
Потом мы оценим обычный раздел /boot. Да, Вы хотите LVM, но у Вас будет и MBR тоже. Почему так? Ну раньше это можно было оправдать тем, что grub не умел эти Ваши LVM, но он давно уже умеет.
Ну и плавно к важному. Никого не смущает, что по сути LVM натягивается, как сова на глобус поверх MBR? Это как понимать? Зачем это вообще?
Да закопайте уже стюардессу
Отказаться от MBR просто — мы же можем отдать целый диск в подчинение LVM? Можем и нужем. Как это сделать из инсталлятора? Увы, никак. Руками. То есть, перед шагом Partition disks нужно переключиться в соседний tty и руками сделать следующее (подразумевается, что диск, куда мы хотим установить систему, зовут /dev/sda):
pvcreate /dev/sda
vgcreate ubuntu /dev/sda
lvcreate -n root -L6G ubuntu
lvcreate -n swap -l100%FREE ubuntu
Тут я отдаю 6 гигабайт на rootfs, оставшееся на swap, изменить по желанию.
Ну и дальше на этапе разбивки диска мы увидим созданные нами разделы, можем распределить, что и куда дальше.
Хьюстон, у нас проблемы
И все будет хорошо, но ровно до этапа установки загрузчика. Инсталлятор предложит установить GRUB. Мы, конечно, согласимся. А что не так?
Напомню, что LVM обычно отступает 1Mb от начала физического носителя. Откуда я знаю? Ну команда
pvs -o +pe_start
покажет это. Что для нас это означает? Первый мегабайт диска свободен, никто не мешает GRUB записать туда свои 446 байт загрузчика, плюс core.img. Вот только без MBR он не сможет это сделать!
Еще раз, я поражаюсь нежности GRUB: тебе дают диск, давай уже, сделай так, чтобы ты оттуда мог грузиться. Ты умеешь LVM, в чем проблема?
Даже попытки вызвать grub-install вручную с параметром -s привели только к тому, что «unable to identify a filesystem in hostdisk//dev/sda: safety check can't be performed».
Воскуривание сырцов открывает жестокую правду: GRUB просто не умеет выполнить инсталляцию самого себя, если нет живого MBR с хотя бы одним разделом.
Лирическое отступление: истинные бойцы с презрением скажут: «Зачем тебе вообще возиться с этим отсталым GRUB? Приходи же в нашу церковь EFI!».
Вообще я согласен, с EFI все гораздо проще, но есть проблема с кучей Legacy машин, которые EFI уметь не будут. То есть, заставить EFI грузиться как BIOS обычно можно, обратное, увы, не всегда выполнимо. А я хочу LVM и мороженку, тьфу, загрузку не только с EFI.
EFI?
В целом, EFI задуман достаточно неплохо. Нет никаких скрытых тебе областей, создай раздел, положи туда загрузчик в виде .efi-файла, 7 строк конфигурации и загружайся.
Нет, подождите. Опять создай раздел? Может быть кто-нибудь догадается в спецификацию EFI добавить поддержку LVM? Пожалуйста?
В качестве выхода, конечно, можно взять небольшую флешку и отформатировать ее в желанный для EFI FAT целиком, без разделов. Уже хлеб, но все равно в системе придется держать два диска, один для EFI, другой целиком под LVM, где уже система.
lilo?
Тут, думаю, раздастся громкий WAT. Да, увы, так оно и есть, это настоящий и серьезный WAT.
Никогда не думали, почему GRUB так монструозен? Потому что обычно он хорошо подходит для сложных ситуаций, когда одну систему мы хотим грузить так, тут хотим опций, там хотим вот этого и тут хотим того. Но минуточку, для системных администраторов, где уже все давно виртуализировано, это обычно нонсенс. Нужно просто загружать систему с минимальной болью.
И что мы выясняем? Что lilo отлично умеет устанавливаться на диск с LVM; умеет /boot в LVM; не требует, чтобы на диске был создан хоть какой-то MBR и замечательно работает на той же Ubuntu 16.04, т.е. пакет есть и он адекватен.
Беда в другом. Разработка lilo прекратилась в конце 2015 года. Ну, с другой стороны, оно умеет все, что надо, чтобы загружать современную систему целиком на LVM.
Заключение
Еще раз, пожалуйста, поймите главный message этой статьи — откажитесь от обычной таблицы разделов. Будь то MBR, будь то GPT, оно Вам не нужно, если есть LVM. Никогда не отдавайте под LVM разделы (кроме тех случаев, когда нужен какой-нибудь извращенный dual-boot с Windows), в этом просто нет смысла.
И давайте вместе надеяться, что когда-нибудь у нас будет поддержка LVM в EFI. А пока будем страдать, тьфу, использовать lilo.
Автор: prometheus_ru