Странная ошибка "Каталог непуст" для команды rm -rf ... при %clean в rpmbuild на SLES15.

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

После обновления с SLES12 SP5 до SLES15 SP6 я заметил, что этап %clean некоторых файлов спецификаций RPM завершается с ошибкой по какой-то странной причине при использовании rpmbuild -ba.
RPM (SRPM, RPMs) записываются правильно, но при очистке я вижу такие ошибки:

Выполнение(%clean): /bin/sh -e /var/tmp/rpm-tmp.IXMkuS
+ umask 022
+ cd /home/windl/rpmbuild/BUILD
+ cd iredir-0.5.1n
+ for d in "/home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64"
+ '[' -n /home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64 -a /home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64 '!="https://unix.stackexchange.com/"]'
+ ls -l /home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64
total 12
drwxr-xr-x 6 windl dvmed 4096 Mar 10 10:40 etc
drwxr-xr-x 6 windl dvmed 4096 Mar 10 10:40 usr
drwxr-xr-x 5 windl dvmed 4096 Mar 10 10:40 var
+ rm -rf /home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64
rm: невозможно удалить '/home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64/usr/lib/ocf/resource.d/xola': Каталог не пуст
rm: невозможно удалить '/home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64/usr/lib/iredir': Каталог не пуст
rm: невозможно удалить '/home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64/etc/ocf/xola/isredir': Каталог не пуст
rm: невозможно удалить '/home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64/etc/ocf/xola/idredir': Каталог не пуст
rm: невозможно удалить '/home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64/etc/init.d': Каталог не пуст
ошибка: Плохой код завершения от /var/tmp/rpm-tmp.IXMkuS (%clean)

Это очень странно, так как rm -rf должен удалять непустые каталоги.

Я добавил команду ls после того, как столкнулся с проблемой:

%clean
# вызывается для %install
for d in "%{buildroot}"
do
    [ -n "$d" -a "$d" != / ] && ls -l "$d" && rm -rf "$d"
done

Что могло это вызвать?
Мне кажется, это какой-то асинхронный эффект. ~ находится на NFS (также хостится SLES15 (но SP5) (nfs-kernel-server-2.1.1-150500.22.3.1.x86_64, ядро 5.14.21-150500.55.83-default)).

/usr/bin/rm из coreutils-8.32-150400.9.6.1.x86_64.

Это может случиться, думаю, если после возврата getdents64 что-то создается в этом каталоге.

Чтобы избежать этого, вы можете сделать следующее:

  1. сделать каталог недоступным для пользователей, не являющихся root (думаю, вы root)
    chown root "$dir" ; chmod 700 "$dir"
  2. переименовать каталог в случайное имя
  3. проверить, используется ли каталог в качестве текущей рабочей директории какими-либо процессами (и если да, то завершить их)
  4. затем выполнить rm -rf

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

Теория

Сообщение об ошибке "Directory not empty" при использовании команды rm -rf указывает на попытку удаления не пустого каталога, что очень странно, поскольку использование флага -r (рекурсивное удаление) и -f (принудительное удаление) должно удалять не только файлы, но и каталоги независимо от того, пусты они или нет. Такая проблема часто связана с асинхронными событиями на файловой системе или с особенностями работы сетевых файловых систем, таких как NFS (Network File System).

Возможно, есть несколько потенциальных причин такого поведения:

  1. Асинхронный доступ к файловой системе: Одним из вариантов может быть ситуация, когда файлы или процессы в данной директории все еще заняты, возможно, из-за процессов, которые используют эти файлы в качестве своих рабочих директорий, или по другой причине, из-за чего удаление блокируется.

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

  3. Особенности функций файловой системы NFS: Файловые системы, такие как NFS, которые используются в сетевых средах, могут иметь задержки в синхронизации между клиентом и сервером, что может быть источником проблемы удаления.

Пример

В описании проблемы указывается на такие файлы, как /home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64, которые не могут быть удалены, потому что директории не пусты. Это может свидетельствовать как о наличии скрытых файлов, так и о том, что процессы все еще используют эти файлы.

Кроме того, ваш домашний каталог находится на NFS, что увеличивает вероятность ошибок, связанных с задержками и состоянием блокировок на сетевой файловой системе.

Применение

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

  1. Проверка процессов: Используйте команды lsof или fuser для идентификации процессов, которые могут использовать проблемные файлы:

    lsof +D /home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64

    Убедитесь, что никакие процессы не блокируют файл, и при необходимости завершите их.

  2. Изменение прав доступа и имени каталога: Перед удалением измените права доступа, сделайте каталог доступным только для root, а затем переименуйте его, чтобы избежать каких-либо гонок состояний:

    chown root:root /home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64
    chmod 700 /home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64
    mv /home/windl/rpmbuild/BUILDROOT/iredir-0.5.1n-0.0.x86_64 /home/windl/rpmbuild/BUILDROOT/temp_dir
  3. Рекурсивное удаление и проверка отклика NFS: После выполнения вышеуказанных действий используйте команду удаления и наблюдайте за системой на предмет дополнительных ошибок:

    rm -rf /home/windl/rpmbuild/BUILDROOT/temp_dir

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

  4. Использование журналов: Для дополнительной диагностики включите подробный журнал для NFS на клиенте и сервере, чтобы отследить произошедшие события взаимодействия и выяснить причину.

Выполнение этих шагов поможет лучше разобраться в проблеме и, вероятно, устранить её, обеспечивая успешное удаление файлов через rm -rf. Если ни один из предложенных вариантов не решает проблему, возможно, стоит провести анализ на уровне ОС или использовать более современные версии ядра или инструментов для работы с файловыми системами, чтобы исключить баги или недокументированные особенности.

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

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