ZFSイメージの混乱

ZFSイメージの混乱

RAID10には6つのドライブを持つZFSプールがあります。以前はそうでした。

146GBドライブを1TBドライブにアップグレードしようとしましたが、結果が良くありませんでした。

root@x7550:~# zpool status
  pool: stuffpool
 state: ONLINE
  scan: scrub repaired 0 in 0h6m with 0 errors on Mon May  9 15:26:39 2016
config:

    NAME                                               STATE     READ WRITE CKSUM
    stuffpool                                          ONLINE       0     0     0
      mirror-0                                         ONLINE       0     0     0
        ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1  ONLINE       0     0     0
        ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1  ONLINE       0     0     0
      mirror-1                                         ONLINE       0     0     0
        ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1  ONLINE       0     0     0
        ata-HGST_HTS541010A9E680_JA1009C03158BP-part1  ONLINE       0     0     0
      scsi-35000c50016ebcdfb-part1                     ONLINE       0     0     0
      ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1    ONLINE       0     0     0

scsi-35000c50016ebcdfb-part1ドライブはミラー-2にあり、ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1ミラー-2に追加するドライブです。

この問題を解決するために私ができることはありますか?

Ubuntu 16.04で実行中です。

root@x7550:~# zpool history stuffpool | tail -n50
History for 'stuffpool':
2016-03-27.01:56:12 zpool create stuffpool mirror ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1 ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1 -f
2016-03-27.01:57:41 zpool add stuffpool mirror /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1 /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA1009C03158BP-part1 -f
2016-03-27.01:59:25 zpool add stuffpool mirror /dev/disk/by-id/scsi-35000c50016ebcdfb-part1 /dev/disk/by-id/scsi-35000c50017675203-part1 -f
2016-03-27.02:12:38 zpool import -c /etc/zfs/zpool.cache -aN
2016-03-27.23:48:32 zfs create stuffpool/stuff
2016-03-27.23:54:47 zpool import -c /etc/zfs/zpool.cache -aN
2016-03-28.00:02:23 zfs create stuffpool/backup
2016-03-30.23:18:04 zpool scrub stuffpool
2016-04-03.01:06:06 zpool import -c /etc/zfs/zpool.cache -aN
2016-04-03.01:15:33 zfs create -p -o mountpoint=/var/lib/lxd/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9.zfs stuffpool/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9
2016-04-03.01:15:53 zfs set readonly=on stuffpool/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9
2016-04-03.01:15:54 zfs snapshot -r stuffpool/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9@readonly
2016-04-03.01:16:00 zfs clone -p -o mountpoint=/var/lib/lxd/containers/ux-1.zfs stuffpool/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9@readonly stuffpool/containers/ux-1
2016-04-08.01:31:47 zpool import -c /etc/zfs/zpool.cache -aN
2016-04-08.01:43:48 zpool import -c /etc/zfs/zpool.cache -aN
2016-04-19.00:00:30 zpool import -c /etc/zfs/zpool.cache -aN
2016-04-21.18:14:15 zfs create -p -o mountpoint=/var/lib/lxd/images/9b03bacc30bcfbe3378e8803daa48ca2d32baa99d111efada484876750e5cc20.zfs stuffpool/images/9b03bacc30bcfbe3378e8803daa48ca2d32baa99d111efada484876750e5cc20
2016-04-21.18:14:35 zfs set readonly=on stuffpool/images/9b03bacc30bcfbe3378e8803daa48ca2d32baa99d111efada484876750e5cc20
2016-04-21.18:14:36 zfs snapshot -r stuffpool/images/9b03bacc30bcfbe3378e8803daa48ca2d32baa99d111efada484876750e5cc20@readonly
2016-04-21.18:14:36 zfs set mountpoint=none stuffpool/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9
2016-04-21.18:14:41 zfs rename -p stuffpool/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9 stuffpool/deleted/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9
2016-04-24.22:54:03 zpool scrub stuffpool
2016-05-07.22:55:42 zpool import -c /etc/zfs/zpool.cache -aN
2016-05-09.15:20:27 zpool scrub stuffpool
2016-05-17.22:56:53 zfs create -p -o mountpoint=/var/lib/lxd/images/4f7a1fe6b71446eba6ee56f49698bd6592f193f731f1c0d9d51b1d199b9b75a5.zfs stuffpool/images/4f7a1fe6b71446eba6ee56f49698bd6592f193f731f1c0d9d51b1d199b9b75a5
2016-05-17.22:57:12 zfs set readonly=on stuffpool/images/4f7a1fe6b71446eba6ee56f49698bd6592f193f731f1c0d9d51b1d199b9b75a5
2016-05-17.22:57:13 zfs snapshot -r stuffpool/images/4f7a1fe6b71446eba6ee56f49698bd6592f193f731f1c0d9d51b1d199b9b75a5@readonly
2016-05-17.22:57:18 zfs destroy -r stuffpool/images/9b03bacc30bcfbe3378e8803daa48ca2d32baa99d111efada484876750e5cc20
2016-05-21.16:47:49 zpool import -c /etc/zfs/zpool.cache -aN
2016-06-09.22:59:47 zpool import -c /etc/zfs/zpool.cache -aN
2016-06-13.20:59:10 zpool import -c /etc/zfs/zpool.cache -aN
2016-06-13.20:59:34 zfs create -p -o mountpoint=/var/lib/lxd/images/49fc7d0d6f01a7639129308b73ad27f5fb7b9d3bb783d905393b6b9e9c4bf1c5.zfs stuffpool/images/49fc7d0d6f01a7639129308b73ad27f5fb7b9d3bb783d905393b6b9e9c4bf1c5
2016-06-13.20:59:54 zfs set readonly=on stuffpool/images/49fc7d0d6f01a7639129308b73ad27f5fb7b9d3bb783d905393b6b9e9c4bf1c5
2016-06-13.20:59:54 zfs snapshot -r stuffpool/images/49fc7d0d6f01a7639129308b73ad27f5fb7b9d3bb783d905393b6b9e9c4bf1c5@readonly
2016-06-13.21:00:00 zfs destroy -r stuffpool/images/4f7a1fe6b71446eba6ee56f49698bd6592f193f731f1c0d9d51b1d199b9b75a5
2016-06-18.02:18:55 zpool import -c /etc/zfs/zpool.cache -aN
2016-06-18.02:27:08 zpool offline stuffpool 1759097636360003165
2016-06-18.02:33:28 zpool detach stuffpool 1759097636360003165
2016-06-18.12:23:26 zpool export stuffpool
2016-06-18.12:24:38 zpool import stuffpool
2016-06-18.12:27:34 zpool add -f stuffpool ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1
2016-06-18.12:31:05 zpool export stuffpool
2016-06-18.13:19:17 zpool import stuffpool

