Блог Слёрм

Установка Linux на примере CentOS 7

В новой статье разбираем процесс установки Linux на примере CentOS 7 без использования графического установщика. В статье объясняется, когда нужно устанавливать вручную, какие этапы происходят с момента запуска железа. Дополнительно затрагиваем тему LVM — зачем нужен и как использовать. 

За основу статьи взят первый урок нашего практического курса «Администрирование Linux Мега».


Из чего состоят дистрибутивы Linux


Дистрибутив — форма распространения программного обеспечения. Любой дистрибутив Linux состоит из: 
  • Ядра операционной системы. Это центральный компонент, который отвечает за управление процессами, памятью и файлами. 
  • Набора стандартных утилит. Почти все утилиты разработаны компанией GNU. Они входят в большую часть UNIX-систем и вместе составляют пакет Core Utilities. Разработчики GNU настаивают, что дистрибутивы на базе этого пакета правильно называть дистрибутивами GNU, а не дистрибутивами Linux, поскольку Linux — лишь ядро в составе системы GNU. Но на практике большинство людей всё равно использует название «дистрибутивы Linux».
  • Менеджера пакетов. Он нужен для управления программами, установленными в системе. По умолчанию в дистрибутивах Red Hat — это YUM или DNF, а в дистрибутивах Ubuntu и Debian — это APT. 

Как устанавливать дистрибутивы Linux


Стандартные дистрибутивы вроде Ubuntu или CentOS устанавливаются довольно легко: вы нажимаете на кнопку «Далее», попутно вводя необходимые параметры (пароли пользователей или сетевые настройки). В конце нажимаете «Готово» и перезагружаетесь. После этого система установлена и готова к работе. 

Плюс такого подхода в простоте — вы кликаете на кнопки и на выходе получаете стандартизированную операционную систему. 

Менее популярные дистрибутивы вроде Gentoo или Arch Linux рассчитаны на опытных пользователей Linux и устанавливаются вручную. Инструмента автоматизации установки у них нет. 

Плюс такого подхода в гибкости: дистрибутив собирается как конструктор, и впоследствии у вас есть полный контроль над ним. 

Минус — нужно гораздо больше времени и навыков, чем при установке через графический установщик. 

Графический установщик — средство упрощения. Под капотом все дистрибутивы Linux устанавливаются одинаково:
  • делаете разметку диска и создаёте файловые системы;
  • монтируете файловые системы к окружению установки;
  • устанавливаете пакеты в примонтированные файловые системы с помощью менеджера пакетов;
  • устанавливаете загрузчик GRUB;
  • перезагружаетесь и получаете установленную систему.

Графический установщик позволяет проходить эти этапы автоматически. Но при необходимости все действия можно выполнить вручную.

Зачем устанавливать дистрибутивы вручную? К ручной установке прибегают, когда нужна тонкая настройка конечной системы. Например, CentOS 7 с ядром по умолчанию не поддерживает новые процессоры AMD, а ещё через установщика нельзя выбрать кастомное ядро. Установка вручную позволяет не ставить CentOS как есть и потом доустанавливать нужное ядро, а сразу поставить систему на нужном ядре. 

Также установка вручную — единственный вариант, если у вас нет возможности загрузки из образа. Предположим, у вас сервер на Ubuntu, который находится за 100 тысяч километров. Вставить в него флэшку вы не можете, воспользоваться CVM тоже. Всё, что у вас есть, — SSH-доступ к серверу. В этом случае вы устанавливаете CentOS, загруженный в Ubuntu, поверх этой самой Ubuntu.

Следующий кейс — если установщик не работает, выдаёт странную ошибку и завершает процесс установки, не установив систему. Понимая, как работают дистрибутивы, вы всегда сможете завершить установку вручную.

Ещё одна причина самостоятельно устанавливать дистрибутивы — возможность глубже понять, из чего состоит и как работает операционная система. В процессе установки вы, вероятнее всего, столкнетесь с трудностями, но их преодоление приблизит вас к пониманию и даст ценный опыт. 

Как выглядит загрузка ОС на базе Linux


Процесс загрузки компьютера от нажатия кнопки до появления приглашения входа в систему включает несколько этапов. 

Сначала загружается прошивка материнский платы. Если материнская плата относительно новая, это BIOS или UEFI. 

BIOS — программа, которая хранится на чипе материнской платы и первая загружается при запуске компьютера. Она пробуждает подключенные устройства и убеждается, что они корректно работают. Затем BIOS находит на диске главную загрузочную запись (MBR), и уже её содержимое продолжает загрузку.

У BIOS есть ограничения:
  • Она не умеет загружаться с дисков, размер которых превышает 2 терабайта. Это ограничение MBR. 
  • На одном диске не может быть больше 4 физических разделов. Это ограничение разметки в формате DOS, использующейся в BIOS. 

UEFI — относительно новый стандарт, ещё не особо распространенный на серверах. Он поддерживает разметку дисков в формате GPT. 

GPT обходит ограничения разметки DOS и поддерживает 128 физических разделов. Он умеет загружаться с дисков размером больше 2 терабайт, поэтому его стараются использовать на новых серверах.

После загрузки прошивки запускается содержимое загрузочного сектора. У Linux там обычно находится GRand Unified Bootloader. 

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

GRUB подгружает модуль для работы с файловыми системами и boot-разделом. Далее на указанном диске и по указанному в config пути он ищет и загружает ядро и initramfs. 

Когда загрузка ядра и initramfs завершена, в дело вступает initramfs.

Initramfs — образ временной файловой системы, который загружается в оперативную память из диска и содержит все необходимые скрипты и программы для дальнейшей загрузки. В нём монтируется корневой раздел и запускается исполняемый файл /sbin/init. 

Вы можете положить в initramfs практически всё, что угодно. Например, там может быть SSH-сервер на случай, если у вас зашифрованная файловая система. Вы сможете подключиться по SSH на стадии загрузки в initramfs, ввести пароль от зашифрованной файловой системы и продолжить загрузку. Это удобно, потому что для ввода пароля не нужно получать KVM или просить кого-то дойти до сервера ногами.

После всех приготовлений initramfs запускает /sbin/init — исполняемый файл системы инициализации. В качестве неё выступает systemd или SysV. Система инициализации запускает пользовательское окружение и все сервисы, необходимые для его работы.

На этом процесс загрузки считается завершенным — пользователь видит графическую оболочку или строку входа в систему.

Теперь, когда мы знаем, как устанавливается и загружается операционная система, перейдём к самому интересному — установке CentOS 7 вручную без использования установщика.

Как установить CentOS 7


Для разбора кейса будем использовать виртуальную машину, на которую загружена Life ISO Arch Linux. Прошивка — BIOS. Разметка диска — DOS.

План установки:
  • разбить диск;
  • создать LVM-разделы;
  • создать файловые системы;
  • монтировать корневой раздел;
  • загрузить ISO-образ CentOS 7 Minimal;
  • получить временную файловую систему для установки;
  • первый уровень chroot во временную систему;
  • установить пакеты в конечную систему;
  • второй уровень chroot в конечную систему;
  • настроить конфигурационные файлы;
  • установить загрузчика;
  • перезагрузить. 

Разберём каждый этап подробно. 

Разбивка диска


Переходим в терминал — нужно создать разметку на дисках файловой системы. Для этого мы используем cfdisk — псевдографическую утилиту, которая позволяет не вводить команды каждый раз вручную:
Root@archiso ~ # cfdisk

Мы выбираем разметку диска dos и видим, что у нас есть 20 гигабайт свободного пространства:



Создаём один физический раздел, выделяя ему всё место, и разбиваем его с помощью LVM. Нажимаем кнопку «Записать изменения» и вводим «Yes». Указываем, что наш диск Bootable, сохраняем изменения и выходим из программы.



Создание LVM-разделов


LVM — менеджер логических томов. Он добавляет над дисковой подсистемой уровни абстракции и позволяет использовать несколько физических томов как один раздел. Это удобно, когда размера текущего диска уже не хватает, а добавлять диск большего размера и переносить на него данные не хочется.

