Système de fichiers virtuel : construire un système de fichiers Linux à partir d'un fichier ordinaire

Gazette Linux n°109 — Décembre 2004

Mike Chirico

Article paru dans le n°109 de la Gazette Linux de décembre 2004.

Traduction française par Antonin Mellier .

Relecture de la traduction française par Joëlle Cornavin .

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières
1. Introduction
2. Utilisation de RWX — L'ancienne façon de travailler en collaboration
3. ACL, Reiserfs et chiffrement AES : le noyau 2.6
4. Étude des ACL
5. Mise à niveau vers le noyau 2.6
6. Réferences
7. Autres articles de Mike Chirico

Copyright (c) 2004 (GPU Free Documentation License)Dernière Mise à jour: http://prdownloads.sourceforge.net/souptonuts/README_Virtual_FS.html?download Date: Sun Sep 19 01:08:31 EDT 2004


1. Introduction

Sous Linux, vous pouvez créer un fichier normal, le formater comme un système de fichiers ext2, ext3 ou reiser (reiserfs), puis le monter comme si c'était un disque physique. Il est ensuite possible de lire et d'écrire des fichiers sur ce périphérique nouvellement monté. Vous pouvez aussi copier le système de fichiers complet, puisque ce n'est qu'un fichier, sur un autre ordinateur. Si la sécurité est une de vos préoccupations, poursuivez votre lecture. Cet article vous montre comment chiffrer le système de fichiers et le monter avec les ACL (Access Control Lists, listes de contrôle d'accès). Ce comportement vous permet d'avoir un contrôle des droits plus étendu que les permissions traditionnelles, lire (r), écrire (w) et exécuter (x) pour les trois groupes d'utilisateurs file, owner et other.

C'est une excellente façon d'étudier différents systèmes de fichiers sans avoir à reformater un disque physique, c'est-à-dire que vous évitez la corvée de déplacer toutes vos données. Cette méthode est rapide — surtout par rapport à la préparation d'un lecteur physique. Ce qui est vraiment intéressant avec cette technique est que vous pouvez explorer différents systèmes de fichiers tels que reiserfs, ext3 ou ext2 sans avoir à acheter un disque physique supplémentaire. Du fait que le même fichier peut être monté sur plus d'un point de montage, vous pouvez alors être plusieurs à les étudier en même temps et partager le temps d'accès.

Créer un système de fichiers de cette manière vous permet de fixer une limite physique à la quantité d'espace utilisée qui, naturellement, sera égale à la taille du fichier. Ce peut être un avantage si vous devez déplacer ces informations sur d'autres serveurs. Puisque le contenu ne peut pas dépasser la taille du fichier, vous pouvez facilement garder une trace de la quantité d'espace disque actuellement utilisée.

Tout d'abord, créez un fichier de 20 Mo en exécutant la commande suivante :



$ dd if=/dev/zero of=disk-image count=40960

40960+0 enregistrements lus.
40960+0 enregistrements écrits

Un count de 40960 a créé un fichier de 20 Mo car, par défaut, dd utilise une taille de bloc de 512 octets, ce qui donne la taille de 40960*512=20971520.



$ ls -l disk-image

-rw-rw-r--    1 chirico  chirico  20971520 Sep  3 14:24 disk-image

Ensuite, pour le formater en tant que système de fichiers ext3, exécutez simplement la commande suivante :



$ /sbin/mkfs -t ext3 -q disk-image

mke2fs 1.32 (09-Nov-2002)
disk-image is not a block special device.
Proceed anyway? (y,n) y
 

Le système vous demande si vous voulez continuer car c'est un fichier et non un périphérique bloc. Pas de problème. Nous allons le monter en tant que périphérique virtuel (loopback device), de façon à ce que ce fichier simule un périphérique bloc.

Créez maintenant un répertoire qui servira de point de montage pour ce périphérique virtuel :



$ mkdir fs

Vous n'êtes maintenant plus qu'à une étape de la dernière. Il vous faut juste découvrir quel est le prochain numéro de périphérique virtuel disponible. Normalement, les périphériques virtuels commencent à zéro (/dev/loop0), puis augmentent normalement (/dev/loop1, /dev/loop2, ... /dev/loopn). Pour trouver facilement quels sont les périphériques virtuels utilisés actuellement, regardez dans /proc/mounts, car il se peut que la commande mount ne vous fournisse pas ce dont vous avez besoin.



$ cat /proc/mounts

rootfs / rootfs rw 0 0
/dev/root / ext3 rw 0 0
/proc /proc proc rw,nodiratime 0 0
none /sys sysfs rw 0 0
/dev/sda1 /boot ext3 rw 0 0
none /dev/pts devpts rw 0 0
/proc/bus/usb /proc/bus/usb usbdevfs rw 0 0
none /dev/shm tmpfs rw 0 0

Comme sur mon ordinateur je n'ai aucun périphérique virtuel monté, je peux donc commencer de zéro. Exécutez la commande suivante en tant que root ou avec un compte qui a les privilèges de super-utilisateur.



# mount -o loop=/dev/loop0 disk-image fs

C'est fait. Vous venez de monter le fichier en tant que périphérique. Maintenant, en jetant un coup d'œil à /proc/mounts, vous constatez que celui-ci utilise /dev/loop0 :



$ cat /proc/mounts

rootfs / rootfs rw 0 0
/dev/root / ext3 rw 0 0
/proc /proc proc rw,nodiratime 0 0
none /sys sysfs rw 0 0
/dev/sda1 /boot ext3 rw 0 0
none /dev/pts devpts rw 0 0
/proc/bus/usb /proc/bus/usb usbdevfs rw 0 0
none /dev/shm tmpfs rw 0 0
/dev/loop0 /home/chirico/junk/fs ext3 rw 0 0

Vous pouvez maintenant créer de nouveaux fichiers, écrire dedans, les lire, bref faire tout ce que vous feriez normalement sur un lecteur de disque. Tout d'abord, je donne accès au compte chirico.


# chown -R chirico.chirico /home/chirico/junk/fs

Maintenant, sous le compte chirico, il est possible de créer des fichiers :



$ cd /home/chirico/fs
$ mkdir one two three
$ ls -l

total 15
drwx------    2 chirico  chirico     12288 Sep  3 14:28 lost+found
drwxrwxr-x    2 chirico  chirico      1024 Sep  3 14:34 one
drwxrwxr-x    2 chirico  chirico      1024 Sep  3 14:34 three
drwxrwxr-x    2 chirico  chirico      1024 Sep  3 14:34 two

$ df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              17G   11G  4.6G  71% /
/dev/sda1              99M   83M   11M  89% /boot
none                   62M     0   62M   0% /dev/shm
/home/chirico/junk/disk-image
                       20M  1.1M   18M   6% /home/chirico/junk/fs

Pour démonter le système de fichiers, en tant que root, il vous suffit de faire appel à la commande umount. Pour libérer le périphérique virtuel, exécutez la commande losetup avec l'option -d. Vous pouvez utiliser les deux commandes comme suit :


# umount /home/chirico/junk/fs
# losetup -d /dev/loop0

2. Utilisation de RWX — L'ancienne façon de travailler en collaboration

Avant d'entamer la partie concernant les ACL, comment configureriez-vous les droits sur le système de fichiers pour que des utilisateurs puissent créer et enregistrer des documents que d'autres pourraient modifier ? Par exemple, supposons que les utilisateurs chirico et sporkey travaillent ensemble sur un projet.

Il faut donc les ajouter au même groupe. Voici les commandes nécessaires :


# groupadd sharefs
# chown -R root.sharefs /home/chirico/junk/fs
# chmod 2775 /home/chirico/junk/fs
# usermod -G sharefs sporkey
# usermod -G sharefs chirico

Notez que si ces changements n'entrent pas en vigueur pour vos utilisateurs (par exemple, s'ils étaient connectés quand vous avez exécuté les commandes), ils devront se déconnecter puis se reconnecter ou bien exécuter la commande :

 

