Saturday, November 10. 2007Das Dateisystem alle Dateisysteme zu beenden
Von Chaosradio Express #49 auf ZFS aufmerksam gemacht, habe ich damit mal etwas rumgespielt.
Für Linux gibt es zwar nur eine frühe FUSE-Version, aber die ist schonmal benutzbar, und reicht fürs erste Spiel... ZFS ist ein von Sun entwickeltes Dateisystem, mit eingebautem Volume Manager, Software-RAID in allen Formen, ACLs, Komprimierung, Verschlüsselung (bald) und vielem mehr. Damit entfernt es sich ziemlich von den gewohnten Methodiken zur FS-Verwaltung, aber grade diese engebaute Flexibilität macht es meiner Meinung nach interessant.
Zuerst in OpenSolaris implementiert, fand es inzwischen seinen Weg nach Solaris, FreeBSD, MacOS 10.5 (nur read-only) und eben Linux (nur FUSE). Leider ist die FSF der Meinung Suns OpenSource-Lizenz CDDL ginge nicht mit der GPL zusammen, daher kann ZFS nicht Teil des Linuxkernels werden. Statt ein Add-On-Modul (wie zB die NVidia-Treiber) draus zu machen gibt es nun das FUSE-Modul, um das Dateisystem im Userspace laufen zu lassen. Das hat zwar zweifelsohne Nachteile bei der Performance, bringt aber bei so einer Alpha-Version den Vorteil, dass, sollte ZFS abstürzen, es den Kernel nicht tangiert. Zur Installation (in Debian): Für Debian/testing und unstable reicht es derzeit folgende Zeile in /etc/apt/sources.list einzutragen: deb http://www.fushizen.net/zfs-fuse ./ danach apt-get update; apt-get install zfs-fuse und ZFS sollte laufen. Nun, mir fiel als Einsatzzweck für ZFS als erstes mein Webserver ein, dieser läuft (natürlich) mit Debian/stable, dort musste ich ZFS-Fuse selbst übersetzen: # apt-get install devscripts build-essential zlib1g-dev libfuse-dev scons debhelper fakeroot xsltproc docbook-xsl fuse-utils Nun ist ZFS also installiert, und wir haben erstmal zwei für uns wichtige Tools zur Verfügung: zpool und zfs. Zuerst definieren wir einen sogenannten Pool, in meinem Fall hatte ich noch eine ungenutzte Partition auf der Festplatte. # zpool create tank /dev/hda4 "tank" bezeichnet den Pool, der Name kann beliebig gewählt werden. Auf hda4 sollten natürlich keine Daten sein die noch benötigt werden. :) Hat man nicht gleich eine Platte/Partition über, kann ZFS auch in Dateien arbeiten: # dd if=/dev/zero of=~/zfs0.dd bs=1024k count=1024 Dies erstellt im Homedir von root eine 1GB große Datei "zfs0.dd" und nutzt diese als Pool. Hat man nicht nur eine Partition sondern gleich mehrere (auf verschiedenen Platten) über, so kann ZFS auch etwas für die Datensicherheit tun: # zpool create tank mirror /dev/sda4 /dev/sdb4 legt einen Pool über zwei Partitionen an, die Daten werden auf beide Partitionen gesichert. Man kann auch Konfigurationen ähnlich RAID-5 bauen, oder Platten als Reserve definieren, dazu eventuell später mehr. Nun lassen sich in ZFS Dateisysteme in Dateisystemen anlegen, dies soll uns später die Verwaltung vereinfachen. Gehen wir also von meinem Webserver aus, der verschiedene Webseiten hostet. Dazu erstmal zwei Dateisysteme für die Webinhalte sowie Webserverlogs: # zfs create tank/webdocs Testen will ich das Ganze erstmal mit einer etwas unwichtigeren Webseite, da sowieso keine Inhalte, meine Strukturdomain exosphere.de. Auch dafür wieder eigene Dateisysteme: # zfs create tank/webdocs/exosphere Damit sind die Dateisysteme angelegt, und die Webservergruppe sowie mein User chris dürfen darauf arbeiten. Und nein, ich habe nicht vergessen die frischen Dateisysteme zu mounten oder in /etc/fstab einzutragen. Ersteres macht ZFS automatisch, letzteres ist unnötig. Das ist ganz praktisch, denn ZFS verleitet dazu wirklich viele Dateisysteme anzulegen. So habe ich doch grade für eine einzige Webseite 5 neue Dateisysteme geschaffen: $ mount | grep tank Und jede neue Webseite wird mit weiteren zwei Dateisystemen zuschlagen... Nun schnell in der Webserverconfig DocumentRoot sowie ErrorLog und CustomLog umgestellt, apache2ctl restart, und sieheda, klappt alles. Nun, üblicherweise liegen Webserverlogs in /var/log/, und üblicherweise läuft immer mal wieder logrotate darüber, um alte Logs zu komprimieren. Das ist auch überaus sinnvoll, denn so oft braucht man die Logs nicht, und es lässt sich viel Speicherplatz sparen. Mit ZFS ist das allerdings überflüssig, denn Kompression ist eingebaut: # zfs set compression=gzip tank/weblogs Statt gzip könnten wir lzjb wählen, diese Option komprimiert etwas schlechter, dafür deutlich schneller als gzip. Apropos schnell: ZFS speichert standardmäßig sogenannte Access Times für Dateien, also die Zeit zu der als letztes auf die Datei zugegriffen wurde. Das bedeutet also, immer wenn Datei A gelesen wird, gibt es zusätzlich einen Schreibzugriff auf die Metadaten für Datei A. Bei einem Webserver und Konstrukten wie favicon.ico wird also schnell sehr viel geschrieben, und das auch noch ohne das es mich interessieren würde. Also schalten wir die Access Times kurzerhand ab: # zfs set atime=off tank/webdocs ZFS veerbt die Eigenschaften von Dateisystem auf untergeordnete Dateisysteme. Die oben eingeschaltete Kompression der weblogs wirkt sich also auf alle Dateisysteme in den Weblogs aus. Das sieht man recht schön hier: # zfs get all tank/weblogs/exosphere Mit ZFS lassen sich jetzt noch einige andere Dinge machen, die mir im Webserverkontext als sinnvoll erscheinen, z.B. Quotas und Backups per Snapshot der Dateisysteme. Dazu aber zu einem anderen Zeitpunkt mehr, für eine kleine Testwebseite lohnt das noch nicht... Trackbacks
Trackback specific URI for this entry
No Trackbacks
|
QuicksearchEntry's LinksCategories |
