2.01. Справочник по Linux
Справочник по Linux
📘 Ядро и параметры системы
1. Параметры загрузки ядра (/proc/cmdline, grub.cfg)
Командная строка ядра задаёт поведение во время инициализации. Примеры:
| Параметр | Значение / Описание | Контекст |
|---|---|---|
root= | Устройство корневой ФС (/dev/sda2, UUID=…, LABEL=…, PARTUUID=…) | Обязателен (если не initramfs динамически определит) |
ro / rw | Монтирование корневой ФС только для чтения / для чтения и записи | Используется при загрузке с ro, затем mount -o remount,rw / |
init= | Путь к первому пользовательскому процессу (по умолчанию /sbin/init) | Для отладки (init=/bin/bash) |
systemd.unit= | Целевой юнит systemd (rescue.target, multi-user.target, graphical.target) | Альтернатива single, 3, 5 |
quiet | Подавление вывода ядра (кроме ошибок) | Используется в дистрибутивах по умолчанию |
loglevel=N | Уровень логирования (0–7: от emerg до debug) | Например, loglevel=7 для отладки |
console= | Устройство консоли (ttyS0,115200n8, tty0) | Серверы — ttyS0; десктопы — tty1 |
acpi= | Управление ACPI (off, ht, strict, noirq, force) | Для проблем с питанием/железом |
noapic, nolapic | Отключение APIC/LAPIC | Редко, при несовместимости аппаратуры |
iommu= | Управление IOMMU (off, force, pt) | Виртуализация, пассинг устройств |
intel_iommu=on/off, amd_iommu=on/off | Включение/выключение IOMMU на конкретных CPU | |
net.ifnames=0 | Отключение предсказуемых имён интерфейсов → eth0, wlan0 | Совместимость со скриптами |
ipv6.disable=1 | Полное отключение IPv6 в ядре | Без sysctl (тот лишь деактивирует стек) |
rd.lvm.lv= | LVM-логические тома для initramfs (rd.lvm.lv=vg0/root) | Используется при загрузке с LVM |
rd.luks.uuid=, rd.luks.name= | Параметры LUKS-шифрования дисков | Для initramfs с шифрованием |
debug | Включает earlyprintk, ignore_loglevel, может добавить dyndbg | Только для отладки |
slub_debug=FZPU | Отладка SLUB-аллокатора (F — free list check, Z — zeroing, P — poisoning, U — sanity checks) | Диагностика утечек/коррупции |
panic=N | Задержка (с) перед автоматическим ребутом после паники | 0 — виснуть; -1 — немедленный ребут |
oops=panic | Любая oops → kernel panic | Для строгого контроля |
spectre_v2=, mds=, tsx=, l1tf= | Управление mitigations против аппаратных уязвимостей | Пример: spectre_v2=off (опасно!) |
efi= | Поведение EFI (nochunk, runtime, disable_early_pci_dma) | Диагностика/безопасность на UEFI |
nomodeset | Не загружать DRM/KMS-драйверы графики | При проблемах с драйверами GPU |
⚠️ Многие параметры имеют побочные эффекты (например, отключение mitigations → уязвимости). Применяйте осознанно.
2. /proc — procfs: интерфейс к ядру в реальном времени
2.1 Общесистемные файлы (/proc/)
| Файл | Описание | Примеры значений / структуры |
|---|---|---|
/proc/version | Версия ядра + компилятор | Linux version 6.8.0-45-generic (buildd@lcy02-amd64-001) (gcc-13, GNU ld (GNU Binutils for Ubuntu) 2.42) #45-Ubuntu SMP PREEMPT_DYNAMIC Tue Oct 1 14:25:59 UTC 2024 |
/proc/cmdline | Текущая командная строка ядра | BOOT_IMAGE=/vmlinuz-6.8.0-45-generic root=UUID=… ro quiet splash |
/proc/cpuinfo | Информация о CPU | processor, vendor_id, model name, cpu MHz, cache size, flags (sse, avx, ssse3, …), bugs (cpu_meltdown, spectre_v1/v2) |
/proc/meminfo | Информация о памяти | MemTotal, MemFree, Buffers, Cached, SwapTotal, SwapFree, MemAvailable, Active, Inactive, Shmem, Slab, SReclaimable, SUnreclaim |
/proc/loadavg | Средняя загрузка (1/5/15 мин), running/total threads, последний pid | 1.23 0.98 0.76 2/2567 12345 |
/proc/uptime | Время работы системы (сек), время простоя (сек) | 123456.78 98765.43 |
/proc/stat | Агрегированная статистика CPU, дисков, прерываний | cpu user nice system idle iowait irq softirq steal guest guest_nice и intr, ctxt, btime, processes, procs_running, procs_blocked |
/proc/interrupts | Статистика прерываний по CPU и устройствам | 0: 12345678 IO-APIC 2-edge timer |
/proc/filesystems | Поддерживаемые ФС (nodev — псевдо-ФС) | nodev sysfs, ext4, xfs, btrfs, fuseblk, zfs |
/proc/mounts / self/mounts | Текущие точки монтирования (в формате /etc/mtab) | /dev/sda2 / ext4 rw,relatime 0 0 |
/proc/swaps | Информация о swap-разделах/файлах | /swapfile file 2147479552 1048576 -1 |
/proc/partitions | Список блочных устройств и их размеры (в 1K блоках) | 8 0 125034840 sda, 8 1 1048576 sda1 |
/proc/devices | Список major-номеров блочных и символьных устройств | 1 mem, 4 /dev/vc/0, 252 zfs, 259 blkext |
/proc/diskstats | Детальная статистика дисков (чтения/записи/время) | 8 0 sda 12345 0 987654 1234 5678 0 987654 5678 0 1234 6890 |
/proc/vmstat | Статистика управления памятью | pgpgin, pgpgout, pswpin, pswpout, pgalloc_*, pgfree, pgactivate, pgdeactivate, pgfault, pgmajfault, compact_*, unevictable_* |
/proc/sys/ | Интерфейс sysctl (см. ниже) | — |
/proc/kallsyms | Адреса и имена символов ядра (требует CAP_SYSLOG) | ffffffff81000000 T _text, ffffffffc0000000 t my_module_init [my_module] |
/proc/modules | Загруженные модули ядра | nvidia 34567890 42 - Live 0xffffffffc0000000 (POE) |
/proc/consoles | Доступные консоли | tty0 -W- (E) 4:7, ttyS0 -WU (E) 4:64 |
/proc/buddyinfo | Состояние buddy-аллокатора (свободные страницы по order) | Node 0, zone DMA 1 2 1 … |
/proc/zoneinfo | Детали зон памяти (DMA, DMA32, Normal) | Node 0, zone DMA pages free:123 min:45 low:56 high:67 … |
/proc/slabinfo | Информация о SLAB/SLOB/SLUB кэшах | kmalloc-192 123456 123456 192 21 1 : tunables 0 0 0 : slabdata 5879 5879 0 |
/proc/locks | Текущие файловые блокировки | 1: POSIX ADVISORY WRITE 1234 00:12:123456 0 EOF |
/proc/softirqs | Статистика softirq по CPU | NET_RX: 12345678 8765432 … |
/proc/timer_list, /proc/timer_stats | Информация о таймерах (timer_stats требует echo 1 > /proc/timer_stats для запуска трассировки) | — |
2.2 Процесс-ориентированные файлы (/proc/<pid>/)
| Файл | Описание | Примечания |
|---|---|---|
cmdline | Аргументы командной строки (разделены \0) | Чтение через tr '\0' ' ' < /proc/123/cmdline |
comm | Имя процесса (до 15 байт, prctl(PR_SET_NAME)) | |
status | Обобщённая информация: Name, Umask, State, Tgid, Ngid, Pid, PPid, TracerPid, Uid, Gid, FDSize, Groups, NStgid, NSpid, NSpgid, NSsid, VmPeak, VmSize, VmLck, VmPin, VmHWM, VmRSS, RssAnon, RssFile, RssShmem, VmData, VmStk, VmExe, VmLib, VmPTE, VmSwap, HugetlbPages, CoreDumping, THP_enabled, Threads, SigQ, SigPnd, ShdPnd, SigBlk, SigIgn, SigCgt, CapInh, CapPrm, CapEff, CapBnd, CapAmb, NoNewPrivs, Seccomp, Speculation_Store_Bypass, Cpus_allowed, Cpus_allowed_list, Mems_allowed, Mems_allowed_list, voluntary_ctxt_switches, nonvoluntary_ctxt_switches | Формат — Key: Value |
stat | Сырые данные о состоянии процесса (одна строка, поля через пробел) | Используется ps, top; порядок полей строго фиксирован (см. man 5 proc) |
statm | Информация о памяти в страницах (size resident shared text lib data dirty) | В 4K страницах по умолчанию |
maps | Текущие отображённые регионы памяти | 7f1234560000-7f1234580000 r--p 00000000 08:02 123456 /usr/lib/libc.so.6 |
smaps / smaps_rollup | Детализация maps + статистика использования (Rss, Pss, Shared_Clean, Shared_Dirty, Private_Clean, Private_Dirty, Referenced, Anonymous, LazyFree, AnonHugePages, ShmemPmdMapped, FilePmdMapped, Shared_Hugetlb, Private_Hugetlb, Swap, SwapPss, Locked) | smaps_rollup — агрегировано по процессу |
fd/ | Символические ссылки на открытые дескрипторы | 0 → /dev/pts/0, 1 → /dev/pts/0, 3 → socket:[123456], 4 → /var/log/app.log |
fdinfo/<fd> | Информация о конкретном fd (например, pos, flags, mnt_id) | |
environ | Переменные окружения (\0-разделённые) | |
limits | Ограничения ulimit для процесса | Max cpu time, Max file size, Max data size, Max stack size, Max core file size, Max resident set, Max processes, Max open files, Max locked memory, Max address space, Max file locks, Max pending signals, Max msgqueue size, Max nice priority, Max realtime priority, Max realtime timeout |
cgroup | Иерархии cgroups, в которых состоит процесс | 0::/user.slice/user-1000.slice/session-1.scope |
ns/ | Пространства имён: mnt, pid, net, uts, ipc, user, cgroup (симв. ссылки на nsfs) | ls -l /proc/123/ns/ → net → 'net:[4026531992]' |
syscall | Текущий системный вызов (или running, sleeping, stopped) | |
stack | Трассировка стека ядра (только для процесса в ядре; требует CAP_SYS_ADMIN) | |
wchan | Имя функции ядра, в которой спит процесс | Например, poll_schedule_timeout |
attr/ | Атрибуты безопасности: current (текущая метка SELinux/AppArmor), exec, fscreate, keycreate, sockcreate | Только при включённых LSM |
oom_score, oom_score_adj | Текущий скор OOM и коррекция (-1000 — игнорировать, 1000 — макс. шанс убить) | echo -1000 > /proc/123/oom_score_adj |
3. /sys — sysfs: представление устройств и драйверов
3.1 Общие пути
| Путь | Описание |
|---|---|
/sys/class/ | Устройства, сгруппированные по классу (net/, block/, input/, sound/, leds/, backlight/, thermal/, hwmon/, drm/, tty/, vc/, mem/, misc/, bdi/, dma/, scsi_host/, scsi_device/, scsi_disk/, usb/, pci_bus/, и др.) |
/sys/devices/ | Физическая/виртуальная иерархия устройств (шина → устройство → дочерние) |
/sys/bus/ | Шины (pci/, usb/, platform/, acpi/, serio/, virtio/) — с подкаталогами devices/ и drivers/ |
/sys/firmware/ | Информация от firmware (efi/, acpi/, dmi/) |
/sys/module/ | Загруженные модули (parameters/, sections/, holders/, notes/) |
/sys/kernel/ | Параметры ядра: mm/, debug/, security/, uevent_helper, profiling, fscaps, kexec_*, kaslr |
3.2 Примеры значимых атрибутов
| Путь | Тип | Возможные значения | Назначение |
|---|---|---|---|
/sys/class/net/<iface>/address | ro | MAC-адрес (aa:bb:cc:dd:ee:ff) | Уникальный идентификатор сетевого интерфейса |
/sys/class/net/<iface>/mtu | rw | Число (обычно 1500) | Maximum Transmission Unit |
/sys/class/net/<iface>/tx_queue_len | rw | Число (например, 1000) | Длина очереди передачи |
/sys/class/net/<iface>/flags | ro | Число в hex (битовая маска) | Состояние интерфейса: IFF_UP, IFF_BROADCAST, IFF_RUNNING, IFF_PROMISC, IFF_MULTICAST и др. (ip link show декодирует) |
/sys/class/net/<iface>/operstate | ro | unknown, notpresent, down, lowerlayerdown, testing, dormant, up | Физическое состояние линка |
/sys/class/net/<iface>/carrier | ro | 0 / 1 | Наличие несущей (link beat) |
/sys/class/thermal/thermal_zone*/temp | ro | Температура в мК (×1000) | Например, 48000 = 48.0°C |
/sys/class/thermal/thermal_zone*/type | ro | x86_pkg_temp, cpu-thermal, iwlwifi | Тип датчика |
/sys/class/thermal/thermal_zone*/trip_point_*/temp | rw | Пороги (мК) | При достижении — триггер (например, cooling) |
/sys/class/thermal/thermal_zone*/trip_point_*/type | ro | critical, hot, passive, active | Стратегия реагирования |
/sys/class/hwmon/hwmon*/temp*_input | ro | Температура в мК | Датчики от hwmon (возможно, дублирует thermal) |
/sys/block/<dev>/queue/scheduler | rw | [mq-deadline] kyber bfq none | Планировщик ввода-вывода |
/sys/block/<dev>/queue/nomerges | rw | 0 (мержить), 1 (не мержить соседние), 2 (не мержить вообще) | Оптимизация запросов на диск |
/sys/block/<dev>/queue/read_ahead_kb | rw | Число КБ (например, 128) | Размер read-ahead буфера |
/sys/block/<dev>/queue/rotational | ro | 0 (SSD/NVMe), 1 (HDD) | Признак вращающегося носителя |
/sys/devices/system/cpu/cpu*/online | rw | 0 / 1 | Включение/отключение CPU core |
/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor | rw | performance, powersave, ondemand, conservative, schedutil | Управление частотой CPU |
/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq | ro | Частота в кГц | Текущая частота ядра |
/sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_min_freq, max_freq | ro | Диапазон частот (кГц) | Поддерживаемые частоты |
/sys/module/<modname>/parameters/<param> | rw | Зависит от параметра | Динамическая настройка параметров модуля (если поддерживается) |
4. sysctl — настройка ядра во время выполнения (/proc/sys/)
Основные категории:
4.1 vm.* — управление виртуальной памятью
| Параметр | Тип | Значения / Пояснение |
|---|---|---|
vm.swappiness | int | 0–100 (по умолчанию 60). Чем выше — охотнее ядро вытесняет анонимную память в swap. 0 — почти никогда (но не отключает swap полностью); 1 — рекомендуется для серверов БД. |
vm.vfs_cache_pressure | int | 100 (по умолчанию). Приоритет освобождения dentry/inode кэшей относительно pagecache. >100 — агрессивнее сбрасывать метаданные; <100 — сохранять дольше. |
vm.dirty_ratio, vm.dirty_background_ratio | int | Пороговые доли dirty-страниц в процентах от MemFree+Cached. dirty_background_ratio — фоновая запись (pdflush/kworker); dirty_ratio — блокирующая запись. Рекомендуется для SSD: 10 и 5. |
vm.dirty_bytes, vm.dirty_background_bytes | int | Абсолютные значения (в байтах), приоритет над _ratio, если ≠0. |
vm.overcommit_memory | int | 0 — эвристическая оценка (по умолчанию); 1 — разрешить всё (опасно); 2 — строгий учёт (CommitLimit = SwapTotal + MemTotal * overcommit_ratio/100). |
vm.overcommit_ratio | int | Процент RAM для учёта при overcommit_memory=2 (по умолчанию 50). |
vm.admin_reserve_kbytes | int | Мин. объём памяти, резервируемый для root (в КБ). По умолчанию ~3% от RAM. |
vm.user_reserve_kbytes | int | Резерв для обычных пользователей (в КБ). По умолчанию ~3% от RAM. |
vm.compact_memory | write-only | Запись 1 → запуск компактификации памяти (дефрагментация для huge pages). |
vm.drop_caches | write-only | 1 — pagecache; 2 — dentries+inodes; 3 — всё. Не для продакшена! Только для тестов. |
vm.min_free_kbytes | int | Мин. свободной памяти (в КБ) для предотвращения OOM. Слишком мало → thrashing; слишком много → неэффективное использование. Автонастраивается, но можно фиксировать. |
vm.zone_reclaim_mode | int | 0 — не пытаться reclaim локально (по умолчанию на NUMA); 1 — reclaim из локальной зоны. Редко меняют. |
vm.nr_hugepages, vm.nr_hugepages_mempolicy, vm.hugepages_treat_as_movable | — | Управление huge pages (2MB/1GB). nr_hugepages — желаемое количество. |
4.2 net.* — сетевой стек
net.core.*
| Параметр | Назначение |
|---|---|
net.core.rmem_default, rmem_max | Размер приёмного буфера сокета по умолчанию / максимум |
net.core.wmem_default, wmem_max | То же для передающего буфера |
net.core.optmem_max | Макс. размер опциональных данных (например, SO_TIMESTAMP) |
net.core.netdev_max_backlog | Макс. длина очереди пакетов, ожидающих обработки сетевым драйвером (до NAPI) |
net.core.somaxconn | Макс. длина очереди listen() для сокетов (ограничение backlog в listen()) |
net.core.dev_weight, dev_weight_rx_bias, dev_weight_tx_bias | Приоритет обработки RX/TX в NAPI-цикле |
net.ipv4.*
| Параметр | Назначение |
|---|---|
net.ipv4.ip_forward | 1 — включить маршрутизацию IP; 0 — отключить |
net.ipv4.conf.all.forwarding | То же, но для IPv6 также через net.ipv6.conf.all.forwarding |
net.ipv4.ip_local_port_range | Диапазон локальных портов для исходящих соединений (например, 32768 60999) |
net.ipv4.tcp_fin_timeout | Время (с) удержания TIME_WAIT сокета после FIN |
net.ipv4.tcp_tw_reuse | 1 — разрешить переиспользование TIME_WAIT для исходящих соединений (только для клиентских сценариев!) |
net.ipv4.tcp_tw_recycle | Удалён в ядре ≥4.12 — был небезопасен в NAT. Не использовать. |
net.ipv4.tcp_keepalive_time, _intvl, _probes | Параметры TCP keepalive (7200, 75, 9 по умолчанию) |
net.ipv4.tcp_syn_retries, tcp_synack_retries | Кол-во попыток отправки SYN / SYN+ACK |
net.ipv4.tcp_syncookies | 1 — включить SYN cookies при переполнении listen-очереди |
net.ipv4.tcp_max_syn_backlog | Макс. длина очереди полуоткрытых соединений (SYN_RECV) |
net.ipv4.tcp_mem, tcp_rmem, tcp_wmem | Глобальные/сокет-специфичные лимиты памяти TCP (min, pressure, max) |
net.ipv4.tcp_congestion_control | Алгоритм (cubic, reno, bbr, bbr2, dctcp, westwood) |
net.ipv4.tcp_notsent_lowat | Порог буфера (байт), ниже которого разрешается send() без блокировки (для TCP_NOTSENT_LOWAT) |
net.ipv4.ip_nonlocal_bind | 1 — разрешить bind() к не-локальному IP (для HAProxy и т.п.) |
net.ipv4.ip_local_reserved_ports | Список портов, исключённых из ip_local_port_range (например, 50000-50010) |
net.ipv4.neigh.default.gc_thresh1/2/3 | Пороги GC таблицы соседей (ARP/ND) — минимальный, soft limit, hard limit |
net.ipv4.icmp_echo_ignore_all, _broadcasts | Игнорировать ping / ping в broadcast |
net.ipv6.* — аналогично, с disable, autoconf, use_tempaddr, dad_transmits, max_addresses, accept_ra, forwarding.
4.3 fs.* — файловые системы
| Параметр | Назначение |
|---|---|
fs.file-max | Макс. число открытых файловых дескрипторов в системе |
fs.nr_open | Макс. значение ulimit -n для процесса (по умолчанию 1048576) |
fs.inotify.max_user_instances, max_user_watches, max_queued_events | Лимиты на inotify |
fs.aio-max-nr, aio-nr | Асинхронный I/O: макс. и текущее число операций |
fs.protected_symlinks, protected_hardlinks, protected_fifos, protected_regular | Защита от гонок при разыменовании (1 — включить, рекомендуется) |
4.4 kernel.* — общие параметры ядра
| Параметр | Назначение |
|---|---|
kernel.pid_max | Макс. PID (по умолчанию 32768, до 4194304) |
kernel.threads-max | Макс. число потоков (ограничено pid_max и ulimit -u) |
kernel.shmmax, shmall, shmmni, msgmax, msgmni, msgmnb, sem | Параметры SysV IPC |
kernel.randomize_va_space | ASLR: 0 — off, 1 — partial, 2 — full (по умолчанию) |
kernel.core_pattern | Шаблон имени core-дампа (может быть pipe: ` |
kernel.core_uses_pid | Добавлять PID в имя core-файла (1/0) |
kernel.dmesg_restrict | 1 — только root может читать dmesg (/proc/kmsg, syslog()) |
kernel.perf_event_paranoid | Уровень доступа к perf_event_open: -1 — все; 0 — только мониторинг; 1 — только текущий процесс; 2 — только CPU-счётчики; 3 — запрет |
kernel.unprivileged_bpf_disabled | 1 — запретить bpf() для не-CAP_BPF |
kernel.yama.ptrace_scope | Ограничение ptrace: 0 — классика; 1 — только родитель или CAP_SYS_PTRACE; 2 — только CAP_SYS_PTRACE; 3 — полный запрет |
4.5 abi.*, debug.*, dev.*, sunrpc.* — узкоспециализированные
📘 Устройства, cgroups, namespace, монтирование, capabilities
5. udev — динамическое управление устройствами
udev обрабатывает события от uevent ядра (kobject_uevent) и управляет узлами устройств в /dev, применяет правила, запускает скрипты, устанавливает атрибуты.
5.1 Основные пути конфигурации
/etc/udev/udev.conf— глобальные настройки/usr/lib/udev/rules.d/— правила от пакетов (не редактировать)/etc/udev/rules.d/— пользовательские правила (имеют приоритет)/run/udev/rules.d/— временные правила (не сохраняются после перезагрузки)
5.2 Структура правила (*.rules)
Формат: KEY=="value", KEY="value", SYMLINK+="name", MODE="0660", …
5.2.1 Матчинг (условия)
| Ключ | Пример | Описание |
|---|---|---|
KERNEL== | KERNEL=="sda[0-9]*" | Имя устройства в ядре (например, sda1) |
KERNELS== | KERNELS=="2-1.2:1.0" | Имя или часть пути в /sys/devices/ (рекурсивно вверх) |
SUBSYSTEM== | SUBSYSTEM=="block" | Подсистема (block, net, usb, scsi, input, tty, drm, leds) |
DRIVER== | DRIVER=="usb-storage" | Драйвер устройства |
ATTR{<file>}== | ATTR{size}=="250069680" | Проверка содержимого файла в /sys/class/…/<dev>/<file> |
ATTRS{<file>}== | ATTRS{idVendor}=="0781" | То же, но рекурсивный поиск вверх по дереву устройств |
ENV{<var>}== | ENV{ID_BUS}=="usb" | Проверка окружения (устанавливается предыдущими правилами) |
TAG== | TAG=="systemd" | Проверка наличия тега (например, systemd, seat, uaccess) |
GOTO, LABEL | GOTO="skip", LABEL="skip" | Управление потоком выполнения правил |
TEST== | TEST!="/usr/bin/foo" | Проверка существования файла |
5.2.2 Действия (назначения)
| Ключ | Пример | Эффект |
|---|---|---|
NAME= | NAME="mydisk" | Имя узла устройства (/dev/mydisk; только в первом совпадающем правиле!) |
SYMLINK+= | SYMLINK+="disk/by-id/my-ssd" | Доп. символические ссылки (в /dev/) |
OWNER=, GROUP=, MODE= | OWNER="timur", GROUP="disk", MODE="0660" | Владелец, группа, права доступа (восьмеричные) |
ATTR{<file>}= | ATTR{power/control}="auto" | Запись значения в файл /sys/…/<file> |
RUN+= | RUN+="/sbin/blkid -g" | Запуск программы (от root, синхронно) |
PROGRAM= | PROGRAM="/bin/sh -c 'echo %k:%E{ID_SERIAL_SHORT}'" | Выполнение, результат — в %c, %cN |
IMPORT{<type>}= | IMPORT{cmdline}="root" — импорт из /proc/cmdline IMPORT{builtin}="blkid" — вызов встроенного хелпера IMPORT{program}="custom-script %k" | Импорт переменных окружения |
TAG+= | TAG+="uaccess" | Добавление тега (используется logind, systemd) |
OPTIONS= | OPTIONS="string_escape=replace", "watch", "nowatch", "link_priority=100" | Служебные опции |
5.2.3 Встроенные хелперы (IMPORT{builtin})
| Хелпер | Действие | Переменные окружения (примеры) |
|---|---|---|
path_id | Генерирует стабильный ID пути | ID_PATH, ID_PATH_TAG |
usb_id | Анализ USB-устройств | ID_VENDOR_ID, ID_MODEL_ID, ID_VENDOR, ID_MODEL, ID_SERIAL, ID_BUS |
pci | PCI-информация | ID_PCI_CLASS_FROM_DATABASE, ID_VENDOR_FROM_DATABASE |
blkid | Анализ ФС и меток | ID_FS_TYPE, ID_FS_UUID, ID_FS_LABEL, ID_FS_VERSION, ID_PART_TABLE_TYPE, ID_PART_ENTRY_* |
hwdb | Запрос hwdb (через systemd-hwdb) | Любые поля из /etc/udev/hwdb.d/*.hwdb |
net_id | Генерация предсказуемых имён сетевых интерфейсов | ID_NET_NAME_PATH, ID_NET_NAME_SLOT, ID_NET_NAME_MAC |
scsi_id | SCSI/VPD ID | ID_SCSI_SERIAL, ID_WWN |
input_id | HID/клавиатуры/мыши | ID_INPUT, ID_INPUT_KEYBOARD, ID_INPUT_MOUSE, ID_VENDOR, ID_MODEL |
5.2.4 Переменные подстановки (% и $)
| Переменная | Значение |
|---|---|
%k | Имя устройства (sda1) |
%n | Номер раздела (для sda1 → 1) |
%p | Путь в /sys (/devices/pci0000:00/…/sda1) |
%b | Имя родительского блочного устройства (sda) |
%s{<attr>} | Значение sysfs-атрибута (%s{size}) |
%E{<env>} | Переменная окружения (%E{ID_FS_UUID}) |
%c, %cN | Вывод PROGRAM (всё / N-е поле) |
$devpath, $id, $name | Устаревшие (совместимость) |
⚠️ Правила обрабатываются по порядку имён файлов (
00-,10-,60-,99-). Пользовательские — в/etc/, не должны перезаписываться пакетами.
6. cgroups — контроль и изоляция ресурсов
Два major-релиза: cgroups v1 (многоконтроллерная) и cgroups v2 (унитарная иерархия). Совместимость: mount -t cgroup2 none /sys/fs/cgroup.
6.1 Общие понятия
- cgroup — группа процессов с общими лимитами/учётом
- контроллер (subsystem) — модуль ядра, управляющий ресурсом
- хостер — процесс, создающий/управляющий cgroup
- делегирование — передача управления поддерева
unprivileged-пользователю (cgroup.subtree_control,cgroup.procs,cgroup.threads) - scope — временная группа (например,
user@1000.service) - slice — иерархическая единица в
systemd(system.slice,user.slice,machine.slice)
6.2 cgroups v1 — ключевые контроллеры
| Контроллер | Монтируется как | Основные файлы/параметры | Примечания |
|---|---|---|---|
cpu | cgroup/cpu | cpu.shares (вес: 1024 = база), cpu.cfs_period_us (100000), cpu.cfs_quota_us (-1 = неограниченно), cpu.rt_period_us, cpu.rt_runtime_us | Поддержка CFS и RT планировщиков |
cpuset | cgroup/cpuset | cpuset.cpus, cpuset.mems, cpuset.cpu_exclusive, cpuset.sched_load_balance, cpuset.memory_spread_{page,slab} | Привязка к CPU/NODE (NUMA) |
memory | cgroup/memory | memory.limit_in_bytes, memory.soft_limit_in_bytes, memory.memsw.limit_in_bytes (RAM+swap), memory.kmem.limit_in_bytes, memory.use_hierarchy, memory.oom_control (вкл/выкл OOM killer), memory.pressure_level, memory.swappiness | kmem — ядерные аллокации (в >=4.15 deprecated) |
blkio | cgroup/blkio | blkio.weight, blkio.weight_device, blkio.throttle.read_bps_device, blkio.throttle.write_iops_device, blkio.leaf_weight, blkio.time, blkio.sectors | Ограничение скорости диска (MB/s, IOPS) |
devices | cgroup/devices | devices.allow, devices.deny (формат: c 1:3 rwm, b *:* r, a — all) | Контроль доступа к /dev/* |
freezer | cgroup/freezer | freezer.state (RUNNING, FREEZING, FROZEN) | Приостановка всех процессов в группе (kill -STOP на уровне ядра) |
net_cls | cgroup/net_cls | net_cls.classid (hex: 0x100001) | Маркировка пакетов (для tc фильтрации) |
net_prio | cgroup/net_prio | net_prio.ifpriomap (eth0 5) | Приоритет исходящего трафика по интерфейсу |
perf_event | cgroup/perf_event | — | Для perf — мониторинг группы |
hugetlb | cgroup/hugetlb | hugetlb.<size>.limit_in_bytes (hugetlb.2MB.limit_in_bytes) | Ограничение huge pages |
pids | cgroup/pids | pids.max, pids.current | Лимит на число процессов/потоков |
rdma | cgroup/rdma | rdma.max (hca_name hca_port max_qp max_cq) | Для InfiniBand/RoCE |
❗ В cgroups v1 один процесс может быть в разных cgroup для разных контроллеров → сложность координации.
6.3 cgroups v2 — унифицированная иерархия
Единая точка монтирования: /sys/fs/cgroup.
6.3.1 Управление поддеревьями
| Файл | Описание |
|---|---|
cgroup.subtree_control | Запись +cpu +memory → включить контроллеры в дочерних cgroup. Чтение → активные в этом узле. |
cgroup.controllers | Список контроллеров, доступных для делегирования в данном узле |
cgroup.events | populated 0/1 — есть ли процессы в поддереве (включая вложенные) |
cgroup.max.depth, cgroup.max.descendants | Лимиты на глубину и число потомков (защита от атак) |
6.3.2 Контроллеры в v2 (не все v1 реализованы)
| Контроллер | Файлы / Параметры | Отличия от v1 |
|---|---|---|
cpu | cpu.weight (1–10000, 100 = база), cpu.max (<quota> <period> или max 100000), cpu.idle (0/1), cpu.pressure (PSI для CPU) | Замена shares/quota; поддержка PSI |
memory | memory.max, memory.low, memory.min, memory.high, memory.swap.max, memory.oom.group, memory.pressure, memory.events (low high max oom oom_kill), memory.stat (детальный учёт) | min/low/high — иерархия защиты; PSI встроен |
io | io.max (dev: MAJ:MIN rbps=1048576 wbps=max riops=100 wiops=max), io.weight, io.pressure, io.stat | Объединение blkio и cfq логики |
pids | pids.max, pids.current | Без изменений |
rdma | rdma.max | Без изменений |
cpuset | cpuset.cpus, cpuset.mems, cpuset.cpus.partition (root, member, invalid) | Поддержка изолированных CPU-партиций (для DPDK/realtime) |
hugetlb | hugetlb.<size>.max | Аналогично v1 |
misc (новый) | misc.max (controller_name limit) | Возможность расширения через LSM (например, NVMe, GPU) |
6.3.3 PSI — Pressure Stall Information (встроено в v2)
| Файл | Описание |
|---|---|
cpu.pressure | some avg10=0.00 avg60=0.00 avg300=0.00 total=123456789 |
memory.pressure | some (столкновения с high/max), full (столкновения с max + reclaim stall) |
io.pressure | some (ожидание I/O), full (все процессы заблокированы на I/O) |
💡 PSI — объективная метрика «недоступности» ресурса, лучше
%idleилиfree.
6.3.4 Делегирование unprivileged
Требования:
cgroup.subtree_controlв родительском cgroup включает нужные контроллеры- Пользователь имеет
rwmнаcgroup.procs,cgroup.threads,cgroup.subtree_control,cgroup.controllers - Создаётся подкаталог, в него пишется
+cpu +memoryвsubtree_control
# Пример: пользователь 1000 делегирует себе cpu+memory
mkdir -p /sys/fs/cgroup/user-tasks
chown -R 1000:1000 /sys/fs/cgroup/user-tasks
# Внутри сессии пользователя:
mkdir /sys/fs/cgroup/user-tasks/myapp
echo "+cpu +memory" > /sys/fs/cgroup/user-tasks/myapp/cgroup.subtree_control
echo $$ > /sys/fs/cgroup/user-tasks/myapp/cgroup.procs
7. Namespace — изоляция глобальных ресурсов
Создаются через clone(2), unshare(2), setns(2) или unshare/nsenter CLI.
| Namespace | Флаг clone() | Псевдо-ФС | Что изолируется |
|---|---|---|---|
mount | CLONE_NEWNS | /proc/<pid>/ns/mnt | Иерархия точек монтирования (chroot + гибкость) |
UTS | CLONE_NEWUTS | /proc/<pid>/ns/uts | Имя хоста (hostname) и домен (domainname) |
IPC | CLONE_NEWIPC | /proc/<pid>/ns/ipc | System V IPC: очереди, семафоры, разделяемая память |
PID | CLONE_NEWPID | /proc/<pid>/ns/pid /proc/<pid>/ns/pid_for_children | Пространство PID (внутри — init = PID 1); pid_for_children — для потомков после execve |
network | CLONE_NEWNET | /proc/<pid>/ns/net | Сетевой стек: интерфейсы, таблицы маршрутизации, iptables/nft, сокеты |
user | CLONE_NEWUSER | /proc/<pid>/ns/user | UID/GID-маппинг (/proc/self/uid_map, /gid_map), capabilities |
cgroup | CLONE_NEWCGROUP | /proc/<pid>/ns/cgroup | Видимость иерархии cgroups (v2-only; в v1 — нет смысла) |
time (5.6+) | CLONE_NEWTIME | /proc/<pid>/ns/time /proc/<pid>/ns/time_for_children | CLOCK_MONOTONIC, CLOCK_BOOTTIME — смещение (clock_adjtime(CLOCK_TAI, …)) |
7.1 UID/GID маппинг в user namespace
Формат /proc/<pid>/uid_map:
<внутренний_начало> <внешний_начало> <длина>
Пример:
0 100000 65536
→ Внутри: UID 0–65535 → снаружи: 100000–165535.
Требования:
- Пишется один раз после
unshare(CLONE_NEWUSER) - Должен покрывать UID/GID процесса, делающего
execve /proc/sys/kernel/unprivileged_userns_clone=1— разрешить unprivileged создание (по умолчанию1в Ubuntu/Arch,0в RHEL)
7.2 Стек namespace в systemd-nspawn / podman
Типичный набор:
unshare --user --map-root-user \
--pid --fork \
--net --uts --ipc \
--mount-proc \
sh
8. Монтирование — опции и флаги
8.1 Общие флаги (mount(2), MS_*)
| Флаг | Значение | Эквивалент в mount -o |
|---|---|---|
MS_RDONLY | Только для чтения | ro |
MS_NOSUID | Игнорировать setuid/setgid | nosuid |
MS_NODEV | Не интерпретировать спец. файлы | nodev |
MS_NOEXEC | Запретить exec() | noexec |
MS_NOATIME | Не обновлять atime | noatime |
MS_NODIRATIME | Не обновлять atime у директорий | nodiratime |
MS_RELATIME | atime = max(atime, mtime, ctime) | relatime (по умолчанию с 2.6.30) |
MS_STRICTATIME | Всегда обновлять atime | strictatime |
MS_LAZYTIME | Обновлять atime/mtime/ctime в памяти, сбрасывать в ФС редко | lazytime |
8.2 Флаги распространения (mount propagation)
| Флаг | Описание |
|---|---|
MS_SHARED | События монтирования/размонтирования реплицируются в другие shared-точки |
MS_SLAVE | Получает события от master, но не отправляет обратно |
MS_PRIVATE | Изолирован — без репликации (по умолчанию с ядра 2.4.11) |
MS_UNBINDABLE | Нельзя bind-монтировать эту точку |
Комбинации:
--make-rshared→MS_SHARED \| MS_REC--make-rslave→MS_SLAVE \| MS_REC--make-rprivate→MS_PRIVATE \| MS_REC--bind+--make-private→MS_BIND \| MS_PRIVATE
8.3 Опции ФС (часто используемые)
| ФС | Опции | Примечания |
|---|---|---|
ext4 | `data=journal | ordered |
xfs | logbufs=N, logbsize=N, allocsize=N, swalloc, noalign, inode64, grpid, nogrpid, ikeep, noikeep, quota, uquota, gquota, prjquota, sunit=N, swidth=N | inode64 — разрешить inodes > 2^32 |
btrfs | compress=zstd:l5, autodefrag, nodatacow, nodatasum, space_cache=v2, subvol=NAME, subvolid=N, commit=N, ssd, ssd_spread, noacl, acl | nodatacow отключает COW → для ВМ/БД, но теряет snapshots |
tmpfs | size=, nr_inodes=, mode=, uid=, gid=, huge=always/within_size/never, mpol= | size по умолчанию = 50% RAM |
overlay | lowerdir=, upperdir=, workdir=, index=on/off, xino=on/auto/off, metacopy=on/off, redirect_dir=on/off, userxattr | Требует workdir на той же ФС, что upperdir |
proc | hidepid=0/1/2, gid=N | hidepid=2 — только свои процессы; gid — группа, имеющая доступ |
sysfs, debugfs, securityfs | Обычно без опций | Монтируются ядром автоматически |
📘 Security, Audit, PAM, Capabilities, Seccomp
9. Capabilities — разбиение привилегий root
Вместо монолитного UID=0, ядро делит права на набор capabilities (см. man 7 capabilities).
Процесс имеет 5 наборов битовых масок (по 64 бита в ядре ≥5.8):
| Набор | Описание | Изменяется |
|---|---|---|
Permitted (p) | Возможные capabilities, которые процесс может использовать | execve() наследует от файла (+p) или урезает по правилам |
Inheritable (i) | Capabilities, наследуемые дочерними при execve() (если файл имеет +i) | Явно устанавливается (capset) |
Effective (e) | Capabilities, активные сейчас (для проверки в ядре) | Для «legacy» бинарников — весь p → e; иначе — только если +ep в файле |
Bounding (b) | Верхняя граница: нельзя добавить capability, отсутствующую здесь | Уменьшается только (prctl(PR_CAPBSET_DROP, ...)), сбрасывается в execve() |
Ambient (a) | Capabilities, автоматически активируемые в e после execve() (для non-root) | Требует: i ⊆ a ⊆ p, securebits & SECURE_NO_SETUID_FIXUP |
9.1 Стандартные capabilities (2024, ядро 6.8+)
| Capability | Краткое назначение | Типичные команды/действия |
|---|---|---|
CAP_CHOWN | Изменение владельца файла | chown |
CAP_DAC_OVERRIDE | Обход проверок rwx (но не DAC для CAP_DAC_READ_SEARCH) | Чтение/запись любых файлов |
CAP_DAC_READ_SEARCH | Обход r для файлов и x для каталогов | open(O_RDONLY), stat() на любые пути |
CAP_FOWNER | Обход проверок владельца при chmod, chown, setxattr и др. | chmod на чужие файлы |
CAP_FSETID | Не сбрасывать setuid/setgid бит при write() | Сохранение chmod +s после редактирования |
CAP_KILL | Отправка сигналов любому процессу | kill -9 1 (если euid ≠ 0) |
CAP_SETGID | Изменение GID, добавление групп | setgid(), setgroups() |
CAP_SETUID | Изменение UID | setuid(), setreuid() |
CAP_SETPCAP | Добавление capabilities в Bounding других процессов | capset() на чужие процессы |
CAP_LINUX_IMMUTABLE | Установка/снятие флагов FS_IMMUTABLE_FL, FS_APPEND_FL | chattr +i, +a |
CAP_NET_BIND_SERVICE | Привязка к портам < 1024 | python -m http.server 80 |
CAP_NET_BROADCAST | Отправка широковещательных пакетов | ping -b (редко используется) |
CAP_NET_ADMIN | Управление сетью: интерфейсы, маршруты, iptables, qdisc, tun/tap | ip link set up, tc qdisc add, iptables -A |
CAP_NET_RAW | Использование RAW и PACKET сокетов | ping, tcpdump, arping |
CAP_IPC_LOCK | Блокировка памяти (mlock, mlockall) | mlock() без лимита RLIMIT_MEMLOCK |
CAP_IPC_OWNER | Обход проверок владельца в IPC | msgctl(IPC_RMID) на чужие очереди |
CAP_SYS_MODULE | Загрузка/выгрузка модулей ядра | insmod, rmmod, modprobe |
CAP_SYS_RAWIO | Доступ к портам ввода-вывода, /dev/mem, /dev/kmem | iopl(3), ioperm(), dd if=/dev/mem |
CAP_SYS_CHROOT | Вызов chroot() | chroot /newroot |
CAP_SYS_PTRACE | ptrace() любому процессу | gdb -p, strace -p |
CAP_SYS_PACCT | Включение учёта процессов | acct() |
CAP_SYS_ADMIN | «Корзина»: mount/umount, pivot_root, swapon, quotactl, nfsservctl, syslog, reboot, perf_event_open, keyctl, name_to_handle_at, open_by_handle_at, bpf | Очень широкие права — избегать |
CAP_SYS_BOOT | Вызов reboot() | reboot, shutdown -r |
CAP_SYS_NICE | Изменение приоритета (nice, setpriority, sched_setscheduler) | nice -n -20, chrt -f 99 |
CAP_SYS_RESOURCE | Обход лимитов (setrlimit, ulimit) | ulimit -n 1000000 |
CAP_SYS_TIME | Изменение системного времени | settimeofday(), adjtimex() |
CAP_SYS_TTY_CONFIG | Настройка терминалов (vhangup, kd*) | vhangup() |
CAP_MKNOD (legacy) | Создание спец. файлов | mknod /dev/null c 1 3 — удалён в ядре ≥2.2, заменён на CAP_MKNOD в capability bitmask, но реально контролируется через DAC |
CAP_LEASE | Установка файловых лиз (F_SETLEASE) | fcntl(fd, F_SETLEASE, F_RDLCK) |
CAP_AUDIT_WRITE | Запись в аудит-лог | audit_log_user_message() |
CAP_AUDIT_CONTROL | Управление аудитом (auditctl) | auditctl -e 0 |
CAP_SETFCAP | Установка capabilities на исполняемые файлы | setcap cap_net_bind_service+ep /usr/bin/python3 |
CAP_MAC_OVERRIDE | Обход MAC (SELinux/AppArmor) | Только если LSM разрешает |
CAP_MAC_ADMIN | Настройка политики MAC | semanage, setsebool |
CAP_SYSLOG | Чтение dmesg, syslog() | dmesg, journalctl --dmesg |
CAP_WAKE_ALARM | Пробуждение системы из suspend | timerfd_create(CLOCK_REALTIME_ALARM) |
CAP_BLOCK_SUSPEND | Блокировка перехода в suspend | ioctl(fd, BLKBSZSET) — устаревшее; новое — через wakeup source в sysfs |
9.2 Управление capabilities
| Команда | Пример | Эффект |
|---|---|---|
getcap <file> | getcap /usr/bin/ping → /usr/bin/ping = cap_net_raw+ep | Чтение capabilities файла |
setcap <caps> <file> | setcap cap_net_bind_service+ep /opt/app/server | Назначение capabilities исполняемому |
capsh --print | — | Вывод capabilities текущего процесса (p, i, e, b, a) |
prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_RAISE, CAP_NET_BIND_SERVICE) | В коде на C | Добавление capability в Ambient набор |
capsh --drop=cap_sys_admin -- -c "command" | — | Запуск команды без указанной capability |
⚠️ Важно:
setcapсбрасываетsetuid/setgidбиты. Если нуженsetuid, используйте wrapper-скрипт илиambientcapabilities.
10. Seccomp — ограничение системных вызовов
Два режима:
SECCOMP_MODE_STRICT— толькоread,write,exit,sigreturn(редко используется)SECCOMP_MODE_FILTER— BPF-фильтр, разрешающий/запрещающийsyscalls
10.1 Основные инструменты
libseccomp— библиотека для генерации BPF (scmp_sys_resolver,seccomp_init(SCMP_ACT_KILL_PROCESS))strace -q -e trace=%desc,%file,%ipc,…— анализ вызовов для профилированияoci-seccomp-bpf-hook,crun,runc— интеграция в контейнерыsystemd—SystemCallFilter=в юнитах
10.2 Системные вызовы по категориям (часто фильтруются)
| Категория | Вызовы | Комментарий |
|---|---|---|
| Память | mmap, mprotect, mlock, munlock, madvise, brk | mmap(PROT_EXEC) — потенциально опасен |
| Процессы | fork, vfork, clone, execve, execveat, prctl, ptrace, seccomp, unshare, setns | execve — ключевой; ptrace — отладка |
| Файлы | open, openat, openat2, creat, close, read, write, lseek, stat, fstat, lstat, fstatat, access, faccessat, unlink, unlinkat, rename, renameat, chmod, fchmod, chown, fchown, utime, utimes, futimesat, truncate, ftruncate | openat2 — новый, безопаснее openat |
| Сеть | socket, connect, bind, listen, accept, accept4, send, recv, sendto, recvfrom, sendmsg, recvmsg, getsockopt, setsockopt, getsockname, getpeername, shutdown, socketpair | socket(AF_PACKET, SOCK_RAW) → требует CAP_NET_RAW |
| IPC | pipe, pipe2, socketpair, shmget, shmat, shmdt, shmctl, msgget, msgsnd, msgrcv, msgctl, semget, semop, semctl | System V IPC |
| Время | time, stime, gettimeofday, settimeofday, adjtime, clock_gettime, clock_settime, clock_adjtime, nanosleep, alarm, setitimer, timer_create, timer_settime | settimeofday → требует CAP_SYS_TIME |
| Система | reboot, syslog, acct, mount, umount, pivot_root, swapon, swapoff, quotactl, sysfs, get_kernel_syms, query_module, delete_module, init_module, finit_module, perf_event_open, bpf, userfaultfd, io_uring_setup, landlock_create_ruleset | Критически опасные — почти всегда блокируются |
10.3 Примеры фильтрации в systemd
[Service]
# Разрешить только вызовы, необходимые для HTTP-сервера:
SystemCallFilter=@system-service
SystemCallFilter=~@privileged @resources @debug @module @mount @raw-io @reboot @swap
# Или явно:
SystemCallFilter=…
# Разрешить только:
# read write close fcntl epoll_ctl epoll_wait socket connect sendto recvfrom
# mmap mprotect brk rt_sigaction rt_sigprocmask exit_group clock_gettime
🔐 Рекомендуется: начинать с
SystemCallArchitectures=native,NoNewPrivileges=yes,PrivateDevices=yes,ProtectSystem=strict,ProtectHome=read-only, затем сужатьSystemCallFilter.
11. LSM — Mandatory Access Control
11.1 SELinux (Security-Enhanced Linux)
Основные компоненты:
- Политика — правила доступа (
targeted,minimum,mls) - Модули политики — расширения (
semodule -l) - Контексты — метки (
user:role:type:level) - Булевы — переключатели политики (
getsebool -a) - Transitions — смена типа при
execve
Ключевые команды:
| Команда | Назначение |
|---|---|
sestatus | Статус: enabled/disabled, режим (enforcing/permissive/disabled) |
getenforce / `setenforce 0 | 1` |
semanage fcontext -l | Просмотр правил контекстов файлов |
semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?" | Добавить правило контекста |
restorecon -Rv /web | Применить контексты по правилам |
semanage port -l | Список портов и их типов |
semanage port -a -t http_port_t -p tcp 8080 | Разрешить httpd слушать 8080 |
getsebool -a | grep httpd | Фильтр булевых по httpd |
setsebool -P httpd_can_network_connect 1 | Разрешить httpd исходящие соединения (постоянно) |
ausearch -m avc -ts recent | Поиск AVC-денег в аудите |
audit2allow -a | Генерация модуля политики из AVC-логов |
Контексты процессов (/proc/<pid>/attr/current):
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
unconfined_u— пользователь (неsystem_u)unconfined_r— рольunconfined_t— тип (неограниченный)s0-s0:c0.c1023— MLS/MCS уровень
Режимы:
enforcing— блокировать и логироватьpermissive— только логироватьdisabled— LSM не загружен (требует перезагрузки)
11.2 AppArmor
Основные компоненты:
- Профили —
/etc/apparmor.d/(имя = путь к бинарнику с заменой/→.) - Режимы:
complain(только лог),enforce(блокировка) - Abstractions — переиспользуемые фрагменты (
abstractions/base,abstractions/nameservice) - Hat — подпрофили для
change_hat()(например, веб-приложения)
Ключевые команды:
| Команда | Назначение |
|---|---|
aa-status | Статус: загруженные профили, режимы, процессы |
aa-complain /path/to/bin | Перевести профиль в complain |
aa-enforce /path/to/bin | Перевести в enforce |
aa-disable /path/to/bin | Отключить профиль |
aa-genprof /path/to/bin | Интерактивное создание профиля |
aa-logprof | Анализ /var/log/audit/audit.log и обновление профилей |
apparmor_parser -r /etc/apparmor.d/profile | Перезагрузка профиля |
Пример профиля:
#include <tunables/global>
/usr/bin/example {
#include <abstractions/base>
#include <abstractions/nameservice>
/home/*/.config/example/ rw,
/usr/share/example/** r,
/tmp/example-*.tmp rw,
network inet stream,
# Запретить exec
deny /bin/** ix,
deny /usr/bin/** ix,
}
💡 AppArmor проще для старта, SELinux — гибче и строже. Выбор зависит от дистрибутива (RHEL — SELinux, SUSE/Ubuntu — AppArmor).
12. Auditd — аудит событий ядра и пользовательского пространства
12.1 Архитектура
auditd— демон, пишущий в/var/log/audit/audit.logauditctl— утилита управления правиламиausearch,aureport— анализ логовaudispd— плагины (например,audisp-remoteдля отправки на сервер)
12.2 Типы правил
| Тип | Синтаксис | Пример |
|---|---|---|
| Системные вызовы | -a <list>,<action> -S <syscall> [ -F <фильтр> ] | -a always,exit -S openat -F exit=-EACCES |
| Файлы/каталоги | -w <путь> -p <perms> -k <ключ> | -w /etc/shadow -p wa -k identity |
| Сетевые события | -a always,exit -F arch=b64 -S socket -F a0=2 -F a1\&2 -k network-raw | Перехват socket(AF_INET, SOCK_RAW, …) |
| Пользователи | -a always,exit -F arch=b64 -S execve -F euid=0 -k root-commands | Все execve от root |
12.3 Фильтры (-F)
| Фильтр | Пример | Описание |
|---|---|---|
arch=b64 | — | Архитектура (важно для multilib) |
exit=-EPERM | exit=-1 | Код возврата системного вызова |
a0=…, a1=… | a0=2 | Аргументы (a0 = arg0) |
uid=, euid=, suid= | euid=0 | UID процесса |
pid=, ppid= | — | PID и родительский PID |
key= | key=audit-config | Ключ для фильтрации в ausearch -k |
12.4 Анализ
# Последние 10 событий
ausearch -m SYSCALL -ts recent | tail -10
# Все попытки доступа к /etc/shadow
ausearch -f /etc/shadow
# Отчёт по ключу
aureport -k --summary
# Отчёт по пользователям
aureport -u --failed
⚠️ Аудит создаёт нагрузку. Используйте фильтрацию и
rate_limit,max_log_file_action=ROTATE.
13. PAM — Pluggable Authentication Modules
Четыре типа модулей:
auth— аутентификация (пароль, 2FA)account— авторизация (срок действия, доступ по времени)session— управление сессией (mount, env, logging)password— смена пароля
13.1 Стек модулей (/etc/pam.d/<service>)
Формат строки:
<type> <control> <module-path> [module-arguments]
| Control | Значение |
|---|---|
required | Должен succeed; ошибка → отложенная неудача |
requisite | Должен succeed; ошибка → немедленный fail |
sufficient | Если succeed → успех (если до этого не было fail); если fail → игнор |
optional | Игнорируется, если не единственный |
[value=action …] | Явное управление ([success=ok new_authtok_reqd=done default=bad]) |
13.2 Часто используемые модули
| Модуль | Типы | Назначение |
|---|---|---|
pam_unix.so | auth, account, password, session | Стандартная аутентификация (shadow, /etc/passwd) |
pam_deny.so | Все | Всегда fail |
pam_permit.so | Все | Всегда success |
pam_faillock.so | auth | Блокировка после N неудач (preauth, authfail, authsucc) |
pam_tally2.so | auth, account | Устаревший счётчик неудач (заменён faillock) |
pam_limits.so | session | Установка ulimit из /etc/security/limits.conf |
pam_systemd.so | session | Регистрация сессии в logind (cgroup, XDG_RUNTIME_DIR) |
pam_mkhomedir.so | session | Автосоздание /home/$USER при первом входе |
pam_gnome_keyring.so | auth, session | Интеграция с GNOME Keyring |
pam_sss.so | Все | Интеграция с SSSD (LDAP/AD) |
pam_ldap.so | Все | Прямой доступ к LDAP (устаревает в пользу SSSD) |
pam_radius_auth.so | auth | Аутентификация через RADIUS |
pam_u2f.so | auth | 2FA через FIDO U2F |
pam_google_authenticator.so | auth | TOTP/MOTP 2FA |
13.3 Пример: /etc/pam.d/sshd
# Аутентификация
auth required pam_faillock.so preauth
auth sufficient pam_unix.so
auth [default=die] pam_faillock.so authfail
auth required pam_faillock.so authsucc
# Учётная запись
account required pam_unix.so
account required pam_access.so
# Сессия
session required pam_unix.so
session required pam_systemd.so
session optional pam_mkhomedir.so skel=/etc/skel umask=0022
# Смена пароля
password required pam_unix.so sha512 shadow try_first_pass
🔐 Рекомендуется: включать
pam_faillock,pam_access,pam_systemd, избегатьsufficient pam_permit.so.
📘 Сеть, Хранилище, Виртуализация
14. Сетевая подсистема — изоляция и управление трафиком
14.1 Network Namespace (netns)
Изолирует:
- сетевые интерфейсы (
lo,eth0,veth0) - таблицы маршрутизации (
ip route,ip rule) - таблицы
iptables/nftables - сокеты (все TCP/UDP/RAW)
- ARP/NDP-кэш,
conntrack
Управление:
# Создание
ip netns add ns1
# Выполнение команды
ip netns exec ns1 ip a
# Связывание с mount namespace (для /etc/netns/<name>/resolv.conf)
ip netns exec ns1 mount --bind /etc/netns/ns1/resolv.conf /etc/resolv.conf
# Удаление
ip netns delete ns1
💡
/var/run/netns/— симлинки наnsfs-файлы. Удаление каталога не удаляет namespace, пока есть процессы.
14.2 Виртуальные интерфейсы
| Тип | Команда создания | Назначение | Особенности |
|---|---|---|---|
veth | ip link add veth0 type veth peer name veth1 | Пара интерфейсов, соединённых «виртуальным кабелем» | Перемещение одного конца в netns: ip link set veth1 netns ns1 |
bridge | ip link add br0 type bridge ip link set veth0 master br0 | Коммутатор уровня 2 (L2) | Поддержка STP, VLAN filtering, hairpin_mode |
macvlan | ip link add macvlan0 link eth0 type macvlan mode private | Несколько MAC на одном физ. интерфейсе | Режимы: private, vepa, bridge, passthru |
ipvlan | ip link add ipvlan0 link eth0 type ipvlan mode l3 | Несколько IP на одном MAC (L3/L2) | Режимы: l2, l3, l3s (с поддержкой conntrack) |
vlan | ip link add link eth0 name eth0.100 type vlan id 100 | 802.1Q VLAN | Требует CONFIG_VLAN_8021Q |
vxlan | ip link add vxlan100 type vxlan id 100 dev eth0 dstport 4789 | Overlay-сеть (L2 over UDP) | Может использовать fdb для unicast/multicast |
geneve | ip link add geneve1 type geneve id 1000 remote 192.168.1.10 | Расширяемый overlay (RFC 8926) | Поддержка опций (TLS, OAM) |
tun/tap | ip tuntap add dev tun0 mode tun | Интерфейс для userspace-сетевых стеков (VPN, QEMU) | tun — L3 (IP), tap — L2 (Ethernet) |
Пример подключения контейнера к bridge:
ip netns add container
ip link add veth0 type veth peer name veth1
ip link set veth1 netns container
ip link set veth0 master br0 up
ip netns exec container ip link set veth1 up
ip netns exec container ip addr add 10.0.0.2/24 dev veth1
14.3 Traffic Control (tc)
Архитектура: qdisc → class → filter
Типы qdisc:
| Тип | Назначение | Параметры |
|---|---|---|
pfifo_fast | FIFO с 3-мя band (TOS-based) | priomap |
fq (Fair Queue) | Per-flow fairness, pacing | limit, flows, quantum, flow_limit |
fq_codel | fq + CoDel AQM | target, interval, ecn |
cake | Универсальный qdisc (ингресс/эгресс, shaping, AQM) | bandwidth, rtt, flowmode, nat, ack-filter |
htb (Hierarchical Token Bucket) | Иерархическое ограничение скорости | rate, ceil, burst, quantum, prio |
tbf (Token Bucket Filter) | Простое ограничение | rate, burst, limit, latency |
Пример: ограничение до 100 Mbps с HTB
tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 90mbit ceil 100mbit
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.100 flowid 1:10
14.4 nftables — современная замена iptables
Архитектура:
- table → chain → rule
- Встроенные типы цепочек:
filter,nat,route,arp,bridge,netdev
Пример: базовый firewall
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif "lo" accept
ip protocol icmp accept
tcp dport { 22, 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
ct state established,related accept
}
chain output {
type filter hook output priority 0; policy accept;
}
}
Преимущества перед iptables:
- единый синтаксис для IPv4/IPv6/ARP/bridge
- атомарные обновления
- встроенная поддержка множеств (
set,map) - более эффективная обработка (меньше traversals)
- поддержка JSON (
nft -j list ruleset)
🔄 Миграция:
iptables-translate,iptables-restore-translate.
15. Хранилище — LVM, RAID, шифрование, современные ФС
15.1 LVM (Logical Volume Manager)
Иерархия:
Физ. устройство → PV (Physical Volume) → VG (Volume Group) → LV (Logical Volume) → ФС
Управление:
# Создание PV
pvcreate /dev/sdb /dev/sdc
# Создание VG
vgcreate vg_data /dev/sdb /dev/sdc
# Создание LV (linear)
lvcreate -L 100G -n lv_home vg_data
# Thin provisioning
lvcreate -L 1T -T vg_data/pool
lvcreate -V 100G -T vg_data/pool -n lv_snap
# Snapshot (устаревший, для thin — см. выше)
lvcreate -L 10G -s -n snap_home /dev/vg_data/lv_home
# Расширение
lvextend -L +50G /dev/vg_data/lv_home
resize2fs /dev/vg_data/lv_home # для ext4
xfs_growfs /mount/point # для xfs
Флаги LV:
| Флаг | Команда | Эффект |
|---|---|---|
+w | lvchange -ay --permission rw /dev/vg/lv | Read-write |
+r | lvchange -ay --permission r /dev/vg/lv | Read-only |
+a | lvchange -ay /dev/vg/lv | Активация |
+m | lvconvert -m1 /dev/vg/lv | Зеркалирование (RAID1) |
+R | lvconvert --stripes 4 --type raid5 /dev/vg/lv | RAID 5/6/10 |
15.2 mdadm — программный RAID
| Уровень | Мин. дисков | Надёжность | Производительность |
|---|---|---|---|
| RAID 0 | 2 | Нет | Чтение/запись — линейный рост |
| RAID 1 | 2 | 1 диск | Чтение — N×, запись — как один |
| RAID 5 | 3 | 1 диск | Чтение — (N−1)×, запись — дорого (RMW) |
| RAID 6 | 4 | 2 диска | Чтение — (N−2)×, запись — ещё дороже |
| RAID 10 | 4 | N/2 дисков | Чтение/запись — близко к RAID 0 |
Пример RAID 10:
mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sd[bcde]
mkfs.xfs /dev/md0
mdadm --detail /dev/md0 # состояние
cat /proc/mdstat # прогресс resync
Флаги mdadm:
| Флаг | Описание |
|---|---|
--bitmap=internal | Внутренняя bitmap для ускорения resync |
--write-mostly | Пометить диск как «медленный» (для гибридных RAID) |
--failfast | Быстро отмечать диск как failed |
--symlinks=no | Не создавать /dev/md/ симлинки |
15.3 Шифрование — dm-crypt / LUKS2
LUKS2 особенности:
- JSON-заголовок (гибкость)
- Поддержка
argon2i/argon2id(против GPU-брутфорса) - Несколько ключей (до 32 слотов)
integrity(DM-Integrity + HMAC)sector_size(4K для SSD)
Управление:
# Инициализация
cryptsetup luksFormat --type luks2 --pbkdf argon2id --hash sha512 /dev/sdb1
# Открытие
cryptsetup open /dev/sdb1 crypt_data
# Проверка
cryptsetup luksDump /dev/sdb1
# Добавление ключа
cryptsetup luksAddKey /dev/sdb1
# Удаление ключа
cryptsetup luksKillSlot /dev/sdb1 1
# Шифрование с целостностью
cryptsetup luksFormat --integrity hmac-sha256 /dev/sdb1
🔐 Рекомендуется:
--pbkdf argon2id --iter-time 2000(≈2 сек на ввод пароля).
15.4 Современные ФС: btrfs и zfs
btrfs — флаги подтомов и устройств
| Флаг | Команда | Эффект |
|---|---|---|
nodatacow | chattr +C /path | Отключает COW (для ВМ/БД), но теряет snapshots |
compression=zstd:5 | mount -o compress=zstd:5 | Сжатие по умолчанию |
ssd_spread | mount -o ssd_spread | Оптимизация распределения под SSD |
space_cache=v2 | mount -o space_cache=v2 | Кэширование свободного места (быстрее df) |
autodefrag | mount -o autodefrag | Дефрагментация «на лету» |
zfs — ключевые свойства (zfs get all pool/ds)
| Свойство | Значение | Описание |
|---|---|---|
compression | zstd, lz4, gzip-N | Алгоритм сжатия |
atime | on/off | Обновление времени доступа |
xattr | sa (system attrs) / dir | Хранение расширенных атрибутов |
recordsize | 128K (по умолчанию) | Размер блока (оптимизировать под нагрузку: 16K для БД) |
primarycache | all, metadata, none | Что кэшировать в ARC |
secondarycache | all, none | Использование L2ARC |
logbias | latency, throughput | Приоритет: задержка vs пропускная способность |
sync | standard, always, disabled | Гарантии синхронизации (опасно: disabled) |
dedup | on/off | Дедупликация (требует много RAM) |
⚠️
zfs— не в mainline ядре (но >=2.6.39 поддерживает ZFS modules via DKMS/ZOL).
16. Виртуализация — KVM/QEMU
16.1 Архитектура
qemu-system-x86_64— эмулятор + гипервизор (через/dev/kvm)libvirt— менеджер ВМ (virsh,virt-manager)virtio— паравиртуализированные драйверы (сети, диски, RNG, balloon)VFIO— прямой доступ к PCI-устройствам (GPU, NIC)
16.2 Ключевые параметры QEMU
CPU:
| Параметр | Пример | Эффект |
|---|---|---|
-cpu | host, EPYC-v1, Icelake-Server | Эмуляция CPU |
+invtsc | -cpu host,+invtsc | Инвариантный TSC (для миграции) |
kvm=off | -cpu host,kvm=off | Скрыть факт виртуализации |
hv_time, hv_relaxed, hv_vapic, hv_spinlocks=0x1fff | Hyper-V enlightenments для Windows |
Память:
| Параметр | Пример | Эффект |
|---|---|---|
-m | -m 8G,slots=4,maxmem=32G | Горячее добавление памяти |
-object memory-backend-file | -object memory-backend-file,id=mem1,size=4G,mem-path=/hugepages,share=on | Использование huge pages / shared memory |
Диски:
| Параметр | Пример | Эффект |
|---|---|---|
-drive | -drive file=disk.qcow2,if=virtio,cache=none,aio=native,discard=unmap | Рекомендуемый режим для SSD |
detect-zeroes=unmap | — | Авто-TRIM при записи нулей |
throttling.* | throttling.iops-total=1000 | Ограничение IOPS |
Сеть:
| Параметр | Пример | Эффект |
|---|---|---|
-netdev | -netdev bridge,id=net0,br=br0 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:56 | Подключение к bridge |
mq=on | -device virtio-net-pci,mq=on,vectors=6 | Multiqueue (до 64 очередей) |
Безопасность:
| Параметр | Пример | Эффект |
|---|---|---|
-sandbox on | — | Ограничение системных вызовов через seccomp |
-no-user-config | — | Игнорировать ~/.qemu/ |
-nodefaults | — | Не добавлять устройства по умолчанию |
-chardev socket + -mon chardev=…,mode=control | Управление через QMP (JSON-RPC) |
16.3 VFIO — прямой доступ к устройствам
Требования:
- Поддержка IOMMU (
intel_iommu=on/amd_iommu=on) - Отвязка драйвера:
echo "0000:01:00.0" > /sys/bus/pci/devices/0000:01:00.0/driver/unbind - Привязка к
vfio-pci:echo "vfio-pci" > /sys/bus/pci/devices/0000:01:00.0/driver_override
# Запуск с GPU
qemu-system-x86_64 \
-device vfio-pci,host=01:00.0,multifunction=on \
-device vfio-pci,host=01:00.1
⚠️ Для NVIDIA: требует
vBIOSпатча илиacs_override=downstream(небезопасно).
16.4 TPM — виртуальный доверенный платформенный модуль
# Создание emulated TPM
swtpm socket --tpmstate dir=/tmp/mytpm --ctrl type=unixio,path=/tmp/swtpm-sock --log level=20
# В QEMU
-chardev socket,id=chrtpm,path=/tmp/swtpm-sock \
-tpmdev emulator,id=tpm0,chardev=chrtpm \
-device tpm-tis,tpmdev=tpm0
✅ Поддерживается Windows 11,
systemd-cryptenroll --tpm2-device=auto.
📘 Ядро, Контейнеры, eBPF, Автоматизация
17. Сборка и отладка ядра
17.1 Подготовка конфигурации
| Команда | Назначение | Рекомендации |
|---|---|---|
make defconfig | Базовая конфигурация для архитектуры | Минималистичная, подходит для embedded |
make localmodconfig | Конфиг под текущие загруженные модули | Убирает всё, кроме используемого; рекомендуется для десктопов/серверов |
make localyesconfig | То же, но встраивает (=y) вместо модулей (=m) | Меньше initramfs, но больше образ ядра |
make olddefconfig | Применить .config, установить новые опции по умолчанию | После обновления исходников |
make kvm_guest.config | Настройки для гостя KVM (в upstream ≥5.17) | Оптимизация под виртуализацию |
make tinyconfig | Минимальное ядро (~300 KB) | Только для отладки |
Ключевые CONFIG_* опции (для production-серверов):
| Категория | Опции | Комментарий |
|---|---|---|
| Безопасность | CONFIG_STRICT_KERNEL_RWX=y, CONFIG_STRICT_MODULE_RWX=y, CONFIG_RETPOLINE=y, CONFIG_RANDOMIZE_BASE=y, CONFIG_SLAB_FREELIST_RANDOM=y, CONFIG_SLAB_FREELIST_HARDENED=y, CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y, CONFIG_INIT_ON_FREE_DEFAULT_ON=y, CONFIG_VMAP_STACK=y, CONFIG_DEBUG_WX=y, CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y | Защита от ROP/JOP, инициализация памяти |
| Отладка | CONFIG_KASAN=y, CONFIG_KASAN_INLINE=y, CONFIG_KASAN_SW_TAGS=y (ARM64), CONFIG_UBSAN=y, CONFIG_DEBUG_ATOMIC_SLEEP=y, CONFIG_PROVE_LOCKING=y, CONFIG_LOCKDEP=y, CONFIG_DEBUG_LIST=y, CONFIG_DEBUG_PLIST=y, CONFIG_DEBUG_SG=y, CONFIG_DEBUG_NOTIFIERS=y | Только для тестов — падение производительности ×2–10 |
| Производительность | CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y, CONFIG_COMPACTION=y, CONFIG_TRANSPARENT_HUGEPAGE=y, CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y, CONFIG_CFS_BANDWIDTH=y, CONFIG_RT_GROUP_SCHED=y, CONFIG_BPF_JIT=y, CONFIG_BPF_JIT_ALWAYS_ON=y | THP, BPF-JIT, групповое планирование |
| Сети | CONFIG_NET_SCH_FQ_CODEL=y, CONFIG_NET_SCH_CAKE=y, CONFIG_XDP_SOCKETS=y, CONFIG_VXLAN=y, CONFIG_GENEVE=y, CONFIG_NETFILTER_ADVANCED=y, CONFIG_NF_CONNTRACK_TIMEOUT=y, CONFIG_NF_CT_PROTO_DCCP=y, CONFIG_NF_CT_PROTO_SCTP=y, CONFIG_NF_CT_PROTO_UDPLITE=y, CONFIG_NF_TABLES_IPV4=y, CONFIG_NF_TABLES_IPV6=y, CONFIG_NF_TABLES_BRIDGE=y, CONFIG_NFT_FIB_IPV4=y, CONFIG_NFT_FIB_IPV6=y | Современный сетевой стек |
| Хранилище | CONFIG_BLOCK_COMPAT=y, CONFIG_ZONED_BLOCK_DEVICES=y, CONFIG_NVME_CORE=y, CONFIG_NVME_TCP=y, CONFIG_SCSI_MQ_DEFAULT=y, CONFIG_BLK_WBT=y, CONFIG_BLK_DEV_ZONED=y, CONFIG_FS_DAX=y, CONFIG_DAX_DRIVER=y, CONFIG_ZONEFS_FS=y | Поддержка ZNS SSD, DAX, multi-queue SCSI |
💡 Для production: отключите все
CONFIG_DEBUG_*, включитеCONFIG_SLUB_DEBUG_ON=n,CONFIG_DEBUG_INFO=n,CONFIG_STRIP_ASM_SYMS=y.
17.2 Сборка и установка
# Сборка ядра и модулей
make -j$(nproc) bindeb-pkg # для Debian/Ubuntu (создаёт .deb)
make -j$(nproc) modules_install install # ручная установка
# Обновление initramfs
update-initramfs -c -k 6.8.0-custom
# Обновление загрузчика
update-grub
17.3 Отладка ядра — kdump / crash
Настройка kdump:
- Резервирование памяти:
crashkernel=512Mв/proc/cmdline - Установка:
apt install linux-crashdump(Debian) - Конфигурация:
/etc/default/kdump-tools→USE_KDUMP=1 - Тест:
echo c > /proc/sysrq-trigger
Анализ дампа:
crash /usr/lib/debug/boot/vmlinux-$(uname -r) /var/crash/*/vmcore
# Внутри crash:
> bt # backtrace всех процессов
> ps # список процессов
> log # dmesg на момент падения
> rd 0xffff888100000000 10 # чтение памяти (10 quadwords)
> struct task_struct.task_struct ffff888100000000
🔍 Для symbol resolution: установите
linux-image-$(uname -r)-dbgили соберите ядро сCONFIG_DEBUG_INFO=y.
18. Контейнеры — OCI-стек
18.1 Спецификации
OCI Runtime Spec— форматconfig.jsonиruntime.jsonOCI Image Spec— формат образов (manifest.json,layer.tar,index.json)CRI(Container Runtime Interface) — gRPC-интерфейс дляkubelet(containerd,CRI-O)
18.2 Инструменты
| Инструмент | Назначение | Команда-пример |
|---|---|---|
runc | Ссылочная реализация OCI runtime | runc run mycontainer |
crun | Альтернатива на C (меньше памяти, поддержка cgroups v2) | crun run mycontainer |
podman | docker-совместимый CLI без демона | podman run -d --name web nginx |
buildah | Сборка образов без root (от containers/image) | buildah bud -t myapp . |
skopeo | Копирование/инспектирование образов между репозиториями | skopeo copy docker://alpine oci:alpine-local |
umoci | Работа с OCI-образами на уровне файловой системы | umoci unpack --image alpine:latest bundle/ |
Пример config.json (минимальный):
{
"ociVersion": "1.0.2",
"process": {
"terminal": true,
"user": { "uid": 0, "gid": 0 },
"args": ["/bin/sh"],
"env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
"cwd": "/"
},
"root": { "path": "rootfs", "readonly": false },
"hostname": "container",
"mounts": [
{ "destination": "/proc", "type": "proc", "source": "proc" },
{ "destination": "/dev", "type": "tmpfs", "source": "tmpfs", "options": ["nosuid","strictatime","mode=755"] }
],
"linux": {
"namespaces": [
{ "type": "pid" },
{ "type": "network" },
{ "type": "mount" },
{ "type": "uts" },
{ "type": "ipc" }
],
"resources": {
"devices": [
{ "allow": false, "access": "rwm" },
{ "allow": true, "type": "c", "major": 1, "minor": 3, "access": "rwm" }
]
}
}
}
18.3 containerd — runtime для Kubernetes
ctr— низкоуровневый CLInerdctl—docker-совместимый CLI дляcontainerdCRIplugin —/etc/containerd/config.toml→[plugins."io.containerd.grpc.v1.cri"]
Настройка пула образов:
[plugins."io.containerd.snapshotter.v1.devmapper"]
pool_name = "container-thinpool"
root_path = ""
base_image_size = "10GB"
discard_blocks = true
💡
devmappersnapshotter предпочтителен для production (вместоoverlayfsна shared FS).
19. eBPF — расширяемость ядра без изменения кода
19.1 Типы программ eBPF
| Тип | Хук | Примеры использования |
|---|---|---|
BPF_PROG_TYPE_SOCKET_FILTER | recvmsg, sendmsg | Фильтрация пакетов в userspace (как SO_ATTACH_BPF) |
BPF_PROG_TYPE_KPROBE | kprobe, kretprobe | Трассировка функций ядра (например, tcp_sendmsg) |
BPF_PROG_TYPE_TRACEPOINT | Трейспоинты (sched:sched_process_exec) | Стабильные точки трассировки |
BPF_PROG_TYPE_XDP | Приём пакета на сетевом драйвере | Фильтрация/перенаправление до стека (высокая производительность) |
BPF_PROG_TYPE_SCHED_CLS | tc classifier | Маркировка/фильтрация в tc |
BPF_PROG_TYPE_CGROUP_SKB | Вход/выход из cgroup | Контроль трафика на уровне cgroup |
BPF_PROG_TYPE_CGROUP_SOCK | Создание сокета в cgroup | Решение allow/deny на этапе socket(), connect() |
BPF_PROG_TYPE_LSM (5.7+) | Хуки безопасности (SELinux/AppArmor) | Дополнительные проверки доступа |
BPF_PROG_TYPE_STRUCT_OPS (5.6+) | Замена операций (например, TCP congestion control) | Пользовательские алгоритмы |
19.2 Инструменты
| Инструмент | Назначение |
|---|---|
bpftool | Интроспекция: bpftool prog show, bpftool map dump id 123 |
bpftrace | Скриптовый язык для трассировки (DTrace-подобный) |
bcc | Набор утилит (opensnoop, execsnoop, tcplife, biolatency) + Python API |
libbpf | C-библиотека для загрузки программ (рекомендована вместо BCC) |
cilium/ebpf | Go-библиотека для eBPF |
Пример bpftrace — отслеживание execve:
bpftrace -e 'tracepoint:syscalls:sys_enter_execve { printf("%s %s\n", comm, str(args->filename)); }'
Пример XDP-программы (drop всех пакетов):
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
SEC("xdp")
int xdp_drop(struct xdp_md *ctx) {
return XDP_DROP;
}
char _license[] SEC("license") = "GPL";
Загрузка:
clang -target bpf -O2 -g -c drop.c -o drop.o
sudo ip link set dev eth0 xdp obj drop.o sec xdp
⚠️ Для XDP требуется драйвер с поддержкой (
veth,ixgbe,i40e,mlx5,nfp).
19.3 Maps — обмен данными между eBPF и userspace
| Тип map | Особенности |
|---|---|
BPF_MAP_TYPE_HASH | Ключ → значение (например, PID → timestamp) |
BPF_MAP_TYPE_PERCPU_HASH | Хеш по CPU (для агрегации) |
BPF_MAP_TYPE_ARRAY | Индекс → значение (фиксированный размер) |
BPF_MAP_TYPE_PERF_EVENT_ARRAY | Передача событий в ring buffer (perf) |
BPF_MAP_TYPE_RINGBUF (5.8+) | Новый ring buffer (меньше overhead) |
BPF_MAP_TYPE_LPM_TRIE | Longest Prefix Match (для IP-диапазонов) |
Пример использования в libbpf:
struct {
__uint(type, BPF_MAP_TYPE_HASH);
__uint(max_entries, 10240);
__type(key, __u32); // PID
__type(value, __u64); // timestamp
} exec_start SEC(".maps");
20. Автоматизация развёртывания
20.1 cloud-init — инициализация в облаке
Фазы: init-local → init → config → final
Пример user-data:
#cloud-config
users:
- name: deploy
groups: sudo
shell: /bin/bash
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2E... deploy@workstation
package_upgrade: true
packages:
- nginx
- python3-pip
runcmd:
- systemctl enable --now nginx
write_files:
- path: /etc/nginx/sites-available/app
content: |
server { listen 80; location / { proxy_pass http://localhost:8000; } }
📁 Источники:
nocloud(CDROM/ISO),ConfigDrive,OpenStack metadata,AWS EC2.
20.2 ignition — инициализация для CoreOS/RHCOS/Fedora CoreOS
Формат: JSON (строго типизированный), применяется один раз при первой загрузке.
Пример:
{
"ignition": { "version": "3.4.0" },
"passwd": {
"users": [{
"name": "core",
"sshAuthorizedKeys": ["ssh-rsa AAAAB3..."]
}]
},
"storage": {
"files": [{
"path": "/etc/hostname",
"contents": { "source": "data:,myhost" },
"mode": 420
}]
},
"systemd": {
"units": [{
"name": "nginx.service",
"enabled": true,
"contents": "[Service]\nExecStart=/usr/sbin/nginx -g 'daemon off;'\n[Install]\nWantedBy=multi-user.target"
}]
}
}
🔐 Поддержка LUKS, RAID, Btrfs, SELinux relabeling на этапе инициализации.
20.3 systemd-утилиты для автоматизации
| Утилита | Назначение | Пример |
|---|---|---|
systemd-sysusers | Создание системных пользователей из /usr/lib/sysusers.d/*.conf | u deploy - "Deployment user" - - |
systemd-tmpfiles | Управление временными файлами/каталогами | d /run/app 0755 deploy deploy - |
systemd-firstboot | Настройка hostname, timezone, locale при первой загрузке | systemd-firstboot --hostname=myhost --timezone=Europe/Moscow |
systemd-repart (249+) | Динамическое изменение разделов на загрузке | /usr/lib/systemd/systemd-repart --dry-run=no /dev/sda |
Формат /usr/lib/tmpfiles.d/app.conf:
d /run/app 0755 deploy deploy -
f /var/log/app.log 0644 root root -
L /var/lib/app/current - - - - ../releases/20241121
💡 Используется в immutable OS (CoreOS, Flatcar) для идемпотентной инициализации.
📘 systemd и journald
21. systemd — архитектура и углублённое управление
21.1 Типы юнитов и их ключевые параметры
| Тип юнита | Расширение | Ключевые секции и параметры | Примечания |
|---|---|---|---|
service | .service | [Service] Type= (simple, forking, oneshot, notify, dbus, exec, idle) ExecStart=, ExecStartPre=, ExecStartPost= Restart= (no, always, on-success, on-failure, on-abnormal, on-watchdog, on-abort) RestartSec= TimeoutStartSec=, TimeoutStopSec= KillMode= (control-group, process, mixed, none) KillSignal= SendSIGKILL= SendSIGHUP= WorkingDirectory= RootDirectory= User= Group= SupplementaryGroups= Nice= CPUSchedulingPolicy= (other, batch, idle, fifo, rr) CPUSchedulingPriority= IOSchedulingClass= (none, realtime, best-effort, idle) IOSchedulingPriority= | Type=notify требует sd_notify(3) в приложении Restart=on-failure + StartLimitIntervalSec=, StartLimitBurst= — защита от флаппинга |
socket | .socket | [Socket] ListenStream=, ListenDatagram=, ListenSequentialPacket= ListenFIFO=, ListenSpecial= ListenNetlink= ListenMessageQueue= Accept= (yes/no) MaxConnections= TimeoutSec= DirectoryMode= SocketMode= SocketUser= SocketGroup= | Активация по сокету (socket activation). При Accept=yes — создаётся transient-сервис на каждое соединение |
timer | .timer | [Timer] OnActiveSec=, OnBootSec=, OnStartupSec=, OnUnitActiveSec=, OnUnitInactiveSec= OnCalendar= (например, Mon..Fri *-*-* 09:00:00) AccuracySec= RandomizedDelaySec= Persistent= | Замена cron для системных задач. Persistent=yes — выполнить пропущенные события после простоя |
path | .path | [Path] PathExists=, PathExistsGlob= PathChanged=, PathModified= DirectoryNotEmpty= | Активация при изменении ФС (например, inotify-триггеры) |
device | .device | Автогенерируется из udev | Имя — из DEVPATH, замена / → - (например, dev-sda.device) |
mount | .mount | Имя — путь с заменой / → - (например, mnt-data.mount) What= Where= Type= Options= | Активируется как юнит; systemctl start mnt-data.mount ≡ mount /mnt/data |
automount | .automount | [Automount] Where= TimeoutIdleSec= | Автомонтирование по обращению (аналог autofs) |
target | .target | [Install] WantedBy= RequiredBy= | Группировка юнитов (аналог runlevel: multi-user.target, graphical.target) |
slice | .slice | [Slice] — пусто [CPUAccounting], [MemoryAccounting], [IOAccounting] | Иерархия cgroups v2: machine.slice, system.slice, user.slice |
scope | .scope | Создаётся динамически (systemd-run --scope) | Для внешних процессов (например, user@1000.service) |
21.2 Управление зависимостями
| Директива | Секция | Эффект |
|---|---|---|
Requires= | [Unit] | Запускать зависимость; ошибка → fail юнита |
Wants= | [Unit] | Запускать зависимость; ошибка → игнор |
Requisite= | [Unit] | Проверка перед запуском (если недоступна — fail без попытки запуска) |
BindsTo= | [Unit] | Останавливать юнит при остановке зависимости |
PartOf= | [Unit] | Группировка для systemctl stop (но не влияет на порядок) |
After= / Before= | [Unit] | Порядок запуска/остановки (не подразумевает Requires) |
Conflicts= | [Unit] | Взаимоисключающие юниты |
Upholds= | [Unit] | Перезапускать зависимость, если она упала (но не при старте) |
💡 Правило:
Wants=+After=— стандартный паттерн для нестрогих зависимостей.
21.3 Изоляция и безопасность в [Service]
| Параметр | Безопасное значение | Эффект |
|---|---|---|
PrivateTmp= | yes | Отдельный /tmp, /var/tmp |
PrivateDevices= | yes | Пустой /dev (только null, zero, full, random, urandom, tty, ptmx) |
ProtectSystem= | strict | /usr, /boot, /etc — ro; / — noexec, nodev, nosuid |
ProtectHome= | read-only / tmpfs | /home, /root, /run/user — ro или изолированный tmpfs |
NoNewPrivileges= | yes | Запрет setuid, setgid, capabilities, user namespaces |
RestrictSUIDSGID= | yes | Блокировка создания setuid/setgid файлов |
RestrictRealtime= | yes | Запрет SCHED_FIFO, SCHED_RR |
RestrictNamespaces= | yes / mount:net:pid | Ограничение создания namespace |
LockPersonality= | yes | Запрет personality() syscall (эмуляция других ОС) |
MemoryDenyWriteExecute= | yes | Запрет одновременного PROT_WRITE | PROT_EXEC |
SystemCallFilter= | @system-service + ~@privileged | Фильтрация syscalls (см. Часть 3) |
SystemCallArchitectures= | native | Запрет вызовов для других архитектур (multilib) |
IPAddressAllow= / IPAddressDeny= | 10.0.0.0/8 127.0.0.1 ::1 | Фильтрация на уровне cgroup v2 (требует IPAccounting=yes) |
DeviceAllow= | char-rtc r, block-sda rw | Контроль доступа к /dev/* (аналог cgroups v1 devices) |
Пример безопасного сервиса:
[Service]
Type=notify
User=app
Group=app
DynamicUser=yes
ProtectSystem=strict
ProtectHome=read-only
NoNewPrivileges=yes
PrivateTmp=yes
PrivateDevices=yes
RestrictSUIDSGID=yes
RestrictRealtime=yes
RestrictNamespaces=yes
LockPersonality=yes
MemoryDenyWriteExecute=yes
SystemCallFilter=@system-service @network-io
SystemCallArchitectures=native
IPAddressAllow=10.0.0.0/8 127.0.0.1
DeviceAllow=char-rtc r
✅
DynamicUser=yes— создаёт ephemeral UID/GID вне/etc/passwd, автоматически удаляется при остановке.
21.4 Уведомления и интеграция
| Механизм | Описание | Пример (C) |
|---|---|---|
sd_notify(3) | Отправка состояния через AF_UNIX сокет ($NOTIFY_SOCKET) | sd_notify(0, "READY=1\nSTATUS=Running"); |
sd_notifyf(3) | Форматированная отправка | sd_notifyf(0, "STATUS=Processing %d items", count); |
sd_pid_notify(3) | Уведомление от другого PID | — |
sd_watchdog_enabled(3) | Поддержка watchdog (WatchdogSec=) | uint64_t usec; sd_watchdog_enabled(0, &usec); sd_notify(0, "WATCHDOG=1"); |
sd_booted(3) | Проверка, запущен ли systemd | — |
Параметры юнита:
[Service]
Type=notify
NotifyAccess=main
WatchdogSec=30s
📡 systemd ждёт
READY=1в течениеTimeoutStartSec(по умолчанию 90s), иначе — timeout.
21.5 Динамические юниты и transient units
| Команда | Пример | Эффект |
|---|---|---|
systemd-run | systemd-run --uid=1000 --slice=machine.slice --property=After=network-online.target sleep 3600 | Создаёт transient .service |
busctl call | busctl call org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager StartTransientUnit "ssa(sv)a(sa(sv))" "myapp.service" "fail" 2 "ExecStart" 1 "/bin/sleep" 3 "/bin/sleep" "60" "Type" "s" "oneshot" 0 | Прямой вызов D-Bus API |
systemd-analyze dump | — | Вывод всех юнитов и их состояний (для отладки) |
22. journald — структурированное логирование
22.1 Архитектура
systemd-journald— собирает логи из:stdout/stderrсервисовkmsg(через/dev/kmsg)syslog(через/run/systemd/journal/syslog)nativeAPI (sd_journal_send())
- Хранение:
/run/log/journal/— volatile (RAM)/var/log/journal/— persistent (еслиStorage=persistentв/etc/systemd/journald.conf)
- Формат: binary, индексированный, сжатый (
LZ4/XZ)
22.2 Конфигурация (/etc/systemd/journald.conf)
| Параметр | Значение | Эффект |
|---|---|---|
Storage= | volatile, persistent, auto, none | Куда писать логи |
Compress= | yes/no | Сжатие записей |
Seal= | yes/no | Криптографическая привязка записей (требует TPM2 или ключа) |
SplitMode= | uid, login, none | Разделение журналов по пользователям |
RateLimitIntervalSec= | 30s | Интервал rate limiting |
RateLimitBurst= | 10000 | Макс. записей за интервал |
MaxRetentionSec= | 1month | Автоочистка по времени |
MaxFileSec= | 1day | Макс. время жизни одного файла |
SystemMaxUse= | 1G | Макс. общий размер |
RuntimeMaxUse= | 100M | Макс. размер в RAM |
22.3 Структурированные поля
Каждая запись содержит ключ=значение в UTF-8.
| Поле | Источник | Пример |
|---|---|---|
MESSAGE= | stdout, sd_journal_send() | "Server started on port 8080" |
PRIORITY= | syslog level / sd_journal_priority() | 6 (info) |
SYSLOG_IDENTIFIER= | argv[0] или setproctitle | "nginx" |
SYSLOG_PID= | PID процесса | 12345 |
_PID=, _UID=, _GID= | Ядро | 12345, 33, 33 |
_COMM=, _EXE=, _CMDLINE= | /proc/<pid>/ | "nginx", "/usr/sbin/nginx", "nginx: worker process" |
_SYSTEMD_UNIT=, _SYSTEMD_SLICE=, _SYSTEMD_CGROUP= | cgroup | "nginx.service", "system.slice", "/system.slice/nginx.service" |
_BOOT_ID= | UUID загрузки | "7d4d3e5a-..." |
_MACHINE_ID= | /etc/machine-id | "a1b2c3d4-..." |
_HOSTNAME= | gethostname() | "web01" |
CODE_FILE=, CODE_LINE=, CODE_FUNC= | sd_journal_send() | "main.c", 42, "start_server" |
ERRNO= | errno | 13 (EACCES) |
MESSAGE_ID= | UUID события | "f1a2b3c4-..." (для каталогизации) |
Пример отправки структурированного лога (C):
#include <systemd/sd-journal.h>
sd_journal_send(
"MESSAGE=File processed: %s", path,
"PRIORITY=%i", LOG_INFO,
"FILE_PATH=%s", path,
"BYTES_READ=%zu", size,
"ERRNO=%i", errno,
"CODE_FILE=%s", __FILE__,
"CODE_LINE=%i", __LINE__,
"CODE_FUNC=%s", __func__,
NULL
);
22.4 Утилиты анализа
| Команда | Пример | Описание |
|---|---|---|
journalctl | journalctl -u nginx.service -f | Просмотр логов |
journalctl --since "2024-11-20 09:00:00" --until "2024-11-20 17:00:00" | По времени | |
journalctl _PID=12345 | По PID | |
journalctl MESSAGE_ID=f1a2b3c4-... | По ID события | |
journalctl -o json-pretty | Вывод в JSON | |
journalctl --disk-usage | Размер журналов | |
journalctl --vacuum-time=7d | Очистка старше 7 дней | |
systemd-catalog | systemd-catalog query f1a2b3c4-... | Получение описания события из каталога |
systemd-catalog update | Обновление локального каталога (/usr/lib/systemd/catalog/*.catalog) |
Создание каталога событий (/usr/lib/systemd/catalog/myapp.catalog):
f1a2b3c4-abcd-1234-5678-0123456789ab
File processed successfully.
The application has successfully processed the input file.
📚
systemd-catalogпозволяет локализовать и документировать события — аналогEvent Logв Windows.
22.5 Шифрование журналов (250+)
Требует TPM2 или внешнего ключа.
# /etc/systemd/journald.conf.d/encrypt.conf
[Journal]
Seal=yes
# Генерация ключа (если нет TPM)
systemd-creds encrypt --name=journal.secret --setup --no-pager
# Включение sealing
systemctl restart systemd-journald
🔐 Записи подписываются HMAC-SHA256, проверяются при чтении. Защищает от подмены логов.
23. Интеграция systemd с другими системами
| Компонент | Интеграция |
|---|---|
logind | Управление сессиями: systemd-logind создаёт user@.service, session-*.scope, выдаёт XDG_RUNTIME_DIR, cgroup для пользователя |
resolved | systemd-resolved — DNS stub listener (127.0.0.53), кэширование, DNSSEC, mDNS |
networkd | systemd-networkd — конфигурация сети (.network, .netdev, .link), DHCP, static, bridge, VLAN |
timesyncd | systemd-timesyncd — SNTP-клиент (базовая синхронизация) |
homed | systemd-homed — управление пользователями в зашифрованных home-директориях (~/.home) |
portabled | systemd-portabled — импорт/экспорт portable-сервисов (.raw образы) |
machined | systemd-machined — отслеживание ВМ/контейнеров (machinectl list) |
Пример .network файла:
[Match]
Name=enp1s0
[Network]
DHCP=yes
DNS=8.8.8.8
Domains=~.
[DHCP]
UseDNS=false
RouteMetric=100
💡
systemd-networkdсовместим сNetworkManager(черезunmanaged-devices), но не должен управлять одним интерфейсом одновременно.
📘 Диагностика, профилирование, анализ производительности
24. Трассировка системных вызовов и библиотек
24.1 strace — системные вызовы
Ключевые опции:
| Опция | Эффект | Пример |
|---|---|---|
-e trace=%desc,%file,%process,%signal,%ipc | Фильтрация по категориям | strace -e trace=openat,connect -p 1234 |
-e trace=/regex/ | Фильтр по регулярному выражению | strace -e trace=/^f/ → fork, fstat, fcntl |
-e status=failed | Только завершившиеся с ошибкой | strace -e status=failed curl example.com |
-k | Показать стек вызовов (требует -f и CONFIG_STACKTRACE) | strace -k -e openat cat /etc/passwd |
-T | Время выполнения каждого вызова | — |
-c | Сводная статистика (syscalls, errors, time) | — |
-o file | Запись в файл | — |
-ff | Раздельные файлы для каждого потока/процесса | strace -ff -o trace ./app → trace.<pid> |
-s N | Макс. длина строк (по умолчанию 32) | strace -s 256 -e write ... |
-yy | Декодирование дескрипторов (например, socket:[12345] → TCP localhost:53) | strace -yy -e connect ... |
Пример: отладка 403 в веб-сервере
strace -f -e trace=openat,stat,fstat,access -s 256 -o nginx.strace nginx -g 'daemon off;'
# Поиск:
grep -E 'openat.*ENOENT|access.*EACCES' nginx.strace
⚠️
straceзамедляет программу (×10–100). Не использовать в продакшене без изоляции.
24.2 ltrace — вызовы библиотек (libc, libm, libpthread)
| Опция | Эффект |
|---|---|
-e "malloc@libc.so.6" | Фильтр по символу и библиотеке |
-l libssl.so.3 | Только вызовы из указанной библиотеки |
-C | Декорирование имён C++ (demangling) |
-n 4 | Отступ для вложенности вызовов |
-c | Сводка по вызовам (кол-во, время) |
Пример: анализ использования malloc
ltrace -e malloc,calloc,realloc,free -c ./app
❗
ltraceне работает сstatic-линкованными бинарниками иPIEбез отладочных символов.
25. perf — профилирование ядра и userspace
Архитектура: PMU (Performance Monitoring Unit) → ring buffer → perf.data → perf report.
25.1 Базовые команды
| Команда | Описание |
|---|---|
perf list | Список доступных событий (hardware, software, tracepoint, dynamic) |
perf stat -p 1234 | Счётчики: instructions, cycles, branches, branch-misses, cache-references, cache-misses |
perf record -g --call-graph dwarf -p 1234 | Запись стеков (DWARF для userspace, fp для frame pointers) |
perf report --no-children | Отчёт без агрегации потомков |
perf top | Аналог top в реальном времени |
perf script | Вывод событий в текстовом виде (для обработки скриптами) |
Типы событий:
| Категория | Примеры |
|---|---|
| Hardware | cycles, instructions, cache-references, cache-misses, branch-instructions, branch-misses |
| Software | cpu-clock, task-clock, page-faults, context-switches, cpu-migrations |
| Tracepoint | sched:sched_switch, syscalls:sys_enter_openat, block:block_rq_issue, net:netif_receive_skb |
| Dynamic | rNNN (raw MSR), mem:0xaddr (load/store latency), kmem:kmalloc |
25.2 Продвинутые сценарии
Оценка эффективности CPU:
perf stat -e \
cycles,instructions,\
branches,branch-misses,\
cache-references,cache-misses,\
stalled-cycles-frontend,stalled-cycles-backend \
--timeout 10000 ./app
→ IPC = instructions / cycles (цель: >1.0 для compute-bound), branch-miss-rate < 1%.
Проблемы с NUMA:
perf c2c record -p 1234 # cache-to-cache transfers
perf c2c report
→ Показывает LLC Misses, Remote HITM, LLC Local/Remote.
Мониторинг памяти:
perf mem record -p 1234
perf mem report --stdio
→ load, store, load-hit, load-miss, store-hit, store-miss.
Трассировка ядра:
perf probe 'tcp_sendmsg size' # добавить kprobe
perf record -e probe:tcp_sendmsg -aR sleep 10
perf script
💡 Для
perfтребуетсяCONFIG_PERF_EVENTS=y,CONFIG_KPROBE_EVENTS=y,CONFIG_UPROBE_EVENTS=y.
26. ftrace — встроенная трассировка ядра
Работает через debugfs: /sys/kernel/debug/tracing/.
Основные файлы:
| Файл | Назначение |
|---|---|
available_tracers | nop, function, function_graph, blk, hwlat, irqsoff, preemptoff, wakeup |
current_tracer | Текущий трассер |
trace | Вывод трассировки |
trace_pipe | Потоковый вывод (не буферизованный) |
set_ftrace_filter | Фильтр функций (tcp_*, ext4_*) |
set_ftrace_notrace | Исключения |
tracing_on | 1/0 — вкл/выкл сбор |
options | Флаги: function-trace, latency-format, sleep-time, stacktrace |
Пример: анализ задержек в планировщике
echo preemptoff > /sys/kernel/debug/tracing/current_tracer
echo 1 > /sys/kernel/debug/tracing/tracing_on
sleep 5
echo 0 > /sys/kernel/debug/tracing/tracing_on
cat /sys/kernel/debug/tracing/trace
→ Покажет максимальное время без preemption.
Граф вызовов:
echo function_graph > /sys/kernel/debug/tracing/current_tracer
echo 'ext4_*' > /sys/kernel/debug/tracing/set_ftrace_filter
echo 1 > /sys/kernel/debug/tracing/tracing_on
# Выполнить операцию
cat /sys/kernel/debug/tracing/trace
📌
ftraceработает без загрузки модулей, минимальный overhead. Подходит для production с осторожностью.
27. blktrace и bpftrace — специализированная диагностика
27.1 blktrace — трассировка блочного I/O
| Утилита | Назначение |
|---|---|
blktrace -d /dev/sda -o - | blkparse -i - | Потоковый разбор |
btt -i sda.blktrace.bin | Анализ временных характеристик (queue, service time) |
seekwatcher -t sda.blktrace.bin -o seekmap.png | Визуализация seek-паттернов |
События:
Q— queuedG— get requestM— remapI— insertedD— issued to driverC— completed
→ D→C = service time; Q→G = queue wait.
27.2 bpftrace — однострочники для диагностики
Группировка по категориям:
| Категория | Команда | Описание |
|---|---|---|
| Файловая система | bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }' | Все openat |
bpftrace -e 'tracepoint:syscalls:sys_exit_openat /args->ret < 0/ { printf("%s %s → %d\n", comm, str(args->filename), args->ret); }' | Ошибки открытия | |
bpftrace -e 'kprobe:vfs_read { @bytes = hist(args->count); }' | Распределение размеров чтения | |
| Сеть | bpftrace -e 'tracepoint:syscalls:sys_enter_connect { printf("%s → %s:%d\n", comm, ntop(args->addr), args->port); }' | Исходящие соединения |
bpftrace -e 'kprobe:tcp_sendmsg { @size = hist(args->size); }' | Размеры отправляемых TCP-пакетов | |
bpftrace -e 'kprobe:tcp_rcv_established { @inflight = hist(args->tp->snd_nxt - args->tp->snd_una); }' | In-flight bytes (congestion window proxy) | |
| Память | bpftrace -e 'kprobe:__alloc_pages_nodemask { @order = hist(args->order); }' | Распределение order при аллокации страниц |
bpftrace -e 'kprobe:kmem_cache_alloc { @size = hist((uint64)args->size); }' | Размеры SLAB-аллокаций | |
| Планировщик | bpftrace -e 'tracepoint:sched:sched_switch { @quantum[prev->pid] = nsecs - @start[prev->pid]; @start[prev->pid] = nsecs; }' | Время кванта процесса |
bpftrace -e 'tracepoint:sched:sched_wakeup { @latency = hist(nsecs - args->target->last_sleep); }' | Время пробуждения | |
| Производительность | bpftrace -e 'profile:hz:99 { @[kstack] = count(); }' | CPU profiling (99 Hz) |
bpftrace -e 'tracepoint:syscalls:sys_exit_* /args->ret < 0/ { @[comm, probe] = count(); }' | ТОП-ошибки по syscall |
✅
bpftraceкомпилирует в eBPF на лету, минимальный overhead. Подходит для production при аккуратном использовании.
28. Анализ дампов и отладка
28.1 Сбор дампов
| Сценарий | Команда | Формат |
|---|---|---|
| Процесс | gcore -o core.12345 12345 | ELF core dump |
kill -SIGQUIT 12345 (если ulimit -c unlimited) | — | |
| Ядро | echo c > /proc/sysrq-trigger (с crashkernel=) | vmcore |
| Временная точка | rr record ./app | Record & Replay (deterministic) |
| Снапшот памяти | cryo save 12345 /tmp/snap.cryo | Состояние процесса (через ptrace + memfd) |
28.2 Анализ в gdb
Основные команды:
| Команда | Эффект |
|---|---|
(gdb) bt full | Backtrace со значениями локальных переменных |
(gdb) info registers | Регистры CPU |
(gdb) disassemble $pc,+64 | Дизассемблирование вокруг PC |
(gdb) x/10gx $rsp | Просмотр стека (10 quadwords) |
(gdb) thread apply all bt | Backtrace всех потоков |
(gdb) set pagination off | Отключить постраничный вывод |
(gdb) python print(gdb.history(10)) | Доступ к Python API |
Автоматизация:
# ~/.gdbinit
set backtrace past-main on
set print pretty on
set print array on
set print array-indexes on
define mybt
thread apply all bt full
info registers
info sharedlibrary
end
28.3 rr — record & replay
rr record ./app # запись
rr replay # воспроизведение с возможностью rewind
(gdb) reverse-step # шаг назад
(gdb) reverse-continue # до точки останова назад
🎯 Идеален для нестабильных багов (race conditions, use-after-free).
28.4 cryo — snapshotting без остановки
cryo save 12345 /tmp/snap.cryo # сохранить
cryo restore /tmp/snap.cryo # восстановить (в новом PID)
🔁 Поддерживает
fork,threads,mmap,vDSO, но не поддерживаетptrace,inotify,epoll,netlink.