raidframe + gpt

spectre210

Well-Known Member
Ich habe zwei 2TB Platten im Kasten worauf netbsd läuft.
Beide Platten sollen zu einem Mirror zusammengefasst werden (raid1).
Partitionierungsschema soll gpt sein.
Die zwei Platten sind wd0 wd3.
Mein Vorschlag wäre:
Code:
gpt create wd0
gpt add -t ffs wd0
dkctl wd0 addwedge dk0 startblk cntblk ffs
gpt create wd3
gpt add -t ffs wd3
dkctl wd3 addwedge dk1 startblk cntblk ffs

raid1.conf:
Code:
START array
#numrow physical disks
1 2 0

#Identify physical disks
START disks 
/dev/dk0
/dev/dk1

#Layout ist simple 64 sectors per stripe
START layout
#Sect/StripeUnit StripeUnit/PariityiUnit Stripe/ReconUnit Raidlevel
128 1 1 1

#No spares
#START spare

#Command
START queue
fifo 100

Dann raid configuration:
Code:
label=`date +%Y%m%d%H%M`
raidctl -C /etc/raid1.conf raid1
raidctl -I label raid1
raidctl -iv raid1

Was ich danach habe ist ein raid1 device, den ich wie einhänge/bearbeite?
Muss ich dann nocheinmal gpt auf raid1 aufsetzen oder
Code:
mount /dev/raid1a /<my-mount>
 
Das sollte soweit stimmen, aber ich verwechsel die einzelnen Schritte auch gerne mal. Ob du ein Wedge für die gpt-Partitionen anlegen musst, müsstest du ausprobieren, evtl. werden die auch automatisch hinzugefügt.
Aber als Type solltest du nicht ffs, sondern raid benutzen.

Danach hast du das Blockdevice raid1, das du ggf. noch auto-bootable bzw. auf auto-assemble setzen willst.
Ob du da noch eine GPT draufpackst und nur eine Partition oder ob du einfach das Raid-Device so benutzt, ist dir überlassen.
Du musst aber schon noch ein Dateisystem auf dem Raid bzw. auf der Partition davon anlegen (wenn du es direkt auf dem Raid machst, musst du es forcen), siehe dafür newfs(8).

Magst du evtl., wenn du damit fertig bist, ein kleines Howto auf Englisch dafür schreiben? Sowas könnte man dann ins Wiki packen.
 
Danke für deine Antwort gnrp.
Ich habe jetzt verschiedenes ausprobiert.
Es ist eigentlich egal, was man vorher für die einzelnen Platten für ein Partitionierungsschema anlegt, da es nach dem anlegen des Partitionierungsschema von raid1 +newfs so oder so nicht mehr lesbar ist.
Deswegen habe ich gar keine partitionierung der einzelnen Platten vorgenommen.
In meiner /etc/raid1.conf steht nun:
Code:
/dev/wd0d
/dev/wd3d
Es hat mich am Anfang verwirrt, aber nach dem fertigstellen des raid1 mit gpt und newfs sind die einzelen Platten von außerhalb nicht mehr lesbar, nur noch mittels des raid1 devices, ein Unterschied zu FreeBSD gmirror.
 
Hm, das sollte so nicht sein. Das Anlegen des Raids geht nur in die Partitionen rein, wenn du das newfs/raidctl nicht auf den falschen Devices gemacht hast, darf da keine Partitionstabelle überschrieben worden sein.

Dass die "interne" Partition nicht mehr erkennbar ist mit einem Raid1 drauf, das ist klar. Du hast dann ja zwei GPTs, eine große, und eine kleine, aber kaum ein OS wird damit rechnen, in der Partition nochmal nach einer GPT zu suchen.

An deiner Stelle würde ich eher eine GPT machen und dadrin ein raid1 mit einem Dateisystem direkt auf dem raid.
Sorry, daran hab ich vorher nicht gedacht.
 
