Системное администрирование

Как однократно передать параметр ядра?

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

В меню загрузчика Grub 2 выберем нужную загрузочную опцию и нажмем клавишу E на клавиатуре для перехода в режим редактирвоания.

В открывшемся редакторе найдем строку, которая начинается со слова linux, перейдём в ее конец, отступим пробел от последнего символа и добавим нужный параметр. Если их несколько, воспользуемся пробелом в качестве разделителя между ними.

Для начала загрузки нажмем сочетание Ctrl + X на клавиатуре.

Как мне задать параметр ядра для постоянного использования?

Для современных конфигураций с BLS воспользуемся утилитой grubby:

sudo grubby --update-kernel=ALL --args="foo=bar"

Здесь вместо foo=bar укажем необходимый параметр ядра.

Изменения вступят в силу при следующей загрузке системы.

Как убрать ненужный более параметр ядра?

Для современных конфигураций с BLS воспользуемся утилитой grubby:

sudo grubby --update-kernel=ALL --remove-args="foo=bar"

Здесь вместо foo=bar укажем необходимый параметр ядра.

Изменения вступят в силу при следующей загрузке системы.

Как мне задать параметр ядра на устаревшей конфигурации?

На устаревших конфигурациях, не использующих BLS, откроем файл с шаблонами загрузчика /etc/default/grub в любом текстовом редакторе:

sudoedit /etc/default/grub

Найдём в нём переменную GRUB_CMDLINE_LINUX, внесём соответствующие правки и сохраним изменения.

Пересоберём конфиг Grub 2 посредством grub2-mkconfig.

Изменения вступят в силу при следующей загрузке системы.

Как определить какие параметры ядра заданы в настоящее время?

Для получения информации о текущих параметрах ядра достаточно выполнить:

cat /proc/cmdline

Как определить какие модули ядра в настоящее время загружены?

Воспользуемся lsmod для отображения всех загруженных в данный момент модулей ядра:

lsmod

При помощи lspci выведем список используемых модулей конкретными устройствами:

lspci -nnk

Как узнать какие опциональные параметры поддерживает конкретный модуль ядра?

Для получения краткой справочной информации о поддерживаемых параметрах конкретного модуля ядра необходимо использовать modinfo:

modinfo foo-bar

Здесь foo-bar -- имя модуля, информацию о котором требуется вывести.

Как определить список загружаемых ОС в меню UEFI Boot из Fedora?

Выведем текущий список загрузки UEFI Boot при помощи утилиты efibootmgr:

sudo efibootmgr -v

Возможно ли изменить порядок загрузки в UEFI Boot из Fedora?

Выведем текущий список загрузки UEFI Boot.

Изменим порядок по своему усмотрению:

sudo efibootmgr -o 0000,0002,0003,0001

Здесь 0000 и прочие -- результат предыдущего вывода утилиты. Ведущие нули указывать не обязательно.

Изменения вступают в силу немедленно.

Как добавить новый пункт меню UEFI Boot из Fedora?

В качестве примера добавим строку запуска Fedora (если она по какой-либо причине стала отсутствовать):

sudo efibootmgr -c -L "Fedora" -l "\EFI\fedora\shimx64.efi"

Изменения вступают в силу немедленно.

Как удалить ненужный пункт меню UEFI Boot из Fedora?

Выведем текущий список загрузки UEFI Boot.

Удалим пункт 0002:

sudo efibootmgr -b 0002 -B

Ведущие нули указывать не обязательно. Изменения вступают в силу немедленно.

Как мне посмотреть текущий журнал работы системы?

Чтобы посмотреть журнал работы системы с момента загрузки, нужно выполнить:

journalctl -b

Чтобы посмотреть только журнал работы ядра (аналог dmesg):

journalctl -k

Как мне посмотреть журналы с прошлых загрузок?

Вывести список всех загрузок:

journalctl --list-boots

Вывести содержимое журнала загрузки с идентификатором X:

journalctl -b -X

Как мне выгрузить журнал в файл?

Необходимо перенаправить поток стандартного вывода в файл:

journalctl -b > ~/abc.txt

Также можно воспользоваться утилитой fpaste для автоматической загрузки файла на сервис fpaste.org:

journalctl -b | fpaste

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

Как сделать chroot в установленную систему с LiveUSB?

Загружаемся с Fedora LiveUSB и запускаем эмулятор терминала или переходим в виртуальную консоль (особой разницы не имеет).

Для начала создадим каталог для точки монтирования:

sudo mkdir /media/fedora

Смонтируем корневой раздел установленной ОС:

sudo mount -t ext4 /dev/sda3 /media/fedora

Здесь /dev/sda3 -- раздел, на котором установлена ОС, а ext4 -- его файловая система. Внесём соответствующие правки если это не так.

Переходим в каталог с корневой ФС и монтируем ряд необходимых для работы окружения виртуальных ФС:

cd /media/fedora
sudo mount -t proc /proc proc
sudo mount --rbind /sys sys
sudo mount --make-rslave sys
sudo mount --rbind /dev dev
sudo mount --make-rslave dev
sudo mount -t tmpfs tmpfs tmp

При необходимости смонтируем /boot и /boot/efi разделы:

sudo mount -t ext4 /dev/sda2 boot
sudo mount -t vfat /dev/sda1 boot/efi

Теперь осуществим вход в chroot:

sudo chroot /media/fedora

Если для выполнения действий требуется доступ к Интернету, настроим корректное преобразование DNS.

По окончании работы завершим работу chroot-окружения:

logout

Отмонтируем раздел:

sudo umount /media/fedora

Как настроить ИБП (UPS) в Fedora?

См. здесь.

Системные журналы занимают слишком много места. Как их ограничить?

См. здесь.

Как немедленно очистить все системные журналы?

Выполним принудительную ротацию системных журналов для сброса их из памяти на диск:

sudo journalctl --rotate

Очистим все записи с диска, старше 1 секунды:

sudo journalctl --vacuum-time=1s

Что такое systemd и как с ним работать?

См. здесь.

Как очистить кэши и буферы всех файловых систем?

Чтобы очистить кэши и буферы нужно выполнить:

sudo bash -c "sync && echo 3 > /proc/sys/vm/drop_caches && sync"

Как перевести системные часы в UTC или localtime и наоборот?

Localtime -- это хранение в UEFI BIOS компьютера времени с учётом установленного в системе часового пояса. При определённых условиях это может вызывать проблемы с синхронизацией времени, а также работой нескольких операционных систем на одном компьютере.

UTC -- это хранение в UEFI BIOS компьютера всемирного координированного времени по Гринвичу без учёта часовых поясов. Часовыми поясами управляет операционная система, что позволяет каждому пользователю в системе, а также приложениям использовать индивидуальные настройки.

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

sudo timedatectl set-local-rtc no

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

sudo timedatectl set-local-rtc yes

У меня в дуалбуте с Fedora установлена Windows и часы постоянно сбиваются. В чём дело?

Чтобы такого не происходило, обе операционные системы должны хранить время в формате UTC. Для этого в Windows нужно применить следующий файл реестра:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation]
"RealTimeIsUniversal"=dword:00000001

У меня в системе используется GDM, но я хочу заменить его на SDDM. Это возможно?

Установка SDDM:

sudo dnf install sddm

Отключение GDM и активация SDDM:

sudo systemctl -f enable sddm

Изменения вступят в силу при следующей загрузке системы.

Как мне выбрать версию Java по умолчанию?

Для выбора дефолтной версии Java следует использовать систему альтернатив:

sudo update-alternatives --config java

Как изменить имя хоста?

Изменение имени хоста возможно посредством hostnamectl:

hostnamectl set-hostname NEW

Здесь вместо NEW следует указать новое значение. Изменения вступят в силу немедленно.

Как мне проверить ФС в составе LVM с LiveUSB?

Если файловая система была повреждена, необходимо запустить fsck и разрешить ему исправить её. При использовании настроек по умолчанию (LVM, ФС ext4) это делается так:

sudo fsck -t ext4 /dev/mapper/fedora-root
sudo fsck -t ext4 /dev/mapper/fedora-home

Если вместо ext4 применяется другая файловая система, необходимо указать её после параметра -t.

Как мне проверить ФС при использовании классических разделов с LiveUSB?

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

sudo fsck -t ext4 /dev/sda2
sudo fsck -t ext4 /dev/sda3

Если вместо ext4 применяется другая файловая система, необходимо указать её после параметра -t. Также вместо /dev/sda2 следует прописать соответствующее блочное устройство с повреждённой ФС.

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

sudo fdisk -l

Как мне проверить ФС на зашифрованном LUKS разделе с LiveUSB?

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

sudo cryptsetup luksOpen /dev/sda2 luks-root

Здесь вместо /dev/sda2 следует прописать соответствующее блочное устройство зашифрованного накопителя.

Теперь запустим проверку файловой системы:

sudo fsck -t ext4 /dev/mapper/luks-root

Если вместо ext4 применяется другая файловая система, необходимо указать её после параметра -t.

По окончании обязательно отключим LUKS том:

sudo cryptsetup luksClose /dev/mapper/luks-root

Как восстановить данные с повреждённого раздела с BTRFS?

Существует несколько способов восстановления данных на повреждённом разделе с файловой системой BTRFS. Они подразделяются на безопасные, небезопасные и деструктивные.

Небезопасные и деструктивные могут привести к полной потере всех данных на накопителе, поэтому прибегать к ним следует лишь при крайней необходимости, если безопасные не помогли. Работать лучше всего с точной посекторной копией вместо реального устройства.

Здесь /dev/sda2 -- блочное устройство раздела, данные с которого мы будем пытаться восстановить, а /media/btrfs -- временная точка для его монтирования.

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

Более подробную информацию можно найти в openSUSE Support Database (на английском языке).

Безопасные способы восстановления

Попытаемся смонтировать повреждённый раздел:

sudo mkdir /media/btrfs
sudo mount /dev/sda2 /media/btrfs

Если монтирование прошло успешно, выполним операцию scrub (проверка контрольных сумм для всех данных с попыткой восстановления) на точке монтирования:

sudo btrfs scrub start /media/btrfs
sudo btrfs scrub status /media/btrfs

Если монтирование осуществить не удалось, сделаем то же самое на блочном устройстве:

sudo btrfs scrub start /dev/sda2
sudo btrfs scrub status /dev/sda2

Если предыдущие шаги не помогли, воспользуемся особым параметром монтирования usebackuproot:

sudo mount -o usebackuproot /dev/sda2 /media/btrfs

Небезопасные способы восстановления

Сначала выполним проверку раздела:

sudo btrfs check /dev/sda2

Сделаем копию сохранившихся данных с раздела на другой накопитель (например на USB-flash, смонтированный как /media/external):

sudo btrfs restore /dev/sda2 /media/external

Внимание! После выполнения каждой следующей операции будем пытаться повторно смонтировать раздел и продолжать только если это до сих пор не удаётся:

sudo mount /dev/sda2 /media/btrfs

Попытаемся восстановить суперблок файловой системы из его копии:

sudo btrfs rescue super-recover /dev/sda2

Выполним очистку журнала транзакций:

sudo btrfs rescue zero-log /dev/sda2

Запустим восстановление блоков данных (процесс займёт очень много времени и прерывать его нельзя):

sudo btrfs rescue chunk-recover /dev/sda2

Деструктивные способы восстановления

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

sudo btrfs restore /dev/sda2 /media/external

Запустим принудительное восстановление данных на устройстве (может привести к полной потере всех данных без возможности восстановления):

sudo btrfs check --repair /dev/sda2

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

sudo mount /dev/sda2 /media/btrfs

Возможна ли полная дедупликация оперативной памяти?

Да, дедупликация памяти поддерживается в ядре Linux начиная с версии 2.6.32 модулем KSM и по умолчанию применяется лишь в системах виртуализации, например в KVM.

Возможна ли полная дедупликация данных на дисках?

Полная автоматическая дедупликация данных на дисках поддерживается лишь файловой системой BTRFS.

Можно ли включить сжатие оперативной памяти?

Да, в ядро Linux, начиная с версии 3.14, по умолчанию входит модуль zram, который позволяет увеличить производительность системы посредством использования вместо дисковой подкачки виртуального устройства в оперативной памяти с активным сжатием.

Начиная с Fedora 33, по умолчанию включено сжатие памяти с пулом 50% от объёма RAM. Допускается изменять его размер в широких пределах.

Активируем zram в Fedora:

sudo dnf install zram-generator zram-generator-defaults

Перезагрузим систему для вступления изменений в силу:

sudo systemctl reboot

Как временно изменить параметр ядра при помощи sysctl?

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

sudo sysctl -w foo.bar=X

Здесь foo.bar имя параметра, а X -- его значение. Изменения вступят в силу немедленно и сохранятся до перезагрузки системы.

Как задать и сохранить параметр ядра при помощи sysctl?

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

foo.bar1=X1
foo.bar2=X2

Каждый параметр должен быть указан с новой строки. Здесь foo.bar имя параметра, а X -- его значение.

Для вступления изменений в силу требуется перезагрузка:

sudo systemctl reboot

В каком порядке загружаются sysctl файлы настроек?

При загрузке ядро проверяет следующие каталоги в поисках .conf файлов:

  1. /usr/lib/sysctl.d -- предустановленные конфиги системы и определённых пакетов;

  2. /run/sysctl.d -- различные конфиги, сгенерированные в рантайме;

  3. /etc/sysctl.d -- пользовательские конфиги.

Порядок выполнения -- в алфавитном порядке, поэтому для его изменения многие конфиги содержат цифры и буквы. Например конфиг 00-foobar.conf выполнится раньше, чем zz-foobar.conf.

Как переключить запуск системы в текстовый режим и обратно?

Чтобы активировать запуск Fedora в текстовом режиме, нужно переключиться на цель multi-user.target:

sudo systemctl set-default multi-user.target

Чтобы активировать запуск в графическом режиме, необходимо убедиться в том, что установлен какой-либо менеджер графического входа в систему (GDM, SDDM, LightDM и т.д.), а затем переключиться на цель graphical.target:

sudo systemctl set-default graphical.target

Определить используемый в настоящее время режим можно так:

systemctl get-default

Изменения вступят в силу лишь после перезапуска системы:

sudo systemctl reboot

Как настроить подкачку в файл в Fedora?

Создадим файл подкачки на 4 ГБ:

sudo dd if=/dev/zero of=/media/pagefile count=4096 bs=1M

Установим правильный chmod:

sudo chmod 600 /media/pagefile

Подготовим swapfs к работе:

sudo mkswap /media/pagefile

Активируем файл подкачки:

sudo swapon /media/pagefile

Для того, чтобы подкачка подключалась автоматически при загрузке системы, откроем файл /etc/fstab и добавим в него следующую строку:

/media/pagefile    none    swap    sw    0    0

Действия вступят в силу немедленно.

Как узнать, какой процесс осуществляет запись на диск?

Для мониторинга дисковой активности существуют улититы iotop и fatrace. Установим их:

sudo dnf install iotop fatrace

Запустим iotop в режиме накопления показаний:

sudo iotop -a

Запустим fatrace в режиме накопления с выводом лишь информации о событиях записи на диск:

sudo fatrace -f W

