Справочник сисадмина

Linux / Ubuntu для системного администратора

Linux — основа современного серверного мира (большинство серверов, контейнеров, облаков работают на нём). Умение работать в терминале — обязательный навык. Этот раздел — исчерпывающий справочник по командной строке, правам, пакетам, процессам, systemd, дискам и ядру.

Оболочки и переменные окружения

Оболочка (shell) — интерпретатор команд между пользователем и ядром. Основные:

ОболочкаОсобенности
bashBourne Again Shell — стандарт по умолчанию на большинстве дистрибутивов. Совместима с POSIX, богатая история, скрипты.
zshУмное автодополнение, темы (oh-my-zsh), globbing. По умолчанию в macOS.
fishFriendly interactive shell — цветной вывод из коробки, подсказки, но НЕ POSIX-совместима (скрипты писать иначе).

Переменные окружения и PATH

echo $HOME                 # значение переменной (префикс $)
export MYVAR="value"       # создать переменную окружения (видна дочерним)
MYVAR="x" command          # задать переменную только для этого запуска
echo $PATH                 # список каталогов поиска исполняемых (через :)
which ls                   # какой исполняемый найден первым в PATH
type -a grep               # все варианты (built-in / binary)

Стартовые файлы оболочки

ФайлКогда читаетсяНазначение
~/.bashrcПри каждом НЕ-логин интерактивном запуске bash (терминал)алиасы, функции, prompt, настройки интерактива
~/.profileПри логине (login shell), если нет ~/.bash_profileобщие переменные окружения (PATH и т.п.)
~/.bash_profileПри логине, приоритетнее .profile у bashто же, специфично для bash
~/.bash_logoutПри выходе из login shellочистка, сообщения при выходе
/etc/profile, /etc/bash.bashrcСистемные, для всех пользователейглобальные настройки
Правило: интерактивные алиасы — в ~/.bashrc; переменные окружения, нужные при логине (и GUI-сессиям) — в ~/.profile. После правки применить: source ~/.bashrc (или . ~/.bashrc).

alias

alias ll='ls -la'          # удобный псевдоним
alias grep='grep --color=auto'
unalias ll                 # убрать
type ll                    # что скрывается за алиасом

Быстрые клавиши: Ctrl+L очистка, Tab автодополнение, ↑/↓ история, Ctrl+C прервать, Ctrl+Z пауза (затем bg/fg), Ctrl+R поиск по истории, Ctrl+A/E начало/конец строки.

Иерархия файловой системы (FHS)

В Linux всё — файл, и нет дисков C:/D:. Всё монтируется в единое дерево от / (стандарт FHS — Filesystem Hierarchy Standard).

ПутьНазначение
/Корень файловой системы
/binОсновные исполняемые (ls, cp, bash) для всех пользователей (на modern системах — symlink в /usr/bin)
/sbinСистемные исполняемые (только для админа: ip, fdisk, iptables) — symlink в /usr/sbin
/etcКонфигурационные файлы (здесь настраивают службы!)
/varПеременные данные: логи (/var/log), почта, кэш, spool
/usrВторичная иерархия: программы (/usr/bin), библиотеки (/usr/lib), исходники (/usr/src)
/optСтороннее ПО целиком (Oracle, proprietary пакеты), не из пакетного менеджера
/procВиртуальная ФС ядра: процессы (/proc/PID), CPU (/proc/cpuinfo), память (/proc/meminfo)
/sysВиртуальная ФС sysfs: параметры устройств и ядра (альтернатива /proc для оборудования)
/devФайлы устройств (диски /dev/sda, терминалы, null, random)
/runВременные данные времени выполнения (PID-файлы, сокеты) — очищается при загрузке
/mntТочка монтирования вручную (временно, admin)
/mediaТочки монтирования съёмных носителей (флешки, CD)
/tmpВременные файлы (обычно очищается при перезагрузке)
/homeДомашние папки пользователей (/home/ivan)
/rootДомашняя папка суперпользователя
/bootЯдро, initramfs, загрузчик (GRUB)
/lib, /lib64Библиотеки, необходимые исполняемым из /bin и /sbin
/proc и /sys не занимают места на диске — это интерфейсы к ядру в оперативной памяти. Например, cat /proc/loadavg или cat /sys/class/net/eth0/operstate.

Работа с файлами и текстом

Просмотр и навигация

pwd                      # где я сейчас
ls -la                   # список файлов с деталями (включая скрытые)
cd /var/log              # перейти в папку
cd ..                    # на уровень выше
cd -                     # вернуться в предыдущую папку
cat file.txt             # показать весь файл
less file.txt            # листать (q — выход, / — поиск, G — конец)
head -n 20 file          # первые 20 строк
tail -n 20 file          # последние 20 строк
tail -f /var/log/syslog  # следить за добавлением в реальном времени

grep — поиск по тексту (регулярные выражения)

grep "error" log.txt          # строки, содержащие error
grep -i "Error" log.txt       # без учёта регистра
grep -v "debug" log.txt       # инверсия: всё, КРОМЕ debug
grep -r "config" /etc         # рекурсивно по каталогу
grep -n "port" file           # с номерами строк
grep -E "warn|error" log      # расширенные regex (альтернатива)
grep -c "GET" access.log      # посчитать совпадения
grep "^#" file                # строки, начинающиеся с #

sed — потоковое редактирование (замена)

sed 's/old/new/' file         # замена первого old на new в каждой строке (вывод в stdout)
sed 's/old/new/g' file        # замена ВСЕХ вхождений (g = global)
sed -i 's/old/new/g' file     # изменить файл на месте (-i)
sed -i.bak 's/.../.../' file  # сначала сохранить бэкап file.bak
sed '/^#/d' file              # удалить строки, начинающиеся с #

awk — обработка по полям

awk '{print $1}' file         # первое поле (разделитель — пробел/таб)
awk -F: '{print $1}' /etc/passwd   # поля через : (пользователи)
awk '$3 > 100 {print $1}' file     # условие по 3-му полю
awk '{sum+=$1} END {print sum}'    # сумма первого столбца
awk 'NR>1 && NF {print}' file      # все непустые строки кроме первой

cut / sort / uniq / wc / tr

cut -d: -f1 /etc/passwd        # 1-е поле через разделитель :
sort file                      # сортировка по алфавиту
sort -n -k2 file               # числовая сортировка по 2-му полю
uniq file                      # убрать подряд идущие дубли
sort file | uniq -c            # посчитать уникальные (топ-N частот)
wc -l file                     # количество строк
wc -w file                     # количество слов
tr 'a-z' 'A-Z' <<< "hello"     # замена/транслитерация символов

Потоки, пайпы и перенаправление

Три стандартных потока: stdin (0), stdout (1), stderr (2).

command > out.txt             # stdout в файл (перезапись)
command >> out.txt            # stdout ДОБАВИТЬ в конец
command 2> err.txt            # только stderr в файл
command 2>&1 out.txt          # и stdout, и stderr в файл
command &> all.txt            # то же, коротко (&> = 2>&1)
command < in.txt              # stdin из файла
cmd1 | cmd2                   # stdout cmd1 → stdin cmd2 (pipe)
ls | tee out.txt              # вывести И в файл одновременно
find / -name "*.conf" 2>/dev/null   # прятать ошибки "Permission denied"
Пайп (|) — главный инструмент админа: cat access.log | grep 404 | awk '{print $1}' | sort | uniq -c | sort -rn | head выдаст топ IP с ошибками 404.

Права доступа в Linux

Каждый файл имеет владельца, группу и права: read (4), write (2), execute (1) для владельца / группы / остальных (others).

-rwxr-xr--  1 user group  123 Jan 1 file.sh
#  ^  ^  ^  ^  владелец  группа
#  |  |  |  └─ права "остальных" (r--)
#  |  |  └──── права группы (r-x)
#  |  └─────── права владельца (rwx)
#  └────────── тип: - файл, d папка, l ссылка, c/b устройство

Символьный и числовой вид

chmod +x script.sh        # сделать исполняемым (добавить x всем)
chmod u+x file             # x только владельцу
chmod 644 file.txt         # rw-r--r--  (6=4+2, 4, 4)
chmod 755 script.sh        # rwxr-xr-x
chmod 600 secret.key       # rw-------  (только владелец)
chown user:group file      # сменить владельца и группу
chown -R user:group /data  # рекурсивно

SUID / SGID / sticky bit

БитСимволЧислоДействие
SUIDs в поле владельца (rws)4Процесс запускается с правами ВЛАДЕЛЬЦА файла (пример: /usr/bin/passwd → root). chmod 4755
SGIDs в поле группы2Процесс с правами ГРУППЫ файла; на каталоге — новые файлы наследуют группу каталога. chmod 2755
Stickyt в поле others (rwt)1В каталоге (обычно /tmp) удалять файл может только владелец файла, независимо от прав записи в каталог. chmod 1777
SUID=0 (root) на скриптах/бинарниках — частая дыра. Регулярно ищите: find / -perm -4000 -type f 2>/dev/null (SUID) и find / -perm -2000 -type f (SGID). Не ставьте SUID на интерпретаторы (bash, python) — это мгновенный root-эскалап.

umask

umask — маска, вычитаемая из максимума при создании файла. Файл по умолчанию 666, каталог 777; umask 022 → файлы 644, каталоги 755. umask 077 → только владелец (600/700).

umask                   # показать текущую (например 0022)
umask 077               # задать для этой сессии
# постоянно — прописать в ~/.profile или /etc/profile

ACL (расширенные списки контроля)

getfacl /shared/file    # посмотреть ACL
setfacl -m u:ivan:rwx /shared/file   # дать ivan rwx
setfacl -m g:dev:rx  /shared         # группе dev — rx
setfacl -x u:ivan /shared/file       # убрать запись для ivan
setfacl -R -m d:u:ivan:rwx /shared   # default ACL для новых файлов (наследование)

Атрибуты файлов (chattr)

lsattr file              # показать атрибуты
chattr +i file           # immutable: нельзя изменить/удалить ДАЖЕ root (до -i)
chattr +a file           # append-only: можно только дописывать в конец (логи)
chattr -i file           # снять immutable
Атрибуты chattr живут в файловой системе (ext4/xfs) и НЕ зависят от прав rwx — даже chmod не поможет обойти +i. Это отличная защита от случайного удаления важных файлов и от некоторых руткитов.

Пользователи и группы

ФайлСодержимое
/etc/passwdСписок учёток: user:x:UID:GID:comment:home:shell (x = пароль в shadow)
/etc/shadowХэши паролей и политики (только root). Формат: user:$6$соль$хэш:lastchange:min:max:warn:inactive:expire:
/etc/groupГруппы: group:x:GID:members
/etc/gshadowПароли/админы групп (редко нужно)
id ivan                  # UID/GID и группы пользователя
whoami                   # текущий пользователь
sudo adduser ivan        # создать пользователя (интерактивно)
sudo useradd -m -s /bin/bash ivan   # неинтерактивно с домашней папкой
sudo passwd ivan         # задать/сменить пароль
sudo usermod -aG sudo ivan  # добавить в группу sudo (admin)
sudo userdel -r ivan     # удалить с домашней папкой
sudo groupadd dev        # создать группу

sudo / sudoers / visudo

Файл правил /etc/sudoers правится ТОЛЬКО через visudo (проверяет синтаксис и блокирует одновременное редактирование). Ошибка в sudoers = потеря root-доступа!

visudo
# примеры строк:
ivan  ALL=(ALL:ALL) ALL              # ivan может делать всё (как root)
%admins ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx   # группа без пароля только эту команду
Defaults        mailto=admin@example.com                      # уведомления

PAM (кратко)

PAM (Pluggable Authentication Modules, /etc/pam.d/) — единый механизм аутентификации. Модули в цепочках auth (кто вы), account (можно ли), password (смена пароля), session (настройка сеанса). Примеры: pam_unix (локальные пароли), pam_tally2/faillock (блокировка по неудачам), pam_sss (SSSD/AD).

Менеджеры пакетов

Debian / Ubuntu — apt / dpkg

sudo apt update              # обновить индекс пакетов
sudo apt upgrade -y         # обновить установленные
sudo apt full-upgrade -y    # с учётом смены зависимостей
sudo apt install nginx      # установить
sudo apt remove nginx       # удалить (оставить конфиги)
sudo apt purge nginx        # удалить вместе с конфигами
sudo apt autoremove         # осиротевшие зависимости
apt search имя              # поиск
apt show nginx              # информация о пакете
dpkg -i pkg.deb             # установить .deb вручную
dpkg -l | grep nginx        # список установленных
dpkg -S /bin/ls             # какому пакету принадлежит файл

RHEL / Fedora / CentOS — dnf / yum

