Как организован Linux

Загрузка системы и файловые системы

Вячеслав Федоров

Лекция 1

Разработка и применение ПО

в физических исследованиях

$_

Содержание

Загрузка системы: от включения питания до запуска служб

01

BIOS и UEFI

02

Загрузчик

03

Ядро

04

Init

BIOS

Basic

Input

Output

System

01

BIOS

Загрузчик

Ядро

Init

Переход к коду прошивки

ЦП

jmp

Код прошивки во флеш-памяти

переход к прошивке

0xFFFFFFF0

reset vector

адресное пространство

После сброса процессор выполняет инструкцию по адресу 0xFFFFFFF0 (вектор сброса). Адрес отображается на флеш-память с прошивкой, поскольку оперативная память ещё не инициализирована; по нему размещена команда перехода к основному коду прошивки.

POST

Power On Self Test

01

Проверяется целостность образа прошивки во флеш-памяти

02

Инициализируется оборудование:

процессор

память

интерфейсы

03

Запускаются встроенные прошивки видеокарт, сетевых карт и других устройств

Пояснение

В UEFI те же задачи распределены по фазам SEC, PEI, DXE и BDS; оперативная память инициализируется на фазе PEI.

Диагностика

ошибок POST

POST-карта: код этапа

КодЭтап (прошивка AMI)
01включение питания, определение типа сброса
02инициализация процессоров до загрузки микрокода
06загрузка микрокода
07инициализация процессоров после загрузки микрокода

Звуковые сигналы

СигналЗначение (прошивка Award)
1 короткийуспешный POST
2 короткихне подключён монитор
3 длинныхнеисправна материнская плата
1 длинный, 1 короткийнеисправна материнская плата
1 длинный, 2 короткихнеисправна видеосистема

Важно

Расшифровка кодов и сигналов различается у производителей прошивок (AMI, Award, Phoenix); на серверах те же сведения записываются в журнал контроллера BMC.

MBR

Master Boot Record

ДИСК (не более 2 ТиБ)

MBR

512 байт

Первичный раздел

Первичный раздел

Первичный раздел

Первичный раздел

Запись MBR занимает первый сектор диска и описывает не более четырёх первичных разделов; номер сектора в ней 32-битный, поэтому размер диска ограничен 2 ТиБ.

Структура

MBR

MBR — 512 БАЙТ

КОД НАЧАЛЬНОГО ЗАГРУЗЧИКА — 446 байт

ЗАПИСЬ О РАЗДЕЛЕ — 16 байт × 4

СИГНАТУРА 55 AA — 2 байта

Последние 16 байт сектора 0:

root@lab:~# dd if=/dev/vda bs=512 count=1 2>/dev/null | xxd | tail -n 1

000001f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U.

Расширенный раздел и

EBR

ДИСК (не более 2 ТиБ)

MBR

ТАБЛИЦА РАЗДЕЛОВ

РАСШИРЕННЫЙ РАЗДЕЛ

РАЗДЕЛ

EBR

ДАННЫЕ

РАЗДЕЛ

EBR

ДАННЫЕ

РАЗДЕЛ

EBR

ДАННЫЕ

ПЕРВИЧНЫЙ РАЗДЕЛ

…

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

GPT

GUID Partition Table

ДИСК

РЕЗЕРВНАЯ КОПИЯ

MBR

защитный

ЗАГОЛОВОК GPT

ТАБЛИЦА РАЗДЕЛОВ

РАЗДЕЛ GUID

РАЗДЕЛ GUID

РАЗДЕЛ GUID

РАЗДЕЛ GUID

РАЗДЕЛ GUID

РАЗДЕЛ GUID

РАЗДЕЛ GUID

…

ЗАГОЛОВОК GPT

ТАБЛИЦА РАЗДЕЛОВ

01

Номер сектора 64-битный: предел 8 ЗиБ

02

По умолчанию 128 записей о разделах

03

Контрольные суммы CRC32 и резервная копия

UEFI

и

BIOS

01

UEFI является современным стандартом, пришедшим на смену BIOS

02

Архитектура UEFI сложнее: стандарт служит единым интерфейсом между прошивкой и ОС

03

UEFI читает файловую систему FAT32 и запускает загрузчик как файл

04

В UEFI реализована проверка подписи загрузчика — Secure Boot

Режим, в котором загружена текущая система:

root@lab:~# [ -d /sys/firmware/efi ] && echo UEFI || echo BIOS

Загрузчик

Bootloader: поиск ядра и передача ему управления

02

BIOS

Загрузчик

Ядро

Init

Загрузка в

BIOS

и

MBR

ДИСК

MBR

КОД НАЧАЛЬНОГО ЗАГРУЗЧИКА

ПЕРВИЧНЫЙ РАЗДЕЛ

ФЛАГ BOOTABLE

КОД ЗАГРУЗЧИКА

КОД НАЧАЛЬНОЙ ЗАГРУЗКИ РАЗДЕЛА

ПЕРВИЧНЫЙ РАЗДЕЛ

…

Код из MBR находит раздел с флагом bootable и передаёт управление коду его первого сектора, который загружает основной код загрузчика.

Загрузка в

UEFI

и

GPT

UEFI

ДИСК

NVRAM