$ newgrp sharefs

Ce n'est pas vraiment un problème, n'est-ce pas ? Poursuivez donc votre lecture pour voir comment les ACL permettent d'éviter cette étape.

Plus important, même si l'ancienne méthode fonctionnait pour vous, à un moment ou à un autre, il se peut qu'on doive ajouter de nouveaux utilisateurs au projet. Que ferez-vous si certains de ces utilisateurs n'ont besoin que d'un sous-ensemble des droits ? Par exemple, vous avez des développeurs, des testeurs, des gestionnaires, ainsi que quelques personnes spéciales. Il y a des limites à ce que les droits rwx peuvent faire. Les ACL résolvent beaucoup de ces problèmes.


3. ACL, Reiserfs et chiffrement AES : le noyau 2.6

Pour les étapes suivantes, je pars du principe que vous utilisez Red Hat Fedora Core 2. Si ce n'est pas le cas, reportez-vous à la section Mise à niveau vers le noyau 2.6 ci-dessous. Nous allons aborder quatre points dans cette section :

Votre installation de Fedora Core 2, par défaut, sera configurée pour loop, cryptoloop et aes, mais il y a fort peu de chances que vous ayez tous ces modules chargés. Donc, il faut exécuter les commandes suivantes pour les charger (vous devez être root) :



# modprobe loop
# modprobe cryptoloop
# modprobe aes

Créez ensuite un répertoire pour stocker les fichiers. Le système de fichiers Reiser exige plus d'espace que le système de fichiers ext3.



# mkdir /home/diskimg
# cd /home/diskimg

Au lieu de créer un fichier initialisé avec des zéros, comme vous l'avez fait avec le système de fichiers ext3, celui-ci va contenir des bits aléatoires, ce qui ajoutera un peu plus de sécurité.



# dd if=/dev/urandom of=disk-aes count=102400

Puisque nous devons chiffrer le périphérique virtuel, il faut utiliser losetup. Une invite vous demandera un mot de passe, dont vous devrez vous rappeler quand vous monterez le périphérique.



# losetup -e aes /dev/loop1 ./disk-aes

Password:

Cette étape est nouvelle également. Au lieu de formater le fichier directement, vous formaterez le périphérique virtuel, mais le fichier restera chiffré. Là encore, comme une invite vous demande si vous voulez continuer, saisissez juste y.



# mkfs -t reiserfs /dev/loop1

mkfs.reiserfs 3.6.13 (2003 www.namesys.com)                                                
                                                                                           
A pair of credits:                                                                   
Elena Gryaznova performed testing and benchmarking.                                  
                                                                                           
The  Defense  Advanced  Research  Projects Agency (DARPA, www.darpa.mil) is the      
primary sponsor of Reiser4.  DARPA  does  not  endorse  this project; it merely      
sponsors it.                                                                         
                                                                                           
                                                                                           
Guessing about desired format.. Kernel 2.6.8-1.521 is running.                       
Format 3.6 with standard journal                                                     
Count of blocks on the device: 12800                                                 
Number of blocks consumed by mkreiserfs formatting process: 8212                     
Blocksize: 4096                                                                      
Hash function used to sort names: "r5"                                               
Journal Size 8193 blocks (first block 18)                                            
Journal Max transaction length 1024                                                  
inode generation number: 0                                                           
UUID: 435e3495-5e2e-489d-bf55-1b5f9a44b670                                           
ATTENTION: YOU SHOULD REBOOT AFTER FDISK!                                            
        ALL DATA WILL BE LOST ON '/dev/loop1'!                                       

Continue (y/n):y                                                                     
Initializing journal - 0%....20%....40%....60%....80%....100%                        
Syncing..ok                                                                          
                                                                                           
Tell your friends to use a kernel based on 2.4.18 or later, and especially not a     
kernel based on 2.4.9, when you use reiserFS. Have fun.                              
                                                                                           
ReiserFS is successfully created on /dev/loop1.                                      

Créez le point de montage /fs et montez ce périphérique. Notez que vous ajouterez l'option acl également. De plus, une invite vous demandera un mot de passe :



# mkdir /fs
# mount -o loop,encryption=aes,acl ./disk-aes /fs

Password:

Très bien. Maintenant, jetez un coup d'œil à la commande mount. Elle devrait apparaître sous la forme du système de fichiers Reiser, chiffré, utilisant les ACL. Notez qu'elle affiche loop2. Le montage a été effectué sur /dev/loop2, c'est-à-dire juste au dessus de ce qu'a spécifié losetup, /dev/loop1.



$ mount
/home/diskimg/disk-aes on /fs type reiserfs (rw,loop=/dev/loop2,encryption=aes,acl)


4. Étude des ACL

Les ACL (Access Control Lists) vous permettent d'avoir un contrôle plus précis sur les permissions d'accès. Avec le système de permissions rwx, vous ne pouvez pas facilement changer les droits sans créer de nouveaux groupes pour gérer les utilisateurs. Avec les ACL, vous pouvez définir des permissions utilisateur sans créer un groupe, et les utilisateurs peuvent ajouter ou supprimer des accès.

Ces droits sont définis avec la commande setfacl. La commande ci-dessous donnera aux utilisateurs donkey, chirico et bozo2 un accès au nouveau système de fichiers que nous avons monté. Là encore, je pars du principe que vous utilisez Fedora Core 2 ou une distribution compatible avec les ACL :


# setfacl -R -m d:u:donkey:rwx,d:u:chirico:rwx,d:u:bozo2:rwx /fs

Créez ensuite quelques répertoires comme si vous étiez un des utilisateurs. L'exemple qui suit a été créé en tant qu'utilisateur chirico :


$ mkdir /fs/one
$ touch /fs/one/stuff
$ ls -l /fs/one/stuff
-rw-rw----+ 1 chirico chirico 0 Sep  3 17:48 /fs/one/stuff

Notez le signe plus (+) à la dernière ligne. Il nous donne quelques indications sur l'utilisateur qui a accès. Donc, en tant qu'utilisateur chirico, je peux exécuter la commande getfacl :


$ getfacl /fs/one/stuff                                    

getfacl: Removing leading '/' from absolute path names     
# file: fs/one/stuff                                       
# owner: chirico                                           
# group: chirico                                           
user::rw-                                                  
user:chirico:rwx                #effective:rw-             
user:donkey:rwx                 #effective:rw-             
user:bozo2:rwx                  #effective:rw-             
group::r-x                      #effective:r--             
mask::rw-                                                  
other::---                                                 

Nous constatons à présent que donkey, chirico et bozo2 ont des droits effectifs sur ce fichier. chirico a assez de droits pour supprimer bozo2 :


$ setfacl -x u:bozo2 /fs/one/stuff
      $ getfacl /fs/one/stuff
      getfacl: Removing leading '/' from absolute path names
      # file: fs/one/stuff
      # owner: chirico
      # group: chirico
      user::rw-
      user:chirico:rwx
      user:donkey:rwx
      group::r-x
      mask::rwx
      other::---

Voilà un mince aperçu de ce que l'on peut faire avec les ACL. Pour plus d'informations, consultez quelques-unes des références ci-dessous.


5. Mise à niveau vers le noyau 2.6

Cet article vous initiera au noyau 2.6 si vous utilisez actuellement Red Hat 8® ou 9. Vous serez peut-être amené à y jeter un coup d'œil pour voir de quoi il est question. Si vous décidez de faire la mise à niveau, vous devrez configurer votre noyau ainsi :


      CONFIG_BLK_DEV_LOOP
      CONFIG_BLK_DEV_CRYPTOLOOP
      CONFIG_CRYPTO_AES_586

Cette modification s'effectue dans le fichier .config (vous pouvez télécharger mon fichier de configuration ici). Il suffit de chercher kernel-2.6.8.1-i686-chirico-reiserfsacl.config dans le tar.gz.

Outre la mise à niveau de votre noyau, vous aurez besoin de la dernière version de The Linux utilities. Actuellement, aucun correctif n'est nécessaire pour cette version. Dans le passé, il y a eu un correctif, mais cette version fonctionne très bien pour ce qui me concerne.

Vous aurez aussi besoin des Reiser tools.


6. Réferences

Linux Tips and Tricks (en anglais)

Regardez les astuces 12, 22 et 91 pour savoir comment utiliser ssh avec rsync. Vous pouvez créer un système de fichiers virtuel sur un serveur, puis le copier sur votre ordinateur portable. Lorsque vous travaillez sur votre portable, synchronisez vos changements avec rsync.

Un article de Linux Magazine® sur les ACL (en anglais)

Cet article traite de manière plus approfondie l'ajout et la suppression d'utilisateurs.

Access Control Lists in Linux (en anglais)

Un PDF de Andreas Graenbacher.

Advanced Linux Programming (en anglais)

De Mark Mitchell, Jeffrey Oldham et Alex Samuel, de CodeSourcery LLC, publié par New Riders Publishing, ISBN 0-7357-1043-0, Première édition, Juin 2001. Cet ouvrage est gratuit et vous pouvez le consulter en ligne. Le chapitre 6 décrit les périphériques virtuels.

Implementing Encrypted Home Directories (en anglais)

De W. Michael Petullo, 23 juillet 2003.

The Loopback Encrypted Filesystem HOWTO (en anglais)

De Ryan T. Rhea.


7. Autres articles de Mike Chirico

Lemon Parser Generator Tutorial (en anglais)

Il s'agit d'une alternative à yacc compacte et sûre par rapport aux threads. Elle est utilisée dans le projet sqlite.

Lectures recommandées (en anglais)

Lisez les suggestions faites par les uns et les autres. J'ai commencé une liste et j'y ajouterai les idées d'autres développeurs, lecteurs et de personnes qui semblent avoir de bonnes connaissances sur le sujet.

README_mysql.txt (en anglais)

Astuces pour MySQL.

README_COMCAST_EMAIL.txt (en anglais)

Astuces pour utiliser Comcast Email avec un PC sous Linux.

Mike Chirico, père de triplés (toutes des filles), vit aux États-Unis près de Philadelphie (Pennsylvanie). Il travaille sous Linux depuis 1996. Titulaire d'un Master en informatique et mathématiques de l'université de Villanova, il a occupé des emplois liés à l'informatique à Wall Street ainsi qu'à l'université de Pennsylvanie. Son héros est Paul Erdos, un brillant théoricien des nombres dont on connaissait l'ouverture vers les autres et la disponibilité pour collaborer avec tous. On peut consulter les notes de Mike sur sa page d'accueil : souptonuts.