[LINUX] Lernnotizen für Device Mapper

Was ist Device Mapper?

Unter den folgenden Links erfahren Sie, was der Geräte-Mapper ist http://lc.linux.or.jp/lc2009/slide/T-02-slide.pdf https://en.wikipedia.org/wiki/Device_mapper

Persönlich verstehe ich, dass das Dateisystem Funktionen ausschneiden und bereitstellen musste, die in das Dateisystem integriert werden sollten, wie z. B. ZFS unter Linux, das vielfältiger ist als andere Unixe.

Lassen Sie uns einen Device Mapper-Zielstreuer erstellen

Ich begann damit, einen einfachen Device Mapper-Zielcode aufzunehmen, ihn zu erstellen und zu verwenden.

Die Umgebung ist wie folgt CentOS Linux release 7.7.1908 (Core)  Eine virtuelle Maschine auf einer mit Vagrant erstellten VirtualBox. Git-Klon https://github.com/huwan/dm-target

$ git clone https://github.com/huwan/dm-target.git

Gehen Sie zum geklonten Ordner

$ make 
make -C /lib/modules/3.10.0-957.12.2.el7.x86_64/build M=/home/vagrant/dm-target modules
make[1]:Verzeichnis`/usr/src/kernels/3.10.0-957.12.2.el7.x86_64'Eingeben
  CC [M]  /home/vagrant/dm-target/mapper.o
(Unterlassung)
include/linux/device-mapper.h:160:5:Bemerkungen: expected ‘struct dm_dev **’ but argument is of type ‘sector_t’
 int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode,
     ^
/home/vagrant/dm-target/mapper.c:85:13:Error:Funktion „dm_get_Zu viele Argumente für das Gerät
             dm_table_get_mode(target->table), &mdt->dev)) {
             ^
In file included from /home/vagrant/dm-target/mapper.c:15:0:
include/linux/device-mapper.h:160:5:Bemerkungen:Hier erklärt
 int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode,
     ^
(Weggelassen)

Bei diesem Gefühl besteht das Problem darin, dass in Zeile 85 ein Fehler auftritt und der Build nicht bestanden wird. Der zutreffende Teil ist

 84    if (dm_get_device(target, argv[0], start, target->len,
 85                      dm_table_get_mode(target->table), &mdt->dev)) {
 86        target->error = "Device lookup failed";
 87        goto out;
 88    }

dm_get_device wird in der if-Anweisung aufgerufen, aber ich bin wütend, wenn es zu viele Argumente gibt.

Überprüfen Sie device-mapper.h. (Ist es einfacher, den Code online zu sehen?)

Überprüfen Sie zunächst die Kernelversion

$ uname -a 
Linux localhost.localdomain 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Suchen Sie nach device-mapper.h

$ sudo find / -name  device-mapper.h
/usr/src/kernels/3.10.0-957.12.2.el7.x86_64/include/linux/device-mapper.h
/usr/src/kernels/3.10.0-1062.18.1.el7.x86_64/include/linux/device-mapper.h

Es scheint, dass es sich auf den Header von 3.10.0-957 bezieht. Überprüfen Sie den Inhalt des Headers

[device-mapper.h]

/*                                                                                                                                                                      
 * Constructors should call these functions to ensure destination devices                                                                                               
 * are opened/closed correctly.                                                                                                                                         
 */
int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode,
                  struct dm_dev **result);
void dm_put_device(struct dm_target *ti, struct dm_dev *d);

Der Kommentar sagt, dass es ein Konstruktor ist.

https://elixir.bootlin.com/linux/v3.10.95/source/drivers/md/dm-table.c#L462

/*
 * Add a device to the list, or just increment the usage count if
 * it's already present.
 */
int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode,
		  struct dm_dev **result)

Anscheinend fügt es der Liste der Zielblockgeräte ein neues Blockgerät hinzu (und erlaubt Duplikate ??).

Der Build ist wahrscheinlich fehlgeschlagen, weil start und target-> len zusätzliche Argumente waren, als dm_get_device aufgerufen wurde. Da start ein langer langer Typ ist und target-> len ein type_t-Typ ist, ist er nicht in der Funktionsdeklaration enthalten. Ziel ist die Struktur dm_target, die in device-mapper.h deklariert ist.

Ändern Sie mapper.c

/*
 * Add a device to the list, or just increment the usage count if
 * it's already present.
 */
int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode,
		  struct dm_dev **result)

Mach es nochmal

$ make
make -C /lib/modules/3.10.0-957.12.2.el7.x86_64/build M=/home/vagrant/dm-target modules
 make [1]: Geben Sie das Verzeichnis "/usr/src/kernels/3.10.0-957.12.2.el7.x86_64" ein.
  CC [M]  /home/vagrant/dm-target/mapper.o
 /home/vagrant/dm-target/mapper.c:122:5: WARNUNG: Initialisierung vom inkompatiblen Zeigertyp [Standardmäßig aktiviert]
     .map = hello_target_map,
     ^
 /home/vagrant/dm-target/mapper.c:122:5: WARNUNG: (kurz vor der Initialisierung für "hello_target.map") [Standardmäßig aktiviert]
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/vagrant/dm-target/mapper.mod.o
  LD [M]  /home/vagrant/dm-target/mapper.ko
 make [1]: Beenden Sie das Verzeichnis `/usr/src/kernels/3.10.0-957.12.2.el7.x86_64 '.
