Welche Beziehung besteht zwischen Inodes, LBA, logischen Volumes, Blöcken und Sektoren?

19

Es ist mir ein bisschen peinlich, diese Frage zu stellen, aber ich würde gerne ein Diagramm sehen, das zeigt, wie die folgenden Dinge zusammenhängen. Es wäre schön, wenn das Diagramm auch alle Transformationen enthalten würde, die für die Zuordnung zwischen den verschiedenen Layern erforderlich sind.

So wie ich es verstehe, glaube ich, dass sie auf folgende Weise zusammenhängen, aber ich bin mir nicht sicher, ob mein Verständnis 100% korrekt ist.

                           .-----------------.
                           |      inode      |
                           '-----------------'
                                    |
                           .-----------------.
                           |      EXT4       |
                           '-----------------'
                                    |
                         .---------------------.
                         | logical volume (LV) | --- part of LVM
                         '---------------------'
                                    |
                          .-------------------.
                          | volume group (VG) |  --- part of LVM
                          '-------------------'
                                    |
                            .---------------.
                            | /dev/<device> |
                            '---------------'
                                    |
                   .--------------------------------.
                   | Logical Block Addressing (LBA) |
                   '--------------------------------'
                                    |
                           .-----------------.
                           | blocks/sectors  |
                           '-----------------'
                                    |
                                   HDD     
                                _.-----._  
                              .-         -.
                              |-_       _-|
                              |  ~-----~  |
                              |           |
                              `._       _.'
                                 "-----"   

Verweise

slm
quelle

Antworten:

18

Weg tl; dr

Ihr Diagramm ist im Wesentlichen korrekt.

/dev/<device> Dateien

Ich denke, der einfachste Weg, Ihre Frage zu beantworten, ist, welche /dev/<device>Dateien vorhanden sind. Angenommen, Sie haben eine Festplatte. Diese Festplatte verfügt über eine MBR-basierte Partitionstabelle und zwei Partitionen, eine mit ext4 formatierte Partition mit einigen Dateien und eine für LVM eingerichtete Partition. Beachten Sie, dass in dieser Antwort die direkte Erstellung von Gerätedateien beschrieben wird, was bedeutet, dass Sie einen Linux-Kernel verwenden. Bei anderen Unices ist das etwas anders .

Wenn Sie diese Festplatte einstecken (oder wenn das System sie beim Booten erkennt), wird eine Gerätedatei in dem /devVerzeichnis erstellt - im Allgemeinen entweder /dev/sd*oder /dev/hd*(abhängig davon, mit welchem ​​Controller das Laufwerk verbunden wird) - das * ist ein Brief. Bytes in der Gerätedatei werden im Wesentlichen linear den Bytes auf der physischen Festplatte zugeordnet: Wenn Sie ein Tool zum Schreiben an den Anfang der Gerätedatei verwenden, werden diese Daten auch an den physischen Anfang der physischen Festplatte geschrieben.

Jetzt versteht das System auch Partitionstabellen wie MBRs und GPTs. Sobald die ursprüngliche Gerätedatei erstellt wurde, wird sie gelesen, um festzustellen, ob sie eine Partitionstabelle enthält. In diesem Fall werden Gerätedateien erstellt, die diese Partitionen darstellen. Unter der Annahme, dass die ursprüngliche Gerätedatei aufgerufen wurde /dev/sda, wird eine aufgerufene Gerätedatei /dev/sda1(die die erste, ext4-formatierte Partition darstellt) sowie ein /dev/sda2Gerät (die zweite LVM-Partition darstellt) erstellt. Diese werden wie das gesamte Laufwerk linear auf ihre jeweiligen Partitionen abgebildet. Wenn Sie beispielsweise ein Tool zum Schreiben an den Anfang von verwenden /dev/sda2, werden die geschriebenen Daten physisch an den Anfang der zweiten Partition geschrieben , das ist eigentlich die mitte von der ganzen Festplatte, weil dort die zweite Partition beginnt.

Blöcke und Sektoren

Dies ist eine günstige Zeit, um über Blöcke und Sektoren zu sprechen: Dies sind nur Messungen des Speicherplatzes auf einer physischen Festplatte, nichts weiter (zumindest, wenn ich das richtig verstehe). Ein Sektor ist eine physische Region auf einer Festplatte. Normalerweise sind es 512 Byte - 4 KB auf neueren Festplatten. Ein Block ist auch eine Maßeinheit, es sind fast immer 8 KB. Wenn jemand über das Lesen und Schreiben von Blöcken spricht, bedeutet dies lediglich, dass er nicht jedes Datenbyte einzeln liest, sondern Daten in Blöcken von 8 KB liest und schreibt.

Dateisysteme und Inodes

Als nächstes Dateisysteme und Inodes. Ein Dateisystem ist ein recht einfaches Konzept: Am Anfang der Region, in der sich das Dateisystem befindet (diese Region ist normalerweise eine Partition), befinden sich eine Reihe von Informationen über das Dateisystem. Dieser Header (meiner Meinung nach auch als Superblock bezeichnet) wird zuerst verwendet, um zu bestimmen, welcher Dateisystemtreiber zum Lesen des Dateisystems verwendet werden soll. Anschließend wird er vom ausgewählten Dateisystemtreiber zum Lesen von Dateien verwendet. Dies ist natürlich eine Vereinfachung, aber im Grunde werden zwei Dinge gespeichert (die je nach fs-Typ als zwei unterschiedliche Datenstrukturen auf der Festplatte gespeichert werden können oder nicht): der Verzeichnisbaum und eine Liste von Inodes. Der Verzeichnisbaum ist das, was Sie sehen, wenn Sie eine lsoder einetree. In der Verzeichnisstruktur wird angegeben, welche Dateien und Verzeichnisse die untergeordneten Verzeichnisse anderer Verzeichnisse sind. Die Datei / Verzeichnis-Eltern-Kind-Beziehung bildet den UNIX-Verzeichnisbaum, wie wir ihn kennen.

Der Verzeichnisbaum enthält jedoch nur Namen. Diese Namen sind zusätzlich mit Inode-Nummern verknüpft. Eine Inode-Nummer enthält Informationen darüber, wo die Teile einer Datei physisch auf der Festplatte gespeichert sind. Eine Inode an sich ist einfach "eine Datei" ohne Namen; Ein Inode wird über den Verzeichnisbaum mit einem Namen verknüpft. Siehe auch Was ist ein Superblock, Inode, Dentry und eine Datei?

Bisher haben wir die folgende Erklärung haben: /dev/sd*Dateien auf Festplatten Karte, /dev/sd*#Map - Dateien Partitionsnummer #auf /dev/sd*. Ein Dateisystem ist eine Datenstruktur auf der Festplatte, die einen Verzeichnisbaum verfolgt. Es wird im Allgemeinen in einer Partition ( /dev/sd*#) aufbewahrt. Ein Dateisystem enthält Inodes. Inodes sind Zahlen, die Dateien darstellen, sowie Daten, die diesen Dateien zugeordnet sind (mit Ausnahme ihres Namens und ihrer Position in der Verzeichnisstruktur).

Es ist erwähnenswert, dass Dateisysteme Daten im Allgemeinen in Blöcken verfolgen. Normalerweise werden der Verzeichnisbaum und die Inode-Liste in Blöcken und nicht in Bytes gespeichert, und Inodes verweisen auf Blöcke auf der Festplatte und nicht auf Bytes. (Dies kann Probleme verursachen, wenn Dateien normalerweise einen halben Block Speicherplatz verschwenden, da das Dateisystem einen gesamten Block zugewiesen hat, aber diesen gesamten Block nicht für den letzten Teil der Datei verwenden musste.)

Der Geräte-Mapper

Das letzte Puzzleteil ist ein sehr wichtiges Modul im Linux-Kernel, der Device Mapper (laden Sie ihn mit modprobe dm). Mit der Gerätezuordnung können Sie grundsätzlich eine andere Gerätedatei im /dev/mapperVerzeichnis erstellen . Diese Gerätedatei wird dann einer anderen Datenquelle zugeordnet und möglicherweise dabei umgewandelt. Das einfachste Beispiel ist das Lesen eines Teils einer Datei.

Angenommen, Sie haben ein vollständiges Image mit der Partitionstabelle. Sie müssen die Daten aus einer der Partitionen in dem Bild lesen, aber man kann nicht bekommen nur die Partition, da es sich um eine Full-Disk - Image ist, anstelle einer einzelnen Partition Bild. Die Lösung besteht darin, zu ermitteln, wo sich Ihre Partition im Image befindet, und anschließend eine neue Gerätedateizuordnung für diesen Teil des Festplatten-Images zu erstellen. Hier ist ein Diagramm:

.-------------------.
|  /dev/mapper/foo  | <- This is the device file created with the device mapper
.___________________.
\                   /
 \                 /
  \               /   <- This is a small section of the image being mapped to
   \             /         the new device file
    \           /
     \         /
 .------------------.
 |  diskimage.img   | <- This is the full-disk image. It's a regular file.
 .__________________.     Notice how the mapping goes to _part_ of the file.

Eine andere Art, sich das vorzustellen, ist wie eine Transformationspipeline (dies ist die genauere Metapher für das, was intern im Kernel geschieht). Stellen Sie sich ein Förderband vor. Eine Anforderung - ein Lesen, ein Schreiben usw. - beginnt an einem Ende des Förderbands in einer Gerätedatei, die mit dem Geräte-Mapper erstellt wurde. Die Anforderung durchläuft dann die Device-Mapper-Umwandlung in die Quelldatei. Im obigen Beispiel ist diese Quelldatei eine reguläre Datei diskimage.img. Hier ist das Diagramm:

Read operation goes onto
device mapper conveyor belt

read()                                      The device mapper transforms the read         The modified read request finally
  \                                         request by moving the requested region        reaches the source file, and the data
   \         Beginning of conveyor belt     to read forward by some number of bytes.      is retrieved from the filesystem.
    \     
     \       .-------------------.          .--------------------------.                  .------------------------.
      \      |  /dev/mapper/foo  |          |   Transformation logic   |                  | /path/to/diskimage.img |
       \     .___________________.          .___+_____+_____+_____+____.                  .________________________.
        \-->                                             
             ---------------------------------------------------------------------------------------------------------------
             o          o          o          o          o          o          o          o          o          o          o

Beachten Sie, dass in dem Diagramm die Transformationslogik, die mit dem Geräte-Mapper verknüpft ist, über kleine Werkzeuge verfügt +, um die Leseanforderung zu bearbeiten, während sie sich auf dem Förderband vorbeibewegt.

Ich habe keine besondere Lust, dieses Diagramm zu kopieren und für LVM zu ändern, aber im Grunde kann der Transformationsteil alles sein - nicht nur, um den Byte-Bereich nach vorne zu verschieben. So funktioniert LVM: Ein LVM Physical Extent ist der Teil von LVM, der sich auf der Festplatte befindet und festhält, wo sich Daten befinden. Stellen Sie es sich wie das Dateisystem von LVM vor. In der Förderband-Metapher ist eine physische Ausdehnung eine der Quelldateien, und die Umwandlung wird von LVM ausgeführt, indem eine Anforderung auf einem logischen Datenträger (der das am weitesten links stehende Element auf dem Förderband ist) den physischen Daten auf der Festplatte zugeordnet wird. Apropos welche ...

Ich habe ein wenig Probleme mit meinen LVM-Konzepten, aber IIRC, eine Volume Group, ähnelt im Wesentlichen einer Platte in LVM. Auch hier werden IIRC, RAID-Level usw. pro Volume-Gruppe verwaltet. Ein logisches Volume ist also wie eine Partition, und logische Volumes enthalten tatsächlich Gerätedateien, die sie darstellen. Sie legen Dateisysteme und andere Dinge auf logische Volumes.

Das Tolle an der Gerätezuordnung ist, dass die damit erstellte Logik beliebig in den Datenstapel eingefügt werden kann. Sie müssen lediglich den Gerätenamen ändern, den Sie lesen. So funktionieren verschlüsselte Partitionen ( keine Verschlüsselungsschemata auf Dateiebene - diese verwenden FUSE), und so funktioniert LVM. Ich kann mir im Moment keine anderen Beispiele vorstellen, aber glauben Sie mir, der Device Mapper ist ziemlich übel.

Logische Blockadressierung

Ich habe noch nie davon gehört, daher kann ich keine Informationen dazu anbieten. Hoffentlich kommt jemand vorbei und bearbeitet diese Antwort.

strugee
quelle
+1 für Mühe, aber ich denke, dass @slm nach mehr Details suchte, wie genau die verschiedenen Ebenen miteinander kommunizieren. Wie ordnen Inodes beispielsweise Sektoren zu? Tun sie?
terdon
@terdon ah. Ich war mir nicht sicher, da ich ihn im Chat gefragt habe, aber er nicht online war
strugee
+1 für die Mühe auch. Entschuldigung, dass Sie nicht früher zurückkommen. Benötigte Zeit, um das zu verdauen. @ terdon hat recht, ich wollte versuchen, mehr Details der Zuordnung zwischen den verschiedenen Layern herauszustellen. Ich frage mich, ob ich in einem einzigen Fragebogen zu viel verlange, aber ich wollte all dies in einem einzigen Fragebogen haben, da es im Internet schlecht erfasst zu sein scheint. Übrigens gefällt mir die Beschreibung der DM.
slm
@slm ja, ich habe versucht, etwas davon in Änderungen
hinzuzufügen
Anmerkung: Ich habe dies zurückgesetzt, da Gilles in seiner Rezension feststellte, dass die hinzugefügten LBA-Informationen nicht wirklich korrekt sind
strugee