Nein, du hast schon Recht, die Partitionstabellen der Platten werden durch Raid1 partitionierung nicht zerstört. Falls man vorher jedoch ein Dateisystem + Daten auf den einzelnen Platten hatte, sind diese nach Anlegen des Raids nicht mehr lesbar.
Zerstört man den raid1 device und versucht die Platten nacher einzuhängen sind diese nicht mehr mountbar (incorrect superblock).
Man kann also die Platten nur mittels des raid1 device auslesen, was bei gmirror nicht der Fall war, da konnte ich die raidplatten einzeln von verschiedenen Betriebsystemen aus einlesen.
Weiß jemand schon was zum Thema zfs?
Da kann man doch auch mirrors direkt anlegen, ist glaube ich jedoch immer noch BETA (Stand August).
 
Wie hast du denn jetzt die Dateisysteme innerhalb des Raid1 angelegt? Die Metadaten vom Raidframe sollten am Ende der Platte liegen, die Platten müssen auch ohne Raidframe noch erkennbar sein. Wenn du das Raid nicht in einer Partition anlegt, sondern auf der gesamten Platte, und dadrin dann Partitionen anlegst, dann wirst du die danach auch als Partitionen einer einzelnen Platte sehen können.

Zu zfs: Das läuft leider noch nicht stabil unter NetBSD. Du kannst es ausprobieren, aber irgendwo wirst du auf Bugs stoßen. FreeBSD hat dafür eine stabile Implementierung, aber denk daran, dass zfs einiges an Speicher und CPU-Leistung haben will.
Mit zfs überspringst du quasi den Blocklayer. zfs hat Funktionalität, die sonst nur auf Blockebene war, auf Dateisystemebene gehievt, was das ganze deutlich dynamischer macht.
 
Zu zfs: Das läuft leider noch nicht stabil unter NetBSD. Du kannst es ausprobieren, aber irgendwo wirst du auf Bugs stoßen. FreeBSD hat dafür eine stabile Implementierung, aber denk daran, dass zfs einiges an Speicher und CPU-Leistung haben will.
Mit zfs überspringst du quasi den Blocklayer. zfs hat Funktionalität, die sonst nur auf Blockebene war, auf Dateisystemebene gehievt, was das ganze deutlich dynamischer macht.
Schade.
Wie hast du denn jetzt die Dateisysteme innerhalb des Raid1 angelegt? Die Metadaten vom Raidframe sollten am Ende der Platte liegen, die Platten müssen auch ohne Raidframe noch erkennbar sein. Wenn du das Raid nicht in einer Partition anlegt, sondern auf der gesamten Platte, und dadrin dann Partitionen anlegst, dann wirst du die danach auch als Partitionen einer einzelnen Platte sehen können.
Wie gesagt ich habe auch schoneinmal vorher die einzelnen PLatten mit gpt angelegt und dann /dev/dk0 und /dev/dk1 in raid1.conf gesetzt, dann auf raid1 nocheinmal gpt + ufs2 (dk3). Dann wieder raid1 zerstört und versucht, die einzelnen Platten zu mounten (dk0 dk1) ==> incorrect Superblock.
Es geht einach schlicht weg irgendwie nicht?
Ich glaube aber, man soll die Platten auch nur mit dem raid1 device auslesen können, geht ja auch nur mit einer aktiven Platte.
Deine Theorie wäre mir auch lieber, funzt aber irgendwie nicht, vielleicht hab ich ja wirklich was falsch gemacht.
 
Wie gesagt ich habe auch schoneinmal vorher die einzelnen PLatten mit gpt angelegt und dann /dev/dk0 und /dev/dk1 in raid1.conf gesetzt, dann auf raid1 nocheinmal gpt + ufs2 (dk3). Dann wieder raid1 zerstört und versucht, die einzelnen Platten zu mounten (dk0 dk1) ==> incorrect Superblock.
Es geht einach schlicht weg irgendwie nicht?
Ich glaube aber, man soll die Platten auch nur mit dem raid1 device auslesen können, geht ja auch nur mit einer aktiven Platte.
Deine Theorie wäre mir auch lieber, funzt aber irgendwie nicht, vielleicht hab ich ja wirklich was falsch gemacht.

Also ich glaub, wir reden grad aneinander vorbei. ;-)
Auf dem Raid Partitionen anzulegen geht nicht, ohne dass es unlesbar wird. Dafür müsstest du schon Wedges o.Ä. benutzen.
Wenn du pro Platte eine gpt anlegst und in eine Partition von der gpt ein raid anlegst, wodrauf du direkt das Dateisystem schreibst, ist das lesbar.
Wenn du ein Raid auf die gesamte Platte machst und in das raid eine gpt packst, in deren Partitionen du Dateisysteme anlegst, dann ist das auch von allen lesbar.
Nur geschachtelte gpts gehen nicht ohne weiteres.
 
Ehrlich gesagt bin ich ein bisschen verwirrt.
Wenn ich das jetzt richtig deute, willst du das:

gpt anlegen:
Code:
gpt show wd3                 
       start        size  index  contents
           0  3907029168
gpt create wd3
gpt add -t raid wd3
Partition added, use:
        dkctl wd3 addwedge <wedgename> 34 3907029101 <type>
to create a wedge for it
dkctl wd3 addwedge dk0 34 3907029101 raid 
dk0 created successfully.

raid1 erstellen: (in raid1.conf steht /dev/dk0 + absent)
Code:
label=`date +%Y%m%d%H%M`
raidctl -C /etc/raid1.conf raid1 
raidctl -I $label raid1
raidctl -i raid1        
Initiating re-write of parity
raidctl -s raid1
Components:
          component0: failed
            /dev/dk0: optimal
No spares.
component0 status is: failed.  Skipping label.
Component label for /dev/dk0:
   Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 3732515813, Mod Counter: 7
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 3907028992
   RAID Level: 1
   Autoconfig: No
   Root partition: No
   Last configured as: raid1
Parity status: DIRTY
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.
newfs -O2 /dev/rraid1a
/dev/rraid1a: 1907729.0MB (3907028992 sectors) block size 32768, fragment size 4096
        using 2570 cylinder groups of 742.31MB, 23754 blks, 46848 inodes.
super-block backups (for fsck_ffs -b #) at:
192, 1520448, 3040704, 4560960, 6081216, 7601472, 9121728, 10641984, 12162240,
...............................................................................
 mount /dev/raid1a /mnt
df -h
Filesystem         Size       Used      Avail %Cap Mounted on
/dev/wd2a           35G       5.0G        28G  14% /
kernfs             1.0K       1.0K         0B 100% /kern
ptyfs              1.0K       1.0K         0B 100% /dev/pts
procfs             4.0K       4.0K         0B 100% /proc
/dev/raid1a        1.8T       4.0K       1.7T   0% /mnt
umount /mnt
raidctl -uv raid1
mount /dev/dk0 /mnt
mount: mount_raid not found for /mnt
mount_ffs /dev/dk0 /mnt
mount_ffs: /dev/dk0 on /mnt: incorrect super block
 
Irgendwie stimmt da was nicht. Zwischen Anlegen des Raids und dem `newfs` muss ja noch was kommen, denn sonst hättest du doch kein raid1a (was die erste Partition eines Disklabels ist). So kannst du das eventueller noch lesen, als wenn du da ein gpt reinpackst, aber genau weiß ich auch nicht, wie sich andere OSe verhalten, wenn sie eine gpt mit einem Disklabel drin sehen.

Was ich meine, ist: Du schachtelst ja die ganze Zeit, und zwar gpt, Raids und Disklabel (mbr in diesem Fall nicht oder nur indirekt über die gpt).

Du könntest eine gpt auf der Festplatte, in einer gpt-Partition davon ein Raid anlegen und dadrin direkt das Dateisystem. Das sollte von allen Betriebssystemen erkannt werden. Du musst hier beim newfs noch -F mitgeben.

Du könntest auch die Festplatten roh zum Raid machen, da eine gpt reinlegen und in einer gpt-Partition das Dateisystem anlegen. Das sollte von allen Betriebssystemen erkannt werden und hat den Vorteil, dass auch die gpt selber gemirrort wird.

Was du getan hast, war, dass du auf die Festplatten eine gpt gepackt hast, in eine gpt-Partition ein Raid. In dieses Raid hast du dann wieder eine gpt (oder ein Disklabel?) reingepackt, dadrin eine Partition angelegt und in dieser Partition das Dateisystem.
Das können nicht alle lesen, weil niemand versucht, in einer gpt-Partition noch eine gpt zu lesen.
 
Aber die zweite Variante hatte ich doch schon mal ganz oben:
Du könntest auch die Festplatten roh zum Raid machen
Code:
gpt destroy wd3
dd if=/dev/zero of=/dev/wd3d 
^C11833+0 records in
11832+0 records out
6057984 bytes transferred in 4.743 secs (1277247 bytes/sec)
gpt show wd3    
       start        size  index  contents
           0  3907029168
Disk ist jetzt roh
Code:
cat /etc/raid1.conf
START array
#numrow physical disks
1 2 0

#Identify physical disks
START disks 
absent
/dev/wd3d
#Layout ist simple 64 sectors per stripe
START layout
#Sect/StripeUnit StripeUnit/PariityiUnit Stripe/ReconUnit Raidlevel
128 1 1 1

#No spares
#START spare

#Command
START queue
fifo 100
raidctl -C /etc/raid1.conf raid1
label=`date +%Y%m%d%H%M`
raidctl -I $label raid1
raidctl -i raid1        
Initiating re-write of parity
raidctl -s raid1
Components:
          component0: failed
           /dev/wd3d: optimal
No spares.
component0 status is: failed.  Skipping label.
Component label for /dev/wd3d:
   Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 3732525787, Mod Counter: 7
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 3907028992
   RAID Level: 1
   Autoconfig: No
   Root partition: No
   Last configured as: raid1
Parity status: DIRTY
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete
da eine gpt reinlegen und in einer gpt-Partition das Dateisystem anlegen
Code:
gpt show raid1
       start        size  index  contents
           0  3907028992
gpt create raid1
gpt show raid1
       start        size  index  contents
           0           1         PMBR
           1           1         Pri GPT header
           2          32         Pri GPT table
          34  3907028925         
  3907028959          32         Sec GPT table
  3907028991           1         Sec GPT header
gpt add -t ffs raid1
Partition added, use:
        dkctl raid1 addwedge <wedgename> 34 3907028925 <type>
dkctl raid1 addwedge dk0 34 3907028925 ffs           
dk0 created successfully.
newfs -O2 /dev/rdk0
/dev/rdk0: 1907729.0MB (3907028920 sectors) block size 32768, fragment size 4096
        using 2570 cylinder groups of 742.31MB, 23754 blks, 46848 inodes.
super-block backups (for fsck_ffs -b #) at:
192, 1520448, 3040704, 4560960, 6081216, 7601472, 9121728, 10641984, 12162240,
...............................................................................
mount /dev/dk0 /mnt
df -h
Filesystem         Size       Used      Avail %Cap Mounted on
/dev/wd2a           35G       5.0G        28G  14% /
kernfs             1.0K       1.0K         0B 100% /kern
ptyfs              1.0K       1.0K         0B 100% /dev/pts
procfs             4.0K       4.0K         0B 100% /proc
/dev/dk0           1.8T       4.0K       1.7T   0% /mnt
umount /dev/dk0
raidctl -uv raid1
gpt show wd3
       start        size  index  contents
           0  3907029168
mount /dev/wd3d /mnt
mount_ffs: /dev/wd3d on /mnt: incorrect super block
Was mache ich falsch?
 
Hmmmm... Ich glaube, ich muss mich entschuldigen. Du machst nichts falsch, sondern ich erzähle die ganze Zeit schädlichen Unsinn.
Ich war mir sicher, dass ich mein Raid1 so betreiben würde, aber da habe ich auch ein Raid1 auf einer Partition und dadrin noch ein Disklabel. Das waren FreeBSD- und Linux-Systeme. Auf einem NetBSD gerade konnte ich auch nachvollziehen, dass es nicht geht...

Da mich die Frage aber auch interessiert: Schreibe das bitte mal auf netbsd-users oder frag direkt auf tech-kern, wo die Infos gespeichert werden. Imho gehört sowas dokumentiert, aber der Raidframe-Quellcode ist sehr umfangreich, da "mal schnell" nachzugucken, geht nicht.

Also vielmals Entschuldigung! Wenn wir uns irgendwann mal sehen sollten, geb ich dir ein Bier oder eine Mate aus.
 
Zurück
Oben