Gentoo на LVM (grub2 корневая файловая система на lvm2)
Попался мне в руки хороший новенький жесткий диск, на старом к тому времени уже заканчивалось место, появились сбойные сектора как раз на месте свопа и трещал он на весь кабинет. Уже не в первый раз подумал о переезде на новый диск. Чтобы во многом облегчить себе жизнь в будущем и чтобы вопроса переезжать-не_переезжать в дальнейшем не возникало, решил не мелочиться и ставить систему сразу на LVM. Конечно возникли вопросы, инфу в инете пришлось собирать по крупицам, а в результате оказалось все не так уж сложно, так что решил написать хауту.
LVM, в первую очередь, - это возможность воткнуть любой дополнительный носитель и выдернуть старый, т.е. возможность как угодно менять носители под вашей файловой системой без перезагрузки и остановки + возможность создавать мгновенные снапшоты.
А дело было на Gentoo.
Во-первых, нужно было вкомпилить поддержку lvm в ядро, что для меня проблем не составило. Во-вторых, выяснилось, что загрузиться с lvm с моего grub-legacy не получится, только с grub2 или lilo. Немного заморочек с созданием lvm и установкой-настройкой grub2 и... В третьих, выяснилось, что даже загрузившись ядро не способно примонтировать коренвую файловую систему с lvm, нужен initram с загрузочным скриптом и утилитками. Обо всем по порядку...
Содержание |
Собираем ядро
Собираем, разумеется, вручную, как настоящие гентушники. Я пользуюсь безмодульным ядром, что немного облегчает жизнь.
cd /usr/src/linux make menuconfig
Вот основное что нужно пометить:
Device Drivers --->
[*] Multiple devices driver support (RAID and LVM) --->
[*] Device mapper support
[*] Snapshot target
И не забудьте вкомпилить поддержку вашей будущей файловой системы. Я, например, решил попробовать ext4. Ну дальше
make
и устанавливаете и грузитесь как обычно. Поддержка LVM в ядре нам понадобится уже для того чтобы его хотябы создать.
Создаем LVM
Если вы еще ничего не знаете об LVM, то сейчас, наверное, стоит поискать о нем подробную информацию в интернете.
Чтобы было куда поставить загрузчик, для начала придется создать таблицу разделов. Если загрузчик будет стоять на другом диске, то этот этап можно будет пропустить. Запускаем fdisk, если что - жмем m и смотрим справку.
fdisk /dev/sdb
Все что мне нужно было от таблицы разделов - это ее наличие. Иначе grub2 ругается и ставиться отказывается. Все свободное место я поместил в единственный раздел, который будет входить в мою группу томов.
Чтобы добавить раздел в группу томов, нужно проинициализировать его как физический том.
pvcreate /dev/sdb1
Дальше создаем группу томов, пока состоящую из единственного только что созданного физического тома.
vgcreate vg_main /dev/sdb1
Создаем логический том, мне пока хватит 100 гигов.
lvcreate --size 100G --name lv_root vg_main
Чтобы наш том появился в /dev активируем наш логический том.
lvchange -a y vg_main/lv_root
Теперь появилось блочное устройство /dev/mapper/vg_main-lv_root . Отформатируем его в нужную файловую систему.
mkfs.ext4 /dev/mapper/vg_main-lv_root
Ну вот, LVM готов, можно на него переезжать.
Переносим старую систему
Чтобы не возникло неожиданных проблем при копировании, я решил загрузиться с LiveCD и скопировать систему в неактивном состоянии. Тут понадобится достаточно продвинутый LiveCD с поддержкой ваших фс и LVM. Мне подошел для этих целей LiveDVD Ubuntu 9.04, правда пришлось доставить пакет lvm2, приятно удивило что с этим не возникло никаких проблем.
apt-get install lvm2
Активируем наш LMV.
lvchange -a y vg_main/lv_root
Создаем точки монтирования.
mkdir /mnt/{old,new}
И монтируем наши старую и новую файловые системы. Тут главное не забыть примонтировать все используемые разделы. Так у меня например /boot был на отдельном разделе.
mount /dev/sda3 /mnt/old/ mount /dev/sda1 /mnt/old/boot/ mount /dev/mapper/vg_main-lv_root /mnt/new/
Копируем все с сохранением всех атрибутов.
cp -r --preserve=all /mnt/old/* /mnt/new/
Создаем initramfs
Initram был придуман для того чтобы подготовить среду для работы ядра. Это небольшой заархивированный образ файловой системы, содержащий скрипты инициализации и минимальный набор ПО для инициализации устройств и запуска скриптов и динамические библиотеки для них. Как правило это busybox, lvm, dmadm, динамические библиотеки для них и init скрипт.
Долго искал как же создать initram, узнал много нового и интересного о том как он устроен. Рекомендую тоже хотя бы в общих чертах ознакомиться. Уже хотел было создавать initram вручную, но почти случайно узнал что создать его может всем известный genkernel. С ним все оказалось элементарно.
genkernel --lvm initramfs
Да еще и нашлась поддержка тем fbsplash, для которой я тоже давным-давно создал свой старый initram каким-то хитрым способом.
genkernel --lvm --splash=emergence initramfs
Ставим grub2
grub2 на момент написания был замаскирован. Размаскировываем его.
echo "=sys-boot/grub-1* **" >> /etc/portage/package.keywords
Я сделал это так, чтобы не размаскировывался сверхновый grub-9999. Теперь активируем возможность одновременной установки grub-legacy и grub2, на случай, если что-то пойдет не так.
echo "sys-boot/grub multislot" >> /etc/protage/package.use
Устанавливаем и приступаем к настройке.
emerge grub
grub2 ориентирован на динамическое формирование конфига с помощью скриптов из /etc/grub.d/. Имеющиеся скрипты для гентушника вряд ли составят рабочий конфиг, однако grub-mkconfig полезные подсказки таки может выдать. Я не стал писать скрипт, выводящий то, что я и так могу написать сам и с чистой совестью на основе вывода grub-mkconfig стал править /boot/grub/grub.cfg вручную. Если отбросить все заморочки со скриптами, то новый формат файла не намного сложенее чем у старого grub-а. Вот что у меня получилось.
set default=0
set timeout=5
menuentry "Gentoo GNU/Linux, with Linux 2.6.31-gentoo-r6-lvm" {
insmod lvm
insmod ext2
set root=(vg_main-lv_root)
search --no-floppy --fs-uuid --set ba2017c8-9c21-48ee-ac65-f26fb4ec2a07
linux /boot/kernel-2.6.31-gentoo-r6-lvm dolvm root=/dev/ram0 real_root=/dev/mapper/vg_main-lv_root init=/linuxrc video=uvesafb:1024x768-16,mtrr:3,ywrap splash=verbose,t$
initrd /boot/initramfs-genkernel-x86_64-2.6.31-gentoo-r6-lvm
}
Замените UUID раздела "ba2017c8-9c21-48ee-ac65-f26fb4ec2a07" на ваш, "vg_main-lv_root" на имя вашего логического тома из /dev/mapper/, "insmod ext2" на модуль для вашей корневой фс (ext2, кстати, для всех фс семейства ext). Ну и конечно не забудьте поменять имена пункта меню, ядра и инитрам на свои. Значащие параметры у ядра - "root=/dev/ram0", "init=/linuxrc", "dolvm", "real_root=/dev/mapper/vg_main-lv_root". Остальное специфично для моей конфигурации. В мане по genkernel-у эта ценная информация отсутствует.
- "root=/dev/ram0" - Указывает ядру, что корневая система находится на виртуальном ram-диске, куда будет распакован наш initram.
- "init=/linuxrc" - Указывает ядру, что первым делом с корневой системы, т.е. с нашего initram-а, нужно запустить скрипт linuxrc.
- "dolvm" - Указывает запущенному скрипту linuxrc, что нужно провести инициализацию всех имеющихся логических томов.
- "real_root=/dev/mapper/vg_main-lv_root" - Указывает запущенному скрипту linuxrc, что на самом деле наша корневая система находится на указанном устройстве. Скрипт, сделав все свои дела, монтирует нашу настоящую корневую фс и передает управление скриптам инициализации с нее. Дальше процесс загрузки идет как обычно.
Ну и устанавливаем grub 2.
grub-install /dev/sdb
Ну и полезные ссылки по теме: