ZFS: vytvárame a upravujeme základ pre naše dáta

26. 1. 2011
Doba čtení: 6 minut

Sdílet

V predchádzajúcom dieli sme sa zaoberali teoretickými vlastnosťami ZFS a tentoraz vás zoznámim so ZPOOL-om. Samozrejme nebudú chýbať ani praktické príklady na jeho manažovanie. Niečo si povieme aj o možných stavoch našich poolov. Zaujíma vás, z čoho sa skladá filesystém ZFS?

Z čoho sa skladá ZFS?

ZFS sa skladá s dvoch objektov:

 – pool (úložisko)
 – dataset (dátový set)

Ako sa ovláda ZFS?

ZFS môžno ovládať dvomi jednoduchými príkazmi:

 – zpool – ovládanie ZFS poolov
 – zfs – ovládanie ZFS filesystému

ZFS ZPOOL

ZFS pool je storage objekt, ktorý tvorí základ systému ZFS a pozostáva z mnohých fyzických zariadení nazývaných „devs“ (virtual devices). ZFS pooly sa spravujú príkazom zpool. ZFS je teda založené na virtuálnych dátových zariadeniach nazývaných pooly.

Typy virtuálnych zariadení (vdev)

Každý ZFS pool môže obsahovať ZFS datasety. Je to spoločné meno pre tieto ZFS objekty: clones (read/write), file systems, snapshots (read-only snímok), volume.

Prehľad ZFS objektov

Každý dataset je identifikovaný jedinečným menom a pracuje sa s nimi pomocou príkazu zfs. Dátové miesto pre datasety je alokované z poolu. Datasety je možné identifikovať na základe tohto formátu:

pool/cesta[@snapshot]

Príklad:
pool <-- pool
pool/root <-- dataset
pool/root@snapshot01 <-- snapshot

Praktická časť

ZPOOL CREATE

Tento jednoduchý príkaz zfs create služí na vytvorenie poolu na disku.

Syntax: create [-fn] [-o property=value] ... [-O file-system-property=value] ... [-m mountpoint] [-R root]   ...

Pridanie nového disku do systému s názvom poolu pool by vyzeralo takto:

# zpool create pool ad1

ZPOOL LIST

Príkaz zpool list ponúka široký prehľad informácií o stave nášho poolu. Poznámka: Prepínač -H slúži na vynechanie hlavičky výpisu (NAME SIZE USED AVAIL…).

Syntax: zpool list [-H] [-o property[,...]] [pool] ...
# zpool list pool
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
pool 35.2G 6.39G 28.9G 18% ONLINE -

Vo výpise vidieť názov poolu (NAME), celkovú veľkosť poolu (SIZE), sumár alokovanej veľkosti všetkých datasetov a interných metadát (USED), sumár nealokovaného priestoru v poole (AVAILABLE), percentuálne vyjadrenie naplnenosti poolu (CAP), aktuálny „zdravotný“ stav poolu (HEALTH), alternatívny root, ak je nejaký definovaný (ALTROOT). Ak chceme vypísať iba určité vlastnosti poolu, ktoré nás zaujímajú, môžeme použiť prepínač -o a za ním názvy oddelené čiarkou (užitočné pri skriptoch).

# zpool list -o name,used,avail,cap pool
NAME USED AVAIL CAP
pool 6.47G 28.8G 18%

ZPOOL DESTROY

Príkazom zfs destroy sa vymazáva pool.

Upozornenie!

Pri zadaní daného príkazu sa bez akéhokoľvek potvrdenia vymaže zvolený pool! (pokiaľ nie je nič namapované)

# zpool destroy pool

ZPOOL STATUS

Dôležitým príkazom je aj zfs status pre vypísanie „zdravotného“ stavu nášho poolu. Stav poolu je určený zo stavu jeho top-level zariadenia (parentu). Platí, že ak sú všetky virtuálne zariadenia (vdevs) ONLINE, tak je celý pool v stave ONLINE. Ak je hocijaké virtuálne zariadenie v stave DEGRADED (degradované) alebo UNAVAILABLE (nedostupné), tak pool ako taký je označený ako DEGRADED (degradovaný). Ak je top-level zariadenie označené ako FAULTED (chybné) alebo OFFLINE, tak celý pool je označený ako FAULTED (chybný).

Stav celého nášho poolu teda zistíme príkazom:

# zpool status -v pool
pool: pool
state: DEGRADED
status: One or more devices could not be opened. Sufficient replicas exist for
the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
see: http://www.sun.com/msg/ZFS-8000-D3
scrub: resilver completed with 0 errors on Fri Mar 17 16:11:35 2010
config:

NAME STATE READ WRITE CKSUM
pool DEGRADED 0 0 0
raidz ONLINE 0 0 0
ad0p1 ONLINE 0 0 0
ad0p2 ONLINE 0 0 0
ad1p1 UNAVAIL 0 0 0 cannot open
ad1p2 ONLINE 0 0 0

Vo výpise vidíme názov nášho poolu (pool), stav poolu (state), prípadne odporúčaný postup (action) ako opraviť pool (toto pole nie je zobrazené pokiaľ nie je zistený problém) a odkaz na oficiálnu stránku Oracle o danom probléme (see).