Разберём устройство абстракций LVM:
  • на нижнем уровне находится физический диск /dev/sda, который мы можем инициализировать как Physical Volume (PV). 
  • на PV мы создаём Volume Group (VG) — группу разделов;
  • на VG — логические тома Logical Volume (LV);
  • на LV — файловые системы, куда будут ставиться пакеты. 

Схематично это выглядит так:


Возвращаемся к установке: мы уже создали раздел SDA1, и теперь нужно инициализировать его как Physical Volume. Это делается командой pvcreate, которой передаём путь до раздела /dev/sda1:

Root@archiso ~ # pvcreate /dev/sda1:

Чтобы посмотреть, какие PV у нас есть, используем команды:

Root@archiso ~ # pvc
или
Root@archiso ~ # pvcdisplay

Обе команды показывают информацию о дисках, но pvdisplay более подробную.

Далее командой vgcreate создаём группу томов Volume Group. В качестве первого аргумента мы передаём название VG — у нас это будет LVM. Затем указываем путь до диска, который инициализирован как Physical volume – /dev/sda1.

Root@archiso ~ # vgcreate lvm /dev/sda1


Volume Group создан. Посмотреть все VG можно командой:

Root@archiso ~ # vgs
или
Root@archiso ~ # vgsdisplay

Остаётся создать три Logical Volume. Первый будет использоваться для корневого раздела, второй — для каталога home, где хранятся данные пользователей, третий — для каталога OPT, где хранятся установленные дополнительно программы.

Для создания LV используем команду lvcreate:

Root@archiso ~ # lvcreate -L 10G -n root lvm


Повторяем то же самое для раздела home, но выделяем ему половину оставшегося места — 5 ГБ:

Root@archiso ~ # lvcreate -L 5G -n home lvm

Затем всё оставшееся место выделяем под Logical Volume OPT. Используем команду lvcreate, но указываем маленькую l, чтобы выделить место не в абсолютных значениях, а в относительных. Добавляем, что нужно использовать 100% оставшегося свободного пространства — пишем слитно 100%FREE:

Root@archiso ~ # lvcreate -l 100%FREE -n opt lvm

Теперь у нас есть три Logical Volume, и мы можем посмотреть их командой lvs:

Root@archiso ~ # lvs
или lvdisplay:
Root@archiso ~ # lvdisplay

Создание файловых систем


Для этого кейса мы возьмём файловую систему EXT4 — она проверена временем и стабильна. А если вы устанавливаете операционную систему на сервере силами хостинг-провайдера, то EXT4 выбирается для всех разделов по умолчанию. 

Для создания файловых систем используем команду mkfs, после чего через точку указываем нужную файловую систему — EXT4. В качестве аргумента передаём раздел на диске, который форматируем в эту файловую систему. Для получения доступа к файловым разделам LVM обращаемся к каталогу /dev/, где находятся устройства, имя VG — LVM, имя-метка нашего LV — root. 

Root@archiso ~ # mkfs.ext4 /dev/lvm/root


Повторяем это действие для разделов OPT и home:



Монтирование корневого раздела и загрузка ISO-образа CentOS 7 Minimal


Создадим директорию /mnt/centos:
Root@archiso ~ # mkdir /mnt/centos

И командой mount примонтируем наш root-раздел:
Root@archiso ~ # mount /dev/lvm/root /mnt/centos

Теперь переходим в эту директорию и скачиваем в неё iso-образ Centos 7 Minimal. Через ключ –o указываем, куда мы скачиваем файл – в /mnt/centos/centos.iso. Процесс занимает около 30 секунд:


Когда образ скачается, создадим под него директорию /mnt/iso и примонтируем её через команду mount:

Root@archiso /mnt/centos # mkdir /mnt/iso
Root@archiso /mnt/centos # mount centos. iso /mnt/iso



Теперь создадим директорию /mnt/squash, в которой будет образ squashfs: 

Root@archiso /mnt/centos # mkdir /mnt/squash
Root@archiso /mnt/centos # /mnt/iso/LiveOS/squashfs.img /mnt/squash


