Модуль 01 — Linux

Linux — кислород DevOps. 96% серверов в облаке — Linux. Все контейнеры внутри — Linux namespaces + cgroups. Без свободного владения — потолок Junior навсегда.

Цель модуля

К концу: можешь развернуть с нуля Ubuntu сервер, настроить пользователей, SSH, cron-задачи, диагностировать проблему по логам без гугла.

Что освоить
  1. Файловая система Linux (FHS)
  2. Базовые команды
  3. Работа с текстом и pipes
  4. Права доступа
  5. Процессы и systemd
  6. Сеть на Linux
  7. Диски и файловые системы
  8. SSH глубоко
  9. Мониторинг и диагностика
  10. Пакетные менеджеры

1. Файловая система Linux (FHS)

В Linux всё — файл. Конфиги, устройства, процессы, сокеты. Понимая структуру дерева, ты понимаешь систему.

/ ├── bin/ исполняемые программы для всех (ln → /usr/bin) ├── boot/ ядро и загрузчик (GRUB) ├── dev/ устройства: /dev/sda, /dev/null, /dev/random ├── etc/ ★ конфигурации системы (твой главный друг как DevOps) │ ├── nginx/, apt/, ssh/, systemd/, cron.d/ │ ├── passwd, shadow, group, hostname, hosts ├── home/ домашние директории пользователей │ └── student/ ├── lib/ библиотеки ├── media/ авто-монтирование съёмных носителей ├── mnt/ ручное монтирование ├── opt/ стороннее ПО (Java, корпоративные приложения) ├── proc/ ★ виртуальная ФС: /proc/cpuinfo, /proc/[PID]/status ├── root/ домашняя директория root ├── run/ runtime данные процессов ├── sbin/ системные исполняемые (для root) ├── srv/ данные сервисов ├── sys/ интерфейс к ядру ├── tmp/ временные файлы (очищается при ребуте) ├── usr/ user system resources: /usr/bin, /usr/local, /usr/share └── var/ ★ переменные данные ├── log/ ★ логи — твоё рабочее место ├── lib/ данные сервисов (PostgreSQL, Docker) ├── cache/ кэши

Запомни 3 директории-звезды для DevOps: /etc (конфиги), /var/log (логи), /proc (метаданные процессов).

2. Базовые команды (must-know)

Навигация

pwd                  # где я сейчас
ls -lah              # подробный список (long, all, human)
cd /var/log          # перейти
cd ~                 # в домашнюю
cd -                 # в предыдущую
tree -L 2            # дерево, 2 уровня глубины

Файлы и директории

mkdir -p a/b/c       # -p создаёт всю цепочку
touch file.txt       # создать пустой файл / обновить mtime
cp -r src/ dst/      # копировать рекурсивно
mv old new           # переместить / переименовать
rm -rf dir/          # УДАЛИТЬ! Опасно!
ln -s /target /link  # символическая ссылка
⚠️ Самые опасные команды

rm -rf / — удаляет ВСЁ. Никогда не пиши rm с переменными без двойной проверки: если $VAR пустой, rm -rf $VAR/ = rm -rf /.

Привычка: пиши rm -rf -- "$VAR"/... или используй trash-cli вместо rm.

Просмотр файлов

cat file.txt              # весь файл
less file.log             # постранично, /search для поиска
head -n 20 file           # первые 20 строк
tail -n 50 file           # последние 50
tail -f /var/log/syslog   # следить за новыми строками (логи)
wc -l file                # подсчёт строк

3. Работа с текстом и pipes ⭐

Это сердце UNIX-философии: маленькие команды → соединяешь в pipeline → решаешь сложную задачу. Это и есть DevOps-скриптинг.

Три потока (file descriptors)

Перенаправление

command > file        # stdout → file (перезапись)
command >> file       # stdout → file (добавить)
command 2> file       # stderr → file
command > out 2>&1   # stdout И stderr → out
command &> out        # краткая форма (bash)
command 2>/dev/null   # выкинуть ошибки в "никуда"
command < input.txt   # файл → stdin

Pipes (|) — соединение команд

# Сколько ERROR в логе
cat /var/log/app.log | grep ERROR | wc -l

# Топ-10 IP по числу запросов в access.log
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head

# Уникальные user-agent'ы
cut -d'"' -f6 access.log | sort -u

# Все ERROR за сегодня
journalctl --since today | grep -i error

Главные текстовые инструменты

КомандаЧто делаетПример
grepПоиск по содержимомуgrep -rn "TODO" src/
sedStream editor — заменаsed -i 's/old/new/g' file
awkОбработка по полямawk '{print $1, $5}' f.log
cutВырезать колонкиcut -d: -f1 /etc/passwd
sortСортировкаsort -rn -k 2
uniqУникальные строкиsort file | uniq -c
trЗамена символовtr ',' '\n'
xargsПередача аргументовfind . -name '*.log' | xargs rm
findПоиск файловfind /var -mtime +30 -type f

4. Права доступа

В выводе ls -l:

-rw-r--r-- 1 student student 234 May 10 14:23 file.txt
│└─┬─┘└─┬─┘└─┬─┘
│  │    │    └ права other (r--)
│  │    └ права group (r--)
│  └ права owner (rw-)
└ тип: - файл, d директория, l симлинк

Числовая запись (octal)

Каждая «триплета» = число от 0 до 7: 4=read, 2=write, 1=execute. Складываются.

ModeЗаписьПрименение
644rw-r--r--Стандартный файл
755rwxr-xr-xСкрипт / директория
600rw-------Приватный файл (SSH ключ!)
700rwx------Приватная директория
777rwxrwxrwx⚠️ Никогда в продакшене
chmod 600 ~/.ssh/id_rsa             # SSH-ключ должен быть таким
chmod +x script.sh                  # добавить execute
chmod -R 644 /var/www/site          # рекурсивно
chown -R www-data:www-data /var/www # владелец и группа

