Сообщить об ошибке.

Расширенные атрибуты файлов xattrs в Linux

Содержание:

Что такое xattrs (Extended Attributes)?

Extended Attributes (xattrs) - это расширенные атрибуты файлов, позволяющие хранить дополнительные метаданные в виде пар "ключ = значение" прямо в файловой системе.

В отличие от стандартных атрибутов (права, владелец, размер, время изменения), xattrs позволяют:

  • Хранить произвольные данные (например, автор=Алиса, проект=веб)
  • Поддерживать безопасность (SELinux, ACL, целостность)
  • Реализовывать расширенный контроль доступа (через ACL)
  • Добавлять метки для бэкапов, аудита, шифрования и т.д.

Проще говоря: xattrs - это "стикеры", которые можно наклеить на файл, чтобы хранить любую полезную информацию.

Дополнительно смотрите материал "Управление расширенными атрибутами из Python, модуль os"

Зачем нужны xattrs?

xattrs используются для:

  • Хранения ACL (Access Control Lists) - через system.posix_acl_access
  • Поддержки SELinux, AppArmor, SMACK - через security.selinux
  • Управления возможностями (capabilities) - security.capability
  • Шифрования - например, eCryptfs использует xattrs для ключей
  • Проверки целостности - IMA/EVM (Integrity Measurement Architecture)
  • Пользовательских меток - например, user.backup=yes, user.owner=dev-team
  • Системных флагов - например, запрет удаления (chattr +i - косвенно связан)

Ограничения xattrs

ОграничениеПодробности
Размер значенияОбычно до 64 КБ на один атрибут
Общее количествоОграничено размером inode и ФС
Имена атрибутовТолько ASCII, без пробелов, с префиксом пространства
Файловые системыРаботают на ext4, XFS, Btrfs, но не на FAT/NTFS/NFS без настройки
NFSПо умолчанию не передаёт xattrs - нужно mount -o user_xattr,acl
Резервное копированиеtar не сохраняет xattrs без флага --xattrs

Проверка поддержки xattrs и ACL

1. Узнай тип файловой системы:

df -T /home

Убедись, что тип - ext4, xfs, btrfs и т.п.

2. Проверь опции монтирования:

mount | grep " $(df / | tail -1 | awk '{print $1}') "

Ищи в выводе:

  • acl - включена поддержка ACL
  • user_xattr - включены пользовательские xattrs (для ext*)

На XFS и Btrfs user_xattr включён по умолчанию.
На ext4 - acl и user_xattr нужно указать явно.

Включение поддержки xattrs и ACL

1. Открой /etc/fstab:

sudo nano /etc/fstab

2. Найди строку с нужной ФС:

/dev/sda1  /  ext4  defaults  0  1

3. Добавь опции acl,user_xattr:

/dev/sda1  /  ext4  defaults,acl,user_xattr  0  1

Для XFS/Btrfs: acl достаточно.

4. Перемонтируй (без перезагрузки):

sudo mount -o remount,acl,user_xattr /

(Замени / на нужную точку монтирования, например /home)

Установка утилит

Ubuntu/Debian:

sudo apt update && sudo apt install acl attr -y

CentOS/RHEL/Fedora:

sudo yum install acl attr -y
# или
sudo dnf install acl attr -y
  • acl - предоставляет getfacl, setfacl
  • attr - предоставляет getfattr, setfattr

Проверка работы

Проверка ACL:

touch /tmp/test.txt
setfacl -m u:nobody:r /tmp/test.txt
getfacl /tmp/test.txt

Должно появиться: user:nobody:r--

Проверка xattrs:

setfattr -n user.description -v "Тестовый файл" /tmp/test.txt
getfattr -d /tmp/test.txt

Должно быть:

user.description="Тестовый файл"

Если ошибка Operation not supported - xattrs или ACL не включены.

Пространства имён xattrs

Xattrs разделены на пространства имён - они определяют, кто может читать/писать:

ПространствоНазначениеДоступ
user.Пользовательские данныеЛюбой пользователь (с правами на файл)
security.Безопасность (SELinux, EVM)Только ядро или root
system.Системные атрибуты (ACL)Только ядро
trusted.Доверенные данныеТолько root

Примеры:

user.comment="Скрипт деплоя"
security.selinux="unconfined_u:object_r:admin_home_t:s0"
system.posix_acl_access=...        # ← ACL!
trusted.backup_hash="a1b2c3d4"

Примеры использования xattrs

1. Добавить автора файла:

setfattr -n user.author -v "Alice" script.sh

2. Пометить файл как важный:

setfattr -n user.priority -v "high" /etc/config.json

3. Удалить атрибут:

setfattr -x user.author script.sh

4. Просмотр всех xattrs:

getfattr -d script.sh

5. Просмотр всех, включая системные:

sudo getfattr -d -m - script.sh

Практический пример: Автоматизация бэкапа по метке

Допустим, ты хочешь помечать файлы, которые обязательно нужно бэкапить.

# Помечаем файл
setfattr -n user.backup -v "yes" /home/alice/work/report.docx

# Позже - находим все такие файлы
find /home -type f -exec getfattr -n user.backup {} \; 2>/dev/null | grep -B1 "user.backup"

Можно интегрировать в скрипт бэкапа:

#!/bin/bash
find /home -type f -exec getfattr -n user.backup {} \; 2>/dev/null | grep -q "user.backup" && \
tar --xattrs -czf backup_$(date +%F).tar.gz $(find /home -type f -exec getfattr -n user.backup {} \; 2>/dev/null | grep -B1 "user.backup" | grep file: | cut -d: -f2)

Полезные команды - шпаргалка

ЗадачаКоманда
Установить xattrsetfattr -n user.ключ -v "значение" файл
Удалить xattrsetfattr -x user.ключ файл
Просмотр xattrsgetfattr файл
Все xattrsgetfattr -d файл
Все, включая системныеsudo getfattr -d -m - файл
Только user.*getfattr -n user. файл
Сохранить все xattrsgetfattr -d -R /dir > xattrs_backup.txt
Восстановитьsetfattr --restore=xattrs_backup.txt
С tar (с xattrs)tar --xattrs -cf backup.tar /dir
С tar (восстановить)tar --xattrs -xf backup.tar

Советы и лучшие практики

  • Используй user.*- для своих меток - безопасно и понятно.
  • Не трогай security.* и system.* без понимания.
  • Всегда используй --xattrs в tar, если нужно сохранить ACL или метки.
  • Документируй формат своих xattrs (например, user.status, user.owner).
  • Тестируй на временных файлах перед применением в продакшене.
  • ACL - это часть xattrs, но работают через удобные команды getfacl/setfacl.

Вывод

  • xattrs - мощный механизм хранения метаданных в Linux.
  • ACL, SELinux, capabilities, целостность - всё это строится на xattrs.
  • Поддержка включается через acl и user_xattr в /etc/fstab.
  • Утилиты: getfattr, setfattr, getfacl, setfacl.
  • Используй для гибкого управления, аудита, автоматизации и безопасности.