3IS - Système d`exploitation linux - Système de fichiers - Etis
Transcription
3IS - Système d`exploitation linux - Système de fichiers - Etis
3IS - Système d'exploitation linux Système de fichiers 2010 – David Picard Contributions de : Arnaud Revel, Mickaël Maillard [email protected] ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Notion de fichiers ● Fichiers ordinaires – ● Répertories – ● Conteneurs d'autres fichiers Liens – – ● Suite d'octets quelconque Liens matériels Liens symboliques (l) Fichiers spéciaux : périphériques /dev – – En mode caractère (c) En mode block (b) ● Pipes et pipes nommés ● sockets ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Cycle de vie CREATE OPEN WRITE READ SEEK CLOSE UNLINK ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Appels systèmes basic ● Ouverture : open() ● Fermeture : close() ● Lecture : read() ● Écriture : write() ● Recherche : lseek() ● Suppression : unlink() ● Infos : stat(), fstat(), lstat() ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Structure File en 0.01 struct file { unsigned short f_mode; /* Mode d'ouverture */ unsigned short f_flags; /* Drapeaux fichier */ unsigned short f_count; /* Nb de références */ struct m_inode * f_inode; /* Inode associée */ off_t f_pos; /* Déplacement */ }; ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS task_struct ● stack data task_struct fd1 iptr ● ref=1 position text Une liste des descripteurs de fichiers ouvert par le processus est sauvegardée dans la task_struct Une liste globale des fichiers ouverts est sauvegardée par le noyau ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Effet du fork() ● stack stack data task_struct fd1 text data task_struct fd1 text iptr ref=2 position ● La task_struct étant duppliquée, les descripteurs de fichiers aussi Le nombre de référence dans la liste des fichiers ouverts est augmenté ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Ouverture de deux fichiers ● stack data task_struct text fd1 fd2 iptr ref=1 position iptr ref=1 position ● Un nouveau descripteur est ajouté à la task_struct Un nouvelle entrée est créée dans la liste des fichiers ouverts (positions différentes) ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Commande dup() ● stack data task_struct text fd1 fd2 iptr ref=2 position ● Permet de duppliquer une entrée de la liste des descripteurs de fichiers Le nombre de références dans la liste des fichiers ouvert est incrémenté ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Système de fichiers (Filesystem) ● ● Un système de fichier est une structure de données permettant de stocker et d'organiser des fichiers et leurs données sur des supports de mémoire de masse La grande force de linux est de pouvoir cohabiter avec beaucoup d'autres SE, notamment en étant capable d'utiliser de nombreux systèmes de fichiers – ● ext2/3/4, MINIX, NTFS, FAT16/32, JFS, Reiser3/4, UDF, HFS, XFS, brtfs, … Sur les système UNIX, les fs sont une arborescence de répertoires contenant des fichiers ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Disque dur ● ● ● Un disque dur est un ensemble de plateaux rigides magnétiques en rotation À l'origine, le support magnétique est dans un état indéterminé Il faut le formatter – – Le formatage de bas niveau de blocs de 512 ou 1024 octets rend la surface du disque conforme à ce qu'attend le contrôleur hardware Le formatage haut niveau crée certaines unités fonctionnelles signifiantes pour les système d'exploitation ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Spécificité des FS ● ● ● ● Un système de fichiers correspond à l'organisation des blocs disponibles sur le disque Les opérations élémentaires d'accès aux fichiers (open(), read(), write(), etc) sont donc dépendantes du FS Pour que les programmes n'aient pas à se soucier du type de système de fichier, Linux met en place une couche d'abstraction appelée le VFS (Virtual Filesystem Switch) Le VFS se charge d'utiliser la bonne procédure d'accès en fonction du système de fichier utilisé ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS VFS cp inf = open(“/mnt/usbdisk/fichier.txt”, O_RDONLY, 0); outf = open(“/home/toto/fichier.txt”, O_WRONLY|O_CREAT|O_TRUNK, 0600); VFS do{ i = read(inf, buf, 4096); write(outf, buf, i); } while(i); close(outf); close(inf); ext3 FAT16 ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Système de fichiers supportés par le VFS ● FS sur disque – – – – ● FS en réseau – ● Dédiés à Linux (ext2/3/4, brtfs, Tux3, …) Unix (sysv, UFS, MINIX, …) Propriétaires (VFAT, NTFS, HFS, AFFS, …) Journalisés (JFS, XFS, …) Permettent d'accéder facilement à un FS situé sur un autre ordinateur (NFS, CIFS, NCP, AFS, …) FS spéciaux – FS virtuels permettant de simuler l'accès à certaines ressources comme des accès à des fichiers (/proc, /dev, ...) ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Implantation spécifique ● ● ● Ajout du champ f_op dans la structure file f_op contient des pointeurs vers les routines spécifiques au système de fichier sur lequel se trouve le fichier ouvert Les routines de services d'accès au fichier (read() par exemple) font appel aux routines pointées par la structure f_op file>f_op>read(...); ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Modèle objet du VFS ● Développé en C pur pour des question de performances ● L'objet superblock – ● L'objet inode – ● Contient des informations spécifique à un fichier (block de contrôle de fichier sur le disque), identifié par un numéro d'inode unique L'objet file – ● Stocke des informations sur le système de fichier (block de contrôle du fs sur le disque) Contient des informations sur l'état d'un fichier ouvert et son utilisation par un processus (n'existe qu'en mémoire) L'objet dentry – Information entre une entrée de répertoire (nom de fichier) et le fichier correspondant (enregistré sur le disque de manière spécifique au fs) ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Exemple disque Processus 1 Objet superblock Objet inode Objet dentry Objet dentry Objet file 1 Objet file 2 ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS struct super_block struct super_block { struct list_head s_list; // liste de superblock dev_t s_dev; // identifiant de périphérique ... unsigned char s_blocksize_bits; // taille block en bits unsigned long s_blocksize; //taille block en octets loff_t s_maxbytes; //taille max des fichiers struct file_system_type *s_type; //type de fs const struct super_operations *s_op; // pointeurs fonctions sb ... struct dentry *s_root; // dentry de la racine ... int s_count; //compteur de références ... struct list_head s_inodes; //list des inodes ... struct list_head s_files; //liste de fichiers ... struct block_device *s_bdev; //pilote du périphérique ... struct list_head s_instances; // list des sb du type de fs ... char s_id[32]; // nom du périphérique void *s_fs_info; // info sur le fs } ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS struct super_block ● ● ● s_fs_info contient des informations sur le système de fichier, spécifique au type de fichier Généralement des informations contenu sur le disque, et recopiées en mémoire pour des raisons d'efficacité s_op contient des pointeurs vers les routines d'opérations sur les superblocks, donc spécifique au type de fs – Ex : sb>s_op>read_inode(inode); ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS struct inode struct inode { ... struct list_head i_sb_list; // list des inodes du sb struct list_head i_dentry; //list des dentry qui font référence à l'inode unsigned long i_ino; // numéro d'inode atomic_t i_count; // compteur d'utilisation unsigned int i_nlink; //nombre de liens physique uid_t i_uid; //id du propriétaire gid_t i_gid; //id du groupe dev_t i_rdev; //id du périphérique unsigned int i_blkbits; // taille du block en bits loff_t i_size; //taille en octet struct timespec i_atime; //date d'accès struct timespec i_mtime; //date de modification struct timespec i_ctime; //date de création blkcnt_t i_blocks; //nombre de blocks contenant le fichier unsigned short i_bytes; //bombre d'octet utilisés dans le dernier block umode_t i_mode; //type de fichier et droits d'accès const struct inode_operations *i_op; // routines sur les inodes struct super_block *i_sb; //pointeur vers le superblock … } ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS struct file struct file { struct list_head struct dentry f_list; //list de fichier du processus *f_dentry; //répertoire contenant le fichier ... struct file_operations *f_op; //pointeurs de fonction atomic_t f_count; //conteur d'ouverture unsigned int f_flags; // drapeaux comme lecture seule, append, etc mode_t f_mode; // mode : read ou write int f_error; //erreur loff_t f_pos; //position dans le fichier struct fown_struct f_owner; // propriétaire du fichier unsigned int f_uid, f_gid; //id du propriétaire, du groupe ... size_t f_maxcount; ... }; ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS struct file_operations struct file_operations { // Pointer to the owning module struct module *owner; // Change read/write position loff_t (*llseek) (struct file *, loff_t, int); // Read data, returns number of read bytes ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); // Write ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); // Device specific (non read or write) commands int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); // The first operation on the driver, it can be left NULL but then the driver // won't be notified int (*open) (struct inode *, struct file *); // Most of the times called before closing the files. Demands that pending // operations be finished. int (*flush) (struct file *); // Implementation of file locking int (*lock) (struct file *, int, struct file_lock *); ... }; ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS struct dentry struct dentry { atomic_t d_count; unsigned int d_flags; /* protected by d_lock */ spinlock_t d_lock; /* per dentry lock */ int d_mounted; struct inode *d_inode; /* Where the name belongs to NULL is * negative */ struct hlist_node d_hash; /* lookup hash list */ struct dentry *d_parent; /* parent directory */ struct qstr d_name; struct list_head d_subdirs; /* our children */ struct list_head d_alias; /* inode alias list */ unsigned long d_time; /* used by d_revalidate */ const struct dentry_operations *d_op; // opérations sur les dentry struct super_block *d_sb; /* The root of the dentry tree */ void *d_fsdata; /* fsspecific data */ unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */ }; ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS struct dentry ● ● Objet uniquement en mémoire (pas de stockage sur disque) Un objet créé pour chaque répertoire lu – ● ● Ex : /tmp/test créé 3 dentry : un pour “/”, un pour “tmp” dans “/” et un pour “test” dans “tmp” Associe le répertoire à son inode Gérés dans un cache de manière à faire le moins de lecture disque possible (i.e. créer le moins de dentry possible) ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Système ext2 ● ● ● Inspiré du système de fichier MINIX Définition d'une taille de blocs optimale (1024 à 4096 octets) Regroupe les blocs en groupes – ● Les blocs et les inodes d'un même groupe sont proches sur le support physique, ce qui réduit le temps d'accès Allocation par anticipation – ext2 réserve plusieurs blocs à création d'un fichier, afin d'anticiper l'augmentation de la taille du fichier ● Support des fichier inaltérables ● Compatibilité avec les sémantiques SysVR4 et BSD ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Structures sur le disque Bloc d'amorce superbloc 1 bloc Groupe 0 Descripteurs de groupe n blocs Groupe n Carte des blocs de données Carte des inodes Table des inodes Bloc De données 1 bloc 1 bloc n bloc n blocs ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Groupe ● Chaque groupe contient un ensemble de blocs qui sont soit : – – – – – – Une copie du superbloc (seul le superbloc du groupe 0 est utilisé, les autres servent de sauvegarde) Une copie d'un bloc de descripteur des groupes (idem que pour le superbloc) Une carte d'allocation (bitmap) des blocs Une carte d'allocation (bitmap) des inodes Un tableau d'inodes Un ensemble de données d'un fichier ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Table d'inodes ● ● La table des inodes est un ensemble de blocs contenant les inodes du groupe Chaque inode fait 128 octets – – ● ● Un bloc de 1024 octets contient 8 inodes Un bloc de 4096 octets en contient 32 Le nombre d'inodes est indiqué dans le champs s_inode_per_group du superbloc Le nombre de blocs utilisés dépend de la taille des blocs et du nombre d'inodes par groupe ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS inode ● L'inode du système de fichier ext2 est très proche de celle du VFS – – – – – ● Contient la taille en octet et la taille en blocs Indicateur de propriétaire, de groupe Temps de d'accès, de modification Compteur de lien physique Date de suppression Contient une liste de numéros de blocs de données – __le32[EXT2_N_BLOCKS] i_block; – EXT2_N_BLOCKS généralement à 15 ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS bloc de données bloc de données bloc de données Direct 1 Direct 2 Direct 3 bloc de données bloc de données bloc d'indirection Direct 12 bloc d'indirection Double ind Triple ind bloc de données bloc d'indirection Simple ind bloc d'indirection inode bloc d'indirection bloc d'indirection bloc de données bloc d'indirection bloc de données bloc d'indirection bloc de données ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS i_block ● 15 numéros de blocs (position physique sur le disque) – – – – ● Les blocs d'indirection contient une liste de numéros de bloc – ● 12 premiers éléments sont les 12 premiers blocs de données du fichier (bloc 0 à bloc 11) 13ième élément est un bloc de simple indirection (bloc 12 à 11+b/4) 14ième élément un est bloc de double indirection (bloc 12+b/4 à 11+b/4+b²/16) 15ième élément est un bloc de triple indirection (bloc 12+b/4+b²/16 à 11+b/4+b²/16+b³/64) (taille du bloc / 4) blocs peuvent ainsi être référencés Le nombre maximum de blocs d'un fichier est donc : 12+ (b/4)+(b/4)²+(b/4)³ – – Avec b = 4096, on obtient environ 4To 48ko en adressage direct, 4Mo en simple indirection, et 4Go en double indirection ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Système ext3 ● Système de journalisation ● Possibilité d'agrandissement des partitions ● Indexation des répertoires contenant beaucoup de fichiers par H-Tree – ● accès plus rapide aux fichiers d'un répertoire Compatibilité avec ext2 – Possibilité de monter une partition ext3 comme une partition ext2, mais en perdant les options nouvelles ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Journalisation ● Principe : – – ● Si tout ce passe bien – ● On recopie le journal dans les blocs de données, on obtient le nouveau fichier Si crash pendant l'écriture dans le journal – ● On invalide les entrées du journal, on a le nouveau fichier Si crash pendant l'écriture sur les blocs de donnees – ● On écrit d'abord dans le journal Puis sur les blocs de données On ignore le contenu du journal, et garde l'ancien fichier Plus robuste, mais plus lent ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Type de journalisation ● Journalisé – – ● Ordonné – – ● On écrit les données et les méta-données dans le journal Le plus sûr, mais le plus lent On n'écrit que les méta-données dans le journal (nombre de blocs utilisés, etc) Moins sûr (possible perte de données, mais pas de corruption du fs), comportement par défaut d'ext3 Différé – – On n'écrit que les modification des méta-données dans le journal Le plus véloce, mais le moins robuste ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Système ext4 ● 1 Eo (1 million de To) de taille max ● Fichiers jusqu'à 16To ● Gestion par extents – – ● Journal checksumming – ● Ensembles de blocs continus Facilite la gestion des gros fichiers (jusqu'à 128Mo par extend) Vérification de la consistence du journal Allocation multiblocs – Lors de l'augmentation de la taille d'un fichier, plusieurs blocs peuvent être alloués d'un coup ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Système ext4 ● Nombre de fichiers dans un répertoire sans limite ● Allocation retardée – N'allouer les blocs qu'au dernier moment de l'écriture sur le disque ● fsck rapide (ne check pas les inodes inutilisées) ● Préallocation persistente ● Utilisation des barrières pour garantir l'intégrité – Les disques ont la facheuse tendance à réorganiser les ordres d'écritures → forcer l'exécution de certains write ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Extents (1) Tiré de The new ext4 filesystem: current status and future plans, A. Mathur 2007 ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Extents (2) /* * ext4_inode has i_block array (60 bytes total). * The first 12 bytes store ext4_extent_header; * the remainder stores an array of ext4_extent. */ /* * Each block (leaves and indexes), even inode-stored has header. */ struct ext4_extent_header { __le16 eh_magic; /* probably will support different formats */ __le16 eh_entries; /* number of valid entries */ __le16 eh_max; /* capacity of store in entries */ __le16 eh_depth; /* has tree real underlying blocks? */ __le32 eh_generation; /* generation of the tree */ }; ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Extents (3) /* * This is the extent on-disk structure. * It's used at the bottom of the tree. */ struct ext4_extent { __le32 ee_block; /* first logical block extent covers */ __le16 ee_len; /* number of blocks covered by extent */ __le16 ee_start_hi; /* high 16 bits of physical block */ __le32 ee_start_lo; /* low 32 bits of physical block */ }; /* * This is index on-disk structure. * It's used at all the levels except the bottom. */ struct ext4_extent_idx { __le32 ei_block; /* index covers logical blocks from 'block' */ __le32 ei_leaf_lo; /* pointer to the physical block of the next * * level. leaf or next index could be there */ __le16 ei_leaf_hi; /* high 16 bits of physical block */ __u16 ei_unused; }; ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Brtfs ● Changement de taille dynamique ● Défragmentation dynamique ● Ajout/suppression de périphérique bloc ● Balancement dynamique ● Subvolumes (sous-arborescence montable) ● Snapshots ● RAID-like mirroring et striping ● ... ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS