FS: Ext4

Ext4 wurde 2006 vorgestellt und ist seit der Version 2.6.19 fester Bestandteil des Linux-Kernels (in RHEL 5.3 war es noch als „Technology Preview“ enthalten). Dateien können hier so gross wie das Dateisystem werden, welches theoretisch selbst bis zu 1024 Petabyte (rund 1 Mio Terabyte) gross sein darf. Dateinamen sind max. 255 Zeichen lang. Pro Verzeichnis sind 65’000 Unterverzeichnisse erlaubt.

Achtung

Wichtig für die Praxis: der Code, um ein Ext4-Dateisystem grösser als 16 TB zu erzeugen, ist Stand 2017-03 nicht stabil - hier sollte man XFS verwenden.

Erfinder der Ext-Dateisystemfamilie und Leiter der Ext4-Entwicklung ist Stand 2017-03 Theodore „Ted“ Ts’o, einer der prominentesten Linux-Kernel-Entwickler. Details zu Ext4 finden sich hier.

Ext4 beginnt mit einem Superblock, in dem sich unter anderem

  • die Blockgrösse

  • Anzahl der Blöcke und Inodes

  • Anzahl der freien Blöcke und Inodes

  • Mount-Informationen

befinden. Der Rest der Platte wird in Blockgruppen verwaltet. Jede Blockgruppe enthält zu Beginn eine Kopie des Superblocks.

Grössen (Standard):

  • Block: 4 KB

  • Blockgruppe: 128 MB

  • Inode: 256 Bytes

Dateisystem prüfen und reparieren

Ext4-Dateisysteme müssen IMMER im ausgehängten Zustand geprüft werden, demnach also am besten vor dem Neustart. „FSCK“ bedeutet „FileSystem ChecK“. Bis RHEL 6:

touch /forcefsck
reboot

Ab RHEL 7 geht das direkt, inkl. Fortschrittsbalken:

fsck.ext4 -cfty -C 0 /dev/sdxx

Wann sind die letzten Filesystem-Checks gelaufen?

tune2fs -l /dev/sda1 | grep -Ei "mount count|Check interval|Last|Next"

Quota

Für eine neue Disk:

apt install quota
mkfs.ext4 -O quota -E quotatype=usrquota:grpquota:prjquota /dev/vdb

echo '/dev/vdb /data ext4 defaults,usrquota,grpquota,prjquota 0 0' >> /etc/fstab
mkdir -p /data
mount --verbose /dev/vdb

quotacheck --user --group --no-remount /data
quotaon /data

# User-Quota setzen (verwendet $EDITOR)
edquota --user user1
# Spalten:
# 1. blocks: momentane Nutzung
# 2. soft: Soft-Limit für die Blocks
# 3. hard: Soft-Limit für die Blocks
# 4. inodes: momentane Nutzung
# 5. soft: Soft-Limit für die Inodes
# 6. hard: Soft-Limit für die Inodes

# Unlike the hard limit, the soft limit can be exceeded for a certain amount of time. That time is known as the grace period. The grace period can be expressed in seconds, minutes, hours, days, weeks, or months.
# When grace time is over, user is not able to allocate more space/inodes until they free enough of them to get below softlimit.

# Wert 0 = kein Limit
# Wert in kibibytes, K, M, G, T appended


# Gruppen-Quota setzen
edquota --group myusergroup


# Projekt-Quota setzen.
# der eindeutige Projekt-ID einen Namen zuweisen
echo 'test_project1:7' >> /etc/projid
mkdir /data/project1
chattr +P -p 7 /data/project1
edquota --project test_project1


# Grace Period anpassen. Die Grace Period gilt für alle Dateisysteme mit aktivierter Quota
edquota --edit-period --user
edquota --edit-period --group
edquota --edit-period --project

# aktuelle Quota anzeigen lassen
quota --verbose --user user1
quota --verbose --group myusergroup
quota --verbose --project myproject

# Report / Übersicht anzeigen lassen
repquota --human-readable --user /data
repquota --human-readable --group /data
repquota --human-readable --project /data

Die verschiedenen Quotas (User, Gruppen, Projekt) sind komplett voneinander getrennt:

  • Die User-Quota zählt alle Files, die dem User gehören (anhand von den File Permissions).

  • Die Gruppen-Quota zählt alle Files, die der Gruppe gehören (anhand von den File Permissions).

  • Die Projekt-Quota zählt alle Files, die in den Projekt-Ordnern sind (anhand von den File Attributes).

Was passiert, wenn die User-Quota (1G soft, 1.5G hard) aufgebraucht ist, aber die Gruppen-Quota (2G soft, 2.5G hard) noch nicht?
fallocate -l 1200M test_file1
# vdb: warning, user block quota exceeded.

fallocate -l 1200M test_file2
# vdb: write failed, user block limit reached.
# fallocate: fallocate failed: Disk quota exceeded
# only wrote 300M, filling up the hard limit of 1500M

Das heisst, die niedrigere der beiden Quotas gilt.

Was passiert, wenn die Gruppen-Quota (1G soft, 1.5G hard) aufgebraucht ist, aber die User-Quota (2G soft, 2.5G hard) noch nicht?

Genau das gleiche Verhalten wie beim umgekehrten Szenario. Allerdings kann die Nutzung der Gruppen-Quota reduziert werden, indem das Ownership der Datei geändert wird:

chgrp myusergroup test_file1
fallocate -l 1200M test_file2

Somit kann auch die 2te 1.2G Datei angelegt werden, da test_file1 jetzt nicht mehr zu der user1 Gruppen-Quota zählt.

Was passiert, wenn für user1 und user2 User-Quotas gesetzt sind und via ACL beide Benutzer Zugriff auf der Datei haben?

Die Datei zählt nur zu der Quota des Besitzers. Gruppen-ACls verhalten sich gleich. ACLs haben also keinen Einfluss auf die Quota.

Zu welchen Quotas zählen Dateien in Projekt-Ordnern?

Zu allen zutreffenden Quotas, also zur User-, Gruppen- sowie Projekt-Quota. Wie immer, gilt die niedrigere Quota.

Gelten gesetzte Quotas für alle Mountpoints / Filesysteme?

Nein. edquota erlaubt es, pro Filesystem eine Quota zu vergeben.

Was ist die beste Vorgehensweise beim Setzen von Quotas für die Home-Verzeichnisse?

Für die Anwendung ist es am sinnvollsten, eine User-Quota pro Benutzer für das / oder /home Filesystem zu setzen.

Was ist die beste Vorgehensweise beim Setzen von Quotas für die eine shared Daten-Partitionen?

Hier empfiehlt es sich, nur Projekt-Quotas zu verwenden und den Zugriff über File Permissions zu regeln. Das Konzept ist einfach und für Endnutzer verständlich. Zum Beispiel:

# only root is allowed to create new project folders
chmod 0755 /data

# first project: only user1 is allowed
mkdir /data/project1
chown -R user1:user1 /data/project1
echo 'project1:1' >> /etc/projid
chattr +P -p 1 /data/project1
edquota --project project1

# second project: myusergroup is allowed
mkdir /data/project2
chown -R user1:myusergroup /data/project2
# make sure that new files always belong to the myusergroup
chmod -R g+rwxs /data/project2
# make sure that the group always has rwx permissions
setfacl --recursive --default --modify group:myusergroup:rx /data/project2
# make sure the project-id is unique
# human-readable-name:project-id
echo 'project2:2' >> /etc/projid
# add folder to project with ID 2
chattr +P -p 2 /data/project2
# double check the project ID
lsattr -p /data
# set the quota for the project
edquota --project project2

repquota --human-readable --project /data

Built on 2024-04-18