BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

Vorhandene Datei beim Verschieben nicht überschreiben

Verschiebt man auf FreeBSD und OpenBSD eine Datei in ein Verzeichnis, in dem schon eine gleichnamige Datei existiert, so wird diese standardmässig überschrieben:

# mkdir ordner
# echo inhalt1 > ordner/testdatei
# echo inhalt2 > testdatei2
# mv testdatei2 ordner/testdatei
# cat ordner/testdatei
inhalt2

Sollen gleichnamige Dateien beim Verschieben standardmässig nicht überschrieben werden, kann auf FreeBSD die -n Option verwenden:

# echo inhalt1 > ordner/testdatei
# echo inhalt2 > testdatei2
# mv -n testdatei2 ordner/testdatei
# cat ordner/testdatei
inhalt1
# cat testdatei2
inhalt2

Möchte man je nach Fall entscheiden, so kann auf FreeBSD und OpenBSD die -i Option verwendet werden. Wird nun eine gleichnamige Datei erkannt, so fragt mv zuerst nach, ob die Datei überschrieben werden soll.

# echo inhalt1 > ordner/testdatei
# echo inhalt2 > testdatei2
# mv -i testdatei2 ordner/testdatei
overwrite ordner/testdatei? (y/n [n]) n
not overwritten

Mehr Informationen findet man in der Manpage mv(1).

 Permalink

Benutzerkonto temporär deaktivieren

Soll ein Benutzerkonto temporär deaktiviert werden, so kann die Benutzershell in /sbin/nologin geändert werden. Dies kann mit chpass(1) gemacht werden:

# chpass -s /sbin/nologin <Benutzer>

Versucht sich nun ein Benutzer anzumelden, wird ihm mitgeteilt, dass dieses Benutzerkonto deaktiviert ist:

# ssh test@test
This account is currently not available.
Connection to test closed.

Soll das Benutzerkonto wieder aktiviert werden, kann dem Benutzer wieder eine gültige Shell zugewiesen werden:

# chpass -s <Shell> <Benutzer>

Sowohl nologin(8) als auch chpass(1) sind auf FreeBSD und OpenBSD im Basissystem vorhanden.

Comments (1)  Permalink

Ausführbare Binärdatei komprimieren

Will man eine ausführbare Binärdatei komprimieren, weil man auf einem Speichermedium nur beschränkt Platz hat, kann man dies mit gzexe tun. Im folgenden Beispiel befindet sich nslookup, welches 1.1MB gross ist, in einem Verzeichnis:

# ls -l
total 1104
-r-xr-xr-x 1 beat wheel 1100348 7 Jul 12:47 nslookup*
# file nslookup
nslookup: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), stripped

Nun wird die Datei komprimiert:

# gzexe nsloopkup 
nsloopkup: 58.4%
# ls -l
total 1568
-r-xr-xr-x 1 beat wheel 457492 7 Jul 12:40 nslookup*
-r-xr-xr-x 1 beat wheel 1100348 7 Jul 12:40 nslookup~*

Die ursprüngliche Datei hat nun eine Tilde am Ende des Dateinamens. Die komprimierte Datei ist über die Hälfte kleiner als das Original, kann jedoch immer noch ausgeführt werden, allerdings mit einem kleinen Performanceverlust:

# file nslookup
nslookup: Bourne shell script text executable
#./nslookup chruetertee.ch
Server: 192.168.1.1
Address: 192.168.1.1#53

Non-authoritative answer:
Name: chruetertee.ch
Address: 217.150.245.53

Die originale Datei kann nun gelöscht werden.

# rm nslookup~

Möchte man die originale Datei wiederherstellen, verwendet man die -d Option von gzexe:

# gzexe -d nslookup
# ls -l
total 1568
-r-xr-xr-x 1 beat wheel 1100348 7 Jul 12:54 nslookup*
-r-xr-xr-x 1 beat wheel 457492 7 Jul 12:51 nslookup~

Nun wird die komprimierte Datei mit einer Tilde markiert und kann gelöscht werden.

gzexe findet man sowohl auf FreeBSD als auch auf OpenBSD im Basissystem. Mehr Informationen zu gzexe findet man in der Manpage gzexe(1).

 Permalink

