So erstellen Sie Loop-Geräte unter Linux
Ein Loop-Gerät ist ein Pseudo-Gerät, das nicht einem echten, physischen Blockgerät entspricht, aber verwendet werden kann, um eine Datei wie eine solche erscheinen zu lassen und zu behandeln. Um Loop-Geräte unter Linux zu verwalten, können wir den Befehl losetup verwenden: Das Dienstprogramm ermöglicht es uns, neue Loop-Geräte zu erstellen, sie zu trennen und Informationen über vorhandene abzurufen.
In diesem Artikel erfahren Sie, wie Sie losetup verwenden, um die oben genannten Aktionen auszuführen.
In diesem Tutorial lernen Sie:
- Was ist ein Loop-Gerät?
- Abrufen von Informationen über vorhandene Loop-Geräte
- So erstellen Sie ein Loop-Gerät
- So lösen Sie ein Loop-Gerät
Verwendete Softwareanforderungen und Konventionen
Einführung von losetup
Unter Linux ist der Befehl losetup das, was wir verwenden, um mit Loop-Geräten zu interagieren: Wir können ihn verwenden, um sie zu erstellen, aufzulisten und zu entfernen. Der Befehl ist Teil der Kernpakete der meisten Linux-Distributionen, so dass es nicht notwendig ist, ihn explizit zu installieren. Lassen Sie uns zunächst sehen, wie wir Informationen über den Status vorhandener Loop-Geräte abrufen können.
Abrufen von Informationen über vorhandene Loop-Geräte
Um die im System vorhandenen Schleifengeräte aufzulisten und ihren Status zu erhalten, müssen wir lediglich losetup aufrufen, ohne eine Option oder ein Argument anzugeben, oder um es deutlicher auszudrücken, die Option --list verwenden. Für dieses Tutorial habe ich bereits ein Loop-Gerät erstellt: /dev/loop0:
losetup
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 0 0 /home/egdoc/Downloads/block0 0 512
Wenn wir losetup aufrufen, wie wir es oben getan haben, werden Informationen über alle vorhandenen Schleifengeräte gemeldet. Wenn wir den Status eines bestimmten Schleifengeräts untersuchen möchten, müssen wir es stattdessen als Argument an den Befehl übergeben. Um beispielsweise nur Informationen über das Gerät /dev/loop0 zu erhalten, würden wir Folgendes ausführen:
losetup /dev/loop0Wie wir oben sehen können, enthält die Ausgabe des Befehls standardmäßig 7 Spalten:
| SPALTENNAME | INFORMATION |
|---|---|
| NAME | Der Name des Loop-Geräts |
| GRÖSSENBESCHRÄNKUNG | Die Größenbeschränkung der Datei in Byte |
| VERSATZ | Der Versatz von Anfang an |
| AUTOCLEAR | Der Status des Flags "autoclear" (darüber werden wir später sprechen) |
| RO | Ob das Gerät schreibgeschützt ist oder nicht |
| BACK-DATEI | Die Datei, die dem Loop-Gerät zugeordnet ist |
| DIO | Ob der Zugriff auf die Sicherungsdatei mit direct-io aktiv ist oder nicht |
| LOG-SEC | Die Größe des logischen Sektors, ausgedrückt in Byte |
Es gibt auch andere verfügbare Spalten, die standardmäßig nicht angezeigt werden:
| SPALTENNAME | INFORMATION |
|---|---|
| BACK-INO | Der Inode der Stützdatei |
| BACK-MAJ:MIN | Die Sicherungsdatei major:minor Gerätenummer |
| MAJ:MIN | Das Schleifengerät major:minor number |
Die Spalten, die in die Ausgabe eingeschlossen werden müssen, können mit der Option -o (Abkürzung für --output) angegeben werden. Um beispielsweise nur die Spalten NAME und BACK-FILE einzuschließen, würden wir Folgendes ausführen:
losetup --output=NAME,BACK-FILE /dev/loop0Wir würden die folgende Ausgabe erhalten:
NAME BACK-FILE
/dev/loop0 /home/egdoc/Downloads/block0
Um alle verfügbaren Spalten einzuschließen, können wir stattdessen einfach die Option --output-all verwenden. Die von losetup erzeugte Ausgabe ist, wie wir oben gesehen haben, als Liste formatiert. Wir haben jedoch die Möglichkeit, es als JSON zu formatieren: Dies kann besonders nützlich sein, wenn wir beabsichtigen, die abgerufenen Informationen später mit anderen Programmiersprachen zu analysieren. Alles, was wir tun müssen, ist, die Option --json zu verwenden. So ändert sich die Ausgabe:
losetup --json --list /dev/loop0
{
"loopdevices": [
{
"name": "/dev/loop0",
"sizelimit": 0,
"offset": 0,
"autoclear": false,
"ro": false,
"back-file": "/home/egdoc/Downloads/block0",
"dio": false,
"log-sec": 512
}
]
}
Erstellen eines Loop-Geräts
Sehen wir uns an, wie Sie ein neues Loop-Gerät erstellen. Als erstes müssen wir die Datei erstellen, die als Blockgerät behandelt wird. Um eine Datei zu erstellen, die nur aus 0s besteht, können wir ddund /dev/zero als Eingabe verwenden. Wir erstellen eine Datei mit dem Namen blockfile mit einer Größe von 5GiB, indem wir eine Blockgröße von 1M angeben und 5120 Blöcke schreiben:
dd if=/dev/zero of=blockfile bs=1M count=5120Sobald die Aufgabe abgeschlossen ist, antwortet dd mit der folgenden Ausgabe:
5120+0 records in
5120+0 records out
5368709120 bytes (5.4 GB, 5.0 GiB) copied, 28.8846 s, 186 MB/sDer nächste Schritt besteht darin, das loopdevice tatsächlich zu erstellen. Wie wir bereits sagten, verwenden wir losetup, um die Aufgabe auszuführen. Die zu verwendende Syntax ist wirklich einfach: Wir geben den Namen des Schleifengeräts als erstes Argument an, und als zweites Argument den Pfad zu der Datei, die wir darauf abbilden möchten:
sudo losetup /dev/loop0 blockfile
In bestimmten Situationen kann es vorkommen, dass ein bestimmtes Schlaufengerät bereits im Einsatz ist. In diesem Fall wissen wir beispielsweise, dass /dev/loop0 bereits von dem Blockgerät verwendet wurde, das ich als Beispiel erstellt habe. Woher wissen wir, was wir verwenden sollen? Um das erste unbenutzte Blockgerät zu finden, können wir losetup mit der Option -f (kurz für --find) aufrufen:
sudo losetup -f blockfileWenn losetup mit der Option -f aufgerufen wird, ohne ein anderes Argument, wird es nur den Namen des ersten verfügbaren Blockgeräts zurückgeben, anstatt die Datei tatsächlich zu kartieren:
sudo losetup -f
/dev/loop1Eine weitere nützliche Option, die wir beim Erstellen eines Schleifengeräts verwenden möchten, ist -P oder --partscan: Dies zwingt den Kernel, erneut nach vorhandenen Partitionstabellen zu suchen. Sobald das Loop-Gerät erstellt wurde, wird es wie jedes andere Blockgerät aufgeführt. Es ist z.B. in der Ausgabe von lsblk enthalten (in der Spalte TYPE sehen Sie, dass das Gerät als "loop" gemeldet wird):
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop1 7:1 0 5G 0 loop
[...]Wir können das Loop-Gerät wie jedes andere Blockgerät verwenden: Wir können darauf eine Partitionstabelle, Partitionen und Dateisysteme erstellen, zum Beispiel:
sudo parted -s /dev/loop1 mklabel msdos
sudo parted -s /dev/loop1 mkpart primary 1MiB 100%
sudo mkfs.ext4 /dev/loop1p1Beachten Sie, wie die erste Partition des Schleifengeräts nach der Erstellung mit der Notation p1 gemeldet wird. Im Beispiel haben wir darauf ein ext4-Dateisystem erstellt, das nun wie gewohnt gemountet werden kann:
sudo mount /dev/loop1p1 /mntEin typischer Fall, in dem ein Loop-Gerät unter Linux automatisch erstellt wird, ist, wenn wir eine ISO-Datei mounten, wie zum Beispiel ein Distributions-Installer-Image (die ISO-Datei wird natürlich im schreibgeschützten Modus gemountet):
sudo mount Fedora-Server-netinst-x86_64-35-1.2.iso /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.Sobald die ISO gemountet ist, sind die darin enthaltenen Dateien leicht zugänglich:
ls -l /mnt
total 11
drwxrwxr-x. 1 root root 2048 Oct 26 04:14 EFI
-rw-r--r--. 1 root root 2574 Oct 11 19:31 Fedora-Legal-README.txt
drwxrwxr-x. 1 root root 2048 Oct 26 04:14 images
drwxrwxr-x. 1 root root 2048 Oct 26 04:14 isolinux
-rw-r--r--. 1 root root 1063 Oct 11 19:29 LICENSE
Trennen eines Loop-Geräts
Um ein Loop-Gerät zu trennen, müssen wir lediglich losetup zusammen mit der Option -d aufrufen, was die Abkürzung für --detach ist, und den Pfad des Loop-Geräts übergeben, das wir trennen möchten. Um das /dev/loop0-Gerät zu trennen, würden wir Folgendes ausführen:
sudo losetup -d /dev/loop0Falls wir alle vorhandenen Loop-Geräte trennen möchten, können wir stattdessen die Option -D (großes "d") oder die lange --detach-all-Version verwenden. In neueren Linux-Kernel-Versionen (>=3.7) werden keine Fehler zurückgegeben, wenn wir ein Schleifengerät trennen, das vom System verwendet wird, z.B. wenn eine oder mehrere darauf vorhandene Partitionen eingehängt werden; Das AUTOCLEAR-Flag des Geräts wird stattdessen auf 1 gesetzt, und das Gerät wird später zerstört (diese Funktion wird als "Lazy Destruction" bezeichnet):
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 1 0 /home/egdoc/blockfile 0 512
Abschließende Gedanken
In diesem Tutorial haben wir gelernt, was ein Loop-Gerät ist, und wir haben gesehen, wie man Informationen über vorhandene Loop-Geräte unter Linux abruft und wie man Loop-Geräte unter Linux mit dem Dienstprogramm losetup erstellt und trennt.
