Come ho potuto rilevare quando una directory è montato con inotify?
Domanda
sto usando Linux Inotify per rilevare eventi FS sul mio programma.
Come potrei essere avvisato quando un dispositivo è montato su una directory monitorata?
Soluzione
Non credo che si può fare con inotify
. Ecco il metodo però:
- uevent dal kernel tramite un il socket netlink e filtrare quelli in cui non è
"ACTION"
"mount"
. - Leggere e analizzare
"/proc/mounts"
quando si ottiene un evento con un'azione"mount"
. - Trova un record per un punto di montaggio con il dispositivo che è stato appena montato e filtrare fuori se non è la directory che si sta guardando.
Altri suggerimenti
Modifica Aggiorna per essere inferiore a 5 anni obsoleto
Se siete su qualsiasi cosa, ma il più antico dei sistemi, libudev è ciò che si vuole per il primo passo.
Se siete su qualcosa da questo decennio, udisks farà tutto questo anche per te. Avresti bisogno di guardare il org.Freedesktop.DBus.ObjectManager interfaccia su / org / freedesktop / UDisks2 per vedere quando nuova filesystem alzare.
Nei moderni sistemi Linux / etc / mtab spesso punta a / proc / self / mounts:
$ ls -l /etc/mtab
lrwxrwxrwx 1 root root 12 Sep 5 2013 /etc/mtab -> /proc/mounts
$ ls -l /proc/mounts
lrwxrwxrwx 1 root root 11 Jul 10 14:56 /proc/mounts -> self/mounts
proc (5) manpage dice che don' t davvero bisogno di usare inotify per questo file, è pollable:
Dalla versione del kernel 2.6.15, questo file è pollable: dopo aver aperto il file per la lettura, un cambiamento in questo file (vale a dire, montare un file system o smontare) cause selezionare (2) per contrassegnare il descrittore di file come leggibili, e sondaggio (2) e epoll_wait (2) contrassegnare il file come avere una condizione di errore.
È stato chiesti perché inotify non funziona su / etc / mtab e abbiamo trovato questo manpage.
Se non ti dispiace un sacco di falsi allarmi, si potrebbe essere in grado di guardare per close_nowrite
su /etc/fstab
. . Guardando /etc/mtab
, /proc/mounts
, ecc non funziona per me.
inotify solo si racconta smonta, e uevent non si racconta montaggio / smontaggio.
Il modo per farlo è quello di sondaggio su / proc / mounts, leggere nei contenuti, e tenere traccia dei monti che hai visto, e poi rianalizzare quando il sondaggio si sveglia. Il sondaggio si risveglierà su ERR / PRI quando un qualsiasi file system è montato o smontato.
#include <fcntl.h>
#include <errno.h>
#include <poll.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
int fd;
struct pollfd ev;
int ret;
ssize_t bytesread;
char buf[8192];
fd = open("/proc/mounts", O_RDONLY);
printf("########################################\n");
while ((bytesread = read(fd, buf, sizeof(buf))) > 0)
write(1, buf, bytesread);
do {
ev.events = POLLERR | POLLPRI;
ev.fd = fd;
ev.revents = 0;
ret = poll(&ev, 1, -1);
lseek(fd, 0, SEEK_SET);
if (ev.revents & POLLERR) {
printf("########################################\n");
while ((bytesread = read(fd, buf, sizeof(buf))) > 0)
write(1, buf, bytesread);
}
} while (ret >= 0);
close(fd);
return 0;
}
Il codice di cui sopra si limita a stampare i punti di montaggio all'avvio, e poi su qualsiasi montaggio / smontaggio. E 'a voi per "diff" loro di scoprire cosa ma ho aggiunto / rimosso.
Nota, tutte queste tecniche è stato sia instabile e / o rotti nelle versioni precedenti di Linux. Tutto ottenuto stabile intorno alla fine del Linux 2.6.35 (o forse un po 'prima).