V tomto prípade vidíme, že pool s názvom pool je v degradovanom (DEGRADED) stave. Môžeme sa ho pokúsiť znova dostať do ONLINE stavu príkazom:

# zpool online pool ad0
Bringing device ad0 online
# zpool status -x pool
all pools are healthy
ONLINE
Zariadenie je plne funkčné.

DEGRADED
V zariadení došlo k zlyhaniu, ale stále je schopné fungovať.

FAULTED
Zariadenie je kompletne nedostupné. Tento stav zvyčajne naznačuje zlyhanie zariadenia, kedy ZFS nevie prijímať a odosielať dáta. Ak je top-level zariadenie v tomto stave, tak celý pool je nedostupný.

OFFLINE
Zariadenie bolo dané administrátorom do stavu offline, kedy sa s ním nedá pracovať až do nastavenia stavu ONLINE.

UNAVAILABLE
Zariadenie sa nedá otvoriť. Ak je top-level zariadenie v stave UNAVAILABLE, potom žiadne zariadenie v príslušnom poole nie je prístupné.

ZPOOL HISTORY

Príkaz zpool history ako už napovedá jeho názov slúži na vypísanie histórie zadaných príkazov. Toto je užitočné na identifikovanie prípadných chybných príkazov.

Syntax: zpool history [názov poolu]

# zpool history pool
History for 'pool':
2010-12-07.20:23:54 zpool create -f -m none -o altroot=/mnt -o version=13 pool ad0p3
2010-12-07.20:23:54 zfs create -o mountpoint=/ pool/root
2010-12-07.20:23:54 zfs create pool/root/var
2010-12-07.20:23:54 zfs create pool/root/tmp
2010-12-07.20:23:54 zpool set bootfs=pool/root pool
....

ZPOOL HEALTH

Nie menej dôležitý údaj je zfs health, ktorý hovorí o stave poolov a hlási prípadné chyby s nimi súvisiace.

# zpool status pool
pool: pool
state: ONLINE
status: The pool is formatted using an older on-disk format.  The pool can
    still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
    pool will no longer be accessible on older software versions.
scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    pool        ONLINE       0     0     0
      ad1p3     ONLINE       0     0     0

NAME STATE READ WRITE CKSUM
pool ONLINE 0 0 0
ad1p3 ONLINE 0 0 0

errors: No known data errors

V tomto výpise je dôležitý stav poolu state a hodnoty READ, WRITE, CHSUM:

READ – I/O chyby vyskytujúce sa pri požiadavke na čítanie.
WRITE – I/O chyby vyskytujúce sa pri požiadavke na zápis.
CKSUM – Checksum chyby. Zariadenie má poškodené dáta.

Prípadné chyby môžete odstrániť a vrátiť pool do stavu ONLINE:

# zpool online pool da0
# zpool clear pool

ZPOOL IOSTAT

Zpool iostat čiže input/output statistics slúži na aktuálne zobrazenie vstupno-výstupných operácií daného poolu. Zobrazuje počet operácií read/write, priepustnosť v jednotkách, alokované a voľné miesto v poole.

# zpool iostat -v 1
capacity operations bandwidth
pool alloc free read write read write
---------- ----- ----- ----- ----- ----- -----
pool 5.06G 2.88G 9 2 258K 122K
ad1p3 5.06G 2.88G 9 2 258K 122K
---------- ----- ----- ----- ----- ----- -----

ZPOOL UPGRADE

Aktuálnu verziu zpoolu zistíme príkazom zpool upgrade. Dolu vídime aj zoznam verzií s krátkym popisom, čo ktorá verzia pridáva.

# zpool upgrade -v
This system is currently running ZFS pool version 14.

The following versions are supported:

VER  DESCRIPTION
---  --------------------------------------------------------
 1   Initial ZFS version
 2   Ditto blocks (replicated metadata)
 3   Hot spares and double parity RAID-Z
 4   zpool history
 5   Compression using the gzip algorithm
 6   bootfs pool property
 7   Separate intent log devices
 8   Delegated administration
 9   refquota and refreservation properties
 10  Cache devices
 11  Improved scrub performance
 12  Snapshot properties
 13  snapused property
 14  passthrough-x aclinherit support
 15  user/group space accounting

Vo výpise vidieť, že používame zpool verziu 14 pre pool pool. Dostupná je však verzia 15 pre náš systém. Teraz spravíme upgrade zpoolu na verziu 15 a prepíšeme bootcode, aby sme po reštarte systému nabootovali.

bitcoin_skoleni

# zpool upgrade -V 15 pool

Successfully upgraded 'pool' from version 14 to version 15

If you boot from pool 'pool', don't forget to update boot code.
Assuming you use GPT partitioning and da0 is your boot disk
the following command will do it:

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

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

Poznámka: Bližšie informácie o jednotlivých verziách si môžete pozrieť na OpenSolaris.org, kde „N“ je číslo príslušnej verzie o ktorú sa zaujímate.

Záver

Sme na konci druhého dielu, v ktorom som písal o ZFS zpoole. Čaká nás posledný článok, ktorý bude najzaujímavejší. Vysvetlím, ako sa robí snapshot súborového systému, ako ho obnoviť alebo jednoducho preniesť na iný server.