Linux / Ubuntu для системного администратора
Linux — основа современного серверного мира (большинство серверов, контейнеров, облаков работают на нём). Умение работать в терминале — обязательный навык. Этот раздел — исчерпывающий справочник по командной строке, правам, пакетам, процессам, systemd, дискам и ядру.
Оболочки и переменные окружения
Оболочка (shell) — интерпретатор команд между пользователем и ядром. Основные:
| Оболочка | Особенности |
|---|---|
| bash | Bourne Again Shell — стандарт по умолчанию на большинстве дистрибутивов. Совместима с POSIX, богатая история, скрипты. |
| zsh | Умное автодополнение, темы (oh-my-zsh), globbing. По умолчанию в macOS. |
| fish | Friendly 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 |
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
| Бит | Символ | Число | Действие |
|---|---|---|---|
| SUID | s в поле владельца (rws) | 4 | Процесс запускается с правами ВЛАДЕЛЬЦА файла (пример: /usr/bin/passwd → root). chmod 4755 |
| SGID | s в поле группы | 2 | Процесс с правами ГРУППЫ файла; на каталоге — новые файлы наследуют группу каталога. chmod 2755 |
| Sticky | t в поле others (rwt) | 1 | В каталоге (обычно /tmp) удалять файл может только владелец файла, независимо от прав записи в каталог. chmod 1777 |
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
Пользователи и группы
| Файл | Содержимое |
|---|---|
| /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 # обновить
Процессы
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
Сигналы
| Сигнал | Число | Смысл |
|---|---|---|
| SIGTERM | 15 | «завершись корректно» (default для kill). Процесс может очистить ресурсы |
| SIGKILL | 9 | Немедленное уничтожение, нельзя перехватить. Используйте только если SIGTERM не помог |
| SIGHUP | 1 | Часто = «перечитай конфиг» (для демонов типа nginx) |
| SIGINT | 2 | Прерывание с клавиатуры (Ctrl+C) |
| SIGSTOP / SIGCONT | 19/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
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 (если используется)
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
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/сеть) — архив sysstat | sar -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 # перечитать все конфиги
net.ipv4.ip_forward=1 (роутер/NAT), net.ipv4.conf.all.rp_filter=1 (защита от spoofing), fs.file-max (лимит открытых файлов), vm.swappiness (насколько агрессивно свопить). После правки — sysctl --system.sudo для конкретных команд. Это уберегает от случайного удаления важного.