ЗАГРУЗОЧНАЯ ЗАПИСЬ

ЗАГРУЗОЧНАЯ ЗАПИСЬ

ЗАГРУЗОЧНАЯ ЗАПИСЬ

РАЗДЕЛ FAT32 (ESP)

.EFI ФАЙЛ

КОД ЗАГРУЗЧИКА

РАЗДЕЛ

…

Прошивка берёт из NVRAM загрузочную запись, указывающую диск, раздел и путь к файлу, и запускает этот файл с раздела FAT32 как программу.

Демонстрация:

загрузочные записи

Загрузочные записи в NVRAM и порядок загрузки:

root@lab:~# efibootmgr -v

Таблица разделов диска:

root@lab:~# fdisk -l /dev/vda

Файловые системы и точки монтирования:

root@lab:~# lsblk -f

Файлы загрузчиков на разделе ESP:

root@lab:~# ls /boot/efi/EFI/*

Что наблюдается

Запись Ubuntu указывает на раздел GPT по его GUID и на файл \EFI\ubuntu\shimaa64.efi; раздел ESP смонтирован в /boot/efi и имеет тип vfat.

Виды

загрузчиков

ЗагрузчикПрошивкаОсобенности
GRUB2BIOS, UEFIмодули ФС, RAID и LVM; меню; используется в большинстве дистрибутивов
systemd-bootUEFIпростые текстовые записи; ядра размещаются на ESP
rEFIndUEFIграфическое меню, автоматический поиск систем
EFI stubUEFIядро само является EFI-приложением
LILOBIOSисторический; хранит номера блоков ядра, не читая ФС
PXELINUX, iPXEсетьзагрузка по сети (раздел о PXE)

Пояснение

Далее рассматривается GRUB2 как наиболее распространённый загрузчик Linux.

Загрузчик

GRUB2

01

Загружает модули драйверов периферии и файловых систем

root@lab:~# ls /boot/grub/*-efi/ | head

02

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

03

Хранит загрузочные записи в /boot/grub/grub.cfg

root@lab:~# grep -E '^(menuentry|submenu)' /boot/grub/grub.cfg

Важно

Файл grub.cfg генерируется командой update-grub (grub-mkconfig) из /etc/default/grub и /etc/grub.d/; ручная правка теряется при обновлении ядра.

GRUB2

в режимах

BIOS

и

UEFI

BIOS

boot.img: первые 446 байт MBR

core.img: раздел BIOS boot или промежуток после MBR; драйвер ФС

GRUB: модули, меню, grub.cfg

ядро и initramfs

UEFI

grubx64.efi на разделе ESP (FAT32)

GRUB: модули, меню, grub.cfg

ядро и initramfs

В режиме UEFI загрузчик является обычным файлом на разделе FAT32, поэтому промежуточные ступени не требуются.

Демонстрация:

меню GRUB2

Текущие параметры меню:

root@lab:~# grep ^GRUB_ /etc/default/grub

Показ меню в течение 10 с: GRUB_TIMEOUT_STYLE=menu, GRUB_TIMEOUT=10

root@lab:~# nano /etc/default/grub

Пересборка grub.cfg:

root@lab:~# update-grub

Перезагрузка; в меню клавиша e открывает пункт для правки:

root@lab:~# reboot

Что наблюдается

update-grub перечисляет найденные ядра; после перезагрузки появляется меню, а правка строки linux действует однократно.

Ядро Linux

Kernel: исполняемый файл, запускаемый загрузчиком с параметрами

03

BIOS

Загрузчик

Ядро

Init

Ядро

Linux

01

Ядро представляет собой исполняемый файл /boot/vmlinuz-<версия>

root@lab:~# file /boot/vmlinuz-$(uname -r)

02

Загрузчик запускает этот файл с заданными параметрами

root@lab:~# cat /proc/cmdline

ПараметрНазначение
BOOT_IMAGEфайл ядра, выбранный в меню GRUB
root=корневая файловая система, обычно по UUID
roкорень монтируется только для чтения до проверки fsck
quiet splashсокращённый вывод сообщений и заставка

Демонстрация:

ядро и параметры

Версия работающего ядра:

root@lab:~# uname -r

Файлы ядра и initramfs в /boot:

root@lab:~# ls -lh /boot

Тип файла ядра:

root@lab:~# file /boot/vmlinuz-$(uname -r)

Параметры, переданные загрузчиком:

root@lab:~# cat /proc/cmdline

Что наблюдается

Ядро хранится в сжатом виде; строка параметров совпадает со строкой linux в пункте меню grub.cfg.

Процесс инициализации ядра

загрузчик

ядро загружено в ОЗУ

ядро распаковано

ядро запущено с параметрами

initramfs

Пояснение

Ядро хранится в сжатом виде: загрузчику приходится читать с диска меньший объём, а распаковка в памяти выполняется быстрее чтения.

Initramfs

ЯДРО

монтируется как tmpfs

INITRAMFS

СКРИПТЫ

МИКРОКОД

МОДУЛИ

УТИЛИТЫ

init

Пояснение

Драйвер диска или файловой системы может быть собран модулем, а модули хранятся на корневой ФС, которую без драйвера не прочитать. Initramfs содержит всё необходимое, чтобы добраться до корня.

Важно

