Серия RHCSA: Управление процессами в RHEL 7: Загрузка, выключение и все, что между ними – Часть 5

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

Linux Boot Process

Обратите внимание, что:

1. те же основные принципы применяются, возможно, с небольшими изменениями, и к другим дистрибутивам Linux, а
2. следующее описание не претендует на исчерпывающее объяснение процесса загрузки, а только на основы.

Процесс загрузки Linux

1. POST (Power On Self Test) инициализирует и выполняет проверку оборудования.

2. Когда POST завершается, управление системой передается первому загрузчику первого этапа, который хранится либо в загрузочном секторе одного из жестких дисков (для старых систем с использованием BIOS и MBR), либо в специальном разделе (U)EFI.

3. Затем первый загрузчик второго этапа загружает второй загрузчик второго этапа, как правило, GRUB (GRand Unified Boot Loader), который находится внутри /boot, который в свою очередь загружает ядро и начальную файловую систему, основанную на RAM (также известную как initramfs, которая содержит программы и бинарные файлы, выполняющие необходимые действия для окончательного монтирования фактической корневой файловой системы).

4. Мы видим заставку, которая позволяет нам выбрать операционную систему и ядро для загрузки:

Boot Menu Screen

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

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

Login Screen and Process PID

В приведенном выше примере мы использовали хорошо известную команду ps для отображения списка текущих процессов, родительским процессом которых (или, другими словами, процессом, который их запустил) является systemd (менеджер системы и служб, к которому перешли большинство современных дистрибутивов Linux) во время запуска системы:

# ps -o ppid,pid,uname,comm --ppid=1

Помните, что флаг -o (сокращение от –format) позволяет представить вывод ps в настраиваемом формате, чтобы удовлетворить ваши потребности, используя ключевые слова, указанные в разделе STANDARD FORMAT SPECIFIERS в man ps.

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

# ps aux --sort=+pcpu              # Sort by %CPU (ascending)
# ps aux --sort=-pcpu              # Sort by %CPU (descending)
# ps aux --sort=+pmem              # Sort by %MEM (ascending)
# ps aux --sort=-pmem              # Sort by %MEM (descending)
# ps aux --sort=+pcpu,-pmem        # Combine sort by %CPU (ascending) and %MEM (descending)
Customize ps Command Output

Введение в SystemD

Немногие решения в мире Linux вызвали больше споров, чем принятие systemd крупными дистрибутивами Linux. Сторонники systemd называют в качестве его основных преимуществ следующие факты:

Читайте также: История «init» и «systemd»

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

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

3. Обратная совместимость с сценариями SysVinit.

Systemd управляется утилитой systemctl. Если вы пришли из среды SysVinit, вероятно, вам знакомы:

  1. инструмент service, который – в этих старых системах – использовался для управления сценариями SysVinit, и
  2. утилита chkconfig, которая служила для обновления и запроса информации о уровнях запуска для системных служб.
  3. выключение, которое вы, должно быть, использовали несколько раз для перезапуска или остановки работающей системы.

Следующая таблица показывает сходства в использовании этих устаревших инструментов и systemctl:

Legacy tool Systemctl equivalent Description
service name start systemctl start name Start name (where name is a service)
service name stop systemctl stop name Stop name
service name condrestart systemctl try-restart name Restarts name (if it’s already running)
service name restart systemctl restart name Restarts name
service name reload systemctl reload name Reloads the configuration for name
service name status systemctl status name Displays the current status of name
service –status-all systemctl Displays the status of all current services
chkconfig name on systemctl enable name Enable name to run on startup as specified in the unit file (the file to which the symlink points). The process of enabling or disabling a service to start automatically on boot consists in adding or removing symbolic links inside the /etc/systemd/system directory.
chkconfig name off systemctl disable name Disables name to run on startup as specified in the unit file (the file to which the symlink points)
chkconfig –list name systemctl is-enabled name Verify whether name (a specific service) is currently enabled
chkconfig –list systemctl –type=service Displays all services and tells whether they are enabled or disabled
shutdown -h now systemctl poweroff Power-off the machine (halt)
shutdown -r now systemctl reboot Reboot the system

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

Подводя итог

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

1. Регулировать приоритет выполнения процесса в отношении использования системных ресурсов:

Это достигается с помощью утилиты renice, которая изменяет приоритет планирования одного или нескольких работающих процессов. Простыми словами, приоритет планирования – это функция, которая позволяет ядру (присутствующему в версиях => 2.6) выделять системные ресурсы в соответствии с назначенным приоритетом выполнения (также известным как “доброжелательность”, в диапазоне от -20 до 19) данного процесса.

Основным синтаксисом renice является следующий:

# renice [-n] priority [-gpu] identifier

В общем команде выше первый аргумент – это значение приоритета, которое следует использовать, в то время как другой аргумент может быть интерпретирован как процесс ID (что является настройкой по умолчанию), идентификаторы групп процессов, идентификаторы пользователей или имена пользователей. Обычный пользователь (кроме root) может изменять только приоритет планирования процесса, которым он владеет, и только увеличивать уровень приятности (что означает использование меньшего количества системных ресурсов).

Process Scheduling Priority
2. Убийство (или прерывание нормального выполнения) процесса по необходимости:

Более точно, убийство процесса означает отправку ему сигнала для завершения его выполнения гармонично (SIGTERM=15) или немедленно (SIGKILL=9) с помощью команд kill или pkill.

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

Кроме того, pkill поставляется в комплекте с pgrep, который показывает вам PID’ы, которые будут затронуты при использовании pkill. Например, перед запуском:

# pkill -u gacanepa

Может быть полезно посмотреть на лету, какие PID’ы принадлежат gacanepa:

# pgrep -l -u gacanepa
Find PIDs of User

По умолчанию как kill, так и pkill отправляют сигнал SIGTERM процессу. Как упоминалось ранее, этот сигнал может быть проигнорирован (пока процесс завершает своё выполнение или навсегда), поэтому когда вам действительно нужно остановить работающий процесс по веской причине, вам потребуется указать сигнал SIGKILL в командной строке:

# kill -9 identifier               # Kill a process or a process group
# kill -s SIGNAL identifier        # Idem
# pkill -s SIGNAL identifier       # Kill a process by name or other attributes 

Заключение

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

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

Source:
https://www.tecmint.com/rhcsa-exam-boot-process-and-process-management/