С чего начать Первые шаги трек · 15 ступеней
Linux Labs

sysctl — параметры ядра во время работы

8 мин Ubuntu 24.04 · procps 4.0

sysctl читает и меняет параметры ядра; -w действует до перезагрузки, постоянно — файл в /etc/sysctl.d/.

Шпаргалка

8 команд Версия для печати
  • sysctl vm.swappiness прочитать параметр
  • sysctl -n vm.swappiness только значение
  • sudo sysctl -w vm.swappiness=10 до перезагрузки
  • echo 'vm.swappiness = 10' \
  • | sudo tee /etc/sysctl.d/90-swappiness.conf постоянно
  • sudo sysctl --system применить все файлы
  • sudo sysctl -p /etc/sysctl.d/90-swappiness.conf один файл
  • sysctl -a 2>/dev/null | grep forward найти параметр

Обзор

Параметры ядра — числа и строки, которые меняют его поведение на ходу: склонность к swap, пересылку пакетов, лимиты файлов. sysctl читает и меняет их без перезагрузки. Изменение через sysctl -w живёт до перезагрузки; постоянное значение записывают в файл в /etc/sysctl.d/.

Имена и /proc/sys

Каждый параметр — файл в /proc/sys (см. proc-filesystem). Имя параметра — путь к файлу, где косые черты заменены точками: vm.swappiness — это /proc/sys/vm/swappiness.

text
student@ubuntu:~$ sysctl vm.swappiness
vm.swappiness = 60
student@ubuntu:~$ cat /proc/sys/vm/swappiness
60

Первая часть имени — подсистема: vm — память, net — сеть, fs — файлы, kernel — само ядро. Ученику sysctl -a показывает около 900 параметров; часть он прочитать не может и получает permission denied on key в поток ошибок.

Изменить сейчас

text
student@ubuntu:~$ sudo sysctl net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
student@ubuntu:~$ cat /proc/sys/net/ipv4/ip_forward
1

Ключ -w (sudo sysctl -w net.ipv4.ip_forward=1) делает то же, его можно не писать. Пробелов вокруг = в командной строке быть не должно (см. неполадки). Значение живёт до перезагрузки.

Постоянно: /etc/sysctl.d

При загрузке значения берутся из файлов *.conf в трёх каталогах:

Каталог Чьи файлы
/etc/sysctl.d/ администратора — сюда кладёшь свои
/run/sysctl.d/ временные, до перезагрузки (на машине тренажёра его нет)
/usr/lib/sysctl.d/ пакетов: 10-apparmor.conf, 50-pid-max.conf

Файлы из всех каталогов сортируются по имени и применяются по порядку: параметр из файла, который идёт позже, перекрывает ранний. Поэтому имя начинают с числа — 90-swappiness.conf применится после 10-… и 50-…. Файл в /etc с тем же именем, что в /usr/lib, заменяет его целиком. Последним применяется /etc/sysctl.conf; в /etc/sysctl.d/ на него указывает ссылка 99-sysctl.conf.

Строка файла — имя = значение, пробелы вокруг = здесь разрешены:

bash
echo 'vm.swappiness = 10' | sudo tee /etc/sysctl.d/90-swappiness.conf
sudo sysctl --system
text
* Applying /usr/lib/sysctl.d/10-apparmor.conf ...
…
* Applying /etc/sysctl.d/90-swappiness.conf ...
…
vm.swappiness = 10

sysctl --system применяет все файлы так же, как при загрузке, и печатает каждый файл и каждое значение. Читаются только файлы *.conf: файл 99-z.txt или 99-sysctl.conf.bak в том же каталоге пропускается без сообщений.

Ключи

5

Частые параметры:

Параметр Зачем
vm.swappiness склонность к swap (60 по умолчанию)
net.ipv4.ip_forward пересылка пакетов: маршрутизатор, NAT, контейнеры
fs.nr_open потолок лимита открытых файлов на процесс
fs.file-max открытых файлов на всю систему
fs.inotify.max_user_watches наблюдатели inotify (редакторы, tail -f)
kernel.pid_max наибольший PID (4194304 в Ubuntu)
kernel.dmesg_restrict 1 — dmesg только для root
kernel.hung_task_timeout_secs через сколько секунд в D ядро пишет о зависшей задаче
net.core.somaxconn очередь соединений к слушающему сокету

Ключи самой команды — в таблице ниже.

