FreeBSD und GEOM-Mirror

Installation auf einem mit GMirror angelegten RAID1 (Mirror)

GEOM-Framework

Mit dem GEOM-Framework in FreeBSD wurde eine Möglichkeit geschaffen, den Zugriff auf Datenträger durch Module zu beeinflussen. Dazu werden die Kommunikationswege zwischen Dateisystem und Kernel durch GEOM umgeleitet. Innerhalb von GEOM wird der Datenstrom an Module (Plugins) verteilt, bevor er zu den Lowlevel-Funktionen des Gerätetreibers gelangt. In Abbildung 1 ist dieser Sachverhalt grafisch dargestellt.

Abbildung 1: Datenfluss mit GEOM-Framework

GMIRROR

Mit Hilfe des GEOM-Plugins GMIRROR lässt einfach und schnell ein Harddisk-Mirror aufbauen. Das bedeutet, mindestens zwei Festplatten gleicher Größe – am besten auch aus der gleichen Serie – enthalten dieselben Daten. Man nennt das Datenspiegelung oder RAID1. Der Vorteil liegt auf der Hand: fällt eine der beiden Festplatten aus, so werden die Daten vom Datenspiegel gelesen. Sobald ein funktionstüchtiger Datenträger eingebaut wird, werden die Daten auf das neue Speichermedium kopiert.

Abbildung 2: Datenfluss mit GMIRROR

Mit GMIRROR lassen sich nicht nur einzelne Slices oder Partitionen spiegeln, sondern auch der gesamte Datenträger. Informationen über die Partitionierung werden dabei genauso auf den anderen Datenträger kopiert wie normale Daten. Das gilt übrigens auch für die später beschriebene Verschlüsselung mit GELI. Es gilt aber zu beachten, dass GMIRROR den letzten Sektor eines Datenträgers für seine eigenen Metadaten verwendet. Die führt unter Umständen zu problematischen Betriebszuständen des Datenspiegels, wenn eine Partionstabelle nach dem Schema GPT angelegt wird. Bei diesem Schema wird eine Sicherheitskopie der Partitionstabelle beginnend beim letzten Sektor her angelegt. Wie schnell zu erkennen ist, werden dabei die GMIRROR-Metadaten überschrieben. GMIRROR quittiert daraufhin den Dienst. Nach dem erfolgreichen Aufsetzen eines Datenspiegels, befinden sich im Verzeichnis /dev/mirror die passenden Gerätetreiber, wobei die Gerätebezeichnungen dem Label entsprechen. So ist ein Zugriff auf die Partitionen und Slices gewährleistet. Die folgenden Beispiele erläutern, wie man mit GMIRROR einen Datenspiegel aufbaut und ins laufende System integriert. In einem weiteren Schritt erfolgt dann die Installation eines bootfähigen FreeBSD auf einem Datenspiegel.

Ein Harddisk-Mirror für eigene Daten

Es sollen zwei Datenträger ad1 und ad2 gleicher Größe zu einem Datenspiegel zusammengefasst werden. Dieser Mirror wird für einen Datenbankserver unter /database eingehängt.

# gmirror label -v data ad1 ad2

Es werden die beiden Festplatten ad1 und ad2 für einen Mirror vorbereitet. Dieser bekommt den Namen data, wodurch ein Gerätetreiber /dev/mirror/data vom Kernel generiert wird. Alle weiteren administrativen Tätigkeiten werden nur noch über diesen Gerätenamen abgewickelt werden. Anschließend wird der Datenspiegel formatiert

# newfs /dev/mirror/data
und eingehängt
# mount /dev/mirror/data /database

Es wird keine Partitionstabelle angelegt! Nur aus diesem Grund funktioniert der Datenspiegel.

Installation von FreeBSD auf GMIRROR

Wie bereits erwähnt, gibt es Probleme sobald GMIRROR und GPT-Metadaten zusammentreffen. Daher ist es nicht sinnvoll, einen Datenspiegel über die gesamten Datenträger zu legen und anschließend die Partitionierung anzulegen. Besser ist es folgende Schritte zu befolgen:

  • Anlegen des Partitionsschemas auf jedem Datenträger, der von GMIRROR verwaltet werden soll
  • für jede einzelne Partition einen Spiegel einrichten und mit einem Label versehen
  • jeden einzelnen Spiegel formatieren und einhängen

