Oracle Solaris ZFS 管理ガイド

第 10 章 Oracle Solaris ZFS の高度なトピック

この章では、ZFS ボリューム、ゾーンがインストールされた Solaris システムで ZFS を使用する方法、ZFS 代替ルートプール、および ZFS 権利プロファイルについて説明します。

この章は、次の節で構成されます。

ZFS ボリューム

ZFS ボリュームとは、ブロックデバイスを表すデータセットです。ZFS ボリュームは、/dev/zvol/{dsk,rdsk}/pool ディレクトリのデバイスとして識別されます。

次の例では、5G バイトの ZFS ボリューム tank/vol が作成されます。


# zfs create -V 5gb tank/vol

ボリュームの作成時には、予期しない動作が発生しないよう、予約が自動的にボリュームの初期サイズに設定されます。たとえば、ボリュームのサイズを縮小すると、データが破壊される可能性があります。ボリュームのサイズを変更するときは、注意深く行う必要があります。

また、サイズが変化するボリュームのスナップショットを作成する場合は、スナップショットをロールバックしたり、スナップショットからのクローンを作成しようとすると、不一致が発生する可能性があります。

ボリュームに適用可能なファイルシステムプロパティーについては、表 6–1 を参照してください。

ゾーンがインストールされた Solaris システムを使用している場合は、非大域ゾーンの中で ZFS ボリュームを作成または複製することはできません。そうしようとしても失敗します。ZFS ボリュームを大域ゾーンで使用する方法については、「ZFS ボリュームを非大域ゾーンに追加する」を参照してください。

ZFS ボリュームをスワップデバイスまたはダンプデバイスとして使用する

ZFS ルートファイルシステムをインストールするとき、または UFS ルートファイルシステムから移行するときに、ZFS ルートプールの ZFS ボリュームにスワップデバイスが作成されます。次に例を示します。


# swap -l
swapfile                  dev    swaplo   blocks     free
/dev/zvol/dsk/rpool/swap 253,3        16  8257520  8257520

ZFS ルートファイルシステムをインストールするとき、または UFS ルートファイルシステムから移行するときに、ZFS ルートプールの ZFS ボリュームにダンプデバイスが作成されます。ダンプデバイスを設定したあとは、ダンプデバイスの管理は不要です。次に例を示します。


# dumpadm
      Dump content: kernel pages
       Dump device: /dev/zvol/dsk/rpool/dump (dedicated)
Savecore directory: /var/crash/t2000
  Savecore enabled: yes

システムのインストール後またはアップグレード後にスワップ領域やダンプデバイスを変更する必要がある場合は、以前の Solaris 10 リリースと同様に swap コマンドと dumpadm コマンドを使用します。追加のスワップボリュームを作成する必要がある場合は、特定のサイズの ZFS ボリュームを作成してから、そのデバイスでスワップを有効にします。次に例を示します。


# zfs create -V 2G rpool/swap2
# swap -a /dev/zvol/dsk/rpool/swap2
# swap -l
swapfile                   dev  swaplo blocks   free
/dev/zvol/dsk/rpool/swap  256,1      16 2097136 2097136
/dev/zvol/dsk/rpool/swap2 256,5      16 4194288 4194288

ZFS ファイルシステム上のファイルには、スワップしないでください。ZFS スワップファイルの構成はサポートされていません。

スワップボリュームとダンプボリュームのサイズの調整については、「ZFS スワップデバイスおよびダンプデバイスのサイズを調整する」を参照してください。

ZFS ボリュームを Solaris iSCSI ターゲットとして使用する

ボリュームに shareiscsi プロパティーを設定すれば、簡単に ZFS ボリュームを iSCSI ターゲットとして作成できます。次に例を示します。


# zfs create -V 2g tank/volumes/v2
# zfs set shareiscsi=on tank/volumes/v2
# iscsitadm list target
Target: tank/volumes/v2
    iSCSI Name: iqn.1986-03.com.sun:02:984fe301-c412-ccc1-cc80-cf9a72aa062a
    Connections: 0

