[FreeBSD] ZFS, Geli, Gpart - Totalverwirrnug

lockdoc

Well-Known Member
Hallo,

ich hab mich jetzt bei gpart und zfs eingelesen, bin aber letzendlich total verwirrt. Irgendwie ist das manchmal so wenn man total viel von allem liest, denkt man hat es verstanden und am ende weiß man gar nichts mehr. :-(

Vorab:
+ Ja ich habe auch das wiki über zfs gelesen ;-)
+ Ich nutze FreeBSD8RC1

Was will ich:
+ 3x 1TB Platten mit Geli verschlüsseln und ein raidz machen
+ boot von USB Stick

Was verwirrt mich:

(1.) Ich weiß jetzt nicht ob ich gpart oder fdisk nutzen soll

(2.) Wie funktioniert gpart, wenn ich alle 3 platten vollständig, also ohne partitionen bzw. slices (Aufteilung^^) nutzen will. Es soll halt nur ein zfs Dateisystem eingerichtet werden damit dieses dann in den zfs pool rein kann.
In welchem schritt verschlüssel ich das ganze mit geli? Vor gpart, nach gpart oder nach dem einhängen in den zpool?
Ein Beispiel-Kommando von gpart würde mir echt mega-helfen, welches eine Platte komplett mit zfs für den zpool, bzw für geli fertig macht (je nachdem welcher schritt dann als nächstes kommt).

(3.) Brauche ich überhaupt zfs formatierte Platten, wenn die in eh einem zfs pool kommen?


Zur Info:
Code:
# ls /dev | grep ad
ad10
ad10s1
ad12
ad12a
ad14

Leider gehen meine gpart versuche ins leere
Code:
# gpart create -s GPT ad10
gpart: geom 'ad10': File exists

# gpart create -s GPT ad12
gpart: geom 'ad12': File exists

# gpart create -s GPT ad14
[COLOR="Green"]ad14 created # <--- ?????[/COLOR]

Und wieder nix
Code:
# gpart destroy ad10
gpart: device busy

# gpart destroy ad12
gpart: device busy

# gpart destroy ad14
ad14 destroyed

# gpart destroy ad14
[COLOR="Green"]ad14 destroyed   # <--- ????[/COLOR]

Info
Code:
# gpart show
=>             0 1953523055     ad12    BSD  (932G)
               0         16             - free -  (8.0K)
              16 1953523039        1    !0  (932G)

=>            63 1953522963     ad10    MBR  (932G)
              63 1953522081        1     freebsd  [active]  (932G)
      1953522144        882              - free -    (441K)
 
Zuletzt bearbeitet:
Hmm ok ich hab das mit gpart delete und destroy schon etwas weiter geschafft. Sieht jetzt wie folgt aus:

Code:
> gpart show

=>            34 1953522988     ad10    GPT  (932G)
              34 1953522988             - free -  (932G)

=>            34 1953522988     ad12    GPT  (932G)
              34 1953522988             - free -  (932G)

=>            34 1953525101     ad14    GPT  (932G)
              34 1953525101             - free -  (932G)

(zu Frage 2): Kann ich jetzt schon die geli verschlüsselung machen, before ich "gpart add ..." mache? Ich will halt wirklich bei allen 3 Platten jeweils die komplette Platte nutzen ohne partitionen und alle 3 dann als raidz laufen lassen
 
Ok anscheinend kann ich nicht jetzt schon geli initializieren und muss zuerst mit "gpart add ..." arbeiten, denn:

nach dem gpart create (siehe oben) habe ich folgendes gemacht


Code:
### Load Geli
Fixit> ln -s /dist/boot/kernel /boot/kernel
Fixit> ln -s /dist/lib /lib
Fixit> kldload geom_eli

Code:
### Create Keys
> mkdir -p /root/keys
> dd if=/dev/random of=/root/keys/ad10.key bs=128k count=1
> dd if=/dev/random of=/root/keys/ad12.key bs=128k count=1
> dd if=/dev/random of=/root/keys/ad14.key bs=128k count=1

Code:
### Encrypt
> geli init -K /root/keys/ad10.key -s 4096 -l 256 /dev/ad10	### ohne "-b", da keine pwd abfrage beim Boot

