Debian GNU/kFreeBSD (//**k**ernel of FreeBSD//) stellt ein Debian-Derivat mit FreeBSD-Kernel dar. Das erste Release erschien vor kurzem mit Debian Squeeze, verfügt über den Kernel von FreeBSD 8.1 und unterstützt daher ZFS in der Pool-Version v14. ======Kurzübersicht über ZFS====== Gegenüber bestehenden Software-RAID- und LVM-Systemen stellt ZFS einen sehr interessanten und professionellen Lösungsansatz dar. ZFS ist ein 128-bit Dateisystem, kann theoretisch bis zu 16 Exabyte adressieren und vereint im Wesentlichen logische Partitions- und Volumenverwaltung sowie ein RAID-Subsystem. Zur Auswahl stehen: * RAID 0 - Striping * RAID 1 - Mirroring * RAID Z-1 - 1x Parität (//RAID-5//) * RAID Z-2 - 2x Parität (//RAID-6//) * RAID Z-3 - 3x Parität ZFS ist sehr leicht zu administrieren und somit ideal für sämtliche Einsatzgebiete. Nicht nur im Rechenzentrum erfreut sich ZFS großer Beliebtheit - auch im Heimbereich (//Eigenbau-NAS//) ist es einsetzbar. Interessant sind auch professionelle Funktionen, wie beispielsweise Deduplizierung, die dafür sorgt, dass mehrfach abgelegte Dateien nur einmal Platz in Anspruch nehmen. Differenzen zwischen den "nach Außen hin" gesicherten Dateien werden in Form von inkrementellen Snapshots gesichert. ======Idee====== Als plausibles Beispiel dient hier ein Eigenbau-NAS. Es soll Nutzdaten in einem RAID-5 Verbund sichern und mittels Samba dem Heimnetzwerk zur Verfügung stellen. ======Konfiguration====== Die Installation von Debian GNU/kFreeBSD ist relativ simple, wie vorherige Debian-Installationen. Dieser Vorgang ist nicht Bestandteil dieses Artikels. Nach der Installation und dem daraus resultierenden Reboot befindet man sich auf der ersten Konsole des brandneuen Debian-Systems mit FreeBSD-Unterbau. Zuerst ist wichtig, dass alle Festplatten erkannt wurden (//hier 6 virtuelle Festplatten//) # dmesg ... da0 at mpt0 bus 0 scbus0 target 0 lun 0 da0: Fixed Direct Access SCSI-2 device da0: 320.000MB/s transfers (160.000MHz DT, offset 127, 16bit) da0: Command Queueing enabled da0: 1048576MB (2147483648 512 byte sectors: 255H 63S/T 133674C) da1 at mpt0 bus 0 scbus0 target 1 lun 0 da1: Fixed Direct Access SCSI-2 device da1: 320.000MB/s transfers (160.000MHz DT, offset 127, 16bit) da1: Command Queueing enabled da1: 1048576MB (2147483648 512 byte sectors: 255H 63S/T 133674C) da2 at mpt0 bus 0 scbus0 target 2 lun 0 da2: Fixed Direct Access SCSI-2 device da2: 320.000MB/s transfers (160.000MHz DT, offset 127, 16bit) da2: Command Queueing enabled da2: 1048576MB (2147483648 512 byte sectors: 255H 63S/T 133674C) da3 at mpt0 bus 0 scbus0 target 3 lun 0 da3: Fixed Direct Access SCSI-2 device da3: 320.000MB/s transfers (160.000MHz DT, offset 127, 16bit) da3: Command Queueing enabled da3: 1048576MB (2147483648 512 byte sectors: 255H 63S/T 133674C) da4 at mpt0 bus 0 scbus0 target 4 lun 0 da4: Fixed Direct Access SCSI-2 device da4: 320.000MB/s transfers (160.000MHz DT, offset 127, 16bit) da4: Command Queueing enabled da4: 1048576MB (2147483648 512 byte sectors: 255H 63S/T 133674C) da5 at mpt0 bus 0 scbus0 target 5 lun 0 da5: Fixed Direct Access SCSI-2 device da5: 320.000MB/s transfers (160.000MHz DT, offset 127, 16bit) da5: Command Queueing enabled da5: 1048576MB (2147483648 512 byte sectors: 255H 63S/T 133674C) Die Erstellung des Pools ist kinderleicht! Mit einem Befehl werden alle Festplatten zu neuen Pool namens "//pool0//" hinzugefügt: # zpool create pool0 raidz /dev/da{0,1,2,3,4,5} Ein kleiner Blick in den Pool mit **zpool** zeigt, dass alle Festplatten eingebunden wurden: # zpool status pool0 pool: pool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM pool0 ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 da3 ONLINE 0 0 0 da4 ONLINE 0 0 0 da5 ONLINE 0 0 0 errors: No known data errors Ein weiterer Blick auf die Pools mithilfe **zpool** zeigt den verfügbaren Speicherplatz: # zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT pool0 6,00T 146K 6,00T 0% ONLINE - Der Mountpoint des Pools wird der Übersicht halber nun noch geändert, aktuell befindet er sich direkt auf Root-Ebene: # zfs get mountpoint pool0 NAME PROPERTY VALUE SOURCE pool0 mountpoint /pool0 default root@vm-debsqueeze:~# mkdir /mnt/storage root@vm-debsqueeze:~# zfs set mountpoint=/mnt/storage pool0 root@vm-debsqueeze:~# zfs get mountpoint pool0 NAME PROPERTY VALUE SOURCE pool0 mountpoint /mnt/storage local =====Samba-Freigabe===== Paketlisten werden gelesen... Fertig Abhängigkeitsbaum wird aufgebaut Statusinformationen werden eingelesen... Fertig Die folgenden zusätzlichen Pakete werden installiert: ... Möchten Sie fortfahren [J/n]? j ... # mv /etc/samba/smb.conf /etc/samba/smb.conf.old # nano /etc/samba/smb.conf [global] workgroup = TEST server string = Test-NAS obey pam restrictions = Yes passdb backend = tdbsam pam password change = Yes passwd program = /usr/bin/passwd %u passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* . unix password sync = Yes syslog = 0 log file = /var/log/samba/log.%m max log size = 1000 dns proxy = No panic action = /usr/share/samba/panic-action %d [homes] comment = Home Directories valid users = %S create mask = 0700 directory mask = 0700 browseable = No [storage] comment = Storage path = /mnt/storage read only = No locking = No **Testparm** verrät jetzt noch, ob der Syntax der Datei korrekt ist: # testparm Load smb config files from /etc/samba/smb.conf Processing section "[homes]" Processing section "[storage]" Loaded services file OK. Server role: ROLE_STANDALONE Press enter to see a dump of your service definitions ... Der Übersichtlichkeit halber werden die Dateirechte für einen Benutzer gesetzt - er erhält auch ein Samba-Passwort, um auf die Netzwerkfreigabe zugreifen zu können. Anschließend wird der Samba-Daemon neugestartet, um die Änderungen zu übernehmen: # smbpasswd -a christian New SMB password: Retype new SMB password: # chown christian /mnt/storage # chgrp christian /mnt/storage # chown christian /mnt/storage/* -Rf # chgrp christian /mnt/storage/* -Rf # chmod 775 /mnt/storage/* -Rf # /etc/init.d/samba restart Stopping Samba daemons: nmbd smbd. Starting Samba daemons: nmbd smbd. ======Rudimentäre Administration====== =====Pool löschen====== # zpool destroy pool0 # zpool list no pools available =====Pool erstellen===== # zpool destroy pool0 # zpool list no pools available =====Pool erstellen===== ====Striping (RAID-0)==== # zpool create pool0 /dev/da{0,1,2,3,4,5} # zpool status pool0 pool: pool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM pool0 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 da3 ONLINE 0 0 0 da4 ONLINE 0 0 0 da5 ONLINE 0 0 0 errors: No known data errors ====Mirroring (RAID-1)==== # zpool create pool0 mirror /dev/da0 /dev/da1 # zpool status pool0 pool: pool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM pool0 ONLINE 0 0 0 mirror ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 errors: No known data errors # zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT pool0 1022G 79,5K 1022G 0% ONLINE - ====RAID-Z1 (~RAID-5)==== # zpool create pool0 raidz /dev/da{0,1,2,3,4,5} # zpool status pool0 pool: pool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM pool0 ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 da3 ONLINE 0 0 0 da4 ONLINE 0 0 0 da5 ONLINE 0 0 0 errors: No known data errors # zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT pool0 6,00T 141K 6,00T 0% ONLINE - ====RAID-Z2 (~RAID-6)==== # zpool create pool0 raidz2 /dev/da{0,1,2,3,4,5} # zpool status pool0 pool: pool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM pool0 ONLINE 0 0 0 raidz2 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 da3 ONLINE 0 0 0 da4 ONLINE 0 0 0 da5 ONLINE 0 0 0 errors: No known data errors # zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT pool0 6,00T 207K 6,00T 0% ONLINE - =====Spare hinzufügen====== Spares sind Festplatten, die dann verwendet werden, wenn eine der Festplatten aus dem Verbund ausfallen. Ein plausibles Beispiel wäre ein RAID-5-Verbund, bestehend aus 5 Festplatten, mit einer Festplatte als Spare, die im Fehlerfall einspringt. # zpool create pool0 raidz /dev/da{0,1,2,3,4} # zpool add pool0 spare /dev/da5 # zpool status pool0 pool: pool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM pool0 ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 da3 ONLINE 0 0 0 da4 ONLINE 0 0 0 spares da5 AVAIL errors: No known data errors # zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT pool0 5,00T 150K 5,00T 0% ONLINE - ======Internet-Verweise====== * Projektseite von Debian GNU/kFreeBSD: http://wiki.debian.org/Debian_GNU/kFreeBSD * Wikipedia-Artikel über ZFS: http://de.wikipedia.org/wiki/ZFS_%28Dateisystem%29 * OpenSolaris-Artikel über ZFS: http://hub.opensolaris.org/bin/view/Community+Group+zfs/WebHome