CentOS上のZFS:エラー処理

私はかなり長い間(OpenSolarisの時代から)ZFSを使用しており、LinuxでのこのFSに非常に満足しています。

偉業を成し遂げるためのマニュアルのいくつかの間違いに気付いたので、私は通常通りに通り過ぎないことに決めました。 残念ながら、完全に明らかな理由で、コメントに答えることはできません。

バグに取り組み、役立つ情報をいくつか紹介します。

1. ZFSをmdadmアレイの上にインストールします-これはCPUリソースとディスクI / Oの過剰な浪費です。 ZFS自体はRAID-0 / 1/5/6(z2)/ z3を完全に作成します。

2. GRUB2を使用する場合、/ bootの個別のセクションにはまったく意味がありません。 記事で指定された修正により、GRUB2はZFSにあるOSを完全にロードし、ルートファイルシステムにある/ブートディレクトリの内容を問題なく読み取ることができます。

これがどのように行われるか

ディスク(2つあると仮定)では、2つのパーティションのみが必要です。1つはGRUB2用、もう1つはディスクプール用です。 ディスクのパーティション分割の例(UEFIなしのGPT、UEFIを使用する場合は、それに応じてパーティションタイプを設定します):

ディスク1:

/dev/sda1 2048 206847 204800 100M BIOS boot /dev/sda2 206848 1953525134 1953318287 931,4G FreeBSD ZFS 

ディスク2:

 /dev/sdb1 2048 206847 204800 100M BIOS boot /dev/sdb2 206848 1953525134 1953318287 931,4G FreeBSD ZFS 

プール(ミラー)の作成:

 $ zpool create -o ashift=12 diskpool mirror /dev/sda2 /dev/sdb2 

diskpoolがプールの名前である場合、当然、名前はプールの好み/命名スキームに従って選択できます。

作成されたプールを次のように確認します。

 $ zpool status dispool 

とりわけ以下を確認します。

  NAME STATE READ WRITE CKSUM diskpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sda2 ONLINE 0 0 0 sdb2 ONLINE 0 0 0 

多くのディスク(たとえば4番目)があり、パフォーマンスが重要な場合、 RAID-10を作成できます

 $ zpool create -o ashift=12 diskpool mirror /dev/sda2 /dev/sdb2 mirror /dev/sdc2 /dev/sdd2 

プールのステータスを確認すると、以下が表示されます。

  NAME STATE READ WRITE CKSUM diskpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sda2 ONLINE 0 0 0 sdb2 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sdc2 ONLINE 0 0 0 sdd2 ONLINE 0 0 0 

多数のディスクがあり、 より容量の大きいRAIDが必要な場合:

ご注意

raidz-RAID-5。 1つのP-sum-xor

raidz2-RAID-6。 1つのP-sumはxor、1つのQ-sumはGF(2 ^ 8)のリードソロモンコードです。 GFは公平ではなく、パフォーマンスが最適化されているため、0を含み、RAID-6と呼ばれる権利はありませんが、raidz2はRAID-6の8倍の速さでQ合計を計算します。

raidz3-トリプルパリティ付き(3番目の合計の作成に使用されるものをチェックするためにソースコードを調べたことはありません)

4つのディスクにRAID5を作成します。

 $ zpool create -o ashift=12 diskpool raidz /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2 

プールをチェックすると、以下が表示されます。

  NAME STATE READ WRITE CKSUM diskpool ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 sda2 ONLINE 0 0 0 sdb2 ONLINE 0 0 0 sdc2 ONLINE 0 0 0 sdd2 ONLINE 0 0 0 

5つのディスクにRAID6を作成します。

 $ zpool create -o ashift=12 diskpool raidz2 /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2 /dev/sde2 

12台のディスクにRAID-50を作成します。

 $ zpool create -o ashift=12 diskpool raidz /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2 /dev/sde2 /dev/sdf2 raidz /dev/sdh2 /dev/sdi2 /dev/sdj2 /dev/sdk2 /dev/sdl2 /dev/sdm2 

原理は明らかです-任意の組み合わせが利用可能です。 1つのプールで異なるタイプのRAIDを組み合わせることができますが、もちろんこれには意味がありませんが、制限があります。

1. ARC2 SSDキャッシュは、ミラーのあるプールでは使用できません。
2. 1つのプールに異なるタイプのRAIDを混在させると、プールのパフォーマンスが予測不能になります(最悪の場合、サンドイッチダウン)。

SSD ARC2キャッシュに言及したので:

 #/dev/sdf - SSD  $ zpool create -o ashift=12 diskpool raidz1 /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2 /dev/sde2 cache /dev/sdf 

プールをチェックすると、以下が表示されます。

  NAME STATE READ WRITE CKSUM diskpool ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 sda2 ONLINE 0 0 0 sdb2 ONLINE 0 0 0 sdc2 ONLINE 0 0 0 sdd2 ONLINE 0 0 0 cache sdf ONLINE 0 0 0 

プールを作成するときに、次のような追加オプションを指定できます。

 $ zpool create -o ashift=12 -o listsnapshots=on diskpool raidz /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2 