iSCSI ターゲットが作成されたら、iSCSI イニシエータを設定します。Solaris iSCSI ターゲットおよびイニシエータの詳細については、『Solaris のシステム管理 (デバイスとファイルシステム)』の第 14 章「Oracle Solaris iSCSI ターゲットおよびイニシエータの構成 (手順)」を参照してください。


注 –

また、Solaris iSCSI ターゲットは、iscsitadm コマンドを使って作成および管理することもできます。ZFS ボリュームに shareiscsi プロパティーを設定した場合は、iscsitadm コマンドを使用して同じターゲットデバイスをまた作成しないでください。そうしないと、同じデバイスに対して重複したターゲット情報が作成されてしまいます。


iSCSI ターゲットとしての ZFS ボリュームは、ほかの ZFS データセットとまったく同じように管理されます。ただし、iSCSI ターゲットでは、名前の変更、エクスポート、およびインポートの操作が少し異なります。

iSCSI ターゲットの構成情報はすべてデータセット内に格納されます。NFS 共有ファイルシステムと同様に、別のシステム上にインポートされる iSCSI ターゲットは正しく共有されます。

ゾーンがインストールされている Solaris システムで ZFS を使用する

以降の節では、Oracle Solaris ゾーンを備えたシステムで ZFS を使用する方法について説明します。

ZFS ルートファイルシステムがインストールされたシステムにゾーンを構成し、Oracle Solaris Live Upgrade で移行やパッチの適用を行う方法については、「ゾーンが含まれているシステムを Oracle Solaris Live Upgrade で移行またはアップグレードする (Solaris 10 10/08)」または 「ゾーンが含まれているシステムを Oracle Solaris Live Upgrade で移行またはアップグレードする (Solaris 10 5/09 以降)」を参照してください。

ZFS データセットをゾーンに関連付けるときは、次の点に留意してください。

以降の節では、ZFS データセットはファイルシステムまたはクローンを指します。

データセットを追加すると、非大域ゾーンは大域ゾーンとディスク領域を共有できます。ただし、ゾーン管理者は、配下のファイルシステム階層でプロパティーを制御したり、新しいファイルシステムを作成したりすることはできません。この動作は、ほかの種類のファイルシステムをゾーンに追加する場合と同じであり、共通のディスク領域を共有することが目的の場合にのみ使用してください。

ZFS では、データセットを非大域ゾーンに委任して、データセットとそのすべての子を完全に制御する権限をゾーン管理者に渡すこともできます。ゾーン管理者は、そのデータセット内でファイルシステムやクローンを作成および破棄したり、データセットのプロパティーを変更したりできます。ゾーン管理者は、委任されたデータセットに設定された最上位の割り当て制限を超過するなど、ゾーンに追加されていないデータセットに影響を与えることはできません。

Oracle Solaris ゾーンがインストールされたシステム上で ZFS を操作する場合には、次の点を考慮してください。

ZFS ファイルシステムを非大域ゾーンに追加する

大域ゾーンと領域を共有する必要がある場合は、ZFS ファイルシステムを汎用のファイルシステムとして追加して、その目的のためだけに使用できます。 非大域ゾーンに追加する ZFS ファイルシステムでは、mountpoint プロパティーを legacy に設定する必要があります。

zonecfg コマンドの add fs サブコマンドを使用することで、ZFS ファイルシステムを非大域ゾーンに追加できます。

次の例では、大域ゾーンの大域ゾーン管理者が、ZFS ファイルシステムを非大域ゾーンに追加しています。


# zonecfg -z zion
zonecfg:zion> add fs
zonecfg:zion:fs> set type=zfs
zonecfg:zion:fs> set special=tank/zone/zion
zonecfg:zion:fs> set dir=/export/shared
zonecfg:zion:fs> end

この構文では、ZFS ファイルシステム tank/zone/zion がすでに構成済みの zion ゾーンに追加され、/export/shared にマウントされます。ファイルシステムの mountpoint プロパティーは、legacy に設定する必要があります。別の場所にすでにマウントされているファイルシステムは追加できません。ゾーン管理者は、ファイルシステム内でファイルを作成および破棄することができます。ファイルシステムを別の場所に再マウントすることはできません。また、ゾーン管理者がファイルシステムのプロパティー (atimereadonlycompression など) を変更することもできません。大域ゾーン管理者は、ファイルシステムのプロパティーの設定および制御を担当します。

