Zpool automatisch einhängen

danvari

Well-Known Member
Moinmoin :)

ich habe folgendes "Problem": Ich habe mir eine FDE eingerichtet, im Speziellen habe ich eine GPT-Tabelle auf der Master-Platte, einen Zpool zboot auf dem sich /boot befindet und ein Zpool zroot, wo sich der Rest befindet.
In /boot/zfs/zpool.cache habe ich das Cachefile von zroot kopiert, sodass der Bootmanager zroot kennt und von dort booten kann. Jetzt mein Problem:
zboot wird nicht automatisch eingehangen. In der /etc/rc.conf habe ich ein zfs_enable="YES" stehen, und zfs import gibt mir folgenden Eintrag:

Code:
# zpool import
   pool: zboot
     id: 16685084247435122413
  state: ONLINE
 action: The pool can be imported using its name or numeric identifier.
 config:

        zboot       ONLINE
          ada0p2    ONLINE

Sprich er sagt mir, dass zboot importiert werden kann. Das kann ich machen:

Code:
# zpool import zboot
# zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
zboot  1016M   380M   636M    37%  1.00x  ONLINE  -
zroot   920G   281G   639G    30%  1.00x  ONLINE  -

Also auch kein Problem. Ich muss die Aktion auch nicht forcieren mit "-f" oder so. Wenn ich jetzt allerdings neustarte, ist zboot wieder exportiert und ich muss es wieder importieren. Quasi so, als würde es beim Herunterfahren exportiert werden.

Habt ihr eine Idee, woran das liegen könnte?
 
Oder mal anders gefragt: Sollte ein bereits importierter zpool bei einem Neustart automatisch wieder importiert werden, sofern er nicht exportiert wurde? In dem zfs-rc Skript wird ja nur ein "zfs mount -a" aufgerufen, was ja nicht die Pools importiert. Oder sollte das Cachefile dafür sorgen, welche Pools beim Booten importiert werden und welche nicht?
 
Hallo

Ja der Befehl "zfs mount -a" importiert keine Pools. Es wird aber der Eintrag von "mountpoint" gelesen und dann passend gemountet.

Diese Einträge kannst du dir mit "zfs get mounted,mountpoint" oder "zfs get all <POOL>" anzeigen lassen.
 
Verstehe ich dich richtig? zboot wird beim Start nicht importiert und zroot schon?

Ich habe meinen root pool damit definiert:

Code:
zpool set bootfs=zroot zroot

Ich habe in der loader.conf das drin:

Code:
zfs_load="YES" >/boot/loader.conf
vfs.root.mountfrom="zfs:base" >> /boot/loader.conf

Und zfs list sieht so aus:

Code:
base            31,7G   189G   913M  legacy
base/j-test     71,9M   189G   879M  /usr/jail/jtest
base/jftp       1,99G   189G  1,92G  /usr/jail/jftp
base/jtexlive   8,78G   189G  7,18G  /usr/jail/jtexlive
base/usr        19,2G   189G  2,73G  /usr
base/usr/local  6,74G   189G  3,69G  /usr/local
base/usr/ports  9,02G   189G  5,98G  /usr/ports
base/usr/src     415M   189G   203M  /usr/src
base/var         526M   189G   339M  /var
home/data       1,37T   891G  1,37T  /usr/home/joseph/DIVERSES
home/home        448G   891G   448G  /usr/home

Durch dieses Setup brauche ich in der fstab keine Einträge ... ok für TMPFS und Swap schon aber naja. :)
Ich habe boot und root nicht in separaten pools liegen und weiß daher nicht ob das dein Problem ist, aber ich hoffe das hilft dir.
 
Zuletzt bearbeitet:
Das ist grundsätzlich keine Problem es sei denn dein Pool ist zu kompliziert aufgebaut als das der Bootloader ihn lesen kann. Der Bootloader versteht nur Pools aus einem VDEV vom Type Disk, Mirror oder RAID-Z1. Willst du also Pools mit mehreren VDEVs, RAID-Z2 oder RAID-Z3 nutzen musst du den Kernel von außerhalb laden.
 
Danke erst einmal für die ganzen Antworten. Ich glaube ich muss euch noch ein paar mehr Informationen geben. Meine Partitionstabelle sieht so aus:

Code:
=>        34  1953525101  ada0  GPT  (931G)
          34           6        - free -  (3.0k)
          40         128     1  freebsd-boot  (64k)
         168     2097152     2  freebsd-zfs  (1.0G)
     2097320     8388608     3  freebsd-swap  (4.0G)
    10485928  1943039200     4  freebsd-zfs  (926G)
  1953525128           7        - free -  (3.5k)