Всё это мы делаем, чтобы вытащить rootfs из Centos, и из него уже продолжить установку пакетов.

Третий уровень монтирования — создадим директорию /mnt/rootfs и в неё монтируем файл /mnt/squash/LiveOS/rootfs.img:

Root@archiso /mnt/centos # mkdir /mnt/rootfs
Root@archiso /mnt/centos # mount /mnt/squash/LiveOS/ rootfs.img /mnt/ rootf

Получение временной файловой системы для установки


В каталоге /mnt/centos, куда мы примонтировали root-раздел, создадим директорию liveos под временную систему и скопируем в неё содержимое директории /mnt/rootfs:

Root@archiso /mnt/centos # mkdir liveos
Root@archiso /mnt/centos # cp -rf /mnt/rootf/* liveos 


В директорию liveos скопировались файлы временной системы, из которой мы будем составлять пакеты. Cкопируем из iso-образа директорию Packages, где находятся RPM-пакеты — их мы будем ставить в конечную систему. 

Root@archiso /mnt/centos # cp /mnt/iso/Packages liveos -rf

Перейдём в директорию liveos и начнём уже работать с ней:

Root@archiso /mnt/centos # cd liveos/


Чтобы временная система работала корректно, нужно примонтировать к ней каталоги /dev, /sys и /proc. В каталоге /dev хранятся файлы устройств, подключенных к системе. В каталоге /sys — параметры подключенных устройств. В каталоге /proc — информация о запущенных процессах и их параметрах. 

Монтируем командой mount с ключом –rbind:

Root@archiso /mnt/centos/liveos # mount --rbind /sys sys
Root@archiso /mnt/centos/liveos # mount --rbind /dev dev
Root@archiso /mnt/centos/liveos # mount --rbind /proc proc

Первый уровень chroot во временную систему


Когда необходимые каталоги примонтированы, выполним команду chroot. Она меняет текущий корневой каталог на указанный и позволяет продолжать работу из временной системы. 

Root@archiso /mnt/centos/liveos # chroot . bin/bash 
Bash-4.2#

/bin/bash — интерпретатор по умолчанию

Готово, мы внутри файловой системы установщика и получили доступ к пакетному менеджеру yum. Но если попробуем выполнить команду yum, получим ошибку — Python не сможет найти модуль yummain. Нужно через утилиту rpm с ключем --nodeps для пропуска зависимостей установить пакет yum:

bash-4.2# rpm -i --nodeps
Packages/yum-3.4.3-168.e17.centos.noarch.rpm

Менеджер пакетов работает, монтируем корневой раздел к каталогу mnt:

bash-4.2# mount /dev/lvm/root /mnt/

Создаём точи для монтирования остальных разделов:

bash-4.2# mkdir /mnt/opt
bash-4.2# mkdir /mnt/home

Монтируем:

bash-4.2# mount /dev/lvm/opt /mnt/opt
bash-4.2# mount /dev/lvm/home /mnt/home

Установка пакетов в конечную систему


Переходим к установке пакетов в конечную систему. Для этого запускаем команду yum install и используем ключ instalroot:

bash-4.2# yum install --instalroot=/mnt Packages/*.rpm 

Пакеты установлены, перейдём в наш каталог /mnt, чтобы проверить всё ли в порядке:

bash-4.2# Is /mnt/


Видим, что появилась файловая система Unix, и создались нужные каталоги. Значит пакеты установились точно туда, куда мы хотели. Всё в порядке. 

Второй уровень chroot в конечную систему


Нужно выполнить второй уровень монтирования. Перейдём в каталог mnt и снова примонтируем каталоги /dev, /sys и /proc:

bash-4.2# mount --rbind /dev/ dev
bash-4.2# mount --rbind /sys/ sys
bash-4.2# mount --rbind /proc/ proc

Затем делаем chroot, но предварительно подгружаем в текущую систему информацию, где находятся исполняемые файлы:

bash-4.2# source /etc/ profile
bash-4.2# chroot . /bin/ bash

