Привет, Хабр!
В новой статье разбираем процесс установки 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 и даже ни разу не увидели графический установщик.
Мы пошагово рассмотрели, как установить CentOS 7 вручную без использования установщика. Надеемся, кейс поможет глубже понять, из чего состоит и как работает операционная система.
Для тех, кто хочет разобраться в Linux на продвинутом уровне
3 октября стартует второй поток «Aдминистрирование Linux Mega» от инженера Southbridge Платона Платонова. Это хардовый курс, на котором вас ждут: 12 часов теории, 48 часов практики на стендах, 9 масштабных тем и несчитанное количество реальных кейсов.
Цель — передать вам знания и опыт эффективной работы с Linux. Даже в базовых темах мы будем разбирать best practices и смотреть в глубину работы с ОС.
Посмотреть программу и записаться: https://slurm.club/3q9GQKH