FreeBSD bietet dem Systemadministrator mehrere Möglichkeiten die System-Ressourcen, die ein einzelner Benutzer verwenden kann, einzuschränken. Festplatten-Kontingente schränken den Plattenplatz, der einem Benutzer zur Verfügung steht, ein. Kontingente werden im Abschnitt 18.11, „Disk Quotas“ diskutiert.
Einschränkungen auf andere Ressourcen, wie
CPU und Speicher, können über eine
Konfigurationsdatei oder über die Kommandozeile konfiguriert
werden. Traditionell werden Login-Klassen in
/etc/login.conf
definiert. Obwohl diese
Methode immer noch untersützt wird, muss nach jeder Änderung
an dieser Datei die Ressourcen-Datenbank neu gebaut werden.
Zudem müssen Sie die notwendigen Änderungen in
/etc/master.passwd
vornehmen und die
Passwort-Datenbnak neu bauen. Dieser Prozess kann, abhängig
davon, wie viele Benutzer bearbeitet werden müssen, sehr
zeitaufwändig sein.
Beginnend mit FreeBSD 9.0-RELEASE können mit
rctl
Ressourcen für Benutzer sehr
detailliert gesteuert werden. Dieser Befehl unterstützt nicht
nur die Kontrolle der Ressourcen für Benutzer, sondern auch die
Beschränkung auf Prozesse und Jails.
In diesem Abschnitt werden beide Methoden vorgestellt. Angefangen wird mit der traditionellen Methode.
Bei der traditionellen Methode werden Login-Klassen und
Ressourcenbeschränkungen in
/etc/login.conf
definiert. Jeder
Benutzer kann einer Login-Klasse zugewiesen werden
(standardmäßig default
) und jede
Login-Klasse ist mit einem Satz von Login-Fähigkeiten
verbunden. Eine Login-Fähigkeit ist ein
Paar, in dem Name
=Wert
Name
die Fähigkeit
bezeichnet und Wert
ein beliebiger
Text ist, der in Abhänigkeit von
Name
entsprechend verarbeitet
wird.
Immer wenn /etc/login.conf
verändert wurde, muss die
/etc/login.conf.db
mit dem folgenden
Kommando aktualisiert werden:
#
cap_mkdb /etc/login.conf
Ressourcenbeschränkungen unterscheiden sich von normalen Login-Fähigkeiten zweifach. Erstens gibt es für jede Beschränkung ein aktuelles und ein maximales Limit. Das aktuelle Limit kann vom Benutzer oder einer Anwendung beliebig bis zum maximalen Limit verändert werden. Letzteres kann der Benutzer nur heruntersetzen. Zweitens gelten die meisten Ressourcenbeschränkungen für jeden vom Benutzer gestarteten Prozess.
Tabelle 14.1, „Ressourcenbeschränkungen für Login-Klassen“ listet die gebräuchlichen Ressourcenbeschränkungen auf. Alle verfügbaren Ressourcenbeschränkungen und Fähigkeiten sind im Detail in login.conf(5) beschrieben.
Ressourcenbeschränkung | Beschreibung |
---|---|
coredumpsize | Das Limit der Größe einer core-Datei, die von
einem Programm generiert wird, unterliegt aus
offensichtlichen Gründen anderen Limits der
Festplattenbenutzung, zum Beispiel
filesize oder
Festplattenkontingenten. Es wird oft als weniger
harte Methode zur Kontrolle des
Festplattenplatz-Verbrauchs verwendet. Da Benutzer
die core-Dateien selbst nicht erstellen und sie oft
nicht löschen, kann diese Option davor schützen, dass
kein Festplattenspeicher mehr zur Verfügung steht,
sollte ein großes Programm abstürzen. |
cputime | Die maximale Rechenzeit, die ein Prozess eines
Benutzers verbrauchen darf. Überschreitet ein Prozess
diesen Wert, wird er vom Kernel beendet. Beachten
Sie, dass die Rechenzeit
limitiert wird, nicht die prozentuale
Prozessorenbenutzung, wie es in einigen Feldern von
top und ps
dargestellt wird. |
filesize | Hiermit lässt sich die maximale Größe einer Datei bestimmen, die der Benutzer besitzen darf. Im Gegensatz zu Festplattenkontingenten ist diese Beschränkung nur für jede einzelne Datei gültig und nicht für den Platz, den alle Dateien eines Benutzers verwenden. |
maxproc | Das ist die maximale Anzahl von Prozessen, die
ein Benutzer starten darf, und beinhaltet sowohl
Vordergrund- als auch Hintergrundprozesse. Dieser
Wert nicht höher sein als das System-Limit, das in
kern.maxproc angegeben ist.
Vergessen Sie nicht, dass ein zu kleiner Wert den
Benutzer in seiner Produktivität einschränken könnte,
wenn beispielsweise ein großes Programm übersetzt wird
oder viele Prozesse gestartet sind. |
memorylocked | Dieses Limit gibt an, wie viel virtueller Speicher von einem Prozess maximal im Arbeitsspeicher festgesetzt werden kann (siehe auch mlock(2)). Ein paar systemkritische Programme, wie amd(8), verhindern damit einen Systemzusammenbruch, der auftreten könnte, wenn sie aus dem Speicher genommen werden. |
memoryuse | Bezeichnet den maximalen Speicher, den ein Prozess benutzen darf und beinhaltet sowohl Arbeitsspeicher-, als auch Swap-Benutzung. Es ist kein allübergreifendes Limit für den Speicherverbrauch, aber ein guter Anfang. |
openfiles | Mit diesem Limit lässt sich die maximale Anzahl
der von einem Prozess des Benutzers geöffneten Dateien
festlegen. In FreeBSD werden Dateien auch verwendet, um
Sockets und >IPC>-Kanäle
darzustellen. Setzen Sie es deshalb nicht zu niedrig.
Das System-Limit ist in
kern.maxfiles definiert. |
sbsize | Dieses Limit beschränkt den Netzwerk-Speicher, den ein Benutzer verbrauchen darf. Es kann generell dazu benutzt werden Netzwerk-Verbindungen zu beschränken. |
stacksize | Das ist die maximale Größe, auf die der Stack eines Prozesses heranwachsen darf. Das allein ist natürlich nicht genug, um den Speicher zu beschränken, den ein Programm verwenden darf. Es sollte deshalb in Verbindung mit anderen Limits verwendet werden. |
Beim Setzen von Ressourcenbeschränkungen sind noch andere Dinge zu beachten:
Von /etc/rc
beim Hochfahren des
Systems gestartete Prozesse werden der
daemon
Login-Klasse zugewiesen.
Obwohl die voreingestellte
/etc/login.conf
sinnvolle Limits
enthält, sind sie evtl. nicht für jedes System geeignet.
Ein zu hohes Limit kann das System für Missbrauch anfällig
machen, und ein zu niedriges Limit kann der Produktivität
schaden.
Xorg beansprucht selbst eine Menge Ressourcen und verleitet die Benutzer dazu, mehrere Programme gleichzeitig laufen zu lassen.
Bedenken Sie, dass viele Limits für einzelne Prozesse
gelten und nicht für den Benutzer selbst. Setzt man zum
Beispiel openfiles
auf
50
, kann jeder Prozess des Benutzers
bis zu 50
Dateien öffnen. Dadurch
ist die maximale Anzahl von Dateien, die von einem
Benutzer geöffnet werden können,
openfiles
mal
maxproc
. Das gilt auch für den
Speicherverbrauch.
Weitere Informationen über Ressourcenbeschränkungen, Login-Klassen und -Fähigkeiten finden Sie in cap_mkdb(1), getrlimit(2) und login.conf(5).
In der Voreinstellung wird rctl
nicht
vom Kernel unterstützt. Sie müssen also zunächst nach den
Anweisungen in Kapitel 9, Konfiguration des FreeBSD-Kernels einen neuen
Kernel erzeugen. Fügen Sie folgende Zeilen in die
Kernelkonfigurationsdatei ein:
options RACCT options RCTL
Sobald das System mit dem neuen Kernel gestartet wird, kann
rctl
benutzt werden, um die Regeln für das
System festzulegen.
Die Syntax der Regeln wird durch subject, subject-id, resource und action gesteuert, wie in diesem Beispiel zu sehen ist:
user:trhodes:maxproc:deny=10/user
Diese Regel zeigt den grundlegenden Aufbau, hier mit dem
Subjekt user
und der Subjekt-ID
trhodes
. maxproc
definiert die Anzahl der Prozesse. Die „Aktion“
deny
verhindert, dass neue Prozesse erstellt
werden. Im vorherigen Beispiel wurde für den Benutzer
trhodes
eine Beschränkung von
10
Prozessen konfiguriert. Zu den weiteren
Aktionen zählen beispielsweise die Protokollierung auf der
Konsole, Benachrichtigungen an devd(8) oder das Senden
eines SIGTERM
an einen Prozess.
Beim hinzufügen von Regeln müssen einige Dinge beachtet
werden. Das obige Beispiel würde den Benutzer sogar daran
hindern, einfachste Dinge zu tun, nachdem er sich anmeldet und
eine screen
Sitzung gestartet hat. Sobald
die Begrenzung für eine Ressource erreicht ist, wird folgende
Fehlermeldung ausgegeben:
#
man test
/usr/bin/man: Cannot fork: Resource temporarily unavailable eval: Cannot fork: Resource temporarily unavailable
rctl(8) kann auch benutzt werden, um einer Jail eine Speichergrenze zuzuweisen. Eine solche Regel könnte wie folgt festgelegt werden:
#
rctl -a jail:httpd:memoryuse:deny=2G/jail
Damit die Regeln auch nach einem Neustart erhalten bleiben,
müssen sie in /etc/rctl.conf
hinzugefügt
werden. Dazu schreiben Sie einfach die Regel, ohne das
vorhergehende Kommando. Zum Beispiel:
# Block jail from using more than 2G memory: jail:httpd:memoryuse:deny=2G/jail
Mit rctl
können auch Regeln entfernt
werden:
#
rctl -r user:trhodes:maxproc:deny=10/user
rctl(8) zeigt auch eine Möglichkeit, alle Regeln zu entfernen. Falls es erforderlich ist alle Regeln für einen einzelnen Benutzer zu entfernen, kann dieser Befehl verwendet werden:
#
rctl -r user:trhodes
Es gibt noch viele weitere Ressourcen, die verwendet werden
können, um zusätzliche subjects
zu
kontrollieren. Weitere Informationen zu diesem Thema finden Sie
in rctl(8).
Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an
<de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an
<de-bsd-translators@de.FreeBSD.org>.