ZFS Havuz Yönetimi - Basit Havuz Operasyonları

ZFS'nin havuz işlemleri ve vdev işlemleri ile başlayan ufak bir ısınma turu

ZFS yönetimi, basitlik göz önünde bulundurularak tasarlanmıştır. Tasarım hedefleri arasında, kullanılabilir bir dosya sistemi oluşturmak için gereken komutların sayısını azaltmaktır. Örneğin, yeni bir havuz oluşturduğunuzda, otomatik olarak yeni bir ZFS dosya sistemi oluşturulur ve bağlanır. Bağlama konumu (siz aksini belirtmedikçe) sisteminizin kök dizinidir.

ZFS'de aygıt havuzu işlemleri zpool komutu ile yönetilir.

ZFS Aygıt Havuzu Oluşturmak

İlk olarak zpool komutu ile elimizdeki aygıt havuzu listesini görelim.

~# zpool list
no pools available

Bu komutun çıktısı herhangi bir aygıt havuzu oluşturulmadığını bize bildiriyor. ZFS'de çeşitli dosya sistemleri oluşturabilme seçeneklerimiz var. Bunlardan ilki gerçek donanıma bir ZFS dosya sistemi oluşturmak.

Bu aşama için /dev/sdb yoluna bağlı diski kullanacağım.

~# zpool create tank /dev/sdb1

Bu komut hengi bir çıktı vermeyecek. zpool create komutu bizim bir aygıt havuzu oluşturmamızı sağlar. tank bizim ZFS havuzumunuzun adıdır (diğer ZFS dökümanlarında hep tank olarak koymuşlar, sanırım bu bir gelenek ve bozmak istemedim). /dev/sdb1 ise /dev/sdb'ye bağlı olan diskin ilk bölümünü işaret ediyor. Bu komutun tamamlanması ile daha öncesinde belirttiğim gibi disk alanımız kök dizine bağlanacaktır.

~# ls -ali / |grep tank
     34 drwxr-xr-x.   2 root root     2 Şub 24 18:44 tank

/dev/sdb1 üzerine bu aygıt havuzunu oluşturmamın sebebi ZFS'yi tek bir disk alanında kullanmak. Eğer ki diskinizin içerisinde birden fazla bölüm varsa ve bu bölümleri kaybemek istemiyorsanız kesinlikle bu şekilde bölüm belirtmenizi tavsiye ederim. Örneğin ZFS on Linux kurulumu yapacaksanız bu şekilde bir havuz oluşturmak daha mantıklı olacaktır çünkü aynı diskte, boot ve EFI için ayrı disk alanlarına ihtiyaç duyabilirsiniz.

Ancak tüm bir diski ZFS olarak kullanmak istiyorsanız şunu yapmanız gerekmekte.

~# zpool create tank /dev/sdb

Şimdi bu işlemlerin sonucunda bir aygıt havuzu oluşturduğumuzu varsayalım. En başta yapıtığımız gibi zpool listemizi kontrol edelim. Bunu da zpool list komutu ile yapabiliyoruz.

~# zpool list
NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
tank  14.5G   100K  14.5G        -         -     0%     0%  1.00x    ONLINE  -

Bu komutun çıktısında gördüğümüz gibi aygıt havuzunun toplam boyutu, kullanılan ve boş alan, aygıt havuzundaki disklerin sağlığı durumu ve ek bazı detaylar var. Bu komut sayesinde sisteminizde yer alan bütün ZFS havuzlarının listesini kolaylıkla görebilirsiniz.

Aygıt Havuzunun Durumunu Görüntülemek

Basit bir disk havuzu oluşturalım

~# zpool create tank /dev/sdb

ZFS havuzumuza ait detayları görüntüleyelim şimdi. Bunun için de bir diğer komuta ihtiyacımız var. zpool status ile havuzumuza bağlı bütün diskleri ve durumlarını görebiliriz.

~# zpool status
  pool: tank
  state: ONLINE
  config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
        sdb     ONLINE       0     0     0

errors: No known data errors

