BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

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

Komprimierte Textdateien lesen

Möchte man eine mit gzip oder bzip2 komprimierte Datei anschauen, so muss man diese nicht zuerst mit gunzip oder bunzip2 entpacken, sondern kann diese direkt mit bzcat(1) oder gzcat(1) auslesen:

# echo Dies ist eine Testdatei > test
# gzip test
# gzcat test.gz
Dies ist eine Testdatei

# echo Dies ist eine andere Testdatei > test
# bzip2 test
# bzcat test.bz2
Dies ist eine andere Testdatei

Mit bzip2 komprimierte Dateien können auch direkt mit Hilfe von bzgrep gegrept werden.

bzcat, gzcat und bzgrep befinden sich sowohl auf FreeBSD als auch auf OpenBSD im Basissystem.

Comments (2)  Permalink

chruetertee-Suchplugin für den Firefox

Ich habe ein Suchplugin für den Firefox erstellt, mit dem man diese Seite durchsuchen kann. Als Grundlage für das Plugin habe ich das google-Suchplugin verwendet, welches schon mit dem Firefox installiert wurde.

Das Plugin kann ganz einfach installiert werden. Einfach folgende Dateien ins searchplugins-Verzeichnis, auf FreeBSD ist dies /usr/X11R6/lib/firefox/searchplugins, kopieren:

Danach muss der Firefox nur noch neu gestartet werden und schon kann man das Suchplugin verwenden.

Comments (1)  Permalink

Eingeloggte Benutzer beobachten

Für Schulungen oder wenn man einem eingeloggten Benutzer helfen möchte, ist es manchmal von Vorteil, wenn man die Terminalausgabe eines Benutzers sieht. Dafür gibt es watch(8). Ist das device snp nicht im Kernel vorhanden, so wird automatisch beim ersten Aufruf von watch das snp.ko-Kernelmodul geladen. Natürlich kann watch nur von root verwendet werden.

Zuerst muss man herausfinden, mit welchem Terminal (tty) der zu überwachende Benutzer arbeitet. Dies lässt sich mit w(1) herausfinden:

# w
5:22pm up 4:50, 4 users, load averages: 0,08 0,13 0,11
USER TTY FROM LOGIN@ IDLE WHAT
guest p1 :0.0 12:45pm 1 more
beat p2 :0.0 1:18pm 1 vi Makefile
beat p3 :0.0 4:46pm 36 csh
beat p4 :0.0 5:13pm 8 w

Möchte man jetzt das Terminal (ttyp1) des Benutzers guest beobachten, so kann man das als root wie folgt tun:

# watch ttyp1

Nun sieht man alle Ein- und Ausgaben des Benutzers guest auf ttyp1. watch beendet man mit Ctrl + G. Mit Ctrl + W löscht man die Ausgabe auf dem Bildschirm und mit Ctrl + X kann man auf ein anderes Terminal wechseln.

Möchte man zusätzlich auch Eingaben auf dem Terminal des Benutzers machen können, so kann man watch mit der -W Option aufrufen:

# watch -W ttyp1
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

Mit Xinerama zwei Bildschirme an einem Rechner verwenden

Mit Hilfe von Xinerama kann man mit einem Windowmanager mehrere Graphikkarten und Bildschirme benutzen. Fluxbox besitzt eine Xinerama Unterstützung. Auf FreeBSD kann man diese beim Installieren wie folgt aktivieren:

# cd /usr/ports/x11-wm/fluxbox-devel && make -DWITH_XINERAMA install

Danach als root eine xorg.conf erstellen lassen:

# X -configure

Wurde alles richtig erkannt, muss die erstellte xorg.conf nun noch angepasst werden. In der Section "ServerLayout" ist folgende Option einzutragen:

Option "Xinerama" "true"

Das TastaturLayout muss auch noch richtig gesetzt und die gewünschten Auflösungen konfiguriert werden.

Danach kann Fluxbox schon mit zum Beispiel zwei Monitoren verwendet werden.

Folgende Komponenten wurden verwendet:

Ergebnis:

Xinerama

Related Entries:
Umlaute nach X.Org Update von 6.8.2 auf 6.9.0
X.Org: could not open default font "fixed"
Auflösung unter X.Org während des Betriebes ändern
Gespeicherte Optionen nach OptionsNG konvertieren
Ports-Subversion-Repository spiegeln
 Permalink
Prev Next31-40/91