DevOps
Модуль 0:
Linux Foundation

Модуль 0: Linux Foundation
Linux является фундаментом для большинства современных серверных решений, контейнеризации (Docker) и оркестраторов (Kubernetes). Глубокое понимание механизмов работы ОС необходимо для эффективной диагностики инцидентов и настройки производительности (Performance Tuning).
Необходимый инструментарий
  • Virtual Machine: Любой дистрибутив (Ubuntu Server 22.04 / 24.04 LTS рекомендуется). Можно использовать VirtualBox, VMware или WSL2.
  • SSH Client: Terminal (macOS/Linux), PowerShell / Windows Terminal (Windows).
Часть 1. Архитектура и Shell
0.1 Процессы и системные команды
Терминал (Shell) — это интерфейс взаимодействия с ядром ОС. При запуске любой команды Shell выполняет последовательность действий: парсинг синтаксиса, разворачивание переменных и wildcard-шаблонов (*.txt), и только затем передает управление исполняемому файлу.
Потоки ввода-вывода (IOStreams)

Каждый процесс в Linux при старте получает три стандартных файловых дескриптора:
  • stdin (0) — Стандартный ввод (по умолчанию клавиатура).
  • stdout (1) — Стандартный вывод (терминал).
  • stderr (2) — Вывод ошибок.
Примеры управления потоками:

  1. Простое перенаправление (Overwrite vs Append):
echo "First Line" > file.txt   # Создать/Перезаписать файл
echo "Second Line" >> file.txt # Дописать в конец файла
2. Разделение логов: Критично для скриптов, чтобы ошибки не смешивались с полезным выводом или не пропадали.
# stdout идет в results.txt
# stderr удаляется (идет в /dev/null)
find / -name "config.yaml" > results.txt 2>/dev/null

# Объединение потоков (stdout + stderr -> log.txt)
./my-app.sh > log.txt 2>&1
3. Pipes (Конвейеры): Механизм IPC, превращающий вывод одной программы во ввод другой.

Задача: Найти процесс, потребляющий больше всего памяти.
ps aux | sort -rnk 4 | head -n 5
# ps aux       - вывести все процессы
# sort -rnk 4  - сортировать (reverse, numeric) по 4-й колонке (%MEM)
# head -n 5    - показать топ 5
0.2 Файловая система (VFS)
В Linux реализован концепт «Everything is a file». Исследуем систему через файлы:
/proc/meminfo: Откуда free берет данные?
cat /proc/meminfo | grep MemTotal
/proc/cpuinfo: Какой у меня процессор?
grep "model name" /proc/cpuinfo
/proc/[PID]/fd: Куда пишет процесс?
ls -l /proc/1/fd  # Посмотреть дескрипторы процесса init/systemd
Часть 2. Права доступа и Пользователи
0.3 Permissions Model
Базовая модель прав: Owner (владелец), Group (группа), Others (остальные). Команда ls -l показывает маску прав: -rwxr-xr--

Расшифровка (Octal notation):
  • Read (r) = 4
  • Write (w) = 2
  • Execute (x) = 1
Примеры:
  • chmod 755 file (rwx для владельца, rx для остальных) - стандарт для скриптов.
  • chmod 600 file (rw- только владелец) - стандарт для SSH ключей и конфигов с паролями.
  • chown user:group file - смена владельца.
Root (Superuser): Пользователь с UID 0.
  • sudo -i: Получить интерактивную root-консоль.
  • su - user: Переключиться на пользователя user.
Practice: Попробуйте создать файл от root и удалить его от обычного пользователя.
sudo touch /root/testfile
rm /root/testfile  # Permission denied
Часть 3. Systemd и журналирование
В современных дистрибутивах почти всё запускается через systemd. Ключевая мысль: сервис — это не «процесс в фоне», а управляемая сущность с рестартами, зависимостями и логами.
0.4 Базовые команды systemd
Посмотреть статус сервиса:
systemctl status ssh
Старт/стоп/рестарт:
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
Автостарт при загрузке:
sudo systemctl enable nginx
sudo systemctl disable nginx
0.5 Journalctl: как читать логи правильно
journalctl - это единая точка входа в системные логи.
  • Логи конкретного сервиса:
sudo journalctl -u nginx
  • Логи «за сегодня» и в режиме tail:
sudo journalctl -u nginx --since today
sudo journalctl -u nginx -f
  • Последние 200 строк + ошибки (полезно при инциденте):
sudo journalctl -u nginx -n 200 -p warning
Практика: свой сервис в systemd
1. Создайте простой скрипт:
sudo tee /usr/local/bin/hello-loop.sh >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