Специальные биты

Принцип least privilege: давай только те права, которые реально нужны. Это база DevSecOps.

5. Процессы и systemd

Просмотр процессов

ps aux                    # все процессы (BSD-стиль) ⭐
ps -ef                    # все процессы (System V)
top                       # интерактивный мониторинг
htop                      # улучшенный (нужно ставить)
btop                      # красивая альтернатива
pgrep nginx               # PID по имени

Сигналы и завершение

СигналКогда применять
SIGTERM15Стандартное завершение, перехватываемое (default для kill)
SIGKILL9Убить безусловно. Когда SIGTERM не сработал
SIGHUP1Часто = «перечитай конфиг»
SIGINT2Ctrl+C
SIGSTOP19Заморозить процесс
kill 1234              # SIGTERM (вежливо)
kill -9 1234           # SIGKILL (последний резерв)
killall nginx          # все процессы по имени
pkill -f "python app"  # по подстроке

systemd — управление сервисами

Современные Linux используют systemd. Это твой главный инструмент для управления сервисами.

systemctl status nginx         # статус
systemctl start nginx          # запустить
systemctl restart nginx        # перезапустить
systemctl reload nginx         # перечитать конфиг (SIGHUP)
systemctl enable --now nginx   # автозапуск + старт
systemctl disable nginx        # отключить автозапуск

journalctl -u nginx            # логи сервиса
journalctl -fu nginx           # follow (как tail -f)
journalctl -p err              # только ошибки
journalctl --since "1 hour ago"

Свой systemd unit (must-have для DevOps)

# /etc/systemd/system/myapp.service
[Unit]
Description=My App
After=network.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/run.sh
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
journalctl -fu myapp

Cron и systemd timers

Расписания: классический cron и современный systemd timer.

# crontab -e — формат: min hour day month dow command
0 2 * * *  /opt/backup.sh        # каждый день в 2:00
*/15 * * * * /opt/healthcheck.sh # каждые 15 минут
@reboot /opt/init.sh             # при старте системы

6. Сеть на Linux

# Современные команды (старые ifconfig/netstat — deprecated)
ip a                       # адреса интерфейсов
ip r                       # таблица маршрутизации
ip n                       # ARP таблица
ss -tlnp                   # открытые TCP порты + процессы

ping 8.8.8.8               # доступность
mtr google.com             # traceroute + ping (лучший)
dig google.com             # DNS запрос
curl -v https://api.example.com  # HTTP с verbose
nc -zv host 443            # проверка порта
tcpdump -i eth0 port 80    # снять трафик

7. Диски и файловые системы

df -h                      # свободное место по разделам
du -sh /var/log/*          # размеры директорий
lsblk                      # все блочные устройства
blkid                      # UUID и типы ФС
mount | grep ext4          # активные монтирования
free -h                    # память
swapon                     # swap
Реальный продакшен-кейс

«No space left on device», но df -h показывает свободное место. Причина: закончились inodes. Проверь: df -i. Часто — миллионы мелких файлов в /tmp.

8. SSH (must-master)

Ключи

ssh-keygen -t ed25519 -C "you@host"   # сгенерить пару (Ed25519, не RSA)
ssh-copy-id user@server               # скопировать на сервер
ssh user@server                       # подключение
ssh -p 2222 -i ~/.ssh/key user@host   # custom port + key

~/.ssh/config — твой главный лайфхак

Host prod
    HostName 10.0.0.5
    User devops
    Port 2222
    IdentityFile ~/.ssh/prod_key
    ServerAliveInterval 60

Host *.internal
    User admin
    ProxyJump bastion.example.com
    StrictHostKeyChecking no

Теперь ssh prod вместо длинной команды.

SSH туннели

# Local forward: localhost:5432 → server's RDS
ssh -L 5432:rds.internal:5432 bastion

# Remote forward: открыть локальный порт для сервера
ssh -R 8080:localhost:3000 server

# Dynamic SOCKS proxy
ssh -D 1080 bastion

SSH hardening (production)

В /etc/ssh/sshd_config:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Port 2222                  # нестандартный — снижает шум, не безопасность
MaxAuthTries 3
ClientAliveInterval 300

Добавь fail2ban и закрой SSH security group в облаке только для своего IP.

9. Мониторинг и диагностика

uptime                     # load average
vmstat 1 5                 # vm/cpu/io stats каждую секунду, 5 раз
iostat -x 1                # disk I/O
sar -u 1 10                # CPU за 10 секунд
lsof -i :80                # кто слушает порт 80
lsof -p 1234               # открытые файлы процесса
strace -p 1234             # системные вызовы процесса (debug)
dmesg | tail               # сообщения ядра
Алгоритм диагностики «всё медленно»
  1. uptime — load average. Если > числа CPU — система перегружена.
  2. htop / top — кто ест CPU/RAM.
  3. iostat -x 1 — диск. %util близко к 100% = bottleneck I/O.
  4. ss -s — сетевые соединения. Много TIME_WAIT — частая проблема.
  5. journalctl -p err --since "1 hour ago" — недавние ошибки.

10. Пакетные менеджеры

sudo apt update                    # обновить индексы
sudo apt upgrade -y                # обновить все пакеты
sudo apt install nginx             # установить
apt list --installed | grep nginx
sudo apt remove nginx              # удалить
sudo apt purge nginx               # удалить + конфиги
apt-cache search "tool"            # поиск

Чек-лист готовности модуля

Лучшие источники

Linux освоен — фундамент готов. Теперь сети.

Модуль 02 → Сети