BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

Prozesse als Baum darstellen

Möchte man darstellen, welcher Prozess von welchem gestartet wurde, so lässt sich dies mit pstree(1) tun.

pstree findet man sowohl auf FreeBSD als auch auf OpenBSD in den Ports unter sysutils/pstree.

Ruft man pstree ohne Optionen auf, so wird ein Baum aller für den Benutzer sichtbaren Prozesse gebildet:

# pstree
-+= 00000 root [swapper]
|-+= 00001 root /sbin/init --
| |--= 00166 root adjkerntz -i
| |--= 00248 root /usr/sbin/wpa_supplicant -B -q -i ath0 -c /etc/wpa_supplican
| |--= 00262 _dhcp dhclient: ath0 (dhclient)
| |--= 00368 root /sbin/devd
| |--= 00413 root /usr/sbin/syslogd -ss
| |--= 00438 root /usr/sbin/rpcbind
| |--= 00518 root /usr/sbin/powerd -a max -b min
| |--= 00536 root /usr/sbin/usbd
| |--= 00580 root /usr/sbin/sshd
| |--= 00587 root /usr/sbin/cron -s
| |--= 00625 root /usr/sbin/moused -p /dev/psm0 -t auto
| |-+- 00676 root /usr/X11R6/bin/xdm -nodaemon ttyv8
| | |--= 00679 root /usr/X11R6/bin/X -auth /usr/X11R6/lib/X11/xdm/authdir/auth
| | \-+= 00680 root xdm: :0 (xdm)
| | \-+= 00712 beat fluxbox
| | |--- 00715 beat gkrellm
| | |--- 00716 beat xscreensaver
| | |--- 00718 beat oneko -bsd
| | |-+= 00736 beat /bin/sh -c thunderbird
| | | \-+- 00737 beat /bin/sh /usr/X11R6/bin/thunderbird
...

Mit der -u <Benutzer> Option werden nur Zweige dargestellt, die auch Prozesse beinhalten, die unter dem angegebenen Benutzer laufen.

Mit der -U Option werden Zweige, die nur root-Prozesse beinhalten, nicht angezeigt

Wem die Darstellung von pstree nicht gefällt, sollte mal die -g 2 Option benützen.

Möchte man nur einen Zweig darstellen, der einen gewissen Prozess beinhaltet, so kann man entweder -s <Prozessname> oder -p <Prozess-ID> verwenden.

Alle Optionen erhält man mit pstree -h.

Comments (2)  Permalink

1 Jahr chruetertee.ch

Vor einem Jahr war es soweit, chruetertee.ch ging online.

1 Jahr chruetertee.ch

Ganz herzlich danken möchte ich Nina, für ihre Unterstützung, das Korrekturlesen der Artikel und die verschiedenen Graphiken sowie Alain, der mir eine Jail für chruetertee.ch zur Verfügung stellt und regelmässig Support für das Flux CMS bietet.

Auch danken möchte ich allen, die regelmässig hier lesen, Kommentare geschrieben oder mich kontaktiert haben, ohne nach Support zu fragen ;-)

Zur Feier des Tages gibt es alle Artikel des ersten Jahres, zum Teil überarbeitet und aktualisiert, als PDF zum herunterladen: http://www.chruetertee.ch/files/download/chruetertee-thermoskanne.pdf

Comments (2)  Permalink

Anzeigen welcher Host wieviel Bandbreite benutzt

Mit iftop(8) lassen sich die Verbindungen einer Netzwerkschnittstelle im Stile von top(1) anzeigen. Mit der -i Option kann man die Netzwerkschnittstelle angeben, die man beobachten will:

# iftop -i <Netzwerkschnittstelle>

Nun werden alle Verbindungen untereinander angezeigt und ein schwarzer Balken visualisiert die zur Zeit verwendete Bandbreite jeder Verbindung, welche jedoch in gesendete und empfangene Daten aufgeteilt ist. Zusätzlich werden am rechten Rand das Total der empfangenen und gesendeten Daten der letzten 40, 10 und 2 Sekunden angezeigt.

iftop

Am unteren Rand wird das Total aller Verbindungen der angezeigten Schnittstelle angezeigt. Da iftop die IP-Adressen in Hostnamen auflöst, ist es möglich, dass das Ergebnis von iftop verfälscht wird, da iftop nun selber Netzwerkverkehr generiert. Das Auflösen der IP-Adressen kann mit der -n Option unterbunden werden.