sudo dnf makecache          # обновить кэш метаданных
sudo dnf upgrade -y         # обновить всё
sudo dnf install httpd      # установить
sudo dnf remove httpd       # удалить
sudo dnf autoremove         # осиротевшие
dnf search имя
rpm -ivh pkg.rpm            # установка .rpm напрямую
rpm -qa | grep httpd        # список установленных
yum (legacy) — то же, на базе python, медленнее dnf

Arch — pacman

sudo pacman -Syu            # обновить систему (sync + upgrade)
sudo pacman -S pkg          # установить
sudo pacman -R pkg          # удалить
sudo pacman -Rs pkg         # удалить с зависимостями
pacman -Ss pkg              # поиск
pacman -Q                   # все установленные

Универсальные / sandbox — snap и flatpak

sudo snap install code      # snap (изолированный, от Canonical)
sudo snap refresh           # обновить snap-пакеты
flatpak install flathub org.mozilla.firefox   # flatpak (из Flathub)
flatpak update              # обновить
snap/flatpak — это не замена системному менеджеру, а способ ставить изолированные десктоп-приложения с собственными зависимостями. На сервере предпочитайте родной пакетный менеджер дистрибутива.

Процессы

ps aux                      # все процессы с деталями
ps -ef | grep nginx         # найти процесс
top                         # интерактивный монитор (CPU/RAM по процессам)
htop                        # улучшенный top (цветной, дерево)
glances                     # расширенный дашборд (CPU/RAM/сеть/диски)
kill 1234                   # SIGTERM (мягко завершить)
kill -9 1234                # SIGKILL (принудительно, без обработки)
pkill -u ivan               # убить все процессы пользователя
killall nginx

Сигналы

СигналЧислоСмысл
SIGTERM15«завершись корректно» (default для kill). Процесс может очистить ресурсы
SIGKILL9Немедленное уничтожение, нельзя перехватить. Используйте только если SIGTERM не помог
SIGHUP1Часто = «перечитай конфиг» (для демонов типа nginx)
SIGINT2Прерывание с клавиатуры (Ctrl+C)
SIGSTOP / SIGCONT19/18Пауза / продолжение (аналог Ctrl+Z из терминала)

Приоритеты, фон и задания

nice -n 10 ./script         # запустить с пониженным приоритетом (19 = минимальный)
renice -n 5 -p 1234         # изменить приоритет запущенного
nohup long.sh &             # запустить, игнорируя разрыв сеанса (вывод в nohup.out)
disown                     # отвязать задание от терминала (чтобы kill -HUP при выходе не убил)
jobs                       # список заданий текущего shell
fg %1                      # вернуть задание 1 в foreground
bg %1                      # продолжить задание 1 в background

Планировщики: at и cron

at 23:00                   # выполнить один раз (ввод команд, Ctrl+D)
echo "shutdown -h now" | at now + 1 hour
crontab -e                 # редактировать свои задания
crontab -l                 # список
systemctl enable --now crond   # запустить службу планировщика (имя: cron/cronie/crond)

systemd — глубоко

systemd — init-система и менеджер служб (PID 1) на большинстве дистрибутивов. Управляет unit-файлами в /etc/systemd/system (переопределения) и /lib/systemd/system (пакеты).

Типы unit

ТипНазначениеПример
serviceДемон/службаnginx.service, sshd.service
socketСокет для активации по запросу (socket activation)sshd.socket
timerПланировщик (замена cron для systemd)logrotate.timer
mountТочка монтированияvar-log.mount
pathРеакция на изменение в ФСдля watch-сценариев
targetГруппа unit (уровень запуска)multi-user.target, graphical.target
device / swap / sliceУстройства, подкачка, группы ресурсов (cgroups)dev-sda1.device

Управление службами и журнал

systemctl status nginx            # статус + последние логи
systemctl start nginx             # запустить
systemctl stop nginx              # остановить
systemctl restart nginx           # перезапустить
systemctl reload nginx            # перечитать конфиг (SIGHUP)
systemctl enable nginx            # автозапуск при загрузке
systemctl disable nginx           # убрать автозапуск
systemctl is-enabled nginx        # включён ли автозапуск
systemctl daemon-reload           # перечитать unit-файлы после правки
systemctl list-units --failed     # упавшие службы

journalctl -u nginx               # логи конкретной службы
journalctl -u nginx -f            # следить в реальном времени
journalctl -b                     # логи с последней загрузки
journalctl -p err -b              # только ошибки этой загрузки
journalctl --since "2026-01-01 00:00" --until "01:00"

Зависимости: Wants vs Requires

ДирективаПоведение
Wants=«хочет» запустить, но НЕ падает, если зависимость недоступна (мягкая)
Requires=Жёсткая: если зависимость не запускается — и этот unit не запускается
After=/Before=Порядок запуска (не обязательно зависимость)
Conflicts=Взаимоисключающие unit (запуск одного останавливает другой)
PartOf=жизненный цикл привязан (restart/stop затрагивает и зависимые)

Маскирование и drop-in overrides

systemctl mask nginx            # ЗАПРЕТИТЬ запуск полностью (симлинк в /dev/null)
systemctl unmask nginx          # снять маску
# Drop-in override — без правки самого unit-файла пакета:
systemctl edit nginx            # создаёт /etc/systemd/system/nginx.service.d/override.conf
# Пример override.conf:
# [Service]
# Restart=always
# Environment=ENV=production
systemctl daemon-reload && systemctl restart nginx
Всегда правьте службу через systemctl edit (drop-in), а не трогайте файл в /lib/systemd/system — при обновлении пакета ваши правки затрутся. Таймеры (timer) часто предпочтительнее cron для серверных заданий, т.к. видны в systemctl list-timers и логируются в journald.

Хранилище и диски

Обзор устройств

lsblk                       # дерево блочных устройств (диски/разделы/точки монтирования)
ls -l /dev/disk/by-id/      # стабильные имена по ID (не /dev/sda, который может меняться!)
blkid                       # UUID и типы ФС разделов
fdisk -l /dev/sda           # таблица разделов (MBR)
parted /dev/sdb print       # таблица (GPT и MBR)
gdisk /dev/sdb              # GPT-аналог fdisk

Разметка и создание ФС

fdisk /dev/sdb              # интерактивно: n (новый раздел), t (тип), w (записать)
# или неинтерактивно:
parted -s /dev/sdb mklabel gpt mkpart primary ext4 1MiB 100%
mkfs.ext4 /dev/sdb1         # создать ФС ext4
mkfs.xfs /dev/sdb1          # XFS
mkswap /dev/sdb2            # подкачка
swapon /dev/sdb2            # подключить swap
swapon --show               # что активно

Монтирование и /etc/fstab

mount /dev/sdb1 /data       # смонтировать
mount -a                    # смонтировать всё из fstab (проверка!)
umount /data                # размонтировать (или umount /dev/sdb1)
# /etc/fstab:           
UUID=abcd-1234  /data  ext4  defaults,noatime  0  2
# device удобнее задавать через UUID= (blkid) — стабильно при смене порядка дисков
# метки: e2label /dev/sdb1 data  → можно монтировать по LABEL=data
# swap:  UUID=...  none  swap  sw  0 0
Никогда не редактируйте /etc/fstab вслепую — ошибка (неверный UUID) заблокирует загрузку в emergency mode. После правки обязательно mount -a без перезагрузки.

LVM (Logical Volume Manager)

Слой абстракции: Physical Volume (PV) → Volume Group (VG) → Logical Volume (LV). Позволяет расширять/сжимать тома на лету и объединять несколько дисков.

pvcreate /dev/sdb1 /dev/sdc1   # инициализировать физические тома
vgcreate vg0 /dev/sdb1 /dev/sdc1   # создать группу
lvcreate -L 10G -n data vg0    # логический том 10G
lvcreate -l 100%FREE -n data vg0   # весь свободный объём
mkfs.ext4 /dev/vg0/data
lvextend -L +5G /dev/vg0/data  # расширить LV
resize2fs /dev/vg0/data        # расширить ФС под размер LV (ext4)
pvs ; vgs ; lvs                # статус

Программный RAID (mdadm)

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1   # RAID1 (зеркало)
mdadm --detail /dev/md0        # статус
cat /proc/mdstat               # состояние в ядре
mdadm --examine --scan >> /etc/mdadm/mdadm.conf   # сохранить конфиг
УровеньНазначение
RAID 0Чередование (stripes) — скорость, НЕТ отказоустойчивости
RAID 1Зеркало — копия на каждом диске
RAID 5Чередование + 1 диск чётности (выдерживает 1 отказ)
RAID 6Как 5, но 2 диска чётности (2 отказа)
RAID 10Зеркало + чередование (гибрид, часто лучший выбор для БД)

Сеть в Linux (iproute2)

Классические ifconfig, route, netstat — устарели и часто не установлены. Используйте iproute2: ip, ss.
ip -br addr                  # кратко: интерфейсы и их IP
ip addr show eth0            # детально
ip link set eth0 up          # поднять интерфейс
ip link set eth0 down        # опустить
ip addr add 192.168.1.50/24 dev eth0   # назначить IP
ip route show                # таблица маршрутов
ip route add default via 192.168.1.1   # шлюз по умолчанию
ip -s link show eth0         # статистика (RX/TX, ошибки, drops)
ss -tunlp                    # слушающие сокеты (замена netstat -tulnp)
ss -tnp state established    # установленные TCP-соединения

NetworkManager и конфигурация

nmcli device status         # состояние интерфейсов
nmcli connection show       # сохранённые подключения
nmcli con up "Wired"        # поднять подключение
nmcli con mod eth0 ipv4.addresses 192.168.1.50/24 ipv4.gateway 192.168.1.1 ipv4.dns 8.8.8.8 ipv4.method manual
nmcli con down eth0 && nmcli con up eth0
nmtui                        # псевдографический интерфейс (TUI) настройки

DNS и hosts

/etc/resolv.conf            # nameserver 8.8.8.8 ; search example.com ; options
/etc/hosts                   # статическое имя→IP:  192.168.1.10  server1.lan server1
# проверка резолва:
getent hosts server1         # учитывает /etc/hosts и DNS (порядок в /etc/nsswitch.conf)
resolvectl status            # статус systemd-resolved (если используется)
На системах с systemd-resolved файл /etc/resolv.conf часто — симлинк на заглушку; правьте DNS через nmcli или resolvectl, иначе изменения «откатятся».

Логи и ротация

journald (systemd)

Централизованный журнал в бинарном виде (не текстовые файлы). Читать через journalctl (примеры выше). Хранится в /var/log/journal (если включено persist) или только в RAM.

rsyslog и /var/log

Традиционные текстовые логи пишутся демоном rsyslog/syslog-ng в /var/log:

ФайлСодержимое
/var/log/syslog (Debian) / /var/log/messages (RHEL)Общие системные сообщения
/var/log/auth.logВходы, sudo, ssh (безопасность!)
/var/log/kern.logСообщения ядра
/var/log/dmesgСообщения загрузки ядра
/var/log/nginx/Логи конкретных служб

logrotate

Ротация по размеру/времени, сжатие и удаление старых логов. Конфиги в /etc/logrotate.conf и /etc/logrotate.d/. Пример:

/var/log/myapp/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    postrotate
        systemctl reload myapp > /dev/null 2>&1
    endscript
}

Редакторы: nano и vim

nano (простой)

nano /etc/nginx/nginx.conf    # Ctrl+O сохранить, Ctrl+X выйти, Ctrl+W поиск
# внизу экрана — подсказка Ctrl-команд

vim (мощный, с режимами)

РежимВходДействие
Normal (командный)EscНавигация и команды (по умолчанию при старте)
Insert (вставка)i / a / oРедактирование текста (i — перед курсором, a — после, o — новая строка)
Visual (выделение)v / V / Ctrl+vВыделение символ/строка/блок
Command-line:Команды: :w сохранить, :q выйти, :wq / :x сохранить+выйти, :q! выйти без сохранения
# частые приёмы vim:
 /word            # поиск вперёд, n/N следующий/предыдущий
 dd               # удалить строку
 yy p             # скопировать строку, вставить
 :%s/old/new/g    # замена по всему файлу (как sed)
 u / Ctrl+r       # отмена / повтор
 GG               # в конец файла
 vimtutor         # интерактивный учебник (установите!)

Bash-скриптинг

Скрипт — текстовый файл с командами и shebang в первой строке.

#!/bin/bash
# shebang указывает интерпретатор
set -euo pipefail     # хорошая практика: выход при ошибке/неопред. переменной

name="world"         # переменная (без пробелов вокруг =)
echo "Hello, $name"
readonly PI=3.14

