Ve výchozí instalaci FreeBSD, pokud jsme zvolili souborový systém ZFS, máme jeden disk a na něm pool zroot. V tomto článku si ukážeme, jak přidat další disk ke stávajícímu a vytvořit z něj mirror. Dále si ukážeme, jak přidat další disky jako další vdev mirrory. Postupně tak můžeme navyšovat místo na zroot poolu a vytvářet tak ekvivalent raid10.

Seriál o ZFS v FreeBSD

Tento článek je součástí krátkého seriálu o ZFS v FreeBSD

  1. Přidání disku (tento článek)
  2. Řešení vadného disku
  3. Zvětšení poolu
  4. Diskuse nad typy vdev
  5. Zvětšení vdevu mirror

Výchozí stav

Po instalaci máme v systému jeden disk:

[root@freebsd ~]# gpart show
=>       40  134217648  da0  GPT  (64G)
         40       1024    1  freebsd-boot  (512K)
       1064        984       - free -  (492K)
       2048    4194304    2  freebsd-swap  (2.0G)
    4196352  130019328    3  freebsd-zfs  (62G)
  134215680       2008       - free -  (1.0M)

A vytvořený jeden pool:

[root@freebsd ~]# zpool status
  pool: zroot
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zroot       ONLINE       0     0     0
          da0p3     ONLINE       0     0     0

errors: No known data errors

Přidání a rozdělení dalšího disku

Přidáme další disk a vypíšeme si seznam disků:

[root@freebsd ~]# camcontrol devlist
<NECVMWar VMware IDE CDR10 1.00>   at scbus1 target 0 lun 0 (cd0,pass0)
<VMware, VMware Virtual S 1.0>     at scbus2 target 0 lun 0 (pass1,da0)
<VMware, VMware Virtual S 1.0>     at scbus2 target 1 lun 0 (pass2,da1)

Poznámka, všechny výpisy v tomto článku jsou pořízeny na virtuálním stroji s SCSI disky. Což má vliv jen na pojmenování diskových zařízení. SCSI disky jsou pojmenovávány da* SATA disky potom ada*.

Nový disk je potřeba rozdělit, ideálně stejně jako ten první. K tomu slouží příkaz gpart.

Kopii rozdělení disku provedene pomocí:

gpart backup da0 | gpart restore -F da1

A můžeme zkontrolovat, že oba disky jsou rozděleny skutečně stejně:

[root@freebsd ~]# gpart show
=>       40  134217648  da0  GPT  (64G)
         40       1024    1  freebsd-boot  (512K)
       1064        984       - free -  (492K)
       2048    4194304    2  freebsd-swap  (2.0G)
    4196352  130019328    3  freebsd-zfs  (62G)
  134215680       2008       - free -  (1.0M)

=>       40  134217648  da1  GPT  (64G)
         40       1024    1  freebsd-boot  (512K)
       1064        984       - free -  (492K)
       2048    4194304    2  freebsd-swap  (2.0G)
    4196352  130019328    3  freebsd-zfs  (62G)
  134215680       2008       - free -  (1.0M)

Boot oddíl

Z druhého disku chceme i bootovat v případě výpadku disku prvního. Oddíl na to připravený máme, stačí nainstalovat zavaděč:

[root@freebsd ~]# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da1
partcode written to da1p1
bootcode written to da1

Swap

Pokud používáme swap, přidáme i druhý disk. Konfigurace v /etc/fstab:

/dev/da0p2             none    swap    sw              0       0
/dev/da1p2             none    swap    sw              0       0

Disky s 4k sektory

Pokud používáme disky s 4k sektory (což jsou už dneska prakticky všechny velké SATA disky), musíme diskové oddíly a zejména ZFS operace správně zarovnat. Před jakoukoliv prací se ZFS (přidávání disků a vdevů), je proto nutné nastavit:

sysctl vfs.zfs.min_auto_ashift=12

Pokud vytváříme nové oddíly pomocí gpart je vhodné vždy uvádět parametr -a 4k. K tomu se ještě dostaneme.

Přidání disku do ZFS

Aktuálně máme v ZFS pouze jeden vdev obsahující jeden disk. Tento vdev cheme přeměnit na typ mirror.

[root@freebsd ~]# zpool status
  pool: zroot
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zroot       ONLINE       0     0     0
          da0p3     ONLINE       0     0     0

errors: No known data errors

Zkontrolujeme, zda máme vše nastaveno pro 4k sektory:

[root@freebsd ~]# sysctl vfs.zfs.min_auto_ashift
vfs.zfs.min_auto_ashift: 12

A můžeme přidat další disk:

zpool attach zroot da0p3 da1p3

A průběh resilveringu můžeme sledovat pomocí zpool status:

[root@freebsd ~]# zpool status
  pool: zroot
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sat May  6 10:14:47 2017
        73.7M scanned out of 1.43G at 6.14M/s, 0h3m to go
        73.6M resilvered, 5.03% done
config:

        NAME        STATE     READ WRITE CKSUM
        zroot       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            da0p3   ONLINE       0     0     0
            da1p3   ONLINE       0     0     0  (resilvering)

errors: No known data errors

Vidíme, že původní single disk se změnil na vdev mirror, který má nynní dva disky. Náš systém je tedy odolný vůči vypadku jednoho systémového disku.