BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

Festplattenbenutzung anzeigen

Ähnlich wie top(1) den Ressourcenverbrauch von Prozessen anzeigt, zeigt gstat(8) die Auslastung von Festplatten, Partitionen, RAID Arrays und virtuellen Laufwerken wie RAM-Disks an. Damit gstat ausgeführt werden kann, muss man root-Rechte besitzen. Die Anzeige wird automatisch regelmässig aktualisiert. Im folgenden Beispiel sieht man einen Ausschnitt während ein make clean in /usr/src ausgeführt wird:

# gstat
L(q) ops/s r/s kBps ms/r w/s kBps ms/w %busy Name
0 0 0 0 0.0 0 0 0.0 0.0| fd0
0 0 0 0 0.0 0 0 0.0 0.0| acd0
0 0 0 0 0.0 0 0 0.0 0.0| ad4
0 0 0 0 0.0 0 0 0.0 0.0| ad6
32 559 0 0 0.0 559 1238 509.4 98.8| ar0
0 0 0 0 0.0 0 0 0.0 0.0| ad4s1
0 0 0 0 0.0 0 0 0.0 0.0| ad6s1
32 559 0 0 0.0 559 1238 511.5 98.8| ar0s1
0 0 0 0 0.0 0 0 0.0 0.0| ad4s1a
0 0 0 0 0.0 0 0 0.0 0.0| ad4s1b
0 0 0 0 0.0 0 0 0.0 0.0| ad4s1c
0 0 0 0 0.0 0 0 0.0 0.0| ad4s1d
0 0 0 0 0.0 0 0 0.0 0.0| ad4s1e
0 0 0 0 0.0 0 0 0.0 0.0| ad4s1f
0 0 0 0 0.0 0 0 0.0 0.0| ad6s1a
0 0 0 0 0.0 0 0 0.0 0.0| ad6s1b
0 0 0 0 0.0 0 0 0.0 0.0| ad6s1c
0 0 0 0 0.0 0 0 0.0 0.0| ad6s1d
0 0 0 0 0.0 0 0 0.0 0.0| ad6s1e
0 0 0 0 0.0 0 0 0.0 0.0| ad6s1f
0 0 0 0 0.0 0 0 0.0 0.0| ar0s1a
0 0 0 0 0.0 0 0 0.0 0.0| ar0s1b
0 0 0 0 0.0 0 0 0.0 0.0| ar0s1c
0 0 0 0 0.0 0 0 0.0 0.0| ar0s1d
0 0 0 0 0.0 0 0 0.0 0.0| ar0s1e
32 559 0 0 0.0 559 1238 520.8 98.8| ar0s1f

Die Spalten bedeuten folgendes:

L(q) = Länge der Queue

ops/s, r/s, w/s = Operationen, Leseoperatationen und Schreiboperationen pro Sekunde

kBps = kiloBytes pro Sekunde

ms/r, ms/w = Millisekunden pro Lese- und Schreiboperation

%busy = % der Zeit mit mindestens einem Eintrag in der Queue

Man sollte sich allerdings nicht zu fest auf die %busy Spalte konzentrieren, da auch Werte über 100% auftreten können:

 L(q)  ops/s    r/s   kBps   ms/r    w/s   kBps   ms/w   %busy Name
[...]
5 261 0 0 0.0 261 31965 31.8 119.6| ar0
0 0 0 0 0.0 0 0 0.0 0.0| ad4s1
0 0 0 0 0.0 0 0 0.0 0.0| ad6s1
5 261 0 0 0.0 261 31965 31.8 119.6| ar0s1
[...]
5 261 0 0 0.0 261 31965 32.0 119.7| ar0s1

gstat verlässt man wie top indem man q drückt. Mehr Informationen findet man in der Manpage gstat(8).

Related Entries:
Gespeicherte Optionen nach OptionsNG konvertieren
Ports-Subversion-Repository spiegeln
sysinstall-Ersatz für neuere FreeBSD-Versionen
Alte FreeBSD-Port Patchdateien aufsplitten
FreeBSD-Portbaum auf Fehler überprüfen
 Permalink

Vervollständigung in der tcsh