# условие
if [ "$name" = "world" ]; then
    echo "matched"
elif [ -f /etc/hosts ]; then
    echo "hosts exists"
else
    echo "else"
fi

# цикл for
for i in 1 2 3; do
    echo "iter $i"
done

# цикл while (по строкам)
while read -r line; do
    echo "line: $line"
done < file.txt

# case
case "$1" in
    start) echo "starting" ;;
    stop)  echo "stopping" ;;
    *)     echo "usage: $0 start|stop" ;;
esac

# функция
backup() {
    local src="$1"
    tar czf "/tmp/$(basename "$src").tgz" "$src"
}
backup /etc

# сделать исполняемым и запустить
chmod +x script.sh
./script.sh start

Планировщик cron — формат 5 полей

#  ┌ минута (0-59)
#  │ ┌ час (0-23)
#  │ │ ┌ день месяца (1-31)
#  │ │ │ ┌ месяц (1-12 или jan-dec)
#  │ │ │ │ ┌ день недели (0-7, где 0 и 7 = воскресенье)
#  │ │ │ │ │
#  * * * * *  команда
  0 2 * * *   /usr/bin/backup.sh      # каждый день в 02:00
  */15 * * * * echo "каждые 15 мин"   # шаг */
  0 0 1,15 * * на 1-е и 15-е числа
  @reboot /opt/startup.sh             # специальное слово: при загрузке
  @daily /opt/cleanup.sh
cron не наследует ваш PATH и окружение — в скриптах задавайте полные пути к командам или экспортируйте PATH в начале. Логи заданий по умолчанию уходят в mail/cron лог; перенаправляйте вывод: 0 2 * * * /opt/backup.sh >> /var/log/backup.log 2>&1.

Производительность

УтилитаЧто показываетПример
free -hОЗУ и swap (человекочитаемо)free -h
vmstat 1Процессор, память, IO, swap, контекст за интервалvmstat 1 5
iostat -x 1Загрузка дисков (util, await, r/s, w/s)iostat -x 1 (пакет sysstat)
sarИстория нагрузки (CPU/IO/сеть) — архив sysstatsar -u 1 3, sar -r (память), sar -n DEV (сеть)
dmesgКольцевой буфер сообщений ядраdmesg | tail, dmesg -T (с датами), dmesg -w (watch)
# Быстрый взгляд на «где узкое место»:
free -h                 # не кончается ли RAM (если swap активен — давление)
vmstat 1                # si/so (swap in/out), wa (IO wait), r (run queue)
iostat -x 1             # %util близко к 100% — диск упёрся
dmesg -T | grep -i error   # ошибки оборудования/ядра (OOM, ATA, NIC)
Высокий wa (iowait) в vmstat + %util диска ~100% в iostat = узкое место в дисковой подсистеме. Высокий si/so = система ушла в swap (медро работает). В dmesg ищите Out of memory / killed process (OOM-killer).

Модули ядра и sysctl

Модули ядра

lsmod                       # загруженные модули (из /proc/modules)
modinfo e1000              # информация о модуле (автор, параметры)
modprobe e1000             # загрузить модуль (с зависимостями)
modprobe -r e1000          # выгрузить
insmod ./mymod.ko          # загрузить свой .ko вручную
# автозагрузка: добавьте имя в /etc/modules-load.d/*.conf
# чёрный список: /etc/modprobe.d/blacklist.conf  →  blacklist modname

sysctl — параметры ядра в run-time

sysctl -a                   # все параметры
sysctl net.ipv4.ip_forward  # прочитать
sysctl -w net.ipv4.ip_forward=1   # применить сейчас
# постоянно — /etc/sysctl.conf или /etc/sysctl.d/*.conf:
# net.ipv4.ip_forward = 1
# net.ipv4.conf.all.rp_filter = 1
# vm.swappiness = 10
sysctl --system             # перечитать все конфиги
Частые админские sysctl: net.ipv4.ip_forward=1 (роутер/NAT), net.ipv4.conf.all.rp_filter=1 (защита от spoofing), fs.file-max (лимит открытых файлов), vm.swappiness (насколько агрессивно свопить). После правки — sysctl --system.
Привычка опытного админа: не сидеть в сеансе root постоянно. Работай под обычным пользователем и повышай права через sudo для конкретных команд. Это уберегает от случайного удаления важного.