T12. Estudio de FUSE y NTFS-3G Diseño y Estructura Interna de un Sistema Operativo

Cu... 10 de marzo de 2008

Índice

1. Introducción 1

2. FUSE: Filesystems in Userspace1 2.1. Introducción...... 1 2.2. Funcionamiento...... 3 2.3. Seguridad...... 4 2.4. Instalación, configuración y uso...... 6 2.5. Sistemas de ficheros FUSE...... 7 2.6. Implementación de sistemas de ficheros...... 8 2.7. Alternativas...... 9 2.8. Conclusiones...... 9

3. NTFS-3G 10 3.1. Introducción a NTFS...... 10 3.2. NTFS-3G...... 10 3.3. Instalación y Uso...... 11 3.4. Calidad...... 12 3.5. Rendimiento...... 12 3.6. Alternativas...... 13

1. Introducción

Introducción FUSE (Filesystems in Userspace) Permite desarrollar y montar sistemas de ficheros que se ejecutan en espacio de usuario

NTFS-3G Driver para el sistema de ficheros NTFS para sistemas , implementado con FUSE. Permite lectura y escritura con seguridad

1 2. FUSE: Filesystems in Userspace

2.1. Introducción Introducción En la mayoría de los sistemas operativos, la lógica de los sistemas de ficheros forma parte del núcleo, y suele implementarse como módulos del mismo

Introducción: ¿Qué es FUSE? Sistemas de ficheros en espacio de usuario Proporcionan los datos y meta datos mediante un proceso en espacio de usuario corriente El sistema de ficheros se accede utilizando la interfaz del kernel: necesario un módulo en el kernel realice la comunicación entre las aplicaciones y el proceso que implementa la lógica del sistema de ficheros

FUSE (Filesystems in Userspace) Representa todo lo necesario para la implementación (framework) y manipulación de SSFF en espacio de usuario: Un módulo del kernel, comunicación entre sistema de ficheros y aplicaciones Una aplicación para realizar el montaje (fusermount) Una librería, libfuse, que permite la implementación de sistemas de ficheros FUSE

Introducción: ¿Qué es FUSE? Características de FUSE Sistemas de ficheros ejecutándose en espacio de usuario Posibilidad de que usuarios sin privilegios pueda montar sistemas de ficheros: Sin estar especificado en el fichero /etc/fstab • Sin pérdida de seguridad para el sistema, aunque limitable como veremos • Librería con API sencilla Instalación sencilla (no necesita parchear ni recompilar el kernel) La interfaz entre el espacio de usuario y el kernel es muy eficiente Funciona con los Kernels de 2.4.X y 2.6.X Muy estable

2 Introducción: ¿Qué es FUSE? Características de FUSE (continuación)

Disponible para: Linux, FreeBSD, NetBSD, OpenSolaris y Mac OS X.

Introducido en oficialmente en el kernel de Linux en la versión 2.6.14.

Introducción: ¿Para qué puede servir FUSE?

Múltiples usos:

Sistemas de ficheros locales y remotos • Sistemas de ficheros que representen estado: al estilo sysfs o proc • Dar abstracción de sistema de ficheros: sensores •

Ejemplo: sshfs Posibilidad de acceder transparentemente a ficheros remotos almacenados en un servidor con acceso ssh, montándolo en el sistema de ficheros lógico, sin necesidad de ser el root

2.2. Funcionamiento Funcionamiento

hello /tmp/fuse 6

ls -l /tmp/fuse libfuse 6

glibc glibc Espacio de usuario

Kernel  ? ? - FUSE

... VFS NFS

EXT3

Funcionamiento

El sistema de ficheros se ejecuta como demonio en espacio de usuario

La comunicación entre el sistema de ficheros y el módulo se realiza mediante un descriptor de fichero especial que se obtiene abriendo el dispositivo /dev/fuse

Abierta mientras el demonio está en ejecución o hasta que se desmonta • Este dispositivo puede ser abierto múltiples veces: múltiples montajes •

3 Funcionamiento Ejecución del SF

1. Obtiene el descriptor de fichero especial abriendo /dev/fuse

2. Ejecuta fusermount para realizar el montaje

3. Se queda ejecutando un bucle que escucha peticiones desde el módulo del núcleo a través del descriptor de fichero

fusermount:

Marcado con suid para que usuarios sin privilegios puedan realizar montajes, ya que la llamada al • sistema mount es una llamada privilegiada 2.2. ¾Cómo funciona FUSE? Módulo del núcleo. Consta de 2 partes:

1. La que responde a las peticiones2.2.1. Tipos al fichero de sistemas de dispositivo de cheros/dev/fuse 2. La que implementa las llamadasHay dos al tipos sistema de sistemas de ficheros de cheros que le que remite se pueden el VFS montar con FUSE: fuse Esta la formal usual de montar sistemas de cheros con FUSE. El primer argumento de Funcionamiento la llamada al sistema mount puede contener una cadena arbitraria que no es interpretada por el kernel. sshfs es un ejemplo de este tipo de sistemas de cheros, dónde el primer Tipos de sistemas de ficheros FUSEargumento contendría el host remoto, el usuario, el puerto a utilizar en la conexión y el directorio a montar. fuse mount Tipo más común. El núcleofuseblk ignoraEl sistema el primera de cheros argumento está basado de en la dispositivos llamada de bloques.. Ejemplo: El primer argumento sshfs de la llamada al sistema mount es interpretado por el kernel como el nombre del dispositivo, lo que hace que no se pueda montar el mismo dispositivo más de una vez. NTFS-3G es un fuseblk Sistemas de ficheros basadossistema de en cheros dispositivos de este tipo. de bloques. El primer argumento de la llamada mount es interpretado por el nombre como el nombre del dispositivo (evitar múltiples Estos dos tipos de sistemas de cheros los podemos ver registrados, estando el módulo del montajes, ...). Ejemplo: NTFS-3Gnúcleo de FUSE cargado,en el chero /proc/lesystems :

asenac@asus:~$ cat /proc/filesystems ... nodev fuse fuseblk ... asenac@asus:~$

Se puede ver que los sistemas de cheros de tipo fuse no necesitan de dispositivo.

2.2.2. Montando un sistema de cheros 2.3. Seguridad Un sistema de cheros en FUSE se ejecuta como un demonio en espacio de usuario. El módulo Consideraciones de SeguridadFUSE del kernel y el demonio, que usa la librería de FUSE, se comunican mediante un descriptor de chero especial, el cual se obtiene abriendo /dev/fuse . Este chero puede ser abierto múltiples Si usuarios sin privilegiosveces, tienen y el la descriptor capacidad de chero de realizar obtenido montajes se pasa a la de llamada sistemas al sistema de ficheros,mount , para relacionar el descriptor con el sistema de cheros montado. Esta comunicación se mantiene abierta mientras FUSE debe asegurar que: el demonio está en ejecución, o hasta que el sistema de cheros es desmontado. Como la llamada al sistema mount() es una operación privilegiada, para que usuarios sin No pueda ser usada paraprivilegios poner puedan en peligro montar el sistemas sistema de cheros es necesaria la aplicación fusermount , que se • El autor del montajeinstala no pueda marcada sercapaz con siud de. obtener privilegios elevados, con la ayuda de • La gura 2.4 muestra la secuencia de llamadas simplicada al montar un nuevo sistema un sistema de ficherosde montado. cheros basado en FUSE. La aplicación del sistema de cheros, en principio ejecutándose El autor del montajeen no primer pueda plano, tener llama acceso a la funciónilegítimofuse_main a informaciónde la librería de los de FUSE. procesos Esta de función crea un • par de conectores ( socket tipo UNIX), mediante socketpair , para la comunicación entre los dos otros usuarios o del súperprocesos usuario. resultantes del fork . El proceso padre resultante (con PID 0), le pasa a fusermount en la El autor del montajevariable no pueda de entorno ser capazFUSE_COMMFD_ENV de inducir un comportamientoel conector para indeseable comunicarse de con los el proceso hijo. • Este proceso padre, al ejecutar fusermount (recordemos, marcado con suid ), puede realizar la procesos de otros usuariosllamada o al del sistema súpermount usuario. También puede abrir el chero /dev/fuse , y el descriptor de chero obtenido se lo pasa al proceso hijo mediante el conector creado antes (función send_fd ). Por último, termina su ejecución.4 Por su parte, el proceso hijo (PID 1) recibe el descriptor de chero enviado por el padre ( receive_fd ) y pasa a ejecutarse en segundo plano ( daemon ).

