Команда lsattr

Помимо прав доступа каждый из файлов стандартной файловой системы 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

В таком режиме утилита выводит всю необходимую информацию.