Установка Gentoo из stage3


== Введение ==

Сначала я хотел набросать эту статью просто как памятку по формуле "больше дела - меньше
 слов!", но постепенно открылись новые обстоятельства, из-за которых писать придется более
 подробно. В этой статье я опишу как устанавливать gentoo на компьютер с двумя жесткими
 дисками. И здесь будут не только "крючочки", но и комментарии. Итак - берем загрузочный диск
 LiveCD Gentoo или загрузочную USB-флешку, желательно с ядром, предназначенным для вашей
 архитектуры (в смысле - не смысла ставить i686 на x64, извините за каламбур) и грузимся.

== Настройка RAID == 

Этот пункт можно пропустить всем тем, кто райд не делает. Но, как показывает мой опыт и
 область деятельности - я всё реже и реже встречаю компьютеры без RAID. Очень хорошо, когда
 RAID полностью аппаратный. Тогда, как правило, Linux видит уже "построенный" массив, как
 одиночное устройство и обращается с ним, как с обычном диском. Но на рынке существует также
 много SW-RAID-контроллеров, и просто конфигураций без встроенного контроллера, которые
 требуют программной поддержки RAID. SW-контроллеры мы опустим - это отдельная песня, которая
 в простом случае решается с помощью [boot: gentoo doscsi dodmraid] и [modprobe драйвер_контроллера],
 а в сложном - заставляет перерыть весь инет в поисках нужного модуля
 или патча к существующему модулю. Я остановлюсь на последнем варианте - софтварном райд,
 причем будут делать простейшее зеркалирование двух дисков (RAID1)

Перегружаемся еще раз - в первый раз мы загрузились не правильно. При загрузке нужно
указать параметры:

boot: gentoo doscsi dodmraid

У меня - два диска по 300G - /dev/sda и /dev/sdb. Пробуем модули:

# dmesg
...
# lspci
...
# modprobe raid1
# modprobe dm-mod
# fdisk -l

Disk /dev/sda: 299.9 GB, 299989204992 bytes
255 heads, 63 sectors/track, 36471 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb: 299.9 GB, 299989204992 bytes
255 heads, 63 sectors/track, 36471 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Разбиваем первый диск - просто на 4 первичных раздела - для /boot, swap, / и /home. Сразу
 замечу - это будет не серверная конфигурация, а обычный home pc, с повышенной надежностью
 хранения данных.

# fdisk /dev/sda

Disk /dev/sda: 299.9 GB, 299989204992 bytes
255 heads, 63 sectors/track, 36471 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          11       88326   fd  Linux raid autodetect
/dev/sda2              12          61      401625   82  Linux swap / Solaris
/dev/sda3              62         311     2008125   fd  Linux raid autodetect
/dev/sda4             312       36471   290455200   fd  Linux raid autodetect

Обратите внимание - все разделы, которые мы "зеркалируем" имеют тип fd! Это делается
 командой t внутри fdisk. Swap-раздел я зеркалировать не буду - по идейным
 соображениям. Теперь нужно сделать точно такое же разбиение на втором диске.
Я сделаю это просто:

# sfdisk -d /dev/sda | sfdisk /dev/sdb

Настало время сделать ноды устройств и обозначить их сущности:

# mknod /dev/md1 b 9 1
# mknod /dev/md3 b 9 3
# mknod /dev/md4 b 9 4

# mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
# mdadm --create --verbose /dev/md3 --level=1 --raid-devices=2 /dev/sda3 /dev/sdb3
# mdadm --create --verbose /dev/md4 --level=1 --raid-devices=2 /dev/sda4 /dev/sdb4

По-русски это означает, что мы слепили все "половинки" в пары и сделали "новые разделы" md1,
 md3, md4. Кстати говоря, никто не мешал нам сделать четвертый раздел, к примеру, страйпом -
 т.е. увеличить его объем в два раза, заменив "зеркалирование" на "объединение". Это просто:

# mdadm --create --verbose /dev/md4 --level=0 --raid-devices=2 /dev/sda4 /dev/sdb4

Диски объединятся не мгновенно. Этот процесс желательно наблюдать и контролировать,
время от времени запуская:

# cat /proc/mdstat

или делая это автоматически:

# watch -n1 'cat /proc/mdstat'

После того, как RAID будет построен, необходимо убедиться что составляющие "узлы" прописаны
в файле /etc/mdadm/mdadm.conf. Если ничего похожего на правду там нет - необходимо прописать
RAID в конфиге командой:

mdadm -Es | grep md >> /etc/mdadm/mdadm.conf

В далеком будущем, когда один из дисков отвалится - нужно будет вынуть и заменить
сгоревший диск на новый. Это делается командами:

Удалить диск из массива:
# mdadm /dev/md1 --fail /dev/sdb1 --remove /dev/sdb1

Добавить диск в работающий массив:
# mdadm /dev/md1 --add /dev/sdb1

Дальше делаем то, что я всегда забываю сделать: наводим файловые системы.

# mke2fs /dev/md1
# mke2fs -j /dev/md3
# mke2fs -j /dev/md4

и включаем swap на обычных разделах:

# mkswap /dev/sda2 && mkswap /dev/sdb2
# swapon -p 1 /dev/sda2 && swapon -p 1 /dev/sdb2
# swapon -v -s

== Установка стадии == 

Этот алгоритм везде прописан. Лучше всего - в хендбуке, но его долго читать. Мы - поедем
быстро. Считаем, что у нас уже есть диск с разметкой и файловыми системами в конфигурации
RAID или не RAID - все равно. Настраиваем сеть - руками:

# ifconfig eth0 192.168.1.2 netmask 255.255.255.0
# route add default gw 192.168.1.1
# echo "nameserver 192.168.1.1" > /etc/resolv.conf
# ifconfig eth0 up

Дальше - четко по шагам:

# date
# date MMDDhhmmYYYY
# cd /mnt/stages
# wget http://distfiles.gentoo.org/releases/x86/2008.0/stages/stage3-i686-2008.0.tar.bz2
# wget http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2

Монтируем новую файловую систему и разворачиваем стадию и портежи:

# mount /dev/md3 /mnt/gentoo
# mkdir /mnt/gentoo/boot
# mount /dev/md1 /mnt/gentoo/boot
# mkdir /mnt/gentoo/home
# mount /dev/md4 /mnt/gentoo/home

# cd /mnt/gentoo
# cp /mnt/stages/stage3-i686-2008.0.tar.bz2 /mnt/gentoo
# time tar -xvjpf stage3-i686-2008.0.tar.bz2
# cd /mnt/gentoo/usr
# cp /mnt/stages/portage-latest.tar.bz2 /mnt/gentoo/usr
# time tar -xvjf portage-latest.tar.bz2

Выбираем зеркало для обновлений и копируем настройки DNS:

# mirrorselect -i -r -o >> /mnt/gentoo/etc/make.conf
# cp -L /etc/resolv.conf /mnt/gentoo/etc/

И переходим в новую систему:

# cd /
# mount -t proc none /mnt/gentoo/proc
# mount -o bind /dev /mnt/gentoo/dev
# chroot /mnt/gentoo /bin/bash
# env-update && source /etc/profile

В новой системе сначала устанавливаем зону, дату-время и кrootой пароль:

# ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
# date
# passwd

Не забываем, что на данном этапе мы должны посмотреть в файлы:

/etc/hosts
/etc/make.conf
/etc/conf.d/clock
/etc/conf.d/domainname
/etc/conf.d/hostname
/etc/conf.d/net

Поправляем fstab:

# nano -w fstab

/dev/md1          /boot                   ext2  noauto,noatime  1 2
/dev/md3          /                       ext3  noatime         0 1
/dev/sda2         none                    swap  sw,pri=1        0 0
/dev/sdb2         none                    swap  sw,pri=1        0 0
/dev/md4          /home                   ext3  noatime         1 2