8 2.8. Ejemplos

2.8.2. Probando la seguridad en FUSE Como se ha comentado en la sección 2.3 , la primera y más obvia de las consideraciones de seguridad que FUSE ha de tener en cuenta es que la capacidad de poder montar sistemas de cheros no pueda ser usada por un usuario sin privilegios para poner en peligro el sistema. Una de las formas en las que un usuario podría poner en peligro el sistema sería poder ejecutar aplicacio- nes marcadas con siud propiedad de otro usuario en el nuevo sistema de cheros montado. Este ejemplo es una demostración de que FUSE tiene en cuenta estas consideraciones de seguridad, no teniendo en cuenta las aplicaciones marcadas con suid cuando es ejecutada. Destacamos así la seguridad como uno de los puntos fuertes de FUSE. Para ello, realizamos una pequeña aplicación que realiza una operación que solo el root podría efectuar. En este caso cambiar los permisos y marcar con suid un archivo del sistema, como por ejemplo la aplicación shutdown . El código de esta pequeña aplicación es el siguiente:

chmod.c Consideraciones de Seguridad #include stdio.h #include sys/types.h Ejemplo de uso mal intencionado #include sys/stat.h

5 int main( int argc, char argv[]) { ∗ if (chmod( "/sbin/shutdown" , S_ISUID 0777)) printf( "No se pudieron cambiar| los permisos n" ); } \ Tenemos el siguiente programa: Este programa imprimirá por pantalla un mensaje si no consigue cambiar los permisos del archivo /sbin/shutdown . Lo compilamos e2.8. introducimos Ejemplos en unA continuación, sistema de realizamos ficheros unas FUSE, modicaciones propiedad mínimas del del ejemplo usuario anteriorroot paray que el marcado con suid. contenido del archivo hello sea el programa anterior compilado y marcado con suid . Para ello, .read =compilamos hello_read, el programa anterior, lo codicamos en hexadecimal utilizando alguna aplicación }; como hexcat y lo introducimos como contenido del archivo que contendrá nuestro sistema de Sin tener privilegios, lo montamos,cheros, y ejecutamos como se muestra el en programa las líneas 21 anterior. a 24 del siguiente código 5. 100 int main( int argc, char argv[])Para marcar el archivo de nuestro sistema de cheros con suid modicamos la línea 31 del { ejemplo anterior (línea 37 del código siguiente), como se muestra: return fuse_main(argc, argv, &hello_oper); Consideraciones de Seguridad} 37 stbuf st_mode = S_IFREG S_ISUID 0777;

Ejemplo de uso mal intencionadoSi compilamos y ejecutamosEl código el código resultante anterior de obtendremosnuestro nuevo lo sistema siguiente: de cheros se lista a continuación:

asenac@toshiba:~/fuse/ejemplos$ make shutdown gcc -Wall `pkg-config fuse --cflags --libs` shutdown.cshutdown.c -o shutdown asenac@toshiba:~/fuse/ejemplos$ mkdir /tmp/fuse asenac@toshiba:~/fuse/ejemplos$/ ./shutdown /tmp/fuse/ asenac@toshiba:~/fuse/ejemplos$Modicacion ls -l de /tmp/fuse/ hello.c total 0 -rwsrwxrwx 1 root root5Por 6810 no introducir 1970-01-01 páginas 01:00 llenas hello de números hexadecimales se omite aquí el contenido de los 6K del programa. asenac@toshiba:~/fuse/ejemplos$ /tmp/fuse/hello No se pudieron cambiar los permisos 24 asenac@toshiba:~/fuse/ejemplos$

