DevOps
Linux для DevOps
2017 год, Amazon S3. Один инженер ввёл неправильную команду в shell - и положил S3 на 4 часа. Полинтернета перестало работать. Одна команда в терминале. Linux - мощнейший инструмент, и как любой мощный инструмент, он требует понимания.
- **Docker** - каждый контейнер это Linux-процесс с изолированной файловой системой. Без знания Linux невозможно отлаживать контейнеры.
- **CI/CD runners** - GitHub Actions, GitLab CI, Jenkins - все работают на Linux. Pipeline-скрипты это bash.
- **Troubleshooting в production** - когда сервер под нагрузкой, нужны ps, top, df, grep, tail -f. GUI нет. Только терминал.
- **Cloud-серверы** - AWS EC2, GCP, DigitalOcean - всё управляется через SSH и shell-команды
Unix: 50 лет, которые изменили мир
1969 год, Bell Labs. Ken Thompson пишет первую версию Unix за три недели, пока жена с ребёнком в отпуске. Изначально - инструмент для команды, работавшей над Space Travel game. Принцип «всё есть файл» и «маленькие утилиты, соединённые pipe» сформулирован Дугласом Макилроем. В 1991 году Линус Торвальдс публикует ядро Linux как «просто хобби» - сегодня оно работает на 96% серверов мира, всех Android-устройствах и большинстве суперкомпьютеров.
Предварительные знания
Shell: командная строка как суперсила
2017 год, Amazon S3. Один инженер выполняет плановую отладку billing-системы. Опечатка в аргументе команды - и крупнейшее объектное хранилище в мире уходит в даунтайм на 4 часа. Полинтернета перестаёт работать. **Shell** - это не просто «консолька». Это прямой интерфейс к ядру ОС, где каждая команда может изменить состояние системы необратимо.
**bash** (Bourne Again Shell) - стандарт на большинстве серверов. **zsh** - популярен на macOS и для разработки. Для DevOps важнее всего bash, потому что именно он стоит в Docker-образах и CI/CD runners.
Главная суперсила Shell - **pipes** и **redirection**. Pipe `|` берёт вывод одной команды и передаёт его на вход другой. Маленькие утилиты соединяются в конвейер - каждая делает одну вещь хорошо.
**grep**, **awk**, **sed** - три мушкетёра текстовой обработки. grep ищет, awk анализирует колонки, sed заменяет текст. Вместе они решают 90% задач по парсингу логов.
Shell-скрипт начинается с **shebang**: `#!/bin/bash`. Это указание ОС, какой интерпретатор использовать. Без shebang скрипт может выполниться в другом shell и сломаться.
Что делает команда `cat access.log | grep 404 | wc -l`?
Процессы: жизнь программ в Linux
Production-сервер, CPU 100%, пользователи видят 504 Gateway Timeout. Первое, что делает опытный SRE - `ps aux` и `top`. Каждая запущенная программа в Linux - это **процесс** с уникальным **PID** (Process ID). Ядро выделяет ему память, CPU-время и файловые дескрипторы. Диагностика начинается с понимания этих примитивов.
**Сигналы** - способ общения с процессами. Самые важные: **SIGTERM** (15) - вежливая просьба завершиться, процесс может сделать cleanup. **SIGKILL** (9) - принудительное убийство, процесс не может его перехватить.
**systemd** - система инициализации и менеджер сервисов в современном Linux. Управляет запуском, остановкой, перезапуском и мониторингом демонов (фоновых процессов).
**Background processes** - запуск задач в фоне. Символ `&` запускает процесс в фоне, но он умрёт при закрытии терминала. `nohup` защищает от этого.
Процесс Node.js завис и не отвечает на SIGTERM. Что делать?
Файловая система Linux
Диск на сервере заполнен на 95% - деплой падает, логи не пишутся, база данных выдаёт ошибки. Куда смотреть в первую очередь? В Linux **всё - файл**: обычные файлы, директории, устройства, сокеты, информация о процессах. Всё в единой иерархии с корнем `/`. Знание этой карты превращает панику в план действий.
**FHS** (Filesystem Hierarchy Standard) - стандарт, определяющий, где что лежит в Linux. Все дистрибутивы следуют ему, поэтому навыки переносимы между Ubuntu, CentOS, Debian.
| Путь | Назначение | DevOps-контекст |
|---|---|---|
| /etc | Конфигурационные файлы | nginx.conf, sshd_config, hosts |
| /var/log | Логи системы и сервисов | syslog, nginx/access.log, auth.log |
| /var/lib | Данные сервисов | docker/, postgresql/, mysql/ |
| /tmp | Временные файлы (очищается) | Не хранить ничего важного! |
| /home | Домашние директории пользователей | /home/deploy/.ssh/authorized_keys |
| /opt | Стороннее ПО | Часто размещают приложения |
| /usr/bin | Основные программы | git, curl, node, python |
| /proc | Виртуальная FS (инфо о процессах) | /proc/cpuinfo, /proc/meminfo |
**Inodes** - внутренняя структура, хранящая метаданные файла (права, владельца, размер, расположение на диске). Имя файла - лишь ссылка на inode. Это объясняет, почему можно создать несколько имён (hardlinks) для одного файла.
**Mount points** - точки монтирования. В Linux нет дисков C: и D: как в Windows. Разделы и устройства монтируются в дерево файловой системы.
**Частая ловушка:** `free` показывает мало "free" памяти, и начинающие паникуют. На самом деле Linux активно использует свободную RAM для кеша (buff/cache). Смотреть на колонку **"available"** - это реально доступная память.
Сервер показывает `df -h` с 95% использованного места на /var. Где скорее всего проблема?
Права доступа и безопасность
Security-аудит. Аудитор запускает первый скрипт и сразу находит файлы с правами 777. Отчёт: критическая уязвимость. Веб-сервер скомпрометирован - конфиги изменены, SSH-ключи скопированы. Linux - многопользовательская система. Каждый файл принадлежит **пользователю** и **группе**, и имеет три набора прав: для владельца (**u**ser), группы (**g**roup) и всех остальных (**o**thers).
| Число | Права | Значение |
|---|---|---|
| 7 | rwx | Чтение + запись + выполнение |
| 6 | rw- | Чтение + запись |
| 5 | r-x | Чтение + выполнение |
| 4 | r-- | Только чтение |
| 3 | -wx | Запись + выполнение |
| 2 | -w- | Только запись |
| 1 | --x | Только выполнение |
| 0 | --- | Нет прав |
**SUID/SGID** - специальные биты, позволяющие запускать программу с правами владельца файла. Например, `passwd` имеет SUID-бит, чтобы обычный пользователь мог менять свой пароль (который хранится в файле root).
**chmod 777 - НИКОГДА на production!** Это даёт ВСЕМ пользователям полный доступ к файлу: чтение, запись и выполнение. Любой процесс, включая взломанный веб-сервер, сможет изменить конфиги, скрипты и данные. Это первое, что проверяют при аудите безопасности.
chmod 777 решает любые проблемы с доступом к файлам - если что-то не работает, просто дай права всем
chmod 777 - серьёзная уязвимость безопасности. Права нужно выдавать минимально необходимые: владельцу - что нужно, группе - если нужно, остальным - только чтение или ничего
Principle of Least Privilege - краеугольный камень безопасности. chmod 777 означает, что ЛЮБОЙ процесс на сервере (включая взломанный веб-сервер или эксплуатируемую уязвимость) может читать, изменять и запускать файл. На production это ведёт к подмене скриптов, утечке секретов и полному компрометированию системы.
SSH-ключ имеет права 644 (rw-r--r--). SSH-клиент отказывается подключаться. Почему?
Ключевые идеи
- **Shell** - основной интерфейс к серверам. Pipes (`|`) и redirection (`>`, `>>`) позволяют строить мощные однострочники
- **Процессы** имеют PID, управляются сигналами (SIGTERM -> SIGKILL) и systemd для сервисов
- **FHS** - стандартная структура: конфиги в /etc, логи в /var/log, /proc для системной информации
- **Права доступа** rwx для user/group/others - chmod 600 для секретов, chmod 755 для скриптов
- Аварийное отключение S3 произошло из-за одной опечатки в команде - понимание семантики каждой команды критично
- **Принцип наименьших привилегий** - давать минимально необходимые права, никогда chmod 777 на production
Связанные темы
Linux - фундамент для всех следующих тем курса DevOps:
- Сети для DevOps — Сетевые утилиты Linux: curl, netstat, ss, tcpdump, iptables
- Что такое DevOps — Автоматизация из предыдущего урока строится на shell-скриптах
Вопросы для размышления
- Подключение к production-серверу, CPU 100%. Какие команды выполнить в первую очередь и почему?
- Почему Linux использует текстовые конфиги (/etc/nginx/nginx.conf) вместо графического интерфейса? Какие преимущества это даёт для DevOps?
- Как организовать права доступа на сервере, где работают три команды: frontend, backend и DevOps?
Связанные уроки
- devops-01 — Вводный урок DevOps задаёт контекст автоматизации на Linux
- devops-03 — Сетевые утилиты Linux: curl, netstat, ss, tcpdump, iptables
- devops-04 — Docker строится на Linux namespaces и cgroups
- cloud-02 — Контейнеры и VM живут поверх Linux - без shell навыков не отладить
- sec-01 — Права доступа и Principle of Least Privilege - основа security
- devops-08 — CI/CD pipelines - это bash-скрипты на Linux runners
- os-01-intro
- os-21-linux-internals