Ir al contenido

Sistemas de ficheros

Cada sistema de ficheros de Ixolo es un proceso servidor aparte. Cuando montas un disco, el sistema arranca una instancia nueva del servidor que toca (mfs, ext2, vfat…) para ese montaje, bajo el Reincarnation Server como cualquier otro servicio. Un fallo en el código de FAT puede tumbar el servidor de FAT, no el núcleo.

Tipo (mount -t)FormatoLecturaEscrituraNotas
mfsSistema de ficheros MINIX v1–v3 y v4sísíNativo. v4 es el formato por defecto.
ext2ext2, ext3, ext4sísíAlgunas características obligan a solo lectura; ver abajo.
vfatFAT12, FAT16, FAT32sísíNombres largos en UTF-8.
exfatexFATsísí
isofsISO 9660 con Rock RidgesínoCD e imágenes ISO.
tmpfsen memoriasísíNuevo; se monta en /var/shm al arrancar.
procfsinformación de procesossínoMontado en /proc.

MFS es el sistema de ficheros nativo. setup y mkfs.mfs crean la versión 4 por defecto, con un journal de metadatos. La versión 4 quita los límites que la versión 3 tenía en su formato en disco:

MFS v3MFS v4
Inodo64 bytes128 bytes
Fichero más grande2 GBmás de 2 GB
Marcas de tiempo32 bits, acaban en enero de 203864 bits, sin problema de 2038
Enlaces duros, IDs de grupo16 bits32 bits
Flags de fichero (chflags)nosí
Atributos extendidos, ACLnosí
Journal de metadatosnosí (activado por defecto)

Los nombres de fichero siguen teniendo como máximo 60 bytes, en las dos versiones. Los nombres más largos se truncan.

Un único servidor mfs lee y escribe las dos versiones. Las características nuevas se marcan con bits en el superbloque, así que un driver futuro puede añadir funciones sin otro cambio de formato. MINIX 3 original no lee la versión 4: si un disco tiene que poder leerse allí, créalo con -3.

El diseño, campo a campo: MFS v4.

Ventana de terminal
mkfs.mfs /dev/c0d1p0 # v4 con journal (por defecto)
mkfs.mfs -B 4096 /dev/c0d1p0 # elige el tamaño de bloque en bytes
mkfs.mfs -3 /dev/c0d1p0 # v3 heredado, sin journal
OpciónSignificado
-4MFS v4. Es el valor por defecto.
-3MFS v3 heredado, para soportes que deba leer un MINIX antiguo. Desactiva el journal.
-jReserva un journal de metadatos. Activado por defecto; implica -4.
-B tamañoTamaño de bloque en bytes. setup usa 4096.
-i inodosNúmero de inodos.
-b bloquesTamaño del sistema de ficheros, en bloques.

El journal ocupa 1/64 de los bloques, entre 64 y 8192 bloques. En un sistema de ficheros demasiado pequeño para contenerlo, mkfs.mfs lo omite con un aviso (o falla, si pediste -j de forma explícita).

El journal cubre los metadatos: inodos, mapas de bits, directorios, bloques indirectos y el superbloque. El contenido de los ficheros no pasa por el journal, pero se escribe en disco antes de confirmar los metadatos que apuntan a él (el mismo modo “data=ordered” de ext3 y ext4). Tras un fallo puedes perder las últimas escrituras que no se habían sincronizado, pero la estructura del sistema de ficheros es coherente y ningún fichero apunta a basura.

Cada cambio se escribe primero en el journal y solo pasa a su sitio definitivo cuando la copia del journal está a salvo en disco. Al montar en lectura-escritura un sistema de ficheros con journal que no se desmontó limpiamente, mfs vuelve a aplicar las transacciones confirmadas y descarta una incompleta al final. No hay un fsck largo. Si la máquina vuelve a caer durante la recuperación, se puede repetir sin problema.

Sin journal (v3, o una v4 demasiado pequeña para tenerlo), un sistema de ficheros sucio se monta en solo lectura con un aviso, MFS: WARNING: FS ... unclean, mounting readonly, hasta que lo compruebes:

Ventana de terminal
umount /dev/c0d1p0
fsck_mfs -a /dev/c0d1p0 # reparar automáticamente
fsck_mfs -r /dev/c0d1p0 # preguntar antes de cada reparación

fsck_mfs entiende la versión 4, incluidos el área del journal y los bloques de los atributos extendidos. Al arrancar, /etc/rc.minix ejecuta fsck -p sobre los sistemas de ficheros de /etc/fstab distintos de / antes de montarlos.

El diseño: journaling de MFS.

MFS v4 guarda los atributos extendidos en un bloque extra por fichero, a través de la familia de llamadas BSD extattr_get_file(2), en los espacios de nombres user y system. system es solo para root. Todos los atributos de un fichero deben caber en ese bloque; una escritura que lo desborde falla con ENOSPC. Todavía no hay órdenes getextattr/setextattr en el sistema base, así que los atributos se fijan desde programas.

Las listas de control de acceso POSIX.1e se apoyan en ellos. Usa getfacl y setfacl:

Ventana de terminal
setfacl -m u:alice:rw informe.txt # da a alice lectura/escritura
setfacl -d -m g:staff:rx compartido/ # ACL por defecto, la heredan los ficheros nuevos
getfacl informe.txt
setfacl -b informe.txt # quita las entradas extendidas

La ACL se aplica en cada acceso, los ficheros y directorios nuevos heredan las ACL por defecto, y chmod mantiene sincronizada la máscara de la ACL. El servidor ext2 lee y escribe las ACL de los volúmenes ext4 de la misma forma.

Diseño: atributos extendidos.

