Вопрос или проблема
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
, запись в лог и повторное монтирование.
Шаги для реализации решения
- Создайте сценарий Bash. Мы будем использовать
findmnt --poll
для мониторинга событий монтирования и размонтирования. - Настройте логику сценария. Он должен запускаться в фоновом режиме и отслеживать вывод
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 &
Описание сценария
-
LOGFILE: Задайте путь к файлу журнала, в который будут записываться события.
-
Функция log_info: Эта функция выполняет команды для записи информации о событии размонтирования в указанный файл журнала. Она добавляет временную метку для отладки.
-
Процесс findmnt: Команда
findmnt --poll
выполняется в фоне с помощьюnohup
и перенаправляет вывод вwhile read -r line
. После этого каждая строка выводится и анализируется. -
Проверка на umount: Если строка начинается с
umount
, вызывается функцияlog_info
, которая собирает и записывает информацию, а затем выполняетсяsudo mount -a
для повторного монтирования.
Настройка прав
Убедитесь, что у сценария есть права на выполнение:
chmod +x your_script.sh
Также стоит обратить внимание, что для выполнения команд с sudo
в сценарии потребуется либо настроить sudoers
, чтобы он мог выполняться без запроса пароля, либо запускать сценарий с достаточными правами.
Заключение
Данный подход дает возможность активно отслеживать любые изменения в состоянии монтирования вашего устройства. Вы сможете легко адаптировать и расширять сценарий, добавляя дополнительные команды для диагностики и обработки ошибок. Это поможет вам лучше узнать о проблемах с монтированием в вашем Raspberry Pi и автоматически реагировать на них.