Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Software>Frage an Unix/Linux-Cracks: Lässt sich herausfinden, welche Datei an einer bestimmten Stelle des Speichermediums liegt?

Frage an Unix/Linux-Cracks: Lässt sich herausfinden, welche Datei an einer bestimmten Stelle des Speichermediums liegt?

Weia
Weia16.12.1921:04
Hallo allerseits,

ich betreibe einen kleinen Linux-Rechner als Heimautomationsserver, der als Speichermedium eine SD-Karte benutzt.

Die produzierte nun nach 5 Jahren zunehmend I/O-Fehler, weswegen ich sie durch eine neue ersetzt habe. Die Daten habe ich in macOS mit dd geklont.

dd listet ja auf, wo es während des Kopierens Lesefehler gab, das war bei insgesamt 143 kB (über 5 Stellen verteilt) von 4 GB der Fall. Das scheint glücklicherweise alles unkritisches Zeugs betroffen zu haben, denn mit der neuen SD-Karte funktioniert alles wieder wunderbar.

Trotzdem frage ich mich natürlich, auch aus prinzipiellem Interesse, ob es eine Möglichkeit gibt herauszufinden, welche Dateien in den betroffenen fehlerhaften Regionen lagen und zerstört wurden.

dd gibt ja die genaue Speicherstelle an, also z.B.

dd: /dev/disk8: Input/output error
661392+0 records in
661392+0 records out
338632704 bytes transferred in 210.409684 secs (1609397 bytes/sec)

Gibt es irgendeine Möglichkeit, dieser bei 338.632.704 Bytes beginnenden Region eine Datei zuzuordnen (ich habe den Default mit 512k-Blöcken benutzt)?

Wie gesagt, nicht schlimm wenn nicht, aber ich bin neugierig.
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
+1

Kommentare

rmayergfx
rmayergfx16.12.1921:18
Mit einem Hex Editor sollte das funktionieren. Oder einer Recovery Software die das ganze Blockweise ausliest:
„Der Computer soll die Arbeit des Menschen erleichtern, nicht umgekehrt !“
0
Weia
Weia16.12.1921:54
rmayergfx
Mit einem Hex Editor sollte das funktionieren.
Danke! Naheliegende Idee, da hätte ich auch selbst drauf kommen können. Ich habe die Binärdaten in eine Datei in macOS geschrieben (ich musste sie ja in macOS zwischenspeichern, da ich nur einen SD-Kartenleser habe) und habe mir die jetzt mal in einem Hex-Editor angesehen.

Beim ersten fehlenden Block kommt das heraus (der fehlende Block in der Mitte ist leicht zu sehen):
Kann die Archiv-Datei nicht in der Größe anpassenKann den Segment-Schutz nach der Relozierung nicht wieder herstellenKann die neue »repertoire«-Map »%s« nicht speichernKann den Status des Lokale-Archiv »%s« nicht bestimmenFehler beim »stat« des Shared ObjectsDer Status (stat()) der Datei »%s« nicht gelesen werden: %sDie Ausgabedateien können nicht nach »%s« geschrieben werdenDas Ergebnis kann nicht geschrieben werden: %sDie Statistik kann nicht geschrieben werden: %sDas Zeichen »%s« in der Klasse »%s« muss auch        






definiertDie Zeichensatzbeschreibung »%s« ist bereits definiertZeichensatz-Definition »%s« ist zu ASCII nicht kompatibel, die Lokale ist
nicht konform mit ISO C
Die Zeichensatzbeschreibungsdatei »%s« wurde nicht gefundenZeichensätze mit Umschalt-Stati sind nicht unterstütztKäsezirkuläre Abhängigkeiten bei den Lokale-Definitionenclnt_raw.c - Fataler Fehler bei der Header-Serialisierung.clnttcp_create: Hauptspeicher erschöpft
clntudp_create: Hauptspeicher erschöpft
clntunix_create: Hauptspeicher erschöpft

Ist also offenbar irgendein fest in ein Programm eincodierter Hilfstext. Welches Programm, ist mir leider nicht so klar. Und das ist das Hauptproblem bei diesem Verfahren: Wenn an der Stelle nun zufällig Binärcode gewesen wäre, dann würde es mir rein gar nichts nützen, die Bits und Bytes um den fehlenden Block herum zu sehen.

Was man da bräuchte, wäre eine Möglichkeit, mit Hilfe des Dateisystems den Namen der beschädigten Datei herauszufinden, die an dieser Stelle liegt. Da wüsste ich jetzt zumindest nicht, wie das mit einem Hex-Editor gehen soll.
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
beanchen16.12.1922:11
Vielleicht liege ich jetzt ganz falsch aber warum kopierst du nicht mit ditto? Da werden dir auch die Fehler ausgegeben aber als ganze Datei samt Pfad.
„Unterwegs in Analogistan: https://www.zdf.de/comedy/heute-show/heute-show-spezial-vom-19-januar-2024-100.html“
0
Weia
Weia16.12.1922:48
beanchen
Vielleicht liege ich jetzt ganz falsch aber warum kopierst du nicht mit ditto? Da werden dir auch die Fehler ausgegeben aber als ganze Datei samt Pfad.
Weil ditto ein Mac-Programm ist, ich aber ein Linux-Betriebssystem kopieren musste.
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
almdudi
almdudi17.12.1901:46
Ich bin kein Linux-Kenner, aber ditto ist doch ein UNIX-Programm, das es auch unter Linux geben müsste.
Auf jeden Fall ist es kein klassisches Mac-Programm, mit GUI und aus dem Programmordner heraus zu starten.
0
Weia
Weia17.12.1901:56
almdudi
Ich bin kein Linux-Kenner, aber ditto ist doch ein UNIX-Programm, das es auch unter Linux geben müsste.
Nope. ditto kommt von NEXTSTEP und wurde nie auf andere Unices portiert. Es erkennt das Linux-Dateisystem nicht einmal …

Ganz abgesehen davon enthielt die SD-Karte etliche Partitionen mit unterschiedlichen Dateisystemen, die ich alle hätte einzeln neu anlegen müssen, und dann jeweils von Partition zu Partition kopieren – da war eine simple Byte-Kopie viel einfacher und somit auch sicherer, um zunächst mal zu retten, was zu retten ist.

Ich habe mir mittlerweile die Umgebungen der fehlerhaften Bereiche im Hex Editor angesehen, und irgendwo mehr oder weniger nah sind dann auch immer Strings im Programmcode, aus denen man zumindest erahnen kann, um was es sich da handelt.

Aber ein „Reverse-Dateisystem“, das Dateipfade ausspuckt, wenn man Speicherbereiche eingibt, wäre schon nett.
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
almdudi
almdudi17.12.1902:21
Uh, da lag ich wohl völlig falsch.
Hab von ditto bisher immer nur in UNIX-Umgebungen gelesen.
Vielleicht einfach falsch interpretiert?
0
Peter Eckel17.12.1909:56
Das ganze ist abhängig vom Filesystem und von der Frage, ob zwischen Filesystem und physischem Speicher noch eine Abstraktionsschicht (z.B. lvm) eingezogen ist.

Ansonsten brauchst Du eine Übersetzung von physischen Blöcken zu Dateien. Bei EXT2/3/4 kann "debugfs" Dir die inodes zu einem Block ausgeben:
man debugfs
NAME
       debugfs - ext2/ext3/ext4 file system debugger
[...]
OPTIONS
[...]
       icheck block ...
              Print a listing of the inodes which use the one or more blocks specified on the command line.
Damit hättest Du schon mal den inode, das zugehörige File findest Du dann mit "find <mountpoint> -inum <inode>" (Achtung, inodes sind device-spezifisch, also nicht eindeutig, wenn Du mehrere Filesysteme hast). Das ist ziemlich langsam, aber funktioniert.

Das entsprechende Tool für XFS ist "xfs_db", da gibt es eine Funktion "convert", die u.a. physische Disk-Adressen in inodes übersetzen kann:
man xfs_db
NAME
       xfs_db - debug an XFS filesystem
[...]
OPTIONS
[...]
       convert type number [type number] ... type
              Convert from one address form to another.  The known types, with alternate names, are:
                 agblock or agbno (filesystem block within an allocation group)
                 agino or aginode (inode number within an allocation group)
                 agnumber or agno (allocation group number)
                 bboff or daddroff (byte offset in a daddr)
                 blkoff or fsboff or agboff (byte offset in a agblock or fsblock)
                 byte or fsbyte (byte address in filesystem)
                 daddr or bb (disk address, 512-byte blocks)
                 fsblock or fsb or fsbno (filesystem block, see the fsblock command)
                 ino or inode (inode number)
                 inoidx or offset (index of inode in filesystem block)
                 inooff or inodeoff (byte offset in inode)

              Only conversions that "make sense" are allowed.  The compound form (with more than three arguments) is useful for conversions such
              as convert agno ag agbno agb fsblock.
Danach dann wieder "find ...-inum".
„Ceterum censeo librum facierum esse delendum.“
+2
ssb
ssb17.12.1910:02
Käsezirkuläre Abhängigkeiten
Das finde ich mal genial, wer schreibt solche Fehlermeldungen?

Ich vermute eher dass es sich hierbei um die .text Section einer ausführbaren Datei handelt - vermutlich hast du nur das Glück, diese Datei nicht zu brauchen. Wenn es nicht so viel Aufwand ist, würde ich neu installieren und dann die Konfiguration übertragen - die scheint ja in Ordnung zu sein.

Ansonsten müsstest du ein kleines Progrämmchen schreiben (RasPI? dann ginge das in Python), dass jede Datei auf der defekten SD-Karte öffnet und komplett einliest. Ein Shell-Script ginge auch oder ein Einzeiler mit "find" mit der du alle Dateien aufgelistet bekommst und diese dann nach /dev/null kopierst. So zum Beispiel:
find / -type f -exec cp {} /dev/null \;
Wenn es dabei zu Fehlern kommt, dann zeigt cp den an. Allerdings wirst du da einiges an Geduld mitbringen müssen - es sind einfach sehr viele Dateien - und du musst es mit root-Rechten ausführen. Gegebenenfalls beim RasPi auch für Kühlung sorgen...
+1
gfhfkgfhfk17.12.1910:23
Weia
Trotzdem frage ich mich natürlich, auch aus prinzipiellem Interesse, ob es eine Möglichkeit gibt herauszufinden, welche Dateien in den betroffenen fehlerhaften Regionen lagen und zerstört wurden.
Du könntest die installierten Dateien über den Package Manager überprüfen und Dir dann anzeigen lassen, welche Datei fehlerhaft ist.
0
Weia
Weia17.12.1910:30
[quote=Peter Eckel]
       icheck block ...
              Print a listing of the inodes which use the one or more blocks specified on the command line.
Das klingt verheißungsvoll. Nur leider kriege ich stets <block not found> als Antwort.

Gebe ich den Block falsch ein? In meinem eingangs zitierten Beispiel

dd: /dev/disk8: Input/output error
661392+0 records in
661392+0 records out
338632704 bytes transferred in 210.409684 secs (1609397 bytes/sec)

wäre der Block doch 661392, oder sehe ich das falsch?
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
Weia
Weia17.12.1910:35
gfhfkgfhfk
Du könntest die installierten Dateien über den Package Manager überprüfen und Dir dann anzeigen lassen, welche Datei fehlerhaft ist.
Welchen meinst Du denn? Ich hätte apt, aptitude und dpkg im Angebot, und bin leider mit keinem sonderlich vertraut (ich habe das System vor 8 Jahren mal aufgesetzt und seitdem nie wieder angerührt …)

Kannst Du einen Hint geben, wie ich das machen würde?
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
Peter Eckel17.12.1910:43
Weia
wäre der Block doch 661392, oder sehe ich das falsch?
Hast Du es mal mit 661391 versucht? Linux fängt bei 0 an zu zählen.

