Pull to refresh

Установка любого клона Red Hat Enterprise Linux не используя стандартный инсталлятор

Reading time8 min
Views23K
Устанавливать современную Linux систему нужно только один раз, как для единственного физического сервера, так и развертывания целой виртуальной фермы. Почему бы не потратить на это чуточку больше времени и сразу сделать все именно так как нужно, а не допиливать то что приехало из инсталлятора по его рельсам. К тому-же, количество софта которое ставится в «минимальном» режиме стандартного установщика, не соответствует действительно минимальному.
Кому-то ручная установка может показаться тратой времени, но каждый линуксоид обязан это сделать хотябы раз, чтоб лучше понимать как это работает. Eсли Вас не пугают слова fdisk, grub и chroot, читаем далее.

Установку операционной системы можно условно разделить на 4 отдельных этапа.
  1. Подготовка системного хранилища
  2. Установка и настройка системных компонентов
  3. Подготовка системы к самостоятельной загрузке
  4. Наладка системы под рабочие задачи

В большинстве современных систем задачи 1-3 выполняются программами-установщиками. В полуавтоматизированных установщиках пункты 1-3 проводятся в режиме вопрос-ответ. В большинстве автоматизированных — аналогично, просто есть возможность указать заранее подготовленный файл ответов.

Написание установщика задача не из тривиальных. Это всегда знали ребята из проекта Gentoo, в котором его и небыло никогда, а в Arch Linux комьюнити, совсем недавно решили отказаться от поддержки установщика в пользу более насущных задач. Это поняли даже в Microsoft — второй этап в установщике Windows начиная с Vista сводится к накатыванию уже заранее собранного образа. В прочем, мы не про окна, это тема другой статьи.

Проводя установку ОС вручную, мы имеем полную свободу действий на всех этапах. Данная статья естественно не является единственно правильной инструкцией, это сценарий установки «сферического сервера в вакууме». Конкретные задачи и условия могут значительно повлиять на любой из шагов. В качестве примера будем ставить Oracle Enterprise Linux 6 на виртуальную машину под управлением Microsoft Hyper-V. Не самое свободное сочетание конечно, но суть не в этом. Кстати, такой способ установки не требует регистрации в Oracle. А пуристам и адептам товарища Столлмана предлагаю использовать KVM и ставить CentOS или Scientific, которые являются почти 1:1 клонами RHEL так что разницы в установке для них практически нет. Уникальных нюансов и у OEL не много. Помимо своего kernel-uek Oracle Linux предлагает и ядро своего Джанго Фетта, в котором есть паравиртуальные дрова для Hyper-V девайсов и PnP проброс дисков.

Для установки в принципе годится любой линукс или LiveCD, rpm и yum доступны для многих платформ. Но так как у нас будет RHEL, удобнее всего использовать свежий LiveCD RHEL-подобного дистра той же мажорной версии. На нём точно будет rpm и yum совместимых версий, что значительно облегчает задачу. Я выбрал CentOS LiveCD, который можно скачать с ближайшего зеркала.

1. Подготовка системного хранилища


В данном примере системным хранилищем будет служить виртуальный диск в 10 Gb подключенный к ВМке. Всё пространство, кроме небольшого раздела для загрузчика, отдадим под управление LVM, который считаю наиболее стабильной системой управления томами на платформе Linux

Загружаемся с нашего LiveCD и залезаем в терминал. Если планируем работать с самой виртуалки, удобно использовать графический режим загрузки LiveCD. Там даже есть Firefox, конечно же не самый свежий.
Но если мы уже настроились на минимализм, ну или у машины не много оперативки, грузимся в текстовый режим, который можно выбрать в загрузчике. Поднимаем ssh сервер для возможности работы в терминале со своей машины. Для доступа потребуется поменять пароль рута и отключить или настроить файрвол.
$ sudo su
# service sshd start
# passwd root
# service iptables stop

Разбиваем наш диск с помощью fdisk, (parted, Red Hat Disk utility, hex редактор, кому как нравится :) на нужные разделы. Лично мне по душе проверенный временем fdisk. RHEL консервативная система, fdisk по умолчанию работает в режиме совместимости с ДОиСторическим наследием так что запускаем его со спец флажками.

# fdisk -cu /dev/sda

