Warum füllen ext-Dateisysteme nicht das gesamte Gerät?

8

Ich habe gerade bemerkt, dass eines der ext {2,3,4} -Dateisysteme, die ich auf einer 500G-Festplatte erstellen möchte, nicht den gesamten verfügbaren Speicherplatz (466G) nutzt. Ich habe auch reiser3, xfs, jfs, btrfs und sogar vfat ausprobiert. Alle von ihnen erzeugen fs der Größe 466G (wie durch df -h gezeigt ). Ext * erzeugt jedoch fs von 459G. Durch Deaktivieren reservierter Blöcke wird der für den Benutzer verfügbare Speicherplatz erhöht, die Größe von fs beträgt jedoch immer noch 459 G.

Gleiches gilt für 1 TB Festplatte: 932G reiserfs, 917G ext4.

Was ist dieser Unterschied von 1,5%? Warum passiert es und gibt es die Möglichkeit, ext dazu zu bringen, das gesamte Volumen zu füllen?

UPD: Alle Tests, die auf demselben Computer, auf derselben Festplatte usw. durchgeführt wurden. Es spielt keine Rolle, wie sich 466G vom Marketing von 500G unterscheidet. Das Problem ist, dass es für verschiedene FS unterschiedlich ist.

Über df - zeigt die Gesamtgröße des FS, die verwendete Größe und den freien Speicherplatz an. In diesem Fall habe ich:

für reiserfs:

/ dev / sda1 466G 33M 466G 1% / mnt

für ext4:

/ dev / sda1 459G 198M 435G 1% / mnt

Wenn ich die Root-Block-Reservierung deaktiviere, ändert sich 435G in 459G - volle Größe von fs (minus 198M). Aber fs selbst ist immer noch 459G für ext4 und 466G für reiser!

UPD2: Füllen von Volumes mit realen Daten über dd:

reiserfs:

fs: ~ # dd if = / dev / zero von = / mnt / 1
dd: запись в «/ mnt / 1»: На устройстве кончилось место
975702649 + 0 записей считано
975702648 + 0 записей написано
 скопировано 499559755776 байт (500 GB), 8705,61 c, 57,4 MB / c

ext2 mit deaktivierter Blockreservierung (mke2fs -m 0):

fs: ~ # dd if = / dev / zero von = / mnt / 1
dd: запись в «/ mnt / 1»: На устройстве кончилось место
960356153 + 0 записей считано
960356152 + 0 записей написано
 скопировано 491702349824 байта (492 GB), 8870,01 c, 55,4 MB / c

Entschuldigung für Russisch, aber ich habe es im Standardgebietsschema ausgeführt und es zu wiederholen ist zu lang. Es spielt keine Rolle, die dd-Ausgabe ist offensichtlich.

Es stellt sich also heraus, dass mke2fs wirklich ein kleineres Dateisystem erstellt als andere mkfs.

Ineu
quelle
2
Mit jedem FS ist ein gewisser Overhead verbunden ... Ich kenne keinen, der Ihnen den Zugriff auf den gesamten verfügbaren physischen Speicherplatz auf der Festplatte ermöglicht.
Prodigitalson
Ich empfehle Ihnen, Ihren Anzeigenamen zu ändern und das, was Ihr Blog zu sein scheint, in das Website-Feld Ihres Profils einzufügen, um weniger offensichtliche Werbung zu machen.
Hallo71
1
Hallo71, danke für den Rat. Website ist nicht wirklich wichtig, es ist nur für openid.
Ineu
Für zukünftige Hinweise, wenn Sie schnell möchten, dass ein Programm auf Englisch ausgegeben wird, verwenden Sie LANG=C foooderLC_ALL=C foo
Alan Pearce
Alan, richtig, danke. Es könnte sogar LANG = oder LANG = POSIX sein. Aber wie gesagt, dieser Prozess nimmt viel Zeit in Anspruch, so dass es unvernünftig ist, ihn nur für ein paar Zeilen mit einem anderen Gebietsschema erneut auszuführen :) In beiden Fällen ist das Problem mit der FS-Größe für ext2 :(
Ineu

Antworten:

19

Es gibt zwei Gründe, warum dies wahr ist.

Erstens melden Autoren aus irgendeinem Grund oder aus anderen Gründen immer noch freien Speicherplatz in Bezug auf ein Base-2-System, und Festplattenhersteller melden freien Speicherplatz in Bezug auf ein Base-10-System. Beispielsweise nennt ein Betriebssystemschreiber 1024 Bytes (2 ^ 10 Bytes) pro Kilobyte, und ein Festplattenhersteller würde 1000 Bytes pro Kilobyte nennen. Dieser Unterschied ist für Kilobyte ziemlich gering, aber sobald Sie Terabyte erreicht haben, ist er ziemlich bedeutend. Ein OS-Writer nennt 1099511627776 Bytes (2 ^ 40 Bytes) ein Terabyte, und ein Festplattenhersteller nennt 1000000000000 Bytes ein Terabyte.

Diese zwei unterschiedlichen Arten, über Größen zu sprechen, führen häufig zu großer Verwirrung.

Es gibt ein fleckig unterstütztes ISO-Präfix für Binärgrößen . Benutzeroberflächen, die unter Berücksichtigung des neuen Präfixes entwickelt wurden, zeigen TiB, GiB (oder allgemeiner XiB) an, wenn Größen mit einem Basis-2-Präfixsystem angezeigt werden.

Zweitens gibt df -h an, wie viel Speicherplatz für Ihre Verwendung verfügbar ist. Alle Dateisysteme müssen Reinigungsinformationen schreiben, um die Dinge für Sie im Auge zu behalten. Diese Informationen belegen einen Teil des Speicherplatzes auf Ihrem Laufwerk. Nicht generell sehr viel, aber einige. Das erklärt auch einen Teil des scheinbaren Verlusts, den Sie sehen.

Nachdem Sie Ihren Beitrag bearbeitet haben, um zu verdeutlichen, dass keine meiner Antworten Ihre Frage tatsächlich beantwortet, werde ich versuchen, Ihre Frage zu beantworten ...

Unterschiedliche Dateisysteme verwenden unterschiedliche Speicherplatzmengen für Verwaltungsinformationen und melden diese Speicherplatznutzung auf unterschiedliche Weise.

Zum Beispiel unterteilt ext2 die Platte in Zylindergruppen. Anschließend wird in jeder Zylindergruppe Platz für Inodes und Freiraumkarten vorab zugewiesen. ext3 macht das Gleiche, da es im Grunde genommen ext2 + Journaling ist. Und ext4 macht genau das Gleiche, da es eine ziemlich einfache (und fast abwärtskompatible) Modifikation von ext3 ist. Und da dieser Metadaten-Overhead bei der Erstellung des Dateisystems oder bei der Größenänderung behoben wird, wird er nicht als "verwendeter" Speicherplatz gemeldet. Ich vermute, dass dies auch daran liegt, dass sich die Metadaten der Zylindergruppe an festen Stellen auf der Festplatte befinden und daher einfach als verwendet impliziert werden und daher in Freiraumkarten nicht markiert oder berücksichtigt werden.

Reiserfs weist jedoch keinerlei Metadaten vorab zu. Es gibt kein Inode-Limit, das bei der Erstellung des Dateisystems festgelegt ist, da alle Inodes im laufenden Betrieb zugewiesen werden, wie dies bei Datenblöcken der Fall ist. Es benötigt höchstens einige Strukturen, die das Stammverzeichnis beschreiben, und eine Art Freiraumkarte. Es verbraucht also viel weniger Platz, wenn es nichts enthält.

Dies bedeutet jedoch, dass reiserfs beim Hinzufügen von Dateien mehr Speicherplatz beanspruchen, da Metadaten (wie Inodes) sowie der tatsächliche Datenbereich für die Datei zugewiesen werden.

Ich weiß nicht genau, wie jfs und btrfs die Nutzung des Metadatenbereichs verfolgen. Aber ich vermute, sie verfolgen es eher wie reiserfs. Insbesondere vfat hat überhaupt kein Inode-Konzept. Die Karte des freien Speicherplatzes (deren Größe beim Erstellen des Dateisystems festgelegt ist (die berüchtigte FAT-Tabelle)) speichert einen Großteil der Daten, die ein Inode benötigen würde, und der Verzeichniseintrag (der dynamisch zugewiesen wird) speichert den Rest.

Allgegenwärtig
quelle
2
Dafür gibt es einen ISO-Standard: en.wikipedia.org/wiki/Binary_prefix
Bobby
@ Bobby - Ja, und es wird in Displays angezeigt. Ich werde das zu meiner Antwort hinzufügen. Vielen Dank!
Omnifarious
8

Neben den von Omnifarious erwähnten Problemen ist bei ext2 / 3/4 ein bestimmter Speicherplatz für root reserviert - dieser reservierte Speicherplatz wird in der Ausgabe von df nicht angezeigt.

Erstellen Sie beispielsweise ein kleines Dateisystem (~ 100 MB) mit Standardoptionen, indem Sie ext2 anstelle von 3 oder 4 verwenden, um Speicherplatz zu ignorieren, der sonst vom Journal belegt würde:

swann:/tmp# dd if=/dev/zero of=./loop.fs bs=10240 count=10240
swann:/tmp# mkfs.ext2 loop.fs
swann:/tmp# mkdir loop
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     92480   2% /tmp/loop

Optimieren der Option für reservierte Blöcke (Mit tune2fsder -mOption werden die reservierten Blöcke als Prozentsatz und mit der -rOption die reservierten Blöcke als gerade Anzahl von Blöcken festgelegt):

swann:/tmp# umount loop
swann:/tmp# tune2fs -m 25 loop.fs
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     72000   3% /tmp/loop

swann:/tmp# umount loop
swann:/tmp# tune2fs -m 0 loop.fs
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     97600   2% /tmp/loop

Wie Sie im obigen Beispiel sehen können, wird dfder reservierte Speicherplatz in der Anzahl "Verfügbar" nicht angezeigt, selbst wenn Sie als Root angemeldet sind . Der reservierte Speicherplatz wird auch nicht in der Anzahl "Verwendet" angezeigt, unabhängig davon, ob Sie als Root oder als weniger privilegierter Benutzer angemeldet sind. Dies kann manchmal zu Verwirrung führen, wenn ein Dateisystem nahezu voll ist, wenn Sie diese beiden Fakten nicht erwarten.

Beachten Sie auch, dass es tune2fstrotz seines Namens sowohl für ext3- und ext4-Dateisysteme als auch für ext2-Dateisysteme relevant ist.

David Spillett
quelle
Danke für die Antwort. Nein, es geht nicht um reservierte Blöcke. Frage aktualisiert.
Ineu
0

Über den Unterschied zwischen Dateisystemen, verschiedene Dateisysteme organisieren Blöcke unterschiedlich und benötigen mehr oder weniger Daten, um Blöcke zu identifizieren und zu verfolgen. Die Blockgröße macht auch einen Unterschied, da Sie mehr oder weniger Blöcke für denselben Speicherplatz haben und mehr oder weniger "verlorenen" Speicherplatz haben. Außerdem gruppieren Dateisysteme Blöcke, um das Fragmentieren von Dateien zu vermeiden, und jeder Blockcluster hat eine Kennung von einer bestimmten Größe, sodass mehr oder weniger Blockcluster unterschiedlichen physischen Speicherplatz auf der Festplatte verwenden. Der Unterschied besteht also darin, wie das Dateisystem den physischen Raum organisiert.

Hier ist eine Beschreibung für ext2 und Sie können wahrscheinlich etwas Ähnliches für reiserfs finden, aber ich habe es nie benutzt, also habe ich keine.

Laurent
quelle
2
Reiserfs und btrfs sind insofern ungewöhnlich, als fast alle Buchhaltungsinformationen dynamisch zugeordnet werden. Beim Einrichten des Dateisystems werden nur die Superblock-Kopien und Bitmaps für freien Speicherplatz zugewiesen. Dies bedeutet natürlich, dass der tatsächlich für Daten verfügbare Speicherplatz für diese Dateisysteme weniger deterministisch ist.
Omnifarious
@Omnifarious +1 - Wenn ich also reiserfs und btrfs gut verstehe, ist der gemeldete verfügbare Speicherplatz am Anfang größer, wird aber sowohl mit Daten als auch mit Buchhaltungsinformationen anstelle von nur Daten verwendet, oder?
Laurent
@ laurent-rpnet - Ja, das ist richtig. Im Fall von btrfs ist es noch interessanter. btrfs kann RAID auf der Basis einzelner Dateien implementieren, sodass die Meldung des verfügbaren freien Speicherplatzes noch schwieriger zu bestimmen ist, da nicht einfach davon ausgegangen werden kann, dass pro für Daten verwendetem Block eine bestimmte Menge zusätzlichen Speicherplatzes verwendet wird. Darüber hinaus sind sehr kostengünstige COW-basierte Kopien möglich, sodass beim Schreiben eines Blocks in der Mitte einer vorhandenen Datei möglicherweise Speicherplatz zugewiesen wird.
Omnifarious
Und was ist mit XFS, JFS und VFAT? Es ist kaum zu glauben, dass so primitive fs wie FAT32 dynamischer sind als ext4.
Ineu
In FAT32 sind auch Blöcke für die Organisation reserviert. Was bedeutet Dynamik hier? Bei dynamischer Zuweisung verfügt FAT32 über keine dynamische Zuordnung wie ext und zeigt auch nicht alle für Daten verfügbaren Blöcke auf der Festplatte an. Es hat auch einige Einschränkungen ext4 Dateisystem hat nicht wie kein Berechtigungssystem, während ext4 POSIX-Berechtigungen und ACLs hat und die maximale Dateigröße 4 GB bei FAT32 und 2 TB bei ext3 beträgt (nicht sicher über ext4, sollte aber mindestens gleich sein).
Laurent