zonecfg コマンドの詳細および zonecfg を使用したリソースタイプの設定の詳細については、『Oracle Solaris のシステム管理 (Oracle Solaris コンテナ : 資源管理と Oracle Solaris ゾーン)』のパート II「ゾーン」を参照してください。

データセットを非大域ゾーンに委任する

ストレージの管理をゾーンに委任するという主要目的を果たせるよう、ZFS では、zonecfg コマンドの add dataset サブコマンドを使用してデータセットを非大域ゾーンに追加することができます。

次の例では、大域ゾーンの大域ゾーン管理者が、ZFS ファイルシステムを非大域ゾーンに委任しています。


# zonecfg -z zion
zonecfg:zion> add dataset
zonecfg:zion:dataset> set name=tank/zone/zion
zonecfg:zion:dataset> end

ファイルシステムを追加する場合と異なり、この構文を実行すると、ZFS ファイルシステム tank/zone/zion がすでに構成済みの zion ゾーンから見えるようになります。ゾーン管理者は、ファイルシステムのプロパティーを設定したり、子孫ファイルシステムを作成したりできます。また、ゾーン管理者は、スナップショットやクローンを作成し、およびファイルシステム階層全体を制御することができます。

Oracle Solaris Live Upgrade を使って非大域ゾーンを含む ZFS BE をアップグレードする場合には、まず委任されたデータセットをすべて削除してください。削除しないと、読み取り専用ファイルシステムエラーで Oracle Solaris Live Upgrade が失敗します。次に例を示します。


zonecfg:zion>
zonecfg:zion> remove dataset name=tank/zone/zion
zonecfg:zion1> exit

ゾーンでどのような操作が許可されるかの詳細については、「ZFS プロパティーをゾーンで管理する」を参照してください。

ZFS ボリュームを非大域ゾーンに追加する

zonecfg コマンドの add dataset サブコマンドを使用して、ZFS ボリュームを非大域ゾーンに追加することはできません。ただし、zonecfg コマンドの add device サブコマンドを使って、ボリュームをゾーンに追加することはできます。

次の例では、大域ゾーンの大域ゾーン管理者が、ZFS ボリュームを非大域ゾーンに追加しています。


# zonecfg -z zion
zion: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zion> create
zonecfg:zion> add device
zonecfg:zion:device> set match=/dev/zvol/dsk/tank/vol
zonecfg:zion:device> end

この構文では、tank/vol ボリュームが zion ゾーンに追加されます。raw ボリュームをゾーンに追加する操作は、そのボリュームが物理ディスクに対応していない場合でも、潜在的なセキュリティー上の危険を伴います。特に、ゾーン管理者が作成したファイルシステムの形式が正しくない場合には、マウントしようとするときにファイルシステムでパニックが発生します。デバイスをゾーンに追加することおよびそれに関連するセキュリティー上の危険の詳細については、zoned プロパティーについて」を参照してください。

デバイスをゾーンに追加する方法の詳細については、『Oracle Solaris のシステム管理 (Oracle Solaris コンテナ : 資源管理と Oracle Solaris ゾーン)』のパート II「ゾーン」を参照してください。

ZFS ストレージプールをゾーンで使用する

ZFS ストレージプールをゾーンの内部で作成または変更することはできません。委任管理モデルを使用することで、大域ゾーン内の物理ストレージデバイスの制御と仮想ストレージの制御をすべて非大域ゾーンで行うことができます。プールレベルのデータセットをゾーンに追加することはできますが、デバイスを作成したり、追加したり、削除したりするなど、プールの物理特性を変更するコマンドはゾーンの内部から実行することはできません。zonecfg コマンドの add device サブコマンドを使用して物理デバイスをゾーンに追加する場合でも、ファイルを使用する場合でも、zpool コマンドを使用してゾーンの内部に新しいプールを作成することはできません。

ZFS プロパティーをゾーンで管理する

データセットをゾーンに委任したあとで、ゾーン管理者は特定のデータセットプロパティーを制御できます。ゾーンに委任したデータセットのすべての祖先は、読み取り専用データセットとして表示されます。ただし、データセット自体およびそのすべての子孫は書き込み可能です。たとえば、次のような構成を考えてみます。


