loop
Table des matières
Retour à l'index
NOM
loop, loop-control — Périphériques boucle
SYNOPSIS
#include <linux/loop.h>
DESCRIPTION
Un périphérique boucle est un périphérique bloc qui mappe ses blocs de
données non sur un périphérique physique tel qu’un disque dur ou un support
optique, mais sur les blocs d’un fichier normal dans un système de fichiers
ou sur ceux d’un autre périphérique bloc. Cela peut être utile pour fournir
un périphérique bloc pour un stockage d’image de système de fichiers, de
façon à pouvoir le monter avec la commande mount(8). Il est possible de
faire :
$ dd if=/dev/zero of=fich.img bs=1MiB count=10
$ sudo losetup /dev/loop4 fich.img
$ sudo mkfs -t ext4 /dev/loop4
$ sudo mkdir /monperboucle
$ sudo mount /dev/loop4 /monperboucle
Consulter losetup(8) pour un autre exemple.
Une fonction de transfert peut être spécifiée pour chaque périphérique
boucle dans un but de chiffrement et de déchiffrement.
Les opérations ioctl(2) suivantes sont fournies par le périphérique
boucle :
- LOOP_SET_FD
-
Associer le périphérique boucle avec le fichier ouvert dont le descripteur
de fichier est passé comme (troisième) argument d’ioctl(2).
- LOOP_CLR_FD
-
Dissocier le périphérique boucle de n’importe quel descripteur de fichier.
- LOOP_SET_STATUS
-
Régler l’état du périphérique boucle en utilisant le (troisième) argument
d’ioctl(2). Cet argument est un pointeur vers une structure loop_info,
définie dans <linux/loop.h> ainsi :
-
struct loop_info {
int lo_number; /* ioctl r/o */
dev_t lo_device; /* ioctl r/o */
unsigned long lo_inode; /* ioctl r/o */
dev_t lo_rdevice; /* ioctl r/o */
int lo_offset;
int lo_encrypt_type;
int lo_encrypt_key_size; /* ioctl w/o */
int lo_flags; /* ioctl r/w (r/o avant
Linux 2.6.25) */
char lo_name[LO_NAME_SIZE];
unsigned char lo_encrypt_key[LO_KEY_SIZE];
/* ioctl w/o */
unsigned long lo_init[2];
char reserved[4];
};
-
Le type de chiffrement (lo_encrypt_type) devrait être soit
LO_CRYPT_NONE, LO_CRYPT_XOR, LO_CRYPT_DES, LO_CRYPT_FISH2,
LO_CRYPT_BLOW, LO_CRYPT_CAST128, LO_CRYPT_IDEA, LO_CRYPT_DUMMY,
LO_CRYPT_SKIPJACK ou (depuis Linux 2.6.0) LO_CRYPT_CRYPTOAPI.
-
Le champ lo_flags est un masque de bits qui peut inclure zéro ou plus des
drapeaux suivants :
-
- LO_FLAGS_READ_ONLY
-
Le périphérique boucle est en lecture seule.
- LO_FLAGS_AUTOCLEAR (depuis Linux 2.6.25)
-
Le périphérique boucle s’autodétruira lors de la dernière fermeture.
- LO_FLAGS_PARTSCAN (depuis Linux 3.2)
-
Permission de l’analyse automatique des partitions.
- LO_FLAGS_DIRECT_IO (depuis Linux 4.10)
-
Utilisation du mode E/S direct pour accéder au fichier de sauvegarde.
-
Les seuls lo_flags pouvant être modifiés par LOOP_SET_STATUS sont
LO_FLAGS_AUTOCLEAR et LO_FLAGS_PARTSCAN.
- LOOP_GET_STATUS
-
Obtention de l’état du périphérique boucle ; le (troisième) argument
d’ioctl(2) doit être un pointeur vers une struct loop_info.
- LOOP_CHANGE_FD (depuis Linux 2.6.5)
-
Basculement du stockage de sauvegarde du périphérique boucle vers le nouveau
fichier identifié par le descripteur de fichier spécifié dans le (troisième)
argument d’ioctl(2), qui est un entier. Cette opération est possible si
le périphérique boucle est en lecture seule et que le nouveau stockage de
sauvegarde est de la même taille et du même type que l’ancien stockage de
sauvegarde.
- LOOP_SET_CAPACITY (depuis Linux 2.6.30)
-
Redimensionnement d’un périphérique boucle actif. Il est possible de changer
la taille du stockage de sauvegarde sous-jacent et puis d’utiliser cette
opération de façon que le pilote de boucle connaisse la nouvelle
taille. Cette opération ne prend pas d’argument.
- LOOP_SET_DIRECT_IO (depuis Linux 4.10)
-
Régler le mode E/S direct sur le périphérique boucle, de façon à ce qu’il
puisse être utilisé pour ouvrir un fichier de sauvegarde. Le (troisième)
argument d’ioctl(2) est une valeur « unsigned long ». Une valeur
différente de zéro représente le mode E/S direct.
- LOOP_SET_BLOCK_SIZE (depuis Linux 4.14)
-
Régler la taille de bloc de périphérique boucle. Le (troisième) argument
d’ioctl(2) est une valeur « unsigned long ». Cette valeur doit être une
puissance de deux dans l’intervalle [512,taille_page], sinon une erreur
EINVAL en résultera.
- LOOP_CONFIGURE (depuis Linux 5.8)
-
Régler et configurer tous les paramètres du périphérique boucle en une seule
étape en utilisant le (troisième) argument d’ioctl(2). Cet argument est
un pointeur vers une structure loop_config, définie dans
<linux/loop.h> ainsi :
-
struct loop_config {
__u32 fd;
__u32 block_size;
struct loop_info64 info;
__u64 __reserved[8];
};
-
En plus de faire ce que LOOP_SET_STATUS peut faire, LOOP_CONFIGURE
peut aussi être utilisé pour faire les choses suivantes :
-
- -
-
régler la taille correcte de bloc immédiatement en réglant
loop_config.block_size ;
- -
-
requérir explicitement le mode E/S direct en réglant LO_FLAGS_DIRECT_IO
dans loop_config.info.lo_flags ;
- -
-
requérir explicitement le mode lecture seule en réglant
LO_FLAGS_READ_ONLY dans loop_config.info.lo_flags.
Depuis Linux 2.6, deux nouvelles opérations ioctl(2) existent :
- LOOP_SET_STATUS64
-
LOOP_GET_STATUS64
Elles sont similaires à LOOP_SET_STATUS et LOOP_GET_STATUS décrites
ci-dessus, mais utilisent la structure loop_info64 qui a quelques champs
supplémentaires et des intervalles plus grands pour quelques autres champs :
-
struct loop_info64 {
uint64_t lo_device; /* ioctl r/o */
uint64_t lo_inode; /* ioctl r/o */
uint64_t lo_rdevice; /* ioctl r/o */
uint64_t lo_offset;
uint64_t lo_sizelimit; /* octets, 0 == max dispo. */
uint32_t lo_number; /* ioctl r/o */
uint32_t lo_encrypt_type;
uint32_t lo_encrypt_key_size; /* ioctl w/o */
uint32_t lo_flags; i /* ioctl r/w (r/o avant
Linux 2.6.25) */
uint8_t lo_file_name[LO_NAME_SIZE];
uint8_t lo_crypt_name[LO_NAME_SIZE];
uint8_t lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */
uint64_t lo_init[2];
};
/dev/loop-control
Depuis Linux 3.1, le noyau fournit le périphérique /dev/loop-control qui
permet à une application de trouver de manière dynamique un périphérique
libre et d’ajouter ou de retirer des périphériques boucle du système. Pour
réaliser ces opérations, l’utilisateur doit d’abord ouvrir
/dev/loop-control, puis employer une des opérations ioctl(2)
suivantes :
- LOOP_CTL_GET_FREE
-
Allocation ou récupération d’un périphérique boucle libre pour une
utilisation. En cas de succès, le numéro du périphérique est renvoyé comme
résultat de l’appel. Cette opération ne nécessite aucun argument.
- LOOP_CTL_ADD
-
Ajout du nouveau périphérique boucle dont le numéro de périphérique est
spécifié comme entier « long » dans le troisième argument d’ioctl(2). En
cas de succès, l’indice du périphérique est renvoyé comme résultat de
l’appel. Si le périphérique est déjà alloué, l’appel échoue avec l’erreur
EEXIST.
- LOOP_CTL_REMOVE
-
Retrait du périphérique boucle dont le numéro de périphérique est spécifié
comme entier « long » dans le troisième argument d’ioctl(2). En cas de
succès, le numéro du périphérique est renvoyé comme le résultat de
l’appel. Si le périphérique est déjà utilisé, l’appel échoue avec l’erreur
EBUSY.
FICHIERS
- /dev/loop*
-
Les fichiers du périphérique bloc spécial de boucle.
EXEMPLES
Le programme ci-dessous utilise le périphérique /dev/loop-control pour
trouver un périphérique boucle libre, ouvre le périphérique boucle, ouvre un
fichier à utiliser comme stockage sous-jacent du périphérique et alors
associe le périphérique boucle avec le stockage de sauvegarde. La session
d’interpréteur suivante fait une démonstration de l’utilisation de ce
programme :
$ dd if=/dev/zero of=fich.img bs=1MiB count=10
10+0 enregistrements in
10+0 enregistrement out
10485760 octets (10 Mio) copiés, 0.00609385 s, 1.7 Gio/s
$ sudo ./mnt_loop fich.img
nomboucle = /dev/loop5
Source du programme
#include <fcntl.h>
#include <linux/loop.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)
int
main(int argc, char *argv[])
{
int ddfloopctl, ddfloop, fichsauv;
long n°per;
char nomboucle[4096];
if (argc != 2) {
fprintf(stderr, "Utilisation : %s fichsauv\n", argv[0]);
exit(EXIT_FAILURE);
}
ddfloopctl = open("/dev/loop-control", O_RDWR);
if (ddfloopctl == -1)
errExit("open: /dev/loop-control");
n°per = ioctl(ddfloopctl, LOOP_CTL_GET_FREE);
if (n°pr == -1)
errExit("ioctl-LOOP_CTL_GET_FREE");
sprintf(nomboucle, "/dev/loop%ld", n°per);
printf("nomboucle = %s\n", nomboucle);
loopfd = open(nomboucle, O_RDWR);
if (ddfloop == -1)
errExit("open: nomboucle");
fichsauv = open(argv[1], O_RDWR);
if (fichsauv == -1)
errExit("open: fichsauv");
if (ioctl(ddfloop, LOOP_SET_FD, fichsauv) == -1)
errExit("ioctl-LOOP_SET_FD");
exit(EXIT_SUCCESS);
}
VOIR AUSSI
losetup(8), mount(8)
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>
et
Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
concernant les conditions de copie et
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- /dev/loop-control
-
- FICHIERS
-
- EXEMPLES
-
- Source du programme
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:32 GMT, September 19, 2025