Eine der wirklich starken Funktionen der tcsh ist die Vervollständigung. Standardmässig werden unter FreeBSD nur Verzeichnisse und Dateien vervollständigt. Gibt man ein Kommando, zum Beispiel ls, in die Shell ein, und drückt danach Ctrl + d, werden einem die verfügbaren Dateien und Verzeichnisse angezeigt. Nun kann man den Anfang eines Dateinamens eingeben und versuchen mit der Tabulatortaste den Dateinamen zu vervollständigen. Dies klappt nur, wenn nur noch ein Dateiname zu der Eingabe passt, treffen mehrere zu, so passiert nichts und man muss noch einen weiteren Teil des Namens eingeben. Man kann jederzeit mit Ctrl + d die Dateinamen anzeigen lassen, mit der die eingegebenen Zeichen vervollständigt werden können.

Mit der tcsh kann jedoch noch viel mehr vervollständigt werden. Folgende Zeilen können in der ~/.cshrc oder in der /etc/csh.cshrc eingefügt werden. Die folgenden Beispiele basieren auf der .tcshrc von Justin Randall. Die Zeilen für die Vervollständigungen in der cshrc müssen zwischen folgenden Zeilen stehen, damit Wildcards nicht interpretiert werden:

set noglob
<... Regeln für die Vervollständigungen ...>
unset noglob

Möchte man zum Beispiel, bei ssh <Host> den Host vervollständigen, so fügt man folgende Regel, die die /etc/hosts und ~/.ssh/known_hosts ausliest und damit den Host vervollständigt, in die cshrc hinzu. Auch werden mirror.switch.ch und ftp.freebsd.ch manuell zur Host-Liste hinzugefügt:

   if ( -r /etc/hosts ) then
set hosts=(`awk '/^[1-9].*/ {print $2'} /etc/hosts`)
endif
if ( -r $HOME/.ssh/known_hosts ) then
set f=`cat $HOME/.ssh/known_hosts | cut -f 1 -d \ ` >& /dev/null
set hosts=($hosts $f)
unset f
endif
set hosts=($hosts mirror.switch.ch ftp.freebsd.ch)
complete ssh 'n/-l/u/' 'n/*/$hosts/'

Verwendet man mit dieser Regel die -l Option von ssh, um einen Benutzer anzugeben, so werden die Benutzer aus /etc/passwd zur Vervollständigung angeboten.

Ist die Variable $host gesetzt, so wie es in der obigen Regel gemacht wurde, so kann folgende Regel verwendet werden, um bei ping und traceroute den host zu vervollständigen:

   complete {ping,traceroute} p/1/\$hosts/

Zur Vervollständigung von kill verwendet man folgende Regel:

   complete kill    'c/-/S/' 'p/1/(-)//' 'c/%/j/' \
'n/*/`ps -U $LOGNAME | awk '"'"'{print $1}'"'"'`/'

Damit werden bei einem kill -<Signal> <PID> das Signal durch alle verfügbaren Signale und die PID durch alle PID's von Prozessen des aktuellen Benutzers vervollständigt.

Mit folgender Regel wird bei einem ifconfig die Schnittstelle durch alle verfügbaren Schnittstellen vervollständigt und auch ein paar öfters gebrauchte Optionen wie up, down und noch ein paar andere vervollständigt:

   complete ifconfig   'p@1@`ifconfig -l`@' 'n/*/(range phase link netmask \
mtu up metric mediaopt down delete \
broadcast arp debug)/'

Sollen bei einem bunzip2 nur noch Dateien mit der Endung bz2 vervollständigt werden, benutzt man diese Regel:

  complete bunzip2     'p/*/f:*.bz2/'
Sollen bei einem umount nur die gemounteten Partitionen zur Vervollständigung angeboten werden, so kann man folgende Regel verwenden:
  complete umount       c/-/"(a A f c)"/ \
