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 デフォルトです。

おすすめ記事