Gehen wir in medias res. Man bootet vom Installationsmedium in das Installationsprogramm. Wenn man in einer Dialogbox gefragt wird, wie man die Partitionierung vornehmen möchte, wählt man wie in Abbildung 3 zu sehen ist Shell aus.

Abbildung 3: Dialogbox mit Auswahl Partitionierung

Zunächst wird der erste Datenträger eingerichtet, wobei die angegeben Größenangaben für die einzelnen Partitionen Beispielangaben sind. Für das Bootprogramm sind allerdings 128KiB Pflicht.

gpart create -s gpt ada0
gpart add -s 128k -t freebsd-boot -l boot0 ada0
gpart add -a 1m -s 8G -t freebsd-swap -l swap0 ada0
gpart add -a 1m -s 48G -t freebsd-ufs -l root0 ada0
gpart add -a 1m -t freebsd-ufs -l home0 ada0

Mit dem ersten Kommando wird die Partitionstabelle mit dem Schema GPT angelegt. Im zweiten Schritt erstellt man eine Partition für das Bootprogramm und benennt diese „boot0“. Da immer auch Platz für Swapping sein sollte, wird eine separate Partition der Größe 8GiB erstellt und „swap0“ benannt. Für das Betriebssystem sind 48GiB vorgesehen und schließlich stehen für private Daten im Home-Verzeichnis die restliche Kapazität des Datenträgers zur Verfügung. Wichtig ist der Parameter „-a 1m“: hiermit wird festgelegt, dass sich die einzelnen Partitionen an der ein Megabyte Grenze (= 1048576 Bytes) ausrichten. Es hat sich herausgestellt, dass die Ausrichtung an diesen Grenzen die Zugriffszeiten minimiert, was besonders bei Datenträgern mit einer Blockgröße von 4096Bytes zum Tragen kommt. Mit dem zweiten Datenträger ada1 verfährt man genauso. Allerdings dürfen die Label nicht „boot0“, „swap0“, „root0“ und „home0“ heißen, sondern „boot1“, „swap1“, „root1“ und „home1“:

gpart create -s gpt ada1
gpart add -s 128k -t freebsd-boot -l boot1 ada1
gpart add -a 1m -s 8G -t freebsd-swap -l swap1 ada1
gpart add -a 1m -s 48G -t freebsd-ufs -l root1 ada1
gpart add -a 1m -t freebsd-ufs -l home1 ada1

Auf beide Disks muss jetzt das Bootprogramm übertragen werden. Dies geschieht auch wieder mit dem Tool gpart:

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

Damit die angelegten Partitionen mir ihren Labeln für die nächsten Schritte zur Verfügung stehen, veranlasst man den Kernel die Informationen mit den folgenden Befehlen neu einzulesen:

true > /dev/ada0
true > /dev/ada1

Ein Blick in das Verzeichnis /dev/gpt zeigt, ob alle Label vorhanden sind (Ausgabe so oder ähnlich):

# ls -l /dev/gpt/
crw-r-----  1 root  operator    0, 100 /dev/gpt/boot0
crw-r-----  1 root  operator    0, 108 /dev/gpt/boot1
crw-r-----  1 root  operator    0, 106 /dev/gpt/home0
crw-r-----  1 root  operator    0, 114 /dev/gpt/home1
crw-r-----  1 root  operator    0, 102 /dev/gpt/root0
crw-r-----  1 root  operator    0, 110 /dev/gpt/root1
crw-r-----  1 root  operator    0, 104 /dev/gpt/swap0
crw-r-----  1 root  operator    0, 112 /dev/gpt/swap1

Nach dem Kontrollblick wird das RAID1 erzeugt:

gmirror label -h boot /dev/gpt/boot0 /dev/gpt/boot1
gmirror label -h swap /dev/gpt/swap0 /dev/gpt/swap1
gmirror label -h root /dev/gpt/root0 /dev/gpt/root1
gmirror label -h home /dev/gpt/home0 /dev/gpt/home1

Die Verknüpfung der einzelnen Partitionen erfolgt mit dem Kommando gmirror. Gleichzeitig bekommt jeder einzelne Datenspiegel ein Label, mit dem später die Partitionen in das System eingehängt werden. Bevor die Partitionen formatiert werden, überprüft man das RAID1 nochmals. Dazu muss man zuerst das Kernel-Modul mit kldload geom_mirror laden. Eine Prüfung lässt sich anschließend lässt mit gmirror status durchführen.
Das Ergebnis der Statusabfrage sieht ähnlich dem Folgenden aus:

Name         Status    Components
mirror/home  COMPLETE  gpt/home1 (ACTIVE)
                       gpt/home0 (ACTIVE)
mirror/root  COMPLETE  gpt/root1 (ACTIVE)
                       gpt/root0 (ACTIVE)
mirror/swap  COMPLETE  gpt/swap1 (ACTIVE)
                       gpt/swap0 (ACTIVE)
mirror/boot  COMPLETE  gpt/boot1 (ACTIVE)
                       gpt/boot0 (ACTIVE)

Alle Mirrors sind angelegt (Ausgabe: COMPLETE) und die einzelnen Datenträger sind aktiv (Ausgabe: ACTIVE). Im vorletzte Schritt erfolgt die Formatierung mit dem Befehl newfs. Hierzu eine Anmerkung: falls für das RAID1 SSDs verwendet werden, sollte man den Parameter -t bei newfs angeben.

# -- fuer HDDs:
newfs -U /dev/mirror/root
newfs -U /dev/mirror/home
# -- fuer SSDs:
newfs -t -U /dev/mirror/root
newfs -t -U /dev/mirror/home

Damit das Installationsprogramm die Möglichkeit hat, seine Arbeit fortzusetzen, hängt man die Betriebs­system- und die Home-Partition mit mount /dev/mirror/root /mnt beziehungsweise mount /dev/mirror/home /mnt/home ein. Bevor die Shell verlassen wird, muss die Filesystem-Tabelle fstab angelegt werden. Dazu bedient man sich des spartanischen Editors vi. Die Datei hat folgenden Inhalt, der natürlich zu den bisherigen Schritten passen muss!

# Device          Mountpoint      FStype  Options Dump    Pass#
/dev/mirror/swap  none            swap    sw      0       0
/dev/mirror/root  /               ufs     rw      1       1
/dev/mirror/home  /home           ufs     rw      1       1

Wichtig ist, dass die Datei fstab im Verzeichnis /tmp/bsdinstall_etc/ liegt. Nur dort findet das Installationsprogramm die Tabelle und kopiert sie an die richtige Stelle, damit später das Betriebssystem korrekt bootet. Damit sind alle Schritte durchlaufen und man verlässt die Shell mit exit. Es erscheint die in Abbildung 4 dargestellte Dialogbox.

Abbildung 4: Dialogbox nach verlassen der Shell

Nach Abschluss der Installation ruft man nochmals die Shell auf, da an der Systemkonfiguration noch kleinere Änderungen durchgeführt werden müssen. Die betrifft die Kernel-Konfiguration. In der Shell setzt man folgende Kommandos ab:

# echo 'geom_mirror_load="YES"' >> /boot/loader.conf
# echo 'daily_status_gmirror_enable="YES"' >> /etc/periodic.conf

Der Eintrag in /boot/loader.conf sorgt dafür, dass beim Booten von FreeBSD das Kernel-Modul zu GMIRROR automatisch geladen wird und so der Mirror dem Betriebssystem zur Verfügung steht. Die zusätzliche Angabe in /etc/periodic veranlasst das Betriebssystem in regelmäßigen Abständen den Zustand des RAD1 zu überprüfen und per Mailsystem mitzuteilen. Nach diesen Aktionen verlässt man die Shell wieder und startet FreeBSD neu.

Powered by w3.css