"Zpool status" komutundaki satırlar, havuz hakkında size çoğu kendinden açıklamalı hayati bilgiler verir. Çıktıyı anlaması ve regex ile işlemesi oldukça basittir. Üstten aşağı olarak bazı tag'lar altında bazı bilgiler bize aktarılmakta. Hepsi burada görünmese bile ben bütün tanımları aktarmak istiyorum:

  • pool: Havuzun adı.

  • state: Havuzun mevcut sağlığı.

  • status: Havuzda neyin yanlış olduğuna dair bir açıklama. Sorun bulunmazsa bu alan yazılmayacaktır. Ancak hatalar yaşanması durumunda detaylı bilgiler bu anahtar başlık altına basılacaktır.

  • action: Hata bulunması durumunda onarmak için önerilen eylem. Bu alan, kullanıcıyı dokumantasyon bölümlerinden veya daha öncesinde açılmış hata bildilerinden birine yönlendiren kısaltılmış bir formdur. Sorun bulunmazsa bu alan yazılmayacaktır.

  • see: Ayrıntılı onarım bilgilerini içeren bir bilgi makalesine referans verir. Sorun bulunmazsa bu alan yazılmayacaktır.

  • scrub: Son disk düzenlemesinin tamamlandığı tarih ve saati, devam eden bir düzenleme işleminin durumunu veya herhangi bir düzenleme talebi istenmemişse dahil olabilen bir düzenleme işleminin mevcut durumunu tanımlar.

  • errors: Bilinen veri hatalarını veya bilinen veri bloğu hatalarının yokluğunu tanımlar.

  • config: Havuzu oluşturan cihazların konfigürasyon düzeninin yanı sıra durumlarını ve cihazlardan üretilen hataları açıklar. Durum belirteçleri şunlardan biri olabilir: ONLINE, FAULTED, DEGRADED, UNAVAILABLE, veya OFFLINE. Durum ONLINE dışında bir şeyse, havuzun hata toleransı havuzu tehlikeye atılmıştır.

    Durum çıktısındaki sütunlar ise şu şekilde tanımlanır:

    • NAME: Havuzdaki her bir VDEV'in iç içe sırayla sunulan adı.

    • STATUS: Havuzdaki her VDEV'nin durumu. Durum, yukarıdaki "config" de bulunan durumlardan herhangi biri olabilir.

    • READ: Bir okuma talebi yayınlanırken yaşanan I/O hatalarını aktarır.

    • WRITE: Bir yazma talebi sırasında yaşanan I/O hatalarını aktarır.

    • CHKSUM: Sağlama toplamı hataları. Cihaz, bir okuma isteğinin sonucu olarak bozuk veriler döndürürse bunu bildirir.

Birden Fazla Diskle ZFS Aygıt Havuzu Oluşturmak

zpool ile aynı anda birden fazla diski de tek havuzda kullanabileceğimizden bahsetmiştim. Bunu ilk kurulum aşamasında yapabiliriz. Bunun için şu komutu vermemiz yeterlidir.

~# zpool create tank /dev/sdb /dev/sdc

Bu komutla iki tane 16 GB'lık diski bir zpool içerisine eklemiş olduk. Bu işlem sonucunda havuz alanımız şu şekilde görünecektir.

NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
tank  29.0G   148K  29.0G        -         -     0%     0%  1.00x    ONLINE  -

Eklediğimiz yeni disk alanını, daha fazla disk alanına sahip olmak için kullanmak zorunda değiliz. Bunu daha öncesinde belirttiğim aynalama yani mirror işlemi için de kullanmak isteyebiliriz. Bu durumda bize RAID yuvalaması (nesting) yardımıza koşuyor. Bunu bir sonraki kısımda özellikle detaylandırarak anlatacağım ama şimdi bahsetmeden geçmemek istedim. Bu özellik sayesinde eklediğimiz diskleri gruplayarak ekleyebiliriz. Bu grupların her birisi özel kullanım için ayrılmış disk alanlarıdır, Havuz oluştururken gruplamak için grup olarak kullanılacak diskler bu gruba ait parametre belirtilerek aygıt havuzları oluşturulur. Kimi diskleri günlükleme kimi diskleri geçici depolama ve önbellekleme için kullanabiliriz. Her grubun kendi amacı ve parametreleri hakkında detayli bilgiyi ilerleyen sayfalarda vereceğim. Ancak örnek oluşturması için bazı aygıt havuzları oluşturalım. Bunu oluştururken şunu yapmamız yeterlidir.

~# zpool create tank mirror /dev/sdb /dev/sdc

ZFS havuzumuza ait detayları görüntüleyelim şimdi.

~# zpool status
  pool: tank
  state: ONLINE
  config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0

errors: No known data errors

Bu durumda /dev/sdb ve /dev/sdc disklerini aynalama için kullanmış olacağız.

