Насквозь
00 · Пролог

Как читать «Насквозь»

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

читать ~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Терминал с подсказками

    Вывод команд — то, что ты будешь видеть на работе каждый день. Поэтому вывод в учебнике размечен: наведи курсор на любую колонку — или нажми на неё с телефона.

    user@prod-api-1: ~
    $ free -h
                   total        used        free      shared  buff/cache   available
    Mem:            15Gi       4.9Gi       412Mi       212Mi       9.9Gi        9.8Gi
    Swap:          2.0Gi          0B       2.0Gi
    ↑ наведи на заголовок колонки — здесь появится объяснение

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

    → схема 0.1
    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% по умолчанию).

    → раздел 02
    04Где хранится имя файла, если не в inode?

    В каталоге. Каталог — специальный файл, содержимое которого — записи «имя → номер inode». В самом inode хранятся метаданные: тип, права, владелец, размер, время, счётчик ссылок и адреса блоков данных, но не имя.

    → раздел 03
    05В чём разница между free и available в выводе free?

    free — память, не занятая ничем. available — оценка ядра, сколько можно отдать новым процессам без свопа: свободная память плюс вытесняемая часть кэша. Поэтому available почти всегда больше free, и решения принимают по нему.

    → раздел 04
    06Если free = 0 — это нормально?

    Да, если available достаточно: это значит, что ядро использует память под кэш. Проблема — когда падает available, растёт использование swap и появляются si/so в vmstat, а в dmesg — записи OOM killer.

    → раздел 04

    06Прогресс

    Регистрироваться не нужно. Прочитанные главы и пойманные инсайты хранятся только в твоём браузере. Глава отмечается прочитанной, когда ты доходишь до её конца — на главной у темы закрашивается чёрточка.

    Светлая тема — кнопка с солнцем справа вверху. Оглавление главы — кнопка «Содержание». Сбросить прогресс можно в подвале главной.

    Всё. Дальше — Linux: оболочка, файлы, права, процессы, память, диски — всё, на чём стоит любая инфраструктура.