Como vemos, pese a aparecer el archivo hello como ejecutable y con suid , al ejecutarlo no se hace efectivo el cambio de usuario y no podemos obtener privilegios de los que no disponemos; Como vemos, peseen a este estar caso, cambiarmarcado los permisos con suid de un, archivo este nopropiedad se hace del root efectivo. al ejecutar el programa.

Esta es una de las2.8.3. consideraciones Ejemplo de sistema de seguridad de cheros obvias FUSE que en Python FUSE tiene en cuenta. A continuación se muestra el mismo ejemplo visto anteriormente implementado en Python .

Consideraciones de Seguridad hello.py Posibles usos mal intencionados#!/usr/bin/env a python tener en cuenta # Copyright (C) 2006 Andrew Straw [email protected] El autor del montaje# podría obtener elevados privilegios: 5 # This program can be distributed under the terms of the GNU LGPL. # See the le COPYING. 1. creando un sistema# de ficheros que contenga un archivo de dispositivo, y después abriendo el dispositivo, import os, stat, errno 2. creando un10 sistema# pull in some despaghetti ficheros to make que this contenga stu work without una fuse aplicaciónpy being installed marcada con suid o sgid, y try: ejecutando esa aplicación.import _nd_fuse_parts except ImportError: pass Si otro usuario está15 import accediendofuse a archivos o directorios en el sistema de ficheros, el demonio puede grabar la secuencia exacta de las operaciones realizadas. 27 Múltiples formas por las que el autor del montaje puede inducir un comportamiento indeseado en los procesos de otros usuarios.

5 Consideraciones de Seguridad Soluciones adoptadas por FUSE

Ficheros de dispositivos o con suid se ignoran si el autor del montaje es un usuario sin privile- gios.

No se puede montar sobre directorios sobre los que no se tengan privilegios.

Un usuario no puede acceder a sistemas de ficheros montados por otro usuario. Esta medida se puede relajar con la opción de configuración users_allow_other.

Adicionalmente:

Grupo fuse. Sólo usuarios del grupo pueden ejecutar fusermount. Ej: Ubuntu

2.4. Instalación, configuración y uso Instalación

Disponible como paquetes para algunas distribuciones.

Ej: En Ubuntu hay tres paquetes disponibles: • fuse-utils: Contiene la aplicación fusermount ◦ libfuse2: Librería de FUSE ◦ libfuse-dev: Cabeceras para el desarrollo de SSFF FUSE ◦ Instalados por defecto a partir de la versión 7.10 ◦ Bajando y compilando el código con: configure, make y make install

Configuración: /etc/fuse.conf

Actualmente, sólo dos opciones (una por línea):

user_allow_other Esta opción permite que los usuarios puedan utilizar la opción de mon- • taje allow_other, que permite a cualquier usuario acceder al sistema de ficheros montado con esta opción. Recordemos que esta era una limitación de seguridad impuesta por de- fecto. mount_max=N Limita el número máximo de montajes realizados mediante FUSE. • Uso

Un sistema de ficheros FUSE es un proceso corriente = ejecutado como una aplicación nor- mal: ⇒

Montar: ssff punto-de-montaje [-o opciones-de-montaje] • Desmontar: fusermount -u punto-de-montaje • Opciones de montaje:

6 fd=N Indica el descriptor de fichero empleado para la comunicación entre el proceso del • sistema de ficheros en espacio de usuario y el kernel. Debe ser obtenido abriendo el dis- positivo de FUSE (/dev/fuse). rootmode=M Permisos de la raíz del sistema de ficheros en octal. • user_id=N El uid del propietario del montaje. • group_id=N El gid del propietario del montajes. • Uso

Opciones de montaje (continuación):

default_permissions Activa la comprobación de permisos según las restricciones de los • archivos. allow_other Esta opción relaja la medida de seguridad que restringe el acceso al sistema • de ficheros montado por un usuario a otros usuarios. Esta opción, por defecto, solo puede utilizarla el root, pero puede eliminarse la restricción mediante la opción de configuración user_allow_other. max_read=N Tamaño máximo de las operaciones de lectura. • blksize=N Tamaño de bloque del sistema de ficheros. Sólo con sistemas de ficheros de • tipo fuseblk.

2.5. Sistemas de ficheros FUSE Sistemas de ficheros FUSE

NTFS-3G Controlador eficiente para NTFS que permite lectura y escritura. Existen otras im- plementaciones del sistema de ficheros NTFS basadas en FUSE.

EncFS Sistema de ficheros encriptado en espacio de usuario.

OWFS (One Wire ) Permite ver sensores, botones y chips de memoria como un sistema de ficheros. Los dispositivos se incluyen en el directorio dinámicamente, y sus propie- dades, como temperatura, se obtienen leyendo un archivo.

SshFs Sistema de ficheros basado en el protocolo SSH File Transfer Protocol.

Sistemas de ficheros FUSE

FuseIso Módulo para montar imágenes ISO9660. Permite montar imágenes de CD al estilo de las unidades virtuales de utilidades Windows.

FuseSmb Sistema de ficheros cliente para el protocolo SMB.

FatFuse Implementación del sistema de ficheros FAT en espacio de usuario. Actualmente solo permite lectura.

Gnome VFS2 Fuse Permite montar en el sistema de ficheros virtual de Linux rutas del siste- ma de ficheros virtual de Gnome (Gnomo VFS2), haciendo accesibles los ficheros a cualquier aplicación, aunque no implemente un cliente de Gnome VFS. (Ej: SSH, FTP, SAMBA)

7 Sistemas de ficheros FUSE

FUSEPod Sistema de ficheros virtual para el acceso a dispositivos IPod.

MysqlFs Sistema de ficheros que almacena los archivos en bases de datos MySql.

GitFs Proporciona acceso de lectura a repositorios GIT, mostrándolos como una estructura de ficheros y directorios.

CvsFs Muestra el contenido de repositorios de código CVS como un sistema de ficheros.

XmlRpcFs Permite la lectura y escritura de directorios remotos mediante XML-RPC.

2.6. Implementación de sistemas de ficheros Implementación de sistemas de ficheros

FUSE proporciona librería en C. Desarrollo principalmente en C

También hay disponibles proyectos que permiten el desarrollo de sistemas de ficheros FUSE en Ruby, Perl, Phyton, C# o Java

libfusefs-ruby • libfuse-perl • python-fuse • FUSE-J • ... • Implementación de SSFF en C

Un sistema de ficheros FUSE escrito en C consta básicamente de:

Una estructura de tipo fuse_operations que relaciona las distintas peticiones que se reali- • zan sobre el sistema de ficheros con la función que implementa a cada una de ellas. Una llamada al bucle de FUSE (fuse_loop ó fuse_main) que escucha las peticiones que • envía el módulo del núcleo a través del descriptor de fichero especial.

Implementación de SSFF en C

