Внутренности Linux
Над повседневными командами лежит меньший набор идей, который и решает, понимаете ли вы по-настоящему, что делает машина: что такое процесс на самом деле, где реально живут его данные на диске и что происходит между включением питания и приглашением на вход. С этой моделью зависший процесс, «диск полон», который не объясняет df, или сервис, пропадающий после перезагрузки, решаются за секунды — без неё вы буксуете, пересказывая команды.
Эта тема и есть та модель в трёх частях. Сначала процесс: PID/PPID и файловые дескрипторы, fork+exec, состояния R/S/D/T/Z, сигналы и различие зомби и сироты, на котором спотыкаются многие. Затем хранилище: inode против блоков данных, почему расходятся df и du, LVM и RAID, монтирование и iowait. Наконец загрузка: firmware → GRUB → ядро+initramfs → systemd как PID 1, и путаница enable против start, которую спрашивают почти на каждом собеседовании. Каждый слой явно называет свои ловушки, чтобы вы узнали их раньше, чем их расставит интервьюер.
Карта темы
- Процессы и сигналы — процесс как
PIDсо своим адресным пространством и файловыми дескрипторами,fork+exec, состояния R/S/D/T/Z, неперехватываемые сигналы и чем зомби отличается от сироты. - Хранилище и файловые системы — inode против блоков данных, исчерпание inode, расхождение
dfиduиз-за удалённого, но открытого файла, LVM, уровни RAID и монтирование. - Загрузка и systemd — последовательность от firmware через GRUB, ядро и
initramfsдоsystemdкак PID 1, а также различиеenableиstartи диагностика загрузки.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Пытаться kill -9 зомби | Ничего не происходит — зомби уже мёртв; нужно заставить родителя его собрать |
Ждать, что kill -9 уберёт процесс в состоянии D | SIGKILL не доставить, пока не вернётся блокирующий I/O; чините хранилище, а не процесс |
| Удалять большой файл ради места, пока процесс держит его открытым | Место не освободится, пока не закрыт дескриптор; df и du расходятся |
| Считать inode неограниченными | Миллионы крошечных файлов исчерпают inode, а df покажет свободное место; смотрите df -i |
Запустить systemctl start и думать, что переживёт перезагрузку | Unit всё ещё disabled; только enable привязывает его к target загрузки |
| Думать, что контейнеру нужно своё ядро для загрузки | Он делит ядро хоста; внутри контейнера нет BIOS/GRUB/initramfs |
Значение для собеседований
Эти вопросы проверяют модель мышления, а не эрудицию. «Зомби — это мёртвый процесс, которого родитель не собрал, поэтому kill -9 бесполезен — чините родителя» сразу читается как ответ человека, который такое отлаживал. Так же и «высокий iowait означает, что CPU простаивают на диске, а не что процессор занят», и «enable привязывает сервис к target загрузки, а start лишь запускает его сейчас».
Что обычно проверяют:
- Что делают
forkиexecи чем зомби отличается от сироты. - Почему процесс в
DигнорируетSIGKILLи как его реально убрать. - Почему расходятся
dfиduи как выглядит исчерпание inode. - Полную цепочку загрузки и зачем нужен
initramfs;enableпротивstart.
Типичный неверный ответ: «просто kill -9 его». SIGKILL не тронет ни зомби (он уже мёртв), ни процесс в D (заблокирован в ядре, пока не вернётся I/O), и он пропускает штатное завершение сервиса. Понимание того, когда сила бесполезна, и отличает инженера, который чинит причину, а не долбит по симптому.