SMTP-Tester für die Kommandozeile

Möchte man die Funktionalität eines einfachen SMTP Servers testen, kann man dies mit telnet machen. Sobald man allerdings auch Verschlüsselung und Authentifizierung des Servers testen muss, geht dies mit telnet nicht mehr. In diesem Falle hilft einem swaks weiter.

Auf FreeBSD findet man swaks unter mail/swaks:

# cd /usr/ports/www/swaks && make install clean

Nun kann mit der -s Option angegeben werden, welcher Server getestet werden soll:

# swaks -s mail.chruetertee.ch
To: beat@chreutertee.ch
=== Trying mail.chruetertee.ch:25...
=== Connected to mail.chruetertee.ch.
<- 220 mail.chruetertee.ch ESMTP Sendmail 8.13.6/8.13.6
-> EHLO daedalus.network.local
<- 250-mail.chruetertee.ch
<- 250-8BITMIME
<- 250-PIPELINING
<- 250-HELP
<- 250 SIZE 26214400
-> MAIL FROM:<beat@daedalus.network.local>
<** 553 <beat@daedalus.network.local> unable to verify address
-> QUIT
<- 221 mail16.bluewin.ch QUIT
=== Connection closed with remote host.

Nun sieht man, dass die Absenderadresse nicht aufgelöst werden konnte und deshalb die Mail nicht versandt wurde.

Im folgenden Beispiel wird die Absenderadresse mit der -f Option festgelegt und die Verbindung verschlüsselt via SSMTP versendet. Zudem muss der Benutzer authentifiziert werden:

# swaks -s mail.chruetertee.ch --protocol SSMTP -f null@chreutertee.ch -a
To: beat@chreutertee.ch
Username: beat
Password: **************
=== Trying mail.chruetertee.ch:465...
=== Connected to mail.chruetertee.ch.
=== TLS started w/ cipher DHE-DSS-AES256-SHA
<~ 220 mail.chruetertee.ch ESMTP Sendmail 8.13.6/8.13.6; Sat, 30 Jun 2007 12:47:15 GMT
~> EHLO daedalus.network.local
<~ 250-mail.chruetertee.ch Hello 192.168.1.1 [192.168.1.1], pleased to meet you
<~ 250-ENHANCEDSTATUSCODES
<~ 250-PIPELINING
<~ 250-8BITMIME
<~ 250-SIZE
<~ 250-DSN
<~ 250-ETRN
<~ 250-AUTH PLAIN LOGIN
<~ 250-DELIVERBY
<~ 250 HELP
~> AUTH LOGIN
<~ 334 asdfghjklwert
~> dfghjj==
<~ 334 qwertzuioiuz
~> sdfghjklmnbvcxyre
<~ 235 2.0.0 OK Authenticated
~> MAIL FROM:<null@chreutertee.ch>
<~ 250 2.1.0 <null@chreutertee.ch>... Sender ok
~> RCPT TO:<beat@chreutertee.ch>
<~ 250 2.1.5 <beat@chreutertee.ch>... Recipient ok
~> DATA
<~ 354 Enter mail, end with "." on a line by itself
~> Date: Sat, 30 Jun 2007 14:45:58 +0200
~> To: beat@chreutertee.ch
~> From: null@chreutertee.ch
~> Subject: test Sat, 30 Jun 2007 14:45:58 +0200
~> X-Mailer: swaks v20061116.0 jetmore.org/john/code/#swaks
~>
~> This is a test mailing
~>
~> .
<~ 250 2.0.0 l5UClFLM068527 Message accepted for delivery
~> QUIT
<~ 221 2.0.0 mail.chruetertee.ch closing connection
=== Connection closed with remote host.

swaks gibt immer die vollständige Kommunikation zwischen dem Client und dem Server aus, so können Fehler und Probleme eines SMTP-Servers erkannt werden. swaks bietet eine grosse Anzahl von Optionen, welche alle in der Manpage beschrieben sind, welche man wie folgt aufruft:

# swaks --help
 Permalink

Monitor für den pf Paketfilter

Für den pf Paketfilter gibt es pftop, welches ähnlich wie top(1), regelmässig Informationen zum Netzwerkverkehr durch die pf anzeigt. Es kann der Status, die Verbindungsdauer und Geschwindigkeit, Verbindungen pro pf Regel und vieles mehr angezeigt werden. pftop findet man sowohl auf FreeBSD als auch auf OpenBSD in den Ports unter sysutils/pftop:

# cd /usr/ports/sysutils/pftop && make install clean

Danach kann pftop als root gestartet werden:

# pftop

pftop besteht aus verschiedenen Ansichten. Nachdem pftop gestartet wurde, kann mit v in die nächste Ansicht gewechselt werden. Mit 0 - 8 kann direkt in eine der neun Ansichten gewechselt werden. pftop kann durch q wieder beendet werden.

Im Batchmode, welchen man durch die -b Option startet, wird die Anzeige einmal auf die Standardausgabe geschrieben und pftop danach beendet. Mit der -v <Ansicht> Option kann festgelegt werden, welche Ansicht angezeigt werden soll. Gültige Argumente für die Ansicht sind: default, label, long, queue, rules, size, speed, state und time.

Mehr Informationen zu pftop findet man in der Manpage pftop(8).

 Permalink

Selbstentpackendes Archiv aus Textdateien erstellen

Besitzt man viele Textdateien, die man verschicken oder übertragen möchte, kann man mit shar(1) ganz einfach ein selbstentpackendes Archiv erstellen. Im folgenden Beispiel werden drei Textdateien erstellt, wovon sich eine in einem Unterordner befindet.

# echo "Erste Datei" > test1
# echo "Zweite Datei" > test2
# mkdir ordner
# echo "Dritte Datei" > ordner/test3

Nun wird mit Hilfe von shar ein Archiv erstellt.

# shar `find . -print` > /tmp/archiv

Dieses Archiv kann nun als Mail verschickt oder auf einen anderen Rechner übertragen werden. Zum Entpacken kann das Archiv einfach als Shell-Skript ausgeführt werden, danach werden die Dateien entpackt:

# sh archiv 
c - .
x - ./test1
x - ./test2
c - ./ordner
x - ./ordner/test3
# ls -l
total 8
-rw-r--r-- 1 beat wheel 708 16 Jun 13:29 archiv
drwxr-xr-x 2 beat wheel 512 16 Jun 13:29 ordner/
-rw-r--r-- 1 beat wheel 12 16 Jun 13:29 test1
-rw-r--r-- 1 beat wheel 13 16 Jun 13:29 test2
# cat test?
Erste Datei
Zweite Datei

shar(1) befindet sich sowohl auf FreeBSD also auch auf OpenBSD im Basissystem.

 Permalink

Benutzerkonto vollständig entfernen

Um einen Benutzer vollständig von einem FreeBSD-System zu entfernen, kann rmuser verwendet werden. Folgende Arbeiten werden von rmuser vorgenommen:

  • Entfernt alle crontab-Einträge des Benutzers
  • Entfernt alle at-Jobs des Benutzers
  • Beendet alle laufende Prozesse des Benutzers
  • Entfernt den Benutzer aus /etc/passwd und /etc/master.passwd
  • Löscht das home-Verzeichnis des Benutzers
  • Löscht alle Mails des Benutzers in /var/mail
  • Entfernt alle Dateien des Benutzers aus /tmp, /var/tmp und /var/tmp/vi.recover
  • Entfernt den Benutzer aus allen Gruppen, denen er zugeordnet ist. Sind einer Gruppe danach keine Benutzer mehr zugeordnet, wird die Gruppe gelöscht
  • Entfernt alle message queues, shared memory-Segmente und Semaphoren, welche dem Benutzer gehören

Wird rmuser ohne Argument aufgerufen, wird zuerst nach einem Benutzernamen gefragt. Man kann allerdings auch die Benutzernamen aller Benutzer, welche entfernt werden sollen, als Argumente an rmuser übergeben.

# rmuser testuser
Matching password entry:

testuser:*:1003:1004:staff:0:0:Test User:/home/testuser:/bin/tcsh

Is this the entry you wish to remove? y
Remove user's home directory (/home/testuser)? y
Removing user (testuser): mailspool home passwd.

