FreeBSD, VNC, Jail · 4 min read · Jan 24, 2026

Erstellen eines Jails mit VNC-Server auf FreeBSD

Erstellen eines Jails mit VNC-Server auf FreeBSD

Dieser Artikel erklärt, wie Sie einen VNC-Server innerhalb eines Jails auf FreeBSD ausführen können.

Erstellen eines Jails aus dem Quellcode:

Erstellen Sie ein Verzeichnis, in dem unsere Jails gespeichert werden:

# mkdir -p /home/jails

Oder im /usr-Verzeichnis:

# mkdir -p /usr/jails
# mkdir /home/jails/testjail

Gehen Sie zum Verzeichnis /usr/src und überprüfen Sie, ob Sie den FreeBSD-Quellcode haben.

# cd /usr/src
# ls

Sie sollten etwas sehen wie:

COPYRIGHT               contrib                 release
LOCKS                   crypto                  rescue
MAINTAINERS             etc                     sbin
Makefile                games                   secure
Makefile.inc1           gnu                     share
ObsoleteFiles.inc       include                 sys
README                  kerberos5               tools
UPDATING                lib                     usr.bin
bin                     libexec                 usr.sbin

Wenn Sie ein leeres Verzeichnis oder nur ein sys-Verzeichnis haben, müssen Sie den FreeBSD-Quellcode installieren:
Sie können dies tun, indem Sie sysinstall ausführen oder den Quellcode von cvs herunterladen.

# sysinstall

Gehen Sie zu Konfiguration, dann zu Distributionen und wählen Sie “src” und drücken Sie OK. Danach sollten Sie den gesamten Quellcode im Verzeichnis /usr/src/ haben. Dann sollten Sie Ihren Quellcode mit der neuesten Version von cvs aktualisieren. Sie müssen eine Datei “stable-supfile” in Ihrem Home-Verzeichnis oder an einem anderen Ort erstellen.

# vi ~/stable-supfile

Und fügen Sie einige Zeilen wie diese ein:

# Ihr nächster Mirror des FreeBSD-Quellcodes, für mich ist es aus Polen
*default host=cvsup.pl.FreeBSD.org
*default base=/usr
*default prefix=/usr
# für Version 7.2 von FreeBSD geben Sie RELENG_7_2 7.1 - RELENG_7_1 7.0 - RELENG_7_0 6.4 RELENG_6_4 ein
*default release=cvs tag=RELENG_7_2
*default delete use-rel-suffix
*default compress
src-all

Nachdem Sie die Datei gespeichert haben, können Sie Ihren FreeBSD-Quellcode mit csup aktualisieren:

# csup /root/stable-supfile

Danach können Sie Ihr Jail aus dem Quellcode kompilieren:

# cd /usr/src
# make world DESTDIR=/home/jails/testjail
# make distribution DESTDIR=/home/jails/testjail

Wenn Sie einmal die Welt kompiliert haben, können Sie neue Jails mit zwei Befehlen erstellen, ohne die Welt erneut zu kompilieren:

# make installworld DESTDIR=/home/jails/otherjail
# make distribution DESTDIR=/home/jails/otherjail

Wenn Ihr Jail vorbereitet ist, müssen Sie einige Änderungen in einigen Konfigurationsdateien vornehmen.

# vi /home/jails/testjail/etc/rc.conf

Und Sie fügen dort ein:

sendmail_enable="NONE"
sshd_enable="YES"
# cp /etc/resolv.conf /home/jails/testjail/etc/
# touch /home/jails/testjail/etc/fstab

Jail zum ersten Mal ausführen:

Um das Jail auszuführen, müssen Sie devfs ins Jail einhängen:

# mount -t devfs devfs /home/jails/testjail/dev

Dann müssen Sie ein Alias für Ihre Netzwerkschnittstelle konfigurieren. In meinem FreeBSD habe ich die bge0-Schnittstelle und das Alias erstelle ich so:

# ifconfig bge0 alias 192.168.2.2

Jail ausführen:

# jail /home/jails/testjail shell 192.168.2.2 /bin/tcsh

Wenn Sie im Jail sind, können Sie ein Root-Passwort festlegen:

# passwd

Dann müssen Sie ein nicht-root-Konto hinzufügen, das Ihnen den Zugriff auf das Jail über ssh ermöglicht.

# adduser

Um das Jail zu verlassen, müssen Sie den Befehl exit verwenden.

# exit

Ihr Jail ist fast bereit. Sie müssen einige Zeilen zur Datei /etc/rc.conf hinzufügen, und danach wird Ihr Jail gestartet, wenn Ihr Server startet.