При корне на RAID1 образ должен уметь собирать массив: в Arch Linux хук mdadm_udev ставится раньше filesystems.

Демонстрация:

образ initramfs

Тип файла образа:

root@lab:~# file /boot/initrd.img-$(uname -r)

Список файлов в образе:

root@lab:~# lsinitramfs /boot/initrd.img-$(uname -r) | head

Распаковка образа во временный каталог:

root@lab:~# unmkinitramfs /boot/initrd.img-$(uname -r) /tmp/initrd

Начало скрипта init, запускаемого ядром:

root@lab:~# head -n 30 $(find /tmp/initrd -maxdepth 2 -name init)

Что наблюдается

В образе находятся модули ядра, утилиты и скрипт init, который монтирует /proc и /sys, находит корень и передаёт управление настоящему init.

Init

Родитель всех пользовательских процессов

04

BIOS

Загрузчик

Ядро

Init

Назначение

init

01

Управление порядком запуска процессов

02

Управление всеми запущенными процессами

03

Монтирование файловых систем

04

В современных системах — управление всей системой

Пояснение

Процесс init получает PID 1; при его завершении ядро останавливается с сообщением «Attempted to kill init!».

Реализации

init

РеализацияПринципГде используется
SysV initshell-скрипты в /etc/init.d, уровни запускастарые дистрибутивы
Upstartзапуск служб по событиямUbuntu 6.10–14.10, RHEL 6
OpenRCскрипты с зависимостями поверх SysVAlpine, Gentoo
systemdдекларативные юниты, параллельный запускDebian, Ubuntu, Fedora, Arch, RHEL

Пояснение

В контейнере роль PID 1 выполняет само приложение; для корректной обработки сигналов и потомков применяют минимальный init (tini, docker run --init).

Systemd

Наиболее распространённая реализация init

01

Набор утилит управления системой

root@lab:~# ls /usr/bin/*ctl

02

Управление службами и целями с учётом зависимостей

root@lab:~# systemctl list-dependencies default.target

03

Декларативное описание служб вместо shell-скриптов

/etc/init.d/ufw → /lib/systemd/system/ufw.service

Пояснение

Юнит — объект управления systemd: служба, точка монтирования, сокет, таймер; цель (target) объединяет юниты в состояние системы.

Описание

службы

# /etc/systemd/system/daq.service

[Unit]

Description=Запись данных с АЦП

Wants=network-online.target

After=network-online.target

[Service]

User=daq

ExecStart=/opt/daq/bin/logger --out /data/raw

Restart=on-failure

[Install]

WantedBy=multi-user.target

Для физика

Сбор данных, оформленный службой, запускается при загрузке и перезапускается после сбоя без участия оператора.

root@lab:~# systemctl daemon-reload

root@lab:~# systemctl enable --now daq

root@lab:~# journalctl -u daq -f

Демонстрация:

systemd

Дерево процессов с init в корне:

root@lab:~# pstree -p | head -n 12

Состояние службы:

root@lab:~# systemctl status cron

Журнал службы:

root@lab:~# journalctl -u cron -n 5

Зависимости цели по умолчанию:

root@lab:~# systemctl list-dependencies default.target | head

Описание службы ufw в двух форматах:

root@lab:~# wc -l /etc/init.d/ufw /lib/systemd/system/ufw.service

Что наблюдается

В корне дерева процессов находится systemd (PID 1); описание ufw в формате systemd в несколько раз короче скрипта SysV.

Система

загружена

BIOS или UEFI, POST

MBR или запись NVRAM

загрузчик GRUB2

ядро и initramfs

init, PID 1

службы

ЗвеноПризнак остановки загрузкиСредство проверки
прошивказвуковые сигналы, пустой экранPOST-карта, журнал BMC
загрузчик«No bootable device», grub rescue>efibootmgr -v, lsblk -f
ядроKernel panic: Unable to mount root fscat /proc/cmdline
initramfsоболочка (initramfs), ожидание корняcat /proc/mdstat, blkid
initаварийный режим, «Dependency failed»systemctl --failed

Последнее сообщение на экране указывает звено, на котором загрузка остановилась.

Назначение

Secure Boot

01

Запускаются только загрузчики, подписанные ключами из прошивки

02

Изначально прошивка содержит сертификаты Microsoft, и запускаемое без настройки ПО должно быть подписано ими

03

Возможно добавление собственных ключей (MOK) и подпись собираемого ПО

root@lab:~# mokutil --sb-state

Для физика

Самостоятельно собранный модуль ядра, например драйвер платы сбора данных, при включённом Secure Boot не загрузится без подписи ключом, зарегистрированным через MOK.

Реализация Secure Boot с

shim

ПРОШИВКА

UEFI

СЕРТИФИКАТЫ UEFI

предзагрузчик

shim

СЕРТИФИКАТ ДИСТРИБУТИВА

GRUB

ЯДРО

Прошивка проверяет подпись shim сертификатом Microsoft; shim содержит сертификат дистрибутива и проверяет им GRUB, а GRUB через shim проверяет ядро.

Пояснение

Microsoft не подписывает код под лицензией GPLv3, поэтому подписывается небольшой shim, а GRUB и ядро — ключом дистрибутива.

PXE

Preboot eXecution Environment