iftop kann nur als root ausgeführt werden. Auf FreeBSD befindet sich iftop unter net-mgmt/iftop in den Ports. Alle Optionen von iftop findet man in der Manpage iftop(8).

 Permalink

Notizen zur Konfiguration eines Servers mit FreeBSD 6.1

Das PDF mit Notizen zur Konfiguration eines Servers mit FreeBSD wurde auf FreeBSD 6.1 aktualisiert. Es kann unter http://www.chruetertee.ch/freebsd/ heruntergeladen werden. Dabei handelt es sich nicht um eine Schritt-für-Schritt Anleitung, sondern mehr um eine Sammlung von Möglichkeiten zur Konfiguration.

 Permalink

vi Fenster teilen

Im vi(1) lässt sich das Fenster teilen, so kann man gleichzeitig mehrere Dokumente bearbeiten. Um das Fenster zu teilen, muss man sich zuerst im Kommandomodus befinden (dies erreicht man, indem man die Esc-Taste drückt) und danach mit dem Doppelpunkt in den ex Modus wechselt und anschliessend E drückt. Nun wird das Fenster geteilt und in der neuen Hälfte das gleiche Dokument geöffnet.

Mit Ctrl + w kann man zwischen den beiden Fensterhälften wechseln. Nun kann man zum Beispiel mit :e <Dateiname> im aktiven Fenster eine neue Datei, mit dem angegebenen Dateinamen, anlegen.

Related Entries:
Treppeneffekt beim Einfügen von Text im vi verhindern
Rechtschreibprüfung im vi
Abkürzungen im vi benutzen
vi Makros benutzen
vi Kurzreferenz
 Permalink

Grösse eines Verzeichnisinhaltes bestimmen

Die Grösse eines Verzeichnisinhaltes lässt sich mit du(1) bestimmen. Mit der -c Option wird das Total aller Dateien angezeigt, mit der -h Option werden die Grössen in Kilo-, Mega- oder Gigabyte angezeigt. Beispiel:

# ls -l
total 2869856
-rw-r--r-- 1 beat users 529784832 7 Mai 20:50 6.1-RELEASE-i386-disc1.iso
-rw-r--r-- 1 beat users 548517888 5 Jun 15:25 7.0-CURRENT-200606-i386-disc1.iso
-rw-r--r-- 1 beat users 721241069 29 Sep 2005 KNOPPIX_V4.0.2CD-2005-09-23-DE.iso.gz
-rw-r--r-- 1 beat users 208437248 12 Feb 16:45 frenzy_v03_release.iso
-rw-r--r-- 1 beat users 209682432 9 Feb 2006 i386cd-3.0.iso
-rw-r--r-- 1 beat users 703017311 5 Sep 2005 install-x86-universal-2005.1.iso.gz
-rw-r--r-- 1 beat users 16425313 10 Jul 13:28 reactos0.3.0-RC1-live.zip
# du -ch
2,7G .
2,7G total

Möchte man nun in einem Verzeichnis herausfinden, welche Dateien am meisten Speicherplatz benötigen, so kann man du mit sort(1) kombinieren:

# du * | sort -n

Nun wird der Verzeichnisinhalt so sortiert, dass die grossen Dateien am Ende stehen:

# du  * | sort -n
16064 reactos0.3.0-RC1-live.zip
203680 frenzy_v03_release.iso
204896 i386cd-3.0.iso
517648 6.1-RELEASE-i386-disc1.iso
535952 7.0-CURRENT-200606-i386-disc1.iso
686896 install-x86-universal-2005.1.iso.gz
704720 KNOPPIX_V4.0.2CD-2005-09-23-DE.iso.gz

du(1) und sort(1) stehen beide auf FreeBSD und OpenBSD im Basissystem zur Verfügung.

 Permalink

Herausfinden welche Benutzer angemeldet sind

Es gibt verschiedene Möglichkeiten herauszufinden, welche Benutzer auf einem Rechner angemeldet sind.

Mit users(1) werden die angemeldeten Benutzer in alphabetischer Reihenfolge angezeigt:

# users
beat test