Запустим fatrace в режиме накопления, с выводом информации о событиях записи на диск в файл, в течение 10 минут (600 секунд):

sudo fatrace -f W -o ~/disk-usage.log -s 600

Как сменить метку раздела?

Смена метки раздела с файловой системой ext2, ext3 и ext4:

sudo e2label /dev/sda1 "NewLabel"

Смена метки раздела с файловой системой XFS:

sudo xfs_admin -L "NewLabel" /dev/sda1

Здесь /dev/sda1 -- раздел, на котором требуется изменить метку.

Как получить UUID всех смонтированных разделов?

Для получения всех UUID можно использовать утилиту blkid:

sudo blkid

Вывод UUID для указанного раздела:

sudo blkid /dev/sda1

Здесь /dev/sda1 -- раздел, для которого требуется вывести UUID.

Как изменить UUID раздела?

Смена UUID раздела с файловой системой ext2, ext3 и ext4:

sudo tune2fs /dev/sda1 -U $(uuidgen)

Смена UUID раздела с файловой системой XFS:

sudo xfs_admin -U generate /dev/sda1

Здесь /dev/sda1 -- раздел, на котором требуется изменить UUID.

Как получить PID запущенного процесса?

Для получения идентификатора запущенного процесса (PID), следует применять утилиту pidof:

pidof foo-bar

Здесь вместо foo-bar следует указать имя образа процесса, информацию о котором требуется получить.

Как правильно завершить работу процесса?

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

  • остановить активные потоки;

  • сообщить порождённым им процессам (потомкам) о том, что он завершает свою работу;

  • закрыть все открытые процессом дескрипторы;

  • освободить все занятые процессом ресурсы;

  • вернуть управление операционной системе.

Чтобы отправить сигнал SIGTERM процессу с определённым PID, воспользуемся утилитой kill:

kill -15 XXXX

Здесь XXXX -- PID нужного процесса.

Вместо явного указания PID процесса существует возможность завершить работу процесса с указанным именем посредством killall:

killall -15 foo-bar

Здесь вместо foo-bar следует указать имя образа процесса, который требуется завершить, однако её следует применять с особой осторожностью ибо если существует несколько процессов с одинаковым названием, все они будут завершены.

Как принудительно завершить работу процесса?

Если какой-либо процесс завис и не отвечает на требование завершения посредством SIGTERM, можно заставить операционную систему принудительно завершить его работу сигналом SIGKILL, который не может быть перехвачен и проигнорирован процессом.

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

Чтобы отправить сигнал SIGKILL процессу с определённым PID, воспользуемся утилитой kill:

kill -9 XXXX

Здесь XXXX -- PID нужного процесса.

Вместо явного указания PID процесса существует возможность завершить работу процесса с указанным именем посредством killall:

killall -9 foo-bar

Здесь вместо foo-bar следует указать имя образа процесса. Если существует несколько процессов с одинаковым названием, все они будут завершены.

Что такое процесс-зомби?

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

Такие процессы не занимают ресурсов в системе (ибо успешно завершили свою работу), за исключением строки в таблице процессов, хранящей его PID.

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

Что такое процесс-сирота?

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

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

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

Как правильно установить Docker в Fedora?

Официально Docker в Fedora более не поддерживается. На просторах Интернета можно найти сторонние инструкции по установке Docker, однако мы настоятельно не рекомендуем следовать им, поскольку для их работы требуются изменения в системе, способные нарушить её безопасность и/или работу других приложений (например отключение cgroupv2).

Вместо этого рекомендуется установить и использовать Podman, т.к. он создан и поддерживается Red Hat, а также не требует прав суперпользователя для работы:

sudo dnf install podman

Синтаксис команд аналогичен Docker.

Как определить включена ли определённая опция ядра во время компиляции?

Полный список опций, заданных на этапе компиляции ядра, всегда можно найти в config-файлах, внутри каталога /boot.

В качестве примера проверим статус опции CONFIG_EFI_STUB текущего ядра:

grep CONFIG_EFI_STUB /boot/config-$(uname -r)

В выводе y означает, что опция была включена, а not set, соответственно, выключена.

Процесс ksoftirqd съедает все ресурсы системы. Что делать?

Ядро операционной системы взаимодействует с устройствами посредством прерываний. Когда возникает новое прерывание, оно немедленно приостанавливает работу текущего выполняемого процесса, переключается в режим ядра и начинает его обработку.

Может случиться так, что прерывания будут генерироваться настолько часто, что ядро не сможет их обрабатывать немедленно, в порядке получения. На этот случай имеется специальный механизм, помещающий полученные прерывания в очередь для дальнейшей обработки. Этой очередью управляет особый поток ядра ksoftirqd (создаётся по одному на каждый имеющийся процессор или ядро многоядерного процессора).

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

Как определить какое устройство генерирует огромное количество прерываний?

Для диагностики системы обработки прерываний, ядро имеет встроенный механизм:

cat /proc/interrupts

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

Как произвести ручную балансировку прерываний?

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

sudo bash -c "echo X > /proc/irq/Y/smp_affinity"

