Linux

Linux 上的 ZFS:無法銷毀快照,數據集正忙

  • September 14, 2021

我正在嘗試刪除一堆舊的 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

還有什麼我應該注意的嗎?除了reoot我還能做什麼?

這似乎是 ZoL 上的意外行為,我將 ZFS 盒子單獨放置了幾天,最後放棄並重新啟動了該盒子,並且我能夠在重新啟動後銷毀這些快照。

最初,我使用以下方法來停止繁忙的數據集,以使我能夠導出此數據集以進行池重建。我為我的 /home 目錄使用了 ZFS 數據集,但我找不到讓它忙碌的程序。當您無法使用數據集找到該過程時,這是我的解決方案也應該適用於您:

  1. 在您希望導出(但無法導出)的所有數據集上設置:

zfs set canmount=noauto dataset1

zfs set canmount=noauto dataset2 … 以此類推,您將數據集的名稱替換為 dataset1、dataset2 等…。

設置 canmount=noauto 確保數據集不會在重新啟動時掛載

  1. 創建一個不使用 /home 等數據集的使用者帳戶(或使用 root 帳戶)… 授予此帳戶 sudo 權限。
  2. 重新啟動並登錄到上述帳戶,即您剛剛在步驟 2 中創建的帳戶。該帳戶應該在不安裝您在步驟 1 中修改的數據集的情況下啟動,因此,拒絕這些數據集進入任何守護程序/程序。
  3. 由於數據集現在不忙,您現在可以銷毀它們和/或它們的快照。
  4. 務必:

zfs set canmount=on datasetx

(其中 datasetx 是您有問題的數據集)到您要在啟動時掛載的任何數據集。這是 zfs 的預設值。最好的,菲爾

引用自:https://unix.stackexchange.com/questions/502658