01

Протокол получения IP-адреса: изначально BOOTP, в настоящее время DHCP

02

Протокол доставки загрузчика и образа системы — TFTP

Для физика

Узлы вычислительного кластера часто не имеют системного диска: образ раздаётся по сети, и переустановка сотни узлов сводится к замене образа на сервере.

запуск PXE

DHCPDISCOVER

DHCPOFFER с адресом TFTP-сервера и именем файла

узел получает IP-адрес и загрузчик по TFTP

Файловые системы Linux

Хранение данных: от дисков до LVM

Вячеслав Федоров

Лекция 1

/

План

01

Устройство дисков

05

Монтирование

02

Задачи файловой системы

06

RAID

03

Виды файловых систем

07

LVM

04

Настройка файловой системы

08

Заключение

Устройство дисков

Накопители и размещение файловой системы

01

Диски

Задачи ФС

Виды ФС

Настройка

Монтирование

RAID

LVM

Схема

жёсткого диска

сектор

дорожка, цилиндр

головки: 8 на 4 пластины

Пластины на общем шпинделе разделены на концентрические дорожки, дорожки — на секторы по 512 байт или 4 КиБ. Дорожки с одинаковым номером на всех пластинах образуют цилиндр; для каждой поверхности предусмотрена своя головка.

Диск как последовательность

блоков

0

1

2

3

4

…

N−1

N

Для операционной системы диск представляет собой последовательность пронумерованных блоков одинакового размера. Интерфейс диска сводится к двум операциям: чтению и записи блока с заданным номером.

Пояснение

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

Размещение

файловой системы

таблица разделов

раздел диска

MBR

ext4

ЗАГРУЗОЧНЫЙ БЛОК

СУПЕРБЛОК

СВОБОДНОЕ ПРОСТРАНСТВО

ИНОДЫ

КОРНЕВОЙ КАТАЛОГ

ФАЙЛЫ И КАТАЛОГИ

Файловая система размещается внутри раздела: в его начале находятся служебные структуры, далее — таблица инодов и блоки данных.

Демонстрация:

суперблок

Файл-образ размером 1 ГиБ вместо диска:

root@lab:~# truncate -s 1G disk.img

Создание ext4; mkfs сообщает адреса копий суперблока:

root@lab:~# mkfs.ext4 disk.img

Основной суперблок и его копии:

root@lab:~# dumpe2fs disk.img | grep -i superblock

Параметры файловой системы из суперблока:

root@lab:~# dumpe2fs -h disk.img | head -n 20

Что наблюдается

Копии суперблока хранятся в блоках 32768, 98304, 163840, 229376; при повреждении основного используется копия: e2fsck -b 32768.

Файл:

инод и блоки данных

права, время, число ссылок

ИНОД

КОСВЕННЫЙ БЛОК

Инод хранит метаданные файла и номера его блоков; у большого файла номера блоков выносятся в косвенные блоки. Имени файла в иноде нет.

Каталог

/home/lab

foo.txt → инод 123

bar.txt → инод 456

…

Каталог является файлом особого типа, содержимое которого — таблица соответствия имён и номеров инодов.

Пояснение

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

FHS

— иерархия каталогов

/

├── etc     настройки системы и служб

├── home    каталоги пользователей

├── var

│   ├── log журналы

│   └── lib данные служб

├── usr     программы и библиотеки

├── boot    ядро, initramfs, GRUB

├── dev     файлы устройств

├── proc    процессы и ядро

└── sys     устройства и драйверы

man hier

Пояснение

Каталоги /proc и /sys не занимают места на диске: это интерфейс к ядру в виде файлов.

Задачи файловой системы

Что файловая система добавляет к последовательности блоков

02

Диски

Задачи ФС

Виды ФС

Настройка

Монтирование

RAID

LVM

Задачи

файловой системы

01

Управление пространством

учёт свободных и занятых блоков

02

Оптимизация производительности

кеширование, размещение данных

03

Индексация и поиск данных

иноды, каталоги, деревья поиска

04

Контроль доступа

владелец, права, списки ACL

05

Поддержка множества устройств

единый интерфейс для разных носителей

06

Управление чтением и записью

согласованность при сбоях, журнал

Фрагментация

Исходное состояние

F1

F2

F3

F4

F5

F6

F7

F8

F9

F10

Удалены F2 и F10

F1

 

F3

F4

F5

F6

F7

F8

F9

 

Записан файл B размером 8 КиБ

F1

B1

F3

F4

F5

F6

F7

F8

F9

B2

При удалении и записи файлов свободное место дробится, и новый файл размещается в несмежных блоках; на жёстком диске это увеличивает время чтения.

Пояснение

Современные ФС снижают фрагментацию отложенным выделением места; на SSD фрагментация практически не влияет на скорость.

Виды файловых систем

FAT · ext · XFS · btrfs · и многие другие

03

Диски

Задачи ФС

Виды ФС

Настройка

Монтирование

RAID

LVM

VFS

— виртуальная файловая система

Системные вызовы POSIX

open

read

write

close

lseek

stat

Для физика

Скрипт обработки, читающий файлы через open и read, одинаково работает с локальным диском, сетевым хранилищем кластера и tmpfs в памяти.

пространство пользователя

