Как изменить sysctl

Состояние перевода: На этой странице представлен перевод статьи sysctl. Дата последней синхронизации: 22 апреля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Состояние перевода: На этой странице представлен перевод статьи sysctl. Дата последней синхронизации: 22 апреля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

sysctl — утилита, предназначенная для управления параметрами ядра на лету (пакет procps-ng из официальных репозиториев). sysctl реализован как часть procfs — виртуальной файловой системы, которую обычно монтируют в /proc/.

Настройка

Примечание: Начиная с версии 207 и 21x, systemd применяет только настройки из /etc/sysctl.d/*.conf и /usr/lib/sysctl.d/*.conf. Если у вас был файл /etc/sysctl.conf, нужно переименовать его в /etc/sysctl.d/99-sysctl.conf. Если у вас был, например, /etc/sysctl.d/foo, нужно переименовать его в /etc/sysctl.d/foo.conf.

Файл настроек sysctl может быть создан в /etc/sysctl.d/99-sysctl.conf. Для systemd, /etc/sysctl.d/ и /usr/lib/sysctl.d/ являются drop-in каталогами для sysctl-параметров ядра. Именование и исходный каталог определяют порядок обработки; параметры, обрабатываемые позже, могут отменить предыдущие параметры. Например, параметры из файла /usr/lib/sysctl.d/50-default.conf будут переопределены параметрами с теми же именами из /etc/sysctl.d/50-default.conf и любом файле, обработанном позже из обоих каталогов.

Чтобы вручную загрузить параметры из всех файлов, выполните команду:

# sysctl --system

которая также выведет применённую иерархию. Можно указать параметр для явной загрузки только одного файла:

# sysctl --load=файл.conf

Дополнительная информация доступна в sysctl.d(5) и the new configuration files.

Доступные для изменения параметры представлены в каталоге /proc/sys/. Например, параметр kernel.sysrq соответствует файлу /proc/sys/kernel/sysrq в файловой системе. Команда sysctl --all отобразит значения всех доступных параметров.

Примечание: Если у вас установлена документация ядра (linux-docs), вы можете найти подробную информацию о настройках sysctl в /usr/lib/modules/$(uname -r)/build/Documentation/admin-guide/sysctl/. Ссылка на онлайн-версию содержится в разделе #Смотрите также этой статьи. Настоятельно рекомендуется прочитать её перед изменением настроек sysctl.

Настройки можно изменить путём редактирования файлов напрямую или вызова утилиты sysctl. Например, чтобы временно включить magic SysRq key:

# sysctl kernel.sysrq=1

илт:

# echo "1" > /proc/sys/kernel/sysrq

Подробности о kernel.sysrq доступны в документации ядра.

Чтобы сделать изменения постоянными, добавьте или измените соответствующие строки в /etc/sysctl.d/99-sysctl.conf или другом подходящем файле в каталоге /etc/sysctl.d/.

Совет: Некоторые параметры зависят от модулей ядра. Например, параметры в /proc/sys/net/bridge/* зависят от модуля br_netfilter. Если он не загружен, изменения этих параметров будут проигнорированы. Смотрите статью Модули ядра.

Безопасность

Смотрите Безопасность#Ядро, а также следующие разделы в данной статье.

Сеть

Увеличение производительности

Увеличение длины очереди входящих пакетов

После получения пакетов из кольцевого буфера сетевой карты они помещаются в специальную очередь в ядре.

При использовании высокоскоростных сетевых карт увеличение размера очереди может помочь предотвратить потерю пакетов:

net.core.netdev_max_backlog = 16384

Примечание: В приложениях реального времени, таких как SIP-маршрутизаторы, этот вариант требует высокой скорости процессора, иначе данные в очереди будут устаревшими.

Увеличение максимального числа ожидающих соединений

Максимальное число входящих соединений, ожидающих приёма (accept) программой, на одном сокете:

net.core.somaxconn = 8192

Примечание: Начиная с Linux 5.4, по умолчанию используется значение 4096.[1]

Важно: Увеличение этого значения имеет смысл только на высоконагруженных серверах и может привести как к низкой скорости обработки (например, в случае однопоточного блокирующего сервера), так и к недостаточному количеству рабочих потоков/процессов [2].

Включение TCP Fast Open

TCP Fast Open — это расширение протокола управления передачей (TCP), которое помогает уменьшить задержки в сети, позволяя начать передачу данных сразу при отправке клиентом первого TCP SYN [3]. Значение 3 вместо стандартного 1 включит TCP Fast Open как для входящих, так и для исходящих соединений:

net.ipv4.tcp_fastopen = 3

Настройка обработки ожидающих соединений

tcp_max_syn_backlog задаёт максимальную длину очереди соединений в состоянии ‘Waiting Acknowledgment’.

В случае DoS-атаки synflood эта очередь может быстро заполниться, и в этот момент сработает TCP SYN cookies, позволяя вашей системе продолжать отвечать на легитимный трафик и позволяя вам получить доступ к блокировке вредоносных IP.

Если сервер страдает от перегрузок в пиковое время, можно попробовать немного увеличить это значение:

net.ipv4.tcp_max_syn_backlog = 8192

tcp_max_tw_buckets — максимальное число сокетов в состоянии TIME_WAIT.

После достижения этого числа система начнёт уничтожать сокеты, находящиеся в этом состоянии.

Увеличение этого значения может помочь от простых DoS-атак:

net.ipv4.tcp_max_tw_buckets = 2000000

tcp_tw_reuse задаёт, должен ли TCP повторно использовать существующее соединение в состоянии TIME-WAIT для нового исходящего соединения, если новая временная метка строго больше самой последней временной метки, записанной для предыдущего соединения.

Это помогает избежать исчерпания доступных сетевых сокетов:

net.ipv4.tcp_tw_reuse = 1

Указывает, сколько секунд нужно ждать последнего FIN-пакета, прежде чем сокет будет принудительно закрыт. Это является нарушением спецификации TCP, но необходимо для предотвращения DoS-атак. В Linux 2.2 значение по умолчанию было 180 [4]:

net.ipv4.tcp_fin_timeout = 10

tcp_slow_start_after_idle, будучи включенным, сбрасывает размер окна по умолчанию в долгоживущих TCP-соединениях, которые длительное время не использовались.

Отключение этой опции приведёт к тому, что размер окна по умолчанию будет применяться только для новых соединений, что может улучшить производительность долгоживущих соединений:

net.ipv4.tcp_slow_start_after_idle = 0

Изменение параметров TCP keepalive

TCP keepalive — механизм TCP-соединений, который помогает определить потерю связи с другой стороной. TCP посылает запрос keepalive, содержащий нулевые данные, несколько раз после неактивности. Если другая сторона не отвечает, сокет автоматически закрывается. По умолчанию процесс TCP keepalive ожидает активности сокета в течение двух часов (7200 секунд) перед отправкой первого запроса keepalive, а затем повторно отправляет его каждые 75 секунд. Пока связь между сокетами TCP/IP продолжается и активна, пакеты keepalive не нужны.

Примечание: При следующих настройках ваше приложение будет обнаруживать мёртвые TCP-соединения через 120 секунд (60с + 10с + 10с + 10с + 10с + 10с + 10с).

net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 6

Включение MTU probing

Чем больше maximum transmission unit (MTU), тем выше производительность, но хуже надёжность.

Это связано с тем, что потерянный пакет означает необходимость повторной передачи большего количества данных, а также с тем, что многие маршрутизаторы в интернете не могут передавать очень длинные пакеты:

net.ipv4.tcp_mtu_probing = 1

Смотрите https://blog.cloudflare.com/path-mtu-discovery-in-practice/ для более подробной информации.

TCP timestamps

Важно: TCP timestamps защищают от переполнения порядковых номеров (на гигабитных скоростях) и позволяют вычислять время передачи пакетов. Отключать их не рекомендуется, так как это считается риском для безопасности [5].

Отключение генерации временных меток в TCP-пакетах уменьшит пики и может дать прирост производительности в гигабитных сетях:

net.ipv4.tcp_timestamps = 0

Включение BBR

Алгоритм управления перегрузками BBR может помочь достичь более высокой пропускной способности и более низких задержек для интернет-трафика. Сначала загрузите модуль tcp_bbr.

Примечание: Страница BBR на GitHub сообщает, что он не является официальным продуктом Google.

net.core.default_qdisc = cake
net.ipv4.tcp_congestion_control = bbr

Увеличение диапазона динамических портов

Динамические (эфемерные) порты обычно используются в протоколах TCP, UDP и SCTP. Когда клиентское приложение не запрашивает привязку сокета к какому-то конкретному порту, система выдаёт ему произвольный порт из определённого диапазона. В некоторых специфических ситуациях размер этого диапазона может влиять на производительность установки соединения.

net.ipv4.ip_local_port_range = 30000 65535

Защита стека TCP/IP

Ниже приведён набор параметров для усиления сетевой безопасности ядра для протокола IPv4 и соответствующие параметры IPv6, если существует эквивалент.

Для некоторых сценариев использования, например, при использовании системы в качестве маршрутизатора, могут быть полезны или необходимы и другие параметры.

Защита TCP SYN cookie

Помогает защититься от атак SYN flood. Срабатывает только при достижении значения net.ipv4.tcp_max_syn_backlog. Более подробную информацию можно найти, например, в [6]. Начиная с linux 5.10, это включено по умолчанию.

net.ipv4.tcp_syncookies = 1

TCP rfc1337

Защита от tcp time-wait assassination hazards, отбрасывание RST-пакетов для сокетов в состоянии time-wait. За пределами Linux поддерживается не очень широко, но соответствует RFC:

net.ipv4.tcp_rfc1337 = 1

Reverse path filtering

При включении reverse path filtering ядро будет проверять источник пакетов, полученных со всех интерфейсов машины. Это может защитить от злоумышленников, которые используют методы подмены IP-адресов для нанесения вреда.

По умолчанию стоит значение 0 (без проверки), но systemd поставляет /usr/lib/sysctl.d/50-default.conf, который устанавливает net.ipv4.conf.all.rp_filter в значение 2 (loose mode)[7].

Включение строгого режима:

net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1

Взаимосвязь и поведение net.ipv4.conf.default.*, net.ipv4.conf.interface.* и net.ipv4.conf.all.* описаны в ip-sysctl.html.

Журналирование марсианских пакетов

Марсианский пакет (martian packet) — это IP-пакет, который содержит адрес источника или получателя, зарезервированный IANA для специального использования (смотрите Reserved IP addresses).

Часто марсианские и немаршрутизируемые пакеты могут быть использованы в опасных целях. Запись этих пакетов в журнал для последующей проверки может быть полезной [8]:

net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.all.log_martians = 1

Примечание: Это может заполнить ваши журналы большим количеством информации, поэтому рекомендуется включать эту функцию только для тестирования.

Отключение перенаправлений ICMP

ICMP-пакеты типа 5 (Redirect) помогают оптимизировать маршрутизацию, однако из-за того, что они могут быть легко подделаны злоумышленником, они считаются проблемой безопасности и их лучше отключить. Подробнее об этом можно почитать здесь: What are ICMP redirects? Should they be blocked?

Отключение приёма перенаправлений ICMP:

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

Отключение отправки перенаправлений ICMP на устройствах, не являющихся маршрутизаторами:

net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

Игнорирование эхо-запросов ICMP

Чтобы система не отвечала на пинги:

net.ipv4.icmp_echo_ignore_all = 1
net.ipv6.icmp.echo_ignore_all = 1

Примечание: Имейте в виду, что это может нарушить работу инструментов мониторинга, которые полагаются на эхо-запросы ICMP.

Виртуальная память

Есть несколько ключевых параметров для настройки работы подсистемы виртуальной памяти ядра Linux и записи изменённых (dirty) данных на диск. Подробности в документации ядра Например:

  • vm.dirty_ratio = 10
Указывает (в процентах от общего объёма доступной памяти, содержащей свободные и восстанавливаемые (reclaimable) страницы) количество страниц, при достижении которого выполняющий запись процесс сам начнёт записывать изменённые данные из памяти на диск.
  • vm.dirty_background_ratio = 5
Указывает (в процентах от общего объёма доступной памяти, содержащей свободные и восстанавливаемые (reclaimable) страницы) количество страниц, при достижении которого фоновые потоки для записи данных в ядре начнут записывать изменённые данные из памяти на диск.

Как отмечено в комментариях к параметрам, при установке этих значений необходимо учитывать общий объём оперативной памяти. Например, упрощая, можно взять установленную системную оперативную память вместо доступной памяти:

  • Согласно общепринятому мнению, установка vm.dirty_ratio на 10% от ОЗУ является разумным значением, если ОЗУ составляет, скажем, 1 ГБ (поэтому 10% — это 100 МБ). Но если машина имеет гораздо больше ОЗУ, скажем, 16 ГБ (10% — это 1.6 ГБ), этот процент оказывается непропропорционально большим, поскольку он превратится в несколько секунд записи на вращающиеся диски. Более разумным значением в этом случае может быть 3 (3% от 16 ГБ — это примерно 491 МБ).
  • Аналогично, установка vm.dirty_background_ratio на значение 5 может быть подходящим вариантом для небольших объёмов памяти, но опять же, учитывайте и настраивайте в соответствии с объёмом памяти конкретной системы.

Кэш VFS

Уменьшение значения параметра кэша virtual file system (VFS) может улучшить отзывчивость системы:

  • vm.vfs_cache_pressure = 50
Он контролирует память, которая используется ядром для кэширования объектов каталогов и inode (кэш VFS). Уменьшение этого значения по сравнению со значением по умолчанию 100 делает ядро менее склонным к использованию кэша VFS (не устанавливайте его в 0, это может привести к состоянию out-of-memory).

MDADM

Смотрите RAID#Change sync speed limits.

Решение проблем

Периодические маленькие подвисания системы

Попробуйте поставить максимальный объём изменённых в памяти данных (dirty bytes) поменьше (в данном примере 4 МиБ):

vm.dirty_background_bytes = 4194304
vm.dirty_bytes = 4194304

Примечание: Параметры dirty_background_bytes и dirty_bytes являются аналогами параметров dirty_background_ratio и dirty_ratio (описанных в разделе #Виртуальная память). Одновременно может быть указан только один из наборов параметров: или bytes, или ratio.

Смотрите также

  • sysctl(8) и sysctl.conf(5)
  • Документация ядра: /proc/sys/
  • Документация ядра: IP Sysctl
  • Kernel network parameters for sysctl
  • sysctl-explorer.net – инициатива по облегчению доступа к справочной документации по sysctl в Linux
  • Disable Source Routing — Red Hat Customer Portal
  • SUSE handbook about Security Features in the Kernel

You can configure several parameters or tunables of Linux (the kernel) to control its behavior, either at boot or on demand while the system is running. sysctl is a widely-used command-line utility for modifying or configuring kernel parameters at runtime. You can find the kernel tunables listed under the /proc/sys/ directory.

It is powered by procfs (proc file system), a pseudo file system in Linux and other Unix-like operating systems that provides an interface to kernel data structures. It presents information about processes and additional system information.

The following are 10 useful sysctl commands examples that you can use when administering a running Linux system. Note that you need root privileges to run the sysctl command, otherwise, use the sudo command when invoking it.

Table of Contents

1

sysctl Command Examples in Linux

In this guide, we will explain 10 sysctl practical command examples you can use on a Linux system.

1. List All Kernel Parameters in Linux

To list all currently available kernel parameters, run the sysctl command with the -a or --all flag as shown.

$ sudo sysctl -a
OR
$ sudo sysctl --all

The variables are displayed in this format:

<tunable class>.<tunable> = <value>

For example,

kernel.ostype = Linux

Check Kernel Parameters in Linux

Check Kernel Parameters in Linux

3. List All Kernel Variable Names

To only print variable names without their values, use the -N option as shown.

$ sudo sysctl -a -N

Check Kernel Variable Names in Linux

Check Kernel Variable Names in Linux

3. Find Specific Kernel Variables in Linux

To find a specific variable, you can filter the output of sysctl via the grep command, for example, to filter out any variable associated with memory management, you can run the following command:

$ sudo sysctl -a | grep memory
OR
$ sudo sysctl --all | grep memory

Check Kernel Memory Variable in Linux

Check Kernel Memory Variable in Linux

4. List All Kernel Variables Including Deprecated

sysctl command also shows deprecated variables along with the list of all available variables using the --deprecated flag as shown.

$ sudo sysctl -a --deprecated
OR
$ sudo sysctl -a --deprecated | grep memory

5. List Specific Kernel Variable Value

To read a sysctl variable and its values, specify the variable name as an argument for the sysctl commands as follows. This example shows how to read the kernel.ostype variable.

$ sudo sysctl kernel.ostype

kernel.ostype = Linux

6. Write Kernel Variable Temporarily

To write variables temporarily, simply specify the variable in this format.

<tunable class>.<tunable>=<value>

The following example shows how to increase the maximum size of the receive queue, which stores frames picked from the ring buffer of the NIC (Network Interface Card), once they are received from the network. The queue size can be modified using the net.core.netdev_max_backlog variable as shown.

$ sudo sysctl net.core.netdev_max_backlog
$ sudo sysctl net.core.netdev_max_backlog=1200
$ sudo sysctl net.core.netdev_max_backlog

Set Kernel Variable Temporarily

Set Kernel Variable Temporarily

7. Write Kernel Variable Permanently

sysctl can also write variables permanently in a configuration file. To achieve this, use the -w option, and specify the configuration file the variable and its value will be appended to, in this case, it is /etc/sysctl.conf, the default sysctl configuration file:

$ sudo sysctl -w net.core.netdev_max_backlog=1200 >> /etc/sysctl.conf

To write files permanently in a custom, specify the location of the file as follows. Sometimes, you can fail to create a file in particular locations even when you invoke the sysctl command using the sudo command.

In such a case, switch to the root account (if you have the privileges) and run the command again as shown.

$ sudo sysctl -w net.core.netdev_max_backlog=1200 >> /etc/sysctl.d/10-test-settings.conf
$ sudo su
# sysctl -w net.core.netdev_max_backlog=1200 >> /etc/sysctl.d/10-test-settings.conf

Set Kernel Variable Permanently

Set Kernel Variable Permanently

Alternatively, you can create the new configuration file in /etc/sysctl.d/ directory as shown:

$ sudo vim /etc/sysctl.d/10-test-settings.conf

Then add the kernel parameters, in it one per line as shown.

net.core.netdev_max_backlog = 1200
user.max_net_namespaces = 63067
vm.overcommit_memory = 0

Then save the file and close it. To load settings from the custom file you have just created, use the -p or --load flag.

$ sudo sysctl -p /etc/sysctl.d/10-test-settings.conf
OR
$ sudo sysctl --load= /etc/sysctl.d/10-test-settings.conf

8. Reload sysctl.conf Variables in Linux

To reload settings from all system configuration files without rebooting, issue the following command.

$ sudo sysctl  --system

The above command will read all system configuration files from these directories, in this order:

/run/sysctl.d/*.conf
/etc/sysctl.d/*.conf
/usr/local/lib/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
/lib/sysctl.d/*.conf
/etc/sysctl.conf

9. Reload Settings from Custom Configuration Files

You can also reload variable settings from a custom sysctl configuration file as shown.

$ sudo sysctl -p/etc/sysctl.d/10-test-settings.conf
OR
$ sudo sysctl --load= /etc/sysctl.d/10-test-settings.conf

10. Reload Settings that Match Pattern

To only apply settings that match a certain pattern, use the -r or --pattern as follows. Note that the pattern uses extended regular expression syntax, here are some examples:

$ sudo sysctl --system --pattern '^net.ipv6'
$ sudo sysctl --system -r memory

Reload Settings that Match Pattern

Reload Settings that Match Pattern

In this guide, we have explained 10 sysctl command examples you can use to manage a running Linux system. For more information, read the sysctl man page (man sysctl).

If You Appreciate What We Do Here On TecMint, You Should Consider:

TecMint is the fastest growing and most trusted community site for any kind of Linux Articles, Guides and Books on the web. Millions of people visit TecMint! to search or browse the thousands of published articles available FREELY to all.

If you like what you are reading, please consider buying us a coffee ( or 2 ) as a token of appreciation.

Support Us

We are thankful for your never ending support.

Как системный администратор Linux, иногда вам может потребоваться изменить поведение ядра по умолчанию. Например, вам может потребоваться включить волшебный ключ SysRq или увеличить количество подключений, которые будет принимать ядро. Параметры ядра можно установить при сборке ядра, при загрузке системы или во время выполнения.

В этой статье объясняется, как использовать команду sysctl для просмотра и изменения параметров ядра во время выполнения.

Использование sysctl для просмотра параметров ядра

Чтобы просмотреть все текущие параметры ядра, вызовите команду sysctl с параметром -a :

sysctl -a

В результате будет выведен большой список, который выглядит примерно так, где каждая строка включает имя параметра и его значение:

abi.vsyscall32 = 1
debug.exception-trace = 1
debug.kprobes-optimization = 1
...

Все пользователи могут просматривать текущие параметры ядра; только пользователь root может изменять их значения.

Вы можете проверить значение одного параметра, передав его имя в качестве аргумента в sysctl . Например, чтобы проверить текущее значение подкачки, введите:

sysctl vm.swappiness
vm.swappiness = 60

Swappiness — это свойство ядра Linux, которое определяет, как часто система будет использовать пространство подкачки .

Команда sysctl считывает информацию из каталога /proc/sys . /proc/sys — это виртуальный каталог, содержащий файловые объекты, которые можно использовать для просмотра и установки текущих параметров ядра.

Вы также можете просмотреть значение параметра, отобразив содержимое соответствующего файла. Единственная разница в том, как представлен файл. Например, как sysctl vm.swappiness и cat /proc/sys/vm/swappiness дадут одинаковый результат. При использовании sysctl косые черты каталога заменяются точками, и proc.sys часть proc.sys .

Использование sysctl для изменения параметров ядра

Чтобы установить параметр ядра во время выполнения, выполните команду sysctl за которой следует имя и значение параметра в следующем формате:

sysctl -w parameter=value

Если значение содержит пустое пространство или специальные символы, заключите значение в двойные кавычки. Вы также можете передать несколько пар parameter=value в одной команде.

Будьте особенно осторожны при изменении настроек ядра в производственной системе, так как это может сделать ядро нестабильным, и вам потребуется перезагрузить систему .

Например, чтобы включить пересылку пакетов IPv4, вы должны запустить:

sysctl -w net.ipv4.ip_forward=1

Изменение вступает в силу немедленно, но не является постоянным. После перезагрузки системы загружается значение по умолчанию.

Чтобы установить параметр постоянно, вам необходимо записать настройки в /etc/sysctl.conf или другой файл конфигурации в каталоге /etc/sysctl.d :

sysctl -w net.ipv4.ip_forward=1 >> /etc/sysctl.conf

Другой способ изменить параметры — использовать команду echo для записи настроек в файлы в каталоге /proc/sys . Например, вместо выполнения приведенной выше команды вы можете использовать:

echo 1 > /proc/sys/net/ipv4/ip_forward

Параметр -p позволяет загружать настройки из файла конфигурации:

sysctl -p /etc/sysctl.d/file_name.conf

Если файл не указан, sysctl читает /etc/sysctl.conf .

Выводы

Команда sysctl позволяет просматривать и изменять параметры ядра Linux.

Не стесняйтесь оставлять комментарии, если у вас есть вопросы.

Ядро Linux — очень гибкая вещь, позволяющая настроить очень много параметров. Такие параметры, как поддерживаемые устройства и функции настраиваются при сборке ядра. Но сегодня не будет рассматриваться компиляция ядра Linux. Мы поговорим о более тонкой настройке параметров ядра на лету, прямо во время его работы.

Да, мы не можем включать добавлять неподдерживаемые модули и драйвера устройств, но мы можем настроить такие параметры ядра Linux, как особенности работы процессора, памяти, виртуального пространства памяти, планировщика ядра, сетевой стек и многое другое. Все эти настройки доступны через файловую систему proc. Мы рассматривали подробно ее в предыдущей статье, теперь же остановимся только на директории /proc/sys, с помощью которой мы и будем настраивать ядро.

Как выполняется настройка?

Здесь все предельно просто. В этом каталоге и его подкаталогах лежат файлы, это и есть параметры, а значения в файлах нам и нужно изменять. Для этого можно использовать самую простую конструкцию из команды echo и оператора перенаправления вывода:

echo "1" > /proc/sys/net/ipv4/ip_forward

Значение 1 будет записано в файл ipv4_forward. Но измененные таким способом параметры не сохраняются после перезагрузки. Перед тем как рассматривать как сохранить параметры ядра linux из proc рассмотрим еще один способ их модификации.

Для работы с параметрами ядра есть утилита sysctl. Она представляет все параметры в виде переменных. Имена этих переменных соответствуют адресу файла в папке /proc/sys только слеш заменен точкой. Например:

net.ipv4.ip_forward

Вы можете установить значение параметра такой командой:

sysctl net.ipv4.ip_forward=1

Но это изменение тоже не сохранится, чтобы сохранить настройку после перезагрузки нужно добавить опцию -w:

sysctl -w net.ipv4.ip_forward=1

Вы можете также сразу посмотреть все доступные переменные с помощью опции -a:

sysctl -a

abi.vsyscall32 = 1
debug.exception-trace = 1
dev.cdrom.autoclose = 0
dev.cdrom.autoeject = 0
dev.cdrom.check_media = 0
dev.cdrom.debug = 0
...
vm.stat_interval = 1
vm.swappiness = 60
vm.user_reserve_kbytes = 131072
vm.vfs_cache_pressure = 100
vm.zone_reclaim_mode = 0

Все эти переменные сохраняются в обычные конфигурационные файлы для сохранения между перезагрузками. Переменные, в зависимости от назначения распределяются между этими файлами:

  • /run/sysctl.d/*.conf
  • /etc/sysctl.d/*.conf
  • /usr/local/lib/sysctl.d/*.conf
  • /usr/lib/sysctl.d/*.conf
  • /lib/sysctl.d/*.conf
  • /etc/sysctl.conf

Вы также можете вручную добавлять переменные и их значения в эти файлы. Если вы хотите вернуть значения переменных до состояния сохраненного в файлах и удалить свои изменения выполните:

sysctl --system

* Applying /boot/sysctl.conf-4.1.21-14-default ...
kernel.hung_task_timeout_secs = 0
kernel.msgmax = 65536
kernel.msgmnb = 65536
kernel.shmmax = 0xffffffffffffffff
kernel.shmall = 0x0fffffffffffff00
vm.dirty_ratio = 20

Теперь вы знаете как работать с переменными, дальше мы рассмотрим значение некоторых, самых важных переменных, с помощью которых может быть выполнена настройка ядра linux.

abi.vsyscall32

Если установлено 1, разрешает выполнение 32 битных программ в 64 битной системе. По умолчанию включено, можете отключить, а затем попробовать запустить, например, skype.

debug.exception-trace

При возникновении ошибки в ядре выводить значения регистров процессора и стек вызовов процедур. По умолчанию включено.

dev.cdrom.autoclose

Ваш CDROM будет автоматически закрыт при попытке его монтирования, по умолчанию отключено.

dev.cdrom.autoeject

CDROM будет открыт после размонтирования содержащегося там диска с помощью команды umount.

dev.hpet.max-user-freq

Максимальная частота генерации прерываний от системного таймера High Precision Event Timer (HPET), который пришел на замену таймеру реального времени RTC. По умолчанию 64.

fs.aio-nr

Количество асинхронных операций ввода и вывода в вашей файловой системе.

fs.file-max

Максимальное количество дескрипторов файлов, которые может создать и обрабатывать ядро. Если вы часто получаете сообщения об ошибке из-за невозможности создать дескриптор файла увеличьте этот лимит. По умолчанию установлено значение 10 % от вашей оперативной памяти.

fs.inotify.max_queued_events

Подсистема ядра inotify позволяет следить за изменениями в файловой системе. Этот параметр устанавливает максимальное количество событий, которые могут находиться в очереди, перед тем как их обработает программа.

fs.inotify.max_user_instances

Максимальное количество объектов inotify, которые может создать один пользователь.

fs.inotify.max_user_watches

Максимальное количество файлов и директорий, за которыми может наблюдать один объект inotify.

cad_pid

PID процесса, который получит сигнал, если будет нажато сочетание клавиш Ctrl+Alt+Del

kernel.ctrl-alt-del

Если значение параметра 0, система отправляет сигнал процессу Init или тому, который вы назначили в предыдущей переменной, чтобы выполнить правильную перезагрузку. Если значение больше нуля, будет выполнена немедленная перезагрузка.

kernel.domainname

Позволяет установить доменное имя NIS (Network Internet Services) и YP (Yellow Pages). Но не путайте это доменное имя с DNS, это совсем разные вещи.

kernel.hostname

Имя вашего компьютера. Это самый простой способ изменить имя компьютера прямо сейчас, без перезагрузки.

kernel.modules_disabled

Позволяет отключить загрузку модулей ядра.

kernel.panic

Указывает количество секунд после ошибки в ядре (kernel panic) до перезагрузки.

kernel.pid_max

Максимальное значение PID процесса. Когда PID достигает этого значения, ядро переходит опять к минимальному. Значения больше этого не выделяются.

kernel.random.boot_id

Этот файл доступен только для чтения и содержит уникальный, случайный идентификатор загрузки. Генерируется для каждой загрузки.

kernel.random.uuid

При каждом запросе генерирует случайный UUID. Тоже доступен только для чтения.

kernel.randomize_va_space

Рандомизация адресного пространства это функция увеличивающая безопасность вашей системы. Она защищает от атак на переполнение буфера. По умолчанию включена.

kernel.sysrq

Позволяет включить или отключить управление ядром с помощью SysRQ. Доступны такие параметры:

  • 0 — отключить все функции
  • 1 — разрешить все функции
  • 2 — разрешить настройку уровня логгирования
  • 4 — разрешить управление клавиатурой
  • 8 — разрешить получение отладочных сообщений и дампов
  • 16 — разрешить команду sync
  • 32 — разрешить перемонтирование файловых систем в read-only
  • 64 — разрешить завершение процессов
  • 128 — разрешить перезагрузку, выключение
  • 256 — разрешить управление планировщиком

kernel.threads-max

Максимальное количество запущенных потоков для процессов.

net.ipv4.icmp_echo_ignore_all

Если включено, ядро будет игнорировать все icmp запросы. Рекомендуется для защиты от DDOS атак.

net.ipv4.icmp_echo_ignore_broadcasts

Так же, как и в предыдущем варианте, только игнорироваться будут только широковещательные icmp запросы.

net.ipv4.ip_default_ttl

Максимальное количество узлов, через которые может пройти отправленный пакет перед тем, как достигнет цели.

net.ipv4.ip_forward

Разрешить проходящие пакеты через этот компьютер. Обычно такая настройка параметров ядра Linux нужна для роутеров.

net.ipv4.ip_local_port_range

Диапазон локальных портов, которые могут быть использованы вашими программами.

net.ipv4.tcp_rfc1337

Установите 1 чтобы защитить компьютер от атаки TCP TimeWait.

net.ipv4.tcp_fin_timeout

Таймаут ожидания завершения соединения после отправки пакета FIN. Рекомендовано 15.

net.ipv4.tcp_keepalive_time

Поддерживать соединение активным определенное время, например, 300 секунд. По истечении этого времени TCP соединение будет разорвано.

net.core.rmem_default

Указывает размер по умолчанию буфера для сокета получения данных по сети.

net.core.rmem_max

Максимальный размер буфера сокета для получения данных по сети.

net.core.wmem_default

Размер сокета по умолчанию для отправки данных по сети.

net.core.wmem_max

Максимальный размер буфера сокета для отправки данных по сети.

net.ipv4.tcp_rmem

Количество памяти, доступной для работы TCP.

vm.dirty_background_ratio

Указывает процент от общей системной памяти, когда фоновый демон pdflush записи данных начнет переписывать кешированные данные на диск. По умолчанию установлено 10, но в быстрых системах такое частое сбрасывание не нужно, поэтому этот параметр можно увеличить.

vm.dirty_ratio

Похожий параметр. Только на этот раз он указывает сколько общей оперативной памяти должно быть занято, чтобы процесс, который ведет запись данных на диск инициировал запись кэшированных данных непосредственно на жесткий диск.

vm.laptop_mode

Функция laptop mode позволяет не сразу записывать данные на жесткий диск после запроса, а хранить их указанное время в оперативной памяти. Может быть полезно если вы экономите заряд батареи и не хотите, чтобы жесткий диск всегда вращался.

vm.swappiness

Устанавливает процент свободной памяти, по достижении которого данные начинают переноситься на swap раздел, для систем с большим количеством памяти рекомендовано значение 10.

Выводы

Мы рассмотрели далеко не все параметры ядра linux, здесь описаны лишь самые интересные из них. Более подробную информацию и еще больше переменных вы можете найти в официальной документации по ядру Linux. И будьте осторожны, конфигурация ядра Linux — дело серьезное. Если я упустил какой-то важный параметр, напишите в комментариях!

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

While most Linux Kernels nowadays come with nice sysctl defaults, there’s always room for improvement. Some parameters can be used for performance tuning, others can be critical for security hardening.

What is sysctl?

sysctl is an interface to view and dynamically change parameters in Linux and other *NIX operating systems. In Linux, most of the dynamic Kernel settings can be changed via sysctl. The parameters set by sysctl are also available under the virtual /proc filesystem.

How do I use sysctl?

To read values you’ve two options:

# Option 1: Using the sysctl command to read current parameters:
sysctl net.ipv4.ip_forward          # display specific parameter
sysctl net.ipv4                     # display all net.ipv4.* parameters
sysctl -a                           # display all parameters

# Option 2: Using the /proc filesystem:
cat /proc/sys/net/ipv4/ip_forward

To write values you can use both options again:

# Option 1: Using the sysctl command to change a parameter:
sysctl net.ipv4.ip_forward=1

# Option 2: Using the /proc filesystem to change a parameter:
echo 1 >/proc/sys/net/ipv4/ip_forward

However, these parameters are not persistent. You’ve to configure them in /etc/sysctl.conf or /etc/sysctl.d/* if you want them active after a reboot.

/etc/sysctl.conf
/etc/sysctl.d/

Please note that configuration changes will not be detected automatically. You’ve to trigger the reload manually:

sysctl -p [filename]

Kernel

To automatically reboot a system after a kernel panic, you can set the following parameter to the amount of seconds to wait before reboot:

kernel.panic = 60

Linux Kernels provide a magic SysRq key, which allows the user to perform low-level commands regardless of the systems state. To enable this magic key you’ve to set:

kernel.sysrq = 1

To make sure core dumps will always be written set the following parameter:

fs.suid_dumpable = 2

It can be useful to have the PID appended on the filename of core dumps. This can be especially useful for debugging multi-threaded applications and it’s easy to setup:

kernel.core_uses_pid = 1

To increase the maximum number of used process IDs you can define the following parameter:

kernel.pid_max = 65536

Memory

To tune the memory (VM) behaviour in Linux, you can set some vm.* parameters.

For example to tell the Kernel how aggressively memory pages should be written to disk (aka swapping), you’ve to change the swappiness value. The higher the value, the more aggressive the swapping:

vm.swappiness

When you look at filesystems then most of the time some kind of cache is involved. The amount of filesystem cache is based on the percentage of total available memory. To set the maximum amount of filesystem cache can be defined with:

vm.dirty_ratio = 40

When the defined percentage of memory is reached, then all I/O writes are blocked until enough dirty pages have been flushed to disk by pdflush. This is quite suboptimal because on a healthy system you don’t want to have blocked I/O writes at all. Therefor there’s another parameter, which defines the minimal percentage of dirty memory before the background pdflush process starts to flush out dirty memory pages:

vm.dirty_background_ratio = 10

As already described before, pdflush is in charge of flushing dirty pages to disk. So you can optionally change the flush interval by setting the following parameter (in hundredths of seconds, e.g. 500 = 5s):

vm.dirty_writeback_centisecs = 500

Of course pdflush needs to know when data can be removed from cache. Sometimes it makes sense to increase the time how long “untouched” data lives be in the cache before it’s marked as expired. Just overwrite the following parameter (again in hundredths of seconds):

vm.dirty_expire_centiseconds = 3000

If you want to have more informations about the memory on your system, just have a look at:

cat /proc/meminfo

Filesystem

To increase the maximum amount of file descriptors you can use.

fs.file-max = 65535

Exec Shield

Exec Shield is a protection against worms and other automated remote attacks on Linux systems. It was invented by Red Hat in 2002. To enable Exec Shield:

kernel.exec-shield = 1
kernel.randomize_va_space = 1

Network Core

Some applications are configured for performance and sometimes an application can handle huge buffers. To increase the maximum buffer size for all sockets / connections (this will affect all buffers, e.g. net.ipv4.tcp_rmem) you can use:

net.core.rmem_max = 8388608
net.core.wmem_max = 8388608

When a system is under heavy load and an interface receives a lot of packets, then the Kernel might not process them fast enough. You can increase the number of packets hold in the queue (backlog) by changing:

net.core.netdev_max_backlog = 5000

IPv4

First of all we recommend you tune ICMP a bit. You can do that by ignoring ICMP broadcasts, which will protect you from ICMP floods. We also ignore bogus responses to broadcast frames (violation against RFC1122), so that our log isn’t full of Kernel warnings:

net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

SYN floods are a type of DDoS and can harm your system. To protect from it you should enable SYN cookies, resize the SYN backlog (queue size) and reduce SYN/ACK retries:

# Turn on SYN cookies to protect from SYN flood attacks.
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 3

To log packets with impossible addresses simply enable:

net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

To disable IP source routing (SRR), so that nobody can tell us which path a packet should take:

net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route  = 0

By default, routers router everything and even packages which don’t belong to their network(s). To avoid that we’ve to make sure strict reverse path filtering is enabled as defined in RFC3704:

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

Some applications support higher read and write buffers for sockets. The buffer size parameters are defined by 3 values (min, default, max). To increase the maximum buffer set:

net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608

To get better throughput in a network, it might make sense to enable TCP window scaling as defined in RFC1323:

net.ipv4.tcp_window_scaling = 1

Disable (ICMP) redirects at all. Please note that the send_redirects parameters should be enabled on routers:

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0        # Don't disable this on routers!
net.ipv4.conf.default.send_redirects = 0    # Don't disable this on routers!

Finally disable IPv4 forwarding on non-routing systems:

net.ipv4.ip_forward = 0

IPv6

Those who don’t use IPv6 at all should disable it:

net.ipv6.conf.all.disable_ipv6 = 1

If you’re already using IPv6 you might be interested in the following parameters.

On non-routing systems you should disable router solicitations:

net.ipv6.conf.default.router_solicitations = 0
net.ipv6.conf.all.router_solicitations = 0

You should also don’t accept routing preferences from router advertisements:

net.ipv6.conf.default.accept_ra_rtr_pref = 0
net.ipv6.conf.all.accept_ra_rtr_pref = 0

Don’t try to learn prefix information in router advertisements:

net.ipv6.conf.default.accept_ra_pinfo = 0
net.ipv6.conf.all.accept_ra_pinfo = 0

Don’t accept hop limits from router advertisements:

net.ipv6.conf.default.accept_ra_defrtr = 0
net.ipv6.conf.all.accept_ra_defrtr = 0

Disable IPv6 auto configuration, so that no unicast addresses can automatically be configured on your interface from a router advertisement:

net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.all.autoconf = 0

If you don’t want your system to be verbose about its neighbours, you should disable neighbour solicitations at all:

net.ipv6.conf.default.dad_transmits = 0
net.ipv6.conf.all.dad_transmits = 0

Unless you need more than one global unicast address, you should fix the number of assigned global unicast addresses per interface to 1:

net.ipv6.conf.default.max_addresses = 1
net.ipv6.conf.all.max_addresses = 1

.all & .default

A lot of sysctl parameters have several values, because there’s a .default, .all and sometimes even a .<interface> value. While the .<interface> value is obvious, you’ve to look closer on the other two.

According to a comment on the linux-kernel mailing list, there’s one major difference:

  • The default value will only be applied ONCE, at the point when an interface is created.
  • The all value will ALWAYS applied in addition.

This means when an interface is created, the default value will be applied to it once. However, you can overwrite that with the interface-specific parameter. The global .all parameter will always be applied in addition and in the end it depends of the logical operator how the “final value” looks like.

For example there are parameters where all settings need to be 1 (aka AND), where only one of the settings need to be 1 (aka OR) or where the highest value will be used (aka MAX).

So it’s important to know that existing interfaces might have a different value than the one you’ve set as default or all.

Where to find documentation?

IMHO the best documentation for sysctl is available directly in the Kernel docs. You can find them in the kernel.org git repository. Just have a look at the Documentation/networking/ip-sysctl.txt and Documentation/filesystems/proc.txt files.

You can also have a look at the man pages on your Linux server. For example if you want to know more about the tcp settings you can run:

man -7 tcp

Perform sysctl reload — Introduction

  • A sysctl variable represents file locations under the /proc/sys directory.
  • Everytime you make changes to your sysctl configuration file, you must reload it to activate the changes.
  • Now sysctl is not controlled by some daemon such as systemd, supervisord, monit etc wherein you restart the service and then expect that your sysctl configuration changes have been activated
  • We have to explicitly reload the sysctl changes. But then there are also times when some of the sysctl changes are activated during boot up stage, such as reserving hugepages, memory etc which can not be done runtime and requires a reboot

In this tutorial I will cover different Dos and Don’ts covering the following areas:

  • multiple ways to update sysctl configuration file
  • performing sysctl reload without reboot
  • reverting sysctl changes to default value

ALSO READ: 15+ dpkg command examples in Linux [Cheat Sheet]

Pre-requisites

Since sysctl modified the kernel level parameters, so it is important that you have root level privilege on the server when you intend to modify and perform sysctl reload. Alternatively you can also use sudo privilege to execute the sysctl commands or else you will get «Permission denied» error message.

List of sysctl configuration files

You can add your custom sysctl changes at different locations in different files. In most Linux distributions, following files can be used to modify your sysctl configurations:

/etc/sysctl.conf
/etc/sysctld.d/*.conf
/usr/lib/sysctl.d/*.conf

There may be some more files whoose availability is based on individual distributions:

/usr/local/lib/sysctl.d/*.conf
/lib/sysctl.d/*.conf
/run/sysctl.d/*.conf

Vendors settings live in /usr/lib/sysctl.d/. To override a whole file, create a new file with the same in /etc/sysctl.d/ and put new settings there. To override only specific settings, add a file with a lexically later name in /etc/sysctl.d/ and put new settings there.

For example, to override the changes from /usr/lib/sysctl.d/80-broadcom.conf, you can create /etc/sysctld.d/80-broadcom.conf with different setting and the values from /etc/sysctld.d/80-broadcom.conf will override /usr/lib/sysctl.d/80-broadcom.conf.

Get the existing value of sysctl parameters

Method-1: Using sysctl —all

You can use sysctl with -a or --all argument to list all the sysctl parameters with the applied value:

sysctl -a

OR

sysctl --all

This will print a long list of parameters, so you can combine this command with grep to only capture the required parameter. For example:

 ~]# sysctl -a | grep somaxconn
net.core.somaxconn = 128

ALSO READ: 10 elinks command examples in Linux [Cheat Sheet]

Method-2: Using sysctl [parameter]

You can also provide the parameter name along with the sysctl command to print it’s value. For example:

~]# sysctl net.core.somaxconn
net.core.somaxconn = 128

Now this can be challenging as you must know the exact name of the sysctl parameter to be able to get the value. But this method is preferred in scripts when we are trying to automate the process.

Method-3: Get the value from /proc/sys

Since these sysctl values are ultimately applied to /proc/sys, so we can also query the respective location to fetch the value. For example the path of net.core.somaxconn would be /proc/sys/net/core/somaxconn:

~]# cat /proc/sys/net/core/somaxconn
128

How to properly edit or update sysctl values

Scenario-1: Make non-persistent (temporary) changes using sysctl -w

You may wish to make temporary changes which are non-persistent i.e. it will not survive the reboot. In such case we can utilize -w or --write argument of sysctl command.

Use the following syntax to temporarily update the value of any sysctl parameter:

sysctl -w <parameter>=<value>

For example, we update the value of net.core.somaxconn to 240 from it’s default value of 128:

~]# sysctl -w net.core.somaxconn=240
net.core.somaxconn = 240

~]# sysctl -a | grep somaxconn
net.core.somaxconn = 240

Sample Output:
sysctl reload without reboot [100% Working]

ALSO READ: 10+ ipcs command examples in Linux [Cheat Sheet]

Scenario-2: Make non-persistent changes by modifying /proc/sys

We know that making any changes to sysctl values are defined under /proc/sys path at the respective parameter section. So we can also directly modify the values of these sysctl parameters, directly inside /proc/sys path:

~]# echo 250 > /proc/sys/net/core/somaxconn

~]# sysctl -a | grep somaxconn
net.core.somaxconn = 250

As you can see, we have updated the value of net.core.somaxconn from 240 to 250 by directly adding the new value inside /proc/sys/net/core/somaxconn

Scenario-3: Make persistent changes using /etc/sysctl.d/*.conf

NOTE:

I have seen users directly modifying /etc/sysctl.conf to add or modify the sysctl parameters. This is strictly discouraged and you should always create different configuration files inside /etc/sysctl.d/ with .conf extension which will be read by sysctl command when applying any changes. This is due to the fact that when you have multiple parameters to be modified then the control to activate them in a certain order and track becomes difficult which can be easily controlled by using a number prefix to define the order of execution.

You can add your custom sysctl configuration inside /etc/sysctl.d/XXXX.conf file as shown below:

~]# echo "net.core.somaxconn=1024" >> /etc/sysctl.d/99-sysctl.conf

To update the changes use sysctl -p or —load along with the file name with the newly added sysctl changes:

~]# sysctl -p /etc/sysctl.d/99-sysctl.conf
net.core.somaxconn = 1024

Verify the changes

~]# sysctl -a | grep somaxconn
net.core.somaxconn = 1024

Scenario-4: Assign/Revert to default values of sysctl parameters

If you wish to revert any sysctl parameter to it’s default value then you can manually add the same inside /etc/sysctl.d/XXX.conf file. But in such case, you should actually know the default value of the respective parameter.

ALSO READ: 10+ bzip2 command examples in Linux [Cheat Sheet]

In most cases we may not remember the default value, so in such scenario you must delete all the entries of the respective sysctl parameter from any configuration file. You can search for the parameter using following command:

find PATH -type f -name "*.conf" -exec grep -ri PARAMETER {} +

Here replace PATH and PARAMETER as per your requirement.

For example suppose we want to find any sysctl config file where we have modified somaxconn value, so we can use:

~]# find /etc/ /usr/lib/sysctl.d/* -type f -name "*.conf" -exec grep -i net.core.somaxconn {} +
/etc/sysctl.conf:net.core.somaxconn=1024

Now we need to delete these entries found in the above command and reboot the node. Just by deleting the entries and executing sysctl -p will not revert the parameter’s value to default.

For example, I have deleted the above entry from /etc/sysctl.d/99-sysctl.conf and refreshed the sysctl values:

~]# sysctl --system

~]# sysctl -a | grep somax
net.core.somaxconn = 1024

But still the system shows net.core.somaxconn value as 1024. Now let’s reboot the node and re-verify:

~]# reboot
login as: root
root@127.0.0.1's password:

[root@controller ~]# sysctl -a | grep somax
net.core.somaxconn = 128

So, after the reboot now as you can see the value of net.core.somaxconn has been reverted back to it’s default value i.e. 128.

How to perform sysctl reload without reboot

This is the most crucial part of this article. You have to understand there are many such sysctl parameters «SHOULD NOT» be reloaded runtime. For example some of them are:

vm.nr_hugepages
vm.nr_overcommit_hugepages
kernel.shmall
kernel.shmmax
kernel.shmmni

Now you can definitely modify the values of these parameters runtime, but they deal with the system memory. So if we want to increase or decrease the amount of hugepages or memory reserved by the kernel then the same should be done at boot up stage when no other process would be using the memory.

As runtime, it is possible one or the other process may be using certain block of memory and if we try to modify these sysctl parameters runtime then it can cause adverse effects to the running processes.

ALSO READ: 10+ lvchange command examples in Linux [Cheat Sheet]

Having said that, most of the other sysctl parameters can be updated and modified runtime. So to properly perform sysctl reload use

sysctl -p <path/of/conf/file>

OR

sysctl --system

If you execute sysctl -p without the file path, then it will only update the changes from /etc/sysctl.conf or /etc/sysctl.d/99-sysctl.conf which is actually a symbolic link of /etc/sysctl.conf:

~]# ls -l /etc/sysctl.d/99-sysctl.conf
lrwxrwxrwx. 1 root root 14 Feb 24  2020 /etc/sysctl.d/99-sysctl.conf -> ../sysctl.conf

To perform sysctl reload immediately for all the available configuration files, execute:

sysctl --system

The sysctl values are loaded early in boot via initramfs, so finally, rebuild initramfs to override any previous persistent sysctl settings in the initial ramdisk image.

On RHEL, CentOS, SuSE, Fedora, Rocky Linux execute:

dracut -v -f

On Ubuntu, Debian execute:

update-initramfs -u

HINT:

You should update initramfs once just before you plan to reboot your Linux server. If you are doing some test as part of which you are changing the sysctl value multiple times, then you need not update initramfs for every change. Once you have finalised your changes then you can update your initramfs at the end. This is just to make sure that next time when ever you reboot, the initramfs contains the latest sysctl changes and are applied during boot up stage.

ALSO READ: 10+ rpmbuild command examples in Linux [Cheat Sheet]

Summary

In this tutorial we covered different areas related to sysctl configuration. Some of the topics which we learned are:

  • Different sysctl configuration files available in Linux
  • How to make temporary non-persistent changes to sysctl values
  • How to make permanent persistent changes to sysctl values
  • How to properly perform sysctl reload without reboot

What’s Next

How to suppress sysctl: reading key «net.ipv6.conf.all.stable_secret» in Linux
Linux disable IPv6 properly (with or without reboot)

Further Reading

man page for sysctl(8)
man page for sysctl(5)

Понравилась статья? Поделить с друзьями:
  • Как изменить swappiness
  • Как изменить timezone linux
  • Как изменить svs на dwg
  • Как изменить timeline framerate davinci resolve
  • Как изменить svg шрифт