Birden fazla aynalama grubu oluşturmak istediğimizde ise

~# zpool create tank mirror /dev/sdb /dev/sdc mirror /dev/sdd /dev/sdf
  pool: tank
  state: ONLINE
  scan: none requested
  config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0
      mirror-1  ONLINE       0     0     0
        sdd     ONLINE       0     0     0
        sdf     ONLINE       0     0     0

Bunlara ek olarak aygıt havuzunda birden fazla grup da ekleyebiliriz. Örneğin mirror, log ve cache diskleri ekleyelim.

~# zpool create tank mirror /dev/sdb  /dev/sdc mirror /dev/sdd /dev/sde log mirror /dev/sdf /dev/sdg  cache /dev/sdh /dev/sdi
  pool: tank
  state: ONLINE
  scan: none requested
  config:

    NAME            STATE     READ WRITE CKSUM
    tank            ONLINE       0     0     0
      mirror-0      ONLINE       0     0     0
        sdb         ONLINE       0     0     0
        sdc         ONLINE       0     0     0
      mirror-1      ONLINE       0     0     0
        sdd         ONLINE       0     0     0
        sde         ONLINE       0     0     0
    logs
      mirror-2      ONLINE       0     0     0
        sdf         ONLINE       0     0     0
        sdg         ONLINE       0     0     0
    cache
      sdh           ONLINE       0     0     0
      sdi           ONLINE       0     0     0

Gördüğünüz gibi tek bir zpool havuzu sayesinde birden fazla diske ait bütün alanı eşzamanlı olarak kullanabiliyoruz. Ayrıca farklı disk alanlarını aynı havuz içerisinde farklı amaçlarla da kullanabiliyoruz. Bu sayede birden fazla diske sahip olan sunucularda ayrı ayrı diskleri bölümlendirmek ve bağlamakla uğraşmak yerine bir seferde bunları tek bir disk alanı gibi kullanabiliyoruz ve bir tek konuma bağlayabiliyoruz.

ZFS Disk Havuzuna Yeni Diskler Eklemek

Şimdi bir senaryo ile geleyim. Halihazırda /dev/sdb ve /dev/sdc disklerini eklediğimiz bir havuz var ve tüm depolama alanının dolmuş olduğunu varsayalım. Eğer yeterli boş disk slotumuz varsa ek diskler ekleyerek yeni boş alanlar oluşturabiliriz. Ama dur bir saniye. Bütün bu disk havuzunu sıfırlamamız mı lazım. Tabi ki hayır. Geleneksel disk yönetim sistemlerinin aksine ZFS'de bunu havuza eklemek için basit bir komut yeterlidir.

~# zpool add tank /dev/sdd

Bu işlemle /dev/sdd diskini havuz içerisine kolayca bağlamış oluruz.

NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
tank    43G   182K  43.0G        -         -     0%     0%  1.00x    ONLINE  -
pool: tank
state: ONLINE
config:

NAME        STATE     READ WRITE CKSUM
tank        ONLINE       0     0     0
    sdb       ONLINE       0     0     0
    sdc       ONLINE       0     0     0
    sdd       ONLINE       0     0     0

Aynı şekilde farklı bir türle ekleme de yapabiliriz. Aşağıdaki gibi görünen bir havuzumuz olduğunu varsayalım.

pool: tank
state: ONLINE
config:

NAME              STATE     READ WRITE CKSUM
tank              ONLINE       0     0     0
    mirror-0      ONLINE       0     0     0
        sdb       ONLINE       0     0     0
        sdc       ONLINE       0     0     0

Şimdi de yeni bir mirror seti ekleyelim.

~# zpool add tank mirror /dev/sdd /dev/sdf
  pool: tank
  state: ONLINE
  scan: none requested
  config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0
      mirror-1  ONLINE       0     0     0
        sdd     ONLINE       0     0     0
        sdf     ONLINE       0     0     0

ZFS Aygıt Havuzlarının İçe Aktarılması

Diyelim ki bir başka bilgisayarda uğraştığımız bir ZFS havuzu var. Bu havuzu başka bir bilgisayara bağlamak için zpool import komutu kullanılır.

~# zpool import tank

Bu işlem bütün disklerin ve temel aygıtların yapılandırması, bellek şeritlerinin okunması ve uygun şekilde bağlanması için biraz süre gerekecektir. Bu sürenin ardından uygun şekilde bağlanacak ve kök sisteme bu havuz bağlanacaktır.