Создаем 500M раздел для загрузчика. Это огромный размер для загрузочного раздела, но нам ведь не жалко.
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First sector (2048-20971519, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +500M

Выставляем ей «bootable» флаг, чтобы первый этап загрузчика точно знал куда ему грузиться.
Command (m for help): a
Partition number (1-4): 1

Остальное пространство отдаем второй партиции,
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First sector (1026048-20971519, default 1026048):
Using default value 1026048
Last sector, +sectors or +size{K,M,G} (1026048-20971519, default 20971519):
Using default value 20971519

которой, для упрощения определения LVM групп на этапе загрузки выставим тип 8e (Linux LVM)
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list): 8e


Cоздаем файловую систему для /boot. Существует множество fs, с которых умеет грузиться стандартный для армии RHEL-клонов GRUB. Хватит даже старушки ext2, журнал на загрузочном разделе не особо нужен — запись в него происходит только при установке новых ядер и изменению конфигурации загрузчика. Я выбрал ext4. Дополнительно укажем label для новой fs, который потом можно будет использовать в mount и fstab.

# mkfs.ext4 /dev/sda1
# e2label /dev/sda1 boot

Готовим LVM на котором будет жить наша система
# pvcreate /dev/sda2
# vgcreate system /dev/sda2


В созданной группе выделяем корневой раздел в 4G. Этого более чем достаточно для минимальной системы, 1G отдадим под swap, который вместе с новыми разделами примонтируем к Live системе. Остальное место дает свободу создания дополнительных фс для /opt или /var, а так же можно оставить запас, что позволит использовать снепшоты LVM

# lvcreate -n root -L 4G system
# mkfs.ext4 /dev/system/root
# e2label root !$
# lvcreate -n swap –L 1G system
# mkswap -f /dev/system/swap
# swapon !$
# mkdir -p /mnt/system/boot
# mount LABEL=root /mnt/system
# mount LABEL=boot /mnt/system/boot

2. Установка и настройка системных компонентов


Информация обо всех установленных rpm пакетах хранится в специальной бд. Как для rpm так и для yum можно указать альтернативную корневую фс, что дает нам возможность установить RHEL в любую директорию минимальным количеством команд. RPMDB — позвоночник RHEL, создадим его для новой системы.

# rpm --root=/mnt/system –initdb


В качестве источников установочных пакетов для yum служат пакетные репозитории, ссылки на которые лежат в конфигах /etc/yum.repos.d/. Таким при наличии связи может быть любой публичный репозиторий доступный через интернет, свой, примонтированный с сетевого хранилища, или, если вам доступны образы установочных дисков, можно использовать их. Вот так:

# yum install createrepo
# mkdir -p /mnt/iso/{1,2,3}
# mount -o loop /mnt/nas/install/oel-6.4-cd{1,2,3}.iso /mnt/iso/{1,2,3}
# createrepo /mnt/iso


Если мы хотим установить CentOS, достаточно в существущих .repo файлах явно указать $releasever. Эти переменные берутся из пакета релиза дистрибутива, которого в новой системе еще нет, поэтому придётся немного по-sed-еть

# sed -i.orig 's/$releasever/6/g' /etc/yum.repos.d/*.repo


Мне нужен OEL, так что yum будет настроен на публичный репозиторий корпорации Oracle
# mv /etc/yum.repos.d{,.orig}
# mkdir /etc/yum.repos.d
# cd !$
# wget public-yum.oracle.com/public-yum-ol6.repo


Можно приступать к установке системы. Начнем с совсем «зачаточного» набора пакетов: пакет релиза, glibc, bash и их зависимостей:

# yum --installroot=/mnt/system install oraclelinux-release glibc bash


Такая система уже готова к запуску в качестве chroot из любого Linux. Но у нас другие планы, поэтому ставим туда rpm и yum со всеми зависимостями:

# yum --installroot=/mnt/system install rpm yum


Остальные пакеты будем устанавливать уже в новой системе. Скопируем настройки dns, репозиториев yum. Забиндим виртуальные фс нашей Live среды на аналогичные пути системы и войдем в нее.

# cd /mnt/system
# cp /etc/resolv.conf ./etc/
# cp /etc/yum.repos.d/*.repo ./etc/yum.repos.d/

# mount -o bind /dev ./dev
# mount -o bind /sys ./sys
# mount -o bind /proc ./proc

# chroot ./


Первое что видим — стандартное приглашение баша. Для приведения к обычному виду RHEL копируем настройки bash из /etc/skel.
bash-4.1# cp /etc/skel/.bash* /root/
bash-4.1# source /root/.bashrc


