Вопрос или проблема
Я знаю, что могу мониторить (используя poll или select) файлы /proc/mount
или /etc/mtab
и узнать КОНЕЧНО, когда файловая система монтируется или размонтируется. Также я могу использовать getmntent для получения списка смонтированных файловых систем.
Мое приложение предназначено для мониторинга смонтированной файловой системы и уведомления о любых изменениях (монтировании или размонтировании).
Мое решение:
- Обнаружить изменения в
/proc/mounts
. - Получить все текущие смонтированные файловые системы с помощью
getmntent
. - Сравнить полученный список с предыдущим списком.
- Обработать разницу.
Но мне нужно знать, есть ли способ узнать последнюю смонтированную файловую систему при опросе из /proc/mounts
или /etc/mtab
. Просто считывая файл или опрашивая данные в какую-то структуру (например, mntent
).
С тех пор, как был задан этот вопрос, прошло более 10 лет. Сомнительно, что автор все еще ищет ответ, но, возможно, это будет полезно другим?
Вопрос несколько неопределен в отношении того, следует ли мониторить конкретную файловую систему – или любую файловую систему, но, возможно, инструмент findmnt
может помочь. У findmnt
есть встроенная опция --poll
, которая следит за файлом /proc/self/mountinfo
на наличие определенных изменений. Все необходимые детали можно найти в man findmnt
, но, возможно, лучший способ продемонстрировать его работу – это краткий пример:
Пример использования опции --poll
в findmnt
:
Предположим, у вас есть сетевой том по адресу /mnt/SynologyNAS/music_share
, и вы хотите быть уведомлены, когда он монтируется – или размонтируется. Вы можете запустить findmnt
как фоновой процесс:
$ cd
~ $ nohup findmnt --poll=umount,mount --mountpoint /mnt/SynologyNAS/music_share &
[1] 7118
~ $ nohup: игнорирование ввода и добавление вывода в 'nohup.out'
~ $
… продолжая пример/эксперимент, выполните umount
, а затем mount
на заданной точке монтирования:
~ $ sudo umount /mnt/SynologyNAS/music_share
~ $ sudo mount -a
… и tail
файла nohup.out
:
~ $ tail -f nohup.out
ACTION TARGET SOURCE FSTYPE OPTIONS
umount /mnt/SynologyNAS/music_share //SynologyNAS-1/music cifs rw,relatime,vers=3.1.1,cache=strict,username=pi,uid=1000,forceuid,gid=1000,forcegid,addr=192.168.1.244,file_mode=0644,dir_mode=0755,soft,nounix,serverino,mapposix,reparse=nfs,rsize=4194304,wsize=4194304,bsize=1048576,retrans=1,echo_interval=60,actimeo=1,closetimeo=1
mount /mnt/SynologyNAS/music_share //SynologyNAS-1/music cifs rw,relatime,vers=3.1.1,cache=strict,username=pi,uid=1000,forceuid,gid=1000,forcegid,addr=192.168.1.244,file_mode=0644,dir_mode=0755,soft,nounix,serverino,mapposix,reparse=nfs,rsize=4194304,wsize=4194304,bsize=1048576,retrans=1,echo_interval=60,actimeo=1,closetimeo=1
Ответ или решение
Для того чтобы получить имя последней смонтированной или размонтированной файловой системы в Linux, можно использовать несколько подходов. Вот один из наиболее эффективных способов с использованием утилиты findmnt
, которая была представлена как решение в вопросе.
Использование findmnt с опцией –poll
Команда findmnt
предоставляет возможность мониторинга изменений в файловых системах с помощью опции --poll
. Это позволяет отслеживать операции монтирования и размонтирования.
Пример
- Запустите
findmnt
в фоновом режиме с указанием точки монтирования, которую вы хотите отслеживать. Используйте опцию--poll
, указав интересующие события (например,mount
иumount
):
nohup findmnt --poll=umount,mount --mountpoint /путь/к/вашей/точке/монтажа &
Замените /путь/к/вашей/точке/монтажа
на фактический путь к точке монтирования, которую вы хотите отслеживать. Используйте &
для отправки процесса в фон.
- Выполните монтирование или размонтирование:
sudo umount /путь/к/вашей/точке/монтажа
sudo mount -a
- Проверьте результаты. Вывод будет записан в файл
nohup.out
, и вы можете использовать командуtail
для получения информации о последних действиях:
tail -f nohup.out
Вывод
Когда вы выполните размонтирование или монтирование, findmnt
выведет информацию о последних действиях, включая название источника (filesystem), целевой путь и параметры, связанные с файловой системой.
Альтернативный подход
Если требуется более низкоуровневое решение, можно мониторить файл /proc/mounts
непосредственно. Вот основные шаги:
- Читайте файл
/proc/mounts
или/etc/mtab
для получения списка смонтированных файловых систем. - Сравните текущий список с предыдущим, чтобы определить, есть ли изменения.
- Если найдены изменения, используйте
last mount/unmount
для выявления последней операции:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mntent.h>
void get_last_mount_info() {
FILE *fp;
struct mntent *mnt;
char *last_mount = NULL;
fp = setmntent("/proc/mounts", "r");
if (fp == NULL) {
perror("setmntent");
return;
}
while ((mnt = getmntent(fp)) != NULL) {
last_mount = mnt->mnt_dir; // сохраняем последнее найденное
}
endmntent(fp);
if (last_mount) {
printf("Последняя смонтированная файловая система: %s\n", last_mount);
} else {
printf("Нет смонтированных файловых систем.\n");
}
}
Заключение
Команда findmnt
с опцией --poll
является наиболее удобным и простым способом отслеживания изменений монтирования и размонтирования файловых систем. Однако, если требуется более глубинный контроль, можно использовать подход с чтением /proc/mounts
. Выбор подхода зависит от конкретных требований вашего приложения и уровня контроля, который вам необходим.