global# zfs list -Ho name
tank
tank/home
tank/data
tank/data/matrix
tank/data/zion
tank/data/zion/home

tank/data/zion をゾーンに追加した場合には、各データセットのプロパティーは次のようになります。

データセット 

表示可能 

書き込み可能 

不変のプロパティー 

tank

はい 

いいえ 

tank/home

いいえ 

tank/data

はい 

いいえ 

tank/data/matrix

いいえ 

tank/data/zion

はい 

はい 

sharenfszonedquota reservation

tank/data/zion/home

はい 

はい 

sharenfszoned

tank/zone/zion のすべての親は読み取り専用として表示され、すべての子孫は書き込み可能になり、親階層に含まれないデータセットは完全に非表示になります。非大域ゾーンは NFS サーバーとして動作できないため、ゾーン管理者が sharenfs プロパティーを変更することはできません。次の節で説明するように、zoned プロパティーを変更するとセキュリティー上の危険にさらされるため、ゾーン管理者はこの操作を行えません。

ゾーンの特権ユーザーは、その他の設定可能なプロパティーはすべて変更できます。ただし、quota プロパティーと reservation プロパティーは除きます。大域ゾーン管理者は、この動作を利用して、非大域ゾーンで使用されるすべてのデータセットが使用するディスク容量を制御できます。

また、データセットを非大域ゾーンに委任したあとに、大域ゾーン管理者が sharenfs および mountpoint プロパティーを変更することもできません。

zoned プロパティーについて

データセットを非大域ゾーンに委任するときに、特定のプロパティーが大域ゾーンのコンテキストで解釈されないように、データセットに特別な設定を行う必要があります。データセットが非大域ゾーンに委任され、ゾーン管理者の制御下に入ると、その内容は信頼できる状態ではなくなります。どのファイルシステムにも該当することですが、setuid バイナリやシンボリックリンクなどの安全性に問題のある内容が含まれていることがあります。これらは、大域ゾーンのセキュリティーを低下させる可能性があります。また、mountpoint プロパティーは、大域ゾーンのコンテキストでは解釈できません。さらに、ゾーン管理者が大域ゾーンの名前空間を操作してしまう可能性もあります。後者の問題に対処するために、ZFS では zoned プロパティーを使って、データセットがある時点で非大域ゾーンに委任されていることを示しています。

zoned プロパティーはブール値で、ZFS データセットを含むゾーンが最初に起動するときに自動的にオンに設定されます。ゾーン管理者が、このプロパティーを手動でオンに設定する必要はありません。zoned プロパティーを設定した場合、そのデータセットを大域ゾーンでマウントしたり共有したりすることはできません。次の例では、tank/zone/zion はゾーンに委任されていますが、tank/zone/global は追加されていません。


# zfs list -o name,zoned,mountpoint -r tank/zone
NAME                  ZONED  MOUNTPOINT
tank/zone/global        off  /tank/zone/global
tank/zone/zion           on  /tank/zone/zion
# zfs mount
tank/zone/global           /tank/zone/global
tank/zone/zion             /export/zone/zion/root/tank/zone/zion

mountpoint プロパティーと、tank/zone/zion データセットが現在マウントされているディレクトリとが異なっていることに注意してください。mountpoint プロパティーには、データセットがシステム上で現在マウントされている場所ではなく、ディスクに格納されているプロパティーが反映されます。

データセットがゾーンから削除されたり、ゾーンが破棄されたりした場合でも、zoned プロパティーが自動的に消去されることはありません。これらの操作に関連するセキュリティー上の危険が潜在的に存在するために、このような動作になっています。信頼されないユーザーがデータセットとその子孫へのアクセスを完了してしまっているので、mountpoint プロパティーが不正な値に設定されたり、ファイルシステムに setuid バイナリが存在したりする可能性があります。

意図しないセキュリティー上の危険を防ぐために、データセットをなんらかの方法で再利用する場合には、大域ゾーン管理者が zoned プロパティーを手動で消去する必要があります。zoned プロパティーを off に設定する前に、データセットおよびそのすべての子孫の mountpoint プロパティーが適切な値に設定されていること、および setuid バイナリが存在しないことを確認するか、または setuid プロパティーを無効に設定します。

