Помимо прав доступа каждый из файлов стандартной файловой системы Linux имеет набор атрибутов, регламентирующих особенности работы с ним. Атрибуты поддерживаются такими файловыми системами Linux, как Ext4, Btrfs и XFS. Команда lsattr позволяет вызывать соответствующую утилиту для их вывода.
Базовый синтаксис команды выглядит следующим образом:
# lsattr [параметры] файлы
Наиболее важными параметрами являются параметр -R, позволяющий рекурсивно выводить атрибуты файлов в дереве директорий, параметр -a, позволяющий выводить информацию и об атрибутах скрытых файлов и параметр -d, позволяющий выводить информацию об атрибутах директорий вместо обработки их содержимого. В том случае, если утилите не передаются имена файлов, она выводит информацию об атрибутах файлов из текущей директории.
Наиболее важные атрибуты приведены в таблице ниже.
Атрибут | Значение |
A | Запрещает обновлять метку времени доступа к файлу |
a | Автоматически устанавливает режим дополнения при открытии файла для записи |
С | Запрещает использовать механизм копирования при записи (Copy-on-Write) при модификации содержимого файла |
D | При применении к директории активирует режим синхронной записи изменений содержащихся в ней файлов |
d | Запрещает утилите dump создавать резервную копию файла |
E | Указывает на ошибку сжатия содержимого файла ядром ОС (не может быть установлен пользователем) |
e | Указывает на использование экстентов для ссылок на соответствующие файлу дисковые блоки (не может быть установлен пользователем) |
h | Указывает на то, что размер файла исчисляется в количестве блоков ФС, а не ее секторов, то есть, размер файла превышал или превышает в данный момент 2 ТБ (не может быть установлен пользователем) |
I | Указывает на то, что содержимое директории было проиндексировано утилитой htree |
i | Запрещает всем пользователям, в том числе супрепользователю, модифицировать файл, а именно, записывать в него данные, удалять переименовывать или создавать ссылки на него |
j | Принудительно активирует режим журналирования ФС при записи данных в файл |
s | Активирует механизм надежного удаления, автоматически записывающий нулевые блоки на диск после удаления файла пользователем |
S | Активирует режим синхронной записи изменений содержимого файла на диск |
T | При применении к директории указывает на то, что ее поддиректории не связаны и могут размещаться в отдельных группах блоков |
t | Запрещает оптимизации использования блоков файла |
u | Запрещает удаление содержимого файла при его удалении из ФС с целью получения возможности его последующего восстановления |
X | Указывает на возможность прямого доступа к содержимому сжатого ядром ОС файла (не может быть установлен пользователем) |
Z | Указывает на неактуальность сжатого ядром ОС файла (не может быть установлен пользователем) |
Очевидно, что большинство атрибутов может быть изменено. Для этой цели должна использоваться утилита chattr.
Создадим тестовый файл test.txt для того, чтобы исследовать механизм установки и вывода атрибутов на нем:
$ echo "test" > test.txt
Для того, чтобы вывести список атрибутов файла, следует использовать утилиту lsattr без каких-либо параметров:
$ lsattr test.txt
---------------------- test.txt
Очевидно, что для файла не установлено каких-либо атрибутов. В противном случае было бы выведено одно или несколько их буквенных обозначений.
Для установки атрибутов файлов используется утилита chattr с правами суперпользователя. Например, для того, чтобы сделать файл неудаляемым, следует использовать атрибут i:
# chattr +i test.txt
$ lsattr test.txt
----i----------------- test.txt
Атрибут успешно установлен — об этом свидетельствует обозначение i. По аналогии для файлов устанавливаются и другие атрибуты. Например, для отказа от обновления метки времени доступа к файлу следует использовать обозначение A:
# chattr +A test.txt
$ lsattr test.txt
----i--A-------------- test.txt
Атрибут также успешно установлен. Очевидно, что для вывода обозначения каждого из поддерживаемых атрибутов имеется своя позиция. Ну и синхронная запись активируется аналогично — с помощью атрибута с обозначением S:
# chattr +S test.txt
$ lsattr test.txt
--S-i--A-------------- test.txt
Все также прошло успешно. Если атрибут не может быть установлен, утилита выведет соответствующее сообщение об ошибке:
# chattr +s test.txt
chattr: Неподдерживаемая операция while setting flags on test.txt
$ lsattr test.txt
--S-i--A-------------- test.txt
Как видите, ничего не изменилось. По-видимому, ФС XFS не поддерживает механизм надежного удаления файлов.
Чтобы убедиться в том, что атрибуты оказывают влияние на процесс работы с файлами, попробуем удалить тестовый файл:
# rm test.txt
rm: невозможно удалить 'test.txt': Операция не позволена
Очевидно, что благодаря атрибуту с обозначением i даже суперпользователь не может удалить файл. Если же атрибут будет убран, его без проблем сможет удалить обычный пользователь:
# chattr -i test.txt
$ rm test.txt
Все прошло вполне успешно. Хотя механизм атрибутов и достаточно редко используется обычными пользователями, о нем безусловно нужно знать.
В директории находится скрытый файл .test, но по умолчанию lsattr не выводит информации о нем:
$ lsattr
--S------------------- ./testdir
--S------------------- ./test.txt
Для того, чтобы вывести атрибуты скрытых файлов, следует использовать параметр -a:
$ lsattr -a
---------------------- ./.
---------------------- ./..
--S------------------- ./.test
--S------------------- ./testdir
--S------------------- ./test.txt
Здесь следует учесть то, что утилита будет выводить и информацию о текущей (./.) и родительской (./..) директориях.
В текущей директории находится директория с testdir вложенным файлом inside.txt. По умолчанию утилита выведет информацию об атрибутах этой директории, но не вложенного файла:
$ lsattr attr
--S------------------- attr/testdir
--S------------------- attr/test.txt
Для того, чтобы утилита выводила атрибуты вложенных в директории файлов и директорий, следует использовать параметр -R:
$ lsattr -R attr
--S------------------- attr/testdir
attr/testdir:
--S------------------- attr/testdir/inside.txt
--S------------------- attr/test.txt
В таком режиме утилита выводит всю необходимую информацию.