while true; do
  echo "$(date -Is) hello from systemd"
  sleep 2
done
EOF
sudo chmod +x /usr/local/bin/hello-loop.sh
2. Создайте unit-файл:
sudo tee /etc/systemd/system/hello-loop.service >/dev/null <<'EOF'
[Unit]
Description=Hello Loop Demo Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/hello-loop.sh
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target
EOF
3. Перезагрузите конфиги и запустите сервис:
sudo systemctl daemon-reload
sudo systemctl start hello-loop
sudo systemctl enable hello-loop
4. Проверьте логи:
sudo journalctl -u hello-loop -f
Часть 4. Bash-скриптинг без боли
Скрипты — это «клей» DevOps. Ошибки в скриптах почти всегда возникают из-за:

1) неявных значений, 2) игнорируемых ошибок, 3) пробелов/кавы
0.6 Минимальный безопасный шаблон
#!/usr/bin/env bash
set -euo pipefail

cleanup() {
  # сюда можно добавить удаление временных файлов
  :
}

trap cleanup EXIT
  • -e — падать на ошибке команды.
  • -u — падать на использовании неинициализированной переменной.
  • pipefail — ошибка внутри пайпа тоже считается ошибкой.
0.7 Кавычки и пробелы (самый частый источник багов)
Почти всегда используйте кавычки:
file_path="$1"
echo "Processing: $file_path"
grep -n "ERROR" "$file_path" || true
|| true иногда нужен, когда отсутствие совпадений - это «нормально», а не ошибка.
Практика: «скрипт‑обёртка» для диагностики
Сделайте скрипт quick-diag.sh, который печатает 5 строк:
1) uptime, 2) free -h, 3) df -h, 4) ss -tunlp | head, 5) journalctl -p err -n 20. Цель - научиться собирать первичную диагностику за 30 секунд.
Мини-чеклист «что должен уметь после модуля»
  • Отличать stdout/stderr, уверенно пользоваться >, >>, 2>, 2>&1.
  • Читать /proc для быстрой проверки CPU/RAM и дескрипторов.
  • Понимать модель прав (chmod/chown) и почему root — это риск.
  • Управлять сервисами через systemctl и читать логи через journalctl.
  • Писать простые bash-скрипты с set -euo pipefail и кавычками.
Troubleshooting Guide: "Server is slow"
Алгоритм диагностики "USE Method" (Utilization, Saturation, Errors).

  1. CPU/Load Average:
uptime
# load average: 1.05, 0.70, 0.55 (за 1, 5, 15 минут)
# Если на 4-ядерном CPU load > 4.0 - это затор.
htop: Интерактивный мониторинг. (F5 - Tree view, F6 - Sort).
2. Memory:
free -h
  • Если Swap используется активно — системе не хватает RAM, начинается thrashing диска.
  • vmstat 1 — смотреть колонки si (swap in) и so (swap out).
3. Disk I/O:
iostat -xz 1
  • Смотрим %util. Если близко к 100% - диск перегружен.
  • iotop -oPa — найти виновный процесс.
4. Network:
  • ss -tunlp - какие порты слушаются?
  • netstat -an | grep TIME_WAIT | wc -l - не кончились ли эфемерные порты?
5. Logs:
  • journalctl -xe - последние системные ошибки.
  • dmesg | tail - сообщения ядра (например, OOM Killer убил процесс).
Итоговая задача: "Log Analytics Script"
Написание Bash-скрипта для анализа логов.

Подготовка данных: Создайте файл access. log:
192.168.1.1 - - [10/Oct/2023:13:55:36] "GET / HTTP/1.1" 200 2326
192.168.1.2 - - [10/Oct/2023:13:55:36] "GET /admin HTTP/1.1" 403 123
192.168.1.1 - - [10/Oct/2023:13:55:38] "POST /login HTTP/1.1" 500 541
10.0.0.5 - - [10/Oct/2023:13:56:01] "GET / HTTP/1.1" 200 404
Задача: Написать скрипт analyze. sh, который:
  1. Выводит Топ IP-адресов.
  2. Считает количество 4xx и 5xx ошибок.
Пример решения (Logic hint):
#!/bin/bash
LOG_FILE=$1

if [ -z "$LOG_FILE" ]; then
    echo "Usage: $0 <path_to_log>"
    exit 1
fi

echo "=== TOP 5 IPs ==="
awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -5

echo "=== ERROR COUNT ==="
# Код ответа обычно в 9 колонке
awk '$9 >= 400 {print $9}' "$LOG_FILE" | sort | uniq -c