Практическая работа: Модуль 17. Загрузка системы и управление службами systemd

См. также Требования, правила и цели выполнения практической работы

Практические задания

Задание 1.

  1. Перезагрузите тестовую виртуальную машину и в момент её запуска измените команды запуска так, чтобы отключить «тихую» загрузку ОС.

  2. Перенастройте загрузчик, чтобы при последующих запусках ОС «тихий» режим загрузки ОС был отключен, а тайм-аут отображения меню загрузки GRUB был 7 секунд. Убедитесь, что настройки применились.

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

  4. Выведите на экран сообщения ядра ОС от начала загрузки и ознакомьтесь с ними.

Задание 2.

Для успешного прохождения этого задания у виртуальной машины должны быть два CPU.

  1. Если вы не создали модули службы fly-message-monitor.service и resource-demanding1.service (раздел 17.6) в процессе изучения материала модуля, то создайте их, в том числе настройте контрольную группу для службы resource-demanding1.service.

  2. Создайте службу resource-demanding2.service по аналогии со службой resource-demanding1.service, но так, чтобы скрипт, который она запускает, назывался resource-demanding2.sh и запускался на втором процессоре.

  3. Создайте скрипт /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

Не забудьте сделать файл исполнимым.

  1. Создайте модуль службы и назовите его cpu-monitor.service, чтобы он запускал скрипт /usr/local/bin/cpu_usage.sh и стартовал автоматически при загрузке ОС только при цели graphical.target.

  2. Выведите на экран содержимое конфигурационного файла модуля cpu-monitor.service, используя systmctl.

  3. Отредактируйте файл модуля так, чтобы он запускался только после службы fly-message-monitor.service, используя утилиту systemctl.

  4. Запустите службу cpu-monitor.service и убедитесь, что она работает.

  5. Переведите систему в целевое состояние multi-user.traget и убедитесь, что службы cpu-monitor.service и fly-message-monitor.service не запущены.

  6. Переведите систему в целевое состояние graphical.target и убедитесь, что службы cpu-monitor.service и fly-message-monitor.service запустились.

  7. Запустите службу resource-demanding1.service.

  8. Запустите службу resource-demanding2.service и проверьте, что при высокой (более 85%) нагрузке на CPU вы получаете сообщения от скрипта мониторинга.

Задание 3.

  1. Измените настройки контрольной группы службы resource-demanding1.service так, чтобы суммарная нагрузка на два CPU была в пределах 85-94%. Убедитесь, что сообщение от скрипта мониторинга изменилось.

  2. Измените настройки контрольной группы службы resource-demanding1.service так, чтобы суммарная нагрузка на два CPU была ниже 85%. Убедитесь, что сообщение от скрипта мониторинга изменилось и больше не появляется.

  3. Выведите на экран дерево контрольных групп и найдите в нем контрольную группу для сервиса resource-demanding1.service.

Задание 4.

  1. Выведите на экран все запущенные модули подсистемы systemd.

  2. Выведите на экран все модули служб подсистемы systemd.

  3. Выведите на экран в отдельном терминале информацию обо всех поступающих в реальном времени событиях подсистемы systemd.

  4. Перезапустите службу resource-demanding1.service. Выведите на экран её статус.

  5. Остановите службы resource-demanding1.service, resource-demanding2.service и cpu-monitoring.service.

  6. Выведите на экран информацию из журналов о сервисе resource-demanding1.service в сокращённом виде.

Ответы на практические задания (пошаговые инструкции)

Задание 1.

  1. Перезагрузите тестовую виртуальную машину и в момент её запуска измените команды запуска так, чтобы отключить «тихую» загрузку ОС.

    1. Перезагрузите машину и в момент появления меню загрузчика GRUB нажмите клавишу <e>.

    2. Введите имя пользователя и пароль от GRUB (который был задан в момент установки ОС).

    3. В третьей с конца строке, начинающейся с «linux», удалите слово «quiet» и нажмите <F10>.

  2. Перенастройте загрузчик, чтобы при последующих запусках ОС «тихий» режим загрузки ОС был отключен, а тайм-аут отображения меню загрузки GRUB был 7 секунд.

    1. Откройте файл /etc/default/grub на редактирование от имени администратора.

    sudo vim /etc/default/grub
    
    1. Измените параметр GRUB_TIMEOUT=5 на GRUB_TIMEOUT=7.

    2. Измените параметр GRUB_CMDLINE_LINUX_DEFAULT=»parsec.mac=0 quiet net.ifnames=0» на RUB_CMDLINE_LINUX_DEFAULT=»parsec.mac=0 net.ifnames=0».

    3. Сохраните файл и выполните обновление конфигурации GRUB командой sudo update-grub.

    4. Убедитесь, что настройки применились, изучив файл /boot/grub/grub.cfg.

    less /boot/grub/grub.cfg
    
  3. Выведите на экран целевое состояние системы по умолчанию. Перезагрузите машину, используя целевое состояние systemd.

