以降の節では、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 クローンを非大域ゾーンに追加できますが、管理者制御を委任しても委任しなくてもかまいません。
ZFS ボリュームをデバイスとして非大域ゾーンに追加できます。
この時点で、ZFS スナップショットをゾーンに関連付けることはできません。
以降の節では、ZFS データセットはファイルシステムまたはクローンを指します。
データセットを追加すると、非大域ゾーンは大域ゾーンとディスク領域を共有できます。ただし、ゾーン管理者は、配下のファイルシステム階層でプロパティーを制御したり、新しいファイルシステムを作成したりすることはできません。この動作は、ほかの種類のファイルシステムをゾーンに追加する場合と同じであり、共通のディスク領域を共有することが目的の場合にのみ使用してください。
ZFS では、データセットを非大域ゾーンに委任して、データセットとそのすべての子を完全に制御する権限をゾーン管理者に渡すこともできます。ゾーン管理者は、そのデータセット内でファイルシステムやクローンを作成および破棄したり、データセットのプロパティーを変更したりできます。ゾーン管理者は、委任されたデータセットに設定された最上位の割り当て制限を超過するなど、ゾーンに追加されていないデータセットに影響を与えることはできません。
Oracle Solaris ゾーンがインストールされたシステム上で ZFS を操作する場合には、次の点を考慮してください。
非大域ゾーンに追加する ZFS ファイルシステムでは、mountpoint プロパティーを legacy に設定する必要があります。
CR 6449301 のため、非大域ゾーンが構成されている場合は、非大域ゾーンに ZFS データセットを追加しないでください。代わりに、ゾーンのインストール後に ZFS データセットを追加してください。
ソース zonepath とターゲット zonepath がどちらも ZFS ファイルシステム上に存在し、同じプール内にある場合、zoneadm clone は自動的に ZFS クローンを使ってゾーンを複製するようになりました。zoneadm clone コマンドは、ソース zonepath の ZFS スナップショットを作成し、ターゲット zonepath を設定します。zfs clone コマンドを使用してゾーンを複製することはできません。詳細は、『Oracle Solaris のシステム管理 (Oracle Solaris コンテナ : 資源管理と Oracle Solaris ゾーン)』のパート II「ゾーン」を参照してください。
ZFS ファイルシステムを非大域ゾーンに委任する場合は、Oracle Solaris Live Upgrade を使用する前にそのファイルシステムを該当の非大域ゾーンから削除する必要があります。削除しないと、読み取り専用ファイルシステムエラーのため、Oracle Live Upgrade が失敗します。
大域ゾーンと領域を共有する必要がある場合は、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 に設定する必要があります。別の場所にすでにマウントされているファイルシステムは追加できません。ゾーン管理者は、ファイルシステム内でファイルを作成および破棄することができます。ファイルシステムを別の場所に再マウントすることはできません。また、ゾーン管理者がファイルシステムのプロパティー (atime、readonly、compression など) を変更することもできません。大域ゾーン管理者は、ファイルシステムのプロパティーの設定および制御を担当します。
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 プロパティーをゾーンで管理する」を参照してください。
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 ストレージプールをゾーンの内部で作成または変更することはできません。委任管理モデルを使用することで、大域ゾーン内の物理ストレージデバイスの制御と仮想ストレージの制御をすべて非大域ゾーンで行うことができます。プールレベルのデータセットをゾーンに追加することはできますが、デバイスを作成したり、追加したり、削除したりするなど、プールの物理特性を変更するコマンドはゾーンの内部から実行することはできません。zonecfg コマンドの add device サブコマンドを使用して物理デバイスをゾーンに追加する場合でも、ファイルを使用する場合でも、zpool コマンドを使用してゾーンの内部に新しいプールを作成することはできません。
データセットをゾーンに委任したあとで、ゾーン管理者は特定のデータセットプロパティーを制御できます。ゾーンに委任したデータセットのすべての祖先は、読み取り専用データセットとして表示されます。ただし、データセット自体およびそのすべての子孫は書き込み可能です。たとえば、次のような構成を考えてみます。
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 |
はい |
はい |
sharenfs、zoned、quota、 reservation |
tank/data/zion/home |
はい |
はい |
sharenfs、zoned |
tank/zone/zion のすべての親は読み取り専用として表示され、すべての子孫は書き込み可能になり、親階層に含まれないデータセットは完全に非表示になります。非大域ゾーンは NFS サーバーとして動作できないため、ゾーン管理者が sharenfs プロパティーを変更することはできません。次の節で説明するように、zoned プロパティーを変更するとセキュリティー上の危険にさらされるため、ゾーン管理者はこの操作を行えません。
ゾーンの特権ユーザーは、その他の設定可能なプロパティーはすべて変更できます。ただし、quota プロパティーと reservation プロパティーは除きます。大域ゾーン管理者は、この動作を利用して、非大域ゾーンで使用されるすべてのデータセットが使用するディスク容量を制御できます。
また、データセットを非大域ゾーンに委任したあとに、大域ゾーン管理者が sharenfs および mountpoint プロパティーを変更することもできません。
データセットを非大域ゾーンに委任するときに、特定のプロパティーが大域ゾーンのコンテキストで解釈されないように、データセットに特別な設定を行う必要があります。データセットが非大域ゾーンに委任され、ゾーン管理者の制御下に入ると、その内容は信頼できる状態ではなくなります。どのファイルシステムにも該当することですが、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 プロパティーをオフに設定すると、システムが予期しない動作をする可能性があります。このプロパティーを変更するのは、データセットが非大域ゾーンで使用されていないことを確認した場合にのみ行なってください。