Lo hice y lo entendí

El blog de Vicente Navarro
10 sep

NTFS-3G: preserving times for ‘foo’: Operation not permitted

Pocos se acordarán ya de la que fue una de las primeras entradas de este blog, La pesadilla de compartir partición entre Linux y Windows. En ella, contaba cómo hacía poco había empezado a usar el driver NTFS-3G para compartir particiones entre Linux y Windows y que justo ese día había salido el NTFS-3G 1.0.

Pues bien, desde entonces vengo usando el NTFS-3G continuamente, habiendo visto cómo el driver cada vez funciona mejor y más rápido. Szabolcs Szakacsits, el principal desarrollador del proyecto, tiene todos mis agradecimientos por haber conseguido algo que se había hecho esperar tanto (soporte seguro de lectura y escritura de NTFS en Linux) y con tanta calidad.

En fin, el caso es que desde el principio me venía fijando en que cuando hacía según qué operaciones de escritura en la partición NTFS usando un usuario distinto de root me encontraba con el error:

cp: preserving times for 'foo': Operation not permitted

Y los ficheros se creaban con la fecha actual en lugar de la suya. Por ejemplo:

$ ll torvalds-says-linux.au
-rw-r--r-- 1 supercoco users 41493 2006-10-27 21:24 torvalds-says-linux.au
$ cp -p torvalds-says-linux.au /mnt/e/
cp: preserving times for `/mnt/e/torvalds-says-linux.au': Operation not permitted
$ ll /mnt/e/torvalds-says-linux.au
-rwxrwxrwx 1 root root 41493 2007-09-10 22:31 /mnt/e/torvalds-says-linux.au

Esto no ocurre con root:

# ll torvalds-says-linux.au
-rw-r--r-- 1 supercoco users 41493 2006-10-27 21:24 torvalds-says-linux.au
# cp -p torvalds-says-linux.au /mnt/e/
# ll /mnt/e/torvalds-says-linux.au
-rwxrwxrwx 1 root root 41493 2006-10-27 21:24 /mnt/e/torvalds-says-linux.au

Tenía pendiente investigar la causa pero no le estaba dando mucha importancia. Hasta que hace unos días pasé todas las fotos de la tarjeta de memoria de la cámara de fotos y a continuación me di cuenta de que los ficheros habían perdido la fecha y hora correctas, algo que me molestó mucho. No es una pérdida irreparable, porque dichos datos siguen estando en la cabecera Exif de las fotos, pero sí fue muy molesta.

En realidad la solución estaba a tiro de Google en forma de hilo de los foros de NTFS-3G y con contestación del propio szaka (Szabolcs Szakacsits): cp: preserving times for ‘file’: Operation not permitted.

El problema estaba en que yo montaba la partición poniendo lo siguiente en el /etc/fstab:

/dev/sdb6  /mnt/e ntfs-3g rw,defaults,umask=000,locale=en_US.ISO-8859-15    0       0

y resulta que si se especifica una de las opciones uid, gid o [udf]mask, es el propio FUSE el que verifica dichas opciones y gestiona los permisos.

Teniendo en cuenta que ntfs-3g funciona con el setuid de root:

# ll /usr/bin/ntfs-3g 
-rwsr-xr-- 1 root fuse 40440 2007-08-08 19:50 /usr/bin/ntfs-3g

Extracto del man de ntfs-3g:

If ntfs-3g is set setuid-root then non-root users will be also able to mount block devices
or via /etc/fstab if the 'user' or 'users' mount(8) option is specified. The ntfs-3g  pro-
cess drops the root privilege after successful mount and runs unprivileged afterwards.

FUSE hace lo correcto según el estándar POSIX al rechazar la operación, como nos cuenta Szabolcs:

I have the result of the investigation. FUSE is right. Things worked
as they should. The operation indeed mustn't be permitted in such cases
according to the POSIX standard.

Namely utimes(2) doesn't permit changing the time stamps because the
effective uid of the cp process doesn't equal the uid of the file
__AND__ the new time stamps are not the current time, __EVEN_IF__
the user has write permission to the file. This is how POSIX wants.

Por tanto, si quitamos el umask=000 que, en cualquier caso, es el valor que se toma por defecto, FUSE no hará las comprobaciones y las horas y fechas se escribirán correctamente, aunque no estemos con el usuario root.

Esta es la línea de mi /etc/fstab ahora:

/dev/sdb6  /mnt/e ntfs-3g rw,defaults,locale=en_US.ISO-8859-15    0       0

Por cierto, ¿a alguien le ha llamado la atención el fichero que he usado de prueba? El fichero de audio (formato au) torvalds-says-linux.au es muy antiguo y al reproducirlo oímos a Linus Torvalds pronunciar Linux. Pronunciación que se usa de referencia desde entonces. Se puede reproducir en un sistema Linux con OSS simplemente haciendo:

cat torvalds-says-linux.au > /dev/audio

Supuso una enorme alegría para mí la primera vez que conseguí configurar una tarjeta de sonido en Linux y oír a Linus. Yo encontré el fichero en uno de mis viejos CDs de InfoMagick. Hoy en día está en múltiples sitios y formatos. Por ejemplo, en la página de Paul Slanden.

Entradas relacionadas

Tema LHYLE09, creado por Vicente Navarro