$ ls
mapper.c#  Makefile  Module.symvers  README.md  mapper.c  mapper.ko  mapper.mod.c  mapper.mod.o  mapper.o  modules.order  run-dmtarget.sh

Der Build wurde bestanden.

Ein Shell-Skript für das Setup ist beigefügt. Versuchen Sie es also.

$ sudo ./run-dmtarget.sh -s
128+0 records in
128+0 records out
134217728 bytes (134 MB) copied, 0.1957 s, 686 MB/s
 /home/vagrant/dm-target/mapper.c:122:5: WARNUNG: Initialisierung vom inkompatiblen Zeigertyp [Standardmäßig aktiviert]
     .map = hello_target_map,
     ^
 /home/vagrant/dm-target/mapper.c:122:5: WARNUNG: (kurz vor der Initialisierung für "hello_target.map") [Standardmäßig aktiviert]
$ sudo dmsetup targets
 hello_target v1.0.0 <-dies
striped          v1.6.0
linear           v1.3.0
error            v1.5.0
$ lsblk 
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0   40G  0 disk 
└─sda1               8:1    0   40G  0 part /
loop0                7:0    0  128M  0 loop 
 └─my_device_mapper 253: 0 0 128M 0 dm <-dies

Für Anfänger wäre es hilfreich, ein Shell-Skript für solche Experimente zu haben. Mit Blick auf den Inhalt, ...

dd if=/dev/zero of=/tmp/mydisk bs=1M count=128 # 128MB file                                                                                             
losetup /dev/loop0 /tmp/mydisk # losetup -f                                                                                                             
make -s
insmod ./mapper.ko
 echo <starting logical sector number> <logical size of device in terms of sector> <target name> <device path> <unsed paramter> | dmsetup create <mapper  name>                                                                                                                                                               
echo 0 262144 hello_target /dev/loop0 0 | dmsetup create my_device_mapper
  1. Erstellen Sie eine Bilddatei mit dd
  2. Erstellen Sie ein Loopback-Gerät (obwohl ich nicht weiß, was es ist) und weisen Sie es der Image-Datei / tmp / mydisk zu
  3. machen
  4. Installation des Moduls (insmod)
  5. Erstellen Sie my_device_mapper mit hello_target mit dmsetup

Versuchen Sie als nächstes einen Schreibtest mit dd

sudo ./run-dmtarget.sh -d
16+0 records in
16+0 records out
16384 bytes (16 kB) copied, 0.0399802 s, 410 kB/s

Was der Prozess hier macht

dd if=/dev/urandom of=/dev/mapper/my_device_mapper  bs=1K count=16

Es scheint, dass 16 KB zufällige Daten geschrieben werden.

Versuchen Sie als Nächstes, das erstellte Blockgerät mit ext4 zu formatieren.

$ sudo ./run-dmtarget.sh -f 
copy.txt  lost+found  test.txt

Also, was machst du hier?

if [ ! -d /mnt/mapper ]
then
   mkdir -p /mnt/mapper
fi
modprobe ext4
mkfs.ext4 -q /dev/mapper/my_device_mapper
mount /dev/mapper/my_device_mapper /mnt/mapper
cd /mnt/mapper
touch test.txt
cp test.txt copy.txt
ls

Überprüfen Sie, ob es montiert ist

$ lsblk 
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0   40G  0 disk 
└─sda1               8:1    0   40G  0 part /
loop0                7:0    0  128M  0 loop 
 └─ my_device_mapper 253: 0 0 128M 0 dm / mnt / mapper <-Mounted on / mnt / mapper
$ ls /mnt/mapper/
copy.txt  lost+found  test.txt
$ cd /mnt/mapper/
$ du -sh 
 du: Verzeichnis "./lost+found" kann nicht gelesen werden: Keine Berechtigung
15K	.
$ sudo touch hoge
$ ls
copy.txt  hoge  lost+found  test.txt

Es kann normalerweise als 16-KB-Ordner verwendet werden.

Versuchen Sie, den Code des Geräte-Mapper-Ziels zu lesen

Es ist ein sehr einfaches Device Mapper-Ziel, also einfach.

Die Mitglieder der Instanz hello_target der Struktur target_type werden wie folgt initialisiert.

static struct target_type hello_target = {
    .name = "hello_target",
    .version = {1,0,0},
    .module = THIS_MODULE,
    .ctr = hello_target_ctr,
    .dtr = hello_target_dtr,
    .map = hello_target_map,
};

Die Definition dieser Struktur wird in device-mapper.h deklariert. Der Funktionszeiger für die Behandlung von Block-E / A (Bio) ist der Map-Member-Variablen zugeordnet, und der Konstruktor und der Destruktor sind ctr bzw. dtr zugeordnet. das ist alles.

Die Ergebnisse des folgenden Codelesens werden hinzugefügt.

Recommended Posts

Lernnotizen für Device Mapper
Python-Lernnotizen
Python-Lernnotizen
O'Reilly python3 Primer Lernnotiz
go Sprachen lernen verschiedene Notizen 1
Lernnotizen zur Python-Datenanalyse
Hinweise zur Python-Grammatik für maschinelles Lernen in PyQ
Notizen vom Anfang von Python 1 lernen
Hinweise zum lokalen Ausführen von Azure Machine Learning
Persönliche Notizen und Links zum maschinellen Lernen ① (Maschinelles Lernen)
Notizen vom Anfang von Python 2 lernen