Поставим немного базового софта:
  • dhclient, среди зависимостей которого (помимо логотипов ОС в OEL:) есть так же udev, система инициализации и даже файрволл, что целым махом приблизит нашу систему к самостоятельности
  • планировщик cronie, который тянет с собой postfix в качестве MTA и логгер rsyslog
  • less, which, passwd, nc, telnet, which, man
  • любимый шелл, редактор, другой софт на свое усмотрение

набор софта в базовых репозиториях RHEL весьма ограничен, но к счастью есть EPEL, который призван решить эту проблему:
rpm -i www.mirrorservice.org/sites/dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
yum install passwd dhclient openssh cronie vim-minimal netcat telnet less which htop tmux less zsh figlet


Так как мы используем LVM, в любой момент установки (например сейчас) можем сделать снепшот нашей фс — который будет блочным слепком базового RHEL, или stage3 по терминологии Gentoo. Его можно сдампить на другое хранилище. Или создать архив фс снепшота, примонтировав его. На основе такого снепшота с минимальными усилиями можно создать шаблоны для OpenVZ и аналогичных систем. Всё это лучше делать за пределами chroot:
(livecd) # lvcreate -L1G -s -nstage3 system/root

(livecd) # xz /dev/system/stage3 > /mnt/nas/templates/OEL6.4-minimal.bin.xz

(livecd) # mkdir /mnt/stage3
(livecd) # mount /dev/system/stage3 !$
(livecd) # cd !$
(livecd) # tar -zvpf /mnt/nas/templates/OEL6.4-minimal.tar.gz ./


Подготовим таблицу файловых систем. Для корневой путь надежнее всего указать в виде виртуального девайса LVM, благо потенциальные проблемы с именованием при изменении конфигурации дисковой системы машины он решает «by design».

# vi /etc/fstab
LABEL=boot /boot ext4 noauto 1 1
/dev/mapper/system-root ext4 defaults 1 2

Настроим сеть создав конфигурационные файлы, как это обычно делает установщик anaconda
# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=spoon.matrix.local

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

Создадим нового пользователя с правами sudo и укажем пароль для него.
useradd -u1337 -m -s /bin/zsh -G wheel morpheus
# echo «morpheus ALL=(ALL) ALL» >> /etc/sudoers.d/morpheus
# passwd morpheus

Настроим локальную временную зону.
# ln -sf /usr/share/zoneinfo/Europe/Riga /etc/localtime

Поставим приветствие в motd.
# echo "there is no" > /etc/motd
# figlet -f mini spoon >> !$

Далее мы впринципе можем уже настраивать машину под рабочую задачу на свое усмотрение но я предпочитаю сначала с нее загрузиться:

3. Подготовка системы к самостоятельной загрузке


Примонтируем загрузочный раздел и установим загрузчик, менеджер его конфигурации, интрументы управления LVM и ядро
# mount /boot
# yum install grub grubby lvm2 kernel

Чтобы grubby мог сам прописывать ядра в конфиг загрузчика, предстоит немного поработать. Помимо симлинка на конфиг GRUBа, ему нужна хотябы одна работающая запись в конфиге, которая используется как шаблон. В системе установленной стандартным способом, первоначальный шаблон генерит anaconda. Нам же придется подготовить конфиг вручную, указав только что установленное ядро и нужные параметры к нему. Например quiet уберет излишную «вербозность» ядра, а rhgb запустит бутафорский прогрессбар.
# cd /etc
# ln -sf ../boot/grub/grub.conf
# cd /boot
# ln -sf grub.conf menu.lst
# vi grub.conf
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Linux
root (hd0,0)
kernel /vmlinuz-2.6.32-358.6.2.el6.x86_64 ro lvm root=/dev/mapper/system-root LANG=en_US.UTF-8
initrd /initramfs-2.6.32-358.6.2.el6.x86_64.img

Переустановим ядро чтобы убедиться в том, что grubby заработал и обновления ядра в будущем будут корректно добавляться в конфиг. После этого можем удалить из конфига запись с нашим примером:
# yum reinstall kernel
# vi grub.conf

Установим загрузчик на наш диск
# grub-install /dev/sda --no-floppy

Если какой-то причине установочный скрипт не сработал, grub можно установить на диск вручную
# grub
grub> root (hd0,0)
grub> setup (hd0)

Перезагружаемся в нашу систему и начинаем 4.Наладку системы под рабочие задачи. Свои.

Так создаются заточенные шаблоны для серверов. Как универсальные, под растерзание систем автоматизации, так и целевые, готовые к развертке с минимальной конфигурацией.
Tags:
Hubs:
+5
Comments13

Articles