Практическая работа: Модуль 17. Загрузка системы и управление службами systemd
См. также Требования, правила и цели выполнения практической работы
Практические задания
Задание 1.
Перезагрузите тестовую виртуальную машину и в момент её запуска измените команды запуска так, чтобы отключить «тихую» загрузку ОС.
Перенастройте загрузчик, чтобы при последующих запусках ОС «тихий» режим загрузки ОС был отключен, а тайм-аут отображения меню загрузки GRUB был 7 секунд. Убедитесь, что настройки применились.
Выведите на экран целевое состояние системы по умолчанию. Перезагрузите машину, используя целевое состояние systemd.
Выведите на экран сообщения ядра ОС от начала загрузки и ознакомьтесь с ними.
Задание 2.
Для успешного прохождения этого задания у виртуальной машины должны быть два CPU.
Если вы не создали модули службы fly-message-monitor.service и resource-demanding1.service (раздел 17.6) в процессе изучения материала модуля, то создайте их, в том числе настройте контрольную группу для службы resource-demanding1.service.
Создайте службу resource-demanding2.service по аналогии со службой resource-demanding1.service, но так, чтобы скрипт, который она запускает, назывался resource-demanding2.sh и запускался на втором процессоре.
Создайте скрипт /usr/local/bin/cpu_usage.sh со следующим содержимым:
#!/bin/bash
CPU_THRESHOLD_WARNING=85 # %
CPU_THRESHOLD_CRITICAL=95 # %
CPU_THRESHOLD_PERIOD=5 # секунд
CPU_THRESHOLD_ITERATION=3 # раз
MSG_FILE="/tmp/fly-msg/msg.txt"
while :; do
# Get the first line with aggregate of all CPUs
cpu_now=($(head -n1 /proc/stat))
# Get all columns but skip the first (which is the "cpu" string)
cpu_sum="${cpu_now[@]:1}"
# Replace the column seperator (space) with +
cpu_sum=$((${cpu_sum// /+}))
# Get the delta between two reads
cpu_delta=$((cpu_sum - cpu_last_sum))
# Get the idle time Delta
cpu_idle=$((cpu_now[4]- cpu_last[4]))
# Calc time spent working
cpu_used=$((cpu_delta - cpu_idle))
# Calc percentage
cpu_usage=$((100 \* cpu_used / cpu_delta))
# Keep this as last for our next read
cpu_last=("${cpu_now[@]}")
cpu_last_sum=$cpu_sum
if [[ "$cpu_usage" -ge "$CPU_THRESHOLD_WARNING" ]]; then
((cpu_warning_count++))
if [[ "$cpu_usage" -ge "$CPU_THRESHOLD_CRITICAL" ]]; then
((cpu_critical_count++))
else
cpu_critical_count=0
fi
else
cpu_warning_count=0
cpu_critical_count=0
fi
msg_critical="critical\\ndialog-warning\\n<H1>Критически высокая нагрузка на
CPU!</H1><p>Использование CPU $cpu_usage%\\t$(date)</p>"
msg_warning="critical\\ndialog-warning\\n<H1>Высокая нагрузка на CPU!</H1><p>Использование CPU
$cpu_usage%\\t$(date)</p>"
msg_ok="normal\\ndialog-information\\n<H1>Нагрузка на CPU в пределах нормы</H1><p>Использование CPU
$cpu_usage%\\t$(date)</p>"
if [[ cpu_critical_count -ge CPU_THRESHOLD_ITERATION ]]; then
echo -en $msg_critical > $MSG_FILE
send_ok=1
elif [[ cpu_warning_count -ge CPU_THRESHOLD_ITERATION ]]; then
echo -en $msg_warning > $MSG_FILE
send_ok=1
elif [[ send_ok -eq 1 ]]; then
echo -en $msg_ok > $MSG_FILE
send_ok=0
fi
# Wait a second before the next read
sleep $CPU_THRESHOLD_PERIOD
echo "CPU usage at $cpu_usage%"
echo "Warning counter $cpu_warning_count"
echo "Critical counter $cpu_critical_count"
done
Не забудьте сделать файл исполнимым.
Создайте модуль службы и назовите его cpu-monitor.service, чтобы он запускал скрипт /usr/local/bin/cpu_usage.sh и стартовал автоматически при загрузке ОС только при цели graphical.target.
Выведите на экран содержимое конфигурационного файла модуля cpu-monitor.service, используя systmctl.
Отредактируйте файл модуля так, чтобы он запускался только после службы fly-message-monitor.service, используя утилиту systemctl.
Запустите службу cpu-monitor.service и убедитесь, что она работает.
Переведите систему в целевое состояние multi-user.traget и убедитесь, что службы cpu-monitor.service и fly-message-monitor.service не запущены.
Переведите систему в целевое состояние graphical.target и убедитесь, что службы cpu-monitor.service и fly-message-monitor.service запустились.
Запустите службу resource-demanding1.service.
Запустите службу resource-demanding2.service и проверьте, что при высокой (более 85%) нагрузке на CPU вы получаете сообщения от скрипта мониторинга.
Задание 3.
Измените настройки контрольной группы службы resource-demanding1.service так, чтобы суммарная нагрузка на два CPU была в пределах 85-94%. Убедитесь, что сообщение от скрипта мониторинга изменилось.
Измените настройки контрольной группы службы resource-demanding1.service так, чтобы суммарная нагрузка на два CPU была ниже 85%. Убедитесь, что сообщение от скрипта мониторинга изменилось и больше не появляется.
Выведите на экран дерево контрольных групп и найдите в нем контрольную группу для сервиса resource-demanding1.service.
Задание 4.
Выведите на экран все запущенные модули подсистемы systemd.
Выведите на экран все модули служб подсистемы systemd.
Выведите на экран в отдельном терминале информацию обо всех поступающих в реальном времени событиях подсистемы systemd.
Перезапустите службу resource-demanding1.service. Выведите на экран её статус.
Остановите службы resource-demanding1.service, resource-demanding2.service и cpu-monitoring.service.
Выведите на экран информацию из журналов о сервисе resource-demanding1.service в сокращённом виде.
Ответы на практические задания (пошаговые инструкции)
Задание 1.
Перезагрузите тестовую виртуальную машину и в момент её запуска измените команды запуска так, чтобы отключить «тихую» загрузку ОС.
Перезагрузите машину и в момент появления меню загрузчика GRUB нажмите клавишу <e>.
Введите имя пользователя и пароль от GRUB (который был задан в момент установки ОС).
В третьей с конца строке, начинающейся с «linux», удалите слово «quiet» и нажмите <F10>.
Перенастройте загрузчик, чтобы при последующих запусках ОС «тихий» режим загрузки ОС был отключен, а тайм-аут отображения меню загрузки GRUB был 7 секунд.
Откройте файл /etc/default/grub на редактирование от имени администратора.
sudo vim /etc/default/grub
Измените параметр GRUB_TIMEOUT=5 на GRUB_TIMEOUT=7.
Измените параметр GRUB_CMDLINE_LINUX_DEFAULT=»parsec.mac=0 quiet net.ifnames=0» на RUB_CMDLINE_LINUX_DEFAULT=»parsec.mac=0 net.ifnames=0».
Сохраните файл и выполните обновление конфигурации GRUB командой
sudo update-grub
.Убедитесь, что настройки применились, изучив файл /boot/grub/grub.cfg.
less /boot/grub/grub.cfg
Выведите на экран целевое состояние системы по умолчанию. Перезагрузите машину, используя целевое состояние systemd.
systemctl get-default
sudo systemctl isolate reboot.target
Выведите на экран сообщения ядра ОС от начала загрузки и ознакомьтесь с ними.
sudo dmesg
Задание 2.
Для успешного прохождения этого задания у виртуальной машины должны быть два CPU.
Если вы не создали модули службы fly-message-monitor.service и resource-demanding1.service (раздел 17.6) в процессе изучения материала модуля, то создайте их, в том числе настройте контрольную группу для службы resource-demanding1.service. Подробно об их создании изложено в тексте модуля.
Создайте службу resource-demanding2.service по аналогии со службой resource-demanding1.service, но так, чтобы скрипт, который она запускает, назывался resource-demanding2.sh и запускался на втором процессоре.
От имени суперпользователя создайте скрипт resource-demanding2.sh в каталоге /usr/local/bin/ (который предназначен в том числе для хранения скриптов запускаемых на уровне всей системы) и предоставьте владельцу право на его выполнение.
#!/bin/bash /usr/bin/sha256sum /dev/urandom > /dev/null
sudo -i echo "/usr/bin/sha256sum /dev/urandom > /dev/null" > /usr/local/bin/resource-demanding2.sh chmod u+x /usr/local/bin/resource-demanding2.sh exit
Создайте файл службы /etc/systemd/system/resource-demanding2.service со следующей конфигурацией:
[Unit] Description=Сервис, воспроизводящий высокую нагрузку на CPU 1 After=graphical.target [Service] ExecStart=taskset 0x00000002 /usr/bin/bash /usr/local/bin/resource-demanding2.sh Type=simple [Install] WantedBy=graphical.target
sudo vim /etc/systemd/system/resource-demanding2.service sudo systemctl daemon-reload
Создайте скрипт /usr/local/bin/cpu_usage.sh со следующим содержимым:
#!/bin/bash CPU_THRESHOLD_WARNING=85 # % CPU_THRESHOLD_CRITICAL=95 # % CPU_THRESHOLD_PERIOD=5 # секунд CPU_THRESHOLD_ITERATION=3 # раз MSG_FILE="/tmp/fly-msg/msg.txt" while :; do # Get the first line with aggregate of all CPUs cpu_now=($(head -n1 /proc/stat)) # Get all columns but skip the first (which is the "cpu" string) cpu_sum="${cpu_now[@]:1}" # Replace the column seperator (space) with + cpu_sum=$((${cpu_sum// /+})) # Get the delta between two reads cpu_delta=$((cpu_sum - cpu_last_sum)) # Get the idle time Delta cpu_idle=$((cpu_now[4]- cpu_last[4])) # Calc time spent working cpu_used=$((cpu_delta - cpu_idle)) # Calc percentage cpu_usage=$((100 \* cpu_used / cpu_delta)) # Keep this as last for our next read cpu_last=("${cpu_now[@]}") cpu_last_sum=$cpu_sum if [[ "$cpu_usage" -ge "$CPU_THRESHOLD_WARNING" ]]; then ((cpu_warning_count++)) if [[ "$cpu_usage" -ge "$CPU_THRESHOLD_CRITICAL" ]]; then ((cpu_critical_count++)) else cpu_critical_count=0 fi else cpu_warning_count=0 cpu_critical_count=0 fi msg_critical="critical\\ndialog-warning\\n<H1>Критически высокая нагрузка на CPU!</H1><p>Использование CPU $cpu_usage%\\t$(date)</p>" msg_warning="critical\\ndialog-warning\\n<H1>Высокая нагрузка на CPU!</H1><p>Использование CPU $cpu_usage%\\t$(date)</p>" msg_ok="normal\\ndialog-information\\n<H1>Нагрузка на CPU в пределах нормы</H1><p>Использование CPU $cpu_usage%\\t$(date)</p>" if [[ cpu_critical_count -ge CPU_THRESHOLD_ITERATION ]]; then echo -en $msg_critical > $MSG_FILE send_ok=1 elif [[ cpu_warning_count -ge CPU_THRESHOLD_ITERATION ]]; then echo -en $msg_warning > $MSG_FILE send_ok=1 elif [[ send_ok -eq 1 ]]; then echo -en $msg_ok > $MSG_FILE send_ok=0 fi # Wait a second before the next read sleep $CPU_THRESHOLD_PERIOD echo "CPU usage at $cpu_usage%" echo "Warning counter $cpu_warning_count" echo "Critical counter $cpu_critical_count" done
Не забудьте сделать файл исполнимым.
sudo vim /usr/local/bin/cpu_usage.sh chmod u+x /usr/local/bin/cpu_usage.sh
Создайте модуль службы и назовите его cpu-monitor.service, чтобы он запускал скрипт /usr/local/bin/ cpu_usage.sh и стартовал автоматически при загрузке ОС только при цели graphical.target. Создайте файл службы /etc/systemd/system/cpu-monitor.service со следующей конфигурацией:
[Unit] Description=Мониторинг нагрузки на CPU и отправка уведомлений при превышении порога [Service] ExecStart=/usr/local/bin/cpu_usage.sh Type=simple [Install] WantedBy=graphical.target
sudo vim /etc/systemd/system/cpu-monitor.service
Установите автоматический запуск службы:
sudo systemctl enable cpu-monitor.service
Выведите на экран содержимое конфигурационного файла модуля cpu-monitor.service, используя systmctl.
systemctl cat cpu-monitor.service
Отредактируйте файл модуля cpu-monitor.service так, чтобы он запускался только после службы fly-message-monitor. service, используя утилиту systemctl. Измените директиву WantedBy в секции [Install] на:
WantedBy=fly-message-monitor.service
Открыв файл модуля на редактирование с помощью команды:
sudo systemctl --full edit cpu-monitor.service
Запустите службу cpu-monitor.service и убедитесь, что она работает.
sudo systemctl start cpu-monitor.service
Переведите систему в целевое состояние multi-user.traget и убедитесь, что службы cpu-monitor.service и fly-message-monitor.service не запущены.
sudo systemctl isolate multi-user.target systemctl status fly-message-monitor systemctl status cpu-monitor
Переведите систему в целевое состояние graphical.target и убедитесь, что службы cpu-monitor.service и fly-message-monitor.service запустились.
sudo systemctl isolate graphical.target systemctl status fly-message-monitor systemctl status cpu-monitor
Запустите службу resource-demanding1.service.
sudo systemctl start resource-demanding1.service
Запустите службу resource-demanding2.service и проверьте, что при высокой (более 85%) нагрузке на CPU вы получаете сообщения от скрипта мониторинга.
Задание 3.
Измените настройки контрольной группы службы resource-demanding1.service так, чтобы суммарная нагрузка на два CPU была в пределах 85-94%. Убедитесь, что сообщение от скрипта мониторинга изменилось.
Установите значение параметра CPUQuota в файле в 80%.
sudo vim /etc/systemd/system/resource-demanding1.service.d/10-CPUSettings.conf
Перечитайте конфигурацию сервисов.
sudo systemctl daemon-reload
Перезапустите сервис resource-demanding1.service.
sudo systemctl restart resource-demanding1.service
Измените настройки контрольной группы службы resource-demanding1.service так, чтобы суммарная нагрузка на два CPU была ниже 85%. Убедитесь, что сообщение от скрипта мониторинга изменилось и больше не появляется.
Установите значение параметра CPUQuota в файле в 50%.
sudo vim /etc/systemd/system/resource-demanding1.service.d/10-CPUSettings.conf
Перечитайте конфигурацию сервисов.
sudo systemctl daemon-reload
Перезапустите сервис resource-demanding1.service.
sudo systemctl restart resource-demanding1.service
Выведите на экран дерево контрольных групп и найдите в нем контрольную группу для сервиса resource-demanding1.service.
systemd-cgls
Выполните поиск в открывшейся утилите less через ввод «/resource-demanding1.sh».
Задание 4.
Выведите на экран все запущенные модули подсистемы systemd.
systemctl
Выведите на экран все модули служб подсистемы systemd.
systemctl --type=service
Выведите на экран в отдельном терминале информацию обо всех поступающих в реальном времени событиях подсистемы systemd. Откройте новый терминал и введите команду:
sudo journalctl -f
Перезапустите службу resource-demanding1.service. Выведите на экран её статус.
sudo systemctl restart resource-demanding1.service systemctl status resource-demanding1.service
Остановите службы resource-demanding1.service, resource-demanding2.service и cpu-monitoring.service.
sudo systemctl stop resource-demanding1.service resource-demanding2.service cpu-monitor.service
Выведите на экран информацию из журналов о сервисе resource-demanding1.service в сокращённом виде.
sudo journalctl -u resource-demanding1.service -o short