FreeBSD Remote Installation

Lizenz: Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)

Verfasser: Markus Kohlmeyer | Letzte Aktualisierung: | Veröffentlicht:

Beitragende: Jesco Freund, Eckhard Doll, Olaf Uecker

Einleitung

In diesem HowTo beschreibe ich step-by-step die Remote Installation von FreeBSD 64Bit mittels mfsBSD auf einem dedizierten Server, auch RootServer genannt. Um eine weitere Republikation der offiziellen FreeBSD Dokumentation zu vermeiden, werde ich in diesem HowTo nicht alle Punkte bis ins Detail erläutern.

Vielen Dank für Dein Vertändnis.


Folgende Punkte sind in diesem HowTo zu beachten.

  • Alle Dienste werden mit einem möglichst minimalen und bewährten Funktionsumfang installiert.
  • Alle Dienste werden mit einer möglichst sicheren und dennoch flexiblen Konfiguration versehen.
  • Alle Konfigurationen sind selbstständig auf notwendige individuelle Anpassungen zu kontrollieren.
  • Alle Passworte werden als @PASSWORD@ dargestellt und sind selbstständig durch sichere Passworte zu ersetzen.
  • Die Domain des Servers lautet example.org und ist selbstständig durch die eigene Domain zu ersetzen.
  • Der Hostname des Servers lautet srv und ist selbstständig durch den eigenen Hostnamen zu ersetzen (FQDN=srv.example.org).
  • Es wird der FQDN srv.example.org verwendet und ist selbstständig im DNS zu registrieren.

Das Referenzsystem

Als Referenzsystem für dieses HowTo habe ich mich für eine virtuelle Maschine auf Basis von Oracle VM VirtualBox unter Microsoft Windows 7 SP1 Professional 64Bit entschieden. So lässt sich ohne grösseren Aufwand ein handelsüblicher dedizierter Server, auch RootServer genannt, simulieren und anschliessend kann diese virtuelle Maschine als kostengünstiges lokales Testsystem weiter genutzt werden.

Trotzdem habe ich dieses HowTo so ausgelegt, dass es sich nahezu unverändert auf dedizierte Server übertragen lässt und dieses auch auf mehreren RootServern getestet.

Leider bringt Microsoft Windows keinen eigenen SSH-Client mit, so dass ich auf das sehr empfehlenswerte PuTTY zurückgreife. Zur Simulation des bei nahezu allen Anbietern dedizierter Server (RootServer) vorhandene Rettungssystem, nachfolgend RescueSystem genannt, wird in diesem HowTo die auf Gentoo Linux basierende SystemRescueCD eingesetzt.

VirtualBox und PuTTY werden mit den jeweiligen Standardoptionen installiert und (sofern noch nicht geschehen) deren Installationspfade der Umgebungvariablen PATH des aktuell angemeldeten Windows-Users hinzugefügt. Dazu öffnen wir die Eingabeaufforderung und setzen folgenden Kommandozeilen-Befehl ab.

SETX PATH "%PATH%;%ProgramFiles(x86)%\PuTTY;%ProgramFiles%\Oracle\VirtualBox"

Da neue beziehungsweise geänderte Umgebungvariablen in der jeweils aktuellen Eingabeaufforderung noch nicht gültig sind, wird die Eingabeaufforderung nun wieder geschlossen.

Die Virtuelle Maschine

Als Erstes öffnen wir eine neue Eingabeaufforderung und legen manuell eine neue virtuelle Maschine an. Diese virtuelle Maschine bekommt den Namen FreeBSD und wird mit einem Dual-Core Prozessor, Intels ICH9-Chipsatz, 2048MB RAM, 32MB VideoRAM, zwei 64GB SATA-Festplatten, einem DVD-Player, einer Intel-Netzwerkkarte, einem IDE-Controller sowie einem SATA-Controller ausgestattet. Zudem setzen wir die RTC (Real-Time Clock) der virtuellen Maschine auf UTC (Coordinated Universal Time), aktivieren den HPET (High Precision Event Timer) und legen die Bootreihenfolge fest.

VBoxManage createvm --name "FreeBSD" --ostype FreeBSD_64 --register

cd "%USERPROFILE%\VirtualBox VMs\FreeBSD"

VBoxManage createmedium disk --filename "FreeBSD1.vdi" --format VDI --size 64536
VBoxManage createmedium disk --filename "FreeBSD2.vdi" --format VDI --size 64536

VBoxManage modifyvm "FreeBSD" --cpus 2 --cpuexecutioncap 50 --cpuhotplug off --hwvirtex on
VBoxManage modifyvm "FreeBSD" --firmware bios --chipset ICH9 --memory 2048 --vram 32 --hpet on --rtcuseutc on
VBoxManage modifyvm "FreeBSD" --nic1 nat --nictype1 82540EM --natnet1 "192.168/16" --cableconnected1 on
VBoxManage modifyvm "FreeBSD" --boot1 dvd --boot2 disk --boot3 none --boot4 none

VBoxManage storagectl "FreeBSD" --name "IDE Controller" --add ide --controller ICH6 --bootable on
VBoxManage storagectl "FreeBSD" --name "SATA Controller" --add sata --controller IntelAHCI --portcount 4 --bootable on

VBoxManage storageattach "FreeBSD" --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium "FreeBSD1.vdi"
VBoxManage storageattach "FreeBSD" --storagectl "SATA Controller" --port 1 --device 0 --type hdd --medium "FreeBSD2.vdi"

Die virtuelle Maschine, genauer die virtuelle Netzwerkkarte, kann dank NAT zwar problemlos mit der Aussenwelt, aber leider nicht direkt mit dem Hostsystem kommunizieren. Aus diesem Grund richten wir nun für den SSH-Zugang noch ein Portforwarding ein, welches den Port 2222 des Hostsystems auf den Port 22 der virtuellen Maschine weiterleitet.

VBoxManage modifyvm "FreeBSD" --natpf1 "VBoxSSH,tcp,,2222,,22"

Nachdem die virtuelle Maschine nun konfiguriert ist, wird es Zeit diese zu booten.

RescueSystem booten

Um unser mfsBSD Image installieren zu können, müssen wir unsere virtuelle Maschine mit einem RescueSystem booten. Hierfür eignet sich die auf Gentoo Linux basierende SystemRescueCD am Besten, welche wir mittels des mit Windows mitgelieferten FTP-Client herunterladen und unserer virtuellen Maschine als Bootmedium zuweisen.

cd "%USERPROFILE%\VirtualBox VMs\FreeBSD"

ftp -A ftp.mirrorservice.org
cd sites/download.sourceforge.net/pub/sourceforge/s/sy/systemrescuecd/sysresccd-x86/4.7.1
binary
get systemrescuecd-x86-4.7.1.iso
quit

VBoxManage storageattach "FreeBSD" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium "systemrescuecd-x86-4.7.1.iso"

Wir können das RescueSystem jetzt booten.

VBoxManage startvm "FreeBSD"

Im Bootmenü wählen wir die erste Option "boot with default options" aus.

Wer mit dem amerikanischen Tastaturlayout nicht zurechtkommt, sollte während des Bootens die Frage nach der Keymap mit de beantworten.

Ist der Bootvorgang abgeschlossen, wird als Erstes das root-Passwort für das RescueSystem gesetzt.

passwd root

Jetzt sollten wir uns mittels PuTTY als root in das RescueSystem einloggen und mit der Installation unseres mfsBSD Image fortfahren können.

putty -ssh -P 2222 root@127.0.0.1

mfsBSD installieren

Um unsere umfangreichen Vorbereitungen nun abzuschliessen, müssen wir nur noch unser mfsBSD Image installieren und booten.

Als Erstes kopieren wir mittels PuTTYs SCP-Client (pscp) das mfsBSD Image in das RescueSystem.

pscp -P 2222 "%USERPROFILE%\VirtualBox VMs\mfsBSD\mfsbsd-10.3-RELEASE-amd64.img" root@127.0.0.1:/tmp/mfsbsd-10.3-RELEASE-amd64.img

Jetzt können wir das mfsBSD Image mittels dd auf der ersten Festplatte (/dev/sda) unserer virtuellen Maschine installieren und uns anschliessend wieder aus dem RescueSystem ausloggen.

dd if=/dev/zero of=/dev/sda count=100 bs=1M

dd if=/tmp/mfsbsd-10.3-RELEASE-amd64.img of=/dev/sda bs=1M

exit

Abschliessend stoppen wir die virtuelle Maschine vorübergehend und entfernen die SystemRescueCD aus dem virtuellen DVD-Laufwerk.

VBoxManage controlvm "FreeBSD" poweroff
VBoxManage storageattach "FreeBSD" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium emptydrive

FreeBSD installieren

Nachdem nun alle Vorbereitungen abgeschlossen sind, können wir endlich mit der eigentlichen FreeBSD Remote Installation beginnen, indem wir die virtuelle Maschine wieder booten.

VBoxManage startvm "FreeBSD"

Jetzt sollten wir uns mittels PuTTY als root mit dem Passwort mfsroot in das mfsBSD Image einloggen und mit der Installation von FreeBSD beginnen können.

putty -ssh -P 2222 root@127.0.0.1

Partitionieren der Festplatte

Bevor wir anfangen, bereinigen wir die Festplatten von jeglichen Datenrückständen, indem wir sie mit Nullen überschreiben. Je nach Festplattengrösse kann dies einige Stunden bis Tage in Anspruch nehmen. Aus diesem Grund verlegen wir diese Jobs mittels nohup in den Hintergrund, so dass wir uns zwischenzeitlich ausloggen können ohne dass dabei die Jobs automatisch von der Shell abgebrochen werden. Ob die Jobs fertig sind, lässt dann mittels ps -auxfwww und top -atCP ermitteln.

nohup dd if=/dev/zero of=/dev/ada0 bs=1M  &
nohup dd if=/dev/zero of=/dev/ada1 bs=1M  &

