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