Сначала создаём загрузочную флешку с Gentoo Minimal Installation CD. Я выбрал архитектуру amd64, вполне возможно, вам стоит выбрать x86. TODO: описание процесса.
Подключаем Acer Revo к сети, обеспечивающей выход в интернет. У меня в сети есть роутер, который выдаёт IP-адрес и настройки по DHCP. Остальным предлагаю почитать соответствующие главы в Gentoo Handbook.
Выставляем в BIOS правильное UTC-время.
На этом этапе у меня возникла непонятная проблема с определением BIOS'ом загрузочной флешки. После включения мой Acer Revo её не видит, но спустя некоторое время после различных манипуляций (включения/выключения, загрузок, заходов в BIOS, перетыкания флешки) она вдруг появляется. Итак, считаем, что нам повезло, мы нажали F12 и увидели flash-накопитель, жмём на него, грузимся, жмём Enter на предложение загрузить ядро Linux.
При загрузке не зеваем и на вопрос "Please select a keymap" выбираем "31 ru".
Мне удобнее производить настройку через ssh, к тому же сеть у меня абсолютно доверенная. Создаём пароль для root и запускаем sshd:
livecd ~ # passwd
(вводим новый пароль 2 раза)
livecd ~ # /etc/init.d/sshd start
Затем смотрим IP-адрес, выданный роутером
livecd ~ # ifconfig
Заодно проверим наличие интернета
livecd ~ # ping www.ru
Затем с другой машины, где удобная клавиатура и гугл под рукой:
$ ssh root@192.168.0.xxx (подставить ваш IP)
В принципе, эти шаги можно пропустить. С этого момента считаем, что консоль Acer Revo и интернет у нас наличествует.
Смотрим, что у нас на жёстком диске:
livecd ~ # fdisk -l /dev/sda
Убеждаемся, что количество гигабайт соответствует тому, что мы покупали. Моя схема разметки простая: 32 Мб под /boot, 4Gb под swap, 50Gb под корневую файловую систему и оставшееся место под /vz, где будут находиться контейнеры с виртуальными машинами. Таким образом, в моём случае хватит primary-разделов, и extended-раздел создавать не потребуется.
Создаём новую таблицу разделов, используя утилиту fdisk:
livecd ~ # fdisk /dev/sda
Удаляем все разделы: последовательно жмём d и номер раздела. p выводит список разделов для контроля над процессом.
Создаём раздел для /boot:
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-60801, default 1): (Enter)
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-60801, default 60801): +32M
Выставляем для загрузочного раздела флаг bootable:
Command (m for help): a
Partition number (1-4): 1
Создаём раздел подкачки (swap):
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (6-60801, default 6): (Enter)
Using default value 6
Last cylinder, +cylinders or +size{K,M,G} (6-60801, default 60801): +4G
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 82
Changed system type of partition 2 to 82 (Linux swap / Solaris)
Создаём раздел для /:
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (529-60801, default 529): (Enter)
Using default value 529
Last cylinder, +cylinders or +size{K,M,G} (529-60801, default 60801): +50G
Создаём раздел для /vz:
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Selected partition 4
First cylinder (7057-60801, default 7057): (Enter)
Using default value 7057
Last cylinder, +cylinders or +size{K,M,G} (7057-60801, default 60801): (Enter)
Using default value 60801
Убеждаемся, что всё получилось так, как задумано:
Command (m for help): p
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x5041ce77
Device Boot Start End Blocks Id System
/dev/sda1 * 1 5 40131 83 Linux
/dev/sda2 6 528 4200997+ 82 Linux swap / Solaris
/dev/sda3 529 7056 52436160 83 Linux
/dev/sda4 7057 60801 431706712+ 83 Linux
Жмём w, после чего новая таблица разделов будет записана, а все имеющиеся на диске данные уничтожены.
Создаём файловые системы:
livecd ~ # mke2fs /dev/sda1
livecd ~ # mke2fs -j /dev/sda3
livecd ~ # mke2fs -j /dev/sda4
Отдельный раздел для OpenVZ создаётся для того, чтобы обеспечить безопасность хост-системе. Если контейнеры будут находиться в корневом разделе, то их данные могут "залезть" на зарезервированные для root 5% дискового пространства хост-системы. К тому же важно использовать для этого раздела ext3, потому что только для неё (и ext2) гарантируется корректная работа дисковых квот для контейнеров.
Создаём и активируем swap-раздел:
livecd ~ # mkswap /dev/sda2
livecd ~ # swapon /dev/sda2
Монтируем разделы в соответствующие директории:
livecd ~ # mount /dev/sda3 /mnt/gentoo/
livecd ~ # mkdir /mnt/gentoo/boot
livecd ~ # mount /dev/sda1 /mnt/gentoo/boot/
Качаем актуальный stage3 и распаковываем его:
livecd ~ # cd /mnt/gentoo/
livecd gentoo # wget http://mirror.yandex.ru/gentoo-distfiles/releases/amd64/autobuilds/current-stage3/stage3-amd64-20xxxxxx.tar.bz2
livecd gentoo # tar xjpf stage3-amd64-20xxxxxx.tar.bz2
Качаем актуальный срез portage и распаковываем его:
livecd gentoo # wget http://mirror.yandex.ru/gentoo-distfiles/snapshots/portage-latest.tar.bz2
livecd gentoo # tar xjf portage-latest.tar.bz2 -C /mnt/gentoo/usr/
Далее доводим до ума make.conf:
livecd gentoo # nano -w /mnt/gentoo/etc/make.conf
CFLAGS="-O2 -march=core2 -mtune=generic -mssse3 -mfpmath=sse -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"
CHOST="x86_64-pc-linux-gnu"
USE="mmx sse sse2 ssse3 vdpau -ipv6 -ldap -pcf"
MAKEOPTS="-j5"
SYNC="rsync://rsync2.ru.gentoo.org/gentoo-portage"
GENTOO_MIRRORS="http://mirror.yandex.ru/gentoo-distfiles/"
Последние приготовления chroot-окружения:
livecd gentoo # cp -L /etc/resolv.conf /mnt/gentoo/etc/
livecd gentoo # mount -t proc none /mnt/gentoo/proc/
livecd gentoo # mount -o bind /dev /mnt/gentoo/dev/
Переходим в него:
livecd gentoo # chroot /mnt/gentoo/ /bin/bash
livecd / # env-update
livecd / # source /etc/profile
livecd / # export PS1="(chroot) $PS1"
Обновляем дерево портежей:
(chroot) livecd / # emerge --sync
Выбираем серверный профиль:
(chroot) livecd / # eselect profile list
[1] default/linux/amd64/10.0 *
...
[7] default/linux/amd64/10.0/server
...
(chroot) livecd / # eselect profile set 7
Для хост-машины создаём только английскую локаль:
(chroot) livecd / # nano -w /etc/locale.gen
и раскомментируем строку en_US.UTF-8 UTF-8
(chroot) livecd / # locale-gen
Выбираем свой часовой пояс:
(chroot) livecd / # cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
Устанавливаем пакет с исходниками ядра Linux:
(chroot) livecd / # emerge gentoo-sources
Далее можем долго и мучительно затачивать конфиг под оборудование Acer Revo:
(chroot) livecd linux # cd /usr/src/linux
(chroot) livecd linux # make menuconfig
, а можем воспользоваться готовым (и поблагодарить меня, потратившего на это несколько часов):
TODO: .config
Компилируем ядро (у меня оно компилировалось 11 минут 44 секунды):
(chroot) livecd linux # time make -j5
(chroot) livecd linux # make install
(chroot) livecd linux # make modules_install
Настраиваем fstab:
(chroot) livecd linux # nano -w /etc/fstab
/dev/sda1 /boot ext2 defaults,noatime 1 2
/dev/sda3 / ext3 defaults,noatime 0 1
/dev/sda2 none swap sw 0 0
proc /proc proc defaults 0 0
shm /dev/shm tmpfs nodev,nosuid,noexec 0 0
Даём имя машине:
(chroot) livecd linux # nano -w /etc/conf.d/hostname
HOSTNAME="srv1"
Мне имя домена не нужно, поэтому удаляем .\O из шаблона приветствия:
(chroot) livecd linux # nano -w /etc/issue
This is \n (\s \m \r) \t
Конфигурируем сеть:
(chroot) livecd linux # nano -w /etc/conf.d/net
config_eth0=( "dhcp" )
(chroot) livecd linux # rc-update add net.eth0 default
Прописываем имя машины в hosts:
(chroot) livecd linux # nano -w /etc/hosts
127.0.0.1 srv1 localhost
::1 srv1 localhost
Создаём пароль для суперпользователя:
(chroot) livecd linux # passwd
Делаем vim текстовым редактором по-умолчанию для системы:
(chroot) livecd linux # nano -w /etc/rc.conf
#EDITOR="/bin/nano"
EDITOR="/usr/bin/vim"
Настраиваем часы:
(chroot) livecd linux # nano -w /etc/conf.d/clock
TIMEZONE="Europe/Moscow"
CLOCK_SYSTOHC="yes"
Решаем проблемы отображения кириллицы.
Меняем следующие строки в keymaps:
(chroot) livecd linux # nano -w /etc/conf.d/keymaps
KEYMAP="ruwin_cplk-UTF-8"
SET_WINDOWKEYS="yes"
#DUMPKEYS_CHARSET=""
Далее устанавливаем консольный шрифт с поддержкой кириллицы. Мне нравится terminus. Здесь мы немножко схитрили, выключив заранее в make.conf use-флаг pcf, который отвечает за поддержку Portable Compiled Font. Эта штука нам навряд ли понадобится, ведь у нас не стоит X11, а она тянет за собой кучу иксовых библиотек.
(chroot) livecd linux # emerge terminus-font
(chroot) livecd linux # nano -w /etc/conf.d/consolefont
CONSOLEFONT="ter-v14n"
Создадим файл, включающий нашу локаль:
(chroot) livecd linux # nano -w /etc/env.d/02locale
LANG="en_US.UTF-8"
Для более удобного копирования в консоли, включим поддержку мыши в консоли, но сам сервис будем запускать только при необходимости:
(chroot) livecd linux # emerge gpm
(chroot) livecd linux # nano -w /etc/conf.d/gpm
#MOUSE=ps2
MOUSE=imps2
Доустанавливаем необходимые системные утилиты:
(chroot) livecd linux # emerge syslog-ng logrotate vixie-cron dhcpcd
(chroot) livecd linux # rc-update add syslog-ng default
(chroot) livecd linux # rc-update add vixie-cron default
Устанавливаем загрузчик GRUB:
(chroot) livecd linux # emerge grub
(chroot) livecd linux # nano -w /boot/grub/grub.conf
title Gentoo Linux 2.6.32
root (hd0,0)
kernel /boot/vmlinuz-2.6.32-gentoo-r7 root=/dev/sda3 video=uvesafb:1024x768-32@100,mtrr:3,ywrap
(chroot) livecd linux # grep -v rootfs /proc/mounts > /etc/mtab
(chroot) livecd linux # grub-install --no-floppy /dev/sda
(chroot) livecd linux # exit
livecd gentoo # cd
livecd ~ # umount /mnt/gentoo/boot/ /mnt/gentoo/dev/ /mnt/gentoo/proc/ /mnt/gentoo/
livecd ~ # reboot
Входим в систему под root, создаём пользователя:
srv1 ~ # useradd -m -G users,wheel,audio,video -s /bin/bash vasyapupkin
srv1 ~ # passwd vasyapupkin
Удаляем ненужный файл (stage3 оставляем, он потребуется для создания шаблона контейнера OpenVZ):
srv1 ~ # rm /portage-latest.tar.bz2
Устанавливаем всё то, чего не хватало для полного счастья:
srv1 ~ # emerge vim gentoolkit eix mc
При желании, теперь можно пересобрать всю систему, после чего каждая программа будет использовать оптимизации, которые мы указали в make.conf:
srv1 ~ # eix-sync
srv1 ~ # emerge -1 binutils gcc glibc && emerge -e world
После чего можно смело ложиться спать, чего я и сделаю. :)
Иначе же можно просто проапдейтить все пакеты:
srv1 ~ # emerge -uND world
Просыпаемся, завтракаем и выполняем:
srv1 ~ # etc-update
Оставляем наши версии конфигурационных файлов.
На всякий случай:
srv1 ~ # revdep-rebuild
На этом можно было бы и закончить, но в моём случае имеет смысл использовать виртуальные машины, поэтому продолжаем. :)
Небольшое лирическое отступление. На данный момент стабильным ядром по-прежнему считается 2.6.18. В Gentoo по-умолчанию уже предлагается 2.6.27 (релизы которого называются, к слову, по фамилиям русских художников), но есть возможность использовать и development-версию 2.6.32 (а эти ядра называют по фамилиям русских космонавтов).
Существуют три причины, по которым я решился использовать openvz-ядро 2.6.32 (да-да, на свой страх и риск). Во-первых, это лень опять копаться в конфиге ядра, во-вторых, поддержка типа процессора Atom в новом ядре (правда, можно это будет использовать только с gcc 4.5, стабильность которого, по отзывам, сейчас оставляет желать лучшего), в-третьих, по слухам, новой стабильной версией ядра будет как раз 2.6.32, и я верю, что светлое будущее уже не за горами. Мой сугубо домашний сервер как-нибудь период ожидания переживёт.
Размаскируем ядро:
srv1 ~ # vi /etc/portage/package.unmask
sys-kernel/openvz-sources
srv1 ~ # vi /etc/portage/package.keywords
>=sys-kernel/openvz-sources-2.6.32 ~amd64
И установим его исходники:
srv1 ~ # emerge openvz-sources
TODO: .config
srv1 ~ # eselect kernel list
[1] linux-2.6.32-gentoo-r7 *
[2] linux-2.6.32-openvz-avdeyev.1
srv1 ~ # eselect kernel set 2
srv1 ~ # ls -l /usr/src/linux
lrwxrwxrwx 1 root root 29 May 16 18:06 /usr/src/linux -> linux-2.6.32-openvz-avdeyev.1
srv1 ~ # cd /usr/src/linux
srv1 linux # time make -j5
srv1 linux # make install
srv1 linux # make modules_install
Ради интереса, это ядро компилировалось 13 минут 40 секунд.
srv1 linux # vi /boot/grub/grub.conf
title Gentoo Linux 2.6.32 (OpenVZ)
root (hd0,0)
kernel /boot/vmlinuz-2.6.32-openvz-avdeyev.1 root=/dev/sda3 video=uvesafb:1024x768-32@100,mtrr:3,ywrap
title Gentoo Linux 2.6.32 (rescue)
root (hd0,0)
kernel /boot/vmlinuz-2.6.32-gentoo-r7 root=/dev/sda3 video=uvesafb:1024x768-32@100,mtrr:3,ywrap init=/bin/bb
Редактируем настройки ядра и перезагружаемся с новым ядром:
srv1 etc # vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
kernel.sysrq = 1
srv1 linux # reboot
Убеждаемся, что это оно:
srv1 ~ # uname -r
2.6.32-openvz-avdeyev.1
Создаём директорию для контейнеров OpenVZ и монтируем в неё раздел:
srv1 ~ # mkdir /vz
srv1 ~ # vi /etc/fstab
/dev/sda4 /vz ext3 defaults,noatime 0 2
srv1 ~ # mount /vz
Устанавливаем необходимый комплект программ:
srv1 ~ # emerge vzctl
В контейнерах планируется использовать также Gentoo Linux, поэтому немного поправим конфиг, чтобы в будущем было удобнее создавать контейнеры:
srv1 ~ # vi /etc/conf.d/vz
DEF_OSTEMPLATE="gentoo"
srv1 ~ # rc-update add vz default
srv1 ~ # /etc/init.d/vz start
Приступаем к созданию шаблона контейнера (stage3 у нас должен был остаться от установки хост-системы):
srv1 ~ # mkdir /vz/private/101
srv1 ~ # tar xjf /stage3-amd64-20100514.tar.bz2 -C /vz/private/101/
Создадим конфигурационный файл для контейнера:
srv1 ~ # vzctl set 101 --applyconfig vps.basic --save
Настройки по-умолчанию контейнера меня не устраивают, мне нужен гораздо более мощный контейнер. Доводим конфигурационный файл до такого состояния:
srv1 ~ # vi /etc/vz/conf/101.conf
OSTEMPLATE="gentoo"
KMEMSIZE="16384000:18022400"
LOCKEDPAGES="4096:4096"
PRIVVMPAGES="262144:292912"
SHMPAGES="131072:131072"
NUMPROC="400:400"
PHYSPAGES="0:9223372036854775807"
VMGUARPAGES="102400:9223372036854775807"
OOMGUARPAGES="102400:9223372036854775807"
NUMTCPSOCK="500:500"
NUMFLOCK="200:220"
NUMPTY="64:64"
NUMSIGINFO="512:512"
TCPSNDBUF="5365760:10485760"
TCPRCVBUF="5365760:10485760"
OTHERSOCKBUF="1503232:4063232"
DGRAMRCVBUF="262144:262144"
NUMOTHERSOCK="500:500"
NUMFILE="8192:8192"
DCACHESIZE="4194304:4317184"
NUMIPTENT="128:128"
AVNUMPROC="180:180"
CPUUNITS="1000"
ONBOOT="yes"
ORIGIN_SAMPLE="vps.basic"
DISKSPACE="47185920:52428800"
DISKINODES="400000:440000"
QUOTATIME="0"
IP_ADDRESS="192.168.0.101"
NAMESERVER="192.168.0.1"
HOSTNAME="vps101"
DEVNODES="tty12:rw"
Делаем доступными примонтированные файловые системы внутри контейнера и оставляем в fstab контейнера только точку монтирования /proc, которая будет монтироваться во время загрузки контейнера:
srv1 ~ # rm -f /vz/private/101/etc/mtab
srv1 ~ # ln -s /proc/mounts /vz/private/101/etc/mtab
srv1 ~ # grep ^proc /etc/fstab > /vz/private/101/etc/fstab
Комментируем команды создания виртуальных консолей, которые не существуют внутри контейнера:
srv1 ~ # vi /vz/private/101/etc/inittab
комментируем знаком # все строки вида
c?:2345:respawn:/sbin/agetty 38400 tty? linux
Заменяем пароль суперпользователя на восклицательный знак, что предотвратит возможность логина под ним в контейнере:
srv1 ~ # vi /vz/private/101/etc/shadow
root:!:10770:0:::::
Когда возможность логина root понадобится, установить пароль можно будет командой vzctl set 101 --userpasswd root:password.
Удаляем стартовые скрипты, которые не должны выполняться в контейнере:
srv1 ~ # rm /vz/private/101/etc/runlevels/boot/checkroot
srv1 ~ # rm /vz/private/101/etc/runlevels/boot/consolefont
Закомментируем строку, отвечающую за монтирование /sys и защитим конфигурационный файл от автоматического обновления:
srv1 ~ # vi /vz/private/101/sbin/rc
# try mount -n ${mntcmd:--t sysfs sysfs /sys -o noexec,nosuid,nodev}
srv1 ~ # cp /etc/make.conf /vz/private/101/etc/make.conf
srv1 ~ # vi /vz/private/101/etc/make.conf
CONFIG_PROTECT="/sbin/rc"
Отключаем udev в контейнере:
srv1 ~ # vi /vz/private/101/etc/conf.d/rc
RC_DEVICES="static"
Проверяем контейнер:
srv1 ~ # vzctl start 101
srv1 ~ # vzctl enter 101
Убеждаемся, что на уровнях загрузки boot и default все сервисы стартовали:
vps101 / # rc-status -a
Добавим sshd в автозагрузку. Не запускаем сервис (!), т.к. при этом создадутся ключи, которые потом будут копироваться из шаблона во все вновь создаваемые контейнеры:
vps101 / # rc-update add sshd default
Теперь стоит выполнить настройку контейнера, аналогично описанной выше настройке хост-системы. Многое из этих настроек можно или нужно пропустить, поэтому перечислю то, что нужно настроить:
профиль, локаль (здесь, возможно, стоит добавить локали согласно требованию ваших приложений), шаблон приветствия системы, /etc/rc.conf, /etc/conf.d/keymaps, /etc/env.d/02locale.
Теперь хотелось бы установить в будущем шаблоне контейнера некоторый минимально необходимый набор системного ПО. Для этого выходим из контейнера и монтируем с опцией bind директорию дерева портежей хост-системы:
vps101 / # exit
srv1 ~ # mkdir /vz/root/101/usr/portage
srv1 ~ # mount -o bind /usr/portage/ /vz/root/101/usr/portage/
srv1 ~ # vzctl enter 101
Сначала немного изменим make.conf контейнера, т.к. gpm и cups в них не имеют смысла:
vps101 / # vi /etc/make.conf
USE="mmx sse sse2 ssse3 vdpau -ipv6 -ldap -gpm -cups"
Устанавливаем ПО:
vps101 / # emerge syslog-ng logrotate vixie-cron vim gentoolkit eix mc
vps101 / # rc-update add syslog-ng default
(это нужно будет для нормальной работы syslog после перезагрузки контейнера)
vps101 / # rm /dev/tty12
vps101 / # rc-update add vixie-cron default
Обновляем всё (это надолго):
vps101 / # emerge -1 binutils gcc glibc && emerge -e world
vps101 / # exit
Наконец создаем архив с шаблоном контейнера:
srv1 ~ # umount /usr/portage/
srv1 ~ # vzctl stop 101
srv1 ~ # cd /vz/private/101/
srv1 ~ # tar --numeric-owner -czf /vz/template/cache/gentoo.tar.gz *
Теперь для создания нового контейнера на основе шаблона можно просто выполнить команду:
srv1 ~ # vzctl create 102 --config gentoo --ipadd 192.168.0.10 --hostname testvps
Для установки пароля root в созданном контейнере выполняем:
srv1 ~ # vzctr set 102 --userpasswd root:password
На этом, пожалуй, можно и закончить.