Da jeder Administrator andere Präferenzen an sein Partitionslayout stellt und wir andernfalls mit diesem HowTo nicht weiterkommen, verwenden wir im Folgenden ein Standard-Partitionslayout. Fortgeschrittenere FreeBSD-Administratoren können dieses Partitionslayout selbstverständlich an ihre eigenen Bedürfnisse anpassen.

Partition Mountpunkt Filesystem Grösse
/dev/mirror/root / UFS2 32 GB
/dev/mirror/data /data UFS2 24 GB
/dev/mirror/swap none SWAP 4 GB

Als Erstes müssen wir die Festplatte partitionieren, was wir mittels gpart erledigen werden. Zuvor müssen wir dies aber dem Kernel mittels sysctl mitteilen, da er uns andernfalls dazwischenfunken würde.

Wir werden auf beiden Festplatten jeweils vier Partitionen anlegen, die Erste für den Bootcode, die Zweite als Systempartition, die Dritte für unsere Nutzdaten und die Vierte als SWAP. Dabei werden wir die Partitionen auch gleich für modernere Festplatten mit 4K-Sektoren optimieren und statt den veralteten "MBR Partition Tables" die aktuelleren "GUID Partition Tables (GPT)" verwenden.

sysctl kern.geom.debugflags=0x10

gpart destroy -F ada0
gpart destroy -F ada1

gpart create -s gpt ada0
gpart create -s gpt ada1

gpart add -t freebsd-boot -b 4096 -s 512 -a 4096 ada0
gpart add -t freebsd-ufs  -b 8192 -s 32G -a 4096 ada0
gpart add -t freebsd-ufs          -s 24G -a 4096 ada0
gpart add -t freebsd-swap         -s  4G -a 4096 ada0

gpart add -t freebsd-boot -b 4096 -s 512 -a 4096 ada1
gpart add -t freebsd-ufs  -b 8192 -s 32G -a 4096 ada1
gpart add -t freebsd-ufs          -s 24G -a 4096 ada1
gpart add -t freebsd-swap         -s  4G -a 4096 ada1

Für eine leicht erhöhte Datensicherheit legen wir mittels gmirror ein Software-RAID1 an.

kldload geom_mirror

gmirror label -b load root ada0p2 ada1p2
gmirror label -b load data ada0p3 ada1p3
gmirror label -b prefer -F swap ada0p4 ada1p4

Formatieren der Partitionen

Nun müssen wir noch die Systempartition und die Partition für die Nutzdaten mit "UFS2" und einer 4K-Blockgrösse formatieren und aktivieren auch gleich die "journaled soft-updates".

newfs -O2 -U -f 4096 /dev/mirror/root
newfs -O2 -U -f 4096 /dev/mirror/data

tunefs -n enable /dev/mirror/root
tunefs -n enable /dev/mirror/data

# journaled soft-updates
# FIXME: buggy since 10.0-RELEASE
#tunefs -j enable /dev/mirror/root
#tunefs -j enable /dev/mirror/data

tunefs -l enable /dev/mirror/root
tunefs -l enable /dev/mirror/data

tunefs -a enable /dev/mirror/root
tunefs -a enable /dev/mirror/data

Mounten der Partitionen

Die Partitionen mounten wir unterhalb von /mnt.

mount -t ufs /dev/mirror/root /mnt
mkdir -p /mnt/data
mount -t ufs /dev/mirror/data /mnt/data

Installation der Chroot-Umgebung

Auf die gemounteten Partitionen entpacken wir ein FreeBSD Basesystem mit dem wir problemlos weiterarbeiten können. Je nach Auslastung des FreeBSD FTP-Servers kann dies ein wenig dauern, bitte nicht ungeduldig werden.

fetch -4 -q -o - http://ftp.de.freebsd.org/pub/FreeBSD/releases/amd64/amd64/10.3-RELEASE/base.txz   | tar Jxpvf - -C /mnt/
fetch -4 -q -o - http://ftp.de.freebsd.org/pub/FreeBSD/releases/amd64/amd64/10.3-RELEASE/kernel.txz | tar Jxpvf - -C /mnt/
fetch -4 -q -o - http://ftp.de.freebsd.org/pub/FreeBSD/releases/amd64/amd64/10.3-RELEASE/src.txz    | tar Jxpvf - -C /mnt/
cp -a /mnt/boot/kernel /mnt/boot/GENERIC

Unser System soll natürlich auch von den Festplatten booten können, weshalb wir jetzt den Bootcode und Bootloader in den Bootpartitionen installieren.

gpart bootcode -b /mnt/boot/pmbr -p /mnt/boot/gptboot -i 1 ada0
gpart bootcode -b /mnt/boot/pmbr -p /mnt/boot/gptboot -i 1 ada1

gpart set -a bootme -i 2 ada0
gpart set -a bootme -i 2 ada1

Vorbereiten der Chroot-Umgebung

Vor dem Wechsel in die Chroot-Umgebung müssen wir noch die resolv.conf in die Chroot-Umgebung kopieren und das Device-Filesysteme dorthin mounten.

cp /etc/resolv.conf /mnt/etc/resolv.conf

mount -t devfs devfs /mnt/dev

Betreten der Chroot-Umgebung

Das neu installierte System selbstverständlich noch konfiguriert werden, bevor wir es nutzen können. Dazu werden wir jetzt in das neue System chrooten und eine minimale Grundkonfiguration vornehmen.

Beim Betreten der Chroot-Umgebung setzen wir mittels /usr/bin/env -i erstmal alle Environment-Variablen zurück. Andererseits benötigen wir aber die Environment-Variablen HOME und TERM, welche wir manuell auf sinnvolle Defaults setzen.

chroot /mnt /usr/bin/env -i HOME=/root TERM=$TERM /bin/tcsh

cd /root

Zeitzone und NTP-Synchronisierung einrichten

Zunächst setzen wir die Systemzeit (CMOS clock) mittels tzsetup auf "UTC", die "Region" auf Europe, das "Country" auf Germany und "CET" beziehungsweise "CEST" trifft ebenfalls zu.

/usr/sbin/tzsetup

Die NTP-Synchronisierung kann mit einem einfachen Eintrag in der Crontab bewerkstelligt werden.

cat >> /etc/crontab << "EOF"
59      2       *       *       *       root    /usr/sbin/ntpdate -4 -b -s ptbtime2.ptb.de
"EOF"

Locale einrichten

Auf Servern sollte für Systemuser eine amerikanisch-englische Locale mit Unicode (UTF-8) verwendet werden. Wir bearbeiten hierzu mit dem Editor ee (ee /etc/login.conf) in der Datei /etc/login.conf die Login-Klasse default, indem wir vor der letzten Zeile folgende Zeilen hinzufügen.

        :charset=UTF-8:\
        :lang=en_US.UTF-8:\

Anschliessend muss die Datei in eine Systemdatenbank umgewandelt werden.

cap_mkdb /etc/login.conf

Nach dem nächsten Login sollte der Befehl locale die folgende Ausgabe liefern.

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=

Shell einrichten

Unter FreeBSD ist die Tenex C Shell (TCSH) die Standard-Shell. Für Bash-gewohnte Linux-User ist diese Shell etwas gewöhnungsbedürftig, und natürlich kann man sie später auch gegen eine andere Shell austauschen (im Basis-System ist neben der TCSH auch eine ASH enthalten). Skripte würde ich persönlich für die TCSH eher nicht schreiben, aber für die tägliche Administrationsarbeit ist die TCSH ein sehr brauchbares Werkzeug – wenn man sie erst mal etwas umkonfiguriert hat. Dies tun wir jetzt.

# Colorize console output
cat >> /etc/csh.cshrc << "EOF"
setenv LSCOLORS "Dxfxcxdxbxegedabagacad"
alias ls        ls -GF
alias l         ls -lhaGF
"EOF"

# Use ee instead of vi as standard editor
sed -e 's/\(EDITOR[[:space:]]*\)vi[[:space:]]*$/\1ee/' -i '' /root/.cshrc

# Use less instead of more as standard pager
sed -e 's/\(PAGER[[:space:]]*\)more[[:space:]]*$/\1less/' -i '' /root/.cshrc

# Use meaningfuller prompt
sed -e 's/\(set prompt =\).*$/\1 "[%B%n%b@%B%m%b:%B%~%b] %# "/' -i '' /root/.cshrc



# Set root shell to /bin/tcsh
chsh -s /bin/tcsh root

Systemsicherheit verstärken

Die hier vorgestellten Massnahmen sind äusserst simple Basics, die aus Hygienegründen auf jedem FreeBSD System selbstverständlich sein sollten. Um ein FreeBSD System richtig zu härten (Hardened), kommt man jedoch nicht an komplexeren Methoden wie Security Event Auditing und Mandatory Access Control vorbei. Diese Themen werden im FreeBSD Handbuch recht ausführlich besprochen; für den Einstieg empfehle ich hier die Lektüre von Kapitel 14 (Security), für die weiterführenden Themen die Kapitel 16 (Mandatory Access Control) und Kapitel 17 (Security Event Auditing).

OpenSSH konfigurieren

Da wir gerade ein Produktiv-System aufsetzen, werden wir den SSH-Dienst recht restriktiv konfigurieren, unter Anderem werden wir den Login per Passwort verbieten und nur per PublicKey zulassen.