Die Partition 2 ist der Zpool "zboot". Hier befindet sich /boot drauf. In Partition 4 befindet sich eine geli-Partition und darin "zroot", auf dem sich / befindet.

Das ist grundsätzlich keine Problem es sei denn dein Pool ist zu kompliziert aufgebaut als das der Bootloader ihn lesen kann.
Der Bootloader erkennt ja zboot (er lädt ja den Kernel und Root) und auch zroot. Hier gibt es kein Problem.

Verstehe ich dich richtig? zboot wird beim Start nicht importiert und zroot schon?
Exakt. Hier mal die Flags von den beiden Pools:

Code:
zpool get all zroot
NAME   PROPERTY       VALUE       SOURCE
zroot  size           920G        -
zroot  capacity       30%         -
zroot  altroot        -           default
zroot  health         ONLINE      -
zroot  guid           13508118510024092807  default
zroot  version        28          default
zroot  bootfs         zroot       local
zroot  delegation     on          default
zroot  autoreplace    off         default
zroot  cachefile      -           default
zroot  failmode       wait        default
zroot  listsnapshots  off         default
zroot  autoexpand     off         default
zroot  dedupditto     0           default
zroot  dedupratio     1.00x       -
zroot  free           638G        -
zroot  allocated      282G        -
zroot  readonly       off         -
zroot  comment        -           default
zroot  expandsize     0           -

Code:
zpool get all zboot
NAME   PROPERTY       VALUE       SOURCE
zboot  size           1016M       -
zboot  capacity       37%         -
zboot  altroot        -           default
zboot  health         ONLINE      -
zboot  guid           16685084247435122413  default
zboot  version        28          default
zboot  bootfs         -           default
zboot  delegation     on          default
zboot  autoreplace    off         default
zboot  cachefile      -           default
zboot  failmode       wait        default
zboot  listsnapshots  off         default
zboot  autoexpand     off         default
zboot  dedupditto     0           default
zboot  dedupratio     1.00x       -
zboot  free           636M        -
zboot  allocated      380M        -
zboot  readonly       off         -
zboot  comment        -           default
zboot  expandsize     0           -

Code:
zpool import
   pool: zboot
     id: 16685084247435122413
  state: ONLINE
 action: The pool can be imported using its name or numeric identifier.
 config:

        zboot       ONLINE
          ada0p2    ONLINE
Ja der Befehl "zfs mount -a" importiert keine Pools. Es wird aber der Eintrag von "mountpoint" gelesen und dann passend gemountet.

Hier mal die Mountpoints von den beiden Pools.

Code:
zfs get mountpoint zroot
NAME   PROPERTY    VALUE       SOURCE
zroot  mountpoint  /           local

Code:
zfs get mountpoint zboot
NAME   PROPERTY    VALUE       SOURCE
zboot  mountpoint  /zboot      local
 
Ich bin überfragt, der einzige gravierende Unterschied zu meinem Setup ist, deine pools liegen auf einer platte, meine auf 2.

Hier mal meine Partitionsaufteilung:

Code:
eddy# gpart show ada0
=>       63  488397105  ada0  MBR  (232G)
         63  488397105     1  freebsd  [active]  (232G)

eddy# gpart show ada0s1
=>        0  488397105  ada0s1  BSD  (232G)
          0  471859200       1  freebsd-zfs  (225G)
  471859200   16537905       2  freebsd-swap  (7.9G)

Den zpool home habe ich direkt auf dem Device ada1 angelegt.

Eigentlich sollte es egal sein, aber warum wird deine Bootpartition nach /zboot gemountet?
 
Eigentlich sollte es egal sein, aber warum wird deine Bootpartition nach /zboot gemountet?

Auf zboot befindet sich /boot bzw. auch der Ordner /boot ;) (damit für den Bootloader es so aussieht wie /). Daher mounte ich zboot nach /zboot und erhalte dann /zboot/boot. Dieses symlinke ich dann nach /boot :).
 
Ich meine ich hatte die gleiche Eigenart beobachtet als ich auf meinem laptop zwei zpools eingerichtet hatte (einer für /boot und ein anderer für /).

Beim Laptop war's recht egal und ich habe halt vor kernelupgrades einfach |mount sys| gemacht... Du könntest mal im FreeBSD Bugtracker schauen und wenn da nichts steht das ganze (in einer VM z.B.) reproduzieren und reporten.
 
Auf zboot befindet sich /boot bzw. auch der Ordner /boot ;) (damit für den Bootloader es so aussieht wie /). Daher mounte ich zboot nach /zboot und erhalte dann /zboot/boot. Dieses symlinke ich dann nach /boot :).

