В файловой системе 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» может применяться только к файлам (после применения они могут быть открыты только в режиме добавления для записи). Поведение применения этого атрибута к каталогам не определено.