#author("2024-01-03T22:09:21+09:00","default:seichan","seichan")
#author("2024-01-04T14:30:28+09:00","default:seichan","seichan")
* 目次 [#zd8971ae]
#contents

~
* 本コンテンツは改めて blog で更新しています [#iaf6e14b]
ブログにてコンテンツを更新しています.ブログの情報が最新となりますのでこちらを見て頂ければと思います.~
- [[FreeBSD で ZFS を利用する – ZFS 概要>https://www.seichan.org/blog/2023/12/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-zfs-%e6%a6%82%e8%a6%81.html]]
- [[FreeBSD で ZFS を利用する – ZFS プールの作成 (パーティション切らない編)>https://www.seichan.org/blog/2023/12/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-zfs-%e3%83%97%e3%83%bc%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90.html]]
- [[FreeBSD で ZFS を利用する – ZFS プールの機能について理解する>https://www.seichan.org/blog/2023/12/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-zfs-%e3%83%97%e3%83%bc%e3%83%ab%e3%81%ae%e6%a9%9f%e8%83%bd%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e7%90%86%e8%a7%a3%e3%81%99.html]]
- [[FreeBSD で ZFS を利用する – ファイルシステムを管理する>https://www.seichan.org/blog/2023/12/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%82%92%e7%ae%a1%e7%90%86%e3%81%99%e3%82%8b.html]]
- [[FreeBSD で ZFS を利用する – send/recv を使い倒す>https://www.seichan.org/blog/2023/12/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-send-recv-%e3%82%92%e4%bd%bf%e3%81%84%e5%80%92%e3%81%99.html]]
- [[FreeBSD で ZFS を利用する – RAWボリュームを切り出す & iSCSI として提供する>https://www.seichan.org/blog/2023/12/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-raw%e3%83%9c%e3%83%aa%e3%83%a5%e3%83%bc%e3%83%a0%e3%82%92%e5%88%87%e3%82%8a%e5%87%ba%e3%81%99-iscsi-%e3%81%a8%e3%81%97.html]]
- [[FreeBSD で ZFS を利用する – ファイルシステムの圧縮を利用する・比較する>https://www.seichan.org/blog/2023/12/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e5%9c%a7%e7%b8%ae%e3%82%92%e5%88%a9.html]]
- [[FreeBSD で ZFS を利用する – ZFS のキャッシュの仕組みを理解する>https://www.seichan.org/blog/2023/12/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-zfs-%e3%81%ae%e3%82%ad%e3%83%a3%e3%83%83%e3%82%b7%e3%83%a5%e3%81%ae%e4%bb%95%e7%b5%84%e3%81%bf%e3%82%92%e7%90%86%e8%a7%a3.html]]
- [[FreeBSD で ZFS を利用する – キャッシュを構成・設定する>https://www.seichan.org/blog/2023/12/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-%e3%82%ad%e3%83%a3%e3%83%83%e3%82%b7%e3%83%a5%e3%82%92%e6%a7%8b%e6%88%90%e3%83%bb%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b.html]]
- [[FreeBSD で ZFS を利用する – 重複排除を利用する・確認する>https://www.seichan.org/blog/2023/12/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-%e9%87%8d%e8%a4%87%e6%8e%92%e9%99%a4%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b%e3%83%bb%e7%a2%ba%e8%aa%8d%e3%81%99.html]]
- [[FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (1)>https://www.seichan.org/blog/2023/12/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-zfs-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e6%a9%9f%e8%83%bd%e3%81%ab%e3%81%a4.html]]
- [[FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (2)>https://www.seichan.org/blog/2024/01/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-zfs-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e6%a9%9f%e8%83%bd%e3%81%ab%e3%81%a4-2.html]]
- [[FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (3)>https://www.seichan.org/blog/2024/01/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-zfs-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e6%a9%9f%e8%83%bd%e3%81%ab%e3%81%a4-3.html]]
- [[FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (4)>https://www.seichan.org/blog/2024/01/freebsd-%e3%81%a7-zfs-%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b-zfs-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e6%a9%9f%e8%83%bd%e3%81%ab%e3%81%a4-4.html]]
~
~
* FreeBSD で ZFS を試してみる [#we10719c]
ZFS は Sun が開発し,CDDL でオープンソースとして公開されている次世代ファイルシステムです.特徴として,ストレージプールの概念があり,ディスクの違いを気にせずに管理できる事や,ZFS 自身で RAID5 や RAID6 をサポートしている事等が挙げられます.また,128bit アドレッシングですので,理論的なファイルシステムの最大値は 16 エクサバイトです.最大値やストレージプールの概念,機能等から間違いなく次世代ファイルシステムと言えるでしょう.~

現在,様々な OS で移植作業が行われており,FreeBSD には 7-current に移植されています.まだまだ実験段階の機能と言う事ですが,今後流行っていくと見ていますので試しに触ってみています.~

試すにあたって参考にしたドキュメントは Sun の [[Solaris ZFS 管理ガイド>http://docs.sun.com/app/docs/doc/819-6260]] です.さすが,商用 OS だけあり,ドキュメントはしっかりしているなぁと思いました.

** ZFS を使ってみる [#y9e45c7e]
現在,7-current でのみ利用可能です.その為,普段から current を追っかけている人以外は VMware 等の仮想環境を用意した方が良いと思います.~

** 必要要件 [#u79c1407]
ZFS は,高機能なファイルシステムだからなのか,メモリ要件を満たす必要があります.FreeBSD だからなのかはわかりませんが,512MB 以上のメモリがないと kernel panic するようですので注意して下さい.プロセッサには特に要件は無いようにみえます.~
ただ,Solaris でも,512MB 以上,1GB 以上を推奨とあるので,ある程度のスペックはもともと要求されているのかもしれません.

*** 今回の環境 [#m1cd2edf]
今回用意した環境は,VMware に 7-current を入れ,以下のようなディスク環境を用意しました.

 zfs# atacontrol list
 ATA channel 0:
     Master:  ad0 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4
     Slave:   ad1 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4
 ATA channel 1:
     Master:  ad2 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4
     Slave:   ad3 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4

 zfs# camcontrol devlist
 <VMware, VMware Virtual S 1.0>     at scbus0 target 0 lun 0 (pass0,da0)
 <VMware, VMware Virtual S 1.0>     at scbus0 target 1 lun 0 (pass1,da1)
 <VMware, VMware Virtual S 1.0>     at scbus0 target 2 lun 0 (pass2,da2)
 <VMware, VMware Virtual S 1.0>     at scbus0 target 3 lun 0 (pass3,da3)
 <VMware, VMware Virtual S 1.0>     at scbus0 target 4 lun 0 (pass4,da4)
 <VMware, VMware Virtual S 1.0>     at scbus0 target 5 lun 0 (pass5,da5)
 <VMware, VMware Virtual S 1.0>     at scbus0 target 6 lun 0 (pass6,da6)

*** ZFS を使うための一手間 [#w1af97da]
特に一手間という程の物ではありませんが,''zfs.ko'' というカーネルモジュールを読み込ませる事が必要です.以下の何れかを行う事で読み込ませる事が可能です

 zfs# zfs

 zfs# kldload /boot/kernel/zfs.ko

 zfs# /etc/rc.d/zfs forcestart

常用するにあたり一番無難な方法としては,'''/etc/rc.conf''' に記述し,rc.d でのモジュールの読み込みが無難だと思います.というのも後述する zfs ファイルシステムのマウント等を行う為に rc.d 機構が必要になる為です.~
という訳で,'''/etc/rc.conf''' に以下の 1行を記述しましょう.

 zfs_enable="YES"

その後,以下のように実行する事で kernel モジュールを読み込ませる事が可能です.

 zfs# /etc/rc.d/zfs start

'''kldstat''' の結果を確認し,''zfs.ko'' が表示されればこの作業は完了です.
 zfs# kldstat
 Id Refs Address    Size     Name
  1    4 0xc0400000 a00bbc   kernel
  2    1 0xc0e01000 7313c    acpi.ko
  3    1 0xc32c8000 c2000    zfs.ko

** ストレージプールを理解する [#ba1d3f1c]
まずは,ZFS のキモの部分でもある,ストレージプールを理解する所からはじめていきたいと思います.

*** ストレージプールって? [#l5494be8]
ZFS では物理ストレージを管理するために ''ストレージプール'' という概念が導入されました.ストレージプールはボリュームの管理を不要にしました.ZFS ファイルシステムを作成する為に,ストレージプールにデバイスを集約します.ストレージプールは,そのプールを利用する ZFS ファイルシステムで共有され,プールにデバイスが追加されるとファイルシステムが自動的に拡張される為,ファイルシステムサイズを事前に決定する必要も無くなりました.~
~

ストレージプールの基本要素は,128MB 以上の物理ディスクで,ディスク全体 (ad0) 又は個別のスライス (ad0s1) をストレージデバイスとして利用する事が可能です.
ストレージプールは,1つ以上の仮想デバイスで構成され,''仮想デバイス'' は物理ストレージのレイアウト,障害特性を定義したストレージプールの内部表現です.最上位レベルの仮想デバイスはデータの冗長性を備えており,ミラー,RAID-Z 仮想デバイスと呼ばれます.~
~

** ストレージプールにディスクを追加する [#u53d78ae]
冗長性の無い単純な構成,ミラー,RAID-Z を利用したストレージプールを作成していきます.

*** 単純なストレージプールを作成する [#b0fa91d2]
単純にストレージプールを作成するには,以下のようなコマンドを発行します.以下の場合,'''zpool0''' というストレージプールが作成され,4GB x 2 の容量でプールが構成されます.この場合,RAID0 と同様にストライプされてディスクに書き込まれるようになります.

 zfs# zpool create zpool0 ad0 ad2

作成したプールのステータスは以下の通り '''zpool status''' コマンドを利用します.zpool0 という名前のプールが作成されており,ad0 と ad2 がプールに追加されている事がわかります.

 zfs# zpool status
   pool: zpool0
  state: ONLINE
  scrub: none requested
 config:
 
         NAME        STATE     READ WRITE CKSUM
         zpool0      ONLINE       0     0     0
           ad0       ONLINE       0     0     0
           ad2       ONLINE       0     0     0
 
 errors: No known data errors


*** ミラー化されたストレージプールを作成する [#r4e2d2b6]
RAID1 のようなミラー化されたプールを作成するには,'''mirror''' キーワードを追加し,追加するストレージを選択します.以下の場合は,'''ad0''' と '''ad2''' をミラーのペアとしたプールを作成します.

 zfs# zpool create zpool0 mirror ad0 ad2

ミラーの場合,ステータスを表示するとストレージのペアがわかるように表示されます.

 zfs# zpool status
   pool: zpool0
  state: ONLINE
  scrub: none requested
 config:
 
         NAME        STATE     READ WRITE CKSUM
         zpool0      ONLINE       0     0     0
           mirror    ONLINE       0     0     0
             ad0     ONLINE       0     0     0
             ad2     ONLINE       0     0     0
 
 errors: No known data errors

zpool0 というプールに,mirror ストレージ ad0, ad2 が追加されている事がわかります.~
~

複数のミラーペアを指定する場合,コマンドを数回に分ける事も可能ですが,以下の様に '''mirror''' キーワードを複数指定する事も可能です.以下の場合,'''ad0''' と '''ad2''','''ad1''' と '''ad3''' をミラーペアとしてプールを作成します.

 zfs# zpool create zpool0 mirror ad0 ad2 mirror ad1 ad3

先と同様にステータスには,ミラーペア毎に参加ディスクが表示されます.今回の場合,mirror が2つ表示され,それぞれのペアストレージが表示されます.

 zfs# zpool status
   pool: zpool0
  state: ONLINE
  scrub: none requested
 config:
 
         NAME        STATE     READ WRITE CKSUM
         zpool0      ONLINE       0     0     0
           mirror    ONLINE       0     0     0
             ad0     ONLINE       0     0     0
             ad2     ONLINE       0     0     0
           mirror    ONLINE       0     0     0
             ad1     ONLINE       0     0     0
             ad3     ONLINE       0     0     0
 
 errors: No known data errors

*** シングルパリティ RAID-Z ストレージプールを作成する [#o0ddef41]
RAID-Z プールの作成は,ミラー化されたプールの作成とほぼ同様です.違いは '''mirror''' キーワードではなく '''raid''' キーワードを使用する点と,最低現必要となるディスク数になります.RAID-Z はシングルパリティの冗長性を持った構成で RAID5 と同様の動きをします.~
以下の例では,3つのディスクで構成される RAID-Z プールを作成します.

 zfs# zpool create zpool0 raidz ad0 ad2 da1

プールのステータスを表示すると,先ほどの '''mirror''' と違い '''raidz1''' と表示され,raidz にアサインされたディスクの一覧が表示されます.'''raidz''' では無く,'''raidz1''' と表示されるのは,後述するダブルパリティ RAID-Z2 と違いを明らかにする為だと考えられます.

 zfs# zpool status
   pool: zpool0
  state: ONLINE
  scrub: none requested
 config:
 
         NAME        STATE     READ WRITE CKSUM
         zpool0      ONLINE       0     0     0
           raidz1    ONLINE       0     0     0
             ad0     ONLINE       0     0     0
             ad2     ONLINE       0     0     0
             da1     ONLINE       0     0     0
 
 errors: No known data errors

*** ダブルパリティ RAID-Z ストレージプールを作成する [#g21483ec]
RAID-Z は,シングルパリティではなく,ダブルパリティによる冗長構成でプールを作成する事が出来ます.一般的には RAID6 と呼ばれるものと同等の動作を行います.プールの作成時に '''raidz2''' キーワードを指定する事でダブルパリティ RAID-Z 構成を作成出来ます.

 zfs# zpool create zpool0 raidz2 ad0 ad2 da1 da2

ステータスは以下の通り,'''raidz2''' でのプールが作成されている事がわかります.

 zfs# zpool status
   pool: zpool0
  state: ONLINE
  scrub: none requested
 config:
 
         NAME        STATE     READ WRITE CKSUM
         zpool0      ONLINE       0     0     0
           raidz2    ONLINE       0     0     0
             ad0     ONLINE       0     0     0
             ad2     ONLINE       0     0     0
             da1     ONLINE       0     0     0
             da2     ONLINE       0     0     0
 
 errors: No known data errors

*** スペアドライブ付きのダブルパリティ RAID-Z ストレージプールの作成 [#o5a49121]
今までは,スペアドライブが無い状態でのストレージプールを作成していました.この場合,何れかのディスクが故障するといわゆる RAID が DEGRADE している状態となります.ZFS では,ホットスペア付きでストレージプールを作成が可能です.これは '''mirror''' でも '''raidz''' 及び '''raidz2''' の全てで可能ですので,実運用においてはスペア付きでの作成が望ましいでしょう.~
ここでは,ダブルパリティ RAID-Z ストレージプールに,スペアドライブが付いている構成で作成してみます.

 zfs# zpool create zpool0 raidz2 ad0 ad2 da1 da2 spare da3

ステータスを表示すると,'''spare''' の項が追加され,スペアドライブが有効になっている事がわかります.

 zfs# zpool status
   pool: zpool0
  state: ONLINE
  scrub: none requested
 config:
 
         NAME        STATE     READ WRITE CKSUM
         zpool0      ONLINE       0     0     0
           raidz2    ONLINE       0     0     0
             ad0     ONLINE       0     0     0
             ad2     ONLINE       0     0     0
             da1     ONLINE       0     0     0
             da2     ONLINE       0     0     0
         spares
           da3       AVAIL
 
 errors: No known data errors


** ストレージプールを削除する [#rc602c3f]
間違って作成してしまった場合や,不要になったストレージプールは削除する事を簡単なコマンドで実行可能です.ただし,一度削除したら元には戻せない為,使用中のストレージプールを削除しないように注意を払う必要があります.~
一応,使用中のストレージプールを削除しようとした場合,警告が表示され削除されない仕組みがありますが,100% 信頼出来る訳ではありません.必ず自分で確認を行ってからオペレーションするようにしましょう.実際の削除は以下のように実行します.

 zfs# zpool destroy zpool0

上記の場合 '''zpool0''' プールを削除しています.

** ストレージプールを管理する [#z1c491da]
日々の運用の中には,作成したストレージプールの容量を追加したり削除したりする事もあります.

*** ストレージプールにデバイスを追加する [#d9c92ecb]
新しいデバイスを追加する事で,プールの領域を動的に拡張出来ます.プール内の全てのデータセットは,追加された領域を意識せずにすぐに利用できます.'''zpool add''' コマンドを使用してプールにストレージを追加可能です.~
注意点として,既に作成してあるストレージプールで定義済みの RAID の構成で追加する必要があるという事です.例えば,'''raidz''' で作成してあれば '''raidz''' で追加する必要があります.厳密に言えば,無理やり違う構成で追加する事も可能ですが推奨されません.理由としては,パフォーマンス及び信頼性の低下があげられているようです.その為,最初のストレージプールの作成時のプランニングは重要だと言えます.とはいえ,後に出てくる ZFS の管理の方法でいくらでも対処は可能ですので神経質になる必要は無いと思います.~
以下は,先のシングルパリティ RAID-Z プールに追加している例です.

 zfs# zpool add zpool0 raidz ad1 ad3 da2

上記コマンドで今まで違う所は '''zpool create''' が '''zpool add''' に変わっているだけです.後の構文は今までと同様ですのでこの場合はシングルパリティ RAID-Z で '''ad1, ad3, da2''' が構成されており,'''zpool0''' に追加しています.~
ステータスは以下の様に表示されます.

 zfs# zpool status
   pool: zpool0
  state: ONLINE
  scrub: none requested
 config:
 
         NAME        STATE     READ WRITE CKSUM
         zpool0      ONLINE       0     0     0
           raidz1    ONLINE       0     0     0
             ad0     ONLINE       0     0     0
             ad2     ONLINE       0     0     0
             da1     ONLINE       0     0     0
           raidz1    ONLINE       0     0     0
             ad1     ONLINE       0     0     0
             ad3     ONLINE       0     0     0
             da2     ONLINE       0     0     0
 
 errors: No known data errors


~
----
Hiroyuki Seino  https://www.seichan.org/ https://www.seichan.org/blog/~
Today:&counter(today); Yesterday:&counter(yesterday); All:&counter;