Здесь X -- маска процессора (CPU affinity), который будет обрабатывать данное прерывание, а Y -- номер прерывания (указан в левом столбце таблицы прерываний).

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

При работе приложения возникает ошибка Too many open files. Что делать?

Ошибка Too many open files возникает при превышении количества открытых дескрипторов файлов процессом. Для её исправления, нужно увеличить это ограничение.

Как узнать текущий лимит открытых файловых дескрипторов?

Существует два типа ограничений: мягкий (soft) и жёсткий (hard). Жёсткий задаётся администратором системы, а мягкий может регулироваться как пользователем, так и запущенным приложением, но не может превышать максимально заданное значение жёсткого лимита, а также глобальное для всего ядра.

Получим значение мягкого ограничителя:

ulimit -Sn

Получим значение жёсткого ограничителя:

ulimit -Hn

Значения по умолчанию 1024 (soft) и 4096 (hard).

Как узнать глобальный лимит открытых файловых дескрипторов?

Наряду с мягким и жёстким лимитами открытых файловых дескрипторов существует и глобальный, который ядро Linux способно адресовать и корректно обработать.

Выведем это значение при помощи соответствующей функции ядра:

cat /proc/sys/fs/file-max

Как увеличить лимит открытых файловых дескрипторов?

Мягкие и жёсткие лимиты на количество дескрипторов открытых файлов задаются в файле /etc/security/limits.conf суперпользователем, но при этом не могут превышать глобальный.

Увеличим ограничение для пользователя foo-bar до 8192/2048:

foo-bar       soft    nofile          2048
foo-bar       hard    nofile          8192

Увеличим ограничение для любых пользователей до 8192/2048:

*       soft    nofile          2048
*       hard    nofile          8192

Изменения вступят в силу при следующем входе в систему.

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

По умолчанию процесс выполняется на любых доступных для Linux процессорах (или их ядрах).

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

Запустим приложение foo-bar на каждом чётном ядре (нумерация всегда начинается с нуля):

taskset -a -c 0,2,4,6 foo-bar

Изменим ассоциацию ядер для уже запущенного процесса foo-bar (в качестве параметра указывается PID необходимого процесса):

taskset -a -c 1,3,5,7 -p $(pidof foo-bar)

Как изменить приоритет процесса?

Допустимые значения приоритета находятся в диапазоне от -20 (наиболее высокий приоритет) до 19 (наиболее низкий). Отрицательные значения может устанавливать лишь суперпользователь.

Запустим приложение foo-bar с приоритетом 10:

nice -n 10 foo-bar

Изменим приоритет запущенного процесса foo-bar (в качестве параметра указывается PID необходимого процесса) до 8:

renice -n 8 -p $(pidof foo-bar)

Чем отличается Effective UID процесса от Real UID?

В мире UNIX считается нормальным, когда один процесс запускается от одного пользователя, но при этом получает права совсем другого (чаще всего это суперпользователь root).

В качестве простого примера рассмтрим ситуацию, когда пользователь user1 запускает бинарник с установленным suid-битом /usr/bin/foo-bar. Таким образом, у процесса foo-bar в качестве Real user ID будет установлен user1, а Effective user ID -- root. Это сделано для того, чтобы приложение могло самостоятельно отказаться от повышенных прав, либо переключаться между ними при помощи соответствующего системного вызова.

Как скопировать данные с одного раздела на другой?

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

Загрузимся с Fedora LiveUSB, затем смонтируем старый и новый разделы:

sudo mkdir /media/old-root
sudo mount -t ext4 /dev/sda1 /media/old-root
sudo mkdir /media/new-root
sudo mount -t ext4 /dev/sdb1 /media/new-root

Запустим процесс копирования:

sudo rsync -axHAWXS --numeric-ids --info=progress2 /media/old-root/ /media/new-root/

По окончании работы обязательно размонтируем оба раздела:

sudo umount /media/old-root
sudo umount /media/new-root

Как запретить модификацию файла даже владельцу и суперпользователю?

Чтобы запретить модификацию файла (изменение, удаление) любым пользователем (включая владельца и суперпользователя), установим ему расширенный атрибут +i:

sudo chattr +i foo-bar.txt

Чтобы отменить произведённые изменения, выполним:

sudo chattr -i foo-bar.txt

Управлять расширенными атрибутами может лишь суперпользователь.

Как узнать какие расширенные атрибуты применены для конкретного файла?

Для получения расширенных атрибутов воспользуемся утилитой lsattr:

lsattr foo-bar.txt

Поддерживается также вывод в виде человеко-читаемого списка, который можно включить опциональным параметром -l:

lsattr foo-bar.txt

Как разрешить лишь дописывать данные в файл?

Чтобы разрешить лишь добавление данных в файл любым пользователем (включая владельца и суперпользователя), установим ему расширенный атрибут +a:

sudo chattr +a foo-bar.txt

Чтобы отменить произведённые изменения, выполним:

sudo chattr -a foo-bar.txt

Как создать алиасы для быстрого подключения к SSH серверам?

OpenSSH позволяет создавать неограниченное количество алиасов для быстрых подключений.

Чтобы сделать это, откроем (создадим) файл ~/.ssh/config в любом текстовом редакторе и внесём правки:

Host foo
    HostName example1.org
    Port 22
    User user1

Host bar
    HostName example2.org
    Port 22
    User user2
    IdentityFile ~/.ssh/id_rsa2

Здесь foo и bar -- имена сокращений (алиасов), которые будут использоваться для подключения. Для каждого могут быть указаны индивидуальные настройки, включая различные SSH ключи при помощи директивы IdentityFile.

Подключимся к первому серверу:

ssh foo

Подключимся ко второму серверу:

ssh bar

Что такое FUSE?

FUSE (file system in userspace) -- это модуль ядра и набор утилит для работы с ним, предназначенные для запуска различных файловых систем в пользовательском пространстве.

Благодаря FUSE в Fedora могут использоваться файловые системы, которые по какой-либо причине не могут войти напрямую в состав ядра Linux из-за лицензионных проблем, либо патентов.

Некоторые примеры подобных реализаций:

  • MTP;

  • NTFS;

  • ZFS;

  • SSHFS;

  • WebDAV.

Из-за работы в пользовательском режиме возникает ряд проблем:

  • очень медленная работа за счёт постоянных переключений контекста;

  • в зависимости от параметров монтирования может быть не видна для работающих системных сервисов.

Как авторизоваться на удалённой системе с использованием Kerberos?

Установим необходимые пакеты для работы с Kerberos 5:

sudo dnf install krb5-workstation

Произведём авторизацию на удалённой системе:

kinit foo-bar@FEDORAPROJECT.ORG

Здесь foo-bar -- логин на удалённой системе, а FEDORAPROJECT.ORG -- имя домена (должно быть указано строго в верхнем регистре).

В случае ввода верных авторизационных данных процесс должен пройти в штатном режиме.

Как обновить Kerberos-тикет?

В зависимости от настроек сервера, полученный Kerberos-тикет обычно действует в течение 24 часов, затем даётся ещё от 24 до 48 часов для его обновления без необходимости прохождения повторной процедуры авторизации.

Проверим актуальность Kerberos тикетов:

klist -A

При необходимости обновим необходимый:

kinit -R foo-bar@FEDORAPROJECT.ORG

Здесь foo-bar -- логин на удалённой системе, а FEDORAPROJECT.ORG -- имя домена (должно быть указано строго в верхнем регистре).

В каталоге появился файл с некорректным именем, который не удаётся удалить. Что делать?

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

Штатно такие файлы удалить не удастся, поэтому придётся уничтожить соответствующий данному файлу I-узел (I-Node).

Перейдём в каталог с удаляемым файлом:

cd ~/foo-bar

Выведем листинг содержимого каталога с включённым отображением номеров I-узлов:

ls -li

Найдём в выводе необходимый файл и сохраним значение его I-узла. Теперь мы можем удалить его:

find . -maxdepth 1 -type f -inum XXXXXXX -delete

Здесь XXXXXXX -- номер I-узла некорректного файла.

Нужно ли выполнять дефрагментацию для разделов с ФС ext4?

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

Однако при определённых обстоятельствах (например если точный размер при создании неизвестен, либо в него постоянно производится добавление-удаление данных), некоторые файлы могут фрагментироваться.

Как выполнить дефрагментацию отдельных файлов на разделе ФС ext4?

Для выполнения частичной дефрагментации, можно использовать утилиту e4defrag, входящую в пакет e2fsprogs.

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

Разрешается выполнять оптимизацию отдельных файлов, либо всего содержимого указанных каталогов.

Выполним дефрагментацию крупной базы данных /var/db/foo-bar.db:

sudo e4defrag /var/db/foo-bar.db

Выполним дефрагментацию всего корня:

sudo e4defrag /

Как выполнить дефрагментацию всего раздела с ФС ext4?

Полную дефрагментацию можно осуществить при помощи средства проверки диска на размонтированном разделе, например при запуске с Fedora LiveUSB.

Запустим процесс:

sudo fsck -t ext4 -fn /dev/sda2

Здесь /dev/sda2 -- раздел, на котором следует провести процесс дефрагментации. Операция займёт достаточно много времени (в зависимости от размера диска). Прерывать её не следует, т.к. это может привести к полной потере данных.

Как определить количество доступных процессоров или ядер?

Основной способ. Применим утилиту nproc:

nproc --all

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

Альтернативный способ. Если указанная выше утилита в системе отсутствует, выполним:

cat /proc/cpuinfo | grep 'cpu cores' | uniq | awk '{ print $4 }'

Как перенаправить стандартный ввод-вывод в файлы?

Перенаправление потока стандартного вывода утилиты ls, запущенной с параметром, в файл:

ls -l > ~/foo-bar.txt

Перенаправление потока стандартного вывода в файл в режиме добавления данных (не заменяет существующие):

ls -l >> ~/foo-bar.txt

Перенаправление потока стандартного ввода на ввод из указанного файла:

sort < ~/foo-bar.txt

Перенаправление потока стандартного вывода и потока ошибок в файл:

/usr/bin/foo > ~/foo-bar.txt 2>&1

Комбинирование ввода из одного файла с выводом в другой с подавлением возникших ошибок:

/usr/bin/foo < ~/foo-bar.txt > ~/result.txt 2> /dev/null