すべてのATAドライブは1TB、SCSIドライブは146GB

ご利用案内です

root@x7550:~# zpool list
NAME        SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
stuffpool  2.85T   162G  2.69T         -     2%     5%  1.00x  ONLINE  -

これは私のプライベートサーバーなので、ダウンタイムは問題になりません。

答え1

さて、あなたは自分で問題を起こしましたが、解決できるようです。

最初の間違いは、zpool add代わりに新しいドライブを使用することですzpool attach(ミラーに追加のデバイスを接続する)。または、zpool replace古いデバイスがまだフルメタデータに存在することをお勧めします。デバイスを交換する正しい方法は次のとおりです。

# zpool replace stuffpool 1759097636360003165 ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1

あるいは、より良いことは、物理能力がある場合、zpool replace古いデバイスと新しいデバイスの両方が接続されていることです(これにより、プールは全体的に冗長になります)。

あなたの古いプールは基本的に修理できないほど損傷しています。この時点で、vdevを追加した後にプールからvdevを削除することはできません(vdev冗長レベルの不一致のために-f新しいディスクをプールに入れる必要があるかもしれません)、両方のディスクを非ディスクに変換するハードウェアはありません。冗長 vdev は双方向ミラーリングを開始します。

ただし、次のことができます。既存のリソースを使用して新しいプールを構築します。

どのような措置を講じる前に、すべての内容を読んで、各ステップの内容と理由を理解していることを確認してください。あなた本物もう問題を起こしたくありません。

まず、最新バージョンであることを確認してください。信頼できるデータをバックアップしてください。ストレージ容量が160GBを少し超えることを考慮すると、これは大きな問題ではありません。また、zpool scrubプールに保存されているすべてのデータにエラーがないことを確認することをお勧めします。 160GBの場合、前のクリーンアップで見たように、完了するのに時間がかかりません。

次に、ミラーからドライブを取り外し、ドライブを空にします。たとえば、ミラー0を分割してドライブの1つを使用するには、次のようにします。

# zpool detach stuffpool ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1