> geli init -K /root/keys/ad12.key -s 4096 -l 256 /dev/ad12	### ohne "-b", da keine pwd abfrage beim Boot

> geli init -K /root/keys/ad14.key -s 4096 -l 256 /dev/ad14	### ohne "-b", da keine pwd abfrage beim Boot

Code:
### Attach
> geli attach -k /root/keys/ad10.key /dev/ad10
> geli attach -k /root/keys/ad12.key /dev/ad12
> geli attach -k /root/keys/ad14.key /dev/ad14

Wenn ich jetzt "gpart show" mache ist der output leer? Kann mir jemand sagen warum?

Edit:
Wenn ich die Platten wieder detache, dann zeigt "gpart show" auch wieder die korrekten daten an
 
Totally confused

Jetzt bin ich am Ende mit dem Latein!

Ok was mich jetzt total verwirrt. Ich habe folgendes getan.
Ich habe mit "gpart delete" und "gpart destroy" wieder alles gelöscht was ich mit gpart erstellt hatte. Also ich habe jetzt wieder 3 unpartitionierte 1TB Platten.

Diese habe ich jetzt einzeln mit geli verschlüsselt und habe jetzt sowas
ad10.eli ad12.eli und ad14.eli
Diese 3 dinger sind immer noch unpartitioniert und ohne fs und auch keine slices, also nix.

Jetzt habe ich einfach folgendes gemacht
Code:
zpool create tank raidz ad10.eli ad12.eli ad14.eli
[CODE]

Ergebnis
[CODE]
# zpool list
NAME SIZE   USED  AVAIL CAP HEALTH ALTROOT
tank 2.72T  752K  2.72T  0% ONLINE -

# df -h
[...]
tank   1.8T   128K    1.8T   0%   /tank

# mount
tank on /tank (zfs, local)


Ich verstehe jetzt nicht warum das so einfach geklappt hat, ich habe doch nirgends die Platten mit zfs formatiert. Warum muss ich denn hier vorher kein gpart oder fdisk machen???
 
Eigentlich ist es ganz einfach, aber fangen wir mal vorn an. Es gibt verschiedene Partitionstypen. Am verbreitetsten ist sicher noch immer der gute, alte DOS-MBR, welcher irgendwann gegen Mitte der 80er - ich meine 1984 - von Microsoft eingeführt wurde. MBR ist aber ein sehr dummes Schema, besteht es doch nur aus einer Tabelle am Anfang der Platte, welche exakt vier Einträge haben kann. Da er außerdem nur mit 32 Bit Werten arbeitet, kann eine Partition maximal 2^32 Byte, das sind ziemlich genau 2 Terabyte, lang sein. Auß diesem Grund hat man schon früh andere Schemen ausgedacht. Eines sind die BSDLabel, ein anderes der von Sun verwendete EBR. Irgendwann in den 90ern, als Intel seine IA64 Architektur vorstellte, dachten sie sich ein ganz anderes Schema aus. Dies wurde GPT genannt. GPT hat gegenüber allen anderen mindestens drei Vorteile: Es ist in der Lage praktisch unbegrenzt viele Partitionen anzulegen, es ist durch zweifache Speicherung der Tabelle sehr robust - wer mal im Tran einen MBR überschrieben hat, wird sich freuen - und die verwalteten Datenträger können 2^128 Bit lang sein. Vielleicht bereue ich die Aussage in 20 Jahren, aber es ist unwahrscheinlich, dass es je ein Medium mit einer solchen Länge geben wird.

Jetzt gibt es unter FreeBSD verschiedene Tools. Klassisch einmal fdisk(8) zum Anlegen von MBR-Tabellen und bsdLabel(8) zum Anlegen von BSDLabeln. Dazu gpt(8) für GPT-Tabellen. sunlabel(8) für SUN-Tabellen. Etc. Um dies übersichtlicher zu machen, hat man gpart(8) geschrieben. Dies Tool kann alle von FreeBSD nutzbaren Partitionstabellen schreiben. Oder anders gesagt, mit gpart(8) kann man alles machen und benötigt fdisk(8) und co. nicht mehr.

So, die nächste Frage. Wieso brauchen wir überhaupt Partitionen? Man braucht sie unter unixoiden Systemen nur aus zwei Gründen. Einmal, damit Boot-Programme überhaupt wissen, von wo sie was laden sollen. Dafür sind die Partitionstypen da. Dein Ladeprogramm schaut sich die MBR-Tabelle an, sieht "aha, einmal Typ 165. Das ist FreeBSD, also startet ich aus dieser Partition". Der zweite Grund ist, das man Platten gern in verschiedene Blöcke einteilen will. /usr, /var, /usr/home und so weiter.

Nun ist unter unixoiden Systemen alles eine Datei. Unter einigen mehr, unter anderen weniger, aber das macht hier keinen Unterschied. Tools wie newfs(8) oder zpool(8) erwarten ein Gerät zum Arbeiten, mehr nicht. Ob dieses Gerät nun eine blanke Platte wie /dev/ad0 ist, eine MBR-Partition wie /dev/ad0s1, ein BSDLabel in einem MBR wie /dev/ad0s1a, eine GPT-Tabelle wie /dev/ad0p1 oder ganz was anderes ist ihnen völlig egal. Oder anders gesagt, du kannst auch eine blanke Platte ohne jede Partition mit jedem Dateisystem deiner Wahl formatieren. Das hast du mit deinem "zpool create tank raidz ad10.eli ad12.eli ad14.eli" gemacht. Du hast drei unpartitionierte, aber mit GELI verschlüsselte Platten auf einen ZPool formatiert.

Ist das nun gut oder schlecht? Kommt drauf an. Grundsätzlich ist von unpartitionierten Datenträgern abzuraten. Denn man sieht nicht, was auf ihnen ist. Dem unbedarften Nutzer erscheinen sie als leer. Vor allem aber gibt es Systeme wie Windows, die zwangsläufig Partitionen benötigen. Windows würde die Platten sehen und dich fragen, ob er sie neu formatieren soll. Damit wären deine Daten im Eimer.

Unter FreeBSD und anderen unixoiden Systemen kann man Dinge zudem auch noch beliebig Stapeln. Das verwirrt nun aber sicher entgültig. Ob du die ganze Platte verschlüsselst und dann partitionierst, ob du erst partitionierst und dann verschlüsselt, macht keinen Unterschied. Ist halt Geschmackssache. Man kann auch Partitionen stapeln. In MBR-Partitionen weitere BSDLabel einzufügen, hat jeder von uns schon einmal gemacht. Aber man kann es auch viel weiter treiben. Ein GPT außen, ein MBR ist eine Partition und in die MBR-Partitionen wieder ein BSDLabel, in das Label wieder ein GPT... Sinnlos, aber möglich.
 
Nun zum eigentlichen Problem. Du hast folgendes gemacht:
- Altes Schema und seine Partitionen gelöscht.
- Neues angelegt.
- Partitionen erstellt.
- Die ganze Platte verschlüsselt.

Siehst du den Fehler? Durch das Verschlüsseln der ganzen Platte hast du die im vierten Schritt angelegten Partitionen wieder überschrieben, bzw. überdeckt. Daher siehst du sie nur im ausgehängten Zustand. Sobald du einhängst, geht alles durch ELI, der denkt seine Platte ist leer und weg sind die Partitionen. Korrekt wäre also erst verschlüsseln und dann die Partitionen anlegen:
- Altes Schema und seine Partitionen löschen.
- GELI initialisieren.
- Schema anlegen.
- Partitionen erstellen.
- zpool auf den Partitionen anlegen.

Alternativ, um die Partitionen anstelle der Platte zu verschlüsseln:
- Altes Schema und seine Partitionen löschen.
- Schema anlegen.
- Partitionen erstellen.
- GELI auf den Partitionen initialisieren
- zpool auf den Partitionen anlegen.
 
Hmm OK Wenn ich nochmal drüber nachdenke.

1.) Wenn ich die uninitialisierten platten verschlüssel und dann dem zpool hinzufüge, dann bekommen die automatisch das zfs-dateisystem... ist das korrekt?

2.) ohne fdisk, gpart, etc kann ich die platten beispielsweise nicht einfach mit ufs einhängen, da freebsd ja nich weiß das es eine ufs partition wär oder?

3.) Ohne fdsik, gpart, etc werden gar keine Partitionstabellen geschrieben, also kann ich gar keine vorteile von gpart etc nutzen oder?