Как разрешить монтирование любых дисков без ввода пароля?

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

Создадим новый конфиг:

sudo touch /etc/polkit-1/rules.d/10-mount-nopass.rules
sudo chmod 0644 /etc/polkit-1/rules.d/10-mount-nopass.rules

Загрузим его в текстовом редакторе:

sudoedit /etc/polkit-1/rules.d/10-mount-nopass.rules

Добавим следующее правило:

polkit.addRule(function(action, subject) {
    if ((action.id == "org.freedesktop.udisks2.filesystem-mount-system" ||
        action.id == "org.freedesktop.udisks.filesystem-mount-system-internal") &&
        subject.local && subject.active && subject.isInGroup("wheel"))
    {
            return polkit.Result.YES;
    }
});

Сохраним изменения в файле.

Теперь пользователи с административными правами (входящие в группу wheel) смогут монтировать любые диски без ввода пароля.

Что такое coredump и почему systemd сохраняет их?

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

По умолчанию systemd при падениях любых процессов (как системных, так и пользовательских), сохраняет дампы их закрытой памяти в каталоге /var/lib/systemd/coredump, поэтому он может занимать десятки гигабайт.

Возможно их ограничить, либо полностью отключить.

Как ограничить размер сохраняемых дампов памяти?

Откроем файл конфигурации systemd-coredump:

sudoedit /etc/systemd/coredump.conf

Внесём правки, убирая символ комментария # перед каждой строкой:

[Coredump]
Storage=external
Compress=yes
ProcessSizeMax=1G
ExternalSizeMax=1G
JournalSizeMax=200M
MaxUse=5
KeepFree=

В данном примере мы задаём максимальный размер одного дампа в 1 ГБ (ProcessSizeMax и ExternalSizeMax) с ограничением хранения не более 5 (MaxUse).

Изменения вступят в силу при следующей загрузке системы.

Как полностью отключить сохранение дампов памяти?

Откроем файл конфигурации systemd-coredump:

sudoedit /etc/systemd/coredump.conf

Уберём символ комментария # лишь перед первой строкой и изменим её значение:

[Coredump]
Storage=none

Изменения вступят в силу при следующей загрузке системы.

Как настроить автоматическое выполнение скрипта после установки нового ядра?

Для того, чтобы выполнять какой-либо shell-скрипт сразу после окончания установки ядра Linux, поместим его в каталог /etc/kernel/install.d с chmod 0755 и расширением .install.

Скрипты из него всегда выполняются в алфавитном порядке, т.е. 00-foo.install запустится раньше, чем zz-bar.install, поэтому данную особенность можно использовать для изменения порядка их запуска.

Каждому скрипту в качестве параметра передаётся версия установленного ядра, которую можно получить через ${1}.

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

Если при попытке загрузки модуля ядра при помощи modprobe с правами суперпользователя воникает ошибка modprobe: ERROR: could not insert 'XXXXXXX': Operation not permitted, значит включён режим UEFI Secure Boot, а данный модуль не имеет цифровой подписи.

Необходимо либо отключить Secure Boot в настройках UEFI компьютера, либо подписать его действительной цифровой подписью.

Как настроить загрузку системы при помощи systemd-boot?

См. здесь.

Почему моё приложение не может использовать порт ниже 1024?

Диапазон портов 1-1023 зарезервирован для суперпользователя, а также приложений, наделённых его правами.

Стандартная схема использования: сервис запускается с правами root, начинает прослушивать необходимый ему порт, а затем сбрасывает повышенные права. Так поступают большинство популярных серверных приложений (apache, nginx и т.д.).

Существует и альтернативный вариант -- запуск при помощи особого юнита systemd.

Как запустить приложение на порту ниже 1024 при помощи systemd?

Добавим в systemd-юнит foo-bar.service запрос привилегии CAP_NET_BIND_SERVICE:

[Unit]
Description=Simple application
After=network.target

[Service]
RestartSec=10s
Type=simple
User=user
Group=user
WorkingDirectory=/home/user/foo-bar
ExecStart=/home/user/foo-bar/foo
Restart=always
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

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

Как удалить пользователя из группы?

Удалим пользователя с именем foo из группы bar:

sudo gpasswd -d foo bar

Удалим текущего пользователя из группы bar:

sudo gpasswd -d $(whoami) bar

Как включить полное журналирование данных на диске?

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

Откроем файл /etc/fstab в текстовом редакторе:

sudoedit /etc/fstab

Добавим после параметра монтирования по умолчанию defaults через запятую data=journal:

UUID=XXXXXXX /home ext4 defaults,data=journal 1 2

Сохраним изменения в файле и выполним перезагрузку системы.

Какие преимущества и недостатки у полного журналирования данных?

Преимущества:

  • более высокая надёжность в случае внезапного пропадания подачи электропитания;

  • гарантия сохранности не только структуры файловой системы, но и самих данных.

Недостатки:

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

  • за счёт двойной записи снижается производительность всех файловых операций записи;

  • для файлового журнала будет зарезервировано 10% от свободного места на диске;

  • более быстрое расходование ресурса записи твёрдотельных накопителей данных.

Для каких целей резервируется 5% от свободного места на диске?

