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

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

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

b01d07441e35450dfdc3729050ae70cf.jpg

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

61edae322ef058e98f501c36fbee70fc.jpg

Из чего состоят дистрибутивы 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 гигабайт свободного пространства:

8537cedce4774adf17e88d2e4da00791.png649e13f5aa2b2b4aaa872dff6b6ff4af.png

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

f6887d6c94ccc3f318593429d981e4ff.png

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

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

Разберём устройство абстракций LVM:

  • на нижнем уровне находится физический диск /dev/sda, который мы можем инициализировать как Physical Volume (PV). 

  • на PV мы создаём Volume Group (VG) — группу разделов;

  • на VG — логические тома Logical Volume (LV);

  • на LV — файловые системы, куда будут ставиться пакеты. 

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

a2e9957a279fc4942a9e3e63d02c64f2.png

Возвращаемся к установке: мы уже создали раздел 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

0d58418301aaad1ad981505c4fbfddaa.png

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

Root@archiso ~ # vgs

или:

Root@archiso ~ # vgsdisplay

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

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

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

42108ea1200325fcc798478f65cdb74b.png

Повторяем то же самое для раздела 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

e45666ccd34eb72e537ceb8013820f6d.png

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

e9eb9593e6cc5d0f29ec521f74352459.png

Монтирование корневого раздела и загрузка 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 секунд:

7057c26bdf78e9f4988edafbbc03d68c.png

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

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

39b1cf6d430320ae260653c8c893f250.png

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

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

c6eb46b79f26da149e0d469762672ef5.png

Всё это мы делаем, чтобы вытащить 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

4f4995f53be37a3f39a91b9bc906b65c.png

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

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

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

2b44898faa6e04e24fc8a8f126d7c793.png

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

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

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

Root@archiso /mnt/centos # cd liveos/

404426d144e079fa2c779814d117e738.png

Чтобы временная система работала корректно, нужно примонтировать к ней каталоги /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/

89b664a3b9b8fefd13a34f88dab25b07.png

Видим, что появилась файловая система 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-адрес зеркал:

621eb1de3347fe3473d41c0f1bf90bb2.png

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

[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.

674dd9ea507a7609cb278916ae0217c5.png

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

87b02483c9531c16280b6f3944e06b45.png

И выходим из 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, чтобы показать, что интерфейс нужно запустить при запуске системы.

76eb93597e5814b7fe41b425b5dc0bab.png

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

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

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

379286dd39fa1aed720c9173201caf08.png

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

Устанавливаем загрузчик 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 вручную без использования установщика. Надеемся, кейс поможет глубже понять, из чего состоит и как работает операционная система.

Для тех, кто хочет разобраться в Linux на продвинутом уровне

3 октября стартует второй поток «Aдминистрирование Linux Mega» от инженера Southbridge Платона Платонова. Это хардовый курс, на котором вас ждут: 12 часов теории, 48 часов практики на стендах, 9 масштабных тем и несчитанное количество реальных кейсов. 

Цель — передать вам знания и опыт эффективной работы с Linux. Даже в базовых темах мы будем разбирать best practices и смотреть в глубину работы с ОС.

Посмотреть программу и записаться: https://slurm.club/3q9GQKH

© Habrahabr.ru