Tritt der Fehler bei dd auf und dann wird sofort abgebrochen, oder läuft es erstmal weiter? Falls letzteres der Fall ist, liegt der Fehler gar nicht an der entsprechenden Stelle, sondern die Ausgabe betrifft die Anzahl der erfolgreich kopierten Blöcke.
„Ceterum censeo librum facierum esse delendum.“
0
Weia
Weia17.12.1910:44
ssb
Käsezirkuläre Abhängigkeiten
Das finde ich mal genial, wer schreibt solche Fehlermeldungen?


Das hatte ich völlig überlesen …

Wenn ich das richtig entschlüsselt habe, stammt das aus rpc - library routines for remote procedure calls.
Ich vermute eher dass es sich hierbei um die .text Section einer ausführbaren Datei handelt
Äääh, wieso eher? Genau das war doch auch meine Vermutung?
vermutlich hast du nur das Glück, diese Datei nicht zu brauchen.
Hoffe ich auch …
Wenn es nicht so viel Aufwand ist, würde ich neu installieren
Davon werde ich die Finger lassen, falls es keine Probleme gibt. Das System ist nicht nur uralt, sondern läuft auch auf einem fragilen Rechnerchen mit sage und schreibe 100 MHz CPU-Takt und 64 MB RAM … Das war lange vor RasPI-Zeiten …

Da kommt dann irgendwann besser ein neuer Mini-Rechner ins Haus, aber nicht jetzt.
Ein Shell-Script ginge auch oder ein Einzeiler mit "find" mit der du alle Dateien aufgelistet bekommst und diese dann nach /dev/null kopierst. So zum Beispiel:
find / -type f -exec cp {} /dev/null \;
Wenn es dabei zu Fehlern kommt, dann zeigt cp den an.
Das könnte man als Brute-Force-Lösung nehmen, gute Idee.
Allerdings wirst du da einiges an Geduld mitbringen müssen - es sind einfach sehr viele Dateien
… und 100 MHz …
und du musst es mit root-Rechten ausführen.
Gibt als Login eh nur den root-Nutzer auf dem Dingens …
Gegebenenfalls beim RasPi auch für Kühlung sorgen...
Das hingegen dürfte auf meiner 100-MHz-Rakete unnötig sein …
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
gfhfkgfhfk17.12.1910:48
Weia
Welchen meinst Du denn? Ich hätte apt, aptitude und dpkg im Angebot, und bin leider mit keinem sonderlich vertraut (ich habe das System vor 8 Jahren mal aufgesetzt und seitdem nie wieder angerührt …)

Kannst Du einen Hint geben, wie ich das machen würde?
Du verwendest eine dpkg basierte Distribution (debian, Ubuntu, Mint, …). Die wichtigste Info, die bei Deinem Posting fehlte. Es gibt auch noch rpm basierte Distributionen (RHEL, CentOS, Fedora, …) und noch einige andere Package Manager, die ich persönlich noch nie genutzt habe.
Bevor ich Dir hier länger etwas schreibe gibt es einen Link. Da hatte sich schon jemand die Mühe gemacht.

P.S. Bei dpkg basierten Distributionen empfiehlt sich für die Paketverwaltung "synaptic", das ist ein Tool mit einem GUI und erleichtert das Leben deutlich.
0
gfhfkgfhfk17.12.1910:53
Weia
Davon werde ich die Finger lassen, falls es keine Probleme gibt. Das System ist nicht nur uralt, sondern läuft auch auf einem fragilen Rechnerchen mit sage und schreibe 100 MHz CPU-Takt und 64 MB RAM … Das war lange vor RasPI-Zeiten …

Da kommt dann irgendwann besser ein neuer Mini-Rechner ins Haus, aber nicht jetzt.
macOS taugt nicht mehr viel als ServerOS. Gerade wenn es um den Ersatz eines 100MHz x86 Rechners geht, dann ist eine Rapsberry Pi4 mit passiven Metallkühlergehäuse eine Rakete dagegen, verbraucht kaum Strom im Vergleich und ist absolut geräuschlos.
0
Weia
Weia17.12.1911:04
Peter Eckel
Weia
wäre der Block doch 661392, oder sehe ich das falsch?
Hast Du es mal mit 661391 versucht? Linux fängt bei 0 an zu zählen.
Na gut, aber den Block direkt daneben müsste es ja auch geben, wäre halt nicht der defekte …
Tritt der Fehler bei dd auf und dann wird sofort abgebrochen, oder läuft es erstmal weiter?
Es lief weiter, da ich dd conv=sync,noerror spezifiziert hatte.
Falls letzteres der Fall ist, liegt der Fehler gar nicht an der entsprechenden Stelle, sondern die Ausgabe betrifft die Anzahl der erfolgreich kopierten Blöcke.
Schon klar, aber der Fehler liegt halt im ersten Block danach. Das kann ich im Hex-Editor ja auch verifizieren.

Das Problem ist glaube ich ein anderes. Ich muss ja erst das Dateisystem in debugfs öffnen. Und damit bekomme ich, falls debugfs die Blöcke relativ zur Wurzel des Dateisystems zählen sollte, natürlich für alle Partitionen außer der ersten einen Offset, den ich nicht kenne. Die erste Partition kann ich aber ohnehin nicht untersuchen, die hat ein FAT-Dateisystem.

Bei der zweiten Partition in debugfs geöffnet habe ich jetzt mit Trial & Error herausgefunden, dass Block-Werte < 184980 Inodes liefern, während mein kleinster Fehlerblock eben bereits Block 661392 ist. Oder ich muss die Blöcke doch irgendwie umrechnen?
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
Weia
Weia17.12.1911:11
gfhfkgfhfk
Du verwendest eine dpkg basierte Distribution (debian, Ubuntu, Mint, …).
Ja, sorry. Ich hatte das selbst nicht mehr im Kopf. Ist Debian GNU/Linux 6.0 laut Login-Shell.
Bevor ich Dir hier länger etwas schreibe gibt es einen Link. Da hatte sich schon jemand die Mühe gemacht.
Danke!
P.S. Bei dpkg basierten Distributionen empfiehlt sich für die Paketverwaltung "synaptic", das ist ein Tool mit einem GUI und erleichtert das Leben deutlich.
Nur, dass ich ja gar keine GUI habe auf meinem Mini-Rechnerchen.
gfhfkgfhfk
macOS taugt nicht mehr viel als ServerOS. Gerade wenn es um den Ersatz eines 100MHz x86 Rechners geht, dann ist eine Rapsberry Pi4 mit passiven Metallkühlergehäuse eine Rakete dagegen, verbraucht kaum Strom im Vergleich und ist absolut geräuschlos.
Öhm, von Macs habe ich doch auch nie gesprochen? Klar käme da jetzt als Ersatz ein Raspberry Pi hin. Gab’s damals halt noch nicht.
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
Peter Eckel17.12.1911:52
Weia
Das Problem ist glaube ich ein anderes. Ich muss ja erst das Dateisystem in debugfs öffnen. Und damit bekomme ich, falls debugfs die Blöcke relativ zur Wurzel des Dateisystems zählen sollte, natürlich für alle Partitionen außer der ersten einen Offset, den ich nicht kenne. Die erste Partition kann ich aber ohnehin nicht untersuchen, die hat ein FAT-Dateisystem.
Zu den Blöcken bei "dd": Wie hast Du "bs" angegeben? Wenn das nicht die Blockgröße Deines Devices ist, mußt Du umrechnen:
pete@pi4:~ $ dd if=/dev/zero of=/tmp/test bs=512 count=20
20+0 records in
20+0 records out
10240 bytes (10 kB, 10 KiB) copied, 0.00653594 s, 1.6 MB/s
pete@pi4:~ $ dd if=/dev/zero of=/tmp/test bs=1k count=10
10+0 records in
10+0 records out
10240 bytes (10 kB, 10 KiB) copied, 0.00766793 s, 1.3 MB/s
"dd" zählt die Records, die jeweils "bs" Bytes haben. Default sind bei mir 512 Byte (was der Blockgröße des Devices entspricht), aber darauf würde ich mich nicht verlassen.

Und ja, wenn Du eine FAT-Partition vor der eigentlichen Unix-Partition hast, dann müssen deren Blöcke natürlich auch noch abgezogen werden. Die Blockgröße und die Offsets geben Dir "fdisk" bzw. "parted" aus.
„Ceterum censeo librum facierum esse delendum.“
0
Weia
Weia17.12.1912:40
Peter Eckel
Zu den Blöcken bei "dd": Wie hast Du "bs" angegeben?
Gar nicht, sollte also die Blockgröße meines Devices sein.
"dd" zählt die Records, die jeweils "bs" Bytes haben. Default sind bei mir 512 Byte (was der Blockgröße des Devices entspricht), aber darauf würde ich mich nicht verlassen.
Dass es 512 Bytes sind, kann ich ja einfach verifizieren, da sowohl Anzahl der Blöcke als auch die Bytes angegeben sind. Ist definitiv 512.
Die Blockgröße und die Offsets geben Dir "fdisk" bzw. "parted" aus.
Mit fdisk kriege ich:
# fdisk -l

Disk /dev/mmcblk0: 4025 MB, 4025483264 bytes
255 heads, 63 sectors/track, 489 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00075cad

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1               1           4       32098+   6  FAT16
/dev/mmcblk0p2               5         135     1052257+  83  Linux
/dev/mmcblk0p3             136         461     2618595   83  Linux
/dev/mmcblk0p4             462         482      168682+  82  Linux swap / Solaris
So richtig schlau werde ich daraus aber nicht.
  • Was beschreiben denn die Zahlen in den Spalten Start und End?
  • Sind die Zahlen in der Spalte Blocks jetzt die Partitionsgrößen oder der Startpunkt der jeweiligen Partition?
  • Und was bedeutet das + hinter manchen Zahlen in der Spalte Blocks?

Ich kann da weder in sich eine Konsistenz finden noch im Vergleich zu df:
# df -B 512
Dateisystem        512B-Blöcke   Benutzt Verfügbar Ben% Eingehängt auf
/dev/mmcblk0p2         2071384   1470832    495328  75% /
tmpfs                    60984         0     60984   0% /lib/init/rw
udev                     20480       280     20200   2% /dev
tmpfs                    60984         0     60984   0% /dev/shm
/dev/mmcblk0p1           64032      7872     56160  13% /media/mmc_p1
/dev/mmcblk0p3         5154848    796264   4096728  17% /var/log/fhem

„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
ssb
ssb17.12.1913:26
Weia
Ein Shell-Script ginge auch oder ein Einzeiler mit "find" mit der du alle Dateien aufgelistet bekommst und diese dann nach /dev/null kopierst. So zum Beispiel:
find / -type f -exec cp {} /dev/null \;
Wenn es dabei zu Fehlern kommt, dann zeigt cp den an.
Das könnte man als Brute-Force-Lösung nehmen, gute Idee.

Ich war mir nicht sicher, ob "cp" die Datei auch liest, aber bei XFS sollte dem so sein. Ich hätte sonst statt "cp {} /dev/null" eben "cat {} > /dev/null" benutzt.

Ich bin mir nicht sicher, ob "mv" statt "cp" ginge... Eigentlich müssten auch da die Datei-Inhalte gelesen werden, da auf ein anderes Device geschrieben wird. Das könntest du dann gemütlich laufen lassen und Urlaub machen. Wenn du zurückkommst sind die kaputten Dateien übrig (plus diejenigen, die geöffnet waren, während das Skript lief). Alle anderen Dateien waren lesbar und löschbar und wurden auf /dev/null bewegt. OK, dort sind sie meist schwer zu finden (Frei nach Bastard Operator From Hell)
+1
Peter Eckel17.12.1913:40
Weia
Dass es 512 Bytes sind, kann ich ja einfach verifizieren, da sowohl Anzahl der Blöcke als auch die Bytes angegeben sind. Ist definitiv 512.
Paßt. Gut.
Weia
# fdisk -l

Disk /dev/mmcblk0: 4025 MB, 4025483264 bytes
255 heads, 63 sectors/track, 489 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00075cad

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1               1           4       32098+   6  FAT16
/dev/mmcblk0p2               5         135     1052257+  83  Linux
/dev/mmcblk0p3             136         461     2618595   83  Linux
/dev/mmcblk0p4             462         482      168682+  82  Linux swap / Solaris
So richtig schlau werde ich daraus aber nicht.

Ein "schönes" altes fdisk hast Du da Die alten Versionen rechnen in Zylindern, nicht in Blöcken. Funktioniert "fdisk -lu=sectors"? Oder hast Du auch parted?
pete@pi4:~ $ sudo parted /dev/mmcblk0
GNU Parted 3.2
Using /dev/mmcblk0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) u                                                                
Unit?  [compact]? s                                                       
(parted) p                                                                
Model: SD SL16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End        Size       Type     File system  Flags
 1      8192s   92159s     83968s     primary  fat32        lba
 2      92160s  31116287s  31024128s  primary  ext4
Weia
  • Was beschreiben denn die Zahlen in den Spalten Start und End?
  • Sind die Zahlen in der Spalte Blocks jetzt die Partitionsgrößen oder der Startpunkt der jeweiligen Partition?
  • Und was bedeutet das + hinter manchen Zahlen in der Spalte Blocks?
1. Anfang und Ende der Partition in Zylindern (jaja, gibt's bei SD-Karten wirklich nicht mehr. Und auch sonst nicht, spätestens seit SCSI. Habe ich erwähnt, daß das ein antikes fdisk ist?)
2. Ersteres (offenbar, sonst wäre der Wert in der vierten Zeile nicht kleiner als der in der Dritten). Aber mit einer Blockgröße von 1024, warum auch immer.
3. Daß der Wert nicht stimmt

Wenn fdisk in Zylindern rechnet und die Partition in vollen Zylindern angelegt wurde, sind die Allozierungseinheiten halt Zylinder. Ein Zylinder hat bei Deiner SD-Karte 255 Köpfe * 63 Sektoren. 4 Zylinder haben also 32130 1k-Blöcke, 131 Zylinder haben 1052257.5 1k-Blöcke, und 326 Blöcke haben 2618595 1k-Blöcke. Und der Wert stimmt nun ohne Rundung, deswegen kein '+'.

Wenn Du mich jetzt fragen solltest, was die bescheuerte 'Rumrechnerei soll: Das haben sich die Autoren von fdisk inzwischen auch gefragt und nutzen Zylinder nur noch optional. Früher war das mal nötig, weil die Device Driver auch in Köpfen, Spuren und Sektoren dachten. Ganz übel wird es, wenn man dusselig genug ist, fdisk im Zylinder-Modus zu benutzen und hat vorher die Platte in Blöcken partitioniert ... damit kann man sich dann ganz toll die Partitionstabelle zerschießen.
Weia
Ich kann da weder in sich eine Konsistenz finden noch im Vergleich zu df:
# df -B 512
Dateisystem        512B-Blöcke   Benutzt Verfügbar Ben% Eingehängt auf
/dev/mmcblk0p2         2071384   1470832    495328  75% /
/dev/mmcblk0p1           64032      7872     56160  13% /media/mmc_p1
/dev/mmcblk0p3         5154848    796264   4096728  17% /var/log/fhem

Das paßt schon ganz gut:
  • /dev/mmcblk0p1 hat in fdisk 4 Zylinder, also 64260 Blöcke. Abzüglich Overhead bleiben fürs Filesystem 64032 netto.
  • /dev/mmcblk0p2 hat in fdisk 130 Zylinder, also 2088450 Blöcke. Abzüglich Overhead bleiben fürs Filesystem 2071384 netto.
  • /dev/mmcblk0p3 hat in fdisk 325 Zylinder, also 5221125 Blöcke. Abzüglich Overhead bleiben fürs Filesystem 5154848 netto.

Damit sollten sich die Blockgrenzen eigentlich schon ordentlich berechnen lassen ...
Device            Start-Zylinder     Start-Block
/dev/mmcblk0p1    0                  0
/dev/mmcblk0p2    4                  64260
/dev/mmcblk0p3    135                2168775
/dev/mmcblk0p4    461                7405965
... wenn die Werte aus "fdisk" stimmen sollten, wovon ich aber anhand der stimmigen Ergebnisse ausgehe.
„Ceterum censeo librum facierum esse delendum.“
+1
Peter Eckel17.12.1913:47
Wo ich das gerade sehe:
Weia
/dev/mmcblk0p3         5154848    796264   4096728  17% /var/log/fhem
Es ist keine richtig gute Idee, auf eine SD-Karte zu loggen. Frag' mal Tesla
„Ceterum censeo librum facierum esse delendum.“
+2
Peter Eckel17.12.1914:11
Bevor mich jetzt jemand haut: Ich habe gelogen
Peter Eckel
Damit sollten sich die Blockgrenzen eigentlich schon ordentlich berechnen lassen ...
Device            Start-Zylinder     Start-Block
/dev/mmcblk0p1    0                  0
/dev/mmcblk0p2    4                  64260
/dev/mmcblk0p3    135                2168775
/dev/mmcblk0p4    461                7405965
... wenn die Werte aus "fdisk" stimmen sollten, wovon ich aber anhand der stimmigen Ergebnisse ausgehe.

Das stimmt auch nicht. Die erste Partition fängt nicht in Block 0 an, da fehlt nämlich noch die Partitionstabelle. Und damit beginnt die erste Partition auch noch auf einem ganz krummen Zylinder - was die im Vergleich zum gerundeten Zylinder-Größenwert doch deutlich geringere Blockzahl erklärt.

Die erste Partition dürfte 64197 Blöcke haben. Das läßt 63 Blöcke für die Partitionstabelle, und damit landen wir jetzt hier:

Device            Start-Zylinder     Start-Block
P                 0                  0
/dev/mmcblk0p1    0+                 63
/dev/mmcblk0p2    4                  64260
/dev/mmcblk0p3    135                2168775
/dev/mmcblk0p4    461                7405965

Jetzt paßt es aber wirklich.
„Ceterum censeo librum facierum esse delendum.“
+1
Weia
Weia17.12.1914:43
Peter Eckel
Jetzt paßt es aber wirklich.
Ganz herzlichen Dank für die viele Arbeit, die Du dir gemacht hast! Das hat mir viel Schweiß erspart. Ich werde aber vermutlich erst heute Nacht dazu kommen, damit weiterzumachen.
Peter Eckel
Es ist keine richtig gute Idee, auf eine SD-Karte zu loggen. Frag' mal Tesla
Naja, worauf sonst? Das ist ja nun mal das einzige angeschlossene Speichermedium. Eine USB-SSD wäre ja größer und teurer als der ganze Rechner … Die ganzen Mini-Rechnerchen à la Raspberry Pi nutzen doch SD-Karten, auch zum Loggen.

Da steht auch nicht sooo viel und Wichtiges drin. Wann ich welches Licht an und ausgemacht habe und alle paar Minuten die Raumtemperaturen …

Was würde Tesla denn erzählen, würde ich fragen??
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
Peter Eckel17.12.1916:38
SD-Karten haben eine höchst beschränkte Anzahl an möglichen Schreibzyklen, und die üblichen Linux-Logs werden ziemlich oft geschrieben. Das paßt nicht richtig gut zusammen.

Die eine Möglichkeit (wenn Du die Logs nicht brauchst), ist nicht zu loggen. Eine andere (wenn Du die Logs manchmal brauchst, aber nicht lange) ist, dafür eine Ram-Disk zu benutzen, dann sind sie halt nach einem Reboot weg. Die dritte Möglichkeit ist sie per syslog an einen anderen Server zu schicken, der dafür besser geeignetes Storage hat.

Und Tesla hat das anscheinend auch nicht so genau gewußt ... die EMMC-Drives, die sie dafür genommen haben, sind auch nicht viel haltbarer als SDs. Das Resultat:

Die 'Lösung', einfach eine größere EMMC zu nehmen, ist übrigens selten dämlich ...
„Ceterum censeo librum facierum esse delendum.“
+1
gfhfkgfhfk17.12.1917:58
Weia
Nur, dass ich ja gar keine GUI habe auf meinem Mini-Rechnerchen.
Wenn Du X11 auf dem Mac hast, kannst Du das Ding per X11 fernsteuern.
Öhm, von Macs habe ich doch auch nie gesprochen? Klar käme da jetzt als Ersatz ein Raspberry Pi hin. Gab’s damals halt noch nicht.
Freudscher Verleser von mir, ich las nur Mini und dachte bei Dir an einen Mac Mini.
+1
Weia
Weia17.12.1918:12
Peter Eckel
SD-Karten haben eine höchst beschränkte Anzahl an möglichen Schreibzyklen, und die üblichen Linux-Logs werden ziemlich oft geschrieben. Das paßt nicht richtig gut zusammen.
OK, ja, soweit ist mir das ja klar.

In die Partition, die Dir aufgefallen ist, werden allerdings nur die Logs meines Hausautomationssystems (FHEM) geschrieben, und das ist nicht so viel. Die Partition ist 2,5 GB groß, das reicht ohne jegliche Rotation für hochgerechnet ca. 50 Jahre, also jedenfalls länger, als ich noch lebe. Insofern sollte das nur ein Problem sein, falls das Anhängen neuer Einträge jedes Mal ein Neuschreiben der gesamten Datei zu Folge hätte, was ich doch nicht hoffe.

Die Unix-Logdateien sind auf der Linux-Partition, das könnte ein größeres Problem werden. Fast alle I/O-Fehler jetzt waren in der Tat auch auf dieser Partition. Mal sehen, ob ich da das Logging reduzieren kann.

Ich hatte jetzt doch schon etwas Zeit zum Rumprobieren.
Funktioniert "fdisk -lu=sectors"? Oder hast Du auch parted?
parted habe ich nicht, aber -u bei fdisk funktioniert:

# fdisk -l -u

Disk /dev/mmcblk0: 4025 MB, 4025483264 bytes
255 heads, 63 sectors/track, 489 cylinders, total 7862272 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00075cad

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1              63       64259       32098+   6  FAT16
/dev/mmcblk0p2           64260     2168774     1052257+  83  Linux
/dev/mmcblk0p3         2168775     7405964     2618595   83  Linux
/dev/mmcblk0p4         7405965     7743329      168682+  82  Linux swap / Solaris
Dein Ergebnis war:
Device            Start-Zylinder     Start-Block
P                 0                  0
/dev/mmcblk0p1    0+                 63
/dev/mmcblk0p2    4                  64260
/dev/mmcblk0p3    135                2168775
/dev/mmcblk0p4    461                7405965
Also perfekte Übereinstimmung.

Nur leider hilft mir das nicht viel weiter, denn bei den allermeisten Fehlerblöcken gibt debugfs mit der Partitions-relativen Blockzahl nach wie vor <block not found> zurück, und wo es eine Inode zurück gibt, verweist find dann auf eine völlig heile Datei.

Ist also theoretisch genau, was ich gesucht habe, will praktisch nur aus irgendeinem Grund (noch) nicht. Grmbl. Ich forsche später weiter.
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
Weia
Weia18.12.1921:54
Weia
Ich forsche später weiter.
So, ich habe jetzt alles möglicher ausprobiert. Das ist wieder mal so ein Fall, wo Murphy seine vielfältigen Facetten unter Beweis stellen konnte.

Nachdem ich wie beschrieben mit debugfs nicht so recht vorankam, habe ich erstmal die anderen Methoden durchprobiert.
gfhfkgfhfk
Du könntest die installierten Dateien über den Package Manager überprüfen und Dir dann anzeigen lassen, welche Datei fehlerhaft ist.
gfhfkgfhfk
Bevor ich Dir hier länger etwas schreibe gibt es einen Link. Da hatte sich schon jemand die Mühe gemacht.
Prinzipieller Nachteil diese Methode ist natürlich, dass sie nur beschädigte Dateien der Systeminstallation findet und keine selbsterstellten. Da sie aber effizient klang, dachte ich, ich fange damit mal an.

Leider scheiterte ich aber schon beim allerersten Schritt der verlinkten Beschreibung; apt-get install debsums endete bei mir immer mit einer Fehlermeldung von dpkg. Da ich keine Lust auf Fehlersuche auf Metaebene hatte, habe ich es dabei erstmal belassen.

ssb
Ansonsten müsstest du ein kleines Progrämmchen schreiben […], das jede Datei auf der defekten SD-Karte öffnet und komplett einliest.
Ich habe gemäß Deinen Hinweisen find . -type f -exec cat > /dev/null \; verwendet und zunächst zu meinem Erstaunen überhaupt keine beschädigte Dateien gefunden, bis mir auffiel, dass es natürlich keinerlei Sinn ergibt, diesen Befehl über die geklonte und nun eingebaute SD-Karte laufen zu lassen. Denn da sind alle fehlerhaften Stellen ja durch Nullen oder Leerzeichen ersetzt, was den Dateiinhalt zwar unbrauchbar macht, aber natürlich beim Auslesen keine Lesefehler erzeugt.

Also musste die fehlerhafte Originalkarte wieder her, die schon im Müll gelandet war. Allerdings wollte ich sie nicht erneut in meinem Hausautomationsserver einbauen und damit die Hausteuerung erneut lahmlegen. Durchsuchen in macOS ging aber natürlich auch nicht, da macOS das Linux-Dateisystem ja nicht erkennt. Also blieb eine Ubuntu-Installation in VMware Fusion, nur dass die beim Update auf Mojave und parallel eine neue Fusion-Version leider zerschossen worden war. Also habe ich erstmal die halbe Nacht damit zugebracht, meine VMware-Maschinen zu reparieren …

Danach konnte ich dann die vorgeschlagene Brute-Force-Methode anwenden. Die funktionierte zwar prinzipiell, bei mehreren Durchläufen nach jeweils erneutem Mounten der SD-Karte stellte sich aber heraus, dass jedesmal andere Dateien Lesefehler verursachten. Der Schadzustand der SD-Karte unterliegt also leider Schwankungen, so dass sich damit wiederum nicht festellen ließ, welche Dateien beim Klonen auf die neue SD-Karte es denn nun waren, die nicht korrekt kopiert werden konnten. Da blieb wirklich nur das dd-Fehlerprotokoll mit der Angabe der defekten Blöcke, an deren Umwandlung in Dateipfade ich aber halt gescheitert bin.

Immerhin, zwei Dateien sind offenbar so korrupt, dass sie bei jedem der Testdurchläufe Lesefehler verursachten und also definitiv zerstört sind. Das waren /usr/bin/dpkg und /usr/bin/pcretest. Also ausgerechnet der Package Manager – kein Wunder folglich, dass ich mit der von gfhfkgfhfk vorgeschlagenen Methode schon beim Herunterladen des dafür fehlenden Package scheiterte …

Immerhin war das Ergebnis konsistent mit den von dd als fehlerhaft gemeldeten Blöcken, die ich mir daraufhin im Hex-Editor angesehen hatte; dass ein bestimmter Bereich zu dpkg gehörte, ist völlig plausibel und war von mir daher schon befürchtet worden.

Die einzige Methode, die mir verlässlich sagen könnte, welche Dateien bei dem konkreten Kopiervorgang auf die neue SD-Karte zerstört wurden, wäre also in der Tat die Methode, die Blöcke in debugfs auszuwerten, und ich verstehe nach wie vor nicht, warum die nicht funktioniert.

Interessanterweise weiß ich ja nun von 2 Dateien definitiv, dass sie fehlerhaft sind, und kann mir daher die Inodes ausgeben lassen:

# find /usr/bin -type f \( -name dpkg -o -name pcretest \) -printf "Inode of %p: %i\n"
Inode of /usr/bin/pcretest: 14577
Inode of /usr/bin/dpkg: 14580

Das ist so weit konsistent mit debugfs -b512:

debugfs:  open /dev/mmcblk0p2
debugfs:  cd /usr/bin

debugfs:  stat pcretest
Inode: 14577   Type: regular    Mode:  0755   Flags: 0x80000
Generation: 693701977    Version: 0x00000000:00000001
User:     0   Group:     0   Size: 41292
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 88
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x4f6a1042:0753bdac -- Wed Mar 21 18:30:42 2012
 atime: 0x4f6a1042:028efe88 -- Wed Mar 21 18:30:42 2012
 mtime: 0x4c5b4882:00000000 -- Fri Aug  6 01:25:54 2010
crtime: 0x4f6a1042:028efe88 -- Wed Mar 21 18:30:42 2012
Size of extra inode fields: 28
EXTENTS:
(0-10): 101248-101258

debugfs:  ex pcretest
Level Entries       Logical        Physical Length Flags
 0/ 0   1/  1     0 -    10 101248 - 101258     11 

debugfs:  stat dpkg
Inode: 14580   Type: regular    Mode:  0755   Flags: 0x80000
Generation: 693701980    Version: 0x00000000:00000001
User:     0   Group:     0   Size: 191600
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 376
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x4f6a1042:13b9ae9c -- Wed Mar 21 18:30:42 2012
 atime: 0x4f6a1042:0753bdac -- Wed Mar 21 18:30:42 2012
 mtime: 0x4db7344f:00000000 -- Tue Apr 26 23:08:31 2011
crtime: 0x4f6a1042:0753bdac -- Wed Mar 21 18:30:42 2012
Size of extra inode fields: 28
EXTENTS:
(0-46): 101262-101308

debugfs:  ex dpkg
Level Entries       Logical        Physical Length Flags
 0/ 0   1/  1     0 -    46 101262 - 101308     47

Aber wenn ich nun eine Fehlermeldung aus der dd-Ausgabe hernehme wie
dd: /dev/disk8: Input/output error
874273+0 records in
874273+0 records out
447627776 bytes transferred in 510.754536 secs (876405 bytes/sec)
von der ich durch Eingabe von 447627776 im Hex-Editor definitiv bestätigen kann, dass das eine Schadstelle ist (lauter Nullen) und dass der umgebende Code definitiv zu pcretest gehört (… Usage: pcretest [options] [<input file> [<output file>]] …), dann müsste ich doch durch die Blockangabe 874273 – 64260 (Start-Offset) = 810013 in debugfs -b512 die zugehörige Inode 14577 bekommen, und das tue ich eben nicht:
debugfs:  icheck 810013
Block    Inode number
810013    <block not found>
Habe ich da einen Denkfehler, oder tut debugfs nicht, was es soll?


Pragmatisch kann ich das Problem jetzt auf sich beruhen lassen. Ich weiß in etwa, was zerstört wurde, und es sieht so aus, als würde mein kleiner Server noch durchhalten, bis es neue Hardware samt neuer Linux-Installation gibt.

Aber ich hätte zu gern die exakte Fehlersuche erfolgreich beenden können, um in Zukunft für ähnliche Fälle ein erprobtes Verfahren an der Hand zu haben.
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
Weia
Weia19.12.1904:43
Lösung

OK, ich saß auf der Leitung, jetzt hab ich’s. Bei näherer Betrachtung des Zahlenwusts in meinem vorangegangenen Beitrag fiel mir auf, dass ich die Blockangaben der Fehlermeldungen von dd durch 8 dividieren muss, um sie in debugfs verwenden zu können, warum auch immer (einmal Bits, einmal Bytes??).

Hier also für die Nachwelt der ganze Vorgang exemplarisch mit einem Fehler:

Kopie von schadhafter SD-Karte (/dev/disk8) auf neue SD-Karte (/dev/disk9), mit resultierender Fehlermeldung:

# dd if=/dev/disk8 of=/dev/disk9 conv=sync,noerror
dd: /dev/disk8: Input/output error
874273+0 records in
874273+0 records out
447627776 bytes transferred in 510.754536 secs (876405 bytes/sec)

Dateisystem-Layout mit fdisk feststellen:

# fdisk -l -u

Disk /dev/mmcblk0: 4025 MB, 4025483264 bytes
255 heads, 63 sectors/track, 489 cylinders, total 7862272 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00075cad

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1              63       64259       32098+   6  FAT16
/dev/mmcblk0p2           64260     2168774     1052257+  83  Linux
/dev/mmcblk0p3         2168775     7405964     2618595   83  Linux
/dev/mmcblk0p4         7405965     7743329      168682+  82  Linux swap / Solaris
Der Fehler (Block 874273) tritt offenkundig in den Blöcken auf, die zu /dev/mmcblk0p2 (64260 – 2168774) gehören.

Da debugfs von /dev/mmcblk0p2 aus rechnen wird, muss der Start-Offset abgezogen werden:
874273 – 64260 = 810013
Das Ergebnis wird dann durch 8 geteilt und gerundet:
810013 / 8 = 101251.625 ≈ 101251

Nun in debugfs das betroffene Dateisystem öffnen, mit icheck die Inode zum Block suchen und mit ncheck den Pfad zur Inode:

# debugfs
       
debugfs 1.41.12 (17-May-2010)

debugfs:  open /dev/mmcblk0p2

debugfs:  icheck 101251
Block    Inode number
101251    14577

debugfs:  ncheck 14577
Inode    Pathname
14577    /usr/bin/pcretest

debugfs:  quit

Voilà: /usr/bin/pcretest ist beschädigt.
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
+1
Weia
Weia19.12.1910:51
Weia
Das Ergebnis wird dann durch 8 geteilt und gerundet:
Hat jemand eine Idee, warum ich die Block-Werte aus dd und fdisk durch 8 dividieren muss, um sie in debugfs verwenden zu können?

Nach der vollständigen Analyse aller in meinem konkreten Fall beschädigten Dateien kann ich bestätigen, dass das für diesen Fall zumindest definitiv stimmt, nur bin ich ja rein heuristisch darauf gestoßen und verstehe nicht, warum.
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
Peter Eckel19.12.1911:52
Weia
Hat jemand eine Idee, warum ich die Block-Werte aus dd und fdisk durch 8 dividieren muss, um sie in debugfs verwenden zu können?
Rufe doch in debugfs bitte mal das stats-Unterkommando auf. Was steht bei Block Size?
„Ceterum censeo librum facierum esse delendum.“
0
Weia
Weia19.12.1912:22
Peter Eckel
Rufe doch in debugfs bitte mal das stats-Unterkommando auf. Was steht bei Block Size?
Ahaaa – 4096 (= 8 × 512 … ).

Was ich allerdings nicht verstehe: Genau solche Inkonsistenzen befürchtend, habe ich zunächst sicherheitshalber debugfs immer als debugfs -b 512 gestartet und damit erst aufgehört, nachdem ich mehrfach überprüft hatte, dass das nichts am Verhalten gegenüber debugfs (ohne Parameter) ändert.

Ich habe jetzt gerade nochmals debugfs -b 512 gestartet, aber die Block Size-Angabe von stats bleibt auch dann bei 4096. Kann natürlich sein, dass das schlicht ein Bug ist.

Jedenfalls tausend Dank an Dich zur Aufklärung auch des letzten Stolpersteins!
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
+1
Peter Eckel19.12.1916:00
Weia
Was ich allerdings nicht verstehe: Genau solche Inkonsistenzen befürchtend, habe ich zunächst sicherheitshalber debugfs immer als debugfs -b 512 gestartet und damit erst aufgehört, nachdem ich mehrfach überprüft hatte, dass das nichts am Verhalten gegenüber debugfs (ohne Parameter) ändert.
Das Problem ist, daß die Allokationseinheit für das Filesystem halt (in diesem Fall, man kann das je nach Filesystem auch deutlich vergrößern) 8 Device-Blöcke sind. Deswegen mußt Du auch bei der Umrechnung immer abrunden - Du brauchst den Anfang des Filesystem-Blocks. Daran hätte ich auch denken sollen, sorry - hatte ich komplett zu erwähnen vergessen.
Weia
Ich habe jetzt gerade nochmals debugfs -b 512 gestartet, aber die Block Size-Angabe von stats bleibt auch dann bei 4096. Kann natürlich sein, dass das schlicht ein Bug ist.
Nein, das ist korrekt so - debugfs rechnet, seinem Namen treu bleibend, mit Filesystem-Blöcken. Die sind nicht notwendigerweise identisch mit Device-Blöcken.
Weia
Jedenfalls tausend Dank an Dich zur Aufklärung auch des letzten Stolpersteins!
Gern geschehen.
„Ceterum censeo librum facierum esse delendum.“
+1

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.