BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

Symbolische Links aufräumen

Mit Hilfe von symlinks lassen sich symbolische Links innerhalb eines Systems finden und deren Status angezeigen. Im FreeBSD Portbaum findet man symlinks unter sysutils/symlinks:

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

Nun kann mit Hilfe von symlinks in einem Verzeichnis (in diesem Beispiel das Verzeichnis c) nach symbolischen Links gesucht werden. Mit der -v Option werden auch relative Links angezeigt. Die -s Option sucht nach Links welche ihr Ziel auch auf einem kürzerem Weg erreichen könnten. Diese werden als "lenghty" gekennzeichnet. Links welche als "dangling" markiert sind, zeigen auf ein Ziel welches nicht mehr existiert. Als "messy" gekennzeichnete Links enthalten unnötige Zeichen:

# symlinks -sv c
relative: /tmp/a/b/c/foo -> ../foo
absolute: /tmp/a/b/c/bar -> /tmp/a/b/foo
lengthy:  /tmp/a/b/c/ok -> ../c/test
dangling: /tmp/a/b/c/fail -> ../c/tes
messy:    /tmp/a/b/c/mess -> ../c//test

Mit der -d Option können nun Links entfernt werden, deren Ziel nicht mehr existiert:

# symlinks -d c
absolute: /tmp/a/b/c/bar -> /tmp/a/b/foo
dangling: /tmp/a/b/c/fail -> ../c/tes
deleted:  /tmp/a/b/c/fail -> ../c/tes
messy:    /tmp/a/b/c/mess -> ../c//test

Verwendet man die -r Option, können auch Verzeichnisse rekursiv nach symbolischen Links durchsucht werden. Durch die -c Option können absolute in relative Links umgewandelt werden. Ausserdem werden dabei überflüssige Zeichen aus den Links entfernt. Mit der -t Option können die Änderungen zuerst begutachtet werden, ohne das diese ausgeführt werden:

#  symlinks -rt b
absolute: /tmp/a/b/c/bar -> /tmp/a/b/foo
changed:  /tmp/a/b/c/bar -> ../../../../tmp/a/b/foo
messy:    /tmp/a/b/c/mess -> ../c//test
changed:  /tmp/a/b/c/mess -> ../c/test
# symlinks -rc b
absolute: /tmp/a/b/c/bar -> /tmp/a/b/foo
changed:  /tmp/a/b/c/bar -> ../../../../tmp/a/b/foo
messy:    /tmp/a/b/c/mess -> ../c//test
changed:  /tmp/a/b/c/mess -> ../c/test

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

 Permalink

Einstellungen des FreeBSD-Bootmanagers ändern

Verwendet man den FreeBSD-Bootmanager um auf einem Rechner verschiedene installierte Betriebssysteme starten zu können, so kann mit boot0cfg und der -v Option die aktuelle Konfiguration ausgelesen werden:

# boot0cfg -v /dev/ad4
#   flag     start chs   type       end chs       offset         size
1   0x00      0:  1: 1   0x07   1023:119:63           63    245866257
2   0x00   1023:255:63   0x12   1023:239:63    474541200     13849920
3   0x80   1023:255:63   0xa5   1023:254:63    245866320    228661650

version=2.0  drive=0x80  mask=0xf  ticks=182  bell=# (0x23)
options=packet,noupdate,nosetdrv
volume serial ID b8b8-b8b8
default_selection=F1 (Slice 1)

Möchte man nun ändern, von welchem Slice beim nächsten Neustart standardmässig gestartet werden soll, so kann die Slice-Nummer mit der -s Option an boot0cfg übergeben werden:

# boot0cfg -s 3 /dev/ad4
# boot0cfg -v /dev/ad4
#   flag     start chs   type       end chs       offset         size
1   0x00      0:  1: 1   0x07   1023:119:63           63    245866257
2   0x00   1023:255:63   0x12   1023:239:63    474541200     13849920
3   0x80   1023:255:63   0xa5   1023:254:63    245866320    228661650

