суббота, 15 мая 2010 г.

Установка Gentoo и OpenVZ на Acer Revo R3610

Здесь я постарался кратко, но со всеми нюансами описать процесс установки Gentoo Linux на Acer Revo R3610 и системы виртуализации OpenVZ. Во многом это повторение Gentoo Handbook, Gentoo Wiki и OpenVZ Wiki, но собранное в одном месте под конкретную задачу. Сразу оговорюсь, что изложение не рассчитано на новичков. С другой стороны, вряд ли у новичков возникнет подобная потребность. :)

Сначала создаём загрузочную флешку с 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

На этом, пожалуй, можно и закончить.

Комментариев нет: