Freebsd/sparc64-zfs-root-ufs-boot
Inhaltsverzeichnis
FreeBSD 9 auf SPARC64
Um FreeBSD9 (Zur Zeit RC-1) auf einer SPARC T245 zu installieren, bedarf es einiger Vorarbeiten, da sich die Installation doch sehr von einer auf Intel basierender Installationsanleitung unterscheidet. Daher habe ich aus zig verschiedenen Anleitungen und Mails das hier zusammengeschrieben, um zu einem FreeBSD9 mit ZFS für den Root Baum (/) zu kommen. Eines sei gleich erwähnt: /boot wird nach wie vor auf einem UFS installiert, da der Bootloader kein ZFS unterstützt. Des weiteren wird die Installation über das Netzwerk, per NFS/TFTP erfolgen, da in meiner SPARC kein CD-Rom verbaut ist. Die Steuerung erfolgt über das ALOM (serielle Konsole).
Als NFS/DHCP Server kommt ein Debian Squeeze zum Einsatz.
Vorarbeiten Debian
Als erstes wird der Server vorbereitet:
Notwendige Pakete
# aptitude install nfs-kernel-server ethtool tcpdump rarpd tftpd openbsd-inetd |
- isc-dhcp-server - DHCP Server. Alternativ dnsmasq
- nfs-kernel-server - Für den NFS Server
- tcpdump - Goldwert beim debuggen
- ethtool - ist die Netzwerkkarte aktiv
- rarpd - Teilt der Sun ihre MAC Adresse mit / bzw. löst IP darauf auf
- tftpd - TFTP Server
- openbsd-inetd - Für den TFTP Server. Alternativ geht auch xinetd
Netzwerk
- In diesem Fall ist die Sparc mit der Netzwerkkarte 3 (bge2 / boot net3) direkt mit dem Linux Server (eth2) verbunden
- /etc/network/interfaces
auto eth2 iface eth2 inet static address 192.168.1.1 netmask 255.255.255.0 |
# ifup eth2 # ethtool eth2 ethtool eth2 Settings for eth2: Supported ports: [ TP ] [...] Link detected: yes |
DHCP Server
- Einrichtung des DHCP Servers
Hier die Konfigurationsdatei:
- /etc/dhcp/dhcpd.conf
ddns-update-style none; option domain-name "domain.foo"; option domain-name-servers 130.83.160.60; default-lease-time 600; max-lease-time 7200; log-facility local7; subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.5 192.168.1.10; option broadcast-address 192.168.1.255; option routers 192.168.1.1; option subnet-mask 255.255.255.0; next-server 192.168.1.1; default-lease-time 600; max-lease-time 7200; } host freebsd { hardware ethernet 00:11:22:33:44:55:66; option host-name "freebsd.domain.foo"; fixed-address 192.168.1.5; always-reply-rfc1048 on; filename "kernel"; option root-path "192.168.1.1:/media/freebsd9-nfs"; option routers 192.168.1.1; } |
Der DHCP Server soll nur an der eth2 lauschen, und sonst nirgends:
- /etc/default/isc-dhcp-server
INTERFACES="eth2" |
- DHCP Starten:
# /etc/init.d/isc-dhcp-server restart |
RARPd Server
- Einrichtung des RARPd Servers
Der RARPd Server dient dazu der SPARC ihre IP Adresse auf Bootebene mitzuteilen. Dies entspricht in etwa dem PXE/DHCP Verfahren. Dazu muss die Datei /etc/ethers angelegt und befüllt werden:
- /etc/ethers
11:22:33:44:55:66 192.168.1.5 |
Die MAC Adresse entspricht der Netzwerkkarte der SPARC. Entweder kann sie im Alom abgefragt werden, oder zB. auch über tcpdump
- RARPD starten:
# /etc/init.d/rarpd restart |
Alternativ
Als Alternative zu RARPD der Service Console (OBP) mitteilen, sie möchte DHCP verwenden. Siehe dazu hier
TFTPD Server
- Einrichtung des TFTPD Servers
Für die Einrichtung ist nicht mehr viel notwendig. Einzig eine kleine Anpassung an der inetd.conf Datei:
- /etc/inetd.conf
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /media/freebsd9-nfs |
Der Standardpfad wäre /srv/tftp.
# /etc/init.d/openbsd-inetd restart |
NFS Server
- Einrichtung des NFS Servers
Die Hauptaufgabe des NFS Servers besteht darin, das Root System für die Installation bereitzustellen. Dazu wird die FreeBSD9 (derzeit RC2) DVD heruntergeladen (z.B hier) und über /media/freebsd9-nfs bereitgestellt. Auch um einige Arbeiten zu erleichtern, ist es sinnvoll die Möglichkeit zu haben, schreiben zu können. Damit erspart man sich die Einrichtung eines Ram Laufwerks.
ISO Image
- ISO Image bereitstellen
# mkdir /media/(iso,freebsd9,freebsd9-nfs) ; cd /media/iso # wget ftp://ftp.freebsd.org/pub/FreeBSD/releases/sparc64/sparc64/ISO-IMAGES/9.0/FreeBSD-9.0-RC2-sparc64-dvd1.iso # wget ftp://ftp.freebsd.org/pub/FreeBSD/releases/sparc64/sparc64/ISO-IMAGES/9.0/CHECKSUM.SHA256 # sha256sum < FreeBSD-9.0-RC2-sparc64-dvd1.iso f53810ff78e4015833e0ac9e81865c1abd93c622607d14aa2a74b918d2bc469c - # grep dvd1 CHECKSUM.SHA256 | cut -d' ' -f 4 f53810ff78e4015833e0ac9e81865c1abd93c622607d14aa2a74b918d2bc469c # mount -o loop /media/iso/FreeBSD-9.0-RC2-sparc64-dvd1.iso /media/freebsd9 |
Basis System
- Basis System bereitstellen
An dieser Stelle gäbe es mehrere Möglichkeiten, bzw. direkt das Startsystem von dem ISO Image zu beziehen. In diesem Fall jedoch extrahiere ich die Dateien /media/freebsd9/usr/freebsd-dist/* nach /media/freebsd9-nfs, um eigene Anpassungen zu ermöglichen.
# cd /media/freebsd9-nfs # for i in $(ls /media/freebsd9/usr/freebsd-dist/*.txz); do tar Jxf $i ; done # mkdir /media/freebsd9-nfs/usr/freebsd-dist # cp /media/freebsd9/usr/freebsd-dist/*.txz /media/freebsd9-nfs/usr/freebsd-dist/ |
Die Meldungen von Tar "tar: Ignoring unknown extended header keyword" können - wie es schon darsteht - ignoriert werden. Am Ende hat man ein Basissystem, welches sich hervorragend auch als Rescue System eignet. Der Kopierbefehl am Schluss ist wichtig, um das Basissystem auf die ZFS Volumes entpacken zu können.
Exports
- NFS Export einrichten
Nun werden die passenden Verzeichnisse exportiert:
- /etc/exports
/media/freebsd9-nfs 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash) |
- NFS Server neustarten
# /etc/init.d/nfs-kernel-server restart |
Loader Link
- Loader Link erstellen
Die SPARC wird beim Starten eine Datei anfordern, die heißt, wie die vergebene IP Adresse, allerdings in HEX. Folgende Zeile hilft beim Umrechnen:
# IP_ADDR='192.168.1.5'; printf '%02X' ${IP_ADDR//./ }; echo C0A80105 |
Dann wird der Link zum Bootloader erzeugt (nicht notwendig, wenn per OBP boot net3:dhcp verwendet wird):
# cd /media/freebsd-nfs/boot # ln -s loader C0A80105 |
In diesem Fall ist auch sehr hilfreich mittels TCPdump den Verkehr zu beobachten:
# tcpdump -i eth2 -n [...] |
Start / Test
Sind all diese Aufgaben erledigt, steht einem Test nichts mehr im Wege. Dazu wird über das Alom Interface bzw. Keyboard das Stop Signal gesendet:
- Hier ein Auszug von einer T245:
sc> break Are you sure you want to send a break to the system [y/n]? y sc SC Alert: SC Request to send Break to host. > console -f Warning: User <auto> currently has write permission to this console and forcibly removing them will terminate any current write actions and all work will be lost. Would you like to continue? [y/n]y Enter #. to return to ALOM. {1} ok boot net3 Probing system devices Probing memory Probing I/O buses screen not found. keyboard not found. Keyboard not present. Using ttya for input and output. Probing system devices Probing memory Probing I/O buses Sun Fire V245, No Keyboard Copyright 2007 Sun Microsystems, Inc. All rights reserved. OpenBoot 4.22.33, 4096 MB memory installed, Serial #78666804. Ethernet address 0:14:4f:b0:5c:34, Host ID: 84b05c34. Rebooting with command: boot net3 [...] |
Die jeweiligen Befehle sind die abgesetzten Zeilen. In diesem Fall wird von der vierten Netzwerkkarte gebootet. Klappt alles, so wird der FreeBSD Loader gestartet und am Ende steht der Login des Live Systems. Mittel root und ohne Kennwort ist der Login möglich.
Eventuell kann es auch der Linux Seite noch Hilfreich sein, NAT und IP Forwarding zu aktivieren, um dem Rechner aus, über die Linux IP Adresse ins Netzwerk / Internet zu kommen:
Wenn man sich RARPD sparen möchte, so kann man auch einfach der OBP sagen, dass DHCP verwenden werden soll:
[...] {1} ok boot net3:dhcp |
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # echo 1 > /proc/sys/net/ipv4/ip_forward |
Statt eth0 muss natürlich die jeweils passende Netzwerkkarte eingesetzt werden, über die der Linux Rechner ins Internet / Netzwerk kommt.
FreeBSD Installieren
Kommen wir nun zum eigentlichen Teil, dem installieren des Systems selbst. Die Festplatten im System heißen da0 und da1. Die Bootpartition wird über Geom gespielt und die Root Partition übernimmt ZFS Mirror.
Partitionen
Mittels gpart werden die passenden Partitionen angelegt bzw. die alten vorher gelöscht. Unter www.wonkity.com findet sich einge Übersicht der gängigsten Befehle von Gpart.
- Partitionen löschen
# gpart delete -i 1 da0 # gpart delete -i 2 da0 # gpart delete -i 3 da0 ... # gpart delete -i 1 da1 # gpart delete -i 2 da1 # gpart delete -i 3 da1 ... |
War auf dem System zuvor ein Solaris, sollte die Partitionstabelle bereits ein VTOC8 sein, wenn nicht:
# gpart destroy da0 # gpart create -s vtoc8 da0 # gpart destroy da1 # gpart create -s vtoc8 da1 |
- Partitionen anlegen
# gpart add -s 1G -t freebsd-ufs da0 # gpart add -s 1G -t freebsd-ufs da1 # gpart add -s 4G -t freebsd-swap da0 # gpart add -s 4G -t freebsd-swap da1 # gpart add -t freebsd-zfs da0 # gpart add -t freebsd-zfs da1 # gpart show da0 # gpart show da1 |
- Bootloader installieren
# /sbin/gpart bootcode -p /boot/boot1 da0 # /sbin/gpart bootcode -p /boot/boot1 da1 |
Sollte es aber eine Meldung geben: "operation not permitted", kann man folgendes vorher probieren:
# sysctl kern.geom.debugflags=0x10 |
Sollte der Befehl immer noch nicht funktionieren, geht auch das veraltete Programm sunlabel
# sunlabel -B da0 # sunlabel -B da1 |
ZFS Pool Basics
Nun kommt der ZFS Teil:
- ZFS Pool anlegen
# kldload opensolaris.ko # kldload zfs.ko # zpool create zroot mirror /dev/da0d /dev/da1d # zpool set bootfs=zroot zroot # mkdir /zroot/bootdir # newfs /dev/da0a # mount /dev/da0a /zroot/bootdir |
Das Verzeichnis bootdir wird später verschoben.
ZFS Verzeichnisse
Folgt die BSD Struktur
- ZFS Volumes anlegen
# zfs set checksum=fletcher4 zroot # zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp # chmod 1777 /zroot/tmp # zfs create zroot/usr # zfs create zroot/usr/home # cd /zroot ; ln -s /usr/home home # zfs create -o compression=lzjb -o setuid=off zroot/usr/ports # zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles # zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages # zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src # zfs create zroot/var # zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash # zfs create -o exec=off -o setuid=off zroot/var/db # zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg # zfs create -o exec=off -o setuid=off zroot/var/empty # zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log # zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail # zfs create -o exec=off -o setuid=off zroot/var/run # zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp # chmod 1777 /zroot/var/tmp |
FreeBSD Installation
Nun folgt die FreeBSD Installation. Dazu wird im Prinzip das selbe System kopiert, wie auch schon beim NFS Livesystem:
- FreeBSD Basis
# cd /zroot # /bin/sh # for i in $(ls /usr/freebsd-dist/*.txz); do tar xf $i ; done # zfs set readonly=on zroot/var/empty |
- Basis Einstellungen:
# chroot /zroot # echo 'zfs_enable="YES"' > /etc/rc.conf # echo 'hostname="foo.domain.local"' >> /etc/rc.conf # echo 'ifconfig_bge0="inet 192.168.1.5 netmask 255.255.255.0"' >> /etc/rc.conf # echo 'defaultrouter="192.168.1.1"' >> /etc/rc.conf # echo 'nameserver 192.168.1.1' >> /etc/resolv.conf # echo 'zfs_load="YES"' > /boot/loader.conf # echo 'vfs.root.mountfrom="zfs:zroot"' >> /boot/loader.conf # echo 'geom_mirror_load="YES"' >> /boot/loader.conf |
- Root Passwort, Zeitzone und aliases
# passwd ... # tzsetup ... # cd /etc/mail # make aliases # exit |
Nicht das exit vergessen, da die Chroot Umgebung verlassen wird.
- Muss noch die Cache Datei vom ZFS an den passenden Ort kopiert werden:
# cp /boot/zfs/zpool.cache /zroot/boot/zfs/zpool.cache |
FreeBSD Abschluss der Installation
- Boot Verzeichnis verschieben
# cd /zroot # mv boot bootdir/ # ln -s bootdir/boot /zroot/boot # chflags -h sunlink /zroot/boot |
Geom Spiegel für /bootdir
Als letztes Erfolgt die Spiegelung des neu installierten Systems.
- Geom einrichten
# kldload geom_mirror # sysctl kern.geom.debugflags=16 # gmirror label -vb round-robin gm0 da0a # gmirror insert gm0 da1a # gmirror status |
- /etc/fstab erzeugen
# cat << EOF > /zroot/etc/fstab /dev/mirror/gm0 /bootdir ufs rw,noauto 0 0 /dev/da0b none swap sw 0 0 /dev/da1b none swap sw 0 0 EOF |
- Aufräumarbeiten
# cd / # umount /zroot/bootdir # zfs unmount -a # zfs set mountpoint=legacy zroot # zfs set mountpoint=/tmp zroot/tmp # zfs set mountpoint=/usr zroot/usr # zfs set mountpoint=/var zroot/var |
Nun kann das System wieder mittels Alom (> boot disk) (hoffentlich) gestartet werden. :-)
Folgearbeiten
Nachfolgend eine Liste von Aufgaben, die als nächstes getan werden können:
- Root Login in /etc/ssh/sshd_config erlauben
- Überflüssige Terminals (ttyv1-8) deaktivieren in /etc/ttys
Hinweise
Ist das System gestartet, sollte man sich als nächstes folgende Seite anschauen: http://www.surlyjake.com/2009/03/how-to-update-my-sparc-freebsd-install/
Dort wird aufgeführt, wie unter SPARC das System aktuell gehalten wird.
Quellen
- http://wiki.freebsd.org/RootOnZFS/UFSBoot - ZFS
- http://ximalas.info/2011/10/17/zfs-root-fs-on-freebsd-9-0/ - ZFS
- http://www.freebsd.org/doc/de/books/handbook/geom-mirror.html - Spiegelung
- http://www.freebsd.org/doc/handbook/config-network-setup.html - Allgemeine Netzwerkkonfiguration
- http://www.ish.com.au/solutions/articles/freebsdzfs - ZFS
- http://phaq.phunsites.net/2006/03/07/freebsd-geom-mirror-on-sparc64/ - Spiegelung
- http://freebsd.1045724.n5.nabble.com/Is-it-easy-to-netboot-sun-fire-V210-using-only-sparc64-iso-image-and-intel-host-td4163227.html - Netboot
- http://www.jzab.de/content/pxe-install-network-installation-freebsd-linux-box - Netboot
- http://wiki.hidden.ch/index.php/FreeBSD - Allgemeine BSD infos