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