Если попробуем сразу установить в chroot установим пакет vim, чтобы редактировать конфиги:

[root@archiso/]# yum install vim

Получим ошибку о том, что yum не может определить ip-адрес зеркал:


Это происходит, потому что у нас не настроены сервера имен в системе. Исправляем ситуацию:

[root@archiso/]# echo “nameserver 8.8.8.8.” > /etc/resolv.conf

Снова устанавливаем vim:

[root@archiso/]# yum install vim -y vim

И приступаем к заполнению конфигов. Начнём с config /etc/fstab — конфигурационного файла, в котором хранится информацию о точках монтирования. 

[root@archiso/]# vim /etc/fstab

Файл делится на 6 столбцов:
  • первый указывает путь до устройства — /dev/lvm/root;
  • второй — точка монтирования, у нас это корневой каталог /;
  • третий — файловая система устройства, у нас это ext4;
  • четвертый — опции монтирования — defaults и noatime;
  • пятый указывает, нужно ли делать автоматический backup точки монтирования, ставим 0;
  • шестой указывает, нужно ли делать fscheck — проверку файловой системы при запуске. Тоже ставим 0.


Повторяем эти манипуляции с остальными разделами:


И выходим из vim. 

Настройка конфигурационных файлов


Настроим сеть с помощью стандартного для Centos способа — создадим файл /etc/sysconfig/network-scripts:

[root@archiso/]# vim /etc/sysconfig/network-scripts- enp0s3

enp0s3 — имя сетевого интерфейса. 

Переходим к файлу и заполняем его:
  • Параметр TYPE — тип интерфейса. У нас это Ethernet, так как виртуальная машина подключена по Ethernet-кабелю. 
  • Параметры BOOTPROTO — показывает, нужно ли получать информацию о настройках сети по dhcp. Нам это не нужно, пишем none.
  • Параметр IPADDR указывает адрес. Допустим, у нас 192.168.0.102.
  • Параметр GATEWAY— 192.168.0.1. 
  • Параметр PREFIX сети — 24. 
  • Параметр DNS1 сервер — 8.8.8.8.
  • Параметр DEFROUTE — yes, потому что у нас это маршрут по умолчанию. 
  • Имя сетевого интерфейса — enp0s3. 
  • Имя устройства — enp0s3. 
  • Параметр ONBOOT — yes, чтобы показать, что интерфейс нужно запустить при запуске системы.


Закончили — выходим в запись изменений и отключаем selinux (как его настраивать разбираем в следующих уроках). 

[root@archiso/]# vim /etc/selinux/config

В параметре SELINUX указываем disabled:


Установка загрузчика


Устанавливаем загрузчик grub:

[root@archiso/]# yum install grub2-pc –y

Указываем устройство, на которое ставим загрузчик:

[root@archiso/]# grub2-install /dev/sda

С помощью команды grub2-mkconfig создаём конфиг для нашего загрузчика:

[root@archiso/]# grub2-mkconfig -o /boot/grub2/grub.cfg 

Нажимаем enter и видим, что автоматически найдены файл ядра, файл initramfs файл rescue-ядра и rescue initramfs – они нужны для загрузки в систему, которая сломалась. Если что-то пошло не так, в grub вы выбираете режим восстановления и грузите с этим ядром. 

Перезагрузка 


С генерацией конфига закончили, теперь поставим пароль для root-пользователя, чтобы подключиться к системе после перезагрузки:

[root@archiso/]# password

Теперь можем перезагрузиться командой reboot -f. 

[root@archiso/]# reboot -f

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

Выходим из первого и второго chroot и делаем reboot. Выбираем в virtual box загрузку с нашей системы. Подключаемся к системе через ssh:

[zaqwer@archlinux`]$ ssh root@192.168.0.102

Вводим пароль, и вуаля — мы в системе Centos 7 и даже ни разу не увидели графический установщик. 



Это статья написана по мотивам урока курса «Администрирование Linux.Мега», второй поток которого стартует 31 октября. Для вас действует промокод со скидкой 10% на обучение. 

DevOps SRE