Also nur mal aus Neugir, warum nicht gleich
Code:
zfs create zroot/boot

Natürlich sollte auch dein Setup laufen, also generell, aber mir leutet nicht ein warum du das so machst wie du es machst.
 
Also nur mal aus Neugir, warum nicht gleich
Code:
zfs create zroot/boot

z.B. Laptop mit ZFS+GELI. Da muss man den kernel laden (von "zboot") bevor man den eigentlichen root-pool ("ztank") mounten kann. Sonst fällt mir aber ehrlich gesagt auch nichts ein. (und ich nutze mittlerweile wieder ufs /boot)
 
z.B. Laptop mit ZFS+GELI. Da muss man den kernel laden (von "zboot") bevor man den eigentlichen root-pool ("ztank") mounten kann. Sonst fällt mir aber ehrlich gesagt auch nichts ein. (und ich nutze mittlerweile wieder ufs /boot)

Ich sollte mich echt mal mit Vollverschlüsselung beschäftigen, Danke. :)
Aber das Einhängen in /zboot und symlinken nach /boot ist nicht zwingend notwendig oder? Nicht das ich das Setup von danvari in Frage stellen will, könnte ja sein das es nicht möglich ist nach /boot zu mounten.
 
Ja genau, du brauchst den Kernel und damit den ganzen Treiber-Support und auch Krypto-Unterstützung, erst dann kannst du ja / entschlüsseln ;).

Ich habe auch echt keine Ahnung, woran es liegt. Hatte auch schon probiert den Pool umzubenennen, hat auch nichts gebracht. Jetzt habe ich diesen Workaround eingebaut:

Code:
*** zfs 2013-06-07 09:36:57.996383239 +0200
--- /etc/rc.d/zfs       2013-06-07 09:31:56.301506999 +0200
***************
*** 23,28 ****
--- 23,29 ----
  
  zfs_start_main()
  {
+       zpool import -a
        zfs mount -a
        zfs share -a
        if [ ! -r /etc/zfs/exports ]; then

Also ich sage dem "zfs"-Skript, dass er alle Pools importieren soll und das klappt bisher auch ganz gut :). Vielleicht werde ich mal einen Bug öffnen, allerdings weiss ich nicht, ob das nicht auch so beabsichtigt ist (also importierte Pools sollen nach Neustart nicht aotumatisch wieder re-importiert werden).
 
Einen habe ich noch!
Ich schätze es liegt am cache, du erwähntest ja das du es von zboot nach zroot kopiert hast. Ich vermute du hattest beim Kopieren den falschen Pool genommen, die man page sagt nämlich:

Code:
All pools in this cache are  automatically  imported  when  the  system boots.

Versuche doch mal von zroot nach zboot zu kopieren ... evtl. sicherst du die Platte vorher, in der man steht soviel Cache das ich mir nicht sicher bin was da alles drüber gemacht wird.

EDIT: Ich habe gerade bemerkt, dass man bei einer Installation das cachefile des Installations roots übernimmt. Also kommt es natürlich darauf an wie du die Installation gemacht hast.
 
Zuletzt bearbeitet:
Eigentlich ist es so, dass importierte Pools auch nach dem Neustart automatisch ohne Probleme importiert werden sollen. D.h., dass sie wohl eigentlich gar nicht importiert werden muessen, da sie ja beim Herunterfahren nicht exportiert wurden. Exportieren bringt einen Pool in einen Zustand, in dem er z.B. auf andere Maschinen transferiert werden kann, um ihn dort zu importieren. Exportierte Pools werden nicht automatisch importiert.

Vielleicht liegt es an der bootfs-property? Du willst ja von zboot booten, oder? Das tut das System ja wohl auch schon, was ich etwas komisch finde. Vielleicht respektiert der loader die bootfs-property nicht. Was steht denn in der loader.conf?

Der GPT-ZFS-Loader scheint mir im Uebrigen nicht sonderlich gut dokumentiert zu sein ...
 
Einen habe ich noch!
Ich schätze es liegt am cache, du erwähntest ja das du es von zboot nach zroot kopiert hast. Ich vermute du hattest beim Kopieren den falschen Pool genommen, die man page sagt nämlich:


Code:
All pools in this cache are automatically imported when the system boots.
Versuche doch mal von zroot nach zboot zu kopieren ... evtl. sicherst du die Platte vorher, in der man steht soviel Cache das ich mir nicht sicher bin was da alles drüber gemacht wird.

