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

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

Для передачи параметра необходимо в меню загрузчика Grub 2 выбрать нужную строку и нажать клавишу E на клавиатуре для перехода к её редактированию, затем в конце через пробел дописать нужный параметр (или параметры), после чего нажать Enter, чтобы начать процесс загрузки.

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

Необходимо открыть с шаблонами загрузчика /etc/default/grub в любом текстовом редакторе, найти в нём переменную GRUB_CMDLINE_LINUX и внести соответствующие правки. После этого нужно пересобрать конфиг Grub 2 посредством grub2-mkconfig.

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

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

cat /proc/cmdline

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

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

lsmod

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

Для получения краткой справочной информации о поддерживаемых параметрах конкретного модуля ядра необходимо использовать 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?

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

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

sudo efibootmgr -b 0002 -B

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

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

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

journalctl -b

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

journalctl -k

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

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

journalctl --list-boots

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

journalctl -b -X

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

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

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

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

logout

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

sudo umount /media/fedora

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

См. здесь.

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

См. здесь.

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

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

sudo journalctl --rotate

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

sudo journalctl --vacuum-time=1s

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

См. здесь.

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

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

sync && echo 3 > /proc/sys/vm/drop_caches && sync

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

Переключение аппаратных часов компьютера в 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

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

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

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

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

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

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

Включение zram в Fedora:

sudo systemctl enable --now zram-swap

Отключение zram в Fedora:

sudo systemctl stop zram-swap
sudo systemctl disable zram-swap

Допускается изменить размера пула сжатия памяти.

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

Как временно изменить параметр 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 рекомендуется установить и использовать Podman, т.к. он не требует прав суперпользователя для работы:

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

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

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

sudo chattr +a foo-bar.txt

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

sudo chattr -a foo-bar.txt

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

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

Host foo
    HostName example1.org
    Port 22
    User user1

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

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

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

ssh foo

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

ssh bar

Что такое FUSE?

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

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

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

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

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

Как авторизоваться на удалённой системе с использованием 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 и ProcessSizeMax) с ограничением хранения не более 5 (MaxUse).

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

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

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

sudoedit /etc/systemd/coredump.conf

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

[Coredump]
Storage=none

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

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

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

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

Каждому скрипту в качестве параметра передаётся версия установленного ядра, которую можно получить через ${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.