Manche Wartungsarbeiten lassen sich nur dann vornehmen, wenn keine Produktiv-Software mehr läuft. Doch Admins können Prozesse nicht nach Gutdünken beenden, sonst droht Datenverlust; zeitaufwendige Berechnungen müssten von vorne beginnen. Abhilfe schafft auf Linux-Systemen das kleine Werkzeug Checkpoint/Restore In Userspace, kurz CRIU genannt.
CRIU friert den aktuellen Zustand eines Prozesses ein und sichert ihn auf der Festplatte. Später lässt sich der Prozess wieder zum Leben erwecken und arbeitet dann an der Stelle weiter, an der CRIU ihn eingefroren hat. Bei virtuellen Maschinen heißt dieses Konzept Snapshots.
Das Konservieren hilft nicht nur bei Wartungsarbeiten. Angehaltene Prozesse lassen sich auch auf andere Rechner verschieben und laufen dort weiter. Diese Live-Migration hilft beispielsweise beim Loadbalancing: Dreht ein Rechner gerade Däumchen, transferiert man einen Prozess per Skript dorthin. Des Weiteren lassen sich verdächtig agierende Prozesse einfrieren und auf einem anderen System in Ruhe analysieren. Bindet man CRIU in die Startskripte des Systems ein, sichert es Prozesse beim Herunterfahren automatisch und bringt sie beim nächsten Systemstart zurück in den Speicher. Auf diese Weise stellt man nicht nur den Zustand vor dem Ausschalten wieder her, sondern verkürzt auch den Boot-Vorgang.
Die erste CRIU-Version erschien vor nicht einmal zwei Jahren. Von der aktuellen Version 1.1 lag bei Redaktionsschluss nur der erste Release Candidate vor; bei Erscheinen dieses ADMIN-Magazins sollte CRIU 1.1 jedoch zur Verfügung stehen. Dennoch basieren die folgenden Ausführungen auf dem Release Candidate. Ältere Versionen sammelt das Release-Archiv unter [2].
CRIU arbeitet zwar vollständig im Userspace, stellt aber mehrere Anforderungen ans laufende System. Zunächst funktioniert das Programm nur auf Systemen mit ARM- oder x86_64-Architektur, in letztem Fall muss auch ein 64-Bit-Linux laufen. Des Weiteren verlangt CRIU einen Linux-Kernel ab Version 3.11. Aktuelle Desktop-Distributionen erfüllen diese Bedingung, die auf Servern beliebten Linux-Varianten Debian 7 und CentOS 6.5 jedoch nicht. Der Einsatz von CRIU auf diesen Systemen setzt deshalb ein Kernel-Upgrade voraus.
Der laufende Kernel muss außerdem die von CRIU verlangten Funktionen bereitstellen. Tabelle 1 führt die beim Kernel-Kompilieren zu aktivierenden Einstellungen auf. Liegt ein fertiger Kernel vor, prüft CRIU dessen Kompatibilität mit »criu check
«
.
Tabelle 1
Notwendige Kernel-Funktionen
Variable | Im Konfigurationsmenü zu aktivieren unter |
---|---|
CONFIG_EMBEDDED |
General setup | Embedded system |
CONFIG_EXPERT |
General setup | Configure standard kernel features (expert users) |
CONFIG_EVENTFD |
General setup | Configure standard kernel features (expert users) | Enable eventfd() system call |
CONFIG_EPOLL |
General setup | Configure standard kernel features (expert users) | Enable eventpoll support |
CONFIG_CHECKPOINT_RESTORE |
General setup | Checkpoint/restore support |
CONFIG_NAMESPACES |
General setup | Namespaces support |
CONFIG_PID_NS |
General setup | Namespaces support | PID Namespaces |
CONFIG_FHANDLE |
General setup | open by fhandle syscalls |
CONFIG_INOTIFY_USER |
File systems | Inotify support for userspace |
CONFIG_IA32_EMULATION |
Executable file formats | Emulations | IA32 Emulation |
CONFIG_UNIX_DIAG |
Networking support | Networking options | Unix domain sockets | UNIX: socket monitoring interface |
CONFIG_INET_DIAG |
Networking support | Networking options | TCP/IP networking | INET: socket monitoring interface |
CONFIG_INET_UDP_DIAG |
Networking support | Networking options | TCP/IP networking | INET: socket monitoring interface | UDP: socket monitoring interface |
CONFIG_PACKET_DIAG |
Networking support | Networking options | Packet socket | Packet: sockets monitoring interface |
CONFIG_NETLINK_DIAG |
Networking support | Networking options | NETLINK: socket monitoring interface |
CONFIG_MEM_SOFT_DIRTY |
Processor type and features | Track memory changes |
Aufgrund der detaillierten Ansprüche an den Betriebssystemkern stellten die CRIU-Entwickler in der Vergangenheit eigens einen passenden Kernel bereit. Da Linux in Version 3.11 jedoch alle notwendigen Funktionen mitbringt, fällt diese Notwendigkeit weg und der Einsatz alter CRIU-Kernel empfiehlt sich nicht mehr.
Erfüllt der Kernel alle Voraussetzungen, muss zudem Googles Protocol-Buffers-Bibliothek her [3, 4], die in den Repositories der meisten Distributionen bereitsteht. Neben der Bibliothek selbst benötigt man die zugehörigen Entwicklungspakete, die C-Bindings und den Protobuf-C-Compiler. Unter Ubuntu und Debian heißen die entsprechenden Pakete »libprotobuf-c0-dev
«
und »protobuf-c-compiler
«
, auf anderen Distributionen ähnlich.
CRIU greift außerdem auf Iproute2 zurück, das mindestens in Version 3.5.0 von August 2012 vorliegen muss. Auch dieses Werkzeug haben die meisten aktuellen Distributionen an Bord. Falls nicht, wie im Fall von Debian 7, gibt es den Quellcode unter [5].
Um CRIU zu übersetzen, benötigt man nach dem Download der Quellen [1] nur noch das Make-Werkzeug und einen C-Compiler. Nach dem Entpacken des Archivs und dem Kompilieren mit »make
«
ist eine systemweite Installation des Werkzeugs weder vorgesehen noch notwendig.
Bevor man die ersten Prozesse schockfrostet, empfiehlt sich ein CRIU-Test. Dazu initiiert man als Benutzer Root auf der Kommandozeile diesen Befehl:
criu check --ms
Am Ende sollte CRIU die Meldung »Looks good
«
auswerfen (siehe Abbildung 1). Andernfalls verrät das Werkzeug, welche Funktion fehlt. Ältere Versionen des Tools hießen übrigens noch »crtools
«
, deshalb beziehen sich manche im Internet kursierende Anleitungen noch auf diesen Befehlsnamen.
Der nächste Testschritt folgt im CRIU-Unterverzeichnis »test
«
. Dort ruft man als Root das Skript »zdtm.sh
«
auf. Diese Test-Suite startet mehrere Prozesse und friert sie probeweise ein. Ein kompletter Durchlauf benötigt einige Minuten, während derer das System immer wieder einfrieren kann. Bei einem Problem bricht die Test-Suite ab und nennt die Quelle. Nach erfolgreichem Durchlauf erscheint nur das Resultat des letzten Tests (Abbildung 2).