- Altes Schema und seine Partitionen löschen.
- GELI initialisieren.
- Schema anlegen.
- Partitionen erstellen.
- zpool auf den Partitionen anlegen

Das erscheint mir persönlich als sicherstes Schema, denn (so wie ich dich verstanden habe) falls jemand mir die Platten klaut (OK weit hergeholt), dann würde er unpartitionierte Festplatten sehen, denn erst nach der Geli-entschlüsselung sieht man Partitionen.
 
Das erscheint mir persönlich als sicherstes Schema, denn (so wie ich dich verstanden habe) falls jemand mir die Platten klaut (OK weit hergeholt), dann würde er unpartitionierte Festplatten sehen, denn erst nach der Geli-entschlüsselung sieht man Partitionen.

Genau. Eine mit "zufall" gefüllte Festplatte. Nicht sehr interessant....

Entscheiden kannst du jetzt aber noch ob es gut ist die Daten in der Hierarchie so weit unten zu verschlüsseln... also in deinem Fall wird für jede der Daten drei mal der Verschlüsseler angeworfen weil die Daten auf drei Platten verteilt werden. Durch Redundanz in der Speicherung entsteht auch Redundanz beim verschlüsseln und so ein mittergroßer Overhead gegenüber einer Verschlüsselung "weiter oben".
Wenn du aus den Platten einen ZFS-Verbund machst und dann diese "Partition" mit GELI verschlüsselst wird nur einmal verschlüsselt und die schon verschlüsselten Daten dann redundant auf die Festplatten geschrieben.
Beides hat Vor- und Nachteile. Ein entschiedener Nachteil beim zweiten Vorgehen ist das man die Vorteile von ZFS quasi verliert... man kann nicht mehr so dynamisch umstrukturieren: nicht ohne weiteres vergrößern/verkleinern...

Zusammengefasst würde ich das so umzusetzten wie du es geschildert hast... außer man muss gerade ordentlich an Prozessorarbeit sparen.

Grüße!
 
@MrMarv: Ok das ist natürlich ein guter Punkt.

also wär es wahrscheinlich von der Performance her doch besser erst die Partitionen mit gpart zu erstellen und dann zu verschlüsseln und dann im letzten schritt die verschlüsselten devices in den zpool einzubinden.

Zum System:
Core2Du mit 3.0Ghz und 4GB Ram.
Wie hoch schätzt du denn die Verlustleistung von der Performance her, die beim lesen/schreiben von verschlüsselten Platten so entsteht oder spielt das hier nicht so die große Rolle, wegen der schnellen CPU?
Gibs dazu evtl. irgendwo was zum nachlesen
 
1.) Wenn ich die uninitialisierten platten verschlüssel und dann dem zpool hinzufüge, dann bekommen die automatisch das zfs-dateisystem... ist das korrekt?

- Genau. Da ist dann ZFS drauf.

2.) ohne fdisk, gpart, etc kann ich die platten beispielsweise nicht einfach mit ufs einhängen, da freebsd ja nich weiß das es eine ufs partition wär oder?

- Doch kannst du. Wie oben geschrieben, FreeBSD ist die Partitionierung völlig egal. Du sagt "mount /dev/ad0 /mnt", er öffnet /dev/ad0 und findet die magische Nummer am Beginn des UFS2-Dateisystem. Dann versucht er den Mount.

3.) Ohne fdsik, gpart, etc werden gar keine Partitionstabellen geschrieben, also kann ich gar keine vorteile von gpart etc nutzen oder?

- Genau. ohne Partitionierung keine Vorteile durch sie.
 
Ich hab das jetzt mal überflogen und bin etwas verwirrt, wozu genau sollen da jetzt Partitionen (mit gpart) angelegt werden, warum nicht platte->geli->zfs? Wenn doch eh die ganze Platte rein soll...
 
Hi soul_rebel, ja das wusste ich ja erst auch nicht, darum war ich ja so verwirrt, dass es auch ohne gpart geklappt hat.
Jetzt hat sich meine Info allerdings geändert, da ich gelesen habe, dass ein swap im zpool nicht das beste ist und ich jetzt die Platte vorher mit gpart teile und von jeder 1GB abzweige um nachher den swap dafür zu nutzen. der rest wird verschlüsselt und dann in den pool gepackt.
 
Zurück
Oben