Как получить имя последней смонтированной/размонтированной файловой системы

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

Я знаю, что могу мониторить (используя poll или select) файлы /proc/mount или /etc/mtab и узнать КОНЕЧНО, когда файловая система монтируется или размонтируется. Также я могу использовать getmntent для получения списка смонтированных файловых систем.

Мое приложение предназначено для мониторинга смонтированной файловой системы и уведомления о любых изменениях (монтировании или размонтировании).

Мое решение:

  1. Обнаружить изменения в /proc/mounts.
  2. Получить все текущие смонтированные файловые системы с помощью getmntent.
  3. Сравнить полученный список с предыдущим списком.
  4. Обработать разницу.

Но мне нужно знать, есть ли способ узнать последнюю смонтированную файловую систему при опросе из /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. Это позволяет отслеживать операции монтирования и размонтирования.

Пример

  1. Запустите findmnt в фоновом режиме с указанием точки монтирования, которую вы хотите отслеживать. Используйте опцию --poll, указав интересующие события (например, mount и umount):
nohup findmnt --poll=umount,mount --mountpoint /путь/к/вашей/точке/монтажа &

Замените /путь/к/вашей/точке/монтажа на фактический путь к точке монтирования, которую вы хотите отслеживать. Используйте & для отправки процесса в фон.

  1. Выполните монтирование или размонтирование:
sudo umount /путь/к/вашей/точке/монтажа
sudo mount -a
  1. Проверьте результаты. Вывод будет записан в файл nohup.out, и вы можете использовать команду tail для получения информации о последних действиях:
tail -f nohup.out

Вывод

Когда вы выполните размонтирование или монтирование, findmnt выведет информацию о последних действиях, включая название источника (filesystem), целевой путь и параметры, связанные с файловой системой.

Альтернативный подход

Если требуется более низкоуровневое решение, можно мониторить файл /proc/mounts непосредственно. Вот основные шаги:

  1. Читайте файл /proc/mounts или /etc/mtab для получения списка смонтированных файловых систем.
  2. Сравните текущий список с предыдущим, чтобы определить, есть ли изменения.
  3. Если найдены изменения, используйте 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. Выбор подхода зависит от конкретных требований вашего приложения и уровня контроля, который вам необходим.

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

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