systemctl get-default
sudo systemctl isolate reboot.target
  1. Выведите на экран сообщения ядра ОС от начала загрузки и ознакомьтесь с ними.

sudo dmesg

Задание 2.

Для успешного прохождения этого задания у виртуальной машины должны быть два CPU.

  1. Если вы не создали модули службы fly-message-monitor.service и resource-demanding1.service (раздел 17.6) в процессе изучения материала модуля, то создайте их, в том числе настройте контрольную группу для службы resource-demanding1.service. Подробно об их создании изложено в тексте модуля.

  2. Создайте службу resource-demanding2.service по аналогии со службой resource-demanding1.service, но так, чтобы скрипт, который она запускает, назывался resource-demanding2.sh и запускался на втором процессоре.

    1. От имени суперпользователя создайте скрипт 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
      
    2. Создайте файл службы /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
      
  3. Создайте скрипт /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
  1. Создайте модуль службы и назовите его 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
    
  2. Выведите на экран содержимое конфигурационного файла модуля cpu-monitor.service, используя systmctl.

    systemctl cat cpu-monitor.service
    
  3. Отредактируйте файл модуля cpu-monitor.service так, чтобы он запускался только после службы fly-message-monitor. service, используя утилиту systemctl. Измените директиву WantedBy в секции [Install] на:

    WantedBy=fly-message-monitor.service
    

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

    sudo systemctl --full edit cpu-monitor.service
    
  4. Запустите службу cpu-monitor.service и убедитесь, что она работает.

    sudo systemctl start cpu-monitor.service
    
  5. Переведите систему в целевое состояние 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
    
  6. Переведите систему в целевое состояние graphical.target и убедитесь, что службы cpu-monitor.service и fly-message-monitor.service запустились.

    sudo systemctl isolate graphical.target
    systemctl status fly-message-monitor
    systemctl status cpu-monitor
    
  7. Запустите службу resource-demanding1.service.

sudo systemctl start resource-demanding1.service
  1. Запустите службу resource-demanding2.service и проверьте, что при высокой (более 85%) нагрузке на CPU вы получаете сообщения от скрипта мониторинга.

sudo systemctl start resource-demanding2.service
../_images/alse_mod17_image2.png

Задание 3.

  1. Измените настройки контрольной группы службы resource-demanding1.service так, чтобы суммарная нагрузка на два CPU была в пределах 85-94%. Убедитесь, что сообщение от скрипта мониторинга изменилось.

    1. Установите значение параметра CPUQuota в файле в 80%.

    sudo vim /etc/systemd/system/resource-demanding1.service.d/10-CPUSettings.conf
    
    1. Перечитайте конфигурацию сервисов.

    sudo systemctl daemon-reload
    
    1. Перезапустите сервис resource-demanding1.service.

    sudo systemctl restart resource-demanding1.service
    
    ../_images/alse_mod17_image3.png
  2. Измените настройки контрольной группы службы resource-demanding1.service так, чтобы суммарная нагрузка на два CPU была ниже 85%. Убедитесь, что сообщение от скрипта мониторинга изменилось и больше не появляется.

    1. Установите значение параметра CPUQuota в файле в 50%.

    sudo vim /etc/systemd/system/resource-demanding1.service.d/10-CPUSettings.conf
    
    1. Перечитайте конфигурацию сервисов.

    sudo systemctl daemon-reload
    
    1. Перезапустите сервис resource-demanding1.service.

    sudo systemctl restart resource-demanding1.service
    
    ../_images/alse_mod17_image41.png
  3. Выведите на экран дерево контрольных групп и найдите в нем контрольную группу для сервиса resource-demanding1.service.

    systemd-cgls
    

Выполните поиск в открывшейся утилите less через ввод «/resource-demanding1.sh».

Задание 4.

  1. Выведите на экран все запущенные модули подсистемы systemd.

    systemctl
    
  2. Выведите на экран все модули служб подсистемы systemd.

    systemctl --type=service
    
  3. Выведите на экран в отдельном терминале информацию обо всех поступающих в реальном времени событиях подсистемы systemd. Откройте новый терминал и введите команду:

    sudo journalctl -f
    
  4. Перезапустите службу resource-demanding1.service. Выведите на экран её статус.

    sudo systemctl restart resource-demanding1.service
    systemctl status resource-demanding1.service
    
  5. Остановите службы resource-demanding1.service, resource-demanding2.service и cpu-monitoring.service.

    sudo systemctl stop resource-demanding1.service
    resource-demanding2.service cpu-monitor.service
    
  6. Выведите на экран информацию из журналов о сервисе resource-demanding1.service в сокращённом виде.

    sudo journalctl -u resource-demanding1.service -o short