Mit who(1) werden zusätzlich noch der tty-Name, die Zeit des Logins und gegebenenfalls der Name des Hosts, von dem der Benutzer aus angemeldet ist, angezeigt:

# who
test ttyv0 11 Aug 19:18
beat ttyp1 11 Aug 16:42 (:0.0)
beat ttyp3 11 Aug 17:59 (:0.0)

Noch mehr Informationen erhält man mit w(1). Hier sieht man zusätzliche Informationen über das System, wie die Uptime und den System-Load. Zusätzlich wird bei allen Benutzern angezeigt, wie lange sie keine Eingabe mehr getätigt haben und welcher Befehl aktuell ausgeführt wird:

# w
7:38pm up 4:05, 3 users, load averages: 0,03 0,12 0,14
USER TTY FROM LOGIN@ IDLE WHAT
test v0 - 7:18pm 19 -
beat p1 :0.0 4:42pm 2 more
beat p3 :0.0 5:59pm - w

Möchte man herausfinden, welche Benutzer sich in letzter Zeit angemeldet haben, so kann man dies mit last(1) nachschauen:

# last
beat ttyp5 localhost Fr 11 Aug 19:50 - 19:51 (00:01)
test ttyv0 Fr 11 Aug 19:18 still logged in
beat :0 Fr 11 Aug 15:34 still logged in
reboot ~ Fr 11 Aug 15:33
shutdown ~ Fr 11 Aug 14:05
beat :0 Fr 11 Aug 14:00 - shutdown (00:05)
reboot ~ Fr 11 Aug 14:00
shutdown ~ Fr 11 Aug 12:43

users, who, w und last sind sowohl auf FreeBSD als auch auf OpenBSD im Basissystem vorhanden.

 Permalink

FreeBSD Service Jails mit unionfs erstellen

Mit Hilfe von Service Jails lassen sich gemeinsame Elemente einer Jail mit mehreren Jails teilen. Damit reduziert sich der Administrationsaufwand, da man zum Beispiel Sicherheitspatches des Basissystemes nur noch in der gemeinsamen Basis einspielen muss und nicht mehr in jeder Jail.