Ja, ich dachte auch, dass es am Cachefile liegen könnte. Während der Installation habe ich nur ein Cachefile für zroot angegeben und dieses nach /boot/zfs/zpool.cache kopiert. Vielleicht ist das das Problem... hmm

Eigentlich ist es so, dass importierte Pools auch nach dem Neustart automatisch ohne Probleme importiert werden sollen. D.h., dass sie wohl eigentlich gar nicht importiert werden muessen, da sie ja beim Herunterfahren nicht exportiert wurden. Exportieren bringt einen Pool in einen Zustand, in dem er z.B. auf andere Maschinen transferiert werden kann, um ihn dort zu importieren. Exportierte Pools werden nicht automatisch importiert.

Vielleicht liegt es an der bootfs-property? Du willst ja von zboot booten, oder? Das tut das System ja wohl auch schon, was ich etwas komisch finde. Vielleicht respektiert der loader die bootfs-property nicht. Was steht denn in der loader.conf?

Nunja, ich boote ja eigentlich von zroot und nicht von zboot. Das bootfs-Entry steht bei zroot auch auf zroot. Sollte dies anders sein?

Hier ist mal meine komplette loader.conf:

Code:
cat /boot/loader.conf
zfs_load="YES"
geom_eli_load="YES"
nvidia_load="YES"
kern.cam.scsi_delay="10000"
loader_color="YES"
vfs.root.mountfrom="zfs:zroot"
 
Ja, stimmt glaub' ich doch mit dem bootfs. Ich hatte gedacht, dass mit dem Booten das Laden des Kernels und der Treiber gemeint war, aber es ist wohl das komplette Hochfahren des Systems mir rc-Skripten, usw. damit gemeint.

Also doch die Cache-Datei? Aber die muesste doch eigentlich angepasst werden, sobald Du den Pool importierst. Wenn aber der Pfad zu dieser Datei zum Zeitpunkt des Importierens noch nicht existiert, weil die Datei auf dem Pool/Filesystem liegt, welches Du gerade importierst, kann das System sie nicht anpassen. Vielleicht ist das das Problem.

Es gibt ja auch noch das Tool zdb, welches leider als ich es mal benutzen wollte unter FreeBSD auch nicht komplett dokumentiert war, mit dem man aber auch die Cache-Datei analysieren kann (vielleicht "zdb -C", wenn man der Illumos-man-page trauen kann...).
 
Uuhh, gute Idee. Hier ist mal der Output von zdb:

Code:
% zdb -C
zroot:
    version: 28
    name: 'zroot'
    state: 0
    txg: 19491
    pool_guid: 13508118510024092807
    hostname: ''
    vdev_children: 1
    vdev_tree:
        type: 'root'
        id: 0
        guid: 13508118510024092807
        children[0]:
            type: 'disk'
            id: 0
            guid: 15874212026989858112
            path: '/dev/ada0p4.eli'
            phys_path: '/dev/ada0p4.eli'
            whole_disk: 1
            metaslab_array: 30
            metaslab_shift: 33
            ashift: 12
            asize: 994831237120
            is_log: 0
            create_txg: 4

Damit ist zboot nicht im Cache, obwohl ich es importiert habe. Jetzt ist nur die Frage, wie ich zboot in den Cache bekomme. Das kann ich vermutlich nicht so im "laufenden Betrieb", sondern muss eine LiveCD dafür starten.
 
Alles klar, der Thread kann geschlossen werden. Es lag tatsächlich an dem Cachefile :) Habe nun die LiveCD gestartet und beide Pools reimportiert mit nur einem Cachefile und dieses dann nach /boot/zfs/zpool.cache kopiert. Jetzt läuft es problemlos :).

Danke an alle, die mir hier geholfen haben!
 
Eine Info noch für Leute die hierauf stoßen: Die zpool.cache datei liegt unter
Code:
/boot/zfs/zpool.cache
. Das heißt natürlich, wenn du /boot erst später importierst wird sie nicht neu geschrieben. Du kannst, ohne livecd, daher folgendes machen:
Code:
zfs mount -o cachefile=/tmp/zpool.cache zboot
cp /tmp/zpool.cache /boot/zfs/zpool.cache
 
Bedenkt, dass FreeBSD 8.4 und 9-STABLE den Root-Pool auch ohne Cache-File und loader.conf-Eintrag booten. Es reicht, wenn das Pool-Property "bootfs" gesetzt ist. Nicht-Root-Pools brauchen das Cachefile aber weiterhin. Das war ein Kompromiss, um so weit es geht kompatibel zu Illumos zu bleiben.
 
Zurück
Oben