Учебник устроен не как справочник, а как маршрут. Здесь на настоящем материале показано всё, из чего состоят главы: схема, которую можно сломать, терминал с подсказками, инсайты и вопросы по теме.
читать ~6 минутинсайтов 3
В прологе
почему темы идут именно в таком порядке;
как работать с живыми схемами — на задаче «удалил файл, а место не освободилось»;
что такое инсайт и зачем их ловить;
как читать вывод команд с подсказками — на примере free -h;
как устроены вопросы для самопроверки в конце каждой главы.
01Маршрут, а не справочник
Учебник разложен на 18 тем, и темы выстроены в том порядке, в котором их стоит учить: Linux → сети → скрипты и Git → веб и безопасность → контейнеры и Kubernetes → доставка кода → эксплуатация и архитектура. Последняя тема стоит особняком — она о собеседовании.
Порядок не случаен. Kubernetes невозможно понять, не зная, что такое процесс, namespace и iptables. Поэтому главы ссылаются только назад: всё, что нужно для текущей главы, уже было объяснено раньше. Читай подряд — и ни разу не упрёшься в «это вы и так знаете».
Цвет темы
У каждой темы свой цвет из спектра — маршрут идёт от янтарного Linux до оранжевого финала:
Внутри главы всё окрашено в цвет её темы: номера разделов, схемы, инсайты. По одному взгляду понятно, где ты находишься.
02Схемы, которые можно сломать
Главное в учебнике — не текст, а схемы. Многие из них интерактивные: можно нажимать команды и смотреть, что происходит внутри системы. Вот классическая задача по Linux:
Ночью диск забит на 96%. Ты нашёл огромный лог, сделал rm — а место не освободилось. Что происходит и как вернуть место, не перезапуская сервис?
Не отвечай пока — попробуй сам на схеме ниже: удали файл, загляни в дескрипторы процесса, обнули файл через /proc или останови процесс. Следи за диском и за счётчиками inode.
Почему rm не освобождает местоинтерактив
Каталог /var/log
access.log→ inode 1201
app.log→ inode 1337
error.log→ inode 1202
каталог — это таблица «имя → номер inode»
Ядро
inode 1337жив
имён в каталогах (links)
1
открыт процессами
1
размер данных
6,2 ГБ
Процесс app · PID 812
fd 0/dev/null
fd 1pipe:[40813]
fd 2error.log
fd 3app.log
таблица открытых дескрипторов процесса
процесс остановлен — дескрипторы закрыты
Раздел /var · 10 ГБ96% занято
df видит: 9,6 ГБdu по именам: 9,6 ГБ
Схема 0.1Файл держат две независимые вещи: имена в каталогах и открытые дескрипторы процессов. Блоки на диске освобождаются, только когда обнулились обе.
Что тут видно. Файл в Linux держат две независимые вещи: имена в каталогах (счётчик links в inode) и открытые дескрипторы процессов. rm убирает только имя. Пока процесс держит дескриптор, inode жив и его блоки заняты — df продолжает показывать забитый диск, а du, который ходит по именам, файла уже не находит. Отсюда классическое «df говорит 96%, а du — 34%».
Инсайт
rm не удаляет файл. Он удаляет одно имя. Данные исчезнут, когда пропадёт последнее имя и закроется последний дескриптор.
Как лечить на проде. Найти такие файлы: lsof +L1 (открытые файлы, у которых осталось меньше одного имени) или lsof | grep deleted. Дальше два пути: перезапустить сервис — или, если перезапуск нельзя, обнулить файл прямо через дескриптор процесса: : > /proc/PID/fd/N. Процесс продолжит писать в тот же дескриптор, а место вернётся сразу.
И профилактика: логи не удаляют, а ротируют — logrotate с copytruncate или с сигналом процессу переоткрыть файл. Это отдельная глава в теме Linux.
03Инсайты
Инсайт — это не определение, а «вот почему так». Момент, после которого десяток вопросов отвечается сам собой. Они выделены рамкой цвета темы — как карточка выше.
Инсайт считается пойманным, когда ты его дочитал: карточка должна побыть на экране пару секунд. Счётчик живёт на главной, к концу маршрута их будет больше пятисот. Это не геймификация ради геймификации: если инсайт не пойман — значит, ты пролистал главное.
Инсайт
Имя файла хранится не в inode, а в каталоге. Каталог — это просто таблица «имя → номер inode». Поэтому у файла может быть много имён (жёсткие ссылки) — или ни одного.
Один этот факт объясняет сразу три вещи из схемы выше: почему rm удаляет «имя», откуда у файла несколько имён и как файл может жить вообще без имени.
0инсайтов поймано тобой. Прокрути назад — первая карточка тоже считается.
04Терминал с подсказками
Вывод команд — то, что ты будешь видеть на работе каждый день. Поэтому вывод в учебнике размечен: наведи курсор на любую колонку — или нажми на неё с телефона.
↑ наведи на заголовок колонки — здесь появится объяснение
412 мегабайт свободно из 15 гигабайт — паниковать? Нет. Посмотри на available: почти 10 гигабайт можно отдать приложениям прямо сейчас, просто выкинув часть кэша.
Инсайт
Свободная память — потраченная впустую. Linux специально забивает её кэшем файлов, поэтому free почти всегда маленький, а смотреть нужно на available.
Ловушка
«free почти ноль — значит, память кончилась» — частая ошибка. Тревога — когда к нулю стремится available, а в vmstat 1 растут колонки si/so (система активно ходит в swap). Тогда следующим придёт OOM killer.
05Вопросы по теме
Каждая глава заканчивается вопросами для самопроверки. У каждого — короткий ответ и ссылка на раздел с полным разбором. Если ответ не вспоминается — раздел стоит перечитать.
Вот вопросы по материалу этого пролога:
Вопросы по теме
Проверь себя: короткий ответ и ссылка на раздел с разбором
01Файл удалили, но место на диске не освободилось. Что держит файл?
Файл держит процесс, у которого он открыт. rm удаляет только имя из каталога; inode и блоки живут, пока на файл ссылается хотя бы одно имя или открытый дескриптор. Найти: lsof +L1 или lsof | grep deleted — увидишь процесс и номер fd с пометкой (deleted).
02Как освободить место от удалённого, но удерживаемого файла, если сервис нельзя перезапускать?
Обнулить файл через дескриптор процесса: : > /proc/PID/fd/N или truncate -s 0 /proc/PID/fd/N. Процесс продолжит писать в тот же fd. Если он пишет без O_APPEND, файл станет разреженным (видимый размер большой, реальных блоков мало) — место всё равно вернётся.
03df -h показывает 80% занятого места, а du — только 20%. Почему такая разница?
df спрашивает у файловой системы, сколько блоков занято, а du обходит дерево имён и суммирует размеры. Удалённые, но открытые файлы du не видит. Другие причины: данные лежат в каталоге, поверх которого смонтирована другая ФС; зарезервированные под root блоки (ext4, 5% по умолчанию).
В каталоге. Каталог — специальный файл, содержимое которого — записи «имя → номер inode». В самом inode хранятся метаданные: тип, права, владелец, размер, время, счётчик ссылок и адреса блоков данных, но не имя.
05В чём разница между free и available в выводе free?
free — память, не занятая ничем. available — оценка ядра, сколько можно отдать новым процессам без свопа: свободная память плюс вытесняемая часть кэша. Поэтому available почти всегда больше free, и решения принимают по нему.
Да, если available достаточно: это значит, что ядро использует память под кэш. Проблема — когда падает available, растёт использование swap и появляются si/so в vmstat, а в dmesg — записи OOM killer.
Регистрироваться не нужно. Прочитанные главы и пойманные инсайты хранятся только в твоём браузере. Глава отмечается прочитанной, когда ты доходишь до её конца — на главной у темы закрашивается чёрточка.
Светлая тема — кнопка с солнцем справа вверху. Оглавление главы — кнопка «Содержание». Сбросить прогресс можно в подвале главной.
Всё. Дальше — Linux: оболочка, файлы, права, процессы, память, диски — всё, на чём стоит любая инфраструктура.