Inspiriert durch folgende Seite (http://simon.nitro.dk/service-jails.html) habe ich nun Service Jails mit Hilfe von unionfs erstellt.

Mit unionfs lässt sich ein Dateisystem über ein bestehendes mounten. Wird eine Datei aus dem unterliegenden System nicht durch eine gleichnamige Datei aus dem oberliegenden Dateisystem überdeckt, so ist diese auch im oberliegenden System sichtbar. Änderungen fliessen allerdings nur in das obere System ein.

Da die aktuelle unionfs-Implementation von FreeBSD recht fehlerhaft sein soll, verwenden wir gleich die neue unionfs-Implementation. Damit diese verwendet werden kann, müssen die aktuellen FreeBSD-Quelldateien der verwendeten FreeBSD Version in /usr/src vorhanden sein. Danach kann der Patch heruntergeladen, kompiliert und die neue Implemetation installiert werden:

# cd /usr/src
# fetch http://people.freebsd.org/~daichi/unionfs/unionfs6-p16.diff
# patch -p3 < unionfs6-p16.diff
# cp /usr/src/sys/fs/unionfs/union.h /usr/include/fs/unionfs/
# cd /usr/src/sbin/mount_unionfs/
# make obj depend && make && make install
# make clean
# cd /usr/src
# make buildkernel KERNCONF=<KERNEL-KONFIGURATION>
# make installkernel KERNCONF=<KERNEL-KONFIGURATION>
# shutdown -r now

Dieses Vorgehen läd den Patch 16 für FreeBSD 6 herunter. Man sollte sich vorher allerdings vergewissern, dass man das aktuelle Patchset für die zu verwendende FreeBSD-Version herunterläd.

Danach kann die gemeinsame Basis der Jails erstellt werden. Diese wird in einer 1GB grossen Datei erstellt, welche wiederum als Memory Disk gemountet wird. Der Portbaum wird aus dem Hostsystem in die Jailbasis verschoben und mit einem Symlink dem Hostsystem wieder zur Verfügung gestellt.

# mkdir /usr/jails/
# truncate -s 1G /usr/jails/base
# mdconfig -a -t vnode -f /usr/jails/base -u 0
# bsdlabel -w md0 auto
# newfs md0a
# mkdir -p /mnt/jails
# mkdir -p /mnt/jails/base
# mount /dev/md0a /mnt/jails/base/
# cd /usr/src/ && make installworld DESTDIR=/mnt/jails/base
# cd /usr/src/etc && make distribution DESTDIR=/mnt/jails/base

# mv /usr/ports /mnt/jails/base/usr/ports
# ln -s /mnt/jails/base/usr/ports /usr/ports

# /sbin/mount_unionfs -c transparent -b /usr/ports /mnt/jails/base/usr/ports
# touch /mnt/jails/base/etc/fstab

Nun kann die gemeinsame Basis nach eigenen Wünschen konfiguriert werden.

Danach kann eine Jail folgendermassen erzeugt werden:

# truncate -s <Grösse> /usr/jails/<Name>
# mdconfig -a -t vnode -f /usr/jails/<Name> -u <Nr>
# bsdlabel -w md<Nr> auto
# newfs md<Nr>a
# mkdir -p /mnt/jails/<Name>
# mount /dev/md<Nr>a /mnt/jails/<Name>

# mount_unionfs -c transparent -b /mnt/jails/base /mnt/jails/<Name>

# mount_devfs devfs /mnt/jails/<Name>/dev
# cd /mnt/jails/<Name>
# ln -sf /dev/null kernel

<Grösse> ist durch die Grösse der Datei zu ersetzen, in der man die Jail erzeugen will. Für zum Beispiel 2 GB gibt man hier 2G an. <Name> ist natürlich durch den Jailnamen zu ersetzen. Bei der ersten Jail ersetzt man <Nr> durch 1, bei der zweiten durch 2 usw.

Nun wird die Jail gestartet und kann konfiguriert werden:

# ifconfig <Interface> alias <IP-Adresse>/32
# jail /mnt/jails/<Name> <Name> <IP> /bin/sh

So können nun mehrere Jails erzeugt werden, die das gleiche Basissystem verwenden.

Da diese Variante für die Jails Dateien verwendet, die als RAM-Disk gemountet werden, müssen diese auch bei einem Neustart zuerst geladen werden, damit man nachher die Jails ganz normal über die rc.conf starten kann. Dazu wird unter /etc/rc.d/jails eine Datei mit folgendem Inhalt erstellt:

#!/bin/sh
#
# ----------------------------------------------------------------------------
# "THE BEER-WARE LICENSE" (Revision 42):
# <beat@chruetertee.ch> wrote this file. As long as you retain this notice you
# can do whatever you want with this stuff. If we meet some day, and you think
# this stuff is worth it, you can buy me a beer in return Beat Gätzi
# ----------------------------------------------------------------------------
#

# PROVIDE: jails
# REQUIRE: root mountcritlocal
# BEFORE: jail
# KEYWORD: shutdown

. /etc/rc.subr

name="jails"
rcvar=`set_rcvar`
start_cmd="jails_start"
stop_cmd="jails_stop"

jails_start()
{
echo 'Setting up jails environment'
/sbin/mdconfig -a -t vnode -f /usr/jails/base -u 0
/sbin/fsck -y /dev/md0a
/sbin/mount /dev/md0a /mnt/jails/base/
j=1
for i in ${jails_list}
do
/sbin/mdconfig -a -t vnode -f /usr/jails/${i} -u ${j}
/sbin/fsck -y /dev/md${j}a
/sbin/mount /dev/md${j}a /mnt/jails/${i}
/sbin/mount_unionfs -c transparent -b /mnt/jails/base /mnt/jails/${i}
j=`expr $j + 1`
done
}

jails_stop()
{
j=1
for i in ${jails_list}
do
/sbin/umount /mnt/jails/${i}
/sbin/umount /mnt/jails/${i}
/sbin/mdconfig -d -u ${j}
j=`expr $j + 1`
done
/sbin/umount /mnt/jails/base/
/sbin/mdconfig -d -u 0
}

load_rc_config $name
run_rc_command "$1"

Nun müssen die verschiedenen Jails noch in der jails_list Variable in der /etc/rc.conf eingetragen werden. Wichtig ist, dass die Namen mit den Namen im Pfad der Jails übereinstimmen. Beispiel:

Zwei Jails sind unter /mnt/jails/test1.chruetertee.ch und /mnt/jails/test2.chruetertee.ch installiert, so muss das Startskript aktiviert und die jails_list Variable folgendermassen gesetzt werden:

jails_enable="YES"
jails_list="test1.chruetertee.ch test2.chruetertee.ch"

Die Jails können nun ganz normal in der rc.conf konfiguriert werden und stehen bei einem Neustart automatisch zur Verfügung.

jail_enable="YES"
jail_list="test1 test2"
jail_test1_rootdir="/mnt/jails/test1.chruetertee.ch"
jail_test1_hostname="test1.chruetertee.ch"
jail_test1_ip="<IP>"
jail_test1_exec="/bin/sh /etc/rc"
jail_test1_devfs_enable="YES"
jail_test2_rootdir="/mnt/jails/test2.chruetertee.ch"
jail_test2_hostname="test2.chruetertee.ch"
jail_test2_ip="<IP>"
jail_test2_exec="/bin/sh /etc/rc"
jail_test2_devfs_enable="YES"

Diese Service Jails wurden mit FreeBSD 6.1 getestet und funktionieren bis jetzt hier auch. Allerdings ist diese Variante auf produktiven Systemen mit Vorsicht zu geniessen, da sowohl die neue unionfs-Implementierung als auch diese Variante noch nicht ausgiebig getestet worden sind!

Arbeitet man mit FreeBSD 6.1-RELEASE und mit den Jails sollte man unbedingt folgenden Hinweis beachten, da sich in FreeBSD 6.1-RELEASE ein Fehler in der /etc/rc.d/jail befindet: ftp://ftp.freebsd.org/pub/FreeBSD/ERRATA/notices/FreeBSD-EN-06:01.jail.asc

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

Benutzern temporär das Anmelden verbieten

Möchte man, zum Beispiel wegen Wartungsarbeiten, allen Benutzern das Anmelden verbieten, so kann man einfach die Datei /var/run/nologin erstellen und schon können sich alle Benutzer bis auf root nicht mehr anmelden. Enthält die Datei auch noch einen Text, so wird dieser angezeigt, wenn ein Benutzer versucht sich anzumelden:

# echo Wegen Wartungsarbeiten ist das Anmelden bis 22 Uhr nicht gestattet > /var/run/nologin

# ssh localhost
Wegen Wartungsarbeiten ist das Anmelden bis 22 Uhr nicht gestattet

Alle bereits angemeldeten Benutzer können jedoch weiterhin auf dem System arbeiten. Möchte man diese Benutzer vom System trennen, so kann man mit shutdown -k alle angemeldeten Benutzer bis auf root ausloggen.

Um das Anmelden wieder zu gestatten, muss einfach /var/run/nologin wieder entfernt werden:

# rm /var/run/nologin

Achtung: Hat man auf dem System das direkte Anmelden als root abgeschaltet, so ist nologin(5) mit Vorsicht zu geniessen, da man sich selber aus einem System aussperren kann!

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

Verzeichnis eines Rechners mittels SSH mounten

Mit Hilfe von FUSEFS-SSHFS lässt sich ein Verzeichnis eines entfernten Rechners auf einem lokalen Rechner mounten, wenn man einen SSH-Zugang zu diesem Rechner besitzt.

FUSEFS-SSHFS lässt sich einfach über die Ports installieren:

# cd /usr/ports/sysutils/fusefs-sshfs && make install

Da das FUSE-Kernelmodul gebraucht wird, muss der Kernelmodul-Suchpfad noch angepasst werden. Einfach folgende Zeile in der /etc/sysctl.conf anfügen:

kern.module_path="/boot/kernel;/boot/modules;/usr/local/modules"

Jetzt muss noch folgender Eintrag in der /etc/rc.conf gemacht werden:

fusefs_enable="YES"

Möchte man das SSHFS ohne einen Neustart gleich verwenden, so muss FUSE von Hand gestartet werden:

# sysctl kern.module_path="/boot/kernel;/boot/modules;/usr/local/modules"
# /usr/local/etc/rc.d/fusefs start

Danach kann ein Verzeichnis gemountet werden:

# sshfs -o idmap=user <Benutzername>@<Rechner>:<Verzeichnis> <Mountpunkt>

Alle Optionen von sshfs erhält man mit der -h Option:

# sshfs -h
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
Comments (3)  Permalink
Prev Next421-430/521