Linux, les devices loop

· Read in about 3 min · (498 words)

Lorsque nous souhaitons faire des tests sur des systèmes de fichier de type bloc, on utilise des périphériques externes ou de l’espace disque interne. Dans mon cas, j’ai tout le temps de l’espace disponible sur mon disque principal que j’utilise pour faire mes tests en créant des partitions, cependant, dans le cas où nous n’avons plus d’espace libre, on utilise souvent des périphériques externes, telle qu’un disque dur ou une clé USB.

Pour permettre de créer des périphériques de loop, on utilise l’utilitaire losetup intégré dans le kernel Linux. Avant de créer un périphérique, il nous faut un emplacement. Pour cela, nous allons devoir créer un fichier assez volumineux puisque nous allons devoir associer notre périphérique à ce fichier. Pour cela, nous allons créer un fichier de 5Go:

$ touch test-bloc
$ sudo dd if=/dev/zero of=test-bloc bs=1024 count=5242880
$ ls -lh test-boc
-rw-r--r--  1 user user 5.0G Aug 15 21:43  test-bloc

Maintenant que notre fichier est prêt, nous allons associer un périphérique de loop avec notre fichier. Tout d’abord, on saisit la commande suivante qui indique le prochain périphérique non utilisé:

$ sudo losetup -f
/dev/loop0

Le résultat obtenu nous indique notre prochain périphérique. Pour le créer, il suffit de spécifier le périphérique avec notre fichier:

$ sudo losetup /dev/loop0 test-bloc

Puis, on vérifie si notre périphérique est bien créé:

$ sudo fdisk -l /dev/loop0
Disk /dev/loop0: 5 GiB, 5368709120 bytes, 10485760 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

Dans l’exemple ci-dessus, on voit bien que notre périphérique est bien créé et qu’il possède la taille de notre fichier. Nous avons désormais un périphérique de type bloc et nous pouvons l’utiliser comme un périphérique standard:

$ sudo mkfs.ext4 /dev/loop0
$ sudo mount /dev/loop0 /mnt
$ sudo df -h /mnt
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0      4.9G   20M  4.6G   1% /mnt

Nous pouvons aussi l’ajouter le fichier /etc/fstab pour le monter automatiquement sur le système:

$ cat /etc/fstab
[...]
/home/user/test-bloc        /mnt    ext4    user,loop               0 0

Lorsque nous n’avons plus besoins, nous pouvons supprimer le périphérique:

$ sudo losetup -a
/dev/loop0: [2050]:7090631 (/home/user/test-bloc)
$ sudo losetup -d /dev/loop0
$ sudo losetup -a
Bonus

J’ai fait un petit script en Python qui permet justement de créer un périphérique de loop puisque je suis un peu feignant de taper les 3 petites commandes ^^. Ce script est relativement simple, puisqu’il prend en paramètre le nom du fichier et la taille qu’on souhaite avoir pour le périphérique:

#!/bin/python

import sys,os

def errorParam():
	print("Usage: [file] [bloc size{K!M!G}]")
	exit()

if __name__=="__main__":
	if len(sys.argv) != 3: errorParam()

	file=sys.argv[1]
	a_size=sys.argv[2]

	s=a_size[len(a_size)-1:]
	if s!="K" and s!="M" and s!="G": errorParam()

	size=a_size[0:len(a_size)-1]
	
	if not size.isdigit(): errorParam()
	size=int(size)
	
	tsize=0
	if s=="K": tsize=size*1024
	elif s=="M": tsize=size*1024*1024
	elif s=="G": tsize=size*1024*1024*1024

	if not os.path.isfile(file): errorParam()

	loop=os.popen("losetup -f").read()
	index=loop[len("/dev/loop"):]
	index=int(index)
	print("Copie des donnees sur le fichier")
	os.system("dd if=/dev/zero of={0} bs=1024 count={1}" . format(file,int(tsize/1024)))

	print("Creation de notre /dev/loop{0}" . format(index))
	os.system("losetup /dev/loop{0} {1}" . format(index,file))