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