Мотивация
В своё время, когда я начинал свой путь в мир открытого ПО с FreeBSD, мне очень понравилась концепция "собери все сам", она позволяет вскрыть новые пласты знаний и получить драгоценный опыт. Перейдя, в своё время, на Ubuntu я был несколько разочарован. Все тонкости умело скрыты ребятами из Canonical, которые превратили Linux в настольную систему для домохозяек, почти что не толкающую к изучению чего-то нового. Сразу пришло решение поставить Gentoo (учитывая предыдущий опыт). Страх перед тем фактом, что система, во время "учебы" будет находится в полу-рабочем состоянии останавливал от удаления Ubuntu с ноутбука. Кроме того, машинку периодически использует жена. Ставить Gentoo в виртуальную среду - половинчатое счастье. Решено поселить двух пингвинов на одной машинке. Причём сделать это надо таким образом, чтобы в один прекрасный момент можно было бы легко и не принужденно снести Ubuntu, оставшись с Gentoo. Это наталкивает нас на то, что пингвинам придется совместно использовать загрузочный раздел, подкачку и домашние директории, тем не менее иметь собственные ядра (chroot отпадает). Конечно же при таком тесном соседстве мы наткнёмся на некоторые грабли, но это временное решение, поэтому можно потерпеть...
Итак, засучив рукава, приступаем к реализации намеченного плана...
Структура диска
Начну с выделения места для нового пингвина. Загружаюсь с какого-нибудь загрузочного диска с Linux'ом на борту. Воспользовавшись любимым потрошителем разделов (у меня это gparted), выделяю раздел под Gentoo и выношу домашние разделы. Следует отметить, что загрузочный раздел должен быть выделен основным. Остальные могут располагаться в расширенном.
- 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