Почему содержимое каталога удаляется с помощью chattr +a?

На файловой системе ext4 у меня есть base DIR, который сам имеет три DIR a, b а также cи каждый каталог имеет различное содержимое внутри.

Я поставил chattr +a base а затем выполнено rm -r base, Потом я нашел a, b, c были еще там. Ницца. Потом я обнаружил, что все они стали пустыми. Я плакал.

Что случилось?

3 ответа

Решение

Я не понимаю, почему вы удивлены этим. Каталог - это просто файл. Запись в каталоге - это указатель на файл. Когда вы установите chattr +a на базе вы влияете только на базу, поэтому вы не можете удалить из нее записи. Каталоги a,b а также c файлы тоже, но на них не влияют атрибуты base кроме как вы не можете удалить их из base,

chattr используется для изменения атрибутов файла в файловой системе Linux.

Итак, когда вы используете chattr +a это влияет только на base сам каталог и подкаталоги и файлы прямо под ним.

Зачем?

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

В Linux и других Unix-подобных операционных системах все в системе рассматривается как файл, и, таким образом, каталог считается просто файлом особого типа, который содержит список имен файлов и соответствующие inode для каждого файла и каталог, который, кажется, содержит. Индод - это структура данных в файловой системе, в которой хранится вся информация о файле, кроме его имени и его фактических данных.

Поэтому может быть полезно думать о слове каталог как об аббревиатуре для термина файл каталога. Хотя, возможно, это технически избыточно, при обращении к содержимому каталога удобно и обычно использовать выражения, такие как файлы и каталоги; альтернатива - объекты файловой системы.

Ссылка: http://www.linfo.org/directory.html

Когда вы используете rm -r baseон запускается рекурсивно (опция -r) и пытается удалить все файлы и подкаталоги и их содержимое, но не может удалить базовый каталог, а также каталоги и файлы непосредственно под ним. Но он успешно удаляет файлы в подкаталогах.

Для a (добавить) атрибут, вы можете добавить каталоги и файлы в него без каких-либо проблем, но вы не можете удалить или переименовать их. Для меня это ведет себя как файл с его подкаталогами и файлами непосредственно под ним.

Чего вы хотели добиться, чтобы защитить каталог и все подкаталоги и файлы в нем, вы должны были использовать -R возможность установить или добавить атрибут Recursively для всех и каждого. Как описано здесь: http://linux.die.net/man/1/chattr

Атрибут "a" можно применять только к файлам (после применения они могут быть открыты только в режиме добавления для записи). Поведение применения этого атрибута к каталогам не определено.

Другие вопросы по тегам