stuffpoolこれにより、3つの単一デバイスvdevと1つの双方向ミラーvdev(mirror-1)が残ります。次に、目的を変更できるように、ミラーから取り外したドライブのすべてのZFSラベルを消去します。

# zpool labelclear /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1

現在、ZFS はドライブを古いプールの一部として認識しません。必要かもしれませんが、-f盲目的zpool labelclearに追加しないでください。なぜ必要なのか理解していることを確認してください。

古いプールの名前を変更します(該当する名前を保持する場合は、そうでない場合は必要に応じて以下から調整します)。

# zpool export stuffpool
# zpool import stuffpool stuffpoolold

取得したドライブに新しいプールを作成します。

# zpool create -o ashift=12 -O checksum=sha256 -m none -f stuffpool /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1

検証にはSHA-256を使用することをお勧めしますが、-O checksum=sha256望ましくない場合はその部分を省略してください。-o ashift=12最小割り当て単位で4,096バイトブロックを使用するようにZFSに指示します。これは、より少ないストレージスペースで高度なフォーマットドライブでより良い動作します。

データを保存するためにプールのルートファイルシステムを使用しない場合、一部の障害条件は回復するのが簡単です。プールにプロキシルートファイルシステムを作成することをお勧めします。

# zfs create -o mountpoint=/mnt/stuffpoolnew stuffpool/data

これで、既存のプールのすべてを新しいプールに転送します。まず、以前のプールの現在の状態のスナップショットを作成します。

# zfs snapshot stuffpoolold@transfer -r

スナップショットが正常に作成されたことを確認してください。それから:

# zfs send -R stuffpoolold@transfer | zfs receive -uvF stuffpool/data

少し時間がかかります。完了するまで実行し、その間に行われた変更を取得します。

# zfs snapshot stuffpoolold@transfer2 -r
# zfs send -I stuffpoolold@transfer stuffpoolold@transfer2 -Rv | zfs receive stuffpool/data -uv

この時点で、プール内のデータはすべての意図と目的について同じでなければなりません。クローンジョブまたは同様のジョブを実行してプールに書き込む場合は、シングルzfs send -I ...ユーザーモードで2番目のスナップショットを作成して、プールにデータが追加されるリスクを減らすことをお勧めします。

既存のプールを置き換える新しいプールを設定します。

# zfs get mountpoint stuffpoolold
... this will give you a mountpoint directory ...
# zpool export stuffpoolold
# zfs set mountpoint=...mountpoint_directory_from_above... stuffpool/data
# zpool export stuffpool
# zpool import stuffpool

これで、単一のデバイスで構成された新しいzpoolが作成されました。スクラブしてデータが正常であることを確認します。

# zpool scrub stuffpool

完了し、エラーが見つからない場合は、既存のディスクを新しいプールに移行します。以前のプールをインポート可能な状態に保つには(上記のミラー0の2番目のドライブを使用したため)、前の残りのミラーのペアの2番目のドライブから始めます。

# zpool labelclear /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA1009C03158BP-part1
# zpool attach stuffpool /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1 /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA1009C03158BP-part1

zpool status stuffpool以下のように、単一の双方向ミラー化vdevプールがあることを確認してください。

root@x7550:~# zpool status stuffpool
  pool: stuffpool
 state: ONLINE
  scan: scrub repaired 0 in 0h6m with 0 errors on ...
config:

    NAME                                               STATE     READ WRITE CKSUM
    stuffpool                                          ONLINE       0     0     0
      mirror-0                                         ONLINE       0     0     0
        ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1  ONLINE       0     0     0
        ata-HGST_HTS541010A9E680_JA1009C03158BP-part1  ONLINE       0     0     0

ここで、元の方法で2つのミラーvdevを追加します。まず、デバイスにタグを付けて消去する必要があります。それ以外の場合、ZFSはデバイスがすでにエクスポートプールの一部であると文句を言います。繰り返しますが、必要かもしれませ-fんが、zpool labelclear絶対にしない盲目的-fに追加されましたzpool add。 (これをしなければならないなら、私がどこかでミスをしたのです。)

# zpool labelclear /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1
# zpool labelclear /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1
# zpool labelclear /dev/disk/by-id/scsi-35000c50016ebcdfb-part1
# zpool labelclear /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1
# zpool add stuffpool mirror /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1 /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1
# zpool add stuffpool mirror /dev/disk/by-id/scsi-35000c50016ebcdfb-part1 /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1

もう一度こすります(すべてがきれいできれいなプールが好きだから)。