rmuser fragt vor jeder Aktion nach, ob sie durchgeführt werden soll. Sollen alle Fragen mit Ja beantwortet werden kann die -y Option verwendet werden. Mehr Informationen findet man in der Manpage rmuser(8).

 Permalink

Modifizierungsdatum zweier Dateien vergleichen

Soll zum Beispiel in einem Shellskript festgestellt werden, welche von zwei Dateien als letzte verändert wurde, so kann man dazu newer(1) verwenden. newer findet man in den FreeBSD-Ports unter misc/newer:

# cd /usr/ports/misc/newer && make install clean

An newer werden als Argumente die beiden Dateinamen übergeben. Ist das Modifizierungsdatum der zweiten Datei neuer als das der ersten, wird von newer der Rückgabewert 1 ausgegeben:

# touch datei1
# touch datei2
# newer datei1 datei2
# echo $?
1

Ist die erste Datei neuer, so wird als Rückgabewert 0 zurückgegeben:

# touch datei1
# newer datei1 datei2
# echo $?
0

Existiert die zweite Datei gar nicht, so wird eine 0 zurückgegeben:

# rm datei2 
# newer datei1 datei2
# echo $?
0

Existiert die erste Datei nicht, wird eine 1 zurückgegeben:

# mv datei1 datei2
# newer datei1 datei2
# echo $?
1
Comments (2)  Permalink

ZFS auf FreeBSD

Seit einiger Zeit ist das neue Dateisystem von Sun, ZFS, in FreeBSD 7-CURRENT verfügbar. Zeit sich mal ein bisschen genauer mit ZFS zu befassen. Folgende Beispiele zeigen, wie man einen Mehrbenutzerserver mit mehreren Festplatten und ZFS aufsetzen kann. Die Beispiele wurden mit dem Mai Snapshot von CURRENT durchgeführt:

# uname -a
FreeBSD test.chruetertee.ch 7.0-CURRENT-200705 FreeBSD 7.0-CURRENT-200705 #0: Mon May 7 11:24:25 UTC 2007
root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386

Damit ZFS verwendet werden kann, muss es in der rc.conf aktiviert und das dazugehörige rc.d-Skript ausgeführt werden. Ist der Eintrag in rc.conf einmal gemacht, wird die ZFS-Unterstützung beim Systemstart aktiviert und die vorhandenen ZFS-Dateisysteme automatisch gemountet.

# echo 'zfs_enable="YES"' >> /etc/rc.conf 
# /etc/rc.d/zfs start

Damit das System mit dem ZFS-Dateisystem umgehen kann, wird automatisch das entsprechende Kernelmodul geladen:

# kldstat
Id Refs Address Size Name
1 4 0xc0400000 7ddc50 kernel
2 1 0xc0bde000 5f5dc acpi.ko
3 1 0xc756d000 92000 zfs.ko

Bei einem Neustart wird man dann immer mit folgender Meldung begrüsst:

WARNING: ZFS is considered to be an experimental feature in FreeBSD.
ZFS filesystem version 6
ZFS storage pool version 6

Damit man ZFS-Dateisysteme erstellen kann, müssen zuerst die Festplatten, auf denen man ZFS-Dateisysteme verwenden möchte, zu einem ZFS-Pool zusammengefügt werden. Folgender Befehl kreiert einen Pool, in denen die Platten da1 und da2 zur Datensicherheit gespiegelt sind. Der Pool namens tank ist danach im Verzeichnisbaum unter /tank eingehängt.

# zpool create tank mirror da1 da2
# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 16.9G 111K 16.9G 0% ONLINE -

# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/da0s1a 496M 105M 351M 23% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/da0s1d 989M 12K 910M 0% /tmp
/dev/da0s1f 9.2G 116M 8.3G 1% /usr
/dev/da0s1e 1.9G 250K 1.8G 0% /var
tank 17G 0B 17G 0% /tank

# mount
/dev/da0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/da0s1d on /tmp (ufs, local, soft-updates)
/dev/da0s1f on /usr (ufs, local, soft-updates)
/dev/da0s1e on /var (ufs, local, soft-updates)
tank on /tank (zfs, local)

Informationen zum Pool erhält man wie folgt:

# zpool status
pool: tank
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0

Zu jeder Zeit können einem Pool weitere Platten hinzugefügt werden. Sind zu einem späteren Zeitpunkt die ZFS-Dateisysteme in einem Pool fast voll, so können dem Pool neue Platten hinzugefügt werden und die sich darin befindenden Dateisysteme sofort den neuen Speicherplatz benutzen. Im folgenden Beispiel werden dem schon bestehenden Pool tank die gespiegelten Platten da3 und da4 hinzugefügt:

# zpool add tank mirror da3 da4
# zpool status -v tank
pool: tank
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
mirror ONLINE 0 0 0
da3 ONLINE 0 0 0
da4 ONLINE 0 0 0

Ein Pool kann wie folgt entfernt werden. Alle Daten gehen dabei jedoch verloren.

# zpool destroy tank

# zpool status -v tank
cannot open 'tank': no such pool

Folgendes Beispiel erstellt einen Pool, in welchem die Daten auf die Spiegel da1, da2 und da3, da4 verteilt werden.

# zpool create tank mirror da1 da2 mirror da3 da4

Nun kann ein ZFS-Dateisystem innerhalb des Pools erstellt werden. Hier wird das Dateisystem /ports innerhalb vom Pool tank erstellt:

# zfs create tank/ports

In das Dateisystem /ports soll später der Portbaum hinein kommen. Da der Portbaum fast ausschliesslich aus Textdateien besteht, kann eine Komprimierung auf dieses Dateisystem eingeschaltet werden.

# zfs set compression=gzip tank/ports
# zfs get compression tank/ports
NAME PROPERTY VALUE SOURCE
tank/ports compression gzip local

Nun kann das Dateisystem nach /usr/ports gemountet und der Portbaum heruntergeladen werden:

# zfs set mountpoint=/usr/ports tank/ports
# portsnap fetch extract

Jetzt wird ein Dateisystem für die home-Verzeichnisse kreiert. In diesem Dateisystem wird nun ein weiteres für den Benutzer beat erstellt.

# zfs create tank/home
# zfs create tank/home/beat

Für den Benutzer setzen wir nun ein Quota von 1GB fest:

# zfs set quota=1G tank/home/beat

Alle Informationen eines Dateisystems können wie folgt abgefragt werden:

# zfs get all tank/home/beat
NAME PROPERTY VALUE SOURCE
tank/home/beat type filesystem -
tank/home/beat creation Mon May 7 12:42 2007 -
tank/home/beat used 18K -
tank/home/beat available 1024M -
tank/home/beat referenced 18K -
tank/home/beat compressratio 1.00x -
tank/home/beat mounted yes -
tank/home/beat quota 1G local
tank/home/beat reservation none default
tank/home/beat recordsize 128K default
tank/home/beat mountpoint /tank/home/beat default
tank/home/beat sharenfs off default
tank/home/beat checksum on default
tank/home/beat compression off default
tank/home/beat atime on default
tank/home/beat devices on default
tank/home/beat exec on default
tank/home/beat setuid on default
tank/home/beat readonly off default
tank/home/beat jailed off default
tank/home/beat snapdir hidden default
tank/home/beat aclmode groupmask default
tank/home/beat aclinherit secure default
tank/home/beat canmount on default
tank/home/beat shareiscsi off default
tank/home/beat xattr off temporary
tank/home/beat copies 1 default

Nun werden die home-Verzeichnisse nach /usr/home gemountet:

# zfs set mountpoint=/usr/home tank/home

# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/da0s1a 496M 105M 351M 23% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/da0s1d 989M 12K 910M 0% /tmp
/dev/da0s1f 9.2G 116M 8.3G 1% /usr
/dev/da0s1e 1.9G 310K 1.8G 0% /var
tank 33G 0B 33G 0% /tank
tank/ports 33G 98M 33G 0% /usr/ports
tank/home 33G 0B 33G 0% /usr/home
tank/home/beat 1.0G 128K 1.0G 0% /usr/home/beat

Nun wird versucht, das home-Verzeichnis von beat mit einer zu großen Testdatei zu füllen:

# cd /usr/home/beat/
# dd if=/dev/zero of=bla bs=1M count=2024

# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/da0s1a 496M 105M 351M 23% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/da0s1d 989M 12K 910M 0% /tmp
/dev/da0s1f 9.2G 116M 8.3G 1% /usr
/dev/da0s1e 1.9G 466K 1.8G 0% /var
tank 32G 128K 32G 0% /tank
tank/ports 32G 98M 32G 0% /usr/ports
tank/home 32G 128K 32G 0% /usr/home
tank/home/beat 1.0G 1.0G 1.5M 100% /usr/home/beat

Das gesetzte Quota verhindet, dass mehr als 1GB Daten in diesem Verzeichnis abgelegt werden. Ist das zuwenig, kann die Quota-Grenze auch erhöht werden:

# zfs set quota=2G tank/home/beat
# df -h | grep beat
tank/home/beat 2.0G 1.0G 2.0G 50% /usr/home/beat

# rm bla
# df -h | grep beat
tank/home/beat 2.0G 128K 2.0G 0% /usr/home/beat

Es lässt sich auch in einem ZFS-Dateisystem Speicherplatz reservieren. Für den Benutzer beat wird nun 1GB Speicherplatz reserviert.

# zfs set reservation=1G tank/home/beat
# zfs get reservation tank/home/beat
NAME PROPERTY VALUE SOURCE
tank/home/beat reservation 1G local

Das home-Verzeichnis von beat ist immer noch gleich gross, in dem darüberliegenden Dateisystemen ist der reservierte Platz nun als besetzt markiert. Der Benutzer beat hat nun also immer mind. 1GB zur Verfügung, egal wieviel Platz andere Benutzer verbrauchen.

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 1.10G 32.1G 18K /tank
tank/home 1.00G 32.1G 20K /usr/home
tank/home/beat 25.5K 2.00G 25.5K /usr/home/beat
tank/ports 97.8M 32.1G 97.8M /usr/ports

Der reservierte Speicherplatz kann auch wieder aufgehoben werden. In den höherliegenden Dateisystemen wird der Speicherplatz nun wieder freigegeben:

# zfs set reservation=0 tank/home/beat
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 98.0M 33.1G 18K /tank
tank/home 45.5K 33.1G 20K /usr/home
tank/home/beat 25.5K 2.00G 25.5K /usr/home/beat
tank/ports 97.8M 33.1G 97.8M /usr/ports

Nun wird ein weiteres Benutzerverzeichnis erstellt und dieses mit Daten gefüllt:

# zfs create tank/home/andereruser
# dd if=/dev/zero of=/usr/home/andereruser/wichtig count=2000
2000+0 records in
2000+0 records out
1024000 bytes transferred in 0.232209 secs (4409821 bytes/sec)
# pwd
/usr/home/andereruser
# echo "Hallo" > Datei
# ll
total 1027
-rw-r--r-- 1 root wheel 6 May 7 13:08 Datei
-rw-r--r-- 1 root wheel 1024000 May 7 13:07 wichtig

Nun kann ein Snapshot aller Benutzerverzeichnisse gezogen werden. Durch die -r-Option werden auch Snapshots von darunterliegenden Dateissystemen gemacht.

# zfs snapshot -r tank/home@now
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
tank/home@now 0 - 21K -
tank/home/andereruser@now 0 - 1.02M -
tank/home/beat@now 0 - 27.5K -

Nun werden die Daten verändert.

# pwd
/usr/home/andereruser
# rm wichtig
# echo "Hallo2" >> Datei
# echo "Neu" > DateiNeu
# ls -l
total 2
-rw-r--r-- 1 root wheel 13 May 7 13:09 Datei
-rw-r--r-- 1 root wheel 4 May 7 13:09 DateiNeu

Die gezogenen Snapshots sind wie Dateisysteme sichtbar und können auch so genutzt werden.

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 99.0M 33.1G 18K /tank
tank/home 1.09M 33.1G 21K /usr/home
tank/home@now 0 - 21K -
tank/home/andereruser 1.04M 33.1G 20K /usr/home/andereruser
tank/home/andereruser@now 1.02M - 1.02M -
tank/home/beat 27.5K 2.00G 27.5K /usr/home/beat
tank/home/beat@now 0 - 27.5K -
tank/ports 97.8M 33.1G 97.8M /usr/ports

