Beruflich Dokumente
Kultur Dokumente
II
Tema 5. Gestión del Sistema de Ficheros II
Índice
■ Introducción
■ Ficheros
■ El sistema de directorios
■ Protección del sistema de ficheros
■ Compartición de ficheros
■ Estructura del sistema de ficheros
■ Montaje de sistemas de ficheros
■ Mecanismos de incremento de prestaciones
■ Implementación de sistemas de ficheros
■ Servicios POSIX para gestión de ficheros y directorios
Índice
■ Implementación de sistemas de ficheros
✓ Gestión de ficheros en Linux
✓ Gestión de ficheros en Windows NT/2000
Bibliografía
■ J. Carretero et al. Sistemas Operativos: Una Visión Aplicada. McGraw-Hill.
2001. Capítulo 8.
■ W. Stallings. Sistemas Operativos. Prenctice-Hall. 2001. Capítulo 12.
■ M. Beck. Linux Kernel Internals. Addison-Wesley. 1997.
■ H. Custer. Inside Windows NT. Microsoft Press. 1993.
Índice
☛ ■ Introducción
■ Ficheros
■ El sistema de directorios
■ Protección del sistema de ficheros
■ Compartición de ficheros
■ Estructura del sistema de ficheros
■ Montaje de sistemas de ficheros
■ Mecanismos de incremento de prestaciones
■ Implementación de sistemas de ficheros
■ Servicios POSIX para gestión de ficheros y directorios
Manejador de dispositivo
Dispositivo lógico
Fichero lógico
0 1 2 3 4 5 6 7
Bloques lógicos
1340 1756 840 8322 Bloques del
(Servidor dispositivo
de bloques)
1340
1756
Manejador de Bloques del
840 disco
disco y
dispositivo
8322
75
500
50
100 uso del
ancho de
disco 25
50 banda
0 0
256 512 1K 2K 4K 8K 16K 32K
Tamaño de Bloque
Índice
■ Introducción
☛ ■ Ficheros
■ El sistema de directorios
■ Protección del sistema de ficheros
■ Compartición de ficheros
■ Estructura del sistema de ficheros
■ Montaje de sistemas de ficheros
■ Mecanismos de incremento de prestaciones
■ Implementación de sistemas de ficheros
■ Servicios POSIX para gestión de ficheros y directorios
■ ¿Qué es un fichero?
◆ Conjunto de información no volátil almacenada en un dispositivo de
almacenamiento masivo que tiene unas características
◆ Organización lógica para el usuario
■ Atributos de un fichero:
◆ Tipos:
● Estáticos: nombre, tipo, ubicación, tamaño, permisos, fechas, etc.
■ Nombres:
◆ Longitud máxima para MS-DOS 8 caracteres y 4096 para UNIX
◆ Sensibilidad mayúsculas: MS-DOS y Windows no distingue entre
mayúsculas, UNIX sí
■ Extensiones:
◆ Indican al SO, a las aplicaciones o a los usuarios características del
contenido del fichero
◆ Obligatorias o no según SO: MS-DOS sí, UNIX no
■ Cambian de un SO a otros
■ Todos los SO deben reconocer al menos un tipo de fichero: sus propios
ficheros ejecutables
◆ Reconocidos por la extensión o
◆ Reconocidos por su contenido
● Ejemplo: Sistemas UNIX
Prácticamente distinguen sólo los ficheros ejecutables
No almacenan entre los atributos el tipo de fichero
En cabecera aparece información para que el SO descifre la
estructura del ejecutable
Número mágico: número que aparece en cabecera del fichero
e indica el tipo de fichero
...
Sección 2 valor inicial
Opciones
Datos con
Sección n valor inicial
Información
de carga
Tabla de
símbolos
Otra
información
■ Sin formato:
◆ Secuencia de bytes
◆ El usuario es el encargado de interpretar la información almacenada en
el fichero. La información almacenada no tiene ninguna estructura lógica
■ Con formato:
◆ Estructura sencilla de registros:
● Secuencia de registros (de longitud fija o variable)
estructura lógica
◆ Estructuras complejas:
● Documentos con formato (HTML, postscript)
Árbol de registros
Cabecera
Módulo
objeto
Cabecera
Registros de Módulo
longitud objeto
variable
Estructura
Byte o con
registro de formato
longitud fija
Índice
■ Introducción
■ Ficheros
☛ ■ El sistema de directorios
■ Protección del sistema de ficheros
■ Compartición de ficheros
■ Estructura del sistema de ficheros
■ Montaje de sistemas de ficheros
■ Mecanismos de incremento de prestaciones
■ Implementación de sistemas de ficheros
■ Servicios POSIX para gestión de ficheros y directorios
■ ¿Qué es un directorio?
◆ Fichero especial en el cual la información almacenada pertenece al SO y
no a los usuarios
◆ Puesto que un directorio es un fichero (especial), tendrá las mismas
características que las indicadas para los ficheros
■ Estructura un directorio:
◆ La forma más sencilla de ver un directorio es como un fichero
organizado en registros, donde cada registro contiene la información
relativa a un fichero o subdirectorio que contiene
Número
Tipo de del primer
Nombre archivo Hora bloque Inodo Nombre
Directorio de MS-DOS
■ Directorio de un nivel
■ Árbol de directorios
■ Grafo de directorios:
◆ Permite compartición de ficheros y subdirectorios
◆ Forma habitual de compartir ficheros: creación de enlaces
■ Grafo de directorios:
Acíclico
00100101
00101111 ASCII
00110101
00100101
00100101 .C 00101111
00110101
00101111
00110101
00100101 00100101
00101111 00101111
00110101 00110101
.C ASCII
■ Tipos de enlaces:
◆ Enlaces simbólicos:
● Fichero nuevo con el nombre del fichero destino dentro
◆ Enlaces físicos:
● Un único fichero con contador de enlaces
■ Enlaces físicos:
◆ Los enlaces se contabilizan a través de un contador de enlaces que
aparece como atributo en el inodo
◆ Crear de un enlace ⇒ Incrementar contador de enlaces
◆ Borrar un fichero ⇒ Decrementar contador de enlaces
● Puede hacerse por varios caminos
● Sólo se borran los datos de un fichero si el contador de enlaces es
cero tras el decremento
$pwd
/home/castano Inodo nº 40 (f.soft) Bloque 800
$ln f f.hard
Otros campos /home/castano/f
$ln –s f f.soft
800 NIL
Bloque de /home/castano NIL NIL
FREE
NIL NIL
. 10
NIL NIL
.. 30
f 20
f.hard 20 Inodo nº 20 (f y f.hard) Bloque 600
f.soft 40
Otros campos
... ...
600 NIL Datos
NIL NIL
NIL NIL
NIL NIL FREE
◆ Soluciones:
● Permitir sólo enlaces a ficheros, no a subdirectorios
Índice
■ Introducción
■ Ficheros
■ El sistema de directorios
☛ ■ Protección del sistema de ficheros
■ Compartición de ficheros
■ Estructura del sistema de ficheros
■ Montaje de sistemas de ficheros
■ Mecanismos de incremento de prestaciones
■ Implementación de sistemas de ficheros
■ Servicios POSIX para gestión de ficheros y directorios
■ Capacidades
◆ Cada fichero (y directorio) tiene asignadas unas capacidades (permisos)
que indican qué usuarios y qué tipo de acceso pueden hacer
■ Permisos básicos:
◆ Formato en octal:
■ Permisos extendidos
■ Bit “sticky”:
◆ Para ficheros:
● El fichero permanece cargado en MC (no se lleva al dispositivo de
intercambio)
◆ Para directorios:
● Los ficheros y subdirectorios del directorio sólo pueden ser borrados
■ ¿Qué son?
◆ Caso particular de un esquema general de permisos de listas de acceso
adicional)
■ Ejemplos:
$ aclget fichero > perm; aclput –i perm fichero2
$ aclget –o perm fichero; aclput –i perm fichero2
$ aclget fichero | aclput fichero2
Índice
■ Introducción
■ Ficheros
■ El sistema de directorios
■ Protección del sistema de ficheros
☛ ■ Compartición de ficheros
■ Estructura del sistema de ficheros
■ Montaje de sistemas de ficheros
■ Mecanismos de incremento de prestaciones
■ Implementación de sistemas de ficheros
■ Servicios POSIX para gestión de ficheros y directorios
■ Aspectos implicados:
◆ Permisos de acceso
◆ Gestión de accesos simultáneos
no cambia nunca
◆ Semántica de sesión:
● Las escrituras que hace un proceso no son inmediatamente visibles
futuras sesiones
● Un archivo puede tener temporalmente varias imágenes (versiones)
inmediata
Índice
■ Introducción
■ Ficheros
■ El sistema de directorios
■ Protección del sistema de ficheros
■ Compartición de ficheros
☛ ■ Estructura del sistema de ficheros
■ Montaje de sistemas de ficheros
■ Mecanismos de incremento de prestaciones
■ Implementación de sistemas de ficheros
■ Servicios POSIX para gestión de ficheros y directorios
Bloque de
arranque
Directorio ARREL
(6)
00100101
.C ASCII 00101111
00110101
mail.avui
mail.avui
PRACTIQUES
copia.txt
copia.txt
ARREL
AT
pr1.c
pr1.c
pr1.c
RV
FAT
SE
RE
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
copia.txt
read.me
read.me
pr1.o
pr1.c
pr1.c
pr1.o
pr1.o
pr1.o
pr1.o
Bloque 2 Bloque 3 Bloque 4 Bloque 5
16
0 X 8 9 16 13 24 FREE
1 X 9 EOF 17 FREE 25 26 13
2 X 10 12 18 FREE 26 EOF
3 X 11 EOF 19 FREE 27 28 14
4 X 12 22 20 EOF 28 29
5 X 13 14 21 FREE 29 30 15
6 EOF 14 15 22 EOF 30 31
7 15 23 31 20
FREE 20 BAD EOF
Bloque libre (-2) Bloque defectuoso (-3) Fin fichero (-1)
Sistemas Operativos II (II-UJI) Gestión del SF
45
SO
II
Sistemas de ficheros basados en FAT II
inodo
■ Asignación indexada de bloques de ficheros:
Número de inodo
◆ Tabla de inodos: Tamaño del fichero
● Un i-nodo por fichero Permisos
● Una entrada en la tabla de inodos por inodo Número de links al
● Ventajas: fichero
UID del propietario
Para ficheros cortos → Localización
GID del propietario
inmediata de la lista de bloques
Para ficheros largos → A lo sumo dos o tres Tiempo de creación
referencias a disco para la localización Tiempo de último acceso
Bloques indirectos
simples
Bloques indirectos
dobles
inodo Datos
Indices directos
Datos
Indices indirectos simples
Datos
Datos
Datos
0 ...
1 1 READ
2 ... 1 /etc/passwd
3 1 WRITE
4 1 READ 2 /usr/castano
5 ...
6 ...
Tabla de ficheros Tabla de ficheros Tabla de inodos
del proceso del sistema
Bloque 20 del Inodo 6 Bloque 140 del Inodo 91 Bloque 132 del Inodo 46
directorio / (/usr) directorio /usr (/usr/bin) directorio /usr/bin (/usr/bin/cat)
Índice
■ Introducción
■ Ficheros
■ El sistema de directorios
■ Protección del sistema de ficheros
■ Compartición de ficheros
■ Estructura del sistema de ficheros
☛ ■ Montaje de sistemas de ficheros
■ Mecanismos de incremento de prestaciones
■ Implementación de sistemas de ficheros
■ Servicios POSIX para gestión de ficheros y directorios
Montaje de SF
◆ Montaje de un SF:
● Conexión de un SF almacenado en una partición a un directorio del árbol
de directorios existente
SF a montar
root usr
rdsk
dev1
Camino
dist bin lib Punto de montado
rdsk1
Directorio
tex bin lib
Directorio montado
Tabla inodos
Fichero
Tabla superbloques
bin util
tex bin
/dev/hda3
■ Ejercicio:
Dado el siguiente diagrama que indica en qué directorios se encuentran
montados los distintos sistemas de ficheros accesibles desde un SO linux,
rellénense los campos de los inodos y superbloques del sistema de ficheros
virtual que se utilizan para identificar dichos puntos de montaje y la relación
entre ellos.
/
Dispositivo 1
usr
Dispositivo 2
local
Dispositivo 3
■ Ejercicio (sol.):
i_no 0 1 2 3 4
s_dev 1 2 3 i_dev 1 1 2 2 3
s_covered 0 1 3 i_sb 0 0 1 1 2
s_mounted 0 2 4 i_mount -1 2 -1 4 -1
s_covered: Inodo sobre el que se monta el SF i_no: Número inodo del fichero
s_mounted: Inodo raíz del SF montado i_dev: Dispositivo donde está el fichero
i_mount:Inodo raíz del SF que se monta
sobre este fichero
Índice
■ Introducción
■ Ficheros
■ El sistema de directorios
■ Protección del sistema de ficheros
■ Compartición de ficheros
■ Estructura del sistema de ficheros
■ Montaje de sistemas de ficheros
☛ ■ Mecanismos de incremento de prestaciones
■ Implementación de sistemas de ficheros
■ Servicios POSIX para gestión de ficheros y directorios
● Caché de bloques
Proceso Proceso
Caché
Caché
Disco Disco
■ Objetivo:
◆ Acelerar la interpretación de los nombres de ficheros
■ ¿Qué se almacena?
◆ Entradas de directorio de los ficheros abiertos recientemente
◆ UNIX: “Mapeo” entre nombre de fichero y su número de inodo
■ Interpretación del nombre de un fichero:
◆ Cuando se abre un fichero se mira si cada uno de sus componentes
aparecen en la caché
● Si está: Acceso al número inodo del componente
■ Consistencia de la caché:
◆ Casi todas las operaciones de creación, destrucción y cambio de
ficheros actualizan la caché
struct dir_cache_entry {
kdev_t dc_dev; /* Num dispositivo en el que se
encuentra el directorio */
unsigned long dir; /* Num inodo del directorio padre */
unsigned long version; /* Num version del directorio */
unsigned long ino; /* Número de inodo del directorio */
unsigned char name_len; /* Longitud nombre del directorio */
char name[DCACHE_NAME_LEN]; /* Nombre del directorio */
struct dir_cache_entry ** lru_head;
/* Cabecera de lista de directorios */
struct dir_cache_entry * next_lru, * prev_lru;
/* Punteros al elemento previo y al
siguiente de la lista de dirs */
};
■ Localización de un directorio:
◆ Si al resolver un camino de un fichero no se encuentra en la caché uno de los
directorios de paso, se crea una nueva entrada al final de la lista
◆ Si existe el directorio en la caché, se recoloca al final de la lista y se usa la
información que contiene
struct dir_cache_entry
dir 1 123 1 1 6
inode 1 45 6 10 47
name[] / tmp usr etc bin
next_lru
prev_lru
lru-head
lru_head
Bloques lógicos
(Servidor 1340 1756 840 8322 Bloques del
dispositivo
de bloques)
Caché de bloques
(Servidor 1340 840 1756 8322
de bloques)
1340
1756
Manejador de Bloques del
840 disco
disco y
dispositivo
8322
■ Algoritmos de reemplazo:
◆ FIFO (First in First Out)
◆ MRU (Most Recently Used)
◆ LRU (Least Recently Used)
● Reemplaza el bloque que lleva más tiempo sin ser usado
struct buffer_head {
kdev_t b_dev; /* Dispositivo donde está el bloque */
unsigned long b_blocknr; /* Número bloque en dispositivo */
struct buffer_head * b_next; /* Siguiente elemento de una lista de
buffers en uso */
struct buffer_head * b_prev;
struct buffer_head * b_next_free; /* Siguiente elemento de una lista de
buffers libres */
struct buffer_head * b_prev_free;
unsigned int b_list; /* Lista LRU a la que pertenece este
buffer */
unsigned long b_state; /* Estado del buffer (bloqueado,
sucio, válido, etc) */
lru_list[BUF_CLEAN]
lru_list[BUF_BLOCKED]
.
.
.
free_list[SIZE_1]
free_list[SIZE_2]
.
.
.
Índice
■ Introducción
■ Ficheros
■ El sistema de directorios
■ Protección del sistema de ficheros
■ Compartición de ficheros
■ Estructura del sistema de ficheros
■ Montaje de sistemas de ficheros
■ Mecanismos de incremento de prestaciones
☛ ■ Implementación de sistemas de ficheros
✓ Gestión de ficheros en Linux
✓ Gestión de ficheros en Windows NT/2000
■ Servicios POSIX para gestión de ficheros y directorios
Índice
■ Implementación de sistemas de ficheros
☛ ✓ Gestión de ficheros en Linux
♣ El sistema de ficheros virtual
♣ El sistema de ficheros “Ext2”
♣ Sistemas de ficheros con vitácora
♣ El sistema de ficheros “procfs”
✓ Gestión de ficheros en Windows NT/2000
◆ Dispone para ello de una interface entre el núcleo y los diferentes SF: el VFS
● Permite acceder a ficheros sin tener en cuenta el SF bajo el que se
encuentra
● Trabaja con "ficheros virtuales" con una estructura independiente del SF
...
Ext2 Ext3 ReiserFS proc Nfs
...
0 ...
1 1 READ
2 ... 1 /etc/passwd
3 1 WRITE
4 1 READ 2 /usr/castano
5 ...
6 ...
Tabla de ficheros Tabla de ficheros Tabla de inodos
del proceso del sistema
struct files_struct {
tomic_t count; /* Num. procs que comparten estos ficheros abiertos */
fd_set * close_on_exec;/* Ficheros a cerrar ante una llamada exec */
fd_set * open_fds; /* Máscara bits de descriptores de ficheros usados */
struct file * fd_array[NR_OPEN_DEFAULT];
/* Tabla de ficheros abiertos por el proceso*/
};
■ Tabla de inodos:
◆ Lista circular doblemente enlazada de estructuras tipo inode cuyo inicio es:
Superbloque
inode_operations
Operaciones sobre inodo create
link
unlink
Datos dependientes ...
del SF
■ El superbloque:
◆ Cada SF que se monta en el SF se representa en una estructura tipo
super_block dentro de la tabla super_blocks[NR_SUPER]
◆ Estructura de datos de un superbloque del VFS:
super_block
Datos independientes
del SF
super_operations
Operaciones sobre superbloque put_super
write_super
statfs
Datos dependientes ...
del SF
■ Implementación de un superbloque:
◆ Estructura de datos de un superbloque del VFS:
struct super_block {
kdev_t s_dev; /* Dispositivo en el que está el SF */
unsigned long s_blocksize; /* Tamaño del bloque en bytes */
unsigned char s_lock; /* Superbloque bloqueado */
unsigned char s_dirt; /* Superbloque modificado respecto a la
copia en disco */
struct file_system_type *s_type; /* Tipo del SF */
struct super_operations *s_op; /* Operaciones que necesitan información
de esta estructura super_block */
unsigned long s_flags; /* Banderas de estado del SF (sólo lectura,
escritura inmediata a disco, etc.)*/
■ Implementación de un superbloque:
unsigned long s_magic; /* Número de identificación del SF */
unsigned long s_time; /* Tiempo de última modificación del SF */
struct inode * s_covered; /* Inodo sobre el que se monta el SF */
struct inode * s_mounted; /* Inodo raiz del SF */
struct wait_queue * s_wait; /* Procesos esperando acceder al
superbloque */
union {
struct minix_sb_info minix_sb;/* Información sobre superbloque de minix */
struct ext2_sb_info ext2_sb; /* Información sobre superbloque de ext2 */
...
} u; /* Información específica de cada SF */
};
■ Grupo de bloques:
◆ Número fijo de bloques que contiene:
● Copia del superbloque del Ext2
● Copia de la tabla de descriptores de grupos del Ext2
Descriptor de grupo: Información sobre un grupo de bloques
Y, consecuentemente:
● Preasignación:
Cuando se encuentra un bloque libre se reservan también los
siguientes bloques (si éstos estuviesen libres) como futuros
bloques del fichero
■ Fragmentos:
◆ Un bloque de disco se divide en varios fragmentos
◆ Cada fragmento se asigna de manera independiente
◆ Fichero = Serie de bloques + Serie de fragmentos
En lugar del último bloque
◆ Permite un mejor aprovechamiento del espacio en disco
● Reduce fragmentación interna de ficheros
■ Fragmentos (cont.):
◆ ¿Cómo gestionar el crecimiento de un fichero?
● Si el fichero no tiene bloque fragmentado:
Asignar nuevos fragmentos de un bloque
■ Mapas de bits:
◆ Mapa de bits de bloques:
● Indica si están asignados o no cada uno de los bloques
■ Directorios:
◆ Un directorio es un fichero con una lista de entradas con la siguiente
estructura:
rec_len mod 4 = 0
struct ext2_dir_entry {
__u32 inode; /* Número de inodo asociado al fichero */
__u16 rec_len; /* Longitud de este registro */
__u16 name_len; /* Longitud del nombre del fichero */
char name[EXT2_NAME_LEN]; /* Nombre del fichero */
}; O directorio
◆ La eliminación de un subdirectorio se realiza poniendo a cero el número de
inodo y anexionando dicha entrada a la anterior
● No es necesario reorganizar la lista ante un borrado
■ Directorios (cont.):
◆ Ejemplo de un fichero tipo directorio:
0 12 24 40 62
24 12 2 . 36 12 3 .. 58 16 5 pepe 27 12 4 act ....
4 bytes 2 2 4 8 bytes
completar
● No necesario ejecutar
“fsck”
● Reinicio del sistema más rápido y sencillo
■ Ext3:
◆ Ext2 con un fichero adicional de registro de transacciones
◆ Estructura idéntica a Ext2
■ ReiserFS:
◆ Organiza los objetos del SF (inodos, directorios y bloques de datos) en
variantes de árboles balanceados
◆ Buen rendimiento para ficheros pequeños y medianos
■ ¿Qué es el “ procfs” ?
◆ SF montado sobre /proc que sólo existe en MC
◆ Se crea cuando arranca el SO y construye dinámicamente bajo demanda
◆ SF con información legible al usuario de los trabajos de núcleo
Índice
■ Introducción
■ Ficheros
■ El sistema de directorios
■ Protección del sistema de ficheros
■ Compartición de ficheros
■ Estructura del sistema de ficheros
■ Montaje de sistemas de ficheros
■ Mecanismos de incremento de prestaciones
■ Implementación de sistemas de ficheros
✓ Gestión de ficheros en Linux
☛ ✓ Gestión de ficheros en Windows NT/2000
■ Servicios POSIX para gestión de ficheros y directorios
■ Estructura de un volumen:
Tamaño volumen 128 Mby 256 Mby 512 Mby 1024 Mby 2048 Mby 4096 Mby
Tamaño cluster 2 Kby 4 Kby 8 Kby 16 Kby 32 Kby 64 Kby
Sectores por cluster 4 8 16 32 64 128
■ Características:
◆ Estructura de directorio y volumen similar a SF FAT 16
◆ Soporta volúmenes más grandes (hasta 2048 Gbytes)
◆ Soporta ficheros de hasta 4 Gbytes
◆ Slot:
● Entrada de directorio con formato especial
Fe Pri. Alias
Nombre Ext. Atr Reservado Tpo Tam.
cha clus
Nombre Slot 1
Orden Slot 2
Nombre
secuencial
slot
...
Nombre Slot n
■ Estructura de un volumen:
Tamaño volumen ≤512 Mby 512 Mby – 1 Gby 1-2 Gby 2-4 Gby 4-8 Gby 8-16 Gby 16-32 Gby >32 Gby
Tamaño cluster 512 by 1 Kby 2 Kby 4 Kby 8 Kby 16 Kby 32 Kby 64 Kby
Sectores por cluster 1 2 4 8 16 32 64 128
◆ Fichero de registro:
● Lista de transacciones para garantizar la recuperabilidad de NTFS
■ Ficheros:
◆ NTFS ve un fichero como un conjunto de atributos definidos por pares del
tipo:
(nombre_atributo,valor_atributo)
■ Ficheros (cont.):
en el registro de archivo)
● Nombre del fichero
● Datos
● Índice raíz (referencias a los ficheros y subdirectorios de un directorio)
● etc.
■ Ficheros (cont.):
Información Descriptor
Nombre Datos
estándar seguridad
Índice raíz
Vacío
fichero1, fichero2, ...
■ Ficheros (cont.):
◆ Atributos residentes y no residentes:
● Atributo residente:
El atributo cabe en el registro de archivo
● Atributo no residente:
El atributo no cabe en el registro de archivo
Se le asigna una zona de 2ó 4 Kby (extensión)
■ Ficheros (cont.):
Datos Datos
■ Ficheros (cont.):
VCN 0 1 2 3 8 9 10 11
4 5 6 7
Índice
■ Introducción
■ Ficheros
■ El sistema de directorios
■ Protección del sistema de ficheros
■ Compartición de ficheros
■ Estructura del sistema de ficheros
■ Montaje de sistemas de ficheros
■ Mecanismos de incremento de prestaciones
■ Implementación de sistemas de ficheros
☛ ■ Servicios POSIX para gestión de ficheros y directorios
■ Sintaxis:
int link(const char *existing, const char *new);
devuelve:
◆ Si todo ha ido bien: 0
◆ Si error: -1
■ Descripción:
◆ Crea un enlace físico desde una nueva entrada de directorio, new, a un
fichero existente existing
● Crea una nueva entrada de directorio
■ Sintaxis:
int symlink(const char *existing, const char *new);
devuelve:
◆ Si todo ha ido bien: 0
◆ Si error: -1
■ Descripción:
◆ Crea un enlace simbólico desde una nueva entrada de directorio, new, a un
fichero existente existing
◆ Ambos nombres de fichero deben pertenecer a SF diferentes
■ Ejemplo:
◆ symlink (“f1”, “f1.s”);
■ Sintaxis:
int unlink(const char *name);
devuelve:
◆ Si todo ha ido bien: 0
◆ Si error: -1
■ Descripción:
◆ Elimina la entrada de directorio asociada al fichero name y decrementa el
número de enlaces del fichero correspondiente
◆ Cuando el número de enlaces es cero y ningún proceso lo mantiene abierto,
se libera el espacio ocupado por el fichero y el fichero deja de ser accesible
Permite borrar ficheros y directorios
■ Ejemplo:
◆ unlink (“f1”);
■ Sintaxis:
char *getcwd (char *buf, size_t size);
devuelve:
◆ Si todo ha ido bien: buf
◆ Si error: NULL
■ Descripción:
◆ Almacena el nombre absoluto del directorio de trabajo a partir de buf (en
■ Ejemplo 1:
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
#define MAX_BUF 256
main(int argc, char *argv[])
{
DIR *dir;
struct dirent *dp;
char buf[MAX_BUF];
close (1);
creat (argv[1], 0600);
getcwd (buf, MAX_BUF);
printf(“Directorio actual: %s\n",buf);
dir=opendir(“.");
while ((dp=readdir(dir)) != NULL)
printf("%s\n",dp->d_name);
closedir(dir);
exit (0);
}
■ Ejemplo 2:
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
stat(argv[1],&datos);
if (!S_ISDIR(datos.st_mode))
{ printf("%s no es un directorio\n",argv[1]); exit (-1); }
■ Ejemplo 2 (cont.):
if ((dir=opendir(argv[1])) == NULL)
{ perror("opendir"); exit (-1);}
dp=readdir(dir);
dp=readdir(dir);
while ((dp=readdir(dir)) != NULL)
{ sprintf(fichero,"%s/%s",argv[1],dp->d_name);
if ((stat(fichero,&datos)) != 0)
{ perror("stat"); exit (-1);}
if ( S_ISREG(datos.st_mode))
{ if (fork()!=0) wait(&estado);
else {
execlp("wc","wc","-l",fichero,NULL);
perror("wc"); exit(-1);
}
}
}
closedir(dir);
exit (0);
}
■ Ejercicio 1:
Indicar cuál de los siguientes apartados NO realizan la misma operación que
los tres restantes:
■ Ejercicio 2:
Indicar cuál de las siguientes afirmaciones es cierta tras ejecutar los
siguientes comandos:
$ ls –al ./midir
total 24
drwx------ 2 jaume inf 512 jun 8 10:52 .
drwx------ 22 jaume inf 2048 jun 8 10:51 ..
-rw------- 1 jaume inf 1 jun 8 10:52 fichero
$ aclget ./midir/fichero
atrributes
base permissions:
owner (jaume): rw-
group (inf): ---
others: ---
extended permissions:
enabled
permit rw- g:itig
permit rwx u:pepe
■ Ejercicio 2 (cont.):
■ Ejercicio 3:
Sea un SF Ext2 de 32 Gbytes, en el que cada inodo ocupa 128 bytes y en el
que el superbloque aparece la siguiente información:
■ Ejercicio 3 (solución):
(a) Superbloque: 1 bloque
(b) Descriptores de grupo: 1 bloque
(225 by/disco) / (210 by/bloque) = 215 bloques/disco
(215 bloques/disco) / (213 bloques/grupo) = 4 grupos/disco
(22 descriptor_grupo/disco x 24 by/descriptor_grupo) / (213 bloques/grupo) =
= 1 bloque
(c) Mapa de bits de bloques:
(213 bloques/grupo) / (213 bits/bloque) = 1 bloque
(d) Mapa de bits de inodos:
(210 inodos/grupo) / (213 bits/bloque) = 1 bloque
(d) Tabla de inodos:
(210 inodos/grupo * 27 by/inodo) / (210 by/bloque) = 128 bloques/grupo
■ Ejercicio 3 (solución):
■ Ejercicio 4:
Suponiendo que la caché de bloques de directorios de linux tiene un única
lista LRU y que en un instante dado es la que aparece a continuación,
mostrar razonadamente la evolución que experimentará dicha lista al
acceder al fichero /d1/d2/d3/f1.
Asumir que el tamaño máximo de la lista es de 5 directorios.
dir_cache_entry
■ Ejercicio 4 (solución):
■ Ejercicio 4 (solución):
■ Ejercicio 5:
Diseñar un algoritmo que, sin hacer uso de las estructuras de datos del SO
(no se puede acceder a la tabla de procesos), genere un listado de los
directorios raíz de todos los procesos del sistema.
■ Ejercicio 6:
¿Cuál es el número mínimo y máximo de ficheros que puede contener un
subdirectorio del SF Ext2 cuyo tamaño es 3 Kbytes, siendo éste el tamaño
de un bloque de dicho SF?
■ Ejercicio 7:
Diseñar un algoritmo que, dado un número de inodo de un fichero de un SF
Ext2, permita determinar si dicho fichero tiene o no todos sus datos
almacenados en un mismo grupo de bloques.
■ Ejercicio 8:
Sea un SF Ext2 en el que el número máximo de ficheros permitido en un
grupo de bloques es 32, el tamaño de cada uno de sus inodos es de 128
bytes y la tabla de inodos de un determinado grupo de bloques ocupa 4
bloques. Mostrar el contenido inicial del único bloque que ocupa un
directorio de este SF (que contiene dos ficheros denominados f.txt y f2,
respectivamente) y la posterior evolución de éste cuando tienen lugar las
siguientes operaciones sobre él:
■ Ejercicio 9:
Sea un SF basado en tabla de índices con las siguientes estructuras de datos y
funciones definidas sobre él:
#define IND_DIRECTOS 4
#define IND_ISIMPLE 2
#define IND_IDOBLE 2
#define NRELLENO 23
■ Ejercicio 9 (cont.):
■ Ejercicio 9 (cont.):
■ Ejercicio 9 (cont.):
Escribir una función que, dado un número de inodo de un fichero, obtenga un
puntero a la estructura (tipo T_Inodo) de dicho inodo.
La función ha de devolver:
0: Ejecución ok.
-1: Ejecución con error.
■ Ejercicio 9 (solución):
Bloque n°BLQ_INI_INODOS
0 1 ...
0
1 X
2
... ... ... ...
INODOS_POR_BLOQUE - 2
INODOS_POR_BLOQUE - 1
TABLA INODOS
■ Ejercicio 9 (solución):
■ Ejercicio 9 (solución):
■ Ejercicio 10:
Sea un SF basado en inodos con las estructuras de datos que se especifican en
el ejercicio 9.
Escribir una función que busque un fichero de un SF basado en tabla de índices
(cuyo nombre se pasa como parámetro) dentro de un directorio (cuyo inodo -
estructura tipo T_Inodo- también se le pasa como parámetro)
La función ha de devolver:
número de inodo del fichero: Ejecución ok
-1: Ejecución con error
.
Inodo Z ..
de DIR 4 dev
Tipo y modo 15 etc
Tamaño ...
... 35 usr
Bloque Y
Índices directos W de DIR
Bloque X de
Índices ind. simples referencias 46 d2
X
Índices ind. dobles 32 d1
... 24 f2
...
Y
...
■ Ejercicio 10 (solución):
■ Ejercicio 10 (solución):
■ Ejercicio 10 (solución):
■ Ejercicio 10 (solución):
■ Ejercicio 10 (solución):
■ Ejercicio 10 (solución):
■ Ejercicio 10 (solución):
■ Ejercicio 10 (solución):
INICIO
encontrado=FALSE;
total_bloques = inodo_actual->i_tamanyo DIV TAMANYO_BLOQUE;
bloque_actual = 0;
numinodo = -1;
■ Ejercicio 11:
Sea un SF basado en inodos con las estructuras de datos que se especifican en
el ejercicio 9.
Escribir una función que, dado un nombre de un fichero de un SF basado en
tabla de índices, obtenga un puntero a la estructura del inodo (tipo T_Inodo)
correspondiente a dicho fichero.
La función ha de devolver:
0: Ejecución ok
-1: Ejecución con error
■ Ejercicio 11 (solución):
■ Ejercicio 11 (solución):
■ Ejercicio 11 (solución):
numinodo = direct.d_inodo;
extrae_inodo (numinodo , inodo);
MIENTRAS ( (busqueda < partes) AND seguir) HACER
numinodo := busca_numero_inodo (inodo , nombres[busqueda]);
SI (numinodo <= 0) ENTONCES seguir = false; error = -1;
SINO extrae_inodo (numinodo , inodo);
FINSI
FINMIENTRAS
SI (NOT seguir) ENTONCES inodo_result = inodo; FINSI
Obtiene_inodo = error;
FINFUNCTION Obtiene_inodo
■ Ejercicio 12:
Sea un SF basado en inodos con las estructuras de datos que se especifican en
el ejercicio 9.
(a) Escribir una función definida como sigue:
int localiza (T_Inodo *inodo, int pos);
en la que, a partir de un número de byte pos de un fichero cuyo inodo se
encuentra a partir de la posición inodo, se devuelva el número de bloque de
disco en el que se encuentra dicho byte.
Si se produjese algún tipo de error al intentar realizar la operación la función
devolverá un valor negativo.
■ Ejercicio 12 (cont.):
(b) A partir de la función anterior, escribir otra función definida como sigue:
int truncado_seguro (T_Inodo inodo, int pos);
Dicha función truncará de forma segura a partir de la posición pos del fichero
cuyo inodo se encuentra a partir de la posición inodo. El truncado seguro
supondrá sustituir desde el byte pos del fichero en adelante la información
original del fichero (cada uno de sus bytes) por el patrón 'a' y eliminar dicha
información del fichero.
La función devolverá como resultado un cero si la operación se puede
realizar sin ningún problema. En caso contrario, devolverá un valor negativo.
Se pueden utilizar, especificando su funcionamiento y sin necesidad de
implementarlas, las funciones que se crean necesario para el tratamiento del
espacio de almacenamiento libre.