VFS

ext4

XFS

NFS

procfs

кеш страниц, блочный уровень

FAT

01

Поддерживается практически всеми ОС

02

Существенно ограничена в размерах

03

Имеет простую структуру

04

Не является журналируемой

Для физика

Файл данных больше 4 ГиБ на флеш-накопитель с FAT32 не записывается; для обмена такими файлами применяют exFAT.

ХарактеристикаFAT12FAT16FAT32
Номер кластера, бит121628
Размер кластера0,5–4 КиБ2–64 КиБ4–32 КиБ
Размер раздела16 МиБ4 ГиБ2 ТиБ*
Размер файладо размера раздела2 ГиБ4 ГиБ − 1 Б

* Штатное средство Windows форматирует FAT32 объёмом не более 32 ГиБ.

Расчёт

максимального размера раздела

предел = число адресуемых единиц × размер единицы

FAT12, кластер 4 КиБ:  2¹² × 4 КиБ = 16 МиБ

FAT12, кластер 512 Б:  2¹² × 512 Б = 2 МиБ

MBR, сектор 512 Б:     2³² × 512 Б = 2 ТиБ

FAT32, размер файла:   2³² Б − 1 Б ≈ 4 ГиБ

Пояснение

Часть номеров FAT12 зарезервирована, поэтому адресуется 4084 кластера, а не 4096.

Для физика

Тот же расчёт применим к данным: 32-битный счётчик тактов при частоте 100 МГц переполняется за 43 с.

ext4

Экстенты вместо перечня блоков

Хеш-деревья для каталогов

Число инодов задаётся при создании

Журналирование метаданных

По умолчанию в Debian и Ubuntu

Файл до 16 ТиБ, том до 1 ЭиБ

Возможности, включённые в файловой системе из демонстрации:

root@lab:~# tune2fs -l disk.img | grep -i features

Экстенты

вместо перечня блоков

Без экстентов: ext2, ext3

инод → номер каждого блока

файл в 1 ГиБ — 262 144 указателя

С экстентами: ext4

инод → пары (начало, длина)

файл в 1 ГиБ подряд — 8 экстентов

Экстент описывает до 32 768 блоков подряд, то есть 128 МиБ при блоке 4 КиБ: метаданных становится меньше, чтение и удаление больших файлов ускоряются.

Число экстентов конкретного файла:

root@lab:~# filefrag -v /boot/initrd.img-$(uname -r)

Демонстрация:

исчерпание инодов

Файловая система объёмом 64 МиБ всего с 1024 инодами:

root@lab:~# truncate -s 64M small.img; mkfs.ext4 -q -N 1024 small.img

Монтирование образа через loop-устройство:

root@lab:~# mkdir -p /mnt/small; mount -o loop small.img /mnt/small

Попытка создать 2000 пустых файлов:

root@lab:~# for i in $(seq 2000); do touch /mnt/small/f$i || break; done

Свободное место и свободные иноды:

root@lab:~# df -h /mnt/small; df -i /mnt/small

Что наблюдается

Около тысячного файла появляется ошибка No space left on device, хотя df -h показывает свободное место; df -i показывает 100 % занятых инодов.

Журналирование

Удаление файла — три записи в разные места диска:

1. Удаление записи из каталога

2. Освобождение инода

3. Освобождение блоков

Сбой между шагами оставляет файловую систему в несогласованном состоянии.

Журнал: сначала описание операции, затем изменения на месте:

запись в журнал

фиксация

изменения на месте

После сбоя зафиксированные транзакции повторяются из журнала за секунды вместо полной проверки диска.

root@lab:~# debugfs -R logdump disk.img

XFS

Работа с большими файлами

Индексы на B+-деревьях

Параллельная запись из многих потоков

Отложенное выделение места

Динамическое выделение инодов

По умолчанию в RHEL

Важно

Том XFS можно увеличить, но нельзя уменьшить; это учитывается при планировании дискового пространства.

Btrfs

Копирование при записи и снимки

B-деревья для всех структур

Контрольные суммы данных

Встроенные RAID 0, 1, 10 и подтома

Хранение мелких файлов в метаданных

По умолчанию в openSUSE и Fedora

TRIM

ОС: блоки освобождены

команда TRIM

SSD: сборка мусора

Команда TRIM сообщает накопителю, что блоки больше не используются и могут быть очищены заранее.

Копирование при записи и

снимки

Без копирования при записи: блок 2 перезаписывается на месте

1

2

3

4

 

 

1

2′

3

4

 

 

С копированием при записи: новая версия 2′ пишется в свободный блок

1

2

3

4

 

 

1

2

3

4

2′

 

Указатель файла переключается на 2′, а старый блок 2 остаётся доступным снимку. Снимок создаётся мгновенно и занимает место по мере расхождения с текущей версией.

Пример для системы с корнем на btrfs:

root@lab:~# btrfs subvolume snapshot -r / /.snapshots/before-update

Настройка файловой системы

Кеширование, планирование ввода-вывода, утилиты

04

Диски

Задачи ФС

Виды ФС

Настройка

Монтирование

RAID

LVM

Кеширование

Кеш страниц

Прочитанные с диска страницы остаются в памяти, и повторное чтение не обращается к диску.

Грязные страницы

Изменённые в памяти, но ещё не записанные данные; их записывает на диск фоновый поток ядра.

root@lab:~# free -h

root@lab:~# sysctl vm.dirty_background_ratio vm.dirty_ratio

root@lab:~# sync

Важно

Завершение команды cp не означает, что данные записаны на флеш-накопитель: перед извлечением выполняется sync или umount.

Планировщик

ввода-вывода

ПланировщикПринципКогда применять
noneбез переупорядочивания, FIFONVMe-накопители
mq-deadlineпредельные сроки запросовSATA SSD и HDD
bfqсправедливое деление полосырабочий стол
kyberограничение задержекбыстрые устройства

Доступные планировщики; текущий указан в квадратных скобках:

root@lab:~# cat /sys/block/vda/queue/scheduler

Пояснение

Планировщики CFQ, deadline и noop удалены в ядре 5.0; их заменили многоочередные none, mq-deadline, bfq и kyber.

Утилиты

файловой системы

mkfs

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

mkfs.ext4 /dev/sdb1

mkfs -t xfs /dev/sdc1

mke2fs

создание ext2/3/4 с параметрами

mke2fs -T largefile

mke2fs -N 4000000

debugfs

отладка ext2/3/4

debugfs -R stats

debugfs -R logdump

tune2fs

изменение параметров ext2/3/4

tune2fs -l

tune2fs -m 1

tune2fs -U random

fsck

проверка и восстановление

fsck -f /dev/sdb1

e2fsck -b 32768

Важно

Утилита fsck запускается только на размонтированной ФС; mkfs уничтожает данные раздела без предупреждения, поэтому имя устройства предварительно сверяется по lsblk.

Демонстрация:

резерв блоков

Монтирование образа disk.img:

root@lab:~# mkdir -p /mnt/disk; mount -o loop disk.img /mnt/disk

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

root@lab:~# LOOP=$(findmnt -no SOURCE /mnt/disk); echo $LOOP

Число блоков, зарезервированных для root:

root@lab:~# tune2fs -l $LOOP | grep -i "reserved block count"

Доступное место до и после отмены резерва:

root@lab:~# df -m /mnt/disk; tune2fs -m 0 $LOOP; df -m /mnt/disk

Для физика

По умолчанию 5 % блоков зарезервированы для root: на 20-ТБ архиве это 1 ТБ. Для тома с данными резерв уменьшают командой tune2fs -m 1.

Монтирование

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

05

Диски

Задачи ФС

Виды ФС

Настройка

Монтирование

RAID

LVM

Монтирование

/

home

var

data

/dev/sdb1 · ext4

mount

Букв дисков в Linux нет: файловая система раздела подключается к единому дереву каталогов в выбранную точку монтирования и до этого недоступна.

root@lab:~# mount /dev/sdb1 /data

root@lab:~# findmnt /data

root@lab:~# umount /data

/etc/fstab

UUID=9e02…41bd

устройство

/data

точка монтирования

xfs

тип ФС

defaults,noatime,nofail

параметры монтирования

0

dump

2

порядок проверки fsck

# <устройство> <точка> <тип> <параметры> <dump> <fsck>

UUID=6f1c…e2a7 / ext4 defaults 0 1

UUID=4A1B-2C3D /boot/efi vfat umask=0077 0 1

UUID=9e02…41bd /data xfs defaults,noatime,nofail 0 2

Важно

Устройство указывается по UUID: имена /dev/sdX меняются при добавлении дисков. Внешним и сетевым дискам нужен nofail, иначе их отсутствие останавливает загрузку.

Параметры

монтирования

atime/noatime

обновление времени доступа

relatime

компромисс по умолчанию

acl/noacl

списки контроля доступа

commit=N

период записи журнала, с

rw/ro

запись разрешена или запрещена

dev/nodev

файлы устройств

exec/noexec

запуск программ

suid/nosuid

биты смены владельца

sync/async

немедленная или отложенная запись

user/nouser

монтирование пользователем

auto/noauto

монтирование при загрузке

nofail

загрузка без устройства

Пояснение

Параметр defaults означает rw, suid, dev, exec, auto, nouser, async.

systemd.mount

— аналог fstab

# /etc/systemd/system/data.mount

[Unit]

Description=Том с данными эксперимента

[Mount]

What=/dev/disk/by-uuid/9e02…41bd

Where=/data

Type=xfs

Options=defaults,nofail

[Install]

WantedBy=multi-user.target

Пояснение

Имя юнита повторяет путь: /data → data.mount. Строки fstab systemd при загрузке сам превращает в такие юниты.

Для физика

Служба записи данных запускается только после монтирования тома: RequiresMountsFor=/data.

Демонстрация:

монтирование

Файловые системы и их UUID:

root@lab:~# lsblk -f

Содержимое /etc/fstab и проверка его корректности:

root@lab:~# cat /etc/fstab; findmnt --verify

Повторное монтирование образа только для чтения:

root@lab:~# umount /mnt/disk; mount -o loop,ro disk.img /mnt/disk

Параметры монтирования и попытка записи:

root@lab:~# findmnt /mnt/disk; touch /mnt/disk/test

Что наблюдается

findmnt показывает параметр ro, а попытка записи завершается ошибкой Read-only file system.

