Привет, Хабр!

В новой статье разбираем процесс установки 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 тысяч километров. Вставить в него флэшку вы не можете, воспользоваться KVM тоже. Всё, что у вас есть, — 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# iffs /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 и даже ни разу не увидели графический установщик. 

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

Комментарии (5)


  1. martin74ua
    05.09.2022 16:35
    +7

    Вообще писать не о чем?


    1. geniyoctober
      05.09.2022 16:59

      Хороших материалов много не бывает.


      1. martin74ua
        05.09.2022 17:03
        +4

        хороших - да... но описывать ручную инсталляцию центоса, еще и 7-го... Ладно, без графического инсталлера. А чем текстовая анаконда то не устроила? Ее и автоматизировать проще, если что )


  1. Revertis
    05.09.2022 17:02
    +3

    А нафига сейчас нужна ОС, вышедшая 13 лет назад?


  1. IKStantin
    05.09.2022 17:17
    +2

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

    У Арча archinstall давно уже в комплекте идет. Установка элементарная, полностью автоматизирована.