Warum braucht man überhaupt ein Loop-Gerät?

15

Früher habe ich Image-Dateien mit erstellt dd, ein Dateisystem darauf eingerichtet mkfsund mountsie als gemountete Partitionen darauf zugegriffen. Später habe ich im Internet gesehen, dass viele Beispiele losetupzuvor verwendet haben, um einen Loop-Geräteeintrag unter zu machen /devund ihn dann zu mounten. Ich konnte nicht sagen, warum man praktisch eine Bilddatei benötigen würde, um sich wie ein Endlosschleifengerät zu verhalten und einen eigenen /devEintrag zu haben, während das gleiche Verhalten ohne den ganzen Aufwand erhalten werden kann.

Zusammenfassung: Warum muss in einem realen Szenario überhaupt ein /dev/loopXEintrag vorhanden sein, wenn das fs-Image nur ohne diesen bereitgestellt werden kann? Was nützt ein Loop-Gerät?

Mieder
quelle
9
"... während das gleiche Verhalten ohne großen Aufwand erzielt werden kann." - Da liegen Sie falsch;) - Unter Linux kann eine Datei nicht ohne den "Aufwand" eines Loop-Geräts eingehängt werden. Es ist nur so, dass es heutzutage mountklug genug ist, den Ärger für Sie zu machen. (wie Stephen Harris in seiner Antwort zeigt)
marcelm
1
Mögliches Duplikat von Was ist der Unterschied zwischen mount und mount -o-Schleife
Dmitry Grigoryev

Antworten:

22

Das Mounten muss normalerweise auf Blockgeräten erfolgen. Der Loop-Treiber fügt Ihrer Datendatei ein Block-Device-Frontend hinzu.

Wenn Sie einen Loop-Mount ohne durchführen, führt losetupdas Betriebssystem einen im Hintergrund aus.

z.B

$ 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
$ 

Möglicherweise müssen Sie losetupdirekt aufrufen, wenn in Ihrem Dateibild Partitionen eingebettet sind.

zB wenn ich dieses Bild habe:

$ 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

Das kann ich nicht direkt montieren

$ 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

Aber wenn ich benutze losetupund kpartxdann kann ich auf die Partitionen zugreifen:

$ 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
quelle
Sie müssen nicht explizit benötigen losetup, nur Gebrauch mount -o loop,offset=$((512*2048)), wo 512ist Sektorgröße, und 2048ist das, was fdiskals gab Startdie Partition.
Ruslan
Ja, dies war nur ein Anwendungsbeispiel. In diesem speziellen Beispiel ist es möglicherweise einfacher, die Offset-Berechnung durchzuführen, aber es kann Anwendungsfälle geben (z. B. mehrere Partitionen, die Sie gleichzeitig bereitstellen möchten), in denen es einfacher ist, einfach losetupund schnell zu berechnen kpartx. Lassen Sie die Werkzeuge die harte Arbeit erledigen :-)
Stephen Harris
18

Dateisysteme erwarten, dass sie von Blockgeräten lesen und auf diese schreiben, aber Image-Dateien sind keine Blockgeräte. Loop-Geräte stellen ein Block-Gerät über eine Datei (oder ein anderes Block-Gerät, optional mit Remapping).

Beim Mounten von Images müssen in vielen Fällen keine Loop-Geräte berücksichtigt werden, da mountalles für Sie erledigt wird. Aber Loop-Geräte sind immer noch beteiligt. losetup -l -awerde es ihnen zeigen.

Siehe auch Was ist der Unterschied zwischen Halterung und -o loop montieren .

Stephen Kitt
quelle
Die Block Device-ization wird also implizit von gehandhabt mount?
Corsel
2
Ja, mountkümmert sich losetup, Hinzufügen -o loopusw.
Stephen Kitt
@corsel, In den meisten Fällen funktioniert es gut, wenn Sie mount call losetup für Sie haben, aber es gibt Ausnahmen, wie das Mounten mehrerer Partitionen von einem Festplatten-Image.
Hildred
11

Sie scheinen unter Linux zu arbeiten und Linux verwendet einen falschen Namen für diese Funktion.

Ich habe diese Funktion 1988 unter SunOS-4.0 erfunden und nenne sie " fbkDatei emuliert BlocK-Gerät".

Hintergrund ist, dass der Gerätetreiber ein Blockgerät über einer einfachen Datei emuliert. Sie benötigen dies, da ein Dateisystem keine einfache Datei als Hintergrundspeicher für ein Dateisystem verwenden kann. Es braucht eher ein Blockgerät und das ist es, was fbkemuliert.

Seit einiger Zeit haben einige Leute das Programm mountein bisschen schlauer gemacht und es gibt Mount-Implementierungen, die automatisch eine fbkInstanz für eine Datei erstellen, falls das mountProgramm erkennt, dass das erwartete Argument ein Block-Gerät ist, dass es sich stattdessen um eine Plandatei handelt.

schily
quelle
3
Sehr eindrucksvoller Lebenslauf, den Sie in Ihrem Profil haben. Respekt ...
Corsel
11
Dein Beitrag fällt etwas elitär aus. Möglicherweise haben Sie die erste Implementierung geschrieben, aber Linux verwendet eine andere Implementierung. Daher wird nicht der "falsche" Name verwendet, sondern nur ein anderer Name als der, den Sie für Ihre Implementierung ausgewählt haben.
Austin Hemmelgarn
4
Ich habe nie gesagt, dass sie den richtigen Namen verwenden. Ich habe nur gesagt, dass Sie, wenn Sie behaupten, dass er falsch ist, wie ein mit einer Meinung ausgestatteter Elitist klingen.
Austin Hemmelgarn
9
Der Name 'loop' ist die Abkürzung für "loopback" und bezieht sich auf die Art und Weise, wie Vorgänge auf dem Blockgerät an das VFS "zurückgeschleift" werden. Solaris 8 hat ein lofiGerät ("Loopback-Datei") eingeführt, das ähnlich funktioniert. BSD führte sie unter dem Namen vnd"vnode disk" ein, so dass das Konzept im Laufe der Jahre viele verschiedene Namen hatte.
Café
2
Die zwei schwerwiegendsten Probleme in CS: Cache-Kohärenz, Bezeichnernamen und Fehler, die nicht einzeln auftreten.
Jens
1

Auch wenn es nicht im Hintergrund zum Mounten von Dateisystemen aus Dateien benötigt wird, benötigen Sie es dennoch für jedes Setup, das einen Treiber oder ein Programm verwendet, das unbedingt ein Blockgerät erwartet. Denken Sie an nbd-Server (Network Block Device), zusammengesetzte Block-Gerätetreiber wie mdraid, lvm usw.

Rackandboneman
quelle