n/*/'`mount | cut -d " " -f 3`'/

Möchte man selber Vervollständigungen erstellen, so findet man in der tcsh(1) eine detaillierte Anleitung.

Related Entries:
Wort in der tcsh löschen
Programm mit which finden
Liste der besuchten Verzeichnisse merken
foreach-Schleife in der tcsh
tcsh bei Inaktivität beenden
 Permalink

Manpage mittels F1 aufrufen

Hat man unter Umständen einen längeren Befehl in der tcsh eingegeben, möchte aber noch was zum Befehl in der Manpage nachlesen, so kann man zum Beispiel ein neues Terminal aufmachen und die Manpage zum Befehl lesen. Einen einfacheren Weg bekommt man, wenn man folgende Zeilen in die ~/.cshrc einfügt:

alias helpcommand man
bindkey ^[OP run-help # F1 xterm
bindkey ^[[M run-help # F1 cons25

Jetzt kann man während der Eingabe eines Befehls die F1 Taste drücken, wodurch die Manpage des eingegebenen Befehls geöffnet wird. Beendet man die Manpage wieder mit q, so ist der Befehl noch immer in der tcsh eingegeben und man kann sofort weiterarbeiten.

Related Entries:
Wort in der tcsh löschen
Programm mit which finden
Liste der besuchten Verzeichnisse merken
foreach-Schleife in der tcsh
tcsh bei Inaktivität beenden
 Permalink

Dateien schneller finden

Sucht man eine Datei auf der Festplatte, so kann man zum Beispiel find(1) dazu benutzen:

# find / -name "*<Teil des Names der gesuchten Datei>*"

Da dabei jedes mal die ganze Festplatte durchsucht wird, ist dies nicht der effektivste Weg, wenn man mehrere Dateien sucht. Dafür gibt es locate(1). Vor dem ersten Gebrauch von locate muss eine Datenbank erstellt werden, auf die locate später zurückgreift:

# /usr/libexec/locate.updatedb
>>> WARNING
>>> Executing updatedb as root. This WILL reveal all filenames
>>> on your machine to all login users, which is a security risk.

Erstellt man die Datenbank als root-Benutzer, so können alle Benutzer des Systems den Inhalt von Verzeichnissen herausfinden, von denen sie normalerweise nicht die Berechtigungen haben. Dies kann auf Mehrbernutzersystemen ein Problem sein. Dort sollte die Datenbank als unprevilegierter Benutzer erstellt werden:

# su -m nobody -c /usr/libexec/locate.updatedb

Ist die Datenbank erstellt, so kann sie mit locate durchsucht werden, wenn man eine Datei sucht:

# locate <Teil des Names der gesuchten Datei>

Möchte man, dass die Gross-/Kleinschreibung ignoriert wird, so kann man zusätzlich die -i Option verwenden.

Die locate-Datenbank wird wöchentlich automatisch auf FreeBSD durch das periodic weekly Skript /etc/periodic/weekly/310.locate und auf OpenBSD durch /etc/weekly aktualisiert.

Comments (2)  Permalink

Prozess-ID anhand des Prozessnamens finden

Mit pgrep(1) lässt sich die Prozess-ID eines Prozesses anhand seines Namens herausfinden:

# pgrep syslogd
22758

Mit der -l Option wird neben der Prozess-ID auch der Prozessname angezeigt:

# pgrep -l syslogd
22758 syslogd

Mit der -f Option werden nicht nur die Prozessnamen nach dem Suchbegriff durchsucht, sondern auch die Argumente, die den Prozessen übergeben worden sind:

# pgrep -lf SSL
37342 /usr/local/sbin/httpd -DSSL
37325 /usr/local/sbin/httpd -DSSL
37262 /usr/local/sbin/httpd -DSSL
36630 /usr/local/sbin/httpd -DSSL

So kann man nun die Prozess-ID eines zum Beispiel hängengebliebenen Prozesses herausfinden und dieser kann dann mit kill(1) terminiert werden. Wer ein bisschen mutiger ist, verwendet pkill(1), welcher wie pgrep funktioniert, nur dass nicht die Prozess-ID der gefunden Prozesse ausgegeben, sondern an alle gefundenen Prozesse ein Signal zur Terminierung gesendet wird.

# pgrep -lf vi 2008 vi /home/beat/chruetertee/ideen
# pkill -f vi
# pgrep -lf vi

pkill(1) und pgrep(1) sind sowohl auf FreeBSD als auch auf OpenBSD im Basissystem vorhanden.

Comments (1)  Permalink

Herausfinden, welcher Benutzer wieviel Speicherplatz verbraucht

Um herauszufinden, welcher Benutzer wieviel Speicherplatz verbraucht, kann man quot(8) verwenden. Möchte man dies von allen Partitionen sehen, so kann man die -a Option verwenden:

# quot -a

Die Ausgabe erfolgt in der Grösseneinheit, die in der System-Variable BLOCKSIZE definiert ist. Die standardmässig gesetzte Grösse ist KB. Möchte man z.B. die Benutzung von /usr anzeigen und die Ausgabe in MB darstellen, so setzt man BLOCKSIZE auf M :

# setenv BLOCKSIZE M
# echo $BLOCKSIZE
M
# quot /usr
/dev/ar0s1f:
27398 alain
11956 root
974 mysql
347 www
208 beat
4 nobody
...

Mit der Option -v können nun auch die Anzahl Dateien angezeigt werden, die in den letzten 30, 60 und 90 Tagen nicht benutzt wurden:

# quot -v /usr
/dev/ar0s1f:
27398 alain 27264 27264 27264
11956 root 9626 4020 2644
974 mysql 598 537 519
347 www 92 92 76
208 beat 16 16 16
4 nobody 0 0 0
...

Hat man auf einer Partition zu wenig Speicherplatz, so kann mit quot(8) herausgefunden werden, welcher Benutzer viel Speicherplatz braucht und seine abgelegten Daten nicht benutzt.

quot(8) ist sowohl auf FreeBSD als auch auf OpenBSD im Basissystem enthalten.

Comments (5)  Permalink

Binäre Aktualisierung des Basissystems

Werden im FreeBSD Basissystem Sicherheitslücken gefunden, so kann man diese auch binär mit freebsd-update stopfen. In FreeBSD 6.2 und 7-CURRENT befindet sich freebsd-update im Basissystem, alle älteren Versionen können freebsd-update aus den Ports installieren:

# cd /usr/ports/security/freebsd-update && make install clean

Nun können noch gebrauchte Patches heruntergeladen werden:

# freebsd-update fetch

Wurden Patches gefunden, die noch nicht eingespielt wurden, so können diese nun installiert werden:

# freebsd-update install

Auch der Kernel wird aktualisiert, allerdings nur wenn man den GENERIC Kernel verwendet. Hat man einen selber zusammengestellten Kernel, so muss man den Quellcode aktualisieren und den Kernel selber neu bauen. Aber auch wenn man den Kernel mit freebsd-update aktualisiert, muss das System neu gestartet werden, damit der neue Kernel in Betrieb genommen wird.

Man kann freebsd-update auch in einen cron-Job aufnehmen. So wird regelmässig nach Aktualisierungen gesucht, diese Heruntergeladen und per Mail eine Meldung verschickt, dass neue Patches eingespielt werden können. Verwendet man ein System mit freebsd-update im Basissystem, so kann folgende Zeile in /etc/crontab eingetragen werden:

 0 5 * * * root /usr/sbin/freebsd-update cron

Verwendet man freebsd-update aus den Ports, so lautet der Pfad /usr/local/sbin/freebsd-update.

Related Entries:
Gespeicherte Optionen nach OptionsNG konvertieren
Ports-Subversion-Repository spiegeln
sysinstall-Ersatz für neuere FreeBSD-Versionen
Alte FreeBSD-Port Patchdateien aufsplitten
FreeBSD-Portbaum auf Fehler überprüfen
 Permalink

Befehle in der tcsh zu einer bestimmten Zeit ausführen

In der tcsh lassen sich Befehle zu einer bestimmten Zeit ausführen. Muss man zum Beispiel um 17:00 gehen, so kann man sich um 16:45 eine Warnung in der Shell ausgeben, um 17:00 den Shellpromt ändern und um 17:05 den Rechner automatisch herunterfahren lassen:

# sched 16:45 echo Du musst langsam gehen
# sched 17:00 set prompt="Los jetzt >"
# sched 17:05 shutdown -p +1 Ich hab Dich gewarnt

Die gespeicherten Befehle lassen sich mit sched ansehen:

# sched
1 16:45 echo Du musst langsam gehen
2 17:00 set prompt="Los jetzt >"
3 17:05 shutdown -p +1 Ich hab Dich gewarnt

Möchte man jetzt einen Befehl wieder entfernen, so benutzt man die Nummer, die von sched vor jeden Befehl angezeigt wird:

# sched -3
# sched
1 16:45 echo Du musst langsam gehen
2 17:00 set prompt="Los jetzt >"

Auch lässt sich die Zeit in Stunden und Minuten von der aktuellen Zeit her angeben:

# date 
Sa 13 Jan 2007 11:34:20 CET
# sched +0:5 echo xyz zurückrufen
# sched
1 11:39 echo xyz zurückrufen

Was man Bedenken sollte ist, dass wenn man die Shell schliesst, auch die gespeicherten Befehle weg sind.

Related Entries:
Wort in der tcsh löschen
Programm mit which finden
Liste der besuchten Verzeichnisse merken
foreach-Schleife in der tcsh
tcsh bei Inaktivität beenden
 Permalink

history der tcsh benutzen

Die tcsh merkt sich die zuletzt verwendeten Befehle, so dass man diese zu einem späteren Zeitpunkt wieder verwenden kann. Die ganze Liste der verwendeten Befehle kann wie folgt angeschaut werden:

# history
114 9:56 cd /tmp/
115 9:56 ls -aol
116 9:56 more test
117 9:57 ssh test.chruetertee.ch
118 9:57 history

Die Grösse der History kann für einen Benutzer in der ~/.cshrc oder für alle Benutzer in der /etc/csh.cshrc festgelegt werden:

set history = 1000

Auch kann festgelegt werden, wieviele Befehle bei einem Logout gespeichert werden sollen, damit sie beim nächsten Anmelden wieder zur Verfügung stehen:

set savehist = 100

Der zuletzt verwendete Befehl kann ganz einfach mit zwei Ausrufezeichen nochmals ausgeführt werden:

# !!
history
114 9:56 cd /tmp/
115 9:56 ls -aol
116 9:56 more test
117 9:57 ssh test.chruetertee.ch
118 9:57 history
119 9:58 history

Vor jedem Befehl in der History steht eine Nummer. So kann ein ganz bestimmter Befehl nochmals ausgeführt werden, indem man ein Ausrufezeichen und die Nummer des Befehls in der tcsh eingibt:

# !115
ls -aol

Gibt man ein Ausrufezeichen und einige Buchstaben ein, so wird der letzte Befehl ausgeführt, welcher mit diesen Buchstaben beginnt:

# !mo
more test

Möchte man nur den Befehl sehen und nicht ausführen, so hängt man ein Doppelpunkt und ein p an:

# !mo:p
more test

Mit einem Fragezeichen nach dem Ausrufezeichen wird der letzte Befehl ausgeführt, der die Zeichenfolge nach dem Fragezeichen beinhaltet:

# !?tmp
cd /tmp/

Auch lassen sich Befehle direkt mit einem sed nach einem Doppelpunkt bearbeiten. Folgendes Beispiel führt Befehl 117 aus, tauscht allerdings test mit bla aus:

# !117:s/test/bla/
ssh bla.chruetertee.ch
Related Entries:
Wort in der tcsh löschen
Programm mit which finden
Liste der besuchten Verzeichnisse merken
foreach-Schleife in der tcsh
tcsh bei Inaktivität beenden
 Permalink

Datei aufteilen

Soll eine Datei auf eine CD, ein ZIP-Drive oder eine Floppy gespeichert werden, ist aber für das Medium zu gross, so kann man die Datei mit split(1) aufteilen.

# split -b <Grösse der Teile> <Zu grosse Datei> <Dateinamen-Prefix der Teile>

Möchte man zum Beispiel die folgende Datei auf drei Floppys verteilen, so kann man dies wie folgt tun:

# ls -al dump.tar.gz 
-rw-r--r-- 1 root wheel 2719811 Dec 29 22:18 dump.tar.gz
# split -b 1m dump.tar.gz dump.part.
# ls -l dump.part.*
-rw-r--r-- 1 root wheel 1048576 Dec 29 22:23 dump.part.aa
-rw-r--r-- 1 root wheel 1048576 Dec 29 22:23 dump.part.ab
-rw-r--r-- 1 root wheel 622659 Dec 29 22:23 dump.part.ac

Nun wurden drei Dateien erzeugt, welche maximal 1 MB gross sind und auf den Floppys gespeichert werden können. Die Grösse der einzelnen Teile kann mit der -b Option bestimmt werden. Der Buchstabe nach der Zahl bestimmt die Einheit. Ein k bedeutet Kilobyte, ein m bedeutet Megabyte. Für Gigabyte gibt es allerdings keine Abkürzung.

Sollen die Teile nun wieder zusammengefügt werden, nimmt man cat(1) zu Hilfe:

# cat <Dateinamen-Prefix der Teile>* > <Dateinamen der ursprünglichen Datei>

Die Reihenfolge der Dateien wird automatisch anhand der Endungen der einzelnen Dateien erkannt. In diesem Beispiel würde dies folgendermassen aussehen:

# ls -al dump.*
-rw-r--r-- 1 root wheel 1048576 Dec 29 22:23 dump.part.aa
-rw-r--r-- 1 root wheel 1048576 Dec 29 22:23 dump.part.ab
-rw-r--r-- 1 root wheel 622659 Dec 29 22:23 dump.part.ac
# cat dump.part.* > dump.tar.gz
# ls -al dump.*
-rw-r--r-- 1 root wheel 1048576 Dec 29 22:23 dump.part.aa
-rw-r--r-- 1 root wheel 1048576 Dec 29 22:23 dump.part.ab
-rw-r--r-- 1 root wheel 622659 Dec 29 22:23 dump.part.ac
-rw-r--r-- 1 root wheel 2719811 Dec 29 22:31 dump.tar.gz
 Permalink
Prev Next251-260/325