e/s y sistema de ficheros maría de los santos pérez hernández mperez@fi.upm.es

Post on 07-Feb-2015

2 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

E/S y sistema de ficheros

María de los Santos Pérez Hernándezmperez@fi.upm.es

mperez@fi.upm.es 2

Índice Conceptos básicos de E/S Concepto de sistema de ficheros Ficheros Directorios Volúmenes y particiones Protección Ficheros, directorios y servicios en POSIX Cache de bloques Fiabilidad del sistema de ficheros Introducción a los sistemas de ficheros distribuidos

(NFS)

mperez@fi.upm.es 3

Referencias bibliográficas “Sistemas Operativos: una visión aplicada”

Jesús Carretero et al.McGraw Hill, 2001

“Sistemas Operativos” Willian StallingWillian Stalling Prentice Hall, 1997

“Operating System Concepts” A. Silberschatz, P. GalvinAddison-Wesley, 1998

mperez@fi.upm.es 4

Conceptos básicos de E/S Funciones del SO:

Controlar el funcionamiento de los dispositivos de E/S

Ofrecer un interfaz entre los dispositivos y el resto del sistema

Hardware de E/S: Dispositivos de E/S:

De bloques (discos) De caracteres (teclado, ratón)

Controladores de dispositivos E/S programada Interrupciones DMA

mperez@fi.upm.es 5

Hardware de E/S

CPU

discos

controladorde disco

controlador de im presora

otroscontroladores

m em oria

im presora

BUS

mperez@fi.upm.es 6

Conceptos básicos de E/S

Software de E/S Objetivos: independencia de los dispositivos Estructuración del SW de E/S:

S W de E /S de n ive l de usuario

S W de E /S independiente de los d ispositivos (S F)

M anejadores de d ispositivos (d rive rs)

M anejadores de in terrupciones

C ontro ladores

D ispositivos

H ardw are

Softw are

mperez@fi.upm.es 7

Sistema de ficheros El acceso a los dispositivos es:

Incómodo Detalles físicos de los dispositivos Dependiente de las direcciones físicas

No seguro Si el usuario accede a nivel físico no tiene restricciones

El sistema de ficheros es la capa de software entre dispositivos y usuarios.

Objetivos: Suministrar una visión lógica de los dispositivos Ofrecer primitivas de acceso cómodas e independientes

de los detalles físicos Mecanismos de protección

mperez@fi.upm.es 8

Sistema de ficheros (II) El SF establece una correspondencia entre los

ficheros y los dispositivos lógicos.

SISTEM AD E

FIC H ER O S

ProtecciónInte

rfa

z de

acc

eso

mperez@fi.upm.es 9

Sistema de ficheros (III)

Visión lógica: Ficheros Directorios Volúmenes y particiones

Visión física: Bloques o bytes ubicados en dispositivos

Visiónlóg ica

Visiónfísica

mperez@fi.upm.es 10

Ficheros: visión lógica Conjunto de información relacionada que ha sido

definida por su creador Estructura de un fichero:

Secuencia o tira de bytes (UNIX, POSIX)

Registros (de tamaño fijo o variable)

Posición

R egistro 1

R egistro 3

R egistro 2

R egistro 4

R egistro n

C 1

C 1

C 1

C 1

C 1

C 2

C 2

C 2

C 2

C 2

C 3

C 3

C 3

C 3

C 3

C 5

C 5

C 5

C 5

C 5

C 4

C 4

C 4

C 4

C 4

R egistro 1

R egistro 3

R egistro 2

R egistro 4

R egistro n

C 1

C 1

C 1

C 1

C 1

C 2

C 2

C 2

C 3

C 3

C 3

C 4

C 4

C 4

C 4

C 3

C 3

C 5

C 5

mperez@fi.upm.es 11

Ficheros: visión lógica (II)

Estructura de un fichero (continuación): Ficheros de estructura compleja

Ficheros indexados Ficheros directos o de dispersión

Ejemplo de fichero indexado

Los ficheros estructurados en registros y los ficheros con estructuras complejas se pueden construir como una capa sobre la visión de tira de bytes.

C la ve

R e g is tro

Ficheroind ice

F ichero principa l

mperez@fi.upm.es 12

Ficheros: visión lógica (III)

Tipos de ficheros: Ficheros normales Ficheros especiales:

De bloques De caracteres

Atributos de un fichero: Nombre Tipo Dueño y grupo Información de protección Tamaño real Hora y fecha de creación Hora y fecha del último acceso Hora y fecha de la última modificación Número de enlaces

mperez@fi.upm.es 13

Ficheros: visión lógica (IV)

Tipos de acceso: Acceso secuencial Acceso directo Acceso indexado

Operaciones sobre ficheros: Crear ficheros Abrir y cerrar ficheros Renombrar Borrar ficheros Leer y escribir ficheros Truncar un fichero Asignar espacio a un fichero Situar el puntero en una determinada posición dentro del fichero Obtener atributos Modificar atributos

mperez@fi.upm.es 14

Ficheros: semántica de coutilización

Para trabajar con un fichero hay que definir una sesión con las llamadas open y close.

Semántica de coutilización: especifica el efecto de varios procesos accediendo de forma simultánea al mismo fichero.

Tipos de semánticas: Semántica UNIX (POSIX)

Las escrituras son inmediatamente visibles para todos los procesos con el fichero abierto.

Los procesos pueden compartir ficheros. Si existe relación de parentesco pueden compartir el puntero.

mperez@fi.upm.es 15

Ficheros: semántica de coutilización (II)

Semántica de sesión Las escrituras que hace un proceso no son

inmediatamente visibles para los demás procesos con el fichero abierto.

Cuando se cierra el fichero los cambios se hacen visibles para las futuras sesiones.

Un fichero puede asociarse temporalmente a varias imágenes.

Semántica de ficheros inmutables Una vez creado el fichero sólo puede ser compartido

para lectura y no cambia nunca

mperez@fi.upm.es 16

Ficheros: visión física

Conjunto de bloques ubicados en un dispositivo

Bloques

Bytes

Visión FísicaVisión Lógica

Fichero

mperez@fi.upm.es 17

Ficheros: visión física (II)

Bloque Unidad de transferencia 2n sectores Parámetro fijo por sistema de ficheros

Agrupación Unidad de asignación 2p bloques Aumenta la secuencialidad del fichero

Descripción de la estructura física: Bloques utilizados

mperez@fi.upm.es 18

Descripción física en UNIX (nodo-i)

Tamaño máximo del fichero: 10Sb+(Sb/4)Sb +(Sb/4)2Sb +(Sb/4)3SbSb el tamaño del bloque y direcciones de bloques de 4 bytes.

Tip o d e F ic he ro y P ro tec c ió nN ú m e ro d e N o m b res

P ro p ie ta r ioG rup o d e l P ro p ie ta rio

Ta m añ oIn s ta n te d e c rea c ió n

In s ta n te d e l ú ltim o a cc e s oIn s ta n te d e la ú ltim a m o d if ic ac ió n

P u n te ro a b loq u e d e d a to s 0P u n te ro a b loq u e d e d a to s 1

P u n te ro a b loq u e d e d a to s 9P u n te ro ind ire c to s im p leP u n te ro ind ire c to d o b leP u n te ro ind ire c to t rip le

nodo-i

Pu n te ro sa B lo q ue sd e D atos

Pu n te ro sa B lo q ue sd e D atos

Pu n te ro sa B lo q ue sd e D atos

Pu n te ro sa B lo q ue sd e D atos

Pu n te ro sa B lo q ue sd e D atos

Pu n te ro sa B lo q ue sd e D atos

mperez@fi.upm.es 19

Descripción física en MS-DOS (FAT)

FAT de 12 bits 4K agrupaciones FAT de 16 bits 64K agrupaciones

<eof>

<eof>

<eof>

<eof>

pep_dir dir 5 27

fiche1.txt 12 45

Directorio RaízN om bre A trib . KB Agrup.

Directorio pep_dir

carta1.wp R 24 74

prue.z ip 16 91 7576

91

51

74

45

58

27

FAT

7576

58

92

N om bre A trib . KB Agrup.

mperez@fi.upm.es 20

Directorios: visión lógica

Un directorio es una tabla de entradas que asocia nombres simbólicos a ficheros.

Esquema jerárquico. Cuando se abre un fichero el SO busca el nombre en la

estructura de directorios. Operaciones sobre un directorio:

Crear (insertar) y borrar (eliminar) directorios. Abrir y cerrar directorios. Renombrar directorios. Leer entradas de un directorio. Montar (combinar)

La organización jerárquica de un directorio Simplifica el nombrado de ficheros (nombres únicos) Proporciona una gestión de la distribución => agrupar ficheros de forma

lógica (mismo usuario, misma aplicación)

mperez@fi.upm.es 21

Directorios: visión física

Directorios en MS-DOS

Directorios en UNIX

B y te s 8 3 1 1 0 2 2 2 4

E x te n s ió n

N o m b r e

A t r i b u to s

R e s e rv a d o

H o r a F e c h a P r im e r a

a g ru p a c ió n

( F A T )

T a m a ñ o

N om bre de fichero

N úm ero de nodo-i

Bytes 2 14

mperez@fi.upm.es 22

Volúmenes y particiones

Volumen: conjunto coherente de metainformación y datos. Ejemplos de volúmenes:

B o o t D o s c o p ia sd e la FAT

D ire c to r ioR a íz

D a to s yD ire c to r io s

B o o t n o d o s - iS u p e rB lo q u e

M ap a sd e b its

D a to s yD ire c to r io s

M S-DO S

UN IX

mperez@fi.upm.es 23

Volúmenes y particiones (II)

Descripción de volúmenes: El sector de arranque en MS-DOS El superbloque en UNIX

Relación volumen-dispositivo: Típico: 1 dispositivo N volúmenes (particiones) Grandes ficheros: N dispositivos 1 volumen

Típicamente cada dispositivo se divide en una o más particiones (en cada partición un volumen)

La tabla de particiones indica el principio, el tamaño y el tipo de cada partición.

mperez@fi.upm.es 24

Montado de volúmenes o particiones

Oculta el nombre del dispositivo físico o partición

En MS-DOS c:\tmp\datos.txt

/

/lib /bin /usr

/

/d1 /d2 /d3

/d3/f2/d3/f1

/

/lib /bin /usr

/usr/d1 /usr/d3

/usr/d3/f2/usr/d3/f1

Volumen raiz(/dev/hd0)

Volumen sin montar(/dev/hd1)

mount /dev/hd1 /usr

Volumen montado

mperez@fi.upm.es 25

Enlaces Permite que dos o más nombres hagan referencia al

mismo fichero.

Dos tipos: Enlace físico

El fichero sólo se elimina cuando se borran todos los enlaces Sólo se permiten enlazar ficheros (no directorios) del mismo

volumen.

Enlace simbólico El fichero se elimina cuando se borra el enlace físico. Si

permanece el enlace simbólico provoca errores al tratar de accederlo.

Se puede hacer con ficheros y directorios. Se puede hacer entre ficheros de diferentes volúmenes

mperez@fi.upm.es 26

Enlace físico

ln /user/pepe/datos.txt /user/juan/datos2.txt

/

usr lib

pepe

user

juan

prog.cdatos.txt

prog.c

..

.datos.txt

23100

28400

pepe

..

.

datos2.txt

80100

60 enlaces = 2prueba.txt

datos2.txtprueba.txt

28

descripción del fichero

juannodo-i 28

/

usr lib

pepe

user

prog.c prueba.txtdatos.txt

prog.c

..

.datos.txt

23100

28400

pepe

..

.prueba.txt

80100

60

juan

juan

mperez@fi.upm.es 27

Enlace simbólico

ln -s /user/pepe/da tos.txt /user/juan/datos2.tx t

/

us r lib

pe pe

user

juan

prog .cda to s.tx t

prog .c

..

.da to s.tx t

23100

130400

pe pe

..

.

da to s2.tx t

80100

60prue ba.tx t

da to s2.tx tprue ba.tx t

28

juan

en laces = 1

/use r/pepe /da tos .tx t

no do-i 1 30

en laces = 1

de scrip c ió n de l fichero

no do-i 2 8

/

us r lib

pe pe

user

prog .c prue ba.tx tda to s.tx t

prog .c

..

.da to s.tx t

23100

28400

pe pe

..

.prue ba.tx t

80100

60

juan

juan

mperez@fi.upm.es 28

Protección

Proteger del acceso inadecuado Distintos tipos de protección:

Lectura Escritura Ejecución Eliminación

Autenticación (¿quién?) Claves (paswords) Identificación física

Tarjetas inteligentes Reconocimiento de voz

Derechos de acceso (¿qué?) Objeto => qué usuarios y qué derechos Usuario => qué objetos y qué derechos

mperez@fi.upm.es 29

Ficheros, directorios y servicios en POSIX (UNIX)

Nombres de fichero y directorio: Nombre completo (empieza por /)

/usr/include/stdio.h

Nombre relativo al directorio actual (no empieza por /) stdio.h asumiendo que /usr/include es el directorio actual.

La entradas . y .. pueden utilizarse para formar rutas de acceso

../include/stdio.h ./../include/stdio.h /usr/./include/../include/stdio.h

Estos tres ficheros hacen referencia a stdio.h si /usr/include es el directorio actual

mperez@fi.upm.es 30

Ficheros, directorios y servicios en

POSIX (UNIX) (II) Tipos de fichero:

Normales Directorios Especiales

Descriptores de fichero: Entero no negativo que identifica un fichero abierto Se asignan en orden 0, 1, 2, ... Los procesos en su inicio:

0 entrada estándar 1 salida estándar 2 salida de error

Se heredan en el fork() Los ficheros abiertos siguen abiertos después del exec() Cuando se hace un fork() se comparte el puntero

mperez@fi.upm.es 31

Protección

Identificación de usuarios y grupos UID: identificador de usuario GID: identificador de grupo

Los procesos se ejecutan con UID real UID efectivo GID real GID efectivo

mperez@fi.upm.es 32

Protección (II)

Protección sobre un fichero UID del propietario y GID del grupo 9 bits de protección rwx para el propietario grupo y otros.

En ficheros r => leer w => escribir x => permiso de ejecución

En directorios r => listar contenidos w => crear o eliminar entradas x => permiso de acceso

mperez@fi.upm.es 33

Protección (III)

Bits SETUID y GETUID Si un proceso ejecuta un fichero con el SETUID activo

UID efectivo = UID del propietario del fichero Si un proceso ejecuta un fichero con el GETUID

activo GID efectivo = GID del propietario del fichero

Reglas de protección: Si UID efectivo = 0 se concede el acceso Si UID efectivo = UID del propietario se utiliza el

primer grupo de bits; si no Si GID efectivo = GID del propietario se utiliza el

segundo grupos de bits; si no Se utiliza el último grupo de bits.

mperez@fi.upm.es 34

Operaciones sobre ficheros

mperez@fi.upm.es 35

open. Abre un fichero Servicio:

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(char *name, int

flag, ...); Argumentos:

name: Puntero al nombre del fichero flags: Opciones de apertura:

O_RDONLY: Sólo lectura O_WRONLY: Sólo escritura O_RDWR: Lectura y escritura O_APPEND: El puntero de acceso

se desplaza al final del fichero abierto

O_CREAT: Si no existe no tiene efecto. Si no existe lo crea

O_TRUNC: Trunca si se abre para escritura

Devuelve: Un descriptor de fichero o -1

si hay error. Ejemplos:

fd = open

("/home/juan/datos.txt");

fd = open

("/home/juan/datos.txt", O_WRONLY | O_CREAT | O_TRUNC, 0750);

mperez@fi.upm.es 36

creat. Crea un fichero Servicio:

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int creat(char *name, mode_t mode);

Argumentos: name: Nombre de fichero mode: Bits de permiso para el

fichero Devuelve:

Devuelve un descriptor de fichero ó -1 si error.

Descripción: El fichero se abre para

escritura. Si no existe crea un fichero

vacío. UID_dueño = UID_efectivo GID_dueño = GID_efectivo

Si existe lo trunca sin cambiar los bits de permiso.

Ejemplos:fd = creat("datos.txt",

0751);fd = open("datos.txt",

O_WRONLY | O_CREAT | O_TRUNC, 0751);

mperez@fi.upm.es 37

read. Lectura de un fichero

Servicio:#include <sys/types.h>

ssize_t read(int fd, void *buf, size_t n_bytes);

Argumentos: fd: descriptor de fichero buf: zona donde almacenar

los datos n_bytes: número de bytes a

leer

Devuelve: Número de bytes

realmente leídos ó -1 si error

Descripción: Transfiere n_bytes. Puede leer menos datos

de los solicitados si se rebasa el fin de fichero o se interrumpe por una señal.

Después de la lectura se incrementa el puntero del fichero con el número de bytes realmente transferidos.

mperez@fi.upm.es 38

write. Escritura de un fichero

Servicio:#include <sys/types.h>

ssize_t write(int fd, void *buf, size_t n_bytes);

Argumentos: fd: descriptor de fichero buf: zona de datos a escribir n_bytes: número de bytes a

escribir Devuelve:

Número de bytes realmente escritos -1 si error

Descripción: Transfiere n_bytes. Puede escribir menos

datos de los solicitados si se rebasa el tamaño máximo de un fichero o se interrumpe por una señal.

Después de la escritura se incrementa el puntero del fichero con el número de bytes realmente transferidos.

Si se rebasa el fin de fichero el fichero aumenta de tamaño.

mperez@fi.upm.es 39

close. Cierra un descriptor de fichero

Servicio:int close(int fd);

Argumentos: fd: descriptor de fichero

Devuelve: Cero o -1 si error.

Descripción: El proceso pierde la asociación a un fichero.

mperez@fi.upm.es 40

lseek. Modifica el valor del puntero de posición

Servicio:#include <sys/types.h>

#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

Argumentos: fd: Descriptor de fichero offset: desplazamiento whence: base del

desplazamiento Devuelve:

La nueva posición del puntero ó -1 si error.

Descripción: Coloca el puntero de

acceso asociado a fd La nueva posición se

calcula: SEEK_SET: posición =

offset SEEK_CUR: posición =

posición actual + offset SEEK_END: posición =

tamaño del fichero + offset

mperez@fi.upm.es 41

dup. Duplica un descriptor de fichero

Servicio:int dup(int fd);

Argumentos: fd: descriptor de fichero

Devuelve: Un descriptor de fichero

que comparte todas las propiedades del fd ó -1 si error.

Descripción: Crea un nuevo

descriptor de fichero que tiene en común con el anterior:

Accede al mismo fichero

Comparte el mismo puntero de posición

El modo de acceso es idéntico.

El nuevo descriptor tendrá el menor valor numérico posible.

mperez@fi.upm.es 42

ftruncate. Asigna espacio a un fichero

Servicio: #include <unistd.h> int ftruncate(int fd, off_t length);

Argumentos: fd descriptor de fichero length nuevo tamaño del fichero

Devuelve: Devuelve 0 ó -1 si error.

Descripción: El nuevo tamaño del fichero es length. Si length es

0 se trunca el fichero.

mperez@fi.upm.es 43

Operaciones sobre directorios

mperez@fi.upm.es 44

opendir. Abre un directorio

Servicio: #include <sys/types.h>

#include <dirent.h>

DIR *opendir(char *dirname);

Argumentos: dirname puntero al nombre del directorio

Devuelve: Un puntero para utilizarse en readdir() o closedir().

NULL si hubo error. Descripción:

Abre un directorio como una secuencia de entradas. Se coloca en el primer elemento.

mperez@fi.upm.es 45

readdir. Lectura de entradas de directorio

Servicio: #include <sys/types.h> #include <dirent.h>

struct dirent *readdir(DIR *dirp); Argumentos:

dirp puntero retornado por opendir(). Devuelve:

Un puntero a un objeto del tipo struct dirent que representa una entrada de directorio o NULL si hubo error.

Descripción: Devuelve la siguiente entrada del directorio asociado a dirp. Avanza el puntero a la siguiente entrada. La estructura es dependiente de la implementación. Debería

asumirse que tan solo se obtiene un miembro: char *d_name.

mperez@fi.upm.es 46

closedir. Cierra un directorio

Servicio: #include <sys/types.h> #include <dirent.h>

int closedir(DIR *dirp);

Argumentos: dirp puntero devuelto por opendir().

Devuelve: Cero ó -1 si error.

Descripción: Cierra la asociación entre dirp y la secuencia de

entradas de directorio.

mperez@fi.upm.es 47

rewindir. Sitúa el puntero de directorio

Servicio: #include <sys/types.h> #include <dirent.h>

void rewindir(DIR *dirp); Argumentos:

dirp puntero devuelto por opendir() Descripción: Sitúa el puntero de posición dentro del directorio en

la primera entrada.

mperez@fi.upm.es 48

mkdir. Crea un directorio

Servicio: #include <sys/types.h>

#include <dirent.h>

int mkdir(char *name, mode_t mode); Argumentos:

name nombre del directorio mode bits de protección

Devuelve: Cero ó -1 si error

Descripción: Crea un directorio de nombre name. UID_dueño = UID_efectivo GID_dueño = GID_efectivo

mperez@fi.upm.es 49

rmdir. Borra un directorio

Servicio: #include <sys/types.h>

int rmdir(char *name);

Argumentos: name nombre del directorio

Devuelve: Cero ó -1 si error

Descripción: Borra el directorio si está vacío. Si el directorio no está vacío no se borra.

mperez@fi.upm.es 50

link. Crea una entrada de directorio

Servicio: #include <unistd.h>

int link(char *existing, char *new); Argumentos:

existing nombre del fichero existente. new nombre de la nueva entrada que será un enlace al fichero

existente. Devuelve:

Cero ó -1 si error. Descripción:

Crea un nuevo enlace para un fichero existente. El sistema no registra cuál es el enlace original. existing no debe ser el nombre de un directorio salvo que se

tenga privilegio suficiente y la implementación soporte el enlace de directorios.

mperez@fi.upm.es 51

unlink. Elimina una entrada de directorio

Servicio: #include <sys/types>

int unlink(char *name);

Argumentos: name nombre de fichero

Devuelve: Cero ó -1 si error

Descripción: Elimina la entrada de directorio y decrementa el número de

enlaces del fichero correspondiente. Cuando el número de enlaces es igual a cero y ningún proceso lo

mantiene abierto, se libera el espacio ocupado por el fichero y el fichero deja de ser accesible.

mperez@fi.upm.es 52

chdir. Cambia el directorio actual

Servicio: int chdir(char *name);

Argumentos: name nombre de un directorio

Devuelve: Cero ó -1 si error

Descripción: Modifica el directorio actual, aquel a partir del cual

se forman los nombre relativos.

mperez@fi.upm.es 53

rename. Cambia el nombre de un fichero

Servicio: #include <unistd.h>

int rename(char *old, char *new);

Argumentos: old nombre de un fichero existente new nuevo nombre del fichero

Devuelve: Cero ó -1 si error

Descripción: Cambia el nombre del fichero old. El nuevo nombre es new.

mperez@fi.upm.es 54

getcwd. Obtiene el nombre del directorio

actual Servicio: char *getcwd(char *buf, size_t size);

Argumentos: buf puntero al espacio donde almacenar el nombre

del directorio actual size longitud en bytes de dicho espacio

Devuelve: Puntero a buf o NULL si error.

Descripción: Obtiene el nombre del directorio actual

mperez@fi.upm.es 55

Protección

mperez@fi.upm.es 56

access. Accesibilidad sobre un fichero

Servicio: #include <unistd.h>

int access(char *name, int amode); Argumentos:

name nombre del fichero amode modo de acceso que se quiere comprobar. amode es el OR inclusivo de R_OK, W_OK, X_OK o F_OK.

Devuelve: 0 si el proceso tiene acceso al fichero (para lectura,

escritura o ejecución) ó -1 en caso contrario

mperez@fi.upm.es 57

Descripción: Utiliza el UID real y el GID real (en lugar de los

efectivos) para comprobar los derechos de acceso sobre un fichero.

Ejemplos: access("fichero", F_OK) devuelve 0 si el fichero

existe ó -1 si no existe. access("fichero", R_OK|W_OK) devuelve 0 si el

proceso que ejecuta la llamada tiene permisos de acceso de lectura y escritura sobre el fichero (utilizando el UID real y el GID real).

access. Accesibilidad sobre un fichero (II)

mperez@fi.upm.es 58

umask.Asigna la máscara de

creación Servicio: #include <sys/types.h>

#include <sys/stat.h>mode_t umask(mode_t cmask);

Argumentos: cmask bits de permiso a desasignar en la creación de ficheros.

Devuelve: Devuelve la máscara previa

Descripción: Asigna la máscara de creación de ficheros del proceso que la

invoca. Los bits activos en la máscara son desactivados en la palabra de

protección del fichero. Si máscara =022 , y se crea un fichero con bits 0777 , los

bits reales del fichero serán 0755 .

mperez@fi.upm.es 59

chmod.Cambia los bits de

permiso Servicio: #include <sys/types.h>

#include <sys/stat.h>

int chmod(char *name, mode_t mode); Argumentos:

name nombre del fichero mode Nuevos bits de protección

Devuelve: Cero ó -1 si error.

Descripción: Modifica los bits de permiso y los bits SETUID y SETGID del

fichero. Sólo el propietario del fichero puede cambiar estos bits

mperez@fi.upm.es 60

chown.Cambia la propiedad de un

fichero Servicio: #include <sys/types.h>

#include <unistd.h>

int chown(char name, uid_t owner, gid_t group); Argumentos:

name nombre del fichero owner nuevo propietario del fichero group nuevo identificador de grupo del fichero

Devuelve: Cero ó -1 si error

Descripción: Modifica el identificador de usuario y de grupo del fichero Los bits SETUID y SETGID son borrados

mperez@fi.upm.es 61

Atributos

mperez@fi.upm.es 62

stat, fstat Información sobre un

fichero Servicio:

#include <sys/types.h>#include <sys/stat.h>int stat(char *name, struct stat *buf);int fstat(int fd, struct stat *buf);

Argumentos: name nombre del fichero fd descriptor de fichero buf puntero a un objeto de tipo struct stat donde

se almacenará la información del fichero. Devuelve:

Cero ó -1 si error

mperez@fi.upm.es 63

stat, fstat Información sobre un

fichero Descripción:

Obtiene información sobre un fichero y la almacena en una estructura de tipo struct stat:

struct stat {

mode_t st_mode; /* modo del fichero */

ino_t st_ino; /* número del fichero */

dev_t st_dev; /* dispositivo */

nlink_t st_nlink; /* número de enlaces */

uid_t st_uid; /* UID del propietario */

gid_t st_gid; /* GID del propietario */

off_t st_size; /* número de bytes */

time_t st_atime; /* último acceso */

time_t st_mtime; /* última modificacion */

time_t st_ctime; /* último modificacion de datos */

};

mperez@fi.upm.es 64

stat, fstat Información sobre un

fichero

Comprobación del tipo de fichero aplicado a st_mode:

S_ISDIR(s.st_mode) Cierto si directorio

S_ISCHR(s.st_mode) Cierto si especial de caracteresS_ISBLK(s.st_mode) Cierto si especial de bloquesS_ISREG(s.st_mode) Cierto si fichero normalS_ISFIFO(s.st_mode) Cierto si pipe o FIFO

mperez@fi.upm.es 65

utime.Fechas último acceso y

modifación Servicio: #include <sys/stat.h> #include <utime.h>

int utime(char *name, struct utimbuf *times); Argumentos:

name nombre del fichero times estructura con las fechas de último acceso y modificación.

time_t actime fecha de acceso time_t mctime fecha de modificación

Devuelve: Devuelve 0 ó -1 si error

Descripción: Cambia las fechas de último acceso y última modificación según

los valores de la estructura struct utimbuf

mperez@fi.upm.es 66

Ejemplo. Copia un fichero en otro

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>

#define BUFSIZE 512

main(int argc, char **argv) { int fd_ent, fd_sal; char buffer[BUFSIZE]; int n_read;

/* abre el fichero de entrada */ fd_ent = open(argv[1], O_RDONLY); if (fd_ent < 0) { perror("open"); exit(1); }

mperez@fi.upm.es 67

Ejemplo. Copia un fichero en otro (II)

/* crea el fichero de salida */ fd_sal = creat(argv[2], 0644); if (fd_sal < 0) { close(fd_ent); perror("open"); exit(1); }

/* bucle de lectura del fichero de entrada */ while ((n_read = read(fd_ent, buffer, BUFSIZE)) > 0) { /* escribir el buffer al fichero de salida */ if (write(fd_sal, buffer, n_read) < n_read) { perror("write2); close(fd_ent); close(fd_sal); exit(1); } }

mperez@fi.upm.es 68

Ejemplo. Copia un fichero en otro (III)

if (n_read < 0) {

perror("read");

close(fd_ent); close(fd_sal);

exit(1);

}

close(fd_ent); close(fd_sal);

exit(0);

}

mperez@fi.upm.es 69

Ejemplo: redirecciones Programa que ejecuta ls > fichero

void main(void)

{

pid_t pid;

int status;

int fd;

fd = open("fichero", O_WRONLY|O_CREAT|O_TRUNC, 0644);

if (fd < 0) {

perror("open");

exit(1);

}

pid = fork();

switch(pid) { case -1: /* error */ perror("fork");

exit(1);

mperez@fi.upm.es 70

Ejemplo: redirecciones (II)

case 0: /* proceso hijo ejecuta "ls" */

close(STDOUT_FILENO); /* cierra la salida estandar */

dup(fd); /* duplica el descriptor del fichero */

close(fd);

execlp("ls","ls",NULL);

perror("execlp");

exit(1);

default: /* proceso padre */

close(fd); /* cierra el fichero */

while (pid != wait(&status));

}

exit(0);

}

mperez@fi.upm.es 71

Programa que lista un directorio

#include <sys/types.h>#include <dirent.h>#include <stdio.h> #define MAX_BUF 256

void main(int argc, char **argv){ DIR *dirp; struct dirent *dp; char buf[MAX_BUF];

/* imrpime el directorio actual */ getcwd(buf, MAX_BUF); printf("Directorio actual: %s\n", buf);

mperez@fi.upm.es 72

Programa que lista un directorio (II)

/* abre el directorio pasado como argumento */ dirp = opendir(argv[1]);

if (dirp == NULL) { fprintf(stderr,"No puedo abrir %s\n", argv[1]); } else {

/* lee entrada a entrada */ while ( (dp = readdir(dirp)) != NULL) printf("%s\n", dp->d_name); closedir(dirp); } exit(0);}

mperez@fi.upm.es 73

Descomposición en operaciones de bloques

Ficheros con estructura de bytes Escritura leer

F iche ro (tira de b yte s)F iche ro (tira de b yte s)

B loques

mperez@fi.upm.es 74

Descomposición en operaciones de

bloques (II) Ficheros de registros de tamaño fijo

R1 R2 R3 R4 R5 R6

R1 R2R3 R4 R5 R6R3

R6

Bloque 2Bloque 1 Bloque 3

Bloque 1 Bloque 2 Bloque 3

mperez@fi.upm.es 75

Cache de bloques

Fundamento: Proximidad espacial Proximidad temporal Dos clases de flujos de E/S:

Usan una sola vez cada bloque Usan repetidamente los bloques

Acceso a disco mucho más lento que el acceso a memoria

mperez@fi.upm.es 76

Cache de bloques (II) Estructura de datos en memoria con los bloques más

frecuentemente utilizados

Lecturas adelantadas Limpieza de la cache (sync)

Principal problema: fiabilidad del sistema de ficheros.

Disco

Proceso

Disco

C ache

Proceso

C ache

mperez@fi.upm.es 77

Fiabilidad del sistema de ficheros

Fallos HW y SW pueden provocar fallos en un volumen Soluciones:

Hardware: Controladores que tratan con sectores con fallos Discos con información redundante (RAID)

Backups (copias de seguridad) En discos

En cintas Backups incrementales

A

BA

B

mperez@fi.upm.es 78

Consistencia del sistema de ficheros

Reparar fallos software en un volumen Ejemplo: herramienta fsck Dos tipos de consistencia:

Consistencia sobre bloques:

Número de bloque

31 2 4 5 6 7 8 9 101112

1 1 0 1 0 0 1 1 1 0 1 1Bloquesen uso

Bloqueslibres

31 2 4 5 6 7 8 9 101112

0 0 1 0 2 1 0 0 0 1 0 0

Volumen consistente

31 2 4 5 6 7 8 9 101112

1 1 0 1 0 0 1 1 1 0 1 1Bloquesen uso

Bloqueslibres

31 2 4 5 6 7 8 9 101112

0 0 1 0 1 1 0 0 0 1 0 0

Número de bloque

Bloque libre duplicado

Número de bloque

31 2 4 5 6 7 8 9 10 1112

1 1 0 1 0 0 1 1 1 0 1 1Bloquesen uso

Bloqueslibres

31 2 4 5 6 7 8 9 10 1112

0 0 0 0 1 1 0 0 0 1 0 0

Número de bloque

31 2 4 5 6 7 8 9 10 1112

1 1 0 1 0 0 2 1 1 0 1 1Bloquesen uso

Bloqueslibres

31 2 4 5 6 7 8 9 10 1112

0 0 1 0 1 1 0 0 0 1 0 0

Bloque perdido

Bloque de datosduplicado

mperez@fi.upm.es 79

Consistencia del sistema de ficheros (II)

Consistencia sobre ficheros: Contador de enlaces > contador real Contador de enlaces < contador real Número de nodo-i > Número total de nodos-i Ficheros con bits de protección 0007 Ficheros con privilegios en directorios de usuario

mperez@fi.upm.es 80

Introducción a los sistemas de ficheros

distribuidos (NFS) Objetivo: compartir y distribuir ficheros entre diferentes

máquinas.

En B mount -t nfs maqA:/bin /bin mount -t nfs maqA:/usr /usr

MáquinaA

include

/

binusr

lib

MáquinaB

/

homebin usr

top related