2009-07-11 23 views

Respuesta

9

No creo que pueda hacerlo con inotify. Aquí está el método sin embargo:

  1. Leer uevents from kernel través de una toma Netlink y filtrar aquellos en los que no es "ACTION""mount".
  2. Read and parse "/proc/mounts" cuando obtiene un evento con una acción "mount".
  3. Busque un registro de un punto de montaje con el dispositivo que acaba de montar y fíltrela si no es el directorio que está mirando.
+0

La alternativa es poner un reloj 'inotify' en'/etc/mtab', y hacer el mismo tipo de análisis que en '/ proc/mounts'. Pero esto es mucho más frágil. –

+0

No estoy seguro de que existan acciones 'mount' de' uevent' en el núcleo ahora. Parece que fue [considerado como roto y eliminado] (https://lkml.org/lkml/2006/2/22/169). –

1

Si no te importa un montón de falsas alarmas, es posible que pueda mirar para close_nowrite en /etc/fstab. . Ver /etc/mtab, /proc/mounts, etc. no funciona para mí.

2

En los sistemas Linux modernos/etc/mtab menudo apunta a montajes/proc/self /:

$ 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 que usted realmente no necesita utilizar inotify para este archivo , es pollable:

Desde la versión 2.6.15 del kernel, este archivo es pollable: después de abrir el archivo para lectura, un cambio en este archivo (es decir, montar un sistema de archivos o desmonte) provoca seleccione (2) para marcar el descriptor de archivo como legible, y sonde (2) y epoll_wait (2) marque el archivo como si tuviera una condición de error.

Se preguntó por qué inotify no funciona en/etc/mtab y encontró esta página de manual.

1

inotify solo le informa sobre desmontajes, y uevents ya no le informa sobre montar/desmontar.

La manera de hacerlo es sondear en/proc/mounts, leer en los contenidos, hacer un seguimiento de los montajes que ha visto y luego volver a analizar cuándo se levanta el sondeo. La encuesta se activará en ERR/PRI cuando se monte o se monte cualquier sistema de archivos.

#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; 
} 

El código anterior simplemente imprime los puntos de montaje en el inicio, y luego en cualquier montaje/desmontaje.Depende de ti el "diff" para descubrir qué se agregó/eliminó.

Nota, todas estas técnicas han sido inestables y/o rotas en versiones anteriores de Linux. Todo se estabilizó al final de Linux 2.6.35 (o tal vez un poco antes).

Cuestiones relacionadas