오래된 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
하지만 이를 사용하게 만드는 프로세스를 찾을 수 없습니다. 데이터 세트를 사용하여 프로세스를 찾을 수 없는 경우 제 솔루션은 다음과 같습니다. 여러분에게도 도움이 될 것입니다.
내보내려는 모든 데이터세트에 대해 설정합니다(내보내는 데 문제가 있음).
zfs set canmount=noauto dataset1 zfs set canmount=noauto dataset2 ... # and so on where you substitute your datasets' names for dataset1, dataset2, ...
설정을 통해
canmount=noauto
재부팅 시 데이터세트가 마운트되지 않도록 보장데이터세트를 사용하지 않는(또는 루트 계정을 사용하는) 사용자 계정을 생성합니다.
/home
이 계정에 sudo 권한을 부여합니다.재부팅 후 2단계에서 생성한 위의 계정으로 로그인하세요. 1단계에서 수정한 데이터 세트를 설치하지 않고 계정을 시작해야 하므로 데몬/프로그램이 이러한 데이터 세트를 사용하는 기능이 거부됩니다.
이제 데이터세트가 사용 중이 아니므로 이제 해당 데이터세트 및/또는 해당 스냅샷을 삭제할 수 있습니다.
확실히하다:
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