version=2.0  drive=0x80  mask=0xf  ticks=182  bell=# (0x23)
options=packet,noupdate,nosetdrv
volume serial ID b8b8-b8b8
default_selection=F3 (Slice 3)

Standardmässig wartet der Bootmanager 10 Sekunden (was ~182 Ticks entspricht), bevor vom konfigurierten Standardslice gebootet wird. Möchte man diese Dauer ändern, kann mit der -t Option die Anzahl Ticks angegeben werden, wie lange gewartet werden soll. Im folgenden Beispiel wird die Zeit auf 91 Ticks eingestellt, was ~5 Sekunden entspricht:

# boot0cfg -t 91 /dev/ad4
# boot0cfg -v /dev/ad4
#   flag     start chs   type       end chs       offset         size
1   0x00      0:  1: 1   0x07   1023:119:63           63    245866257
2   0x00   1023:255:63   0x12   1023:239:63    474541200     13849920
3   0x80   1023:255:63   0xa5   1023:254:63    245866320    228661650

version=2.0  drive=0x80  mask=0xf  ticks=91  bell=# (0x23)
options=packet,noupdate,nosetdrv
volume serial ID b8b8-b8b8
default_selection=F3 (Slice 3)

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

 Permalink

Interaktives Installieren von Paketen

Mit Hilfe von pkg_add_it lässt sich nach einem FreeBSD Paket suchen. Das Paket kann nach erfolgreicher Suche mit pkg_add_it direkt installiert werden. Stimmen mehrere Pakete mit der Sucheingabe überein, wird eine Liste mit den Suchresultaten angezeigt, aus welcher das gewünschte Paket ausgewählt werden kann. Im FreeBSD Portbaum findet man pkg_add_it unter ports-mgmt/pkg_add_it:

# cd /usr/ports/ports-mgmt/pkg_add_it && make install clean

Verwendet man die --remote Option, werden die Pakete auf einem entfernten Server gesucht. Mit der Variable OSRELEASE wird die verwendete FreeBSD -Version angegeben, mit PACKAGEROOT kann der Server angegeben werden auf dem die Pakete gesucht werden sollen. Ist PACKAGEROOT nicht gesetzt, so wird ftp.FreeBSD.org verwendet. Mit der -L Option wird nur nach Paketen gesucht, diese können danach aber nicht direkt installiert werden:

# setenv OSRELEASE 7.2-release
# pkg_add_it -L --remote dwatch
==>> NOTICE: INDEX file was not found in current dir, I'll fetch it..

==>> NOTICE: PACKAGEROOT was not defined..
==>> Using default PACKAGEROOT - ftp://ftp.freebsd.org/

INDEX                                         100% of   17 MB  416 kBps 00m00s

==>> Total packages found: 4
==>> List of packages matching the given pattern... 

#####################################################################
(001)   dwatch-0.1.1                   (in sysutils)
        Description: Dwatch - A Daemon Watcher
        Maintained by: ports@FreeBSD.org

(002)   cmdwatch-0.2.0_1               (in sysutils)
        Description: Watches the output from a command at specified intervals
        Maintained by: beat@FreeBSD.org

(003)   jbidwatcher-2.0.1              (in misc java)
        Description: A Java-based application allowing you to monitor eBay auctions
        Maintained by: shurd@sasktel.net

(004)   bidwatcher-1.3.17_8            (in misc)
        Description: Bid monitor for eBay
        Maintained by: obrien@FreeBSD.org

#####################################################################

==>> Total packages found: 4

Möchte man lokal gespeicherte Pakete für die Suche und Installation verweden, so kann mit der --local Option ein lokales Verzeichnis angegeben werden, in dem die Pakete gespeichert sind:

# pkg_add_it -L --local /usr/ports/packages/All/ kde
==>> Total packages found: 7
==>> List of packages matching the given pattern.. 

#####################################################################
(001)   kde-windeco-crystal-1.0.7.tbz  (in /usr/ports/packages/All)
(002)   kdebase-3.5.10_2.tbz           (in /usr/ports/packages/All)
(003)   kdebase-kompmgr-3.5.10.tbz     (in /usr/ports/packages/All)
(004)   kde-xdg-env-1.0_3,1.tbz        (in /usr/ports/packages/All)
(005)   kdegraphics-3.5.10.tbz         (in /usr/ports/packages/All)
(006)   kdelibs-3.5.10.tbz             (in /usr/ports/packages/All)
(007)   kdehier-1.0_11.tbz             (in /usr/ports/packages/All)
#####################################################################

==>> Total packages found: 7

Nun kann das gefundene Paket installiert werden. Dazu wird die entsprechende Nummer des Pakets eingegeben:

# pkg_add_it --remote dwatch
==>> Total packages found: 4
==>> List of packages matching the given pattern... 

#####################################################################
(001)   dwatch-0.1.1                   (in sysutils)
        Description: Dwatch - A Daemon Watcher
        Maintained by: ports@FreeBSD.org

(002)   cmdwatch-0.2.0_1               (in sysutils)
        Description: Watches the output from a command at specified intervals
        Maintained by: beat@FreeBSD.org

(003)   jbidwatcher-2.0.1              (in misc java)
        Description: A Java-based application allowing you to monitor eBay auctions
        Maintained by: shurd@sasktel.net

(004)   bidwatcher-1.3.17_8            (in misc)
        Description: Bid monitor for eBay
        Maintained by: obrien@FreeBSD.org

#####################################################################

==>> Total packages found: 4
==>> Choose the package number you wish to install [1-4]: 2
==>> NOTICE: PACKAGEROOT was not defined..
==>> Using default PACKAGEROOT - ftp://ftp.freebsd.org/

Fetching ftp://ftp.freebsd.org//pub/FreeBSD/ports/i386/packages-7.2-release/sysutils/cmdwatch-0.2.0_1.tbz... Done.
# pkg_info -Ix dwatch
cmdwatch-0.2.0_1    Watches the output from a command at specified intervals

Mehr Informationen zu pkg_add_it findet man in der Manpage pkg_add_it(1).

 Permalink

Inhalt zweier Dateien vergleichen

Möchte man wissen ob der Inhalt zweier Dateien identisch ist, so kann dazu cmp aus dem FreeBSD Basissystem verwendet werden. Sind die Dateien identisch, so wird vom cmp keine Ausgabe geschrieben. Stellt cmp einen Unterschied fest, so wird die Stelle des ersten Unteschiedes ausgegeben:

# cmp datei1 identischedatei
# cmp datei1 datei2
datei1 datei2: char 2025, line 54

Möchte man innerhalb eines Shellskriptes zwei Dateien vergleichen, so kann die -s Option verwendet werden. Nun wird auch bei einem Unterschied keine Ausgabe geschrieben. Der Rückgabewert von cmp bei identischen Dateien ist 0, stellt cmp einen Unterschied fest, so wird 1 zurückgegeben:

# cmp -s datei1 identischedatei
# echo $?
0
# cmp -s datei1 datei2 # echo $?
1

Mehr Informationen zu cmp findet man in der Manpage cmp(1).

 Permalink

Aktuelle Session nach dem Abmelden offen lassen

Im FreeBSD Portbaum findet man unter misc/tmux mit tmux eine BSD-lizenzierte Alternative zu GNU Screen. Damit ist es möglich sich von einem Rechner abzumelden und bei der nächsten Anmeldung die alte Session weiterzuverwenden:

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

Folgendermassen kann auf dem Rechner eine neue Session gestartet werden, deren Inhalt auch nach dem Ab- und erneuten Anmelden noch verfügbar ist:

# tmux

Um sich von einer Session zu trennen ohne sie zu beenden, drückt man Ctrl+b d. Nun kann man sich abmelden, die Session bleibt aber im Hintergrund offen. Beim nächsten Anmelden setzt man die Session wie folgt fort:

# tmux attach

Eine Liste aller verfügbaren Tastenkombinationen erhält man durch das Drücken von Ctrl+b ?. Alle Möglichkeiten von tmux und die verfügbaren Tastenkombinationen und Kommandos findet man in der Manpage tmux(1).

 Permalink

Abkürzungen auf der Kommandozeile nachschlagen

Möchte man auf der Kommandzeile die Bedeutung einer Abkürzung nachschauen, so kann wtf dazu verwendet werden, welches man im FreeBSD Portbaum unter games/wtf findet:

# cd /usr/ports/games/wtf && make install clean

Nach der Installation können Abkürzungen mit Hilfe von wft nachgeschlagen werden:

# wtf bofh
BOFH: bastard operator from hell

Mehr Informationen zu wtf findet man in der Manpage wtf(6).

 Permalink

Sonderzeichen in Dateinamen konvertieren

Hat man Dateien, welche unter einem anderen als dem auf dem eigenen Rechner verwendeten Zeichensatz erstellt wurden, so können zum Beispiel Umlaute falsch dargestellt werden. Diese können mit Hilfe von convmv konvertiert werden. Im FreeBSD Portbaum findet man convmv unter converters/convmv:

# cd /usr/ports/converters/convmv && make install clean

Im folgenden Beispiel wird ein Ordner mit einer Datei, welche Umlaute im Dateinamen enthält und auf einem System mit UTF8 erstellt wurde, auf einem System mit ISO8859-1 dargestellt:

# ls -al ÀöÌ
total 4
drwxr-xr-x  2 beat  wheel  512  9 Mai 20:51 ./
drwxrwxrwt  9 root  wheel  512  9 Mai 20:51 ../
-rw-r--r--  1 beat  wheel    0  9 Mai 20:49 morgÀ

Mit convmv können die Dateinamen nun konvertiert werden. Dazu wird zuerst ein Test vorgenommen, ob der Dateiname richtig konvertiert werden kann. Die -f Option gibt den ursprünglichen Zeichensatz, die -t Option den auf dem eigenen Rechner verwendeten Zeichensatz an. Mit der -r Option wird bei einem Ordner auch dessen Inhalt umgewandelt:

# convmv -r -f UTF-8 -t ISO8859-1 ÀöÌ
Starting a dry run without changes...
mv "ÀöÌ/morgÀ"      "ÀöÌ/morgä"
mv "./ÀöÌ"   "./äöü"
No changes to your files done. Use --notest to finally rename the files.

Ist der Test erfolgreich verlaufen, kann die Konvertierung mit --notest durchgeführt werden:

# convmv --notest  -r -f UTF-8 -t ISO8859-1 ÀöÌ
mv "ÀöÌ/morgÀ"      "ÀöÌ/morgä"
mv "./ÀöÌ"   "./äöü"
Ready!
# ls -al äöü/
total 4
drwxr-xr-x  2 beat  wheel  512  9 Mai 20:52 ./
drwxrwxrwt  9 root  wheel  512  9 Mai 20:52 ../
-rw-r--r--  1 beat  wheel    0  9 Mai 20:49 morgä

Auch lassen sich mit convmv Dateinamen in ausschliesslich Klein- oder Grossbuchstaben umwandeln:

# convmv --notest --upper klein
mv "./klein"    "./KLEIN"
Ready!
# convmv --notest --lower KLEIN 
mv "./KLEIN"    "./klein"
Ready!

Hat man Dateien, in deren Namen die Leerzeichen mit %20 kodiert wurden, können auch diese mit convmv umgewandelt werden:

#  convmv --notest --unescape dateinamen%20mit%20leerzeichen 
mv "./dateinamen%20mit%20leerzeichen"      "./dateinamen mit leerzeichen"
Ready!

Mehr Informationen zu convmv findet man in der Manpage convmv(1).

 Permalink

Mehrere CPU-Kerne zur bzip2-Komprimierung nutzen

Hat man einen Rechner mit mehreren CPU-Kernen und/oder mehreren Prozessoren und möchte eine grosse Datei mit bzip2 komprimieren, so kann die Zeit, die zum Komprimieren benötigt wird, mit pbzip2 linear um die Anzahl Kerne gesenkt werden. Im FreeBSD Portbaum findet man pbzip2 unter archivers/pbzip2:

# cd /usr/ports/archivers/pbzip2 && make install clean

Im folgenden Beispiel wird zuerst eine Datei mit bzip2 komprimiert:

# du -h test 
153M    test
# /usr/bin/time -h bzip2 test
        36,94s real             36,43s user             0,30s sys
# du -h test.bz2 
 61M    test.bz2
# bunzip2  test.bz2
# du -h test 
153M    test

Danach wird die gleiche Datei mit pbzip2 komprimiert, wobei beide Prozessorkerne genutzt werden können. Die Zeit, die zum Komprimieren benötigt wird, wird so beinahe halbiert. Die komprimierte Datei kann danach mit bunzip2(1) wieder entpackt werden:

# du -h test 
153M    test
# /usr/bin/time -h pbzip2 test
        20,34s real             38,19s user             1,09s sys
# du -h test.bz2 
 61M    test.bz2
# bunzip2  test.bz2
# du -h test 
153M    test

Mehr Informationen zu pbzip2 findet man in der Manpage pbzip2(1).

 Permalink

Verfügbarkeit eines TCP-Ports testen

Möchte man zum Beispiel in einem Shell-Skript die Verfügbarkeit eines TCP-Ports prüfen, so kann dazu tcping verwendet werden, welches man im FreeBSD Portbaum unter net/tcping findet:

# cd /usr/ports/net/tcping && make install clean

Nun können die IP-Adresse und der TCP-Port angegeben werden, zu welchen eine Verbindung aufgebaut werden soll. Kann die Verbindung erfolgreich hergestellt werden, wird der Rückgabewert 0 zurückgegeben:

# tcping 217.150.245.53 80
217.150.245.53 port 80 open.
# echo $?
0

Wird die Verbindung zurückgewiesen, wird der Rückgabewert 1 zurückgegeben:

# tcping 127.0.0.1 81
127.0.0.1 port 81 closed.
# echo $?
1

Wird der Verbindungsversuch nicht zurückgewiesen, jedoch die Pakete von z.B. einem Paketfilter verworfen, so kann die Verbindung nicht aufgebaut werden. Bei solch einer Zeitüberschreitung des Verbindungsversuchs wird der Rückgabewert 2 zurückgegeben. Mit der -t Option kann die Anzahl Sekunden angegeben werden, ab wann eine Zeitüberschreitung angegeben wird:

# tcping -t 2 217.150.245.53 81
217.150.245.53 port 81 user timeout.
# echo $?
2
Comments (1)  Permalink

Verschlüsselte Backups erzeugen

Mit Hilfe von duplicity lassen sich durch GnuPG verschlüsselte inkrementelle Backups erzeugen, welche sich nach dem Erzeugen auf einen anderen Rechner kopieren lassen. Im FreeBSD Portbaum findet man duplicity unter sysutils/duplicity:

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

Im folgenden Beispiel wird /home in den Ordner backup gesichert. Ist noch kein Backup in diesem Ordner vorhanden, wird ein vollständiges Backup erstellt. Als erstes muss ein Passwort gewählt werden, welches für die Verschlüsselung des Backups verwendet wird:

# duplicity /home/ file://backup
Last full backup date: none
GnuPG passphrase:
No signatures found, switching to full backup.
Retype passphrase to confirm:
--------------[ Backup Statistics ]--------------
StartTime 1240000061.53 (Fri Apr 17 22:27:41 2009)
EndTime 1240000065.80 (Fri Apr 17 22:27:45 2009)
ElapsedTime 4.27 (4.27 seconds)
SourceFiles 0
SourceFileSize 23232967 (22.2 MB)
NewFiles 0
NewFileSize 0 (0 bytes)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 0
RawDeltaSize 23158201 (22.1 MB)
TotalDestinationSizeChange 13929125 (13.3 MB)
Errors 0

Wird das Backup nochmals ausgeführt, werden nur noch die Änderungen gesichert:

# duplicity /home/ file://backup
Last full backup date: Fri Apr 17 22:27:37 2009
GnuPG passphrase:
--------------[ Backup Statistics ]--------------
StartTime 1240000195.98 (Fri Apr 17 22:29:55 2009)
EndTime 1240000200.50 (Fri Apr 17 22:30:00 2009)
ElapsedTime 4.53 (4.53 seconds)
SourceFiles 884
SourceFileSize 28935728 (27.6 MB)
NewFiles 0
NewFileSize 0 (0 bytes)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 0
RawDeltaSize 4983670 (4.75 MB)
TotalDestinationSizeChange 1738528 (1.66 MB)
Errors 0

Möchte man das Backup gleich per scp auf einen anderen Rechner kopieren, so kann dies wie folgt angegeben werden:

# duplicity /home scp://<Benutzer>@<Rechner>/<Verzeichnis>

Möchte man überprüfen, welche Backups vorhanden sind, kann dazu die collection-status Option von duplicity verwendet werden:

# duplicity collection-status file://backup
Last full backup date: Fri Apr 17 22:27:37 2009
Collection Status
-----------------
Connecting with backend: LocalBackend
Archive dir: None
 
Found 0 backup chains without signatures.
 
Found a complete backup chain with matching signature chain:
-------------------------
Chain start time: Fri Apr 17 22:27:37 2009
Chain end time: Fri Apr 17 22:29:53 2009
Number of contained backup sets: 2
Total number of contained volumes: 2
 Type of backup set:                            Time:      Num volumes:
                Full         Fri Apr 17 22:27:37 2009                 1
         Incremental         Fri Apr 17 22:29:53 2009                 1
-------------------------
No orphaned or incomplete backup sets found.

Mit list-current-files werden alle Dateien, welche im Backup vorhanden sind, aufgelistet:

#  duplicity list-current-files file://backup
Last full backup date: Fri Apr 17 22:27:37 2009
GnuPG passphrase:
Fri Apr 17 22:29:38 2009 .
[..]

Durch verify kann der Inhalt des Backups mir dem Quellordner verglichen werden:

# duplicity verify file://backup /home
Last full backup date: Fri Apr 17 22:27:37 2009
GnuPG passphrase:
Difference found: File . has mtime Fri Apr 17 22:35:34 2009, expected Fri Apr 17 22:29:38 2009
Error accessing possibly locked file /home/test/.qt/.qt_plugins_3.3rc.lock
Difference found: File test is missing
Difference found: File test/bla is missing
[...]

Mit der Zeit können ältere Backups entfernt werden, dazu kann ein Datum mit remove-older-than angegeben werden und alle ältere Backups werden gelöscht:

# duplicity remove-older-than 2009-04-18 file://backup

Soll der Inhalt des Backups wiederhergestellt werden, so kann dies wie folgt gemacht werden:

# duplicity file://backup /tmp/restore
Last full backup date: Fri Apr 17 22:27:37 2009
GnuPG passphrase: 
[...]

Mehr Informationen und alle Optionen von duplicity findet man in der Manpage duplicity(1).

Comments (1)  Permalink
Prev Next131-140/325