2012-03-05 26 views
5

Hola, soy un novato en la programación del kernel. Estoy escribiendo un pequeño módulo de kernel que se basa en la plantilla de wrapfs para implementar un mecanismo de respaldo. Esto es puramente para aprender.almacenar algunos datos en la estructura inode

Estoy extendiendo wrapfs para que cuando se realiza una llamada de escritura, wrapfs transparente haga una copia de ese archivo en un directorio aparte y luego escriba en el archivo. Pero no quiero que cree una copia para cada llamada de escritura.

Un enfoque ingenuo podría ser verificar si existe algún archivo en ese directorio. Pero Creo que para cada comprobación de llamada esto podría ser una penalización severa.

También pude verificar la primera llamada de escritura y luego almacenar un valor para ese archivo específico usando el atributo private_data. Pero eso no se almacenaría en el disco . Entonces necesitaría verificar eso nuevamente.

También estaba pensando en hacer uso del tiempo de modificación. Podría guardar un tiempo de modificación de . Si el tiempo anterior de modificación es anterior a ese momento, entonces solo se crea una copia; de lo contrario, no haré nada. Intenté usar inode.i_mtime para esto, pero fue la hora modificada incluso antes de que se llamara a la escritura, también las aplicaciones pueden modificar ese tiempo.

Así que estaba pensando en almacenar algún valor en inode en el disco que indica que se ha creado o no la copia de seguridad . ¿Es eso posible? Cualquier otra sugerencia o enfoque son bienvenidos.

+2

Formatear su blob es muy largo para obtener su pregunta, incluso _read_. – sehe

Respuesta

0

Básicamente está diciendo que quiere hacer una capa de sistema de archivos virtual Copy-On-Write.

IMO, algunos de estos se han hecho, y sería más fácil implementarlos en el dominio del usuario (usando libfuse y el módulo de fusibles, por ejemplo). De esa manera, puede ser rey de su castillo y añadir los metadatos de cualquier manera que se siente es appriate:

  • Sólo tiene que añadir archivos (oculto) de metadatos a cada directorio
  • uso se extendió atributos POSIX (setfattr y amigos)
  • diablos, incluso se podría utilizar una base de datos SQLite

Si realmente insisten en hacer estas cosas en el núcleo, tendrá mucho más trabajo ya que el acceso a los metadatos de modo de núcleo se goind tomar mucho más esfuerzo (lo más probable es que quieras emular tu propia base de datos usando archivos mapeados de memoria para minimizar la cantidad de trabajo 'userland (estilo)' requerido y para hacerlo relativamente fácil para obtener atomicidad y confiabilidad derecho .


En How Everybody Gets File IO Wrong: see also here

+0

Gracias por su respuesta. Echaré un vistazo al uso de fusibles. Pero en realidad comencé a usar wrapfs. He cambiado el código de desvinculación para llamar el cambio de nombre en lugar de desvincularlo. Si algo pudiera hacer es manipular cualquier atributo de inodos de struct para satisfacer mis necesidades – gaurav

0

Se puede utilizar en lugar de atimemtime. En ese caso, la configuración del indicador S_NOATIME en el inodo evita que se actualice (consulte la función touch_atime() en inode.c). Lo único que necesitará es montar su sistema de archivos con la opción noatime.

+0

@liya: ¿Por qué no podría usar mtime? Pero el problema con el uso de atime es que se modificará si se lee el archivo, por lo que sería un problema con este enfoque. – gaurav

+0

@gaurav: con la opción de montaje 'noatime' no hay una actualización' atime' en el acceso. –

+0

Ohh Veo una buena opción que veo, pero no veo por qué atime funciona y mtime no. ¿También el tiempo de FS inferior tampoco cambiará? – gaurav

Cuestiones relacionadas