ZFS Aygıt Havuzundan Disk Çıkarmak

Şimdi yaptığımız işleri birazcık da geri sardıralım.

Diyelim ki bu disklerden bir tanesini çıkarıp yerine bir başka disk takmamız lazım. Veya artık bu kadar çok bir depolama alanına ihtiyacımız yok. Bu durumda bütün bir aygıt havuzuna zarar vermeden havuzdan diskleri çıkartabiliriz.

~# zpool remove tank /dev/sdc

Bu komut diskin içerisindeki veriye bağlı olarak uzun sürecektir. Şöyle ki ZFS bu diski kaldırmadan önce bu diske ait olan veriyi elinden geldiğince kaybetmemeye çalışır. Bu sebeple veriyi diğer disklere kaydıracaktır. İşlem bittiğinde de zpool status komutumuzun çıktısında sdc yer almayacaktır.

~# zpool status tank
  pool: tank
  state: ONLINE
  config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      sdb       ONLINE       0     0     0

errors: No known data errors

Direk diskleri tek tek çıkarabildiğimiz gibi önceki adımlarda oluşturduğumuz alt özelliklere sahip alt kısımları da birlikte çıkarabiliriz. Örneğin aşağıdaki disk alanı için

pool: tank 
state: ONLINE 
scan: none requested 
config:
  NAME        STATE     READ WRITE CKSUM
  tank        ONLINE       0     0     0
    mirror-0  ONLINE       0     0     0
      sdb     ONLINE       0     0     0
      sdc     ONLINE       0     0     0
    mirror-1  ONLINE       0     0     0
      sdd     ONLINE       0     0     0
      sdf     ONLINE       0     0     0

Bu havuzdan mirror-1 'i çıkarabiliriz.

~# zpool remove tank mirror-1

Bu durumda havuzumuz şöyle görünecektir.

pool: tank 
state: ONLINE 
scan: none requested 
config:
  NAME        STATE     READ WRITE CKSUM
  tank        ONLINE       0     0     0
    mirror-0  ONLINE       0     0     0
      sdb     ONLINE       0     0     0
      sdc     ONLINE       0     0     0

ZFS Aygıt Havuzunu Yok Etmek

Bütün bir aygıt havuzunu silmek için ise zpool destroy komutunu kullanabiliriz.

~# zpool destroy tank
~# zpool status
no pools available

ZFS Aygıt Havuzlarının Dışa Aktarılması

Diyelim ki üzerinde çalıştığımız ZFS havuzunu başka bir bilgisayara aktarmak istiyoruz. Halihazırda ekleme yapmayı yukarıda anlattım ama başka bir bilgisayara bağlamadan önce güvenli bir şekilde çalıştığımız bilgisayardan kaldırmamız lazım. Bu işlem için zpool export komutu kullanılır.

~# zpool export tank

Bu işlem bütün disklerin yapılandırması ve verilerin senkronize edilerek ayrılması biraz uzun sürecektir. Bu sürenin ardından uygun şekilde bağlanacak ve kök sisteme bu havuz bağlanacaktır.

ZFS Havuz Geçmiş

ZFS aygıt havuzu sistemi, bu yaptığımız işlemleri adım adım görmemize imkan sağlayan bir geçmiş günlüğü yapısına sahiptir. Bütün bu değişimleri zpool history ile görebiliriz. Bu komuta ek olarak havuzumuzun adını verirsek, özel olarak o havuza ait geçmişi verecektir. Eğer herhangi bir parametre vermezsek bütün havuzlara ait geçmişleri verecektir. Bu geçmiş bilgisi disklerin aygıt havuzunu belirten hearder kısımları içerisine toplanır, yani başka bir bilgisayara bu diskleri aktardığımız zaman silinemez. Ancak zpool destroy komutu ile bu aygıt havuzunu yokettiğimizde bu geçmişi de kaybederiz.

~# zpool history tank

History for 'tank':
2021-02-25.13:16:26 zpool create tank /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4 /dev/sdb5 /dev/sdb6
2021-02-25.13:19:38 zpool remove tank sdb5
2021-02-25.13:23:28 zpool remove tank sdb6
2021-02-25.13:25:42 zpool add tank mirror sdb4 sdb5 sdb6
2021-02-25.13:31:12 zpool export tank
2021-02-25.13:36:23 zpool import tank

Last updated