Il sistema operativo LINUX Il file system Indice Blocchi logici Indice

Transcript

Il sistema operativo LINUX Il file system Indice Blocchi logici Indice
Sistemi operativi – Modulo II
Il File System
Il sistema operativo LINUX
Il file system
Giorgio Di Natale <[email protected]>
Stefano Di Carlo <[email protected]>
Politecnico di Torino
Dip. Automatica e Informatica
Indice
• Struttura
– super block
– cylinder group
– inode
– directory
– link
• VFS: Virtual File System
• System calls
Blocchi logici
• Il file system è organizzato in blocchi logici
contigui
– dimensione fissa di 1024, 2048 o 4096 byte
– indipendente dalla dimensione del blocco fisico
(generalmente 512 byte)
• Un blocco speciale, detto super block, in
posizione fissa all’inizio del FS ne descrive le
caratteristiche
Super block
• Caratteristiche del FS
– dimensioni, struttura, …
• Parametri modificabili del FS
– max mount count, ...
• Stato del FS
– state, free blocks, mount count, …
• Non contiene informazioni sulla struttura fisica e sul
tipo di device utilizzato (perché ne costituisce una
astrazione)
G. Di Natale, S. Di Carlo
Indice
• Struttura
– super block
– cylinder group
– inode
– directory
– link
• VFS: Virtual File System
• System calls
struct ext2_super_block {
__u32 s_inodes_count;
__u32 s_blocks_count;
__u32 s_r_blocks_count;
__u32 s_free_blocks_count;
__u32 s_free_inodes_count;
__u32 s_first_data_block;
…
__u32 s_blocks_per_group;
__u32 s_inodes_per_group;
…
__u32 s_mount_count;
__u32 s_max_mount_count;
__u32 s_state;
…
};
•1
Sistemi operativi – Modulo II
Il File System
Indice
• Struttura
– super block
– cylinder group
– inode
– directory
– link
• VFS: Virtual File System
• System calls
Cylinder group
• Compartimentano il FS
– impediscono che un errore sulle bitmap e/o inode table
corrompa tutto il FS
• Replicano il super block e la group descriptor table
• Consentono di allocare i file nei pressi della directory
che li contiene
• dumpe2fs <device> mostra i gruppi di una
partizione ext2
Cylinder group
struct ext2_group_desc {
__u32 bg_block_bitmap;
__u32 bg_inode_bitmap;
__u32 bg_inode_table;
__u32 bg_free_blocks_count;
__u32 bg_free_inodes_count;
__u32 bg_used_dirs_count;
__u32 bg_pad;
__u32 bg_reserved[3];
};
Indice
• Struttura
– super block
– cylinder group
– inode
– directory
– link
• VFS: Virtual File System
• System calls
G. Di Natale, S. Di Carlo
Inode
• Ogni file o directory è associato ad un inode
– descrive le caratteristiche del file
– identifica i blocchi di cui è composto il file
• Numerati a partire da 1
• Alcuni sono riservati al sistema
– bad block inode, root inode, boot loader inode
•2
Sistemi operativi – Modulo II
Il File System
Inode
struct ext2_inode {
__u32 i_mode;
__u32 i_uid;
__u32 i_size; /* Size in bytes (major/minor device) */
__u32 i_atime; /* Access time */
__u32 i_ctime; /* Creation time */
__u32 i_mtime; /* modification time */
__u32 i_gid;
__u32 i_links_count;
__u32 i_blocks; /* Blocks count */
__u32 i_flags;
…
__u32 i_block[EXT2_N_BLOCKS];
…
};
0
1
Data
0
1
Data
0
11
13
14
0
11
255
indirect block
double
indirect block
15
triple
indirect block
12
Data
13
0
0
...
...
255
255
Data
15
0
0
0
...
...
255
255
255
triple
indirect block
Data
Indice
• Struttura
– super block
– cylinder group
– inode
– directory
– link
• VFS: Virtual File System
• System calls
14
indirect block
double
indirect block
Data
...
G. Di Natale, S. Di Carlo
13
Data
Data
...
12
Data
Data
...
256
255
Data
0
0
Data
...
...
65536
255
255
Data
0
0
0
...
...
...
255
255
255
3
256
Data
Directory
• E’ un file che contiene record di tipo directory
entry
• Una directory entry associa un nome file al suo
inode
•3
Sistemi operativi – Modulo II
Il File System
Directory
Directory entry
#define EXT2_NAME_LEN 255
struct ext2_dir_entry {
__u32 inode;
__u32 rec_len; /* Directory entry length */
__u32 name_len;
__u32 name[EXT2_NAME_LEN];
};
Indice
• Struttura
– super block
– cylinder group
– inode
– directory
– link
• VFS: Virtual File System
• System calls
link
• Hard link (fisico)
– directory entry che punta ad un inode puntato da un
altra directory entry
– no cross-file system
• Soft link (simbolico)
– directory entry che punta ad un inode che punta ad un
blocco contenente il path name del file corrispondente
• Fast soft link
– il path name (<60 byte) è memorizzato nell’inode (nei
15 byte dell’i_block)
Fast Symbolic Link
Indice
• Struttura
– super block
– cylinder group
– inode
– directory
– link
• VFS: Virtual File System
• System calls
G. Di Natale, S. Di Carlo
•4
Sistemi operativi – Modulo II
Il File System
Virtual File System
• Linux supporta diversi FS:
– ext2, minix, msdos, vfat, iso9660, hpfs, …
• VFS astrae il particolare FS fisico occupandosi di
mappare le system call orientate ai file sulle funzioni
supportate dal FS
• Al mount VFS individua (attraverso una tabella di
configurazione del kernel) la specifica funzione da
utilizzare che:
– legge il super blocco e ne inizializza le variabili
– restituisce a VFS un descrittore di file con cui verranno
mappate le successive system call
Indice
• Struttura
– super block
– cylinder group
– inode
– directory
– link
• VFS: Virtual File System
• System calls
File descriptor
• Individua univocamente un file aperto
• Ciascun processo può utilizzare fino a
OPEN_MAX (<limits.h>) file descriptor
• File descriptor di default:
– 0 standard input
– 1 standard output
– 2 standard error
open( )
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *path, int flags);
int open(const char *path, int flags,
mode_t mode);
int fd;
fd=open(“file.txt”,O_WRONLY|O_CREAT,
S_IRUSR|S_IWRUSR);
open( )
#include <sys/types.h>
#include <sys/stat.h>
Setta i permessi
#include <fcntl.h>
quando si crea un
nuovo file
int open(const char *path, int flags);
int open(const char *path, int flags,
mode_t mode);
int fd;
fd=open(“file.txt”,O_WRONLY|O_CREAT,
S_IRUSR|S_IWUSR);
G. Di Natale, S. Di Carlo
flags
• Di base:
– O_RDONLY
– O_WRONLY
– O_RDWR
• In bitwise-or:
– O_CREATE
– O_EXCL
– O_TRUNC
– O_APPEND
open for read-only access
open for write-only access
open for read/write access
crea il file se non esiste
errore se O_CREAT è settato e il
file esiste
rimuove il ceontenuto del file
appende al file
•5
Sistemi operativi – Modulo II
Il File System
modi
• S_I[RWX]USR
• S_I[RWX]GRP
• S_I[RWX]OTH
rwx --- ----- rwx ----- --- rwx
open( ): mode
• I permessi con cui viene effetivamente creato
un file sono modificati dall’umask dell’utente
proprietario del processo
– mode & (~umask)
access( )
access( )
#include <unistd.h>
int access(char *pathname, int mode);
if ( access(“f1.txt”, F_OK) ) {
/* file exists */
}
• Return value:
– 0 KO
– 1 OK
• Mode:
– R_OK read access
– W_OK write access
– X_OK execute access
– F_OK file exists
read( )
#include <sys/types.h>
#include <unistd.h>
int read(int fd, void *buf, size_t nbytes);
Return values:
-1
error
0
EOF
n
numero di byte letti
G. Di Natale, S. Di Carlo
write( )
#include <sys/types.h>
#include <unistd.h>
int write(int fd, void *buf, size_t nbytes);
write scrive sui buffer di sistema, non sul disco!
fd = open (file, O_WRONLY | O_SYNC);
O_SYNC forza la sync dei buffer, ma solo su FS ext2
•6
Sistemi operativi – Modulo II
Il File System
close( )
lseek( )
#include <sys/types.h>
#include <unistd.h>
int lseek(int fd, off_t offset, int base);
#include <unistd.h>
int close(int fd);
• Base:
– SEEK_SET
dall’inizio del file
– SEEK_CURR dalla posizione corrente
– SEEK_END
dalla fine del file
• Esempio:
– lseek(fd, (off_t) 0, SEEK_SET);
Return values:
-1
error
0
OK
stat( )
#include <sys/stat.h>
#include <unistd.h>
int fstat(inf fd, struct stat *sbuf);
int stat(char *path, struct stat *sbuf);
int lstat(char *path, struct stat *sbuf);
• Restituisce in sbuf l’inode del file
• Se il file è un link simbolico, lstat restituisce l’inode che
punta al nome file, anziché l’inode che punta al file
struct stat
dev_t
ino_t
umode_t
nlink_t
uid_t
gid_t
dev_t
off_t
time_t
time_t
time_t
st_dev;
st_ino;
st_mode;
st_nlink;
st_uid;
st_gid;
st_rdev;
st_size;
st_atime;
st_mtime;
st_ctime;
/* device number for file */
/* device number for device */
chmod( )
#include <sys/types.h>
#include <unistd.h>
int chmod(char *pathname, mode_t mode);
int fchmod(int fd, mode_t mode);
G. Di Natale, S. Di Carlo
umask( )
#include <unistd.h>
mode_t umask(mode_t mask);
oldmask = umask(0);
umask(oldmask);
•7
Sistemi operativi – Modulo II
Il File System
chown( )
#include <sys/types.h>
#include <unistd.h>
int chown(char *path, uid_t owner,
gid_t group);
int fchown(int fd, uid_t owner,
gid_t group);
mkdir( ) e rmdir( )
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int mkdir(char *pathname, mode_t mode);
int rmdir(char *pathname);
opendir( ), readdir( ) e closedir( )
#include <dirent.h>
DIR *opendir(char *pathname);
struct dirent *readdir(DIR *dirptr);
int closedir(DIR *dirptr);
opendir( ), readdir( ) e closedir( )
#include <dirent.h>
#include <stdio.h>
main {
DIR *dp;
struct dirent *link;
dp = opendir (“/home”);
while ((link=readdir(DP))!=0)
printf (“%s\n”, link->d_name);
closedir (dp);
}
link( ) e unlink( )
#include <unistd.h>
int link(char *src_path, char* newLink_path);
int unlink(char *pathname);
unlink rimuove l’inode se link count va a zero
G. Di Natale, S. Di Carlo
•8