# Alias zu Ihrer Netzwerkschnittstelle
ifconfig_bge0_alias0="192.168.2.2"
# Zeile, die Jails in FreeBSD aktiviert
jail_enable="yes"
# Liste Ihrer Jails z.B. "testjail otherjail httpjail sshjail"
jail_list="testjail"
jail_testjail_rootdir="/home/jails/testjail"
jail_testjail_hostname="testjail"
jail_testjail_ip="192.168.2.2"
jail_testjail_exec_start="/bin/sh /etc/rc"
jail_testjail_exec_stop="/bin/sh /etc/rc.shutdown"
jail_testjail_devfs_enable="YES"

Wenn Sie den Ports-Baum im Jail haben möchten und ihn nicht replizieren möchten, können wir das Verzeichnis /usr/ports/ mit einer Zeile in der Datei /etc/fstab ins Jail einhängen. Zeile wie diese:

/usr/ports              /home/jails/testjail/usr/ports/         nullfs  rw,auto 0 0

Starten und Stoppen von Jails ohne das System neu zu starten:

# /etc/rc.d/jail start testjail
# /etc/rc.d/jail stop testjail

Wenn Sie eine Liste Ihrer Jails erhalten möchten, können Sie dies mit diesem Befehl tun:

# jls

Installation von xorg und vnc im Jail aus Paketen:

# pkg_add –r xorg
# pkg_add –r vnc

Um vnc unter einem Benutzerkonto auszuführen, schreiben Sie:

$ vncserver

Wenn Sie vncserver zum ersten Mal ausführen, müssen Sie ein Passwort für die vnc-Verbindung festlegen.

Standardmäßig wird beim Verbinden mit vnc twm ausgeführt. Sie können dies ändern, indem Sie die Datei ~/.vnc/xstartup bearbeiten. Sie müssen die letzte Zeile von „twm &“ in z.B. „wmaker &“ für die WindowMaker-Umgebung ändern.

Um sich mit dem vnc-Jail zu verbinden, müssen Sie in vncviewer jail_ip_address und vnc port eingeben. Z.B. 192.168.2.2:1

Einige Fehler mit vnc im Jail: Wenn Sie eine Nachricht über nicht erkannte Farben erhalten, müssen Sie die Datei /usr/local/bin/vncserwer bearbeiten und die Zeile ändern:

$cmd .= " -co /usr/X11R6/lib/X11/rgb";  

Wenn wir die Nachricht haben
!!!!!!!!!!!!!!!!!!!!!!!!!!
kein freies Display auf jailname

Müssen Sie /usr/local/bin/vncserver bearbeiten und die pack-Funktion in zwei Zeilen in der Funktion CheckDisplayNumber in sockaddr_in ändern:

[…]
pack ---> sockaddr_in(6000 +$n, &INADDR_ANY))) {
[…]
pack ---> sockaddr_in(5900 +$n, &INADDR_ANY))) {
[…]

Der Code sollte so aussehen:

sub CheckDisplayNumber
{
    local ($n) = @_; 
    socket(S, $AF_INET, $SOCK_STREAM, 0) || die "$prog: socket failed: $!\n";
    eval 'setsockopt(S, &SOL_SOCKET, &SO_REUSEADDR, pack("l", 1))';
    if (!bind(S, sockaddr_in(6000 + $n, &INADDR_ANY))) {
        close(S);
        return 0;
    }
    close(S);
    socket(S, $AF_INET, $SOCK_STREAM, 0) || die "$prog: socket failed: $!\n";
    eval 'setsockopt(S, &SOL_SOCKET, &SO_REUSEADDR, pack("l", 1))';
    if (!bind(S, sockaddr_in(5900 + $n, &INADDR_ANY))) {
        close(S);
        return 0;
    }
    close(S);

Portweiterleitung in IPFW für Jails

Wenn Sie einige Ports an das Jail weiterleiten möchten, müssen Sie einen FreeBSD-Kernel mit aktivierten Optionen kompiliert haben:

options  IPFIREWALL
options  IPFIREWALL_DEFAULT_TO_ACCEPT
options  IPFIREWALL_VERBOSE
options  IPFIREWALL_FORWARD
options  IPDIVERT

Portweiterleitungsregel:

ipfw add fwd ip_adres_jail,port_jail tcp from any to adresip_local port_local
z.B.
ipfw add fwd 192.168.2.2,21 tcp from any to me 21
ipfw add fwd 192.168.2.2,21 tcp from any to 72.46.154.23 21

``
Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.