Um ein FreeBSD „immer dabei“ zu haben besteht die Möglichkeit es auf einen USB-Stick zu installieren. Da eine normale Installation einige Nachteile mit sich bringt und ggf. sogar gar nicht booten will ist ein ein Weg beschrieben über den ein allgemeingültiger USB-Stick erstellt werden kann. Der Stick wird als Live-System gebaut, wie man es von CDs kennt, und wird daher keine Änderungen speichern. Somit hat man immer ein sauberes System zur Hand. In einem zweiten Schritt soll dann im Anschluss aufgezeigt werden wie ein Live-Stick gebaut werden kann der es erlaubt Daten dauerhaft zu ändern. Um genau zu sein muss hier nur am Partitionsschema geschraubt werden.
Zunächst wird ein Image auf der Festplatte erzeugt welches am Ende auf den USB-Stick kopiert wird. Dieses Image kann dann abseits des USB-Sticks erstellt und gepflegt werden und erlaubt es recht schnell mehrere USB-Sticks anzufertigen.
Um die genauen Geometriedaten des Sticks zu bekommen wird er an den Rechner angeschossen und per dmesg die Zeile gesucht welche seine Daten angibt. In diesem Beispiel handelt es sich um einen 1GB-USB-Stick.
Ein dmesg liefert dann:
da0: 979MB (2004992 512 byte sectors: 64H 32S/T 979C)
Um nun ein Image mit exakt dieser Größe auf der Festplatte anzulegen wird per dd eine leere Datei erzeugt:
% dd if=/dev/zero of=stick.img bs=512 count=2004992
Um auf der Datei arbeiten zu können wie auf einem echten Datenträger muss sie als Device eingebunden werden. Dies wird über den Weg einer Memorydisk mittels mdconfig erledigt:
# mdconfig -f stick.img md0
Das erzeugte Device heißt also md0 und sollte nun unter /dev zu finden sein.
Als nächstes müssen auf dem Device die nötigen Partitionen und die entsprechende Partitionstabelle angelegt werden. Es wird hierbei mit dem GPT-Partitionsschema gearbeitet.
Zuerst wird die Partitionstabelle angelegt
# gpart create -s GPT /dev/md0
Mit dem folgenden Befehl kann immer angezeigt werden wie die Partitionstabelle aktuell aussieht. Dies kann auch zwischendurch sinnvoll sein um sich einen Überblick zu verschaffen.
# gpart show md0
Damit das Device am Ende auch booten kann muss es mit dem entsprechenden bootcode versehen werden.
# gpart bootcode -b /boot/pmbr md0
Nun wird noch eine Partition mit den Bootdaten benötigt von welcher das System dann starten kann. Diese wird dann noch mit dem entsprechenden Bootcode versehen.
# gpart add -b 34 -s 128 -t freebsd-boot md0 # gpart bootcode -p /boot/gptboot -i 1 md0
Nun können die gewünschten Partitionen für das System angelegt werden. In diesem ersten Fall wird nur eine Partition für das komplette System angelegt.
# gpart add -b 162 -s 2004797 -a 1m -t freebsd-ufs /dev/md0
Nachdem die Systempartition angelegt wurde muss sie noch mit einem Dateisystem versehen werden. Hier wird einUFS2 Dateisystem mit Softupdates erschaffen, welches noch ein Label-Namen erhält. Dies ist wichtig, dass das System später auch an verschiedenen USB-Ports starten kann!
# newfs -U -L STICKBSD /dev/md0p2
Wird FreeBSD 9.0 oder höher eingesetzt kann man zusätzlich die Option -j setzen um ''Journaling-Softupdates einzusetzen.
# newfs -j -L STICKBSD /dev/md0p2
Nachdem nun die Systempartition angelegt und formatiert ist kann sie gemountet werden um sie weiter zu bearbeiten.
# mount /dev/ufs/STICKBSD /mnt
Zunächst sind die aktuellen Systemquellen erforderlich. Um diese herunterzuladen und zu installierten wird nach Systemquellen aktualisieren vorgegangen.
Das System wird aus den Quellen kompiliert und installiert. Zunächst wird im Verzeichnis /usr/src sowohl die „Welt“ als auch der Kernel kompiliert. Da in diesem Fall der Buildrechner ein amd64-System ist muss der Buildtarget noch auf i386 geändert werden um auch auf älteren Systemen ohne amd64-kompatible-CPU lauffähig zu sein. Sollte der Buildrechner selbst ein i386-System sein ist die Angabe der TARGET- und TARGET_ARCH-Anweisungen unnötig.
# cd /usr/src # make TARGET=i386 TARGET_ARCH=i386 buildworld # make TARGET=i386 TARGET_ARCH=i386 buildkernel
Das kompilierte Ergebnis liegt in diesem Fall (des Crosscompiles) unter /usr/obj/i386.
Nach Kompilieren des Systems und des Kernels können diese nun in die neue Partition installiert werden.
# make TARGET=i386 TARGET_ARCH=i386 installworld DESTDIR=/mnt # make TARGET=i386 TARGET_ARCH=i386 installkernel DESTDIR=/mnt # make TARGET=i386 TARGET_ARCH=i386 distribution DESTDIR=/mnt
make installworld installiert die „Welt“, make installkernel installiert den Kernel und make distribution legt die Konfigurationsdateien in /etc an. Wichtig ist hier das DESTDIR, also das Zielverzeichnis richtig anzugeben.
Nun ist der erste Schritt getan.
Um das installierte System ein wenig umfangreicher an Software auszustatten werden die Ports des Buildrechners per Nullfs-Mount zur Verfügung gestellt. Somit wird kein Platz im Device verschwendet.
# cd /mnt/usr # mkdir ports # mount_nullfs -o ro /usr/ports /mnt/usr/ports
Nun muss noch die Datei /mnt/etc/make.conf mit folgendem Inhalt ergänzt oder erzeugt werden damit die Ports nicht im Original-Portbaum gespeichert oder gebaut werden.:
WRKDIRPREFIX=/tmp DISTDIR=/tmp/distfiles PACKAGES=/tmp/packages
Damit nun das /tmp-Verzeichnis des Images nicht überläuft wird für die Dauer des Portbaus Festplattenplatz für das Verzeichnis verwendet. Also wird nochmals ein Nullfs-Mount (diesmal jedoch mit Schreibrechten) durchgeführt. Angenommen ein zur Verfügung gestelltes Verzeichnis trägt den Namen /usr/home/USER/temp-fuer-stick. Dann lautet der Befehl:
# nullfs_mount /usr/home/USER/temp-fuer-stick /mnt/tmp
Am Ende aller Installationen kann das Verzeichnis wieder gelöscht werden.
Nun werden Änderungen direkt am Image-System vorgenommen.
Um nun das System noch weiter anzupassen wird mittels chroot ins neue Image gewechselt:
# chroot /mnt /bin/csh
Um später ein schönes Live-System zu haben wird das /-Verzeichnis ReadOnly eingebunden. Anschließend werden zwei RAM-Disks erstellt welche Änderungen am System bis zum Neustart speichern können. Das Verzeichnis /var enthält statische Daten welche jedoch im Betrieb Änderungen erfahren. Daher wird das ReadOnly-Verzeichnis /var nun per unionfs mit einer RAM-Disk zusammengeführt.
/dev/ufs/STICKBSD / ufs ro 1 1 md /mvar mfs rw,-s10M,noatime 0 0 md /tmp mfs rw,-s5M,noatime 0 0 /mvar /var unionfs rw 0 0 proc /proc procfs rw 0 0
Anschließend muss /mdvar noch angelegt werden.
# mkdir /mvar
Weitere Anpassungen können nun am System vorgenommen werden. So können nun noch Ports installiert, Benutzer angelegt oder Konfigurationen verändert werden. Vor Allem sollte die /etc/rc.conf erzeugt und der Hostnamen des Systems defineirt werden. Zudem kann die /boot/loader.conf angepasst werden um bestimmte Module zu laden, z.B. für Sound, Netzwerk, etc.
Das Kennwort des Benutzers root sollte nun noch geändert werden.
# passwd
Um nun alle arbeiten zu beenden wird die chroot-Umgebung verlassen (falls nicht schon geschehen). Die Image-Partition wird ausgehängt und das Memorydevice freigegeben.
# umount /mnt # mdconfig -d -u md0
Nun kann noch das temporäre Verzeichnis, welches für eventuelles Port-bauen verwendet wurde gelöscht werden.
# rm -r /usr/home/USER/temp-fuer-stick
Das Image, welches nun fertig sein sollte, kann mit folgendem Befehl auf den USB-Stick bekannt werden. Der Stick darf hierfür nicht gemounted sein! Vorausgesetzt der Stick heisst /dev/da0.
# dd if=stick.img of=/dev/da0 bs=4096
Um Änderungen am System durchzuführen wird das Image einfach wieder per mdconfig -f gemounted und neu auf den Stick geschoben.
Derzeit kein Image vorhanden
Unter dem Link http://denkrobat.de/bsdstick_raw-1.img bsdstick_raw-1.img liegt ein Beispielimage welches nach obigem Vorgehen generiert wurde. Es beinhaltet nur einen minimale Installation ohne zusätzliche Benutzer. Das Kennwort von root lautet bsdstick.
Wie alle Artikel dieses Wiki ist der Inhalt mit viel Hilfe von außen entstanden. Folgende Quellen haben mir geholfen: