FreeBSD で ZFS を利用する – RAWボリュームを切り出す & iSCSI として提供する

ZFS

今回は ZFS ファイルシステムではなく,ボリュームとして切り出して利用したり,ボリュームを iSCSI として提供したりしてみます.

ブロックデバイスとして切り出す

ZFS のストレージプールからブロックデバイスとして切り出すことが可能です.

ZFS の中にボリュームを切り出して UFS フォーマットで利用する (またはその他のファイルシステムフォーマットを行う) ことや,iSCSI や GEOM GATE で他ホストへ共有を行うことができます.

ボリュームの作成も zfs create で行います.

# zfs create -V 10G pool0/zvol0

# zfs list
NAME                USED  AVAIL     REFER  MOUNTPOINT
pool0              10.3G  86.1G       24K  /pool0
pool0/data-backup  26.5K  86.1G     26.5K  /pool0/data-backup
pool0/zvol0        10.3G  96.4G       12K  -

この場合,zvol0 を 10GB で切り出しています.MOUNTPOINT が何もなく,マウントされていないことが分かります.
それ以外は ZFS の機能は利用可能です.スナップショットやクローン,圧縮・重複排除などをボリュームに対して適用できます.
ですので,このように zfs の設定は通常の ZFS ファイルシステムと大きく違いはありません.

# zfs get all pool0/zvol0
NAME         PROPERTY              VALUE                  SOURCE
pool0/zvol0  type                  volume                 -
pool0/zvol0  creation              Thu Dec 21 20:38 2023  -
pool0/zvol0  used                  10.3G                  -
pool0/zvol0  available             96.4G                  -
pool0/zvol0  referenced            12K                    -
pool0/zvol0  compressratio         1.00x                  -
pool0/zvol0  reservation           none                   default
pool0/zvol0  volsize               10G                    local
pool0/zvol0  volblocksize          8K                     default
pool0/zvol0  checksum              on                     default
pool0/zvol0  compression           off                    default
pool0/zvol0  readonly              off                    default
pool0/zvol0  createtxg             24146                  -
pool0/zvol0  copies                1                      default
pool0/zvol0  refreservation        10.3G                  local
pool0/zvol0  guid                  6841428395991112135    -
pool0/zvol0  primarycache          all                    default
pool0/zvol0  secondarycache        all                    default
pool0/zvol0  usedbysnapshots       0B                     -
pool0/zvol0  usedbydataset         12K                    -
pool0/zvol0  usedbychildren        0B                     -
pool0/zvol0  usedbyrefreservation  10.3G                  -
pool0/zvol0  logbias               latency                default
pool0/zvol0  objsetid              334                    -
pool0/zvol0  dedup                 off                    default
pool0/zvol0  mlslabel              none                   default
pool0/zvol0  sync                  standard               default
pool0/zvol0  refcompressratio      1.00x                  -
pool0/zvol0  written               12K                    -
pool0/zvol0  logicalused           6K                     -
pool0/zvol0  logicalreferenced     6K                     -
pool0/zvol0  volmode               default                default
pool0/zvol0  snapshot_limit        none                   default
pool0/zvol0  snapshot_count        none                   default
pool0/zvol0  snapdev               hidden                 default
pool0/zvol0  context               none                   default
pool0/zvol0  fscontext             none                   default
pool0/zvol0  defcontext            none                   default
pool0/zvol0  rootcontext           none                   default
pool0/zvol0  redundant_metadata    all                    default
pool0/zvol0  encryption            off                    default
pool0/zvol0  keylocation           none                   default
pool0/zvol0  keyformat             none                   default
pool0/zvol0  pbkdf2iters           0                      default

自ホスト内で UFS フォーマットしてみる

作成されたボリュームにアクセスするには /dev/zvol/[プール名]/[ボリューム名] でアクセスが可能です.
ファイルシステムを作成してマウントをしてみます.

# newfs /dev/zvol/pool0/zvol0
/dev/zvol/pool0/zvol0: 10240.0MB (20971520 sectors) block size 32768, fragment size 4096
        using 17 cylinder groups of 625.22MB, 20007 blks, 80128 inodes.
super-block backups (for fsck_ffs -b #) at:
 192, 1280640, 2561088, 3841536, 5121984, 6402432, 7682880, 8963328, 10243776, 11524224, 12804672, 14085120, 15365568,
 16646016, 17926464, 19206912, 20487360

# mount /dev/zvol/pool0/zvol0 /mnt

# df
Filesystem            1K-blocks    Used    Avail Capacity  Mounted on
/dev/da0p2             19279260 2223580 15513340    13%    /
devfs                         1       1        0   100%    /dev
/dev/da2              101561756   10600 93426216     0%    /mnt
pool0                  90273061      24 90273037     0%    /pool0
pool0/data-backup      90273064      26 90273037     0%    /pool0/data-backup
/dev/zvol/pool0/zvol0  10144028       8  9332500     0%    /mnt

通常このような使い方を行うことはないと思いますが,こういったこともできますという例になります.

ボリュームを拡張してみる

ZFS で作成したボリュームは簡単に拡張・縮小が可能です.縮小は上位のファイルシステムも対応している必要があります.
今回はボリュームを拡張し,ファイルシステムも拡張してみる.ということを実施します.

# zfs set volsize=20G pool0/zvol0

# zfs list
NAME                USED  AVAIL     REFER  MOUNTPOINT
pool0              20.6G  75.8G       24K  /pool0
pool0/data-backup  26.5K  75.8G     26.5K  /pool0/data-backup
pool0/zvol0        20.6G  96.4G     1.84M  -

# df
Filesystem            1K-blocks    Used    Avail Capacity  Mounted on
/dev/da0p2             19279260 2223580 15513340    13%    /
devfs                         1       1        0   100%    /dev
/dev/da2              101561756   10600 93426216     0%    /mnt
pool0                  79458977      24 79458953     0%    /pool0
pool0/data-backup      79458979      26 79458953     0%    /pool0/data-backup
/dev/zvol/pool0/zvol0  10144028       8  9332500     0%    /mnt

# growfs /dev/zvol/pool0/zvol0
Device is mounted read-write; resizing will result in temporary write suspension for /mnt.
It's strongly recommended to make a backup before growing the file system.
OK to grow filesystem on /dev/zvol/pool0/zvol0, mounted on /mnt, from 10GB to 20GB? [yes/no] yes
super-block backups (for fsck_ffs -b #) at:
 21767808, 23048256, 24328704, 25609152, 26889600, 28170048, 29450496, 30730944, 32011392, 33291840, 34572288, 35852736,
 37133184, 38413632, 39694080, 40974528

# df
Filesystem            1K-blocks    Used    Avail Capacity  Mounted on
/dev/da0p2             19279260 2223580 15513340    13%    /
devfs                         1       1        0   100%    /dev
/dev/da2              101561756   10600 93426216     0%    /mnt
pool0                  79458969      24 79458945     0%    /pool0
pool0/data-backup      79458972      26 79458945     0%    /pool0/data-backup
/dev/zvol/pool0/zvol0  20308252       8 18683584     0%    /mnt

このように簡単に拡張することができます.

iSCSI で提供する

まず,FreeBSD の iSCSI については以下で記事にしていますのでこちらも合わせてご覧ください.

その上で,サーバー (ターゲット) から提供する.という所に絞って説明を行います.
もちろん,ZFS ボリュームを切り出すのではなく,ZFS ファイルシステム内のボリュームファイルを提供することも可能です.

ターゲットを設定する

先ほど作成したボリューム vol0 を iSCSI ターゲットに載せてみます.以下設定ファイルは前回のものを流用しています.詳細は上部にリンクを張った記事をご覧ください.
違いは lun0 で指定しているデバイスファイルのパス,lun 1 で指定しているパスだけになります.

# cat /etc/ctl.conf
auth-group ag0 {
  chap-mutual "iscsi-user1" "Password-user1" "mutual-user" "Password-mutual"
  initiator-portal 172.16.255.0/24
  initiator-portal 172.17.255.0/24
}

portal-group pg0 {
  discovery-auth-group no-authentication
  listen 172.16.255.254:3260
  listen 172.17.255.254:3260
}

target iqn.2023-12.iscsi.org.seichan:target0 {
  alias "target0"
  auth-group ag0
  portal-group pg0
  lun 0 {
    path /dev/zvol/pool0/zvol0
    option vendor "FreeBSD"
  }
  lun 1 {
    path /pool0/lun1.img
    option vendor "FreeBSD"
    blocksize 4096
    size 10G
  }
}

この設定ファイルを用いて ctld を起動します.

# cat /etc/rc.conf
ctld_enable="YES"
zfs_enable="YES"

# /etc/rc.d/ctld start
Starting ctld.

# ctladm devlist -v
LUN Backend       Size (Blocks)   BS Serial Number    Device ID
  0 block              41943040  512 MYSERIAL0000     MYDEVID0000
      lun_type=0
      num_threads=32
      vendor=FreeBSD
      file=/dev/zvol/pool0/zvol0
      ctld_name=iqn.2023-12.iscsi.org.seichan:target0,lun,0
      scsiname=iqn.2023-12.iscsi.org.seichan:target0,lun,0
  1 block               2621440 4096 MYSERIAL0001     MYDEVID0001
      lun_type=0
      num_threads=32
      vendor=FreeBSD
      file=/pool0/lun1.img
      ctld_name=iqn.2023-12.iscsi.org.seichan:target0,lun,1
      scsiname=iqn.2023-12.iscsi.org.seichan:target0,lun,1

iSCSI 用のボリュームを ZFS で作成する利点は上でも書いていますが,ZFS の機能を利用できる事です.

スナップショットの作成,クローン,send / recv によるレプリケーションはもちろん,圧縮や重複排除が利用できます.

もちろん,ボリュームを作成して iSCSI で.ではなく,ZFS ファイルシステムを NFS で提供ということも可能ですし,こちらも同様の利点があります.

最終的には利用するシステムがどちらの方が都合がよいのか (パフォーマンスの観点,扱いやすさの観点など色々とあると思います) で選択で良いでしょう.

自分の場合は ZFS ファイルサーバー側でファイルが読み書きできる方を重要視しているので iSCSI の利用ではなく NFS での利用を行っていますが,MSFC の検証などでは iSCSI を利用しています.

以上,ブロックデバイスとして切り出す紹介を終わります.次回は圧縮と重複排除について触れていこうと思います.

コメント

タイトルとURLをコピーしました