Ich habe erfolgreich eine Datei im ext4-Dateisystem gefunden. Beispielsweise ist der erste 4k-Block der Datei „cyclic.txt“ 105441. Aber wenn ich sie direkt von der EMMC-Karte lese, ist der erste EMMC-Block nicht da, sondern hat sich in 5168904 geändert. Ich suche einfach im gesamten EMMC-Speicher danach, aber es ist sehr langsam. Wie bekomme ich den tatsächlichen Standort direkt? Kann ich ihn einfach für einen späteren sicheren Löschvorgang verwenden? Vielen Dank!!!
Antwort1
Von ext4 verwendete Blocknummern, die Sie mit dem Befehl „stat“ von debugfs oder mit „filefrag -v“ finden können, sind logische 4k-Blocknummern. Das heißt, sie liegen in Einheiten von 4k vor, relativ zum Anfang der Partition.
Wenn Sie ein Programm wie fdisk oder gdisk verwenden, erhalten Sie den Partitionsanfang in 512-Byte-Sektoren.
Hier ist ein Beispiel. Angenommen, Sie möchten den Speicherort von /boot/vmlinuz-4.19.0-2-amd64 finden. (Mit dem Befehl „df /boot/vmlinuz-4.19.0-2-amd64“ finden wir heraus, dass es sich auf /dev/nvme0n1p4 als /boot-Dateisystem befindet.) Sie können die verwendeten logischen Blocknummern auf verschiedene Weise herausfinden:
- filefrag -v /boot/vmlinuz-4.19.0-2-amd64
- debugfs -R "Erweiterungen vmlinuz-4.19.0-2-amd64" /dev/nvme0n1p4
- debugfs -R "stat vmlinuz-4.19.0-2-amd64" /dev/nvme0n1p4
Mit jedem dieser Mechanismen stellen wir fest, dass die Datei die Blocknummern 60416-61680 verwendet.
Um herauszufinden, wo sie sich relativ zum Anfang von /dev/nvme0n1p4 befinden, multiplizieren Sie diese Blocknummern mit 4096, wenn Sie Byte-Offsets wünschen, oder mit 8, wenn Sie sie in Einheiten von 512-Byte-Sektoren wünschen.
Wenn Sie wissen möchten, wo sie sich relativ zum Anfang des Geräts befinden (in diesem Fall z. B. /dev/nvme0n1), können Sie dies mit dem folgenden Befehl nachschlagen:
- Katze /sys/block/nvme0n1/nvme0n1p4/start
Oder Sie können den Befehl gdisk verwenden und die Partitionstabelle ausdrucken. In beiden Fällen erhalten Sie dadurch den Startort der Partition „p4“ in Einheiten von 512-Byte-Sektoren.
Letzter Hinweis: Manchmal wird von LBA-Nummern gesprochen, wenn von 512 Sektornummern die Rede ist, wie sie vom Linux-Kernel verwendet werden, aber Sie müssen dabei etwas vorsichtig sein. Aus Sicht des Speichergeräts steht LBA für „Logical Block Addresses“ (logische Blockadressen) und wird in Einheiten der vom Speichergerät als seine logische Blockgröße betrachteten Größe angegeben. Historisch gesehen betrug die logische Blockgerätegröße fast aller Speichergeräte 512 Byte. Es gab Ausnahmen, wie z. B. IBM Mainframe DASDs, die eine Sektorgröße von 2048 Byte hatten, aber 512 war der effektive Standard. Bei modernen Speichergeräten gibt es beispielsweise einige „Advanced Format HDDs“, die eine logische Blockgröße von 4k verwenden, und wenn Sie einen SATA-Analysator zwischen der CPU und der Festplatte anschließen, werden Sie sehen, dass E/A-Anfragen in Einheiten von 4k LBA-Nummern gesendet werden. Der Linux-Kernel geht jedoch auf der Blockgeräteebene davon aus, dass alle Nummern in Einheiten von 512-Byte-Sektoren angegeben sind, auch wenn dies auf der Gerätetreiberebene möglicherweise nicht zutrifft. Die meisten von uns haben keine SCSI- oder SATA-Busanalysatoren auf der Werkbank stehen, daher ist diese Unterscheidung wahrscheinlich nicht so wichtig, es sei denn, Sie debuggen oder schreiben einen Gerätetreiber für einen Host Bus Adapter. Es schadet also nicht wirklich, wenn Sie die Terminologie „LBA“ verwenden, wenn Sie sich auf 512-Byte-Sektoren beziehen. Dies wird sehr häufig verwendet, und wenn Sie sich nur aus der Perspektive des Linux-Kernels und seiner Userspace-Dienstprogramme Gedanken machen, schadet dies nicht. Es gibt jedoch Leute, die bei solchen Dingen gerne kleinlich sind, und wenn Sie zu den Leuten gehören, die sich gerne für moralisch überlegen halten, indem sie darauf hinweisen, wann Leute KiB statt KB verwenden sollten, kennen Sie jetzt eine weitere Möglichkeit, wie Sie lästig kleinlich sein können. :-)