ZFS на Linux: невозможно удалить снимок, набор данных занят

Вопрос или проблема

Я пытаюсь удалить множество старых снимков 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

Есть ли что-то еще, на что мне следует обратить внимание? Есть ли что-то еще, что я могу сделать, кроме перезагрузки?

Это, похоже, было непреднамеренным поведением в ZoL, я оставлял ZFS-сервер в покое на несколько дней, а затем в конце концов сдался и перезагрузил его, и после перезагрузки я смог уничтожить эти снимки.

Я заметил, что мои снимки действительно были заняты по какой-то причине – они все показывались в выводе

mount

Поэтому я сделал что-то безрассудное и просто выполнил

sudo umount /.zfs/snapshot/*

Вопреки всем ожиданиям, ничего плохого, похоже, не случилось. И затем моя sudo zfs destroy сработала.

Изначально я использовал следующий метод, чтобы остановить занятый набор данных, чтобы позволить мне экспортировать этот набор данных для перестройки пула. Я использую набор данных ZFS для своего /home каталога, и мне не удалось найти процесс, который держал его занятым. Вот мое решение, которое должно сработать и для вас, когда вы не можете найти процесс, использующий ваш набор данных:

  1. На всех наборах данных, которые вы хотите экспортировать (но имели проблемы с экспортом), установите:

    zfs set canmount=noauto dataset1
    zfs set canmount=noauto dataset2
    ...
    # и так далее, где вы подставляете имена ваших наборов данных вместо dataset1, dataset2, ...
    

    Установка canmount=noauto гарантирует, что набор данных не будет смонтирован при перезагрузке

  2. Создайте учетную запись пользователя (или используйте учетную запись root), которая не использует набор данных для /home и т. д. Дайте этой учетной записи права sudo.

  3. Перезагрузите и войдите в вышеупомянутую учетную запись, т. е. в учетную запись, которую вы только что создали на шаге 2. Эта учетная запись должна загрузиться без монтирования наборов данных, которые вы изменили на шаге 1, и, следовательно, запретит этим наборам данных доступ к любым демонам/программам.

  4. Поскольку наборы данных теперь не заняты, вы можете уничтожить их и/или их снимки.

  5. Не забудьте:

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

    для любых наборов данных, которые вы хотите смонтировать при загрузке. Это значение по умолчанию для zfs.

Я бы предложил “zfs-метод”,
Это решило мою проблему, и я предполагаю, что это считается более корректным/чистым:

#Используем переменную, чтобы избежать жесткой настройки:
THE_DATA_SET=pool/nfs/public/mydir

#Сделаем монтирование невозможным на некоторое время (это также умонтирует его):
zfs canmount=off $THE_DATA_SET

#Находим все снимки и уничтожаем их:
#("tail -n +2" нужен, чтобы удалить заголовок в выводе "zfs list")
zfs list $THE_DATA_SET -t snapshot -o name | tail -n +2  | xargs -n 1 zfs destroy

#Сделаем монтирование снова возможным и делаем это:
zfs canmount=on $THE_DATA_SET
zfs mount $THE_DATA_SET

#И теперь нам больше не нужна переменная:
unset THE_DATA_SET

У меня был еще один крайний случай, который стоит поделиться.

$ sudo zfs destroy pool/volume-disk-1
cannot destroy 'pool/volume-disk-1': dataset is busy

Ничего не было смонтировано, также никаких снимков, которые удерживали zfs том:

$ zfs list -t snapshot
no datasets available

Даже перезагрузка системы не помогла!

Тем не менее, оказалось, что zfs том содержал физический раздел mdraid, поэтому даже после перезагрузки он был немедленно снова в использовании из-за:

$ cat /proc/mdstat 
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4] [raid10] 
md127 : active (auto-read-only) raid1 zd0p3[0]
      324819968 blocks super 1.2 [1/1] [U]

Поэтому после выполнения остановки mdraid:

$ sudo mdadm -S /dev/md127
mdadm: stopped /dev/md127
$ sudo zfs destroy pool/volume-disk-1
$

Zfs том был наконец уничтожен.

Я наткнулся на этот вопрос как на первый результат поиска, когда искал ту же проблему.

Оказалось, что мой снимок был удержан с помощью zfs hold. Пришлось выполнить

zfs holds <snapshot>

чтобы получить имя тега удержания, а затем

zfs release <tag> <snapshot>

Те же симптомы, другая основная проблема. Может быть, это поможет кому-то.

Ответ или решение

ЗИФС на Линукс: Проблема с удалением снимка – "dataset is busy"

При попытке удалить старые снимки ZFS выходной информации указывает на то, что набор данных занят. Это сообщение может свидетельствовать о различных факторах, которые необходимо учитывать, чтобы решить проблему.

Причины проблемы

  1. Снимки заняты: Заявление о том, что конкретный снимок занят, может быть связано с тем, что он все еще используется какими-либо процессами или монтирован в файловую систему.

  2. Монтирование: Если ваш снимок или набор данных монтирован, это может вызвать "dataset is busy". Чтобы убедиться, что никаких монтирований не существует, выполните команду:

    mount

    Если вы увидите монтирование для вашего снимка, это может быть причиной вашей проблемы.

  3. Блокировки (Holds): Иногда на снимки устанавливаются блокировки, которые препятствуют их уничтожению. Чтобы проверить наличие блокировок, выполните команду:

    zfs holds <имя_снимка>

    Отсутствие высвечивает пустой вывод, что указывает на отсутствие блокировок.

  4. Системные процессы: В некоторых случаях системные процессы или службы могут взаимодействовать с набором данных. Вы можете использовать команду lsof, чтобы попытаться идентифицировать такие процессы. Например:

    lsof | grep <название_набора_данных>

    Если вывод пуст, это предназначает отсутствие активных процессов, использующих набор данных.

Решение проблемы

Если вы столкнулись с затруднениями при уничтожении снимков из-за того, что набор данных занят, вот несколько шагов, которые могут помочь:

  1. Уменьшите до минимума возможности монтирования:
    Используйте настраиваемые параметры монтирования для вашего набора данных:

    zfs set canmount=noauto <имя_набора_данных>

    Это предотвратит автоматическое монтирование по умолчанию и даст возможность удалить нужные вам снимки.

  2. Идентификация и остановка процессов: Вы можете попробовать перезагрузить систему, чтобы освободить любые постоянные блокировки. Если перезагрузка невозможна, вы также можете вручную остановить все службы, которые могут использовать ваш набор данных.

  3. Целостное размонтирование: Если у вас есть возможность, попробуйте отдельное размонтирование всех снимков:

    sudo umount /path/to/mount/point

    Пожалуйста, убедитесь, что это не повлияет на работу вашего системы.

  4. Уничтожение снимков: После выполнения вышеупомянутых действий вы должны иметь возможность уничтожить снимки:

    zfs destroy <имя_снимка>
  5. Обеспечение порядка: После устранения проблемы не забудьте вернуть параметры монтирования обратно:

    zfs set canmount=on <имя_набора_данных>

Варианты работы с конфликтами

Иногда могут возникнуть более сложные ситуации. Например, в некоторых случаях вы можете столкнуться с RAID-массивом, использующим ваш ZFS-объем (как в случае с mdadm). Если после перезагрузки проблема не исчезает, попробуйте остановить RAID-систему:

sudo mdadm -S /dev/<имя_md>

Это освободит задание и позволит уничтожить ZFS-объем.

Заключение

Теперь вы ознакомлены с основными причинами возникновения ошибки "dataset is busy" при удалении снимков ZFS на Linux. Применяя предложенные меры, вы со значительной вероятностью сможете устранить проблему без необходимости перезагрузки системы. Несмотря на то, что перезагрузка иногда помогает, разные методы управления устройствами и их состоянием могут значительно упростить вашу работу с файловыми системами ZFS. Если у вас есть дополнительные вопросы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...