RAID

Redundant

Array of

Independent

Disks

06

Диски

Задачи ФС

Виды ФС

Настройка

Монтирование

RAID

LVM

Аппаратный и программный

RAID

Аппаратный

Массив собирает контроллер с собственной памятью и батареей

Разгружает процессор и ускоряет запись за счёт кеша

Массив привязан к модели и прошивке контроллера

Программный

Массив собирает ядро (драйвер md), управляет им утилита mdadm

Не требует специального оборудования

Диски переносятся в другую машину, и массив собирается

Пояснение

Для лабораторного сервера программный RAID обычно удобнее: он переносим и не зависит от конкретного контроллера.

RAID 0, 1 и 10

RAID 0 · чередование

A1

A3

A5

A2

A4

A6

надёжность: низкая
чтение: высокое
запись: высокая
восстановление: невозможно
объём: N

RAID 1 · зеркало

A1

A2

A3

A1

A2

A3

надёжность: высокая
чтение: высокое
запись: средняя
восстановление: быстрое
объём: 1 диск

RAID 10 · оба

A1

A3

A5

A1

A3

A5

A2

A4

A6

A2

A4

A6

надёжность: высокая
чтение: высокое
запись: высокая
восстановление: быстрое
объём: N/2

RAID 5 и 6

— распределённая чётность

RAID 5 · одна сумма

A1

B1

C1

Dp

A2

B2

Cp

D1

A3

Bp

C2

D2

Ap

B3

C3

D3

надёжность: средняя
чтение: высокое
запись: средняя
восстановление: медленное
объём: N − 1

RAID 6 · две суммы

A1

B1

Cp

Dq

A2

Bp

Cq

D1

Ap

Bq

C1

D2

Aq

B2

C2

Dp

надёжность: высокая
чтение: высокое
запись: низкая
восстановление: медленное
объём: N − 2

Важно

Пересборка RAID 5 на больших дисках длится часами, и второй отказ в это время приводит к потере массива; для больших архивов выбирают RAID 6 или RAID 10.

XOR

— исключающее ИЛИ

⊕01
001
110

A ⊕ B ⊕ B = A

A ⊕ B ⊕ A = B

Чётность двух блоков данных:

A = 1011, B = 0110

P = A ⊕ B = 1101

Диск с A отказал:

A = P ⊕ B = 1011

Потерянный блок восстанавливается как XOR оставшихся; для двух отказов требуется вторая независимая сумма.

RAID не является резервной копией

Массив защищает от отказа диска, но не от удаления по ошибке, шифровальщика или пожара в серверной: всё это происходит на всех дисках одновременно.

Правило 3-2-1: три копии, два носителя, одна вне здания

Дисковые

утилиты

fdisk

разметка MBR и GPT

fdisk -l

gdisk

разметка GPT

gdisk -l /dev/sdb

parted

разметка и изменение размеров

parted -l

lsblk

дерево блочных устройств

lsblk -f

blkid

UUID и типы файловых систем

blkid /dev/sdb1

df

занятое и свободное место

df -hT

Пояснение

Утилита cfdisk — интерактивный вариант fdisk, удобный при ручной разметке в домашнем задании.

Создание RAID с помощью

mdadm

fdisk

fdisk -l

mdadm

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

mkfs

mkfs.ext4 /dev/md0

mount

mount /dev/md0 /mnt/raid

mdadm.conf

mdadm --detail --scan | tee -a /etc/mdadm/mdadm.conf

Массив исправен:

md0 : active raid1 sdc[1] sdb[0]

   1046528 blocks [2/2] [UU]

Диск sdb отказал:

md0 : active raid1 sdc[1] sdb[0](F)

   1046528 blocks [2/1] [_U]

root@lab:~# cat /proc/mdstat

Демонстрация:

зеркало mdadm

Два файла-образа вместо дисков:

root@lab:~# truncate -s 256M d1.img d2.img; mkdir -p /mnt/raid

Подключение образов как loop-устройств:

root@lab:~# L1=$(losetup -f --show d1.img); L2=$(losetup -f --show d2.img)

Создание зеркала:

root@lab:~# mdadm --create /dev/md0 --run --level=1 --raid-devices=2 $L1 $L2

Файловая система и тестовый файл:

root@lab:~# mkfs.ext4 -q /dev/md0; mount /dev/md0 /mnt/raid; echo run42 > /mnt/raid/r.txt

Имитация отказа диска:

root@lab:~# mdadm /dev/md0 --fail $L1; cat /proc/mdstat /mnt/raid/r.txt

Замена диска и пересборка:

root@lab:~# mdadm /dev/md0 --remove $L1 --add $L1; watch -n1 cat /proc/mdstat

После отказа массив в состоянии [_U], а файл читается; после замены идёт пересборка до [UU].

LVM

Logical

Volume

Manager

07

Диски

Задачи ФС

Виды ФС

Настройка

Монтирование

RAID

LVM

LVM

— логические тома

файловые системы

/data · XFS

/backup · ext4

свободно

логические тома

labvg/data

labvg/backup

 

группа томов

labvg: общий пул пространства

физические тома

/dev/sda1

/dev/sdb1

/dev/sdc1

/dev/sdd1

