LinuxのZFS:スナップショットを削除できません。データセットが使用中です。

LinuxのZFS:スナップショットを削除できません。データセットが使用中です。

古いZFSスナップショットを削除しようとしていますが、データセットが使用中であるというエラーが表示されます。

[root@pool-01 ~]# zfs list -t snapshot -o name -S creation | grep ^pool/nfs/public/mydir | xargs -n 1 zfs destroy -vr
will destroy pool/nfs/public/mydir@autosnap_2019-02-24_03:13:17_hourly
will reclaim 408M
cannot destroy snapshot pool/nfs/public/mydir@autosnap_2019-02-24_03:13:17_hourly: dataset is busy
will destroy pool/nfs/public/mydir@autosnap_2019-02-24_02:13:17_hourly
will reclaim 409M
 cannot destroy snapshot pool/nfs/public/mydir@autosnap_2019-02-24_02:13:17_hourly: dataset is busy
will destroy pool/nfs/public/mydir@autosnap_2019-02-24_01:13:18_hourly will reclaim 394M

実行すると、lsofこれらのスナップショットにアクセスするプロセスがないことが表示されます。

[root@pool-01 ~]# lsof | grep pool/nfs/public/mydir

スナップショットのどれも保存されていないようです。

[root@pool-01 ~]# zfs holds pool/nfs/public/mydir@autosnap_2019-02-24_03:13:17_hourly
NAME                                                              TAG  TIMESTAMP

他に知っておくべきことはありますか?再ルートする以外にできることはありますか?

答え1

最初は、プールの再構築のためにエクスポートできるように、忙しいデータセットを停止するために、次の方法を使用しました。私のディレクトリはZFSデータセットを使用します/homeが、それを使用するプロセスを見つけることができません。データセットを使用してプロセスが見つからない場合、私の解決策は次のとおりです。あなたにも役立つでしょう。

  1. エクスポートするすべてのデータセットに設定します(エクスポートに問題があります)。

    zfs set canmount=noauto dataset1
    zfs set canmount=noauto dataset2
    ...
    # and so on where you substitute your datasets' names for dataset1, dataset2, ...
    

    設定により、canmount=noauto再起動時にデータセットがマウントされないようにする

  2. データセットを使用しない(またはルートアカウントを使用する)ユーザーアカウントを作成します。/homeこのアカウントにsudo権限を付与します。

  3. 再起動後、手順2で作成した上記のアカウントでログインしてください。手順1で変更したデータセットをインストールせずにアカウントを起動する必要があるため、デーモン/プログラムはこれらのデータセットを使用する機能を拒否します。

  4. これでデータセットが使用されていないため、そのデータセットおよび/またはそのスナップショットを削除できるようになりました。

  5. 確かに:

    zfs set canmount=on dataset1
    zfs set canmount=on dataset2
    ...
    

    起動時にインストールするデータセットに追加します。これが zfs デフォルトです。

答え2

これはZoLで予期しない動作であるようで、数日間ZFSボックスをそのままにして、ついに放棄してボックスを再起動しましたが、再起動後にスナップショットを削除できました。

答え3

何らかの理由で、私のスナップショットはとても忙しいことがわかりました。すべて出力に表示されます。

mount

それで無謀なことをして投票しました。

sudo umount /.zfs/snapshot/*

驚いたことに、悪いことはまったく起こらないようでした。それで私のsudo zfs destroy仕事は終わりました。

答え4

「zfs-way」を使用することをお勧めします。
これは問題を解決し、より正確で清潔であると見なされます。

#Use a variable so we need less hard-coding:
THE_DATA_SET=pool/nfs/public/mydir

#Make mounting impossible for a while (this also umounts it):
zfs canmount=off $THE_DATA_SET

#Find all snapshots and destroy them:
#("tail -n +2" is needed to remove the header in the "zfs list" output)
zfs list $THE_DATA_SET -t snapshot -o name | tail -n +2  | xargs -n 1 zfs destroy

#Make mounting possible again and do it:
zfs canmount=on $THE_DATA_SET
zfs mount $THE_DATA_SET

#And now we longer need the variable:
unset THE_DATA_SET

関連情報