Les partitions sous linux

mar. 10 décembre 2013 by y0no

Bien le bonjour ! Cela fait un petit moment que je ne suis pas venu par ici déposer un nouvel article. Profitant d'un cours que j'ai pu rédiger pour mon école je me suis dit qu'il serait intéressant de le partager ici. Nous parlerons donc aujourd'hui de la création de partition sous Linux et leur gestion!

Introduction

Une partition est par définition une zone logique située dans un disque dur, permettant d'isoler les données d'une partition à l'autre. Cela permet par exemple d'utiliser plusieurs systèmes de fichier sur un même disque dur.

Dans un système UNIX, les disques durs peuvent être trouvés dans le dossier /dev. Leurs noms diffèrent en fonction de leur nombre et de leur type. Leurs formes seront toujours /dev/XXY, où XX représente le type du disque dur et Y la lettre correspondant à son emplacement.

Les deux principaux types de disques durs que vous serez amenés à croiser sur votre système seront les disques IDE (hd) et les disques SATA (sd). Par exemple si nous voulons accéder au deuxième disque SATA présent sur un système son nom sera /dev/sdb (b étant la deuxième lettre de l'alphabet).

Si vous avez été curieux, peut être avez vous remarqué des fichiers dans le dossier /dev avec des noms tels que sda1, sda2, et sda3. Rien de bien compliqué ici, il s'agit tout simplement des différentes partitions présentes sur le disque représentées par le nom du disque, puis le numéro de la partition.

Affichage des partitions

L'utilitaire fdisk est très utile pour créer des partitions. Mais il s'avère aussi capable d'afficher les partitions présentes sur un disque dur comme dans l'exemple suivant:

[[email protected] y0no]# fdisk -l
Disk /dev/sda: 750.2 GB, 750156374016 bytes, 1465149168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: dos
Disk identifier: 0x0005b350

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *          63       64259       32098+  83  Linux
Partition 1 does not start on physical sector boundary.
/dev/sda2           64260     1060289      498015   82  Linux swap / Solaris
Partition 2 does not start on physical sector boundary.
/dev/sda3         1060290  1465149167   732044439   83  Linux
Partition 3 does not start on physical sector boundary.

Création de partitions

Tout d'abord il est important de vérifier qu'il reste de l'espace sur le disque dur avec la commande vue précédemment. Si c'est bien le cas nous allons pouvoir commencer à étudier la création de partitions.

Pour cela, continuons avec l'utilitaire fdisk:

[[email protected] y0no]# fdisk /dev/sdb

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 
Using default value 1
First sector (2048-16777215, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-16777215, default 16777215): 
Using default value 16777215

Command (m for help): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders, total 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x3f775d6d

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    16777215     8387584   83  Linux

Command (m for help): w

The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Comme nous pouvons le voir dans l'exemple juste au-dessus, il suffit de donner le nom du disque dur que l'on veut partionner pour arriver dans le shell fdisk. La commande n permet de créer une nouvelle partition. Il suffit ensuite de suivre les instructions pour définir un numéro de partition, son premier puis dernier secteur. Enfin on peut vérifier le résultat avec la commande p puis sauvegarder le tout avec w.

Voilà pour la création de partition, voyons maintenant comment définir son système de fichiers.

Définir le système de fichier

Théorie

Tout d'abord, un bref récapulatif de ce qu'est un système de fichier me semble ne pas être de trop. Un système de fichier (aussi appelé FileSystem) est une manière logique de stocker et d'organiser les fichiers sur un support de stockage (dans notre cas un disque dur). Chaque système de stockage à ses avantages et inconvénients que ce soit au niveau de la vitesse d'écriture, de lecture, ou de la journalisation. Sur les systèmes UNIX le filesystem recommandé est ext (EXtended Filesystem), il existe en 4 versions numérotées extX. Voyons les caractéristiques des versions encore utilisées:

  • ext2 est le système original de Linux, malheureusement il n'y a pas de journalisation des métadonnées. La routine de vérification du filesystem au démarrage peut donc être long.
  • ext3 est l'évolution de l'ext2, ses performances résident dans l'apparition de la journalisation des métadonnées pour une récupération rapide des fichiers.
  • ext4 est une "mise à jour" de l'ext3, il permet de gérer des disques dur de tailles très importantes (1 Eo) contenant des fichiers pouvant peser jusqu'à 16To.

Pratique

Passons maintenant à la pratique en formatant notre partition récemment crée. Pour cela rien de bien compliqué, il suffit d'utiliser l'utilitaire mkfs. Sur la majorité des systèmes d'exploitation l'utilisation de mkfs se résume à la commande suivante:

mkfs.XXXX /dev/YYYY

Où XXXX est le type de filesystem voulu et YYYY est la partition que nous voulons formater. Reprenons notre partition précédente et formatons la en ext4:

[[email protected] y0no]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.5 (29-Jul-2012)
Étiquette de système de fichiers=
Type de système d'exploitation : Linux
Taille de bloc=4096 (log=2)
Taille de fragment=4096 (log=2)
« Stride » = 0 blocs, « Stripe width » = 0 blocs
524288 i-noeuds, 2096896 blocs
104844 blocs (5.00%) réservés pour le super utilisateur
Premier bloc de données=0
Nombre maximum de blocs du système de fichiers=2147483648
64 groupes de blocs
32768 blocs par groupe, 32768 fragments par groupe
8192 i-noeuds par groupe
Superblocs de secours stockés sur les blocs : 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocation des tables de groupe : complété                        
Écriture des tables d'i-noeuds : complété                        
Création du journal (32768 blocs) : complété
Écriture des superblocs et de l'information de comptabilité du système de
fichiers : complété

Montage et démontage de la partition

Manuellement

Les commandes mount et umount permettent de gérer le montage d'une partition facilement. Et comme un exemple vaut plus que des mots:

[[email protected] y0no]# mount -t ext4 /dev/sdb1 /mnt/test/
[[email protected] y0no]# cat /etc/mtab 
rootfs / rootfs rw 0 0
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
udev /dev devtmpfs rw,relatime,size=10240k,nr_inodes=126817,mode=755 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /run tmpfs rw,nosuid,noexec,relatime,size=102704k,mode=755 0 0
/dev/disk/by-uuid/a1033ad6-cce1-4d99-a737-e5a74a8aca8c / ext4 rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered 0 0
tmpfs /run/lock tmpfs rw,nosuid,nodev,noexec,relatime,size=5120k 0 0
tmpfs /run/shm tmpfs rw,nosuid,nodev,noexec,relatime,size=283840k 0 0
fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0
gvfs-fuse-daemon /home/y0no/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=1000,group_id=1000 0 0
/dev/sdb1 /mnt/test ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0
[[email protected] y0no]# umount /mnt/test/

Donc résumons ce que nous venons de faire. Nous avons monté notre partition avec la commande mount, nous lui avons indiqué le type de filesystem à monter, l'emplacement de la partition, puis son point de montage.

Nous avons ensuite vérifié que notre montage était bel et bien monté en regardant dans le fichier /etc/mtab. Celui-ci tient en temps réel l'état des montages sur le système. A noter que sur les systèmes solaris ce fichier se nomme mnttab et non pas mtab.

Enfin nous avons démonté notre volume avec la commande umount en lui indiquant le point de montage à retirer.

Automatiquement

Concernant le montage automatique de nos partitions, nous allons nous tourner vers le fichier /etc/fstab. Ce fichier permet d'indiquer au système les partitions qu'il devra monter au démarrage. Nous allons donc y mettre notre partition et ses arguments de la manière suivante:

[[email protected] y0no]# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda1 during installation
UUID=a1033ad6-cce1-4d99-a737-e5a74a8aca8c /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda5 during installation
UUID=2ffbdf14-92c8-4ee5-a563-0a5930085ef2 none            swap    sw              0       0
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0

/dev/sdb1   /mnt/test   ext4    rw,acl  0   0

Nous indiquons au fichier la partition que nous voulons monter, son point de montage, puis son filesystem. La quatrième colonne indique les options de montage que nous souhaitons mettre en place (nous y reviendrons) et les colonnes suivantes concernent la programmation d'archivage et l'ordre de vérification qu'empruntera l'outil fsck.

Concernant les options nous avons autorisé l'accès en lecteur/écriture (rw) sur cette partition, puis nous y avons indiqué que nous souhaitions utiliser les ACLs pour la gestion des droits. Pourquoi les ACLs ? C'est ce que nous allons voir dans le prochain point de cet article. Mais d'abord, voyons les options que nous aurions pu ajouter:

  • noauto pour ne pas monter automatiquement la partition au démarrage.
  • noexec pour interdire l'exécution de fichier binaire.
  • user pour autoriser n'importe quel utilisateur à monter/démonter la partition.

Voilà c'est à peu près tout concernant le montage des partitions !

Gestion des droits et créations d'ACLs

Théorie

Les ACLs ne remplacent bien sûr pas la gestion des droits déjà implémentée dans les systèmes UNIX, mais a l'avantage de proposer une gestion affinée des droits dans des cas bien précis. Imaginons que nous voulions partager un de nos fichiers avec un autre utilisateur n'appartenant pas au même groupe que nous, la gestion UGO (User/Group/Other) ne permettrait pas de résoudre ce problème facilement sans modifier ou créer un groupe. C'est là qu'interviennent les ACLs. Mais avant de pouvoir en créer, il faut s'assurer que deux prérequis ont été respectés:

  • Le noyau doit gérer les ACLs
  • La partition est montée avec l'option acl (voir le point précédent)

Si tout est prêt, passons à la pratique !

Pratique

Commençons par créer un utilisateur n'appartenant pas à l'un de nos groupes:

[[email protected] y0no]# useradd bobi
[[email protected] y0no]# passwd bobi
Entrez le nouveau mot de passe UNIX : 
Retapez le nouveau mot de passe UNIX : 
passwd : le mot de passe a été mis à jour avec succès

Créons ensuite dans notre partition un fichier avec des droits, uniquement pour notre utilisateur:

[[email protected] /mnt/test]# touch fichierTest
[[email protected] /mnt/test]# chmod 700 fichierTest
[[email protected] /mnt/test]# chown y0no:y0no fichierTest
[[email protected] /mnt/test]# ls -al fichierTest
-rwx------ 1 y0no y0no 0 oct.  14 11:25 fichierTest
[[email protected] /mnt/test]# su bobi
[email protected]:/mnt/test$ echo "test" > fichierTest 
bash: fichierTest: Permission non accordée

Avec ce genre de droits notre utilisateur bobi ne pourra jamais accéder au fichier fichierTest, voyons comment résoudre ça avec une ACLs:

[email protected]:/mnt/test$ getfacl fichierTest 
# file: fichierTest
# owner: y0no
# group: y0no
user::rwx
group::---
other::---
[email protected]:~$ setfacl -m u:bobi:rwx /mnt/test/fichierTest
[email protected]:/mnt/test$ getfacl fichierTest 
# file: fichierTest
# owner: y0no
# group: y0no
user::rwx
user:bobi:rwx
group::---
mask::rwx
other::---

Comme on peut le voir au-dessus, la commande getfacl permet de voir les droits et les ACLs en actions sur un fichier ou un dossier. A la première exécution, nous voyons bien que l'utilisateur y0no est le seul à avoir des droits sur le fichier.

La commande setfacl, elle, permet de définir des droits. Dans notre exemple nous demandons au système d'ajouter à l'utilisateur bobi (u:bobi) les droits de lecture/écriture/exécution (:rwx) sur fichierTest.

Enfin nous exécutons une nouvelle fois getfacl pour vérifier que notre utilisateur à bel et bien une ACL le concernant. Nous pouvons maintenant vérifier les autorisations:

[email protected]:/mnt/test$ echo "test" > fichierTest 
[email protected]:/mnt/test$ cat fichierTest 
test

Conclusion

Pour résumer notre cheminement, nous avons vu comment créer et formater une partition grâce aux outils fdisk et mkfs. Nous avons ensuite appris à monter/démonter une partition manuellement avec mount et umount, puis automatiquement avec l'utilisation du fichier fstab. Enfin nous avons appris à affiner les droits d'un fichier avec l'utilisation des ACLs (commandes getfacl et setfacl).

Voilà, c'est tout pour aujourd'hui, sur ce à bientôt!


Comments