Физические тома объединяются в группу — общий пул пространства; из группы выделяются логические тома, на которых создаются файловые системы.

Для физика

Том растёт без переразметки дисков и может быть больше любого из них; снимок тома фиксирует состояние перед рискованной операцией.

Создание

LVM

fdisk

fdisk /dev/sda

разделы типа Linux LVM

pvcreate

pvcreate /dev/sda1 /dev/sdb1

pvs, pvremove

vgcreate

vgcreate labvg /dev/sda1 /dev/sdb1

vgs, vgextend

lvcreate

lvcreate -n data -L 20G labvg

lvs, lvextend -r, lvconvert

mkfs

mkfs.xfs /dev/labvg/data

ФС на логическом томе

Важно

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

Задачи

LVM

01

Гибкое управление дисками

02

Динамическое распределение места

03

Снимки томов

04

Масштабирование добавлением дисков

05

Зеркалирование средствами LVM

Пояснение

Снимок содержит файловую систему с тем же UUID; перед монтированием рядом с исходным томом UUID меняют: tune2fs -U random или xfs_admin -U generate.

Демонстрация:

LVM и снимок

Два файла-образа и точки монтирования:

root@lab:~# truncate -s 256M p1.img p2.img; mkdir -p /mnt/lv /mnt/snap

Подключение образов как loop-устройств:

root@lab:~# P1=$(losetup -f --show p1.img); P2=$(losetup -f --show p2.img)

Группа томов и логический том больше каждого диска:

root@lab:~# pvcreate $P1 $P2; vgcreate labvg $P1 $P2; lvcreate -n data -L 300M labvg

Файловая система на логическом томе:

root@lab:~# mkfs.ext4 -q /dev/labvg/data; mount /dev/labvg/data /mnt/lv

Увеличение тома вместе с файловой системой:

root@lab:~# lvextend -r -L +100M labvg/data; df -h /mnt/lv

Тестовый файл, снимок тома и список томов:

root@lab:~# echo run42 > /mnt/lv/r.txt; lvcreate -s -n snap -L 64M labvg/data; lvs

Удаление файла и чтение его из снимка:

root@lab:~# rm /mnt/lv/r.txt; mount -o ro /dev/labvg/snap /mnt/snap; cat /mnt/snap/r.txt

Заключение

01

Загрузка представляет собой цепочку «прошивка → загрузчик → ядро → initramfs → init»; неисправность локализуется по месту обрыва.

02

Разметка MBR ограничена четырьмя разделами и 2 ТиБ; GPT и UEFI снимают эти ограничения.

03

Файл — это инод и блоки данных; имя хранится в каталоге, а иноды могут закончиться раньше места.

04

Файловая система выбирается под нагрузку: ext4 по умолчанию, XFS для больших файлов, btrfs для снимков.

05

RAID защищает от отказа диска, LVM обеспечивает гибкость, но резервной копии не заменяет ни то, ни другое.

Домашнее задание

Arch Linux вручную с RAID1 и UEFI

01

Виртуальная машина: сначала Legacy BIOS, затем UEFI

02

Установка без archinstall: pacstrap, genfstab, arch-chroot

03

Программный RAID1 из двух дисков

04

Раздел загрузчика и запись efibootmgr на каждом диске

Требования к сдаче

Загрузка с одним диском: cat /proc/mdstat показывает degraded, затем массив пересобран

Вывод efibootmgr -v с записью загрузчика

Отчёт, по которому установку можно повторить

Репозиторий: github.com/phys-dev/booting-linux-task · глава «Установка Arch Linux»

Важно

На Mac с процессором Apple режим Legacy BIOS доступен только при эмуляции x86_64, например в UTM в режиме Emulate.

Типичные

ошибки

01

Нет раздела BIOS boot на GPT

grub-install --target=i386-pc: «embedding is not possible»

02

Хук mdadm_udev отсутствует или стоит после filesystems

массив не собран к моменту монтирования корня

03

Раздел ESP только на первом диске

после отказа первого диска прошивке не с чего загружаться

04

Файл grub.cfg исправлен вручную

правка теряется при следующем запуске grub-mkconfig

05

В fstab указаны имена /dev/sdX

после смены порядка дисков монтируется не тот раздел; genfstab -U записывает UUID

06

Отказ диска не проверен

RAID1, не проверенный на отказ, ничем не лучше одного диска

Источники

1

Книга курса: главы «Процесс загрузки», «Файловые системы», «Установка Arch Linux»

phys-dev.github.io/soft-dev-book

2

Лекция «Как всё организовано в Linux», КИТ 2024, Young&&Yandex; П. Катунина, Р. Новичков

youtube.com/watch?v=RanCaFrPYrs

3

Уорд Б. Внутреннее устройство Linux / Б. Уорд. – 3-е изд. – СПб.: Питер, 2022

4

ArchWiki: Arch boot process, GRUB, RAID, LVM, UEFI

wiki.archlinux.org

5

Документация ядра Linux: Ramfs, rootfs and initramfs

docs.kernel.org/filesystems/ramfs-rootfs-initramfs.html

6

Страницы руководства: hier(7), fstab(5), mount(8), mdadm(8), lvm(8), systemd.unit(5)

Спасибо за внимание

Вопросы

phys-dev.github.io/soft-dev-book

$_