Debian GNU/kFreeBSD (kernel 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.
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:
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.
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.
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: <VMware, VMware Virtual S 1.0> 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: <VMware, VMware Virtual S 1.0> 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: <VMware, VMware Virtual S 1.0> 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: <VMware, VMware Virtual S 1.0> 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: <VMware, VMware Virtual S 1.0> 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: <VMware, VMware Virtual S 1.0> 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}</code>
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
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.
# zpool destroy pool0 # zpool list no pools available
# zpool destroy pool0 # zpool list no pools available
# 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
# 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  -
# 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 -</code>
# 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  -
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  -