struct fuse_operations { int ( getattr) (const char , struct stat ); int (∗readlink) (const char ∗ , char , size_t);∗ int (∗mknod) (const char ∗, mode_t,∗ dev_t); ∗ ∗ 5 int ( mkdir) (const char , mode_t); int (∗unlink) (const char ∗ ); int (∗rmdir) (const char ∗); int (∗symlink) (const char∗ , const char ); int (∗rename) (const char ∗, const char ∗); ∗ ∗ ∗ 10 int ( link) (const char , const char ); int (∗chmod) (const char∗ , mode_t); ∗ int (∗chown) (const char ∗, uid_t, gid_t); int (∗truncate) (const char ∗ , off_t); int (∗open) (const char , ∗struct fuse_file_info ); ∗ ∗ ∗ 15 int ( read) (const char , char , size_t, off_t, struct fuse_file_info ); int (∗write) (const char ∗ , const ∗char , size_t, off_t, ∗ ∗ ∗ struct fuse_file_info∗ ); int ( statfs) (const char , struct statvfs ); ∗ int (∗flush) (const char ∗, struct fuse_file_info∗ ); ∗ ∗ ∗ 20 int ( release) (const char , struct fuse_file_info ); int (∗fsync) (const char ,∗ int, struct fuse_file_info∗ ); int (∗setxattr) (const char ∗ , const char , const char∗ , size_t, int); int (∗getxattr) (const char ∗, const char ∗, char , size_t);∗ ∗ ∗ ∗ ∗

8 int ( listxattr) (const char , char , size_t); ∗ ∗ ∗ 25 int ( removexattr) (const char , const char ); int (∗opendir) (const char , ∗struct fuse_file_info∗ ); int (∗readdir) (const char ∗, void , fuse_fill_dir_t,∗ off_t, ∗ ∗ struct∗ fuse_file_info ); int ( releasedir) (const char , struct fuse_file_info ∗ ); ∗ ∗ ∗ 30 int ( fsyncdir) (const char , int, struct fuse_file_info ); void ∗ ( init) (struct fuse_conn_info∗ conn); ∗ void (∗ destroy)∗ (void ); 2.7.∗ ¾Cómo implementar un sistema de cheros con FUSE? int ( access)∗ (const char∗ , int); int (∗create) (const char ∗, mode_t, struct fuse_file_info ); ∗ ∗ ∗ 35 int ( ftruncate) (const char , off_t,Además,struct fuse_file_info el cuerpo del); método principal de nuestro programa debe crear la instancia del int (∗fgetattr) (const char ,∗ structsistemastat de, cheros,struct fuse_file_info y hacer∗ la llamada); al método main del mismo, como se hacía en los sistemas ∗ ∗ ∗ ∗ int ( lock) (const char , structdefuse_file_info cheros implementados, int cmd, en C, heredado de la clase FUSE. ∗ ∗struct flock ); ∗ int ( utimens) (const char , const Comostruct∗ setimespec ha visto, tv[2]); a la hora de programar, se trata casi unicamente de un cambio de sintáxis ∗ ∗ 40 int ( bmap) (const char , size_ty de blocksize, la introducción uint64_t deidx); la orientación a objetos; pero las llamadas al sistema de cheros, así como }; ∗ ∗ la ejecución de un bucle∗ que recibe las peticiones del módulo del kernel en la función main de FUSE, es igual para C y Python . En la sección 2.8.3 se muestra un sistema de cheros de ejemplo implementado en Python . Depurando un SSFF 2.7.3. Depurando un sistema de cheros Con FUSE podemos depurar nuestro sistema-d de cheros de manera sencilla, para identicar Montando el sistemaposibles de errores ficheros cometidos con en la la implementación. opción Basta, lacon aplicación ejecutar el sistema se ejecuta de cheros en con la primer plano mostrando por pantallaopción -d información(debug ), que hará sobre que se ejecute las peticiones en primer plano realizadas mostrando por al pantalla sistema la secuencia de ficheros y su de llamadas realizadas sobre el mismo. Podemos así, monitorizar la ejecución del sistema de resultado: cheros. Por ejemplo, si ejecutamos el sistema de cheros de ejemplo con esta opción obtendremos la siguiente información de inicialiación del sistema de cheros:

asenac@asus:~/tmp/fusentfs3g/ejemplos$ ./hello /tmp/fuse/ -d unique: 1, opcode: INIT (26), nodeid: 0, insize: 56 INIT: 7.8 flags=0x00000003 max_readahead=0x00020000 INIT: 7.8 flags=0x00000000 max_readahead=0x00020000 max_write=0x00020000 unique: 1, error: 0 (Success), outsize: 40 unique: 2, opcode: GETATTR (3), nodeid: 1, insize: 40 unique: 2, error: 0 (Success), outsize: 112 unique: 3, opcode: ACCESS (34), nodeid: 1, insize: 48 ACCESS / 04 unique: 3, error: -38 (Function not implemented), outsize: 16

Ahora si realizamos un listado del directorio donde ha sido montado el sistema de cheros ( ls /tmp/fuse ), obtendremos la siguiente información:

unique: 4, opcode: GETATTR (3), nodeid: 1, insize: 40 unique: 4, error: 0 (Success), outsize: 112 2.7. Alternativas unique: 5, opcode: GETATTR (3), nodeid: 1, insize: 40 unique: 5, error: 0 (Success), outsize: 112 Alternativas a FUSE unique: 6, opcode: OPENDIR (27), nodeid: 1, insize: 48 unique: 6, error: 0 (Success), outsize: 32 unique: 7, opcode: GETATTR (3), nodeid: 1, insize: 40 Otros sistemas de ficherosunique: en espacio 7, error: de 0 usuario (Success), outsize: 112 unique: 8, opcode: READDIR (28), nodeid: 1, insize: 64 LUFS: idea muy similarunique: a FUSE 8, error: 0 (Success), outsize: 112 AVFS: permite montar archivos empaquetas o comprimidos,20 y sistemas de ficheros remotos Gnome VFS: sistemas de ficheros remotos accesibles a aplicaciones de Gnome UserFS: procesos de usuario como sistemas de ficheros

2.8. Conclusiones Conclusiones

Sistemas de ficheros en espacio de usuario idea de micronúcleo: ≈ Servicios se construyen sobre el micronúcleo y se ejecutan en espacio de usuario, siendo • el micronúcleo el que implementa la comunicación entre cliente y servicio.

9 No es necesario incrementar el tamaño del núcleo para añadir nuevos sistemas de ficheros.

Seguridad es un requisito indispensable a tener en cuenta al permitir que usuarios sin privilegios puedan montar sistemas de ficheros con FUSE.

FUSE reduce considerablemente la complejidad de la implementación de nuevos sistemas de ficheros. Programación a nivel de núcleo mucho más compleja.

Rápido crecimiento = sistema de ficheros virtual ⇒ 3. NTFS-3G

3.1. Introducción a NTFS Introducción: NTFS

Sistemas operativos Microsoft, a partir del NT

Nombres largos en Unicode, ficheros largos, compresión transparente, cifrado, buen rendimien- to

Bloque lógico: direcciones de 8 bytes, tamaño entere 512 bytes y 64 Kbytes

Fichero = conjunto de atributos. Al menos dos: nombre y flujo de datos principal o anónimo Varios flujos de datos por fichero, con nombre, accesibles individualmente mediante nombre- fichero:nombre-flujo

MFT (Master File Table): estructura de datos principal, sucesión lineal de registros de 1 Kbyte

Master File Table

Cada entrada representa un archivo. Si es muy grande o fragmentado múltiples registros en la tabla.

Directorios pequeños = ficheros con lista desordenada de entradas. Directorios grandes = ár- boles B+

3.2. NTFS-3G NTFS-3G

Objetivo del proyecto: dar soporte fiable a diversos SSOO

Driver para Linux, FreeBSD, NetBSD y Mac OS X, para NTFS

Permite lectura y escritura con seguridad: No soporta ficheros encriptados, y sólo lectura en comprimidos

Soporta la mayoría de operaciones POSIX, excepto listas de acceso

Implementado mediante FUSE (tipo fuseblk) = SF en espacio de usuario ⇒ 10 No necesita módulo del kernel adicional, a parte del de FUSE

Consta de:

Librería libntfs-3g con la lógica del sistema de ficheros NTFS • Aplicación -3g implementa el sistema de ficheros FUSE: estructura fuse_operations y • llamada a fuse_loop

NTFS-3G

3.3. Instalación y Uso Instalación

Disponible como paquete para muchas distribuciones: alrededor de 100 distribuciones de Linux y FreeBSD que incluyen NTFS-3G como paquete binario para una fácil instalación

Ubuntu 7.10 lo incluye como controlador por defecto para NTFS

Para otras distribuciones o para actualización a la última versión descargable y compilable con configure, make y sudo make install.

La instalación por defecto no permite montar a usuarios sin privilegios.

Uso Montar

Ejecutando: ntfs-3g /dev/sda1 /mnt/windows

o bien: mount -t ntfs-3g /dev/sda1 /mnt/windows

