Как использовать findmnt --poll в скрипте

Вопрос или проблема

Raspberry Pi обычно монтирует два раздела при загрузке; вот /etc/fstab:

proc            /proc           proc    defaults          0       0
PARTUUID=8a6020b5-01  /boot/firmware  vfat    defaults          0       2
PARTUUID=8a6020b5-02  /               ext4    defaults,noatime  0       1

У меня есть проблема в том, что по нескольким причинам раздел /boot/firmware (vfat) стал “размонтирован” (по-видимому, случайно); я отметил это в выводе lsblk --fs :

# 'boot/firmware' смонтирован правильно:

$ lsblk --fs
NAME        FSTYPE FSVER LABEL  UUID                                 FSAVAIL FSUSE% MOUNTPOINTS 
nvme0n1
├─nvme0n1p1 vfat   FAT32 bootfs 146B-AD94                             444.8M    13% /boot/firmware
└─nvme0n1p2 ext4   1.0   rootfs ece25014-1cd7-4874-9bfc-f91e486bc000  364.9G     2% /

# 'boot/firmware' становится "размонтированным": 

$ lsblk --fs 
NAME        FSTYPE FSVER LABEL  UUID                                 FSAVAIL FSUSE% MOUNTPOINTS 
nvme0n1
├─nvme0n1p1 vfat   FAT32 bootfs 146B-AD94                             444.8M    13% 
└─nvme0n1p2 ext4   1.0   rootfs ece25014-1cd7-4874-9bfc-f91e486bc000  364.9G     2% /  

После того как я рассмотрел несколько вариантов для решения этой проблемы, я подумал, что использование опции --poll с findmnt будет хорошим выбором; т.е.:

$ nohup /usr/bin/findmnt -n --poll=umount,mount --target /boot/firmware & 

Я запустил эту команду и протестировал ее, используя umount и mount, чтобы инициировать findmnt --poll:

$ nohup /usr/bin/findmnt --poll=umount,mount --target /boot/firmware &
[1] 10904

# подождите немного, затем

$ sudo umount /boot/firmware 
$ sudo mount -a

# проверьте nohup.out: 

$ cat nohup.out
umount     /boot/firmware /dev/nvme0n1p1 vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro
mount      /boot/firmware /dev/nvme0n1p1 vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro 

Что мне нужно сделать, так это инициировать процедуру, когда появляется вывод umount .... Пока я не смог этого сделать, и мне нужна помощь. Мне нужен скрипт, который запускает команду findmnt --poll, а затем ждет вывода, начинающегося с umount. Когда этот вывод поступает, я хотел бы выполнить dmesg (?), захватить этот вывод в logfile, возможно, некоторые другие диагностические методы, и наконец выполнить sudo mount -a.

После того как findmnt --poll выдаёт следующую строку с mount, я думаю, что скрипт должен вернуться в “ожидающее” состояние, чтобы захватить следующее событие umount.

Я познакомился немного с командой wait, но задаюсь вопросом, является ли это правильным подходом, потому что:

Команда wait заставляет сценарий оболочки или сеанс терминала ожидать завершения фоновых процессов.

В этом случае findmnt --poll не завершается – он продолжает работать, опрашивая еще одно изменяющееся состояние. Есть ли у вас предложения, как подойти к этому?

Ответ или решение

Для решения проблемы автоматического реагирования на событие размонтирования раздела /boot/firmware с использованием команды findmnt --poll, вы можете использовать сценарий на Bash, который будет отслеживать вывод данной команды в фоновом режиме. Следующий шаг – интеграция необходимых действий, таких как сбор информации с помощью dmesg, запись в лог и повторное монтирование.

Шаги для реализации решения

  1. Создайте сценарий Bash. Мы будем использовать findmnt --poll для мониторинга событий монтирования и размонтирования.
  2. Настройте логику сценария. Он должен запускаться в фоновом режиме и отслеживать вывод findmnt --poll. Когда команда фиксирует события размонтирования (umount), сценарий будет выполнять необходимые действия.

Пример сценария

Вот пример простого Bash-сценария, который делает именно это:

#!/bin/bash

LOGFILE="/path/to/your/logfile.log"

# Функция для сбора и логирования информации
function log_info {
    # Собираем информацию с помощью dmesg
    echo "[$(date)] - Событие размонтирования" >> "$LOGFILE"
    dmesg >> "$LOGFILE"
    echo "-----------------------------" >> "$LOGFILE"
}

# Запускаем findmnt в фоновом режиме, перенаправляя вывод
nohup /usr/bin/findmnt --poll=umount,mount --target /boot/firmware | while read -r line; do
    # Проверка на событие размонтирования
    if [[ "$line" == umount* ]]; then
        log_info
        # Повторное монтирование раздела
        sudo mount -a
    fi
    # Можно добавить дополнительную логику для обработки событий монтирования, если нужно.
done &

Описание сценария

  1. LOGFILE: Задайте путь к файлу журнала, в который будут записываться события.

  2. Функция log_info: Эта функция выполняет команды для записи информации о событии размонтирования в указанный файл журнала. Она добавляет временную метку для отладки.

  3. Процесс findmnt: Команда findmnt --poll выполняется в фоне с помощью nohup и перенаправляет вывод в while read -r line. После этого каждая строка выводится и анализируется.

  4. Проверка на umount: Если строка начинается с umount, вызывается функция log_info, которая собирает и записывает информацию, а затем выполняется sudo mount -a для повторного монтирования.

Настройка прав

Убедитесь, что у сценария есть права на выполнение:

chmod +x your_script.sh

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

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...