Fragen zu zfs

Petro

Member
Hallo,

ich habe noch ein paar Fragen zu ZFS, welche ich auch nach mehreren Stunden lesen nicht verstanden habe.

- Was ich verstanden habe ist. Festplatten werden zu einem (wirklich nur einem oder können es auch mehrere) storage pools zusammengefasst.

- Wenn ein mirror eingerichtet werden soll, wird ein pool angelegt mit den zwei Festplatten als Parameter. Feststellung: Ein Pool bestehend aus zwei Platten !?

- Wenn aber zwei Platten vorhanden sind, welche beispielsweise /var/ als mirror nutzen sollen aber den rest des os nicht. Wie geht man da am Besten vor ?

CU Petro
 
Hallo,

ich habe noch ein paar Fragen zu ZFS, welche ich auch nach mehreren Stunden lesen nicht verstanden habe.

- Was ich verstanden habe ist. Festplatten werden zu einem (wirklich nur einem oder können es auch mehrere) storage pools zusammengefasst.

- Wenn ein mirror eingerichtet werden soll, wird ein pool angelegt mit den zwei Festplatten als Parameter. Feststellung: Ein Pool bestehend aus zwei Platten !?

- Wenn aber zwei Platten vorhanden sind, welche beispielsweise /var/ als mirror nutzen sollen aber den rest des os nicht. Wie geht man da am Besten vor ?

CU Petro

Hallo,
ich kann nicht garantieren, daß das auch für FreeBSD gilt aber.

a) Du kannst Pools bis zum abwinken anlegen
b) Ein Pool kann auch aus mehreren Platten bestehen, so hindert Dich niemand daran zu einem Mirror einen weiteren Mirror dazu zupacken, ebenso kannst Du Sparse-Drives dem Pool zusprechen.
c) Mit zpool wird ein Pool angelegt und mit zfs die "Filesysteme" angelegt, diese kannst du nach belieben einhängen.

Gruß
marmorkuchen
 
Hallo,

c) Mit zpool wird ein Pool angelegt und mit zfs die "Filesysteme" angelegt, diese kannst du nach belieben einhängen.

Aber ich verstehe folgendes nicht. Wenn ich doch zwei Festplatten habe und ich für einen mirror nur ganze Platten angeben kann, wie will ich es schaffen, dass ein Teil der Platte gemirrored wird und ein Teil nicht.

Mein Beispiel:

2x 500 GB Festplatten

Bereich 1 Mirror über die 2 Platten / jeweils 250 GB insgesamt 250 GB
Bereich 2 Einzeln (sozusagen jede Platte für sich / jeweils 250 GB insgesamt 500 MB

CU Petro

PS 1: Ich hätte da noch ne Frage, wie hänge ich denn eine Platte in den Pool ein. Wen ich mit zpool add arbeite bekomme ich immer die Meldung "cannot add to 'rpool': root pool can not have multiple vdevs or separate logs.
 
Es müssen nicht zwei ganze Platten sein, es gehen auch zwei gleich große Partitionen.
Ich habe z.B. 2x10GB gmirror root-Dateisystem und 2x490GB ZFS mirror für den Rest.
 
Das hat nun nicht direkt was mit deiner Frage zu tun, aber ich selbst frage mich ein wenig, wozu das gut sein soll.
Einen Verband von Festplatten legt man doch an, um höhere Performance zu bekommen (wobei der Effekt manchmal fraglich bleibt) oder doch allermeist, weil man sich eine Redundanz der Daten verspricht. Das bedeutet, wenn eine Festplatte den Geist aufgibt, bleiben die Daten erhalten, da sie ja aus dem noch vorhandenen Rest des pools wieder hergestellt werden könnnen.
Eine Platte stirbt niemals Partitionsweise.
Wenn also nur Partitionen zu pools verbunden werden, was macht das für einen Sinn?
Natürlich kann es sein, dass nur eine kleine Menge an Daten redundant bleiben soll, doch dafür dürfte es sehr viel einfacher sein, externe Datenträger und ein entsprechendes Backup-Tool zu nutzen.
Deshalb, anders.
Du kannst die Platten einfach zu einem Pool zusammenfassen und kannst innerhalb des Pools alles realisieren. Bei zwei Platten willst du vielleicht einen mirror nehmen (http://www.freebsd.org/cgi/man.cgi?query=zpool&sektion=8). Nachdem du den pool angelegt hast, kannst du das ZFS Dateisystem darauf etablieren. Siehe: http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/filesystems-zfs.html Auf dieser Seite ist auch ein Beispiel aufgeführt, das genau beschreibt, wie du dann ein Verzeichnis des Pools als /home Verzeichnis benutzen kannst. Analog kannst du das mit /var machen.
Wenn du die Größe begrenzen willst, wieso auch immer, dann kannst du das auch beim Anlegen des Filesystems als Option mitgeben, also, du gibst dann dem Filesystem ZFS auf dem Pool einen Namen und seine Optionen (auch dazu sieht man ein Beispiel im Handbuch).
Soll ein Pool tatsächlich nur Teile der Platten belegen und den Rest dieser Platten frei lassen, muss er sich natürlich auf Partitionen dieser Platten begrenzen. Wie gesagt, sehe ich persönlich für solche Konstruktionen wenig Sinn. Doch das steht nicht zur Debatte.
 
Hallo,



Aber ich verstehe folgendes nicht. Wenn ich doch zwei Festplatten habe und ich für einen mirror nur ganze Platten angeben kann, wie will ich es schaffen, dass ein Teil der Platte gemirrored wird und ein Teil nicht.

Mein Beispiel:

2x 500 GB Festplatten

Bereich 1 Mirror über die 2 Platten / jeweils 250 GB insgesamt 250 GB
Bereich 2 Einzeln (sozusagen jede Platte für sich / jeweils 250 GB insgesamt 500 MB

CU Petro

PS 1: Ich hätte da noch ne Frage, wie hänge ich denn eine Platte in den Pool ein. Wen ich mit zpool add arbeite bekomme ich immer die Meldung "cannot add to 'rpool': root pool can not have multiple vdevs or separate logs.

Hallo,
Du kannst ganze Platten, Partitionen oder auch Dateien als vdev nutzen.
Zum PS, mit zpool attach [-f] pool device new_device fügt man neue Platten hinzu.

Gruß
marmorkuchen
 
Dateien als vdev gehen meiner Erinnerung nach auf FreeBSD nicht. Da muss man den Umweg über mdconfig(8) gehen. Kann sich aber bei 8.0 geändert haben.
 
Dateien als vdev gehen meiner Erinnerung nach auf FreeBSD nicht. Da muss man den Umweg über mdconfig(8) gehen. Kann sich aber bei 8.0 geändert haben.

OK, ich sehe gerade, daß die zpool-Manpage von FreeBSD 8.0 noch von Sun ist.
Denn laut besagter Manpage sollen auch Files als vdev gehen.
Wobei es auch nicht gerade ein Riesenverlust wäre, wenn Files nicht gehen würden.
Ich lasse mich aber gerne eines besseren belehren. ;)

Gruß
marmorkuchen
 
Hallo,
Du kannst ganze Platten, Partitionen oder auch Dateien als vdev nutzen.
Zum PS, mit zpool attach [-f] pool device new_device fügt man neue Platten hinzu.

Gruß
marmorkuchen

Folgende Meldung bekomme ich:

Code:
#zpool attach rpool ad0 ad1
cannot attach ad1 to ad0: no such device im pool

ad0 ist das Device aus dem ich rpool gebaut habe...
Oder ist mit device etwas anderes gemeint ?

CU Petro
 
Irgendwie habe ich auch gelesen, dass attach dafür wäre eine Platte hinzuzufügen um aus einer einzelnen Platte einen Mirror zu erzeugen und add die Platte in den Pool hinzufügt um den Pool zu vergrößern.

Lieg ich da falsch ?
Bei mir geht Beides irgendwie nicht.

CU Petro
 
Was sagt denn zpool status?

Code:
zpool status
pool: rpool
state: ONLINE
scrub: scrub completed  ater 0h 1m with 0 errors on ....
config:

rpool  ONLINE 0 0 0
ad0p2 ONLINE 0 0 0

errors: No known data errors

Ok wenn ich zpool attach rpool ad0p2 /dev/ad1 mache dann kommt:
Code:
GEOM: ad1: partition 1 does not start on a track boundary
GEOM: ad1: partition 1 does not end on a track boundary
Was immer das heissen soll... und
Code:
cannot attach /dev/ad1 to ad0p2: device is too small

Das wird wohl die ungleiche Größe der 2ten Platte als Grund haben.

Leider bringt mir die Info (ad0p2) beim add Kommando nichts. Ich bekomme ich immer noch die Meldung:
Code:
zpool add rpool /dev/ad1
cannot add to 'rpool': root pool can not have multiple vdovs or separate logs

Auch wenn ich statt /dev/ad1 nur /ad1 eingebe bleibt die Meldung.

CU Petro
 
Okay, dein rpool läuft, dann bist du nicht weit vom rpool-Spiegel entfernt. Die zweite Platte sollte natürlich mindestens genauso große sein wie die erste...

Partitioniere die zweite Platte mit gpart genauso wie die erste und spiele für die zweite Platte auch den Bootstrap-Code ein, wie du es bei der ersten Platte gemacht hast. Dann sehen die Platten z.B. so aus:

%gpart show
=> 34 312581741 ada0 GPT (149G)
34 9 - free - (4.5K)
43 128 1 freebsd-boot (64K)
171 312581604 2 freebsd-zfs (149G)

=> 34 312581741 ada1 GPT (149G)
34 9 - free - (4.5K)
43 128 1 freebsd-boot (64K)
171 312581604 2 freebsd-zfs (149G)

Dann attache die zweite Platte (Partition) ==hier weiter==>

Edit2:
Ja sowas, das von mir in der blauen Sektion behauptete ist nicht haltbar! Es gibt in der Tat Probleme, wenn die Ports gewechselt werden und es wurde mit den Gerätenamen der Platten der zpool angelegt!!

D.h., es gilt doch das in der rot markierten Sektion erklärte, also die Pools bitte mit der Guid der Platte (Partition) anlegen. Sorry!

Edit1:
Das von mir in der roten Sektion behauptete ist falsch und darf ignoriert werden! Es kann direkt der Gerätename angegeben werden. Welcher zpool welche Platten benutzt wird entsprechend transparent verbucht.


==hier weiter==>, allerdings solltest du nicht das Device angeben sondern das entsprechende Guid-Label:

%glabel list
...
Geom name: ada0p2
Providers:
1. Name: gptid/6e3f6e0a-e401-11de-a6c8-0023543d88a5
Mediasize: 160041781248 (149G)
Sectorsize: 512
Mode: r1w1e1
secoffset: 0
offset: 0
seclength: 312581604
length: 160041781248
index: 0
Consumers:
1. Name: ada0p2
Mediasize: 160041781248 (149G)
Sectorsize: 512
Mode: r1w1e2
...
Geom name: ada1p2
Providers:
1. Name: gptid/c8e1379f-e7c1-11de-89b5-0023543d88a5
Mediasize: 160041781248 (149G)
Sectorsize: 512
Mode: r1w1e1
secoffset: 0
offset: 0
seclength: 312581604
length: 160041781248
index: 0
Consumers:
1. Name: ada1p2
Mediasize: 160041781248 (149G)
Sectorsize: 512
Mode: r1w1e2

Wenn der Spiegel resilvert ist, dann die erst Platte wieder detachen und gleich wieder mit ihrem Guid-Label attachen. Somit ist zukünftig einerlei an welchem ata-Port die Platten angeschlossen sind, egal wo die angestöpselt sind, die Platten (Partitionen) des zpools können immer gefunden werden.


Dann sieht das so aus:
%zpool status rpool
pool: rpool
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
gptid/6e3f6e0a-e401-11de-a6c8-0023543d88a5 ONLINE 0 0 0
gptid/c8e1379f-e7c1-11de-89b5-0023543d88a5 ONLINE 0 0 0

errors: No known data errors


Und dann solltest du auch testen ob wirklich von der zweiten Platte gebootet werden kann, zum Test entsprechend das Boot-Device im Bios ändern. Wenn das funktioniert, dann hast du wirklich einen Boot-Spiegel, der den Namen auch verdient.

Edit:
@Daten, die nicht unbedingt in den zpool gehören:
Also, alles und jedes was zum Filesystem gehört sollte im rpool (oder sonst einem pool) und somit auf dem Spiegel liegen!

Die einzige Ausnahme gilt für den SWAP-Space. Sicher könnte man den auch auf einen zpool legen:
%swapinfo
Device 1K-blocks Used Avail Capacity
/dev/zvol/rpool/SWAP 2097152 0 2097152 0%
Total 2097152 0 2097152 0%

Allerdings macht es wirklich Sinn wie von Yamagi empfohlen, für den Zweck auf jeder Platte noch mal eine Partiton anzulegen und beide per gmirror als SWAP-Device einzubinden aus Performancegründen.
 
Zuletzt bearbeitet:
Hallo,

vom letzten Post muss ich ehrlich gestehen habe ich nicht alles verstanden.

Ich habe jetzt folgenden Weg genutzt:

Code:
dd if=/dev/zero of=/dev/ad0 bs=4096 count=10
dd if=/dev/zero of=/dev/ad1 bs=4096 count=10

gpart create -s GPT ad0
gpart create -s GPT ad1

gpart add -b 34 -s 128 -t freebsd-boot ad0
gpart add -b 34 -s 128 -t freebsd-boot ad1

gpart add -b 162 -s 100000000 -t freebsd-zfs ad0
gpart add -b 162 -s 100000000 -t freebsd-zfs ad0

gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad0
gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad1

kldload /mnt2/boot/kernel/opensolaris.ko
kldload /mnt2/boot/kernel/zfs.ko

zpool create zfs-pool-1 mirror /dev/ad0p2 /dev/ad1p2
zpool set bootfs=zfs-pool-1 zfs-pool-1

zfs create zfs-pool-1/tmp
zfs create zfs-pool-1/usr
zfs create zfs-pool-1/var
zfs create zfs-pool-1/home

zfs create -V 2gb zfs-pool-1/swap
zfs set org.freebsd:swap=on zfs-pool-1/swap
zfs set checksum=off zfs-pool-1/swap

cd /dist/8.0-RELEASE/base
export DESTDIR=/zfs-pool-1
./install.sh
cd ../kernels
./install.sh generic
cd /zfs-pool-1/boot
cp -Rp GENERIC/* kernel/

cd /dist/8.0-RELEASE/src
./install.sh all
cd ../manpages
./install.sh

echo 'zfs_enable="YES"' > /zfs-pool-1/etc/rc.conf
echo 'LOADER_ZFS_SUPPORT="YES"' > /zfs-pool-1/etc/src.conf
echo 'zfs_load="YES"' > /zfs-pool-1/boot/loader.conf
echo 'vfs.root.mountfrom="zfs:zfs-pool-1"' >> /zfs-pool-1/boot/loader.conf

mkdir /boot/zfs
zpool export zfs-pool-1 && zpool import zfs-pool-1
cp /boot/zfs/zpool.cache /zfs-pool-1/boot/zfs/

chroot /zfs-pool-1
mount -t devfs devfs /dev
unset DESTDIR
cd /usr/src/sys/boot/
make obj
make depend
make
cd i386/loader
make install
umount /dev
touch /etc/fstab
exit

export LD_LIBRARY_PATH=/mnt2/lib
zfs set mountpoint=legacy zfs-pool-1
zfs set mountpoint=/tmp zfs-pool-1/tmp
zfs set mountpoint=/var zfs-pool-1/var
zfs set mountpoint=/usr zfs-pool-1/usr
zfs set mountpoint=/home zfs-pool-1/home

Ich kann jetzt über das Bios via IDE 0 oder auch IDE 1 booten. Das sollte es doch gewesen sein oder ?

Hättet Ihr Verbesserungsvorschläge ?

Das einzige was ich noch nicht verstanden habe ist, welches Filesystem nun boot hat.

CU Petro
 
Du hättest dir die erneute Installation ersparen können. Es hätte genügt, nur die andere Platte zu partitionieren, Bootstrap-Code einzuspielen und diese dann zu attachen, weil du ja schon einen läuffähigen rpool gehabt hast.

Wie auch immer, dein System läuft jetzt mit Spiegel.

---

Was ich persönlich aussetze, der rpool wurde definiert über die Gerätnamen ad0p2 und ad1p2. In meiner Umgebung gibt es dann Probleme, wenn ich vor einem Bootvorgang die Sata-Platten nun an andere Sata-Ports anschließe, weil sich in dem Fall der Name der Geräte ändern kann und es dann auch zu Problemen beim Start des zpools kommen kann.

Deshalb macht es Sinn, die zpools über eine für jedes System eindeutige, sich nicht mehr ändernde Kennung der Geräte (einerlei wo und an welchem System die Platten zukünftig angeschlossen werden) anzulegen. Solch eine Kenneng ist ein Label mit einer GUID Nummer und wird beim Anlegen von Partitionen mit gpart erzeugt und angezeigt mit:

%gpart list
...
Geom name: ada0p2
Providers:
1. Name: gptid/6e3f6e0a-e401-11de-a6c8-0023543d88a5
Mediasize: 160041781248 (149G)
Sectorsize: 512
Mode: r1w1e1
secoffset: 0
offset: 0
seclength: 312581604
length: 160041781248
index: 0
Geom name: ada1p2
Providers:
1. Name: gptid/c8e1379f-e7c1-11de-89b5-0023543d88a5
Mediasize: 160041781248 (149G)
Sectorsize: 512
Mode: r1w1e1
secoffset: 0
offset: 0
seclength: 312581604
length: 160041781248
index: 0
Consumers:
1. Name: ada1p2
Mediasize: 160041781248 (149G)
Sectorsize: 512
Mode: r1w1e2
...

D.h. in diesem Beispiel ist der GUID-Label
gptid/6e3f6e0a-e401-11de-a6c8-0023543d88a5 gleichbedeutend mit ada0p2
bzw.
gptid/c8e1379f-e7c1-11de-89b5-0023543d88a5 gleichbedeutend mit ada1p2.

Du könntest nun den zpool auf die GUID-Label umstellen wie folgt

%zpool detach zfs-pool-1 ad0p2
%zpool attach zfs-pool-1 ad1p2 gptid/6e3f6e0a-e401-11de-a6c8-0023543d88a5

Nun abwarten bis der resilvering-Vorgang abgeschlossen wurde (%zpool status zfs-pool-1) und dann genauso mit der anderen Platte vorgehen

%zpool detach zfs-pool-1 ad1p2
%zpool attach zfs-pool-1 gptid/6e3f6e0a-e401-11de-a6c8-0023543d88a5 gptid/c8e1379f-e7c1-11de-89b5-0023543d88a5

Damit gehst du bei zukünftigen Erweiterungen auf dem System mit zusätzlichen Platten bzw. bei der Migration des zpools zu einem anderen System Problemen aus dem Weg.

---

Das einzige was ich noch nicht verstanden habe ist, welches Filesystem nun boot hat.
Da du kein zfs-pool-1/boot Filesystem angelegt hast liegt /boot im Root-Filesystem zfs-pool-1 und das ist auch okay so.

Sicher könnte man auch /boot ein eigenes Filesystem geben und das dann z.B. die meiste Zeit über read-only schützen. (Um davon starten zu können, müsste man dann wohl setzen %zpool set bootfs=zfs-pool-1/boot zfs-pool-1 .)
 
Zuletzt bearbeitet:
Zurück
Oben