Модуль 01 — Linux ⭐
Linux — кислород DevOps. 96% серверов в облаке — Linux. Все контейнеры внутри — Linux namespaces + cgroups. Без свободного владения — потолок Junior навсегда.
К концу: можешь развернуть с нуля Ubuntu сервер, настроить пользователей, SSH, cron-задачи, диагностировать проблему по логам без гугла.
1. Файловая система Linux (FHS)
В Linux всё — файл. Конфиги, устройства, процессы, сокеты. Понимая структуру дерева, ты понимаешь систему.
Запомни 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)
- stdin (0) — стандартный ввод
- stdout (1) — стандартный вывод (по умолчанию идёт в терминал)
- stderr (2) — поток ошибок
Перенаправление
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/ |
sed | Stream 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 | Запись | Применение |
|---|---|---|
644 | rw-r--r-- | Стандартный файл |
755 | rwxr-xr-x | Скрипт / директория |
600 | rw------- | Приватный файл (SSH ключ!) |
700 | rwx------ | Приватная директория |
777 | rwxrwxrwx | ⚠️ Никогда в продакшене |
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 # владелец и группа
Специальные биты
- SUID (4000) — выполняется с правами владельца файла. Пример:
passwd. - SGID (2000) — наследуется группа от каталога.
- Sticky bit (1000) — удалить файл может только владелец. Пример:
/tmp.
Принцип least privilege: давай только те права, которые реально нужны. Это база DevSecOps.
5. Процессы и systemd
Просмотр процессов
ps aux # все процессы (BSD-стиль) ⭐
ps -ef # все процессы (System V)
top # интерактивный мониторинг
htop # улучшенный (нужно ставить)
btop # красивая альтернатива
pgrep nginx # PID по имени
Сигналы и завершение
| Сигнал | № | Когда применять |
|---|---|---|
| SIGTERM | 15 | Стандартное завершение, перехватываемое (default для kill) |
| SIGKILL | 9 | Убить безусловно. Когда SIGTERM не сработал |
| SIGHUP | 1 | Часто = «перечитай конфиг» |
| SIGINT | 2 | Ctrl+C |
| SIGSTOP | 19 | Заморозить процесс |
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 # сообщения ядра
uptime— load average. Если > числа CPU — система перегружена.htop/top— кто ест CPU/RAM.iostat -x 1— диск.%utilблизко к 100% = bottleneck I/O.ss -s— сетевые соединения. Много TIME_WAIT — частая проблема.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" # поиск
Чек-лист готовности модуля
- ☐ Знаю что такое FHS и зачем
/varотдельный - ☐ Могу написать
findс-execдля batch-операций - ☐ Понимаю разницу
>и2>&1 - ☐ Дебажу «почему сервис не стартует» по
journalctl - ☐ Знаю SUID и почему
passwdимеет SUID - ☐ Умею ssh-tunnel local и remote
- ☐ Могу написать systemd unit с зависимостями
- ☐ Знаю что такое inode
- ☐ Прошёл первые уроки в Linux Lab
Лучшие источники
- Курс из папки: Linux Cyberpunk — твоя русскоязычная база
- Книга: «How Linux Works» — Brian Ward (3rd ed., 2021)
- Практика: overthewire.org/bandit — 30+ уровней gamification
- Документация:
man <команда>— твой друг навсегда - YouTube: Learn Linux TV, Hak5, NetworkChuck
Linux освоен — фундамент готов. Теперь сети.