Мотивация

В своё время, когда я начинал свой путь в мир открытого ПО с FreeBSD, мне очень понравилась концепция "собери все сам", она позволяет вскрыть новые пласты знаний и получить драгоценный опыт. Перейдя, в своё время, на Ubuntu я был несколько разочарован. Все тонкости умело скрыты ребятами из Canonical, которые превратили Linux в настольную систему для домохозяек, почти что не толкающую к изучению чего-то нового. Сразу пришло решение поставить Gentoo (учитывая предыдущий опыт). Страх перед тем фактом, что система, во время "учебы" будет находится в полу-рабочем состоянии останавливал от удаления Ubuntu с ноутбука. Кроме того, машинку периодически использует жена. Ставить Gentoo в виртуальную среду - половинчатое счастье. Решено поселить двух пингвинов на одной машинке. Причём сделать это надо таким образом, чтобы в один прекрасный момент можно было бы легко и не принужденно снести Ubuntu, оставшись с Gentoo. Это наталкивает нас на то, что пингвинам придется совместно использовать загрузочный раздел, подкачку и домашние директории, тем не менее иметь собственные ядра (chroot отпадает). Конечно же при таком тесном соседстве мы наткнёмся на некоторые грабли, но это временное решение, поэтому можно потерпеть...

Итак, засучив рукава, приступаем к реализации намеченного плана...

Структура диска

Начну с выделения места для нового пингвина. Загружаюсь с какого-нибудь загрузочного диска с Linux'ом на борту. Воспользовавшись любимым потрошителем разделов (у меня это gparted), выделяю раздел под Gentoo и выношу домашние разделы. Следует отметить, что загрузочный раздел должен быть выделен основным. Остальные могут располагаться в расширенном.

gparted screenshot
  • boot - загрузчик grub2 и ядра операционных систем
  • swap - раздел подкачки
  • ubuntu - место жительства Ubuntu
  • gentoo - место жительства Gentoo
  • home - домашние директории
note:Следует разделять сам загрузчик и набор скриптов и приложений по его настройке. В разделе boot должен быть расположен сам загрузчик, а пакеты для настройки у Ubuntu и Gentoo будут свои, так как, вообще говоря, у нас может не быть бинарной совместимости между этими системами.

Настройка Ubuntu

Сначала настрою Ubutnu, чтобы она могла корректно работать в изменившихся условиях. Монтирую куда-нибудь ubutnu-раздел, правлю /etc/fstab и настройки grub2

Получаю UUID соответствующих разделов:

mkdir /mnt/ubutnu
mount /dev/disk/by-label/ubuntu /mnt/ubutntu
ls -l /dev/disk/by-uuid
ls -l /dev/disk/by-label
nano -w /mnt/ubuntu/fstab

Вношу изменения в fstab:

# /etc/fstab: static file system information.
# Note: using noatime (SSD)
# <file system>                            <mount point>  <type>  <options>                  <dump>  <pass>
proc                                       /proc          proc    nodev,noexec,nosuid        0       0
UUID=aec1d4c6-8332-46b8-a024-244e5fa90df4  /boot          ext4    rw,noatime                 0       0
UUID=e12efc8c-8057-4a14-bdf0-448e26437e77  /              ext4    errors=remount-ro,noatime  0       1
UUID=85b9d2ba-32a8-4172-89b8-7714eaf04dfe  none           swap    sw                         0       0
UUID=f521ab66-3544-4d7e-b5d7-65cec1ec1172  /home          ext4    rw,noatime                 0       1

Монтирую /dev и /proc и chroot'юсь в Ubuntu

mount -t proc none /mnt/ubuntu/proc
mount --rbind /dev /mnt/ubuntu/dev
chroot /mnt/ubuntu

В Ubuntu уже стоит grub2 (скрипты настройки). Монтирую boot раздел во временную директорию, устанавливаю в него загрузчик.

note:Следует отметить, что данная операция изменяет MBR диска. Это значит, что если грузится с данного диска, будет запущен вновь установленный загрузчик.
mkdir /media/boot
mount /dev/disk/by-label/boot /media/boot
grub-install --boot-directory=/media/boot /dev/sda

В раздел boot копирую ядра, которые я бы хотел загружать. Папка /boot в Ubuntu мне уже не понадобится. Её можно удалить. На её место будет монтироваться boot раздел.

cp /boot/vmlinuz-3.0.0-14-generic \
   /boot/vmcoreinfo-3.0.0-14-generic \
   /boot/System.map-3.0.0-14-generic \
   /boot/initrd.img-3.0.0-14-generic \
   /boot/abi-3.0.0-14-generic \
   /boot/config-3.0.0-14-generic \
   /boot/memtest86+.bin \
   /boot/memtest86+_multiboot.bin \
   /media/boot/
mv /boot /boot.old
mkdir /boot
umount /media/boot
mount /dev/disk/by-label/boot /boot
note:Не забываем проверить, наличие в /boot директории grub, с модулями, которые могут понадобится для успешной загрузки. Такие как модуль файловой системы и проч.