o añadiendo en /etc/fstab: /dev/sda1 /mnt/windows ntfs-3g defaults 0 0

Desmontar

Ejecutando: umount /mnt/windows

o bien: fusermount -u /mnt/windows

11 Opciones (-o)

Opciones típicas: uid, gid, fmask, dmask, umask, ro

Opciones comunes de todos los SSFF FUSE.

Otras opciones relevantes:

locale: idioma • show_sys_files: hace visibles los metadatos de NTFS • streams_interface: configura el acceso a los flujos de datos alternativos • silent: ignora operaciones chown y chmod • 3.4. Calidad Calidad Fiabilidad es el principal objetivo del proyecto. Gran cantidad de pruebas, con las ntfsprogs, algu- nas de ellas:

Creación de 13.000 archivos en un directorio y comprobación de la consistencia del directorio después de cada creación.

Eliminación de 13.000 archivos de un directorio y comprobación de la consistencia del direc- torio después de cada eliminación.

Eliminación de todos los archivos de una imagen real NTFS.

Renombrado de todos los archivos de una imagen real NTFS.

Creación, acceso, listado y eliminación de 1.000.000 de archivos de un único directorio.

Calidad

Escritura concurrente en un archivo grande en muchas posiciones.

Escritura de ficheros grandes en volúmenes muy fragmentados.

Uso de archivos de intercambio (swap) y arranque de Linux sobre NTFS.

Comprobación de la consistencia después de desmontar volúmenes después de una gran activi- dad.

Operaciones aleatorios sobre ficheros en discos llenos.

El driver y las utilidades son testeados a su vez con Valgrind.

12 3.5. Rendimiento Rendimiento

Aunque el principal objetivo sea la fiabilidad, el rendimiento es un requisito tenido en cuenta

A corto plazo, ofrecer rendimiento similar al resto de SSFF • A largo plazo, alcanzar límites teóricos de rendimiento • NTFS-3G no optimizado aún

Random File Operation Sequential Random File Num Seeks systemFiles Create Lookup Delete File Size Write Rewrite Read /sec %cpu /sec %cpu /sec %cpu K/sec %cpuK/sec %cpu K/sec %cpu /sec %cpu ext3 16k 36316 78 65486 100 1G 36623 9 18805 6 41193 4 180.6 0 reiserfs 16k 20499 100 17113 99 1G 37768 14 19266 6 40730 6 190.8 0 reiser4 16k 17352 99 17401 99 1G 37537 5 19721 7 38991 5 197.6 0 ufs 16k 9670 100 14569 100 1G 42737 4 20203 5 42220 5 204.3 0 hfs+ 16k 9557 99 14220 99 1G 42860 4 19782 5 43454 6 203.4 0 ext2 16k 3706 99 18838 99 1G 41511 4 19113 5 42623 5 192.5 0 ntfs-3g 16k 3629 4 14562 7 4057 3 1G 36483 6 16652 4 40792 2 130.6 0 jfs 16k 2851 16 954 4 1G 41003 7 20006 6 42490 5 193.9 0 xfs 16k 272 1 197 1 1G 40905 6 19905 6 42192 4 178.5 0 fat32 16k 85 99 113 99 200 99 1G 42324 9 20228 7 42102 4 187.1 0

3.6. Alternativas Alternativas a NTFS-3G ntfsmount Incluido en ntfsprogs (http://www.linux-ntfs.org) Más características que las incluidas en el módulo del kernel También implementado con FUSE Soporta sobre escritura de archivos, pero tiene limitaciones al crear y eliminar archivos y directorios Era el driver NTFS por defecto hasta la versión 7.04 de Ubuntu Proyecto del que se separó NTFS-3G

Captive NTFS También implementado con FUSE. Antes utilizaba LUFS Soporte completo y fiable de escritura Utiliza el driver original ntfs.sys de Windows XP Proyecto no mantenido

FUSE (Filesystems in Userspace) http://fuse.sourceforge.net/

NTFS-3G http://www.ntfs-3g.org/

13