|
Что такое атрибут файла? |
Статьи |
|
|
|
Что такое атрибут файла? Атрибут — это, в общем случае, некая метка (или флаг) которая сообщает операционной системе о существовании особых правил для работы с конкретным файлом. Лично для меня этой информации было недостаточно, так как она не отвечала на следующие вопросы:
- Где хранятся атрибуты?
- Как их увидеть или изменить?
- Какие бывают атрибуты?
- Как я могу применять их?
Хочу сразу отметить, что в подавляющем большинстве случаев вам вообще не придется с ними работать, но знать о том, что они есть нужно.
Где хранятся атрибуты файлов?
В процессе поиска ответа для себя мне пришлось разобраться с путаницей понятий, а так же с недостатком подробно разобранной информации на русском языке. От обоих этих недостатков я попытаюсь избавить свою заметку. Итак, место хранения атрибутов в частном случае зависит от реализации конкретной файловой системы. Я буду рассматривать в качестве примера файловую систему Ext4 в силу ее популярности в ОС Linux.
Как и во многих других файловых системах семейства UNIX\*Nix в Ext4 есть понятие inode (айнод). Изначальное название — index node — индексная точка/вершина (мне кажется, что это название лучше отображает суть). Inode — это специальная структура данных в файловой системе, которая хранит метаинформацию об объектах файловой системы — стандартных файлах, каталогах и т.д. Айноды хранятся в таблице айнодов, для которой файловая система выделяет необходимое количество блоков. (детальнее — смотри расположение блоков ext4). Под метаинформацией подразумевают отметки времени доступа, флаги, расширенные атрибуты, карты блоков данных и др. В официальной документации по ext4 те атрибуты, о которых идет речь в этой заметке, называются флагами (flags). Не путайте с расширенными атрибутами (extended attributes) — это несколько иная сущность, о которой я попытаюсь рассказать в следующей записи(это как раз та путаница). Так вот — атрибуты файла хранятся внутри айнода.
Чтоб более детально разобраться, что такое и из чего состоит айнод, какую информацию он хранит — настойчиво рекомендую прочитать Ext4 Disc Layout -официальная wiki Ext4 (для ленивых прямая ссылка на таблицу структуры inode )
Какие бывают атрибуты (флаги)?
Если обратится к man chattr то можно увидеть почти полный список атрибутов (флагов). Ниже я приведу список наиболее часто используемых атрибутов (флагов) и постараюсь вкратце описать зачем они могут понадобиться.
- A — не обновлять время доступа к объекту. Теоретически установка этого атрибута должна повысить производительность файловой системы при работе с файлом (если не используются опции монтирования noatime, nodiaratime )
- а — указывает, что в файл можно добавлять информацию, но нельзя удалять. Может быть установлен только суперпользователем.
- d — указывает на то, что не нужно делать резервные копии файла. Файл будет проигнорирован командой dump
- i — указывает на то, что файл нельзя удалять и модифицировать, так же нельзя создать ссылку на файл. Может быть установлен только суперпользователем
- s — указывает, что при удалении файла место где был размещен файл будет перезаписано нулями. Для невозможности восстановления после удаления
- u — указывает на то, что при удалении файла его нужно куда-то сохранить. Наоборот, чтоб гарантировать возможность восстановления после удаления.
- c — указывает на то, что файл сжат. Перед записью в этот файл ядро сжимает данные, а чтение соответственно возвращает разархивированные данные. Об этом флаге чуть подробнее читай ниже
На самом же деле их даже больше, чем описано в руководстве утилиты chattr. В таблице структуры inode в строке i_flags можно увидеть их все. Да, и не все флаги работают в Ext4, установить их можно, но эффекта не будет (какие именно работают, а какие нет — смотри по той же ссылке выше).
Как увидеть и изменить атрибуты (флаги) файла?
Приступим к практике. Допустим, у нас есть только что созданный файл, скажем attrtest. Чтоб просмотреть его атрибуты необходимо использовать утилиту lsattr (скорее всего она уже у вас есть, так как она входит в набор утилит e2fsprogs, который входит в набор базовой поставки практически всех дистрибутивов)
|
$ lsattr ./attrtest
-------------e-- ./attrtest
|
Данный вывод говорит о том, что у файла нет атрибутов, кроме одного. Атрибут «e» говорит о том, что файл использует экстенты для адресации блоков на диске. Этот атрибут нельзя изменить/убрать. Экстенты это механизм, которым файловая система, с одной стороны, упрощает адресацию блоков, которые занимает файл, и уменьшает фрагментацию файла с другой (подробнее можно почитать тут в пункте 4).
Чтоб установить атрибут (флаг) нужно вызвать утилиту chattr. Добавим флаг «A» к файлу, и снова просмотрим его атрибуты.
|
$ chattr +A ./attrtest
$ lsattr ./attrtest
-------A-----e-- ./attrtest
|
Атрибут «i» пользователь самостоятельно установить не сможет, но сможет его увидеть, а удалить файл с таким флагом не сможет даже суперпользователь, если не снимет его предварительно.
И так, смотреть и менять атрибуты можно при помощи lsattr и chattr.
Сжатие данных
Об атрибуте «c» хочется сказать несколько слов отдельно. Теоретически кроме экономии дискового пространства выгодой от использования этого флага может быть и ускорение дисковых операций(зависит от алгоритма сжатия). Данный атрибут, к сожалению, не работает в ext4, так как данная ФС не поддерживает механизм сжатия. Но зато работает в новой файловой системе BTRFS, где на данный момент реализованы целых два алгоритма сжатия — LZO, и ZLIB. Как раз с алгоритмом LZO разработчикам удалось добиться увеличения производительности дисковых операций за счет того, что файлы стали занимать меньше места, соответственно времени на их запись и считывание нужно меньше, а операции сжатия и распаковки занимают совсем немного процессорного времени. (Если интересно — первоисточник читайте тут). К сожалению, от выборочного использования этого флага эффекта будет немного — так же как и с атрибутом «A» — для достижения максимального эффекта лучше будет использовать опцию монтирования, чтоб поведение опции было глобальным для всех файлов.
Заключение
Напоследок хочется еще раз акцентировать внимание на то, что атрибуты, то есть флаги, о которых шла речь в данной заметке не являются расширенными атрибутами файлов (extended attributes). Так же не стоит привязывать атрибуты только к файловой системе ext4 — атрибуты у файлов поддерживаются во многих файловых системах, хоть и наборы поддерживаемых атрибутов разнятся. Даже в FAT16 были атрибуты файлов.
Так же для тех, кому стало интересно про айноды и экстенты — рекомендую почитать отличную статью, где автор открывает айноду в HEX-редакторе и на примере различных манипуляций с файлом показывает поведение экстентов.
|
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем. |
|
Автор: hellevil | 2-06-2017, 13:32 | Просмотров: 3 149 |
|
|
|
|