sed -e 's|^#\(Port\).*$|\1 22|' \
    -e 's|^#\(Protocol\).*$|\1 2|' \
    -e 's|^#\(HostKey /etc/ssh/ssh_host_rsa_key\).*$|\1|' \
    -e 's|^#\(HostKey /etc/ssh/ssh_host_ecdsa_key\).*$|\1|' \
    -e 's|^#\(HostKey /etc/ssh/ssh_host_ed25519_key\).*$|\1|' \
    -e 's|^#\(RekeyLimit\).*$|\1 500M 1h|' \
    -e 's|^#\(LoginGraceTime\).*$|\1 1m|' \
    -e 's|^#\(PermitRootLogin\).*$|\1 yes|' \
    -e 's|^#\(StrictModes\).*$|\1 yes|' \
    -e 's|^#\(MaxAuthTries\).*$|\1 3|' \
    -e 's|^#\(MaxSessions\).*$|\1 10|' \
    -e 's|^#\(RSAAuthentication\).*$|\1 no|' \
    -e 's|^#\(PubkeyAuthentication\).*$|\1 yes|' \
    -e 's|^#\(IgnoreRhosts\).*$|\1 yes|' \
    -e 's|^#\(PasswordAuthentication\).*$|\1 yes|' \
    -e 's|^#\(PermitEmptyPasswords\).*$|\1 no|' \
    -e 's|^#\(ChallengeResponseAuthentication\).*$|\1 no|' \
    -e 's|^#\(UsePAM\).*$|\1 no|' \
    -e 's|^#\(AllowAgentForwarding\).*$|\1 no|' \
    -e 's|^#\(AllowTcpForwarding\).*$|\1 no|' \
    -e 's|^#\(GatewayPorts\).*$|\1 no|' \
    -e 's|^#\(X11Forwarding\).*$|\1 no|' \
    -e 's|^#\(PermitTTY\).*$|\1 yes|' \
    -e 's|^#\(PrintMotd\).*$|\1 yes|' \
    -e 's|^#\(TCPKeepAlive\).*$|\1 yes|' \
    -e 's|^#\(UseLogin\).*$|\1 no|' \
    -e 's|^#\(UsePrivilegeSeparation\).*$|\1 sandbox|' \
    -e 's|^#\(PermitUserEnvironment\).*$|\1 no|' \
    -e 's|^#\(Compression\).*$|\1 delayed|' \
    -e 's|^#\(ClientAliveInterval\).*$|\1 10|' \
    -e 's|^#\(ClientAliveCountMax\).*$|\1 6|' \
    -e 's|^#\(UseDNS\).*$|\1 yes|' \
    -e 's|^#\(PidFile\).*$|\1 /var/run/sshd.pid|' \
    -e 's|^#\(MaxStartups\).*$|\1 10:30:100|' \
    -e 's|^#\(PermitTunnel\).*$|\1 no|' \
    -e 's|^#\(ChrootDirectory\).*$|\1 %h|' \
    -e 's|^\(Subsystem.*\)$|#\1|' \
    -i '' /etc/ssh/sshd_config


cat >> /etc/ssh/sshd_config << "EOF"

Subsystem sftp internal-sftp -u 0027

AllowGroups wheel admin sshusers sftponly

Match User root
    ChrootDirectory none
    PasswordAuthentication no

Match Group admin
    ChrootDirectory none
    PasswordAuthentication no

Match Group sshusers
    ChrootDirectory none
    PasswordAuthentication no

Match Group sftponly
    ChrootDirectory /home
    PasswordAuthentication yes
    ForceCommand internal-sftp -d %u

"EOF"


sed -e '/^# Ciphers and keying/ a\\
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr,aes256-cbc\\
Macs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256\\
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1' -i '' /etc/ssh/sshd_config

cat >> /etc/ssh/ssh_config << "EOF"
Host *
        Protocol 2
        IdentityFile ~/.ssh/id_ed25519
        IdentityFile ~/.ssh/id_ecdsa
        IdentityFile ~/.ssh/id_rsa
        RekeyLimit 500M 1h
        Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr,aes256-cbc
        Macs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256
        KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1
        HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256
        VisualHostKey yes
"EOF"


ssh-keygen -q -t rsa -b 4096 -f "/etc/ssh/ssh_host_rsa_key" -N ""
ssh-keygen -l -f "/etc/ssh/ssh_host_rsa_key.pub"
ssh-keygen -q -t ecdsa -b 384 -f "/etc/ssh/ssh_host_ecdsa_key" -N ""
ssh-keygen -l -f "/etc/ssh/ssh_host_ecdsa_key.pub"
ssh-keygen -q -t ed25519 -f "/etc/ssh/ssh_host_ed25519_key" -N ""
ssh-keygen -l -f "/etc/ssh/ssh_host_ed25519_key.pub"


ssh-keygen -t ed25519 -O clear -O permit-pty -f ".ssh/id_ed25519" -N ""
cat .ssh/id_ed25519.pub >> .ssh/authorized_keys

ssh-keygen -t ecdsa -b 384 -O clear -O permit-pty -f ".ssh/id_ecdsa" -N ""
cat .ssh/id_ecdsa.pub >> .ssh/authorized_keys

ssh-keygen -t rsa -b 4096 -O clear -O permit-pty -f ".ssh/id_rsa" -N ""
cat .ssh/id_rsa.pub >> .ssh/authorized_keys

/etc/sysctl.conf anpassen

In der sysctl.conf können die meisten Kernel-Parameter verändert werden. Wir wollen dies nutzen, um unser System etwas robuster und sicherer zu machen.

cat >> /etc/sysctl.conf << "EOF"
kern.ipc.maxsockbuf=16777216
kern.ipc.shm_use_phys=1
kern.ipc.shmall=32768
kern.ipc.shmmax=134217728
kern.ipc.soacceptqueue=1024
kern.ipc.somaxconn=1024
kern.maxfiles=65536
kern.maxfilesperproc=65535
kern.randompid=1000
net.inet.icmp.drop_redirect=1
net.inet.ip.check_interface=1
net.inet.ip.fastforwarding=1
net.inet.ip.forwarding=1
net.inet.ip.process_options=0
net.inet.ip.random_id=1
net.inet.ip.redirect=0
net.inet.ip.rtexpire=2
net.inet.ip.rtmaxcache=128
net.inet.ip.rtminexpire=2
net.inet.ip.stealth=1
net.inet.raw.maxdgram=9216
net.inet.raw.recvspace=9216
net.inet.tcp.blackhole=2
net.inet.tcp.cc.algorithm=htcp
net.inet.tcp.cc.htcp.adaptive_backoff=1
net.inet.tcp.cc.htcp.rtt_scaling=1
net.inet.tcp.delacktime=50
net.inet.tcp.drop_synfin=1
net.inet.tcp.experimental.initcwnd10=1
net.inet.tcp.fast_finwait2_recycle=1
net.inet.tcp.icmp_may_rst=0
net.inet.tcp.keepidle=10000
net.inet.tcp.keepintvl=5000
net.inet.tcp.minmss=1300
net.inet.tcp.msl=5000
net.inet.tcp.mssdflt=1460
net.inet.tcp.nolocaltimewait=1
net.inet.tcp.path_mtu_discovery=0
net.inet.tcp.recvbuf_inc=262144
net.inet.tcp.recvbuf_max=16777216
net.inet.tcp.recvspace=524288
net.inet.tcp.rfc1323=1
net.inet.tcp.rfc3390=1
net.inet.tcp.sack.enable=1
net.inet.tcp.sendbuf_inc=262144
net.inet.tcp.sendbuf_max=16777216
net.inet.tcp.sendspace=524288
net.inet.tcp.syncache.rexmtlimit=0
net.inet.tcp.syncookies=1
net.inet.tcp.syncookies_only=1
net.inet.tcp.tso=1
net.inet.udp.blackhole=1
net.inet.udp.recvspace=524288
net.inet.udp.sendspace=524288
net.inet6.icmp6.nodeinfo=0
net.inet6.icmp6.rediraccept=0
net.inet6.ip6.forwarding=1
net.inet6.ip6.prefer_tempaddr=0
net.inet6.ip6.redirect=0
net.inet6.ip6.stealth=1
net.inet6.ip6.use_tempaddr=0
net.local.stream.recvspace=524288
net.local.stream.sendspace=524288
security.bsd.hardlink_check_gid=1
security.bsd.hardlink_check_uid=1
security.bsd.see_other_gids=0
security.bsd.see_other_uids=0
security.bsd.stack_guard_page=1
security.bsd.unprivileged_proc_debug=0
security.bsd.unprivileged_read_msgbuf=0
vfs.read_max=128
"EOF"

Stärkere Passwort-Hashes verwenden

Um Bruteforce-Attacken erheblich auszubremsen setzen wir für die Passworte der Systemuser eine Mindestlänge (minpasswordlen) von 12 Zeichen in einem Mix aus Gross- und Kleinschreibung (mixpasswordcase) fest. Desweiteren lassen wir User nach 30 Minuten Inaktivität automatisch ausloggen (idletime). Wir bearbeiten hierzu mit dem Editor ee (ee /etc/login.conf) in der Datei /etc/login.conf die Login-Klasse default, indem wir vor der letzten Zeile folgende Zeilen hinzufügen.

        :mixpasswordcase=true:\
        :minpasswordlen=12:\
        :idletime=30:\

Anschliessend muss die Datei in eine Systemdatenbank umgewandelt werden.

cap_mkdb /etc/login.conf

Die neuen Einstellungen werden erst wirksam, wenn das Passwort eines Benutzers geändert wird. Deshalb müssen wir jetzt die Passwörter für root und alle anderen bisher von uns angelegten User ändern.

passwd root

Terminals absichern

Um zu verhindern, dass das System im Single User Mode ohne jeglichen Schutz benutzbar ist, ändern wir in der Datei /etc/ttys die Zeile console none... wie folgt ab.

console none                            unknown off insecure

Dadurch wird die Eingabe des root-Kennworts erforderlich, um das System im Single User Mode booten zu können. Den Rest sollten wir hingegen unverändert lassen.

Zusätzlich können wir veranlassen, dass die Konsole bei jedem Logout gelöscht wird, so dass nicht versehentlich vertrauliche Informationen auf dem Bildschirm sichtbar bleiben. Dazu ändern wir in der Datei /etc/gettytab den Eintrag P|Pc|Pc console wie folgt ab.

P|Pc|Pc console:\
        :ht:np:sp#115200:\
        :cl=\E[H\E[2J:

System konfigurieren

Mail alias für root einrichten.

sed -e 's/^#[[:space:]]*\(root:[[:space:]]*\).*$/\1 admin@example.org/' \
    -e 's/^#[[:space:]]*\(hostmaster:[[:space:]]*.*\)$/\1/' \
    -e 's/^#[[:space:]]*\(webmaster:[[:space:]]*.*\)$/\1/' \
    -e 's/^#[[:space:]]*\(www:[[:space:]]*.*\)$/\1/' \
    -i '' /etc/mail/aliases

Die aliases Datenbank für FreeBSDs Sendmail müssen wir mittels make anlegen, auch wenn wir später Sendmail gar nicht verwenden möchten.

cd /etc/mail ; make aliases ; cd /root

cat >> /etc/nscd.conf << "EOF"
keep-hot-count hosts 16384
"EOF"

Um Probleme an unserem Software-RAID1 möglichst rechtzeitig mitzubekommen, lassen wir uns täglich eine Mail mit dem Status des Software-RAID1 schicken.

echo 'daily_status_gmirror_enable="YES"' >> /etc/periodic.conf

Die /etc/fstab legen wir entsprechend unserem Partitionslayout an.

cat > /etc/fstab << "EOF"
# Device                   Mountpoint              FStype  Options             Dump    Pass
/dev/mirror/root           /                       ufs     rw                  1       1
dev                        /dev                    devfs   rw                  0       0
#fdesc                      /dev/fd                 fdescfs rw                  0       0
proc                       /proc                   procfs  rw                  0       0
/dev/mirror/swap           none                    swap    sw                  0       0
/dev/mirror/data           /data                   ufs     rw                  2       2
"EOF"

In der /etc/rc.conf werden diverse Grundeinstellungen für das System und die installierten Dienste vorgenommen.

cat > /etc/rc.conf << "EOF"
##############################################################
###  Important initial Boot-time options  ####################
##############################################################
#kern_securelevel_enable="YES"
#kern_securelevel="1"
fsck_y_enable="YES"
dumpdev="AUTO"

##############################################################
###  Network configuration sub-section  ######################
##############################################################
hostname="srv.example.org"

##### IPv4
### uncomment next 2 lines if you need the simple config
defaultrouter="GATEWAY4"
ifconfig_IFACE4="inet IPADDR4 netmask NETMASK4"
### the next 4 options may be needed on some isp-networks
### uncomment next 4 lines if you need the complex config
#static_routes="gateway4 default4"
#route_gateway4="-host -inet GATEWAY4 -interface IFACE4"
#route_default4="default GATEWAY4"
#ifconfig_IFACE4="inet IPADDR4 netmask NETMASK4"

##### IPv6
### uncomment next 3 lines if you need the simple config
#static_ndp_pairs="GATEWAY6 GWMAC6"
#ipv6_defaultrouter="GATEWAY6"
#ifconfig_IFACE6_ipv6="inet6 IPADDR6 prefixlen PREFLEN6"
### the next 5 options may be needed on some isp-networks
### uncomment next 5 lines if you need the complex config
#static_ndp_pairs="GATEWAY6 GWMAC6"
#ipv6_static_routes="gateway6 default6"
#ipv6_route_gateway6="-host -inet6 GATEWAY6 -interface IFACE6"
#ipv6_route_default6="default GATEWAY6"
#ifconfig_IFACE6_ipv6="inet6 IPADDR6 prefixlen PREFLEN6"

##############################################################
###  System console options  #################################
##############################################################
keymap="german.iso.kbd"
font8x16="iso-8x16.fnt"
font8x14="iso-8x14.fnt"
font8x8="iso-8x8.fnt"

##############################################################
###  Mail Transfer Agent (MTA) options  ######################
##############################################################
sendmail_enable="NO"
sendmail_cert_create="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

##############################################################
###  Miscellaneous administrative options  ###################
##############################################################
syslogd_flags="-ss"
clear_tmp_enable="YES"
cron_flags="$cron_flags -j 0 -J 0 -m root"

##############################################################
### Jail Configuration #######################################
##############################################################

##############################################################
###  System services options  ################################
##############################################################
nscd_enable="YES"
sshd_enable="YES"
sshd_rsa1_enable="NO"
sshd_dsa_enable="NO"
"EOF"

Keymap anpassen wenn das neue vt (funktioniert derzeit nur für UEFI-Systeme) genutzt wird.

/bin/test 'vt' == '`sysctl -n kern.vty`' && \
    sed -e 's/^\(keymap=\).*$/\1"de.kbd"/' \
        -e 's/^\(font8x16=\).*$/\1"vgarom-8x16.fnt"/' \
        -e 's/^\(font8x14=\).*$/\1"vgarom-8x14.fnt"/' \
        -e 's/^\(font8x8=\).*$/\1"vgarom-8x8.fnt"/' \
        -i '' /etc/rc.conf

Es folgt ein wenig Voodoo, um die Netzwerkkonfiguration in der /etc/rc.conf zu vervollständigen.

# IPv4
route -n get -inet 0.0.0.0 | \
    awk '/interface/ {print $2}' | \
    xargs -I % sed -e 's/IFACE4/%/g' -i '' /etc/rc.conf
route -n get -inet 0.0.0.0 | \
    awk '/gateway/ {print $2}' | \
    xargs -I % sed -e 's/GATEWAY4/%/g' -i '' /etc/rc.conf
ifconfig `route -n get -inet 0.0.0.0 | awk '/interface/ {print $2}'` inet | \
    awk '/inet / {if(substr($2,1,3)!=127) print $2}' | \
    head -n 1 | \
    xargs -I % sed -e 's/IPADDR4/%/g' -i '' /etc/rc.conf
ifconfig `route -n get -inet 0.0.0.0 | awk '/interface/ {print $2}'` inet | \
    awk '/inet / {if(substr($2,1,3)!=127) print $4}' | \
    head -n 1 | \
    xargs -I % sed -e 's/NETMASK4/%/g' -i '' /etc/rc.conf
arp -n `route -n get -inet 0.0.0.0 | awk '/gateway/ {print $2}'` | \
    awk '{print $4}' | \
    xargs -I % sed -e 's/GWMAC4/%/g' -i '' /etc/rc.conf

# IPv6 (only for IPv6 enabled hosts)
route -n get -inet6 :: | \
    awk '/interface/ {print $2}' | \
    xargs -I % sed -e 's/IFACE6/%/g' -i '' /etc/rc.conf
route -n get -inet6 :: | \
    awk '/gateway/ {print $2}' | \
    xargs -I % sed -e 's/GATEWAY6/%/g' -i '' /etc/rc.conf
ifconfig `route -n get -inet6 :: | awk '/interface/ {print $2}'` inet6 | \
    awk '/inet6 [0-9]/ {print $2}' | \
    head -n 1 | \
    xargs -I % sed -e 's/IPADDR6/%/g' -i '' /etc/rc.conf
ifconfig `route -n get -inet6 :: | awk '/interface/ {print $2}'` inet6 | \
    awk '/inet6 [0-9]/ {print $4}' | \
    head -n 1 | \
    xargs -I % sed -e 's/PREFLEN6/%/g' -i '' /etc/rc.conf
ndp -n `route -n get -inet6 :: | awk '/gateway/ {print $2}' | sed -e 's/\%.*$//'` | \
    tail -n 1 | \
    awk '{print $2}' | \
    xargs -I % sed -e 's/GWMAC6/%/g' -i '' /etc/rc.conf

Wir richten die /etc/hosts ein.

# localhost
sed -e 's/my.domain/example.org/g' -i '' /etc/hosts

# IPv4
echo 'IPADDR4   srv.example.org   srv' >> /etc/hosts

ifconfig `route -n get -inet 0.0.0.0 | awk '/interface/ {print $2}'` inet | \
    awk '/inet / {if(substr($2,1,3)!=127) print $2}' | \
    head -n 1 | \
    xargs -I % sed -e 's/IPADDR4/%/g' -i '' /etc/hosts

# IPv6 (only for IPv6 enabled hosts)
echo 'IPADDR6   srv.example.org   srv' >> /etc/hosts

ifconfig `route -n get -inet6 :: | awk '/interface/ {print $2}'` inet6 | \
    awk '/inet6 [0-9]/ {print $2}' | \
    head -n 1 | \
    xargs -I % sed -e 's/IPADDR6/%/g' -i '' /etc/hosts

Systemgruppen anlegen

Zur besseren Trennung beziehungsweise Gruppierung unterschiedlicher Nutzungszwecke legen wir ein paar Gruppen an (admin für rein administrative Nutzer, users für normale Nutzer, sshusers für Nutzer mit SSH-Zugang und sftponly für reine SFTP-Nutzer).

pw groupadd -n admin -g 1000
pw groupadd -n users -g 2000
pw groupadd -n sshusers -g 3000
pw groupadd -n sftponly -g 4000

Systembenutzer anlegen

Um nicht ständig mit dem root-User arbeiten zu müssen, legen wir uns einen Administrations-User an, den wir praktischerweise "admin" nennen. Diesem User verpassen wir die Standard-Systemgruppe "admin" und nehmen ihn zusätzlich in die Systemgruppe "wheel" auf, damit dieser User später per su zum root-User wechseln kann. Das Home-Verzeichnis des admin-Users lassen wir automatisch anlegen und setzen seine Standard-Shell auf /bin/tcsh. Ein sicheres Passwort bekommt er selbstverständlich auch noch.

pw useradd -n admin -u 1000 -g admin -G wheel -c 'Administrator' -m -s /bin/tcsh

passwd admin

Wir richten unserem admin noch die Shell und die zum zukünftigen Einloggen zwingend nötigten SSH-Keys ein.

su - admin

# Use ee instead of vi as standard editor
sed -e 's/\(EDITOR[[:space:]]*\)vi[[:space:]]*$/\1ee/' -i '' ~/.cshrc

# Use less instead of more as standard pager
sed -e 's/\(PAGER[[:space:]]*\)more[[:space:]]*$/\1less/' -i '' ~/.cshrc

# Use meaningfuller prompt
sed -e 's/\(set prompt =\).*$/\1 "[%B%n%b@%B%m%b:%B%~%b] %# "/' -i '' ~/.cshrc



ssh-keygen -t ed25519 -O clear -O permit-pty -f ".ssh/id_ed25519" -N ""
cat .ssh/id_ed25519.pub >> .ssh/authorized_keys

ssh-keygen -t ecdsa -b 384 -O clear -O permit-pty -f ".ssh/id_ecdsa" -N ""
cat .ssh/id_ecdsa.pub >> .ssh/authorized_keys

ssh-keygen -t rsa -b 4096 -O clear -O permit-pty -f ".ssh/id_rsa" -N ""
cat .ssh/id_rsa.pub >> .ssh/authorized_keys

exit

Einen normalen User mit SSH-Zugang legen wir ebenfalls an, ihn nennen wir "joeuser". Diesem User verpassen wir die Standard-Systemgruppe "users" und nehmen ihn zusätzlich in die Systemgruppe "sshusers" auf, damit sich dieser User später per SSH einloggen kann. Das Home-Verzeichnis des Users lassen wir automatisch anlegen und setzen seine Standard-Shell auf /bin/tcsh. Ein sicheres Passwort bekommt er selbstverständlich auch noch.

pw useradd -n joeuser -u 2000 -g users -G sshusers -c 'Joe User' -m -s /bin/tcsh

passwd joeuser

Wir richten unserem joeuser noch die Shell und die zum zukünftigen Einloggen zwingend nötigten SSH-Keys ein.

su - joeuser

# Use ee instead of vi as standard editor
sed -e 's/\(EDITOR[[:space:]]*\)vi[[:space:]]*$/\1ee/' -i '' ~/.cshrc

# Use less instead of more as standard pager
sed -e 's/\(PAGER[[:space:]]*\)more[[:space:]]*$/\1less/' -i '' ~/.cshrc

# Use meaningfuller prompt
sed -e 's/\(set prompt =\).*$/\1 "[%B%n%b@%B%m%b:%B%~%b] %# "/' -i '' ~/.cshrc



ssh-keygen -t ed25519 -O clear -O permit-pty -f ".ssh/id_ed25519" -N ""
cat .ssh/id_ed25519.pub >> .ssh/authorized_keys

ssh-keygen -t ecdsa -b 384 -O clear -O permit-pty -f ".ssh/id_ecdsa" -N ""
cat .ssh/id_ecdsa.pub >> .ssh/authorized_keys

ssh-keygen -t rsa -b 4096 -O clear -O permit-pty -f ".ssh/id_rsa" -N ""
cat .ssh/id_rsa.pub >> .ssh/authorized_keys

exit

Buildsystem konfigurieren

   

cat > /etc/make.conf << "EOF"
KERNCONF?=MYKERNEL GENERIC
SVN_UPDATE=yes
SVN=/usr/bin/svnlite
NO_DOCUPDATE=yes
NO_PORTSUPDATE=yes
NO_WWWUPDATE=yes
PRINTERDEVICE=ascii
DISABLE_VULNERABILITIES=yes
WITH_SSP_PORTS=yes
WITH_PKGNG=yes
WITH_BDB_VER=5
WITH_OPENSSL_PORT=yes
OPENSSL_PORT=security/openssl
LICENSES_ACCEPTED+=EULA
"EOF"

   

cat > /etc/src.conf << "EOF"
WITHOUT_AMD=YES
WITHOUT_APM=YES
WITHOUT_ATF=YES
WITHOUT_ATM=YES
WITHOUT_AUTHPF=YES
WITHOUT_AUTOFS=YES
WITHOUT_BHYVE=YES
WITHOUT_BLUETOOTH=YES
WITHOUT_BOOTPARAMD=YES
WITHOUT_BOOTPD=YES
WITHOUT_BSDINSTALL=YES
WITHOUT_BSNMP=YES
WITHOUT_CALENDAR=YES
WITH_CLANG_EXTRAS=YES
WITHOUT_CTM=YES
WITHOUT_DEBUG_FILES=YES
WITHOUT_DMAGENT=YES
WITHOUT_EXAMPLES=YES
WITHOUT_FINGER=YES
WITHOUT_FLOPPY=YES
WITHOUT_FREEBSD_UPDATE=YES
WITHOUT_FTP=YES
WITHOUT_GAMES=YES
WITHOUT_GPIB=YES
WITHOUT_GPIO=YES
WITH_GSSAPI=YES
WITHOUT_HTML=YES
WITHOUT_HYPERV=YES
WITHOUT_I4B=YES
WITHOUT_INETD=YES
WITHOUT_INFO=YES
WITHOUT_IPX=YES
WITHOUT_KERBEROS=YES
WITHOUT_KVM=YES
WITHOUT_LIB32=YES
WITHOUT_LPR=YES
WITHOUT_NCP=YES
WITHOUT_NDIS=YES
WITHOUT_NIS=YES
WITHOUT_PC_SYSINSTALL=YES
WITHOUT_PMC=YES
WITHOUT_PPP=YES
WITHOUT_PROFILE=YES
WITHOUT_RADIUS_SUPPORT=YES
WITHOUT_RBOOTD=YES
WITHOUT_RCMDS=YES
WITHOUT_RCS=YES
WITHOUT_SENDMAIL=YES
WITHOUT_SHAREDOCS=YES
WITHOUT_SYSINSTALL=YES
WITHOUT_TALK=YES
WITHOUT_TCP_WRAPPERS=YES
WITHOUT_TESTS=YES
WITHOUT_TFTP=YES
WITHOUT_TIMED=YES
WITHOUT_WIRELESS=YES
"EOF"

Kernel konfigurieren

   

mkdir -p /root/kernels

sed -e 's/^\(ident[[:space:]]*\).*$/\1MYKERNEL/' \
    -e '/^device[[:space:]]*puc/d' \
    -e '/^#[[:space:]]PCCARD/,/^$/ d' \
    -e '/^#[[:space:]]Parallel/,/^$/ d' \
    -e '/^#[[:space:]]ISA/,/^$/ d' \
    -e '/^#[[:space:]]Wireless/,/^$/ d' \
    -e '/^#[[:space:]]Sound/,/^$/ d' \
    -e '/^#[[:space:]]HyperV/,/^$/ d' \
    -e '/^#[[:space:]]Xen/,/^$/ d' \
    -e '/^#[[:space:]]VMware/,/^$/ d' \
    -e 's/[[:space:]]*#.*$//g' \
    -e '/^$/d' \
    /usr/src/sys/amd64/conf/GENERIC > /root/kernels/MYKERNEL

cat >> /root/kernels/MYKERNEL << "EOF"
options ATA_STATIC_ID
options SC_NORM_ATTR=(FG_GREEN|BG_BLACK)
options SC_NORM_REV_ATTR=(FG_YELLOW|BG_GREEN)
options SC_KERNEL_CONS_ATTR=(FG_RED|BG_BLACK)
options SC_KERNEL_CONS_REV_ATTR=(FG_BLACK|BG_RED)
options ACCEPT_FILTER_HTTP
options ACCEPT_FILTER_DNS
options ACCEPT_FILTER_DATA
options DEVICE_POLLING
options ROUTETABLES=16
options UDF
options TMPFS
options NULLFS
options FDESCFS
options UFS_EXTATTR
options UFS_EXTATTR_AUTOSTART
options GEOM_CACHE
options GEOM_MIRROR
options HZ=2000
options ALTQ
options ALTQ_CBQ
options ALTQ_RED
options ALTQ_RIO
options ALTQ_HFSC
options ALTQ_CDNR
options ALTQ_PRIQ
options ALTQ_NOPCC
options IPSTEALTH
options LIBALIAS
options FLOWTABLE
options DIRECTIO
device  virtio_random
device  crypto
device  aesni
device  smbios
device  vpd
device  amdsbwd
device  ichwd
device  coretemp
device  amdtemp
device  cpuctl
device  brgphy
device  rgephy
device  rlphy
device  pty
device  uhid
device  ums
device  tap
device  pf
device  pflog
device  pfsync
device  carp
device  smbus
device  ichsmb
device  amdsmb
device  intpm
device  amdpm
device  smb
device  iicbus
device  iicbb
device  ic
device  iic
device  iicsmb
"EOF"

ln -s /root/kernels/MYKERNEL /usr/src/sys/amd64/conf/

Kernel Parameter in /boot/loader.conf setzen.

cat >> /boot/loader.conf << "EOF"
# Kernel selection
kernel="GENERIC"
kernels="MYKERNEL GENERIC"

# Kernel modules
ahci_load="YES"
geom_mirror_load="YES"
accf_data_load="YES"
accf_http_load="YES"
accf_dns_load="YES"
cc_htcp_load="YES"

# Kernel parameters
kern.geom.label.disk_ident.enable=0
kern.geom.label.gptid.enable=0
kern.geom.label.gpt.enable=1
kern.ipc.nmbclusters=32768
kern.ipc.semmni=256
kern.ipc.semmns=512
kern.ipc.semmnu=256
kern.maxproc=65536
kern.maxprocperuid=65535
kern.maxusers=1024
net.inet.tcp.hostcache.cachelimit=0
net.link.ifqmaxlen=428
"EOF"

Abschluss der Installation

Um uns künftig mit unserem Arbeitsuser einloggen zu können, müssen wir uns dessen SSH-Key (id_rsa) auf unser lokales System kopieren und ihn dann mit Hilfe der PuTTYgen Dokumentation in einen für PuTTY lesbaren Private Key umwandeln (id_rsa.ppk).

pscp -P 2222 -r root@127.0.0.1:/mnt/usr/home/admin/.ssh "%USERPROFILE%\VirtualBox VMs\FreeBSD\ssh"

puttygen "%USERPROFILE%\VirtualBox VMs\FreeBSD\ssh\id_rsa"

# Einloggen ab hier nur noch mit Key
#putty -ssh -P 2222 -i "%USERPROFILE%\VirtualBox VMs\FreeBSD\ssh\id_rsa.ppk" admin@127.0.0.1

Nun ist es endlich soweit: Wir verlassen das Chroot, unmounten die Partitionen und rebooten zum ersten Mal in unser neues FreeBSD Basis-System.

exit

umount /mnt/dev
umount /mnt/data
umount /mnt

shutdown -r now

System aktualisieren

Nach dem Reboot aktualisieren und entschlacken wir das System.

Source Tree auschecken

Am Besten funktioniert bei FreeBSD immer noch die Aktualisierung über die System-Sourcen. Auf diesem Wege kann man ein System über viele Release-Generationen hinweg aktuell halten, ohne eine Neuinstallation durchzuführen. Das Verfahren ist zwar etwas zeitaufwändig, aber erprobt und führt bei richtiger Anwendung zu einem sauberen, aktuellen System.

Zunächst wird hierzu das aktuelle Quellenverzeichnis von FreeBSD benötigt, weshalb wir es mittels svnlite, einem im Funktionsumfang reduziertem SVN-Client von FreeBSD, auschecken.

# Neues Quellenverzeichnis anlegen (checkout)
rm -r /usr/src && svnlite checkout svn://svn.freebsd.org/base/releng/`/bin/freebsd-version -u | cut -d- -f1` /usr/src
ln -s /root/kernels/MYKERNEL /usr/src/sys/amd64/conf/

# Vorhandenes Quellenverzeichnis aktualisieren (update)
cd /usr/src && svnlite update


# Vorhandenes Quellenverzeichnis zu FreeBSD 10.3-RELENG wechseln (switch)
#cd /usr/src && svnlite switch svn://svn.freebsd.org/base/releng/10.3

Konfiguration anpassen

In den Abschnitten Buildsystem konfigurieren und Kernel konfigurieren haben wir uns bereits eine geeignete make.conf und gegebenenfalls auch eine individuelle Kernel-Konfiguration erstellt. Dennoch sei an dieser Stelle nochmals auf das FreeBSD Handbuch verwiesen. Insbesondere Kapitel 8 (Kernel selbst erstellen) und Kapitel 24.6 (Basissystem komplett aktualisieren) seien Jedem FreeBSD Administratoren ans Herz gelegt.

Ausserdem empfiehlt es sich vor einem Update des Basissystems die Datei /usr/src/UPDATING zu lesen. Alle Angaben und Hinweise in dieser Datei sind aktueller und zutreffender als das Handbuch und sollten unbedingt befolgt werden.

Vorbereitende Arbeiten

OPTIONAL: Für die spätere Installation des neu kompilierten Basissystems darf /tmp nicht mit der Option noexec gemounted sein. Da zwischendrin noch mal ein Reboot erfolgt, können wir bei Bedarf bereits jetzt die entsprechende Zeile in der fstab anpassen, sofern vorhanden.

Zunächst müssen eventuell vorhandene Object-Dateien im Verzeichnis /usr/obj gelöscht werden, damit make später wirklich das gesamte System neu erstellt.

cd /usr/src

make clean

svnlite update

chflags -R noschg /usr/obj/*
rm -rf /usr/obj/*

Ausserdem sollte mergemaster im Pre-Build-Mode angeworfen werden, damit es während der Aktualisierung nicht zu Fehlern kommt, weil z. B. bestimmte User oder Gruppen noch nicht vorhanden sind.

/usr/src/usr.sbin/mergemaster/mergemaster.sh -p

Basissystem rekompilieren

Das Kompilieren des Basissystems kann durchaus eine Stunde oder länger dauern.

make -j2 buildworld

Kernel rekompilieren und installieren

Wenn die eigene Kernel-Konfiguration wie bei uns bereits in der /etc/make.conf eingetragen ist, wird sie automatisch verwendet, andernfalls wird die Konfiguration des generischen FreeBSD-Kernels verwendet. Das Kompilieren des Kernels kann durchaus eine Stunde oder länger dauern.

make -j2 KERNCONF=MYKERNEL buildkernel
make KERNCONF=MYKERNEL INSTALLKERNEL=MYKERNEL INSTKERNNAME=MYKERNEL installkernel
sed -e 's/^\(kernel=\).*$/\1"MYKERNEL"/' -i '' /boot/loader.conf
sed -e 's/^#fdesc/fdesc/' -i '' /etc/fstab

make -j2 KERNCONF=GENERIC buildkernel
make KERNCONF=GENERIC INSTALLKERNEL=GENERIC INSTKERNNAME=GENERIC installkernel

Normalerweise wäre nun ein Reboot in den Single User Mode an der Reihe. Da sich ein Remote-System in diesem Modus ohne KVM-Lösung aber nicht bedienen lässt, begnügen wir uns damit, das System regulär neu zu starten.

shutdown -r now

Wenn wir unser System zu einem späteren Zeitpunkt nochmals aktualisieren, sollten wir zuden zuvor alle Dienste ausser OpenSSH, sowie sämtliche Jails in der Datei /etc/rc.conf deaktivieren.

Basissystem installieren

Wir installieren das neue Basissystem.

cd /usr/src

make installworld

Da wir den NIS-Support entfernt haben, müssen wir die /etc/nsswitch.conf anpassen.

sed -e '/[a-z]*_compat/d' \
    -e 's/compat/files/g' \
    -i '' /etc/nsswitch.conf

Als letzten Schritt müssen nun noch die Neuerungen in den Konfigurationsdateien gemerged werden. Dabei unterstützt uns das Tool mergemaster. Wir müssen selbstverständlich darauf achten, dass wir hierbei nicht versehentlich unsere zuvor gemachten Anpassungen an den diversen Konfigurationsdateien wieder rückgängig machen.

/usr/sbin/mergemaster -i -F

Wir entsorgen nun noch eventuell vorhandene veraltete und überflüssige Dateien.

make delete-old -DBATCH_DELETE_OLD_FILES
make delete-old-libs -DBATCH_DELETE_OLD_FILES

Anschliessend müssen wir noch die für die Installation gegebenenfalls vorgenommenen Änderungen in der fstab sowie rc.conf rückgängig machen und das System nochmals durchstarten.

shutdown -r now

Portstree einrichten

Um unser Basissystem um sinnvolle Programme erweitern zu können, fehlt uns noch der sogenannte Portstree. Diesen laden wir uns nun mittels portsnap herunter (kann durchaus eine Stunde oder länger dauern).

portsnap fetch extract

Damit ist der Portstree einsatzbereit. Um den Tree künftig zu aktualisieren genügt der folgende Befehl.

portsnap fetch update

Dieser Cronjob prüft täglich um 7:00 Uhr ob es Updates für die installierten Pakete gibt und ob darin gegebenenfalls wichtige Sicherheitsupdates enthalten sind. Das Ergebnis wird automatisch per Mail an root (siehe /etc/mail/aliases) gesendet.

cat >> /etc/crontab << "EOF"
0       7       *       *       *       root    /usr/sbin/portsnap -I cron update && /usr/sbin/pkg version -vIL= && /usr/sbin/pkg audit -F
"EOF"

Wichtige Informationen zu neuen Paketversionen finden sich in /usr/ports/UPDATING und sollten dringend beachtet werden.

less /usr/ports/UPDATING

Software installieren

WICHTIG: An diesem Punkt müssen wir uns entscheiden, ob wir die Pakete/Ports in Zukunft bequem als vorkompiliertes Binary-Paket per pkg install <port> mit den Default-Optionen installieren wollen oder ob wir die Optionen und somit den Funktionsumfang beziehungsweise die Features unserer Pakete/Ports selbst bestimmen wollen. In diesem HowTo werden wir uns für die zweite Variante entscheiden, da uns dies viele Probleme durch unnötige oder fehlende Features und Abhängigkeiten ersparen wird. Andererseits verlieren wir dadurch den Komfort von pkg bei der Installation und den Updates der Pakete/Ports und wir müssen zwangsweise für alle Pakete/Ports die gewünschten Optionen manuell setzen und die Pakete/Ports auch selbst kompilieren. Dies ist zeitaufwendiger und erfordert etwas mehr Wissen über die jeweiligen Pakete/Ports und deren Features, entschädigt uns dafür aber mit einem schlankeren und schnelleren System und bietet uns gegebenenfalls nützliche/erforderliche zusätzliche Features. Auch die potentielle Gefahr durch Sicherheitslücken sinkt, da wir unnütze Pakete/Ports gar nicht erst als Abhängigkeit mitinstallieren werden.

Wir deaktivieren das Default-Repository von pkg um versehentlichen Installationen von Binary-Paketen etwas vorzubeugen, ganz verhindern können wir es leider nicht.

mkdir -p /usr/local/etc/pkg/repos
echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf

So ganz ohne komfortable Tools ist das Basis-System etwas mühselig zu administrieren. Deshalb werden aus den Ports nun ein paar etwas häufiger benötigte Anwendungen installiert.

Die von uns jeweils gewünschten Build-Optionen der Ports legen wir dabei mittels der options-Files des neuen Portkonfigurationsframeworks OptionsNG fest.

Wir installieren ports-mgmt/pkg und dessen Abhängigkeiten.

cd /usr/ports/ports-mgmt/pkg
make config-recursive all install clean-depends clean
pkg2ng
pkg check -B -d -a

Wir installieren sysutils/devcpu-data und dessen Abhängigkeiten.

cd /usr/ports/sysutils/devcpu-data
make LICENSES_ACCEPTED=EULA config-recursive all install clean-depends clean

echo 'microcode_update_enable="YES"' >> /etc/rc.conf

Wir installieren lang/perl5.20 und dessen Abhängigkeiten.

mkdir -p /var/db/ports/devel_gettext-tools
cat > /var/db/ports/devel_gettext-tools/options << "EOF"
_OPTIONS_READ=gettext-tools-0.19.7
_FILE_COMPLETE_OPTIONS_LIST=DOCS THREADS
OPTIONS_FILE_SET+=DOCS
OPTIONS_FILE_SET+=THREADS
"EOF"

mkdir -p /var/db/ports/databases_gdbm
cat > /var/db/ports/databases_gdbm/options << "EOF"
_OPTIONS_READ=gdbm-1.11
_FILE_COMPLETE_OPTIONS_LIST=COMPAT NLS
OPTIONS_FILE_UNSET+=COMPAT
OPTIONS_FILE_SET+=NLS
"EOF"

mkdir -p /var/db/ports/lang_perl5.20
cat > /var/db/ports/lang_perl5.20/options << "EOF"
_OPTIONS_READ=perl5-5.20.3
_FILE_COMPLETE_OPTIONS_LIST=DEBUG GDBM MULTIPLICITY PERL_64BITINT PTHREAD SITECUSTOMIZE THREADS PERL_MALLOC
OPTIONS_FILE_UNSET+=DEBUG
OPTIONS_FILE_SET+=GDBM
OPTIONS_FILE_SET+=MULTIPLICITY
OPTIONS_FILE_SET+=PERL_64BITINT
OPTIONS_FILE_SET+=PTHREAD
OPTIONS_FILE_UNSET+=SITECUSTOMIZE
OPTIONS_FILE_SET+=THREADS
OPTIONS_FILE_UNSET+=PERL_MALLOC
"EOF"

cd /usr/ports/lang/perl5.20
make config-recursive all install clean-depends clean

Wir installieren security/ca_root_nss und dessen Abhängigkeiten.

mkdir -p /var/db/ports/security_ca_root_nss
cat > /var/db/ports/security_ca_root_nss/options << "EOF"
_OPTIONS_READ=ca_root_nss-3.22.2
_FILE_COMPLETE_OPTIONS_LIST=ETCSYMLINK
OPTIONS_FILE_SET+=ETCSYMLINK
"EOF"

cd /usr/ports/security/ca_root_nss
make config-recursive all install clean-depends clean

Wir installieren security/openssl und dessen Abhängigkeiten.

mkdir -p /var/db/ports/security_openssl
cat > /var/db/ports/security_openssl/options << "EOF"
_OPTIONS_READ=openssl-1.0.2
_FILE_COMPLETE_OPTIONS_LIST=SHARED THREADS I386 SSE2 ASM PADLOCK ZLIB GMP SCTP SSL2 SSL3 RFC3779 MD2 RC5 EXPCIPHERS DOCS EC
OPTIONS_FILE_SET+=SHARED
OPTIONS_FILE_SET+=THREADS
OPTIONS_FILE_UNSET+=I386
OPTIONS_FILE_SET+=SSE2
OPTIONS_FILE_SET+=ASM
OPTIONS_FILE_UNSET+=PADLOCK
OPTIONS_FILE_UNSET+=ZLIB
OPTIONS_FILE_UNSET+=GMP
OPTIONS_FILE_SET+=SCTP
OPTIONS_FILE_UNSET+=SSL2
OPTIONS_FILE_UNSET+=SSL3
OPTIONS_FILE_UNSET+=RFC3779
OPTIONS_FILE_UNSET+=MD2
OPTIONS_FILE_UNSET+=RC5
OPTIONS_FILE_UNSET+=EXPCIPHERS
OPTIONS_FILE_SET+=DOCS
OPTIONS_FILE_SET+=MAN3
OPTIONS_FILE_SET+=EC
"EOF"

cd /usr/ports/security/openssl
make config-recursive all install clean-depends clean

Wir konfigurieren openssl.

cp -a /usr/local/openssl/openssl.cnf.sample /usr/local/openssl/openssl.cnf

Folgende Optionen müssen mit dem Editor ee (ee /usr/local/openssl/openssl.cnf) in der /usr/local/openssl/openssl.cnf im Abschnitt [ req_distinguished_name ] angepasst beziehungsweise ergänzt werden.

countryName_default             = DE
stateOrProvinceName_default     = Bundesland
localityName_default            = Ort
0.organizationName_default      = Example Corporation
organizationalUnitName_default  = Certification Authority
emailAddress_default            = admin@example.org

Folgende Optionen müssen im Abschnitt [ CA_default ] angepasst werden.

default_days            = 730
default_md              = sha256

Folgende Optionen müssen im Abschnitt [ req ] angepasst werden.

default_bits            = 4096
string_mask             = utf8only

Wir installieren lang/python27 und dessen Abhängigkeiten.

mkdir -p /var/db/ports/devel_libffi
cat > /var/db/ports/devel_libffi/options << "EOF"
_OPTIONS_READ=libffi-3.2.1
_FILE_COMPLETE_OPTIONS_LIST=TESTS
OPTIONS_FILE_UNSET+=TESTS
"EOF"

mkdir -p /var/db/ports/lang_python27
cat > /var/db/ports/lang_python27/options << "EOF"
_OPTIONS_READ=python27-2.7.11
_FILE_COMPLETE_OPTIONS_LIST=DEBUG IPV6 LIBFFI NLS PYMALLOC SEM THREADS UCS2 UCS4
OPTIONS_FILE_UNSET+=DEBUG
OPTIONS_FILE_SET+=IPV6
OPTIONS_FILE_SET+=LIBFFI
OPTIONS_FILE_SET+=NLS
OPTIONS_FILE_SET+=PYMALLOC
OPTIONS_FILE_SET+=SEM
OPTIONS_FILE_SET+=THREADS
OPTIONS_FILE_UNSET+=UCS2
OPTIONS_FILE_SET+=UCS4
"EOF"

cd /usr/ports/lang/python
make config-recursive all install clean-depends clean

Wir installieren lang/python34 und dessen Abhängigkeiten.

mkdir -p /var/db/ports/lang_python34
cat > /var/db/ports/lang_python34/options << "EOF"
_OPTIONS_READ=python34-3.4.4
_FILE_COMPLETE_OPTIONS_LIST=DEBUG IPV6 LIBFFI NLS PYMALLOC THREADS TSC FNV SIPHASH
OPTIONS_FILE_UNSET+=DEBUG
OPTIONS_FILE_SET+=IPV6
OPTIONS_FILE_SET+=LIBFFI
OPTIONS_FILE_SET+=NLS
OPTIONS_FILE_SET+=PYMALLOC
OPTIONS_FILE_SET+=THREADS
OPTIONS_FILE_UNSET+=TSC
OPTIONS_FILE_UNSET+=FNV
OPTIONS_FILE_UNSET+=SIPHASH
"EOF"

cd /usr/ports/lang/python3
make config-recursive all install clean-depends clean

Wir installieren databases/py-bsddb und dessen Abhängigkeiten.

mkdir -p /var/db/ports/devel_gmake
cat > /var/db/ports/devel_gmake/options << "EOF"
_OPTIONS_READ=gmake-4.1
_FILE_COMPLETE_OPTIONS_LIST=NLS
OPTIONS_FILE_SET+=NLS
"EOF"

mkdir -p /var/db/ports/misc_help2man
cat > /var/db/ports/misc_help2man/options << "EOF"
_OPTIONS_READ=help2man-1.43.3
_FILE_COMPLETE_OPTIONS_LIST=NLS
OPTIONS_FILE_SET+=NLS
"EOF"

mkdir -p /var/db/ports/databases_db5
cat > /var/db/ports/databases_db5/options << "EOF"
_OPTIONS_READ=db5-5.3.28
_FILE_COMPLETE_OPTIONS_LIST=CRYPTO DOCS JAVA L10N SQL
OPTIONS_FILE_SET+=CRYPTO
OPTIONS_FILE_SET+=DOCS
OPTIONS_FILE_UNSET+=JAVA
OPTIONS_FILE_UNSET+=L10N
OPTIONS_FILE_UNSET+=SQL
"EOF"

cd /usr/ports/databases/py-bsddb
make config-recursive all install clean-depends clean

Wir installieren databases/py-bsddb3 und dessen Abhängigkeiten.

cd /usr/ports/databases/py-bsddb3
make config-recursive all install clean-depends clean

Wir installieren lang/ruby21 und dessen Abhängigkeiten.

mkdir -p /var/db/ports/devel_m4
cat > /var/db/ports/devel_m4/options << "EOF"
_OPTIONS_READ=m4-1.4.17
_FILE_COMPLETE_OPTIONS_LIST=EXAMPLES LIBSIGSEGV
OPTIONS_FILE_SET+=EXAMPLES
OPTIONS_FILE_SET+=LIBSIGSEGV
"EOF"

mkdir -p /var/db/ports/math_gmp
cat > /var/db/ports/math_gmp/options << "EOF"
_OPTIONS_READ=gmp-5.1.3
_FILE_COMPLETE_OPTIONS_LIST=CPU_OPTS
OPTIONS_FILE_UNSET+=CPU_OPTS
"EOF"

mkdir -p /var/db/ports/lang_ruby21
cat > /var/db/ports/lang_ruby21/options << "EOF"
_OPTIONS_READ=ruby-2.1.8
_FILE_COMPLETE_OPTIONS_LIST=CAPIDOCS DEBUG DOCS EXAMPLES GMP RDOC LIBEDIT READLINE
OPTIONS_FILE_UNSET+=CAPIDOCS
OPTIONS_FILE_UNSET+=DEBUG
OPTIONS_FILE_SET+=DOCS
OPTIONS_FILE_SET+=EXAMPLES
OPTIONS_FILE_SET+=GMP
OPTIONS_FILE_UNSET+=RDOC
OPTIONS_FILE_SET+=LIBEDIT
OPTIONS_FILE_UNSET+=READLINE
"EOF"

cd /usr/ports/lang/ruby21
make config-recursive all install clean-depends clean

Wir installieren databases/ruby-bdb und dessen Abhängigkeiten.

mkdir -p /var/db/ports/databases_ruby-bdb
cat > /var/db/ports/databases_ruby-bdb/options << "EOF"
_OPTIONS_READ=ruby21-bdb5-0.6.6
_FILE_COMPLETE_OPTIONS_LIST=DOCS EXAMPLES
OPTIONS_FILE_SET+=DOCS
OPTIONS_FILE_SET+=EXAMPLES
"EOF"

cd /usr/ports/databases/ruby-bdb
make config-recursive all install clean-depends clean

Wir installieren lang/tcl86 und dessen Abhängigkeiten.

mkdir -p /var/db/ports/lang_tcl86
cat > /var/db/ports/lang_tcl86/options << "EOF"
_OPTIONS_READ=tcl86-8.6.5
_FILE_COMPLETE_OPTIONS_LIST=MODULES TCLMAN THREADS TZDATA
OPTIONS_FILE_SET+=MODULES
OPTIONS_FILE_UNSET+=TCLMAN
OPTIONS_FILE_SET+=THREADS
OPTIONS_FILE_UNSET+=TZDATA
"EOF"

cd /usr/ports/lang/tcl86
make config-recursive all install clean-depends clean

Wir installieren ports-mgmt/portupgrade und dessen Abhängigkeiten.

mkdir -p /var/db/ports/ports-mgmt_portupgrade
cat > /var/db/ports/ports-mgmt_portupgrade/options << "EOF"
_OPTIONS_READ=portupgrade-2.4.14
_FILE_COMPLETE_OPTIONS_LIST=DOCS
OPTIONS_FILE_SET+=DOCS
"EOF"

cd /usr/ports/ports-mgmt/portupgrade
make config-recursive all install clean-depends clean

Wir konfigurieren portupgrade.

cat > /usr/local/etc/pkgtools.conf << "EOF"
# -*- ruby -*-
#
# pkgtools.conf - the configuration file for the pkgtools suite
#
module PkgConfig
  ENV['PORTSDIR'] ||= '/usr/ports'
  ENV['PACKAGES'] ||= ENV['PORTSDIR'] + '/packages'
  ENV['PKG_PATH'] ||= ENV['PACKAGES'] + '/All'
  ENV['PKG_BACKUP_DIR'] ||= ENV['PKG_PATH']
  SANITY_CHECK = true
  IGNORE_CATEGORIES = [
    'arabic',
    'chinese',
    'french',
    'german',
    'hebrew',
    'hungarian',
    'japanese',
    'korean',
    'polish',
    'portuguese',
    'russian',
    'ukrainian',
    'vietnamese',
  ]
  EXTRA_CATEGORIES = [
  ]
  ALT_INDEX = [
  ]
  ALT_MOVED = [
  ]
  HOLD_PKGS = [
  ]
  IGNORE_MOVED = [
  ]
  USE_PKGS = [
  ]
  USE_PKGS_ONLY = [
  ]
  USE_PORTS_ONLY = [
    '*',
  ]
  ALT_PKGDEP = {
    'editors/emacs' => 'editors/emacs-nox11',
    'editors/vim' => 'editors/vim-lite',
    'emulators/open-vm-tools' => 'emulators/open-vm-tools-nox11',
    'games/freeciv' => 'games/freeciv-nox11',
    'games/nethack33' => 'games/nethack33-nox11',
    'games/nethack34' => 'games/nethack34-nox11',
    'games/nethack36' => 'games/nethack36-nox11',
    'graphics/ImageMagick' => 'graphics/ImageMagick-nox11',
    'graphics/ImageMagick7' => 'graphics/ImageMagick7-nox11',
    'graphics/libwmf' => 'graphics/libwmf-nox11',
    'lang/ocaml' => 'lang/ocaml-nox11',
    'math/ploticus' => 'math/ploticus-nox11',
    'net-p2p/qbittorrent' => 'net-p2p/qbittorrent-nox11',
    'net-p2p/zetacoin' => 'net-p2p/zetacoin-nox11',
    'net/mtr' => 'net/mtr-nox11',
    'net/unison' => 'net/unison-nox11',
    'print/ghostscript7-x11' => 'print/ghostscript7-base',
    'print/ghostscript8-x11' => 'print/ghostscript8-base',
    'print/ghostscript9-x11' => 'print/ghostscript9-agpl-base',
    'print/ghostscript9-base' => 'print/ghostscript9-agpl-base',
    'print/ghostscript9-agpl-x11' => 'print/ghostscript9-agpl-base',
  }
  MAKE_ARGS = {
  }
  MAKE_ENV = {
  }
  BEFOREBUILD = {
  }
  BEFOREDEINSTALL = {
  }
  AFTERINSTALL = {
  }
  PKG_SITES = [
    pkg_site_mirror(),
  ]
  PORTUPGRADE_ARGS = ENV['PORTUPGRADE'] || '-v -D -u -c -l /var/tmp/portupgrade.results -L /var/tmp/portupgrade-%s::%s.log'
end
"EOF"

Wir installieren ports-mgmt/portmaster und dessen Abhängigkeiten.

mkdir -p /var/db/ports/ports-mgmt_portmaster
cat > /var/db/ports/ports-mgmt_portmaster/options << "EOF"
_OPTIONS_READ=portmaster-3.17.9
_FILE_COMPLETE_OPTIONS_LIST=BASH ZSH
OPTIONS_FILE_UNSET+=BASH
OPTIONS_FILE_UNSET+=ZSH
"EOF"

cd /usr/ports/ports-mgmt/portmaster
make config-recursive all install clean-depends clean

Wir installieren sysutils/bsdadminscripts und dessen Abhängigkeiten.

mkdir -p /var/db/ports/sysutils_bsdadminscripts
cat > /var/db/ports/sysutils_bsdadminscripts/options << "EOF"
_OPTIONS_READ=bsdadminscripts-6.1.1
_FILE_COMPLETE_OPTIONS_LIST=DOCS
OPTIONS_FILE_SET+=DOCS
"EOF"

cd /usr/ports/sysutils/bsdadminscripts
make config-recursive all install clean-depends clean

Wir installieren sysutils/smartmontools und dessen Abhängigkeiten.

mkdir -p /var/db/ports/sysutils_smartmontools
cat > /var/db/ports/sysutils_smartmontools/options << "EOF"
_OPTIONS_READ=smartmontools-6.4
_FILE_COMPLETE_OPTIONS_LIST=DOCS
OPTIONS_FILE_SET+=DOCS
"EOF"

cd /usr/ports/sysutils/smartmontools
make config-recursive all install clean-depends clean

Wir konfigurieren smartmontools.

sed 's/^DEVICESCAN/#DEVICESCAN/' /usr/local/etc/smartd.conf.sample > /usr/local/etc/smartd.conf
echo '/dev/ada0 -a -o on -S on -s (S/../.././02|L/../../6/03)' >> /usr/local/etc/smartd.conf
echo '/dev/ada1 -a -o on -S on -s (S/../.././02|L/../../6/03)' >> /usr/local/etc/smartd.conf
echo 'daily_status_smart_devices="/dev/ada0 /dev/ada1"' >> /etc/periodic.conf
echo 'smartd_enable="YES"' >> /etc/rc.conf

Wir installieren editors/nano und dessen Abhängigkeiten.

mkdir -p /var/db/ports/editors_nano
cat > /var/db/ports/editors_nano/options << "EOF"
_OPTIONS_READ=nano-2.4.3
_FILE_COMPLETE_OPTIONS_LIST=DOCS EXAMPLES NLS
OPTIONS_FILE_SET+=DOCS
OPTIONS_FILE_SET+=EXAMPLES
OPTIONS_FILE_SET+=NLS
"EOF"

cd /usr/ports/editors/nano
make config-recursive all install clean-depends clean

Wenn wir ein Programm nicht kennen, dann finden wir zu jedem Port eine Datei pkg-descr, die eine kurze Beschreibung sowie (meistens) einen Link zur Projekt-Homepage der Software enthält. Für smartmontools zum Beispiel würden wir die Beschreibung unter /usr/ports/sysutils/smartmontools/pkg-descr finden.

Software updaten

WICHTIG: Da wir die Pakete/Ports nicht als vorkompilierte Binary-Pakete installieren sondern selbst kompilieren, müssen wir natürlich auch die Updates der Ports selbst kompilieren. Um uns das dazu notwendige Auflösen der Abhängigkeiten und etwas Tipparbeit zu ersparen, überlassen wir dies künftig einfach einem kleinen Shell-Script. Dieses Script können wir einfach mittels update-ports ausführen und es erledigt dann folgende Arbeiten für uns:

  • Aktualisieren des Portstree mittels portsnap
  • Anzeigen neuer Einträge in /usr/ports/UPDATING
  • Ermitteln der zu aktualisierenden Ports und deren Abhängigkeiten
  • Aktualisieren der Ports und Abhängigkeiten mittels portupgrade
  • Aufräumen des Portstree und der Distfiles mittels portsclean
cat > /usr/local/sbin/update-ports << "EOF"
#!/bin/sh

cp -f /usr/ports/UPDATING /var/tmp/ports-UPDATING

portsnap fetch update

diff -uwbB /var/tmp/ports-UPDATING /usr/ports/UPDATING > /tmp/ports-UPDATING

less /tmp/ports-UPDATING

read -p "Update ports now? [y/N] " REPLY

if [ "x$REPLY" != "xy" ]
then
  exit 0
fi

echo '#!/bin/sh' > /tmp/update-ports

portversion -c -C "-f -r" >> /tmp/update-ports

chmod 0755 /tmp/update-ports

/bin/sh /tmp/update-ports

rm -f /tmp/update-ports

portsclean -CDDL
"EOF"

chmod 0755 /usr/local/sbin/update-ports

Wie geht es weiter?

Natürlich mit der Certificate Authority.

Viel Spass mit dem neuen FreeBSD Basissystem.