MFS v4 admite los flags BSD de inmutable y de solo-añadir mediante chflags(2). Un fichero inmutable no se puede escribir, truncar, renombrar, enlazar ni borrar, ni cambiar su propietario, modo, fechas o atributos. Un fichero de solo-añadir solo puede crecer por el final. Solo root puede poner o quitar los flags de sistema (SF_*); el propietario puede poner los de usuario (UF_*). En un sistema de ficheros v3, chflags devuelve EOPNOTSUPP. Todavía no hay orden chflags(1) en el sistema base.

mount [-a] [-r] [-e] [-t tipo] [-o opciones] especial nombre
  • -t tipo es el nombre del servidor de la tabla de arriba. Sin él, mount detecta MFS (v1 a v3), ext2 e ISO 9660, y si no, usa mfs.
  • -r monta en solo lectura. -o pasa opciones al servidor.
  • mount sin argumentos lista lo que está montado. umount desmonta.

Los discos se llaman /dev/c0d0 (controladora 0, disco 0), con particiones primarias p0–p3 y subparticiones s0–s3. Una instalación por defecto tiene / en /dev/c0d0p0s0, /home en ...s1 y /usr en ...s2.

Ventana de terminal
mount /dev/c0d1p0 /mnt # MFS o ext2: se detecta
mount -t ext2 /dev/c0d1p1 /mnt/linux
mount -t vfat /dev/usb_disk0p0 /mnt/usb
mount -t exfat /dev/usb_disk0p0 /mnt/usb
mount -t tmpfs -o size=64m none /mnt/scratch
mount -r -t isofs /dev/c0d2 /mnt/cdrom # el nombre del lector de CD varía
umount /mnt/usb

Una memoria USB aparece al conectarla: la consola muestra New USB disk at /dev/usb_disk0. y sus particiones llevan los mismos sufijos p0–p3.

mount -a monta todas las entradas de /etc/fstab salvo / y las marcadas noauto. El formato es el BSD de siempre: dispositivo, punto de montaje, tipo, opciones, frecuencia de volcado y pasada de fsck. Esto es lo que escribe setup:

/dev/c0d0p0s0 / mfs rw 0 1
/dev/c0d0p0s2 /usr mfs rw 0 2
/dev/c0d0p0s1 /home mfs rw 0 2
none /sys devman rw,rslabel=devman 0 0
none /dev/pts ptyfs rw,rslabel=ptyfs 0 0

Usa none como dispositivo para los sistemas de ficheros sin disco detrás, como tmpfs. De las opciones, mount -a solo interpreta ro y noauto; el resto de la cadena se pasa al servidor.

El servidor ext2 lee y escribe volúmenes Linux ext2, ext3 y ext4, con extents, números de bloque de 64 bits, sumas metadata_csum, directorios htree, ficheros de más de 2 GB, atributos extendidos y ACL. Procesa la lista de huérfanos al montar.

Lo que no hace:

  • No pasa sus propias escrituras por el journal. Un volumen ext3/ext4 desmontado limpiamente se monta en lectura-escritura, pero el sistema lo escribe como si fuera ext2. Desmóntalo antes de sacar el disco.
  • La recuperación es parcial. Si un volumen ext3 no se desmontó limpiamente, el servidor aplica el journal al montarlo en lectura-escritura. Solo entiende el formato clásico de journal de ext3 (sin sumas de control del journal ni journal de 64 bits). Con cualquier otro, monta en solo lectura.
  • Algunas características de ext4 no están soportadas. Un volumen con una característica “incompatible” no soportada (por ejemplo meta_bg, datos en línea o cifrado) se rechaza. Uno con una característica “compatible en solo lectura” no soportada, o marcado con errores, se monta en solo lectura. El servidor muestra el motivo.

newfs_ext2fs y fsck_ext2fs (de NetBSD) están en el sistema base.

vfat lee y escribe FAT12, FAT16 y FAT32, con nombres largos en UTF-8, tamaños de sector distintos de 512 bytes, y permite ejecutar y mapear programas desde él. exfat lee y escribe exFAT, el formato de la mayoría de memorias USB y tarjetas SD grandes. newfs_msdos crea sistemas FAT; no hay mkfs ni fsck para exFAT en el sistema base.

FAT no tiene propietarios ni permisos Unix, así que no esperes que chmod o chown se mantengan.

isofs lee CD e imágenes ISO, con nombres y enlaces simbólicos Rock Ridge. Los programas que contiene se pueden ejecutar directamente, cargando las páginas bajo demanda.

tmpfs mantiene un sistema de ficheros en memoria. Es nuevo en Ixolo (PR #483). Sus ficheros se pueden mapear con mmap, incluso con mapeos compartidos escribibles, y ejecutar. Al arrancar, /etc/rc.minix monta uno en /var/shm, donde shm_open(3) guarda los objetos de memoria compartida POSIX, salvo que /etc/fstab ya monte algo ahí.

OpciónSignificadoPor defecto
size=N[k|m|g]Máximo de datos de fichero; después, ENOSPC.la mitad de la memoria física
nr_inodes=NMáximo de ficheros y directorios.uno por página de size
mode=octalPermisos del directorio raíz.1777
uid=N, gid=NPropietario del directorio raíz.0

Su contenido se pierde al desmontarlo. No admite flags de fichero ni atributos extendidos, y sus páginas nunca van a swap.

procfs se monta en /proc al arrancar. Además de los directorios habituales por proceso, tiene /proc/service/<etiqueta> para cada servicio del sistema (ver servicios), /proc/pci y /proc/cpuinfo.

Lo que VM hace por su cuenta, sin configurar nada: cuando falta memoria libera páginas limpias de ficheros y comprime en RAM la memoria anónima que lleva tiempo sin usarse. Cuando ni eso basta, un OOM killer elige un proceso y lo termina. Diseño: recuperación de páginas, compresión y swap.