Накатываем необходимые порты:

# time emerge gentoo-sources dhcpcd ccache mdadm gentoolkit \\
  genkernel grub syslog-ng vixie-cron elogv eix ufed pciutils

Кстати, очень часто для устанавливаемых пакетов я указываю флаги:

# echo "app-misc/mc -samba" >> /etc/portage/package.use

Обычно только после базовой установки я делаю изменения в файле /etc/make.conf:

USE="mmx sse sse2 ssse3 threads -ipv6 -X -gtk -gtk2 -qt -qt3 -qt4"
MAKEOPTS="-j16"
ACCEPT_LICENSE="*"
LINGUAS="ru en"
GENTOO_MIRRORS="http://mirror.yandex.ru/gentoo-distfiles/"
EMERGE_DEFAULT_OPTS="-va"
CC="ccache gcc"
CXX="ccache g++"
FEATURES="ccache"
CCACHE_DIR="/var/tmp/ccache"
CCACHE_SIZE="2G"
PORTAGE_ELOG_CLASSES="warn error log qa"
PORTAGE_ELOG_SYSTEM="save"
PORTDIR_OVERLAY="/usr/local/portage"

Кое-что ставим в автозагрузку:

# rc-update add mdadm boot
# rc-update add net.eth0 default
# rc-update add sshd default

До генерации ядра не забываем сохранить конфигурацию RAID, чтобы ядро знало,
откуда загружаться:

# mdadm --detail --scan >> /etc/mdadm.conf

Генерим ядро. Процесс неоднозначный, требующий понимания и знания железа. В простом
случае попробуем:

# cd /usr/src/linux
# make menuconfig
# make && make modules_install

Можно и с помощью genkernel

# genkernel --menuconfig --mdadm all

Поправляем настройки grub:

# nano -w /boot/grub/grub.conf

default 0
timeout 10

title Gentoo Genkernel
root (hd0,0)
kernel /boot/kernel-genkernel-x86-2.6.26-gentoo-r4 root=/dev/ram0 real_root=/dev/md3 doscsi
initrd /boot/initramfs-genkernel-x86-2.6.26-gentoo-r4

title Gentoo
root (hd0,0)
kernel /boot/kernel root=/dev/md3

И устанавливаем начальный загрузчик - причем на каждый девайс:

# grub
Probing devices to guess BIOS drives. This may take a long time.

grub> root (hd0,0)
grub> setup (hd0)
grub> root (hd1,0)
grub> setup (hd1)
grub> quit

Генерим локали:

# nano -w /etc/locale.gen
# locale-gen

Отмонтируем всё, что монтировали и перегружаемся

# exit
# mount
# umount много-много
# reboot

== Обновление системы ==

Если все получилось и система заработала - самое время обновить ее "до конца". Дело
небыстрое, времени может занять много, но сделать нужно обязательно.

# emerge --sync
# emerge -uDNavf world
# emerge -uDNav world

Обновляем конфигурационные файлы:

# dispatch-conf

Обновляем perl, python, gcc, java, если у них были обновления:

# perl-cleaner --all
# python-updater
# gcc-config -l
# java-config --list-available-vms

И проверяем динамические связи:

# revdep-rebuild

И вот система готова! Пройдет еще трое суток - и в ней можно будет работать. Такая уж это
система - gentoo - просто конструктор. Кстати, берегите зрение - gentoo лучше, чем любая
другая система, развивает анимализм и красноглазие. Но зато всё можно перебрать руками по
буковкам и для тех, кто хочет все сделать сам - это самый подходящий вариант. Когда же у вас
будет 10 серверов - то наверное, стоит присмотреться к CentOS или Ubuntu-Server - всё-таки в
промышленных масштабах считать буковки попросту некогда.

== Примечание ==

На искажение слов в статье прошу не обращать внимание. Автор от рождения косноязычен,
а сегодня еще и измучен нарзаном после празднования НГ.