# zpool scrub stuffpool

この時点で、プールは最初から望むように見えます。

root@x7550:~# zpool status
  pool: stuffpool
 state: ONLINE
  scan: scrub repaired 0 in 0h6m with 0 errors on ...
config:

    NAME                                               STATE     READ WRITE CKSUM
    stuffpool                                          ONLINE       0     0     0
      mirror-0                                         ONLINE       0     0     0
        ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1  ONLINE       0     0     0
        ata-HGST_HTS541010A9E680_JA1009C03158BP-part1  ONLINE       0     0     0
      mirror-1                                         ONLINE       0     0     0
        ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1  ONLINE       0     0     0
        ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1  ONLINE       0     0     0
      mirror-2                                         ONLINE       0     0     0
        scsi-35000c50016ebcdfb-part1                   ONLINE       0     0     0
        ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1  ONLINE       0     0     0

これでプールのバランスが取れません(ほとんどのデータはミラー-0にあり、書き換えられるまでそこに残ります。ZFSには同様のものがありませんが、それでもbtrfs rebalance賢明に使用して変更できますzfs send ... | zfs receive)。必要なレイアウトと冗長性が計画されています。始めるとき。

さまざまな段階から成る長いプロセスですが、ゆっくりして各段階で何をするかを注意深く考えれば、特に危険ではありません。

利点は、1つのドライブを満たすよりもプール内のデータがはるかに少ないことです。プールがほぼいっぱいになると、状況ははるかに複雑になります。

答え2

幸いなことに、プールには160 GBのデータしかありません。

約160 GBのバックアップデータを保存するのに十分な空き容量がある他のファイルシステムにディレクトリがある場合、または圧縮後( /var/backup/例では使用)以下の場合は、次のことができます。

まず、書いている可能性のあるすべてのジョブを終了します。に書いているstuffpool可能性のあるcronなどの作業がある場合。crondatdstuffpool

stuffpoolwithのフルバックアップを作成zfs send -Rし、ファイルに保存します。

zfs snapshot stuffpool@fullbackup
zfs send -R stuffpool@fullbackup | gzip > /var/backup/stuffpool.zfs.send.gz

しかし、圧縮されたバックアップはディスク容量を減らすだけでなく、バ​​ックアップと復元にも時間がかかりません。使用されるCPU時間gzipは、ほとんど常に読み取り/書き込みに示されている時間よりはるかに短いです。ディスク上のデータが減り、時間が節約されます。ディスクI / Oはボトルネックであり、通常は圧縮よりも時間がかかります。

次に、現在のプール削除を使用しますzfs destroy stuffpool

次のコマンドを使用してstuffpoolを再作成します。

zpool create -o ashift=12 -o checksum=sha256 -f \
  mirror \
    ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1 \
    ata-HGST_HTS541010A9E680_JA1009C03158BP-part1 \
  mirror \
    ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1 \
    ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1 \
  mirror \
    scsi-35000c50016ebcdfb-part1 \
    ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1

最後に、stuffpool次のコマンドを使用して復元します。

zcat /var/backup/stuffpool.zfs.send.gz | zfs receive stuffpool -v -d

必要に応じてスナップショットを削除してプールをクリーンアップできますfullbackup

zfs destroy stuffpool@fullbackup

あるいは、プールを再構築する必要がある場合は、特定の時点のスナップショットとして維持できます。

削除できます/var/backup/stuffpool.zfs.send.gz


既存のファイルシステムに十分な空きディスク容量がない場合は、既存のスタッフプールからミラーディスクの1つを取り外してフォーマットし、一時的にファイルを保存することができますstuffpool.zfs.send.gz

例えばata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1:

zpool detach stuffpool ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1

mkfs.ext4 /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1
mount /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1 /mnt

zfs snapshot stuffpool@fullbackup
zfs send -R stuffpool@fullbackup | gzip > /mnt/stuffpool.zfs.send.gz

zfs destroy stuffpool

zpool create -o ashift=12 -o checksum=sha256 -f \
    ata-HGST_HTS541010A9E680_JA1009C03158BP-part1 \
  mirror \
    ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1 \
    ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1 \
  mirror \
    scsi-35000c50016ebcdfb-part1 \
    ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1

zcat /mnt/stuffpool.zfs.send.gz | zfs receive stuffpool -v -d

umount /mnt

zpool attach -f stuffpool \
    ata-HGST_HTS541010A9E680_JA1009C03158BP-part1 \
    ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1 

関連情報