Gentoo на LVM (grub2 корневая файловая система на lvm2)

Материал из E-LUG.Ru Wiki
Перейти к: навигация, поиск


Попался мне в руки хороший новенький жесткий диск, на старом к тому времени уже заканчивалось место, появились сбойные сектора как раз на месте свопа и трещал он на весь кабинет. Уже не в первый раз подумал о переезде на новый диск. Чтобы во многом облегчить себе жизнь в будущем и чтобы вопроса переезжать-не_переезжать в дальнейшем не возникало, решил не мелочиться и ставить систему сразу на 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

Ну и полезные ссылки по теме:

Создание initram

Использование genkernel

Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Инструменты