Пересоздаю файл конфигурации

update-grub

Теперь перезагружаюсь в Ubuntu. В ней уже имеются настройки, которые я бы хотел перенести в Gentoo, работает сеть и вообще уютно.

note:Если ваш домашний раздел зашифрован. Его следует переносить с помощью соответствующего скрипта ecryptfs-migrate-home

Установка Gentoo

Процесс установки отлично описан в документации, нам надо лишь слегка видоизменить его. Скачиваю свежий дистрибутив Gentoo - stage3 и распаковываю в gentoo раздел. Также скачиваем и распаковываем portage

tar xvjpf stage3-*.tar.bz2
tar xvjf /mnt/gentoo/portage-latest.tar.bz2 -C /mnt/gentoo/usr

Правим /mnt/gentoo/etc/fstab

# /etc/fstab: static file system information.
# Note: using noatime (SSD)
# <file system>                            <mount point>  <type>  <options>                    <dump>  <pass>
proc                                       /proc          proc    nodev,noexec,nosuid,noatime  0       0
UUID=aec1d4c6-8332-46b8-a024-244e5fa90df4  /boot          ext4    rw,noatime                   0       0
UUID=fb1da555-69f3-48b5-9fd8-240f245ac995  /              ext4    errors=remount-ro,noatime    0       1
UUID=85b9d2ba-32a8-4172-89b8-7714eaf04dfe  none           swap    sw,noatime                   0       0
UUID=f521ab66-3544-4d7e-b5d7-65cec1ec1172  /home          ext4    rw,noatime                   0       1

Вопрос пересборки ядра откладываю - он требует более пристального рассмотрения. Просто воспользуюсь рабочим ядром Ubuntu. В идеале надо бы переписать файлы конфигурации grub2, расположенные в /etc/grub.d Но пока что руки до этого не дошли. Просто вручную пишу конфигурацию /boot/grub/grub.cfg сохраняю копию где-нибудь, чтобы восстановить, если нагрянет update-grub. Ещё можно добавить нужные пункты загрузки в /etc/grub.d/40_custom.

# /boot/grub/grub.cfg

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
set default="0"
if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function recordfail {
  set recordfail=1
  if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}

function load_video {
  insmod vbe
  insmod vga
  insmod video_bochs
  insmod video_cirrus
}

insmod part_msdos
insmod ext2
set root='(hd0,msdos7)'
search --no-floppy --fs-uuid --set=root e12efc8c-8057-4a14-bdf0-448e26437e77
if loadfont /usr/share/grub/unicode.pf2 ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  insmod part_msdos
  insmod ext2
  set root='(hd0,msdos1)'
  search --no-floppy --fs-uuid --set=root aec1d4c6-8332-46b8-a024-244e5fa90df4
  set locale_dir=($root)/grub/locale
  set lang=ru_RU
  insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ]; then
  set timeout=-1
else
  set timeout=3
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30; then
  clear
fi
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
if [ ${recordfail} != 1 ]; then
  if [ -e ${prefix}/gfxblacklist.txt ]; then
    if hwmatch ${prefix}/gfxblacklist.txt 3; then
      if [ ${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
export linux_gfx_mode
if [ "$linux_gfx_mode" != "text" ]; then load_video; fi
menuentry 'Ubuntu, с Linux 3.0.0-14-generic' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        set gfxpayload=$linux_gfx_mode
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set=root aec1d4c6-8332-46b8-a024-244e5fa90df4
        linux   /vmlinuz-3.0.0-14-generic root=UUID=e12efc8c-8057-4a14-bdf0-448e26437e77 ro   quiet splash vt.handoff=7
        initrd  /initrd.img-3.0.0-14-generic
}
menuentry 'Ubuntu, с Linux 3.0.0-14-generic (режим восстановления)' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set=root aec1d4c6-8332-46b8-a024-244e5fa90df4
        echo    'Загружается Linux 3.0.0-14-generic ...'
        linux   /vmlinuz-3.0.0-14-generic root=UUID=e12efc8c-8057-4a14-bdf0-448e26437e77 ro recovery nomodeset
        echo    'Загружается начальный ramdisk ...'
        initrd  /initrd.img-3.0.0-14-generic
}
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set=root aec1d4c6-8332-46b8-a024-244e5fa90df4
        linux16 /memtest86+.bin
}
menuentry "Memory test (memtest86+, serial console 115200)" {
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set=root aec1d4c6-8332-46b8-a024-244e5fa90df4
        linux16 /memtest86+.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###

### BEGIN /etc/grub.d/30_os-prober ###
menuentry "Gentoo" --class gnu-linux --class gnu --class os {
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        linux /gentoo-2.6.38-tuxonice root=/dev/sda6 resume=swap:/dev/sda1
}
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

Перезагружаюсь в Gentoo. Welcome home. Теперь начинается самое интересное ...


Comments

comments powered by Disqus