Ключ Что делает Пример
-w param=value Изменить параметр сейчас; действует до перезагрузки. sudo sysctl -w net.ipv4.ip_forward=1
-a Показать все параметры ядра — на машине тренажёра их около 900, обычно с фильтром grep. sysctl -a 2>/dev/null | grep forward
--system Применить все файлы sysctl.d и sysctl.conf в правильном порядке. sudo sysctl --system
-p FILE Применить параметры из конкретного файла (по умолчанию /etc/sysctl.conf). sudo sysctl -p /etc/sysctl.d/99-forward.conf
-n Вывести только значение, без имени параметра — удобно в скриптах. sysctl -n vm.swappiness

Ничего не найдено. Попробуй запрос короче.

Рецепты

4

Найти параметр

bash
sysctl -a 2>/dev/null | grep swappiness
sudo sysctl -a | grep -i forward

2>/dev/null прячет строки permission denied on key; с sudo видны все параметры.

Проверить, что значение переживёт перезагрузку

bash
grep -r swappiness /etc/sysctl.d/ /etc/sysctl.conf /usr/lib/sysctl.d/
sudo sysctl --system | grep -E 'Applying|swappiness'

Если sysctl --system вернул нужное значение, при загрузке будет то же: служба systemd-sysctl читает те же файлы в том же порядке.

Кто задал значение

sysctl --system сначала печатает все строки * Applying … по порядку, потом — все значения. Какой файл последним задал параметр, нагляднее показывает systemd-analyze: файлы в порядке применения, перед каждым — строка # /путь:

bash
systemd-analyze cat-config sysctl.d | grep -B3 'swappiness'
text
kernel.pid_max = 4194304

# /etc/sysctl.d/95-test.conf
vm.swappiness = 33

Значение из файла, который в этом списке ниже, перекрывает верхние.

Вернуть значение по умолчанию

Удали свой файл из /etc/sysctl.d/ и задай значение руками (sudo sysctl -w vm.swappiness=60) или перезагрузи машину — sysctl --system старых значений не возвращает, он только применяет файлы.

Неполадки

6

Поменял, а после перезагрузки сбросилось

sysctl -w и запись в /proc/sys живут до перезагрузки. Нужен файл *.conf в /etc/sysctl.d/ (раздел «Постоянно» выше).

permission denied on key, а значение напечатано

text
student@ubuntu:~$ sysctl -w vm.swappiness=20; echo rc=$?
vm.swappiness = 20
sysctl: permission denied on key "vm.swappiness", ignoring
rc=0
student@ubuntu:~$ sysctl vm.swappiness
vm.swappiness = 60

Без sudo sysctl печатает строку с новым значением и код 0, но значение не меняет. Ошибка — в потоке ошибок. Повтори с sudo и проверь чтением.

Файл в sysctl.d не применяется

  • Имя кончается не на .conf — файл пропущен молча.
  • Другой файл с именем позже по алфавиту ставит своё значение — найди его: grep -r <параметр> /etc/sysctl.d/ /usr/lib/sysctl.d/ /etc/sysctl.conf.
  • Опечатка в имени параметра: sysctl --system пропускает её без сообщения и с кодом 0. sudo sysctl -p <файл> покажет cannot stat /proc/sys/…: No such file or directory и вернёт 1.

cannot stat /proc/sys/…: No such file or directory

bash
sudo sysctl -w net.ipv4.no_such=1   # код 1

Ответ — sysctl: cannot stat /proc/sys/net/ipv4/no_such: No such file or directory.

Такого параметра нет: опечатка или параметр появляется только с модулем ядра (например, net.netfilter.* — после загрузки nf_conntrack, см. kernel-modules).

invalid syntax, continuing

text
student@ubuntu:~$ sudo sysctl -w net.ipv4.ip_forward = 1
sysctl: command line(0): invalid syntax, continuing...

В командной строке имя=значение пишется без пробелов. В файлах sysctl.d пробелы вокруг = разрешены.

Форвардинг включил, а пакеты не идут

Кроме net.ipv4.ip_forward = 1 нужны маршруты (ip) и разрешающие правила файрвола, для NAT — правило маскарадинга.

Опасно

1

sysctl --system --dry-run пишет в ядро

--dry-run должен только показать, что будет применено. В procps 4.0.4 важен порядок ключей: sudo sysctl --dry-run --system значения не меняет, а sudo sysctl --system --dry-run применяет файлы по-настоящему. Проверено на машине тренажёра: после второй команды vm.swappiness сменился с 60 на 33. Для пробы файла — sudo sysctl --dry-run -p <файл>.

См. также

  • proc-filesystem — /proc/sys и остальной /proc.
  • memory-swap — vm.swappiness и swap.
  • ulimit — fs.nr_open и лимиты процесса.
  • kernel-modules — параметры, которые появляются с модулем.
  • firewall — фильтрация и NAT.
  • kernel — ядро и параметры загрузки.
Загрузка…