Device Mapper : une explication simple

Device Mapper : une explication simple

Le Device Mapper (ou Carte/Correspondance des périphériques en français) permet de créer un périphérique block (un « disque dur »…) à partir d’autres périphériques blocks. 

En d’autres termes, dans l’utilisation la plus simple, vous pouvez utiliser  des morceaux de partitions de plusieurs disques, pour créer un disque composite.

C’est utilisé surtout avec le LVM et le RAID logiciel.

Pour illustrer nos propos, nous allons créer un disque virtuel appelé virtualhd, composé d’un morceau de 100Mo pris sur le disque /dev/sdb et d’un morceau de 50Mo pris sur /dev/sdc.

Devices mapped to device

Les partitions /dev/sdb1 et /dev/sdc1 (créées avec fdisk) font environ 20Go :

[root@TEST /]# fdisk -l
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
(...)
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41943039    20970496  83  Linux
Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
(...)
   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048    41943039    20970496  83  Linux

 

Créons un disque virtualhd avec l’outil dmsetup :

[root@TEST /]# dmsetup create virtualhd
0 204800        linear  /dev/sdb1 0
204800 102400   linear  /dev/sdc1 1500000

(CTRL-D pour sortir)

 

Que signifient ces lignes ?

  • dmsetup create virtualhd
    • Le périphérique block /dev/mapper/virtualhd va être créé
  • 0 204800        linear  /dev/sdb1 0
    • Les 204 800 premiers secteurs (en partant de 0) de ce nouveau périphérique sont en fait les secteurs du périphérique /dev/sdb1, en partant du secteur 0
    • Le système utilise donc 204800 secteurs de /dev/sdb1 à partir du secteur 0
  • 204800 102400   linear  /dev/sdc1 1500000
    • Les 102400 secteurs suivants (donc à partir du 204800ème secteur) de ce nouveau périphérique sont en fait les secteurs du périphérique /dev/sdc1
    • Le système utilise donc 102400 secteurs de /dev/sdc1, à partir du secteur 1500000 (on suppose que les secteurs précédents de /dev/sdc1 sont déjà utilisés).
  • La taille d’un secteur est de 512 octets
    • Le premier morceau pris sur /dev/sdb1 fait 204800 secteurs = 104857600 octets = 100 Mo
    • Le deuxième morceau pris sur /dev/sdc1 fait 102400 secteurs = 52428800 octets = 50 Mo

Nous obtenons donc un nouveau périphérique :

[root@TEST /]# fdisk –l
(...)
Disk /dev/mapper/virtualhd: 157 MB, 157286400 bytes, 307200 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

Il est possible de formater ce disque, et de le monter dans un répertoire :

[root@TEST /]# mkfs.ext4 /dev/mapper/virtualhd
mke2fs 1.42.9 (28-Dec-2013)
(...)
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
[root@TEST /]# mount /dev/mapper/virtualhd /mnt/virtualhd/
[root@TEST /]# df -hP /mnt/virtualhd/
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/virtualhd  142M  1.6M  130M   2% /mnt/virtualhd

Un peu plus en details :

Le périphérique /dev/mapper/virtualhd est en fait un lien symbolique vers un device dans /dev :

[root@TEST /]# ls -lh /dev/mapper/virtualhd
lrwxrwxrwx. 1 root root 7 Jan 18 13:48 /dev/mapper/virtualhd -> ../dm-2

Ce device est le “vrai” device, dont on trouve le majeur/mineur (ici 253/2) :

[root@TEST /]# ls -lh /dev/dm-2
brw-rw----. 1 root disk 253, 2 Jan 18 13:48 /dev/dm-2

C’est le vrai majeur/mineur du device virtualhd qu’on retrouve dans la commande dmsetup ls :

[root@TEST /]# dmsetup ls
virtualhd       (253:2)
centos-swap     (253:1)
centos-root     (253:0)

Dans le résultat de cette commande, on constate que d’autres devices sont en fait des devices mappés ; ici, il s’agit en réalité de volumes logiques LVM, mais cela sera exploré dans un prochain article.

 

Pour finir, on affiche la table de correspondance du device avec la commande dmsetup table :

[root@TEST /]# dmsetup table
virtualhd: 0 204800 linear 8:17 0
virtualhd: 204800 102400 linear 8:33 1500000

On retrouve exactement les mêmes informations que lors de la création, à la simple exception des devices qui sont identifiés par leur majeur/mineur (8/17 et 8/33).

Quels sont les devices derrière ces majeurs/mineurs ?

[root@TEST /]# ls -lh /dev/sd[bc]1
brw-rw----. 1 root disk 8, 17 Jan 18 12:33 /dev/sdb1
brw-rw----. 1 root disk 8, 33 Jan 18 12:33 /dev/sdc1

Ce sont bien sûr sdb1 et sdc1 utilisés lors de la création.

Voir une application de Device Mapper avec LVM dans l’article suivant.