Pourquoi a-t-on besoin d'un périphérique de boucle?

15

J'avais auparavant l'habitude de créer des fichiers image en utilisant dd, de configurer un système de fichiers sur eux en utilisant mkfset mountd'y accéder en tant que partitions montées. Plus tard, j'ai vu sur Internet que de nombreux exemples utilisent losetupau préalable pour faire une entrée de périphérique de boucle sous /dev, puis le monter. Je ne pouvais pas dire pourquoi on aurait pratiquement besoin d'un fichier image pour se comporter comme un périphérique en boucle et avoir sa propre /deventrée alors que le même comportement peut être obtenu sans tous les tracas.

Résumé: Dans un scénario réel, pourquoi avons-nous besoin d'une /dev/loopXentrée pour être présente alors que nous pouvons simplement monter l'image fs sans elle? Quelle est l'utilité d'un périphérique en boucle?

corsel
la source
9
"... alors que le même comportement peut être obtenu sans tous les tracas." - Vous avez tort là-bas;) - Sous Linux, un fichier ne peut pas être monté sans les "tracas" d'un périphérique en boucle. C'est juste que de nos jours, mountc'est assez intelligent pour faire les tracas pour vous. (comme Stephen Harris le montre dans sa réponse)
marcelm
1
Duplication possible de Quelle est la différence entre le montage et le montage -o loop
Dmitry Grigoryev

Réponses:

22

Les montages doivent généralement être effectués sur des périphériques de type bloc. Le pilote de boucle place un frontal de périphérique de bloc dans votre fichier de données.

Si vous effectuez un montage en boucle sans, losetuple système d'exploitation en fait un en arrière-plan.

par exemple

$ dd if=/dev/zero of=/tmp/foo bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0798775 s, 1.3 GB/s
$ mke2fs /tmp/foo
mke2fs 1.42.9 (28-Dec-2013)
....


$ losetup    
$ mount -o loop /tmp/foo /mnt1    
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         1  0 /tmp/foo
$ umount /mnt1
$ losetup
$ 

Vous devrez peut-être appeler losetupdirectement si votre image de fichier contient des partitions intégrées.

par exemple si j'ai cette image:

$ fdisk -l /tmp/foo2      

Disk /tmp/foo2: 104 MB, 104857600 bytes, 204800 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 label type: dos
Disk identifier: 0x1f25ff39

     Device Boot      Start         End      Blocks   Id  System
/tmp/foo2p1            2048      204799      101376   83  Linux

Je ne peux pas monter ça directement

$ mount -o loop /tmp/foo2 /mnt1
mount: /dev/loop0 is write-protected, mounting read-only
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
       missing codepage or helper program, or other error

Mais si j'utilise losetupet que kpartxje peux accéder aux partitions:

$ losetup -f /tmp/foo2
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /tmp/foo2
$ kpartx -a /dev/loop0
$ mount /dev/mapper/loop0p1 /mnt1
$
Stephen Harris
la source
Vous n'avez pas besoin d'explicite losetup, utilisez simplement mount -o loop,offset=$((512*2048)), où 512est la taille du secteur et 2048ce qui est fdiskdonné à partir Startde la partition.
Ruslan
Oui, ce n'était qu'un exemple d'utilisation. Dans cet exemple spécifique, il peut être plus facile de faire le calcul du décalage, mais il peut y avoir des cas d'utilisation (par exemple, plusieurs partitions que vous souhaitez monter en même temps) où il peut être plus facile de simplement losetupet kpartx. Laissez les outils travailler dur :-)
Stephen Harris
18

Les systèmes de fichiers s'attendent à lire et à écrire sur des périphériques bloqués, mais les fichiers image ne sont pas des périphériques bloqués. Les périphériques en boucle fournissent un périphérique de bloc au-dessus d'un fichier (ou un autre périphérique de bloc, éventuellement avec remappage).

Dans de nombreux cas, il n'est pas nécessaire de prendre en compte les périphériques en boucle lors du montage d'images car mountil s'occupe de tout pour vous; mais les périphériques de boucle sont toujours impliqués. losetup -l -ava leur montrer.

Voir aussi Quelle est la différence entre la boucle mount et mount -o .

Stephen Kitt
la source
Ainsi, la bloc-périphériqueisation est implicitement gérée par mount?
corsel
2
Oui, mounts'occupe de l' losetupajout, -o loopetc.
Stephen Kitt
@corsel, Dans la plupart des cas, le montage de losetup pour vous fonctionne bien, mais il existe des exceptions telles que le montage de plusieurs partitions à partir d'une image disque.
hildred
11

Vous semblez être sous Linux et Linux utilise un mauvais nom pour cette fonctionnalité.

J'ai inventé cette fonctionnalité en 1988 sur SunOS-4.0 et j'appelle cette fonctionnalité fbk- File émule le périphérique BlocK.

L'arrière-plan est que le pilote de périphérique émule un périphérique de bloc au-dessus d'un fichier ordinaire. Vous en avez besoin car un système de fichiers ne peut pas utiliser un fichier brut comme stockage d'arrière-plan pour un système de fichiers. Il a plutôt besoin d'un périphérique bloc et c'est ce qui fbkémule.

Depuis un certain temps, certaines personnes ont rendu le programme mountun peu plus intelligent et il existe des implémentations de montage qui créent automatiquement une fbkinstance pour un fichier au cas où le mountprogramme détecte que l'argument qui devrait être un périphérique bloc semble être un fichier plan à la place.

schily
la source
3
CV très impressionnant que vous avez obtenu sur votre profil. Respect ...
corsel
11
Votre message est un peu plus élitiste. Vous avez peut-être écrit la première implémentation, mais Linux utilise une implémentation différente, donc il n'utilise pas le «mauvais» nom, juste un autre que celui que vous avez choisi pour votre implémentation.
Austin Hemmelgarn
4
Je n'ai jamais dit qu'ils avaient utilisé le bon nom, j'ai juste dit que prétendre que c'était faux vous faisait ressembler à un élitiste opiniâtre.
Austin Hemmelgarn
9
Le nom de «boucle» est l'abréviation de «loopback» »et fait référence à la façon dont les opérations sur le périphérique de bloc sont« bouclées »vers le VFS. Solaris 8 a introduit un lofipériphérique ("fichier de bouclage") fonctionnant de manière similaire; BSD les a introduits sous le nom vnd("disque vnode") donc le concept a eu beaucoup de noms différents au fil des ans.
caf
2
Les deux problèmes les plus difficiles dans CS: la cohérence du cache, la dénomination des identifiants et les erreurs hors-ligne.
Jens
1

Même s'il n'était pas nécessaire en arrière-plan pour monter des systèmes de fichiers à partir de fichiers, vous en auriez toujours besoin pour toute configuration utilisant un pilote ou un programme qui attend absolument un périphérique de bloc. Pensez aux serveurs nbd (périphérique de bloc réseau), aux pilotes de périphériques de bloc composé comme mdraid, lvm, etc.

rackandboneman
la source