Ein Snapshot kann jederzeit zurückgespielt werden. Dabei werden alle Änderungen, die seit dem Snapshot gemacht wurden, rückgängig gemacht.

# zfs rollback -r tank/home/andereruser@now
# ll
total 1028
-rw-r--r-- 1 root wheel 6 May 7 13:08 Datei
-rw-r--r-- 1 root wheel 1024000 May 7 13:07 wichtig
# cat Datei
Hallo

Benötigt man den Snapshot nicht mehr, kann dieser gelöscht werden.

# zfs destroy -r tank/home@now

Soll eine Festplatte ausgetauscht werden, kann man diese zuerst offline setzten. Danach werden keine Lese- und Schreiboperationen mehr auf das Laufwerk ausgeführt.

# zpool offline tank da4
Bringing device da4 offline

# zpool status
pool: tank
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
mirror ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
mirror DEGRADED 0 0 0
da3 ONLINE 0 0 0
da4 OFFLINE 0 0 0

errors: No known data errors

Nachdem das Laufwerk getauscht wurde, kann dieses wieder aktiviert werden:

# zpool online tank da4
Bringing device da4 online

Das ausgetauschte Laufwerk wird nun mit den Daten des gespiegelten Laufwerks synchronisiert.

# zpool status
pool: tank
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress, 82.43% done, 0h0m to go
config:

NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
mirror ONLINE 0 0 0
da3 ONLINE 0 0 0
da4 ONLINE 0 0 0

errors: No known data errors

Ist das Synchronisieren fertig, kann man nachschauen, ob dabei Fehler aufgetreten sind.

# zpool status
pool: tank
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver completed with 0 errors on Mon May 7 13:32:24 2007
config:

NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
mirror ONLINE 0 0 0
da3 ONLINE 0 0 0
da4 ONLINE 0 0 0

errors: No known data errors

Die ZFS-Pools können auch täglich durch die periodic-Scripte geprüft werden:

# echo 'daily_status_zfs_enable="YES"' >> /etc/periodic.conf

Danach findet man täglich in den daily-Mails den Status aller Pools:

Checking status of zfs pools:
all pools are healthy

Weitere Informationen zu ZFS findet man im Quickstart-Guide, im äusserst ausführlichen ZFS-Handbuch von OpenSolaris und in den Manpages zpool(1) und zfs(1).

Related Entries:
ZFS-Statistiken anzeigen
ZFS-Installation mit Hilfe von mfsBSD
FreeBSD nur auf ZFS installieren
Alle Änderungen eines ZFS-Pools anzeigen
Automatisch ZFS Snapshots erstellen
Comments (3)  Permalink

tail auf mehrere Dateien gleichzeitig anwenden

Möchte man ein tail -f gleichzeitig auf mehrere Dateien anwenden, so kann man einfach multitail verwenden. multitail findet man sowohl in den FreeBSD- als auch in den OpenBSD-Ports unter sysutils/multitail:

# cd /usr/ports/sysutils/multitail && make install clean

Nun können die verschiedenen Dateien angegeben werden, die man betrachten möchte. Das Terminalfenster wird dann durch die Anzahl der zu betrachtenden Dateien geteilt:

# multitail <Datei1> <Datei2> [<Datei3>] [...]

Betrachtet man Dateien mit multitail, so können durch das Drücken von F1 alle vorhandenen Befehle und ihre Tastenkombinationen angezeigt werden. Durch das Drücken von Q verlässt man multitail.

Sollen mehrere Dateien vereint in einem Fenster angezeigt werden, kann die -I Option von multitail verwendet werden:

# multitail <Datei1> -I <Datei2> [-I <Datei3>] [...]

Nun werden die neuen Einträge der jeweiligen Datei sofort im gemeinsamen Fenster angezeigt.

multitail besitzt noch viele weitere Optionen und Einsatzmöglichkeiten, diese sind ausführlich in der Manpage multitail(1) beschrieben. Auf der Webseite von multitail findet man ausserdem viele Beispiele zur Benutzung von multitail.

 Permalink
Prev Next231-240/325