По умолчанию на каждом разделе с файловой системой ext4 резервируется 5% для нужд суперпользователя.

Как отключить резервирование свободного места на диске?

Резервирование свободного места для нужд суперпользователя может быть отключено при создании файловой системы при помощи опционального параметра -m 0. Например:

sudo mkfs -t ext4 -m 0 -L Data /dev/sdX1

Для уже существующей файловой системы воспользуемся утилитой tune2fs:

sudo tune2fs -m 0 /dev/sdX1

Здесь 0 -- процентное соотношение зарезервированных блоков к обычным (отсутствуют), а /dev/sdX1 -- раздел диска, на котором будут произведены изменения.

Как включить поддержку zswap в Fedora?

Установим пакет zswap-cli для работы с модулем ядра zswap:

sudo dnf install zswap-cli

При необходимости внесём правки в файл конфигурации:

sudoedit /etc/zswap-cli/zswap-cli.conf

Активируем сервис zswap-cli:

sudo systemctl enable --now zswap-cli.service

Изменения вступят в силу немедленно.

Как произвести дефраментацию оперативной памяти?

В современных версиях ядра Linux применяется т.н. проактивная дефрагментация оперативной памяти, однако если требуется осуществить данную процедуру немедленно, выполним:

sudo bash -c "echo 1 > /proc/sys/vm/compact_memory"

Как отключить активированное по умолчанию сжатие оперативной памяти?

Если в сжатии оперативной памяти при помощи zram нет необходимости, отключим данную функцию простым удалением предоставляющих её пакетов:

sudo dnf remove zram-generator zram-generator-defaults

Перезагрузим систему для вступления изменений в силу:

sudo systemctl reboot

Как определить какой планировщик ввода-вывода используется?

Выведем информацию обо всех установленных в системе дисковых накопителях:

grep . /sys/block/*/queue/scheduler

Название активного планировщика на каждом конкретном устройстве указано в квадратных скобках.

Пример:

/sys/block/sda/queue/scheduler:mq-deadline kyber [bfq] none

Данный вывод означает, что в системе для устройства /dev/sda применяется BFQ.

Как получить код завершения последней выполненной команды?

Выведем на экран код завершения последней выполненной команды в терминале:

echo $?

Как определить текущее состояние UEFI Secure Boot?

Установим пакет mokutil:

sudo dnf install mokutil

Выведем информацию о текущем состоянии UEFI Secure Boot:

sudo mokutil --sb-state

Как построить и вывести дерево процессов?

Воспользуемся утилитой ps для построения и вывода дерева процессов:

ps -aef --forest

Как однократно смонтировать BTRFS subvolume?

Создадим каталог для точки монтирования:

sudo mkdir /media/foo-bar

Выполним монтирование подтома foo-bar:

sudo mount -t btrfs /dev/sdX2 -o subvol=foo-bar /media/foo-bar

По окончании работы произведём размонтирование и удалим ненужный более каталог:

sudo umount /media/foo-bar
sudo rmdir /media/foo-bar

Здесь /dev/sdX2 -- накопитель с файловой системой BTRFS.

Как включить сжатие данных на разделе с BTRFS?

Внимание! Начиная с Fedora 34 для новых установок уже включено сжатие для разделов с ФС BTRFS алгоритмом zstd с уровнем сжатия 1. Для тех, кто обновляется с предыдущих релизов, сжатие можно включить самостоятельно.

Файловая система BTRFS поддерживает прозрачное сжатие данных. Допускается выбрать один из трёх доступных алгоритмов: zstd, zlib или lzo. Сжатие включается посредством указания алгоритма и уровня в параметрах монтирования раздела.

Включим сжатие для корневого раздела. Для этого внесём правки в файл конфигурации /etc/fstab:

sudoedit /etc/fstab

В колонке параметров монтирования добавим опцию compress=zstd:1:

UUID=XXXXX-XXXXX /   btrfs   compress=zstd:1,subvol=fedora   0 0

Здесь XXXXX-XXXXX -- UUID раздела.

Сохраним изменения и произведём перезагрузку системы:

sudo systemctl reboot

С этого момента все записываемые данные будут сжиматься алгоритмом zstd.

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

Как определить эффективность сжатия на разделе с BTRFS?

Оценим эффективность сжатия данных на разделе с файловой системой BTRFS при помощи утилиты compsize:

sudo compsize -x /

Как применить изменения в правилах udev без перезагрузки?

Применим изменения в правилах udev при помощи утилиты udevadm:

sudo udevadm control --reload

Как однократно подключиться к SSH-серверу через proxy?

Для подключения к SSH-серверу через proxy, воспользуемся утилитой nc, параметры которой передадим при помощи опции ProxyCommand:

ssh -o ProxyCommand='nc -X 5 --proxy-type socks5 --proxy 127.0.0.1:8080 %h %p' user@example.org

Как настроить подключение к любым SSH-серверам через proxy?

Добавим опцию ProxyCommand в файл конфигурации ~/.ssh/config для постоянного использования с любыми хостами:

Host *
    ProxyCommand nc -X 5 --proxy-type socks5 --proxy 127.0.0.1:8080 %h %p