Назад | Перейти на главную страницу

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

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

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

Что произошло?

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

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

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

Зачем?

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

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

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

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

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

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

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

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