プールの作成後に変更できるashiftと一部の機能を除くすべてのオプション。

注意! zfsバージョン0.6.5以降を使用する場合は、プールを作成するときに次の機能を必ず無効にしてください。

feature@spacemap_histogram
feature@enabled_txg
feature@hole_birth
feature@extensible_dataset
feature@embedded_data
feature@bookmarks
feature@filesystem_limits
feature@large_blocks


有効になっている場合、GRUB2はそのようなFSからまだ起動できません。 これらは新しいパンで、GRUB2についてはまだ知られていません。

したがって、必要なすべてのパラメーターを使用してプールを作成します。

 $ zpool create -o ashift=12 -o listsnapshots=on \ - feature@spacemap_histogram=disabled\ - feature@enabled_txg=disabled\ - feature@hole_birth=disabled\ - feature@extensible_dataset=disabled\ - feature@embedded_data=disabled\ - feature@bookmarks=disabled\ - feature@filesystem_limits=disabled\ - feature@large_blocks=disabled\ diskpool raidz /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2 

また、-Oスイッチを使用して、後で作成されたファイルシステムのオプションをすぐに指定することもできます(詳細については後述)。

今、あなたはする必要があります:

1.ファイルシステムを正しく作成する
2.プールにメインルートシステムを示し、必要に応じて代替(非常に便利なもの)を示します。
3.プールのすべてのディスクにGRUB2をインストールします
4.その他

プールを作成すると、デフォルトのファイルシステムがプールに関連付けられます。

 $ zfs list 

 NAME USED AVAIL REFER MOUNTPOINT diskpool 471G 442G 136K legacy 


このFSのMOUNTPOINT列のzfs listコマンドに「レガシー」が含まれていない場合は、すぐに修正する必要があります。

 $ zfs set mountpoint=legacy diskpool 

一般に、これはルートファイルシステムですが、使用しませんが、次のような別の仮想ルートFSを作成します。

 $ zfs create -o utf8only=on -o compression=lz4 -o atime=off -o relatime=on -o acltype=posixacl -o mountpoint=legacy -o xattr=on diskpool/ROOT 

このFSにはマウントポイントもありません。また、(他のオプションを指定しない場合)後で作成されるすべてのFSによって継承される多くの便利なオプションが含まれます。

使用されるオプション
オプションatime = offおよびrelatime = onは、FSのパフォーマンスを大幅に向上させ、ファイルにアクセスするためのタイムスタンプを犠牲にします。

compression = lz4オプションは、FS上でlzjb圧縮アルゴリズムの「非常に生産的な」バージョンを有効にします。 どこかにテストさえあります、そして、私は覚えています、彼らは私に感銘を与えました。 圧縮を有効にするかどうかは、好みの問題だけでなく、作業の快適さの問題でもあり、FSの目的にも大きく依存します。 これについては、おそらく後続の記事で説明します。

ファイル名でutf8をサポートし、多言語のHTML名で問題が発生しないようにしたいですか? 最適な選択は、utf8only = onオプションです。

まあ、xattrのサポートは間違いなく必要です(xattr = on)。 ZFSonLinuxでのPOSIX ACLサポート(オプションacltype = posixacl)の登場は、私が個人的に休日として出会った(殺したが、この機能を追加したバージョンは覚えていない)。

次に、これがブートFSであることをプールに示します。

 $ zpool set bootfs=diskpool/ROOT 

次に、OSインストールセクションの元の記事の手順に従いますが、次の違いがあります。

1.別のファイルシステム/ bootを作成せず、/ bootディレクトリに何もマウントしません
2. / etc / fstabはまだ使用していません
3.ディスク上のGRUB2のインストールは、次のように変更する必要があります。

 $ grub2-install --modules=zfs --boot-directory=/boot /dev/sda $ grub2-install --modules=zfs --boot-directory=/boot /dev/sdb $ grub2-mkconfig -o /boot/grub/grub.cfg 

4. initramfsの再構築を開始する前に、/ mnt / etc / zfs / zpool.cacheを削除してください。

その後、再び、すべての指示に従って。

注釈

/ dev / disk / by- *ディレクトリのディスクデバイスエイリアスを使用する必要はありません(各ディスクはwwnによってプール構成を認識します)。 /etc/zfs/vdev_id.confを編集し、エイリアスオプションを使用してドライブに独自の名前を付けることもできます。

 alias disk1 wwn-0x5000c50045957af3-part2 alias disk2 wwn-0x50004cf20b0d7fa0-part2 

マルチパスを使用する場合、同じファイルに次のオプションを追加します。

 multipath yes # PCI_ID HBA PORT CHANNEL NAME channel 85:00.0 1 A channel 85:00.0 0 B channel 86:00.0 1 A channel 86:00.0 0 B 


当然、HBAのPCI IDを独自のものに置き換えます。

正直に言うと、私はエンタープライズディストリビューションにZFSをインストールしたことがありません。 理由は明らかです。 この問題におけるkvapsの偉業も明らかです。 尊敬。

Source: https://habr.com/ru/post/J268807/


All Articles