セキュリティーが脆弱なままでないことを確認したあとで、zfs set または zfs inherit コマンドを使用して zoned プロパティーをオフに設定できます。データセットがゾーンで使用されているときに zoned プロパティーをオフに設定すると、システムが予期しない動作をする可能性があります。このプロパティーを変更するのは、データセットが非大域ゾーンで使用されていないことを確認した場合にのみ行なってください。

ZFS 代替ルートプールを使用する

プールが作成されると、そのプールはデフォルトでホストシステムに関連付けられます。ホストシステムでは、プールに関する情報を管理しているので、プールが使用できなくなったときにそのことを自動的に検出することができます。この情報は、通常の操作では有効な情報ですが、代替メディアから起動するときまたはリムーバブルメディアにプールを作成するときには障害になることがあります。この問題を解決するために、ZFS には「代替ルート」プール機能が用意されています。代替ルートプールは、システムの再起動後には有効でなくなり、すべてのマウントポイントはプールのルートへの相対パスに変更されます。

ZFS 代替ルートプールを作成する

代替ルートプールを作成する理由としてもっとも一般的なのは、リムーバブルメディアでの使用です。このような場合には、必要なファイルシステムは通常 1 つだけなので、ターゲットシステムでユーザーが選択した場所にマウントする必要があります。zpool create -R オプションを使用して代替ルートプールを作成すると、ルートファイルシステムのマウントポイントは代替ルート値と同じ / に自動的に設定されます。

次の例では、morpheus という名前のプールが 代替ルートパスとしての /mnt に作成されます。


# zpool create -R /mnt morpheus c0t0d0
# zfs list morpheus
NAME                   USED  AVAIL  REFER  MOUNTPOINT
morpheus              32.5K  33.5G     8K  /mnt

ファイルシステムが 1 つだけで (morpheus)、そのマウントポイントがプールの代替ルート /mnt であることに注意してください。ディスクに格納されているマウントポイントは、実際に / になっています。/mnt のフルパスは、プール作成のこの初期コンテキストでのみ解釈されます。その後、このファイルシステムをエクスポートし、それを別のシステム上の任意の代替ルートプールの下で、-R alternate root value 構文を使ってインポートすることができます。


# zpool export morpheus
# zpool import morpheus
cannot mount '/': directory is not empty
# zpool export morpheus
# zpool import -R /mnt morpheus
# zfs list morpheus
NAME                   USED  AVAIL  REFER  MOUNTPOINT
morpheus              32.5K  33.5G     8K  /mnt

代替ルートプールをインポートする

代替ルートを使って、プールをインポートすることもできます。この機能は、回復を行う状況で利用できます。つまり、マウントポイントを現在のルートのコンテキストではなく、修復を実行できるように一時的なディレクトリとして解釈するような状況で利用できます。前節で説明したように、この機能はリムーバブルメディアをマウントするときにも使用できます。

次の例では、morpheus という名前のプールが代替ルートパスとしての /mnt にインポートされます。この例では、morpheus がすでにエクスポート済みであることを前提としています。


# zpool import -R /a pool
# zpool list morpheus
NAME   SIZE   ALLOC  FREE    CAP  HEALTH  ALTROOT
pool  44.8G    78K  44.7G     0%  ONLINE  /a
# zfs list pool
NAME   USED  AVAIL  REFER  MOUNTPOINT
pool  73.5K  44.1G    21K  /a/pool

ZFS 権利プロファイル

スーパーユーザー (root) アカウントを使用しないで ZFS 管理タスクを実行する必要がある場合は、次のいずれかのプロファイルが割り当てられた役割引き受けて ZFS 管理タスクを実行できます。

役割の作成または割り当ての詳細については、『Solaris のシステム管理 (セキュリティサービス)』を参照してください。

RBAC の役割を使用して ZFS ファイルシステムを管理するほかに、ZFS 委任管理を使用して ZFS 管理タスクを分散することも検討できます。詳細は、第 9 章Oracle Solaris ZFS 委任管理を参照してください。