Вопрос или проблема
У меня есть несколько наборов данных с использованием XATTR=ON в прошлом, которые фактически соответствовали LEGACY/DIR, и я мигрировал их на XATTR=SA сейчас по причинам производительности. Большинство этих изменений свойства вступают в силу только для вновь записанных данных, а файлы в наборах данных регулярно по крайней мере обновляются с помощью RSYNC во время резервного копирования.
Как мне проверить текущую схему хранения, используемую на диске для XATTR?
Я уже нашел что-то похожее на следующее, но это не дает мне таких же результатов, как я вижу в интернете. Я протестировал это с явно новым файлом, добавил некоторые расширенные атрибуты, но вывод ZDB, похоже, вообще не изменяется.
zdb -dddd <набор данных> <инод>
root@srv01:/zpool-hdd/encr# touch test.txt
root@srv01:/zpool-hdd/encr# stat test.txt
Файл: test.txt
Размер: 0 Блоков: 1 IO Блок: 131072 обычный
пустой файл
Устройство: 0,60 Инод: 5 Ссылки: 1
Доступ: (0644/-rw-r--r--) Уд: ( 0/ root) Гид: ( 0/ root)
Доступ: 2024-11-29 17:39:19.604863843 +0100
Изменено: 2024-11-29 17:39:19.604863843 +0100
Изменено: 2024-11-29 17:39:19.604863843 +0100
Рождение: 2024-11-29 17:39:19.604863843 +0100
root@srv01:/zpool-hdd/encr# zdb -ddddddd zpool-hdd/encr 5
Набор данных zpool-hdd/encr [ZPL], ID 37543, cr_txg 750114, 216K, 10
объектов, rootbp DVA[0]=<0:fb29d447000:1000> DVA[1]=<0:e8951e4b000:1000>
[L0 DMU objset] fletcher4 без сжатия аутентифицированный LE непрерывный
уникальный двойной размер=1000L/1000P рождение=1268365L/1268365P заполнение=10
cksum=00000024b0170731:00006736da953e0f:009984adba612070:9f9b98f2774578d7
Объект уровень iblk dblk dsize dnsize lsize %полный тип
5 1 128K 512 0 512 512 0.00 ZFS
обычный файл (K=унаследовать) (Z=унаследовать=lz4)
176 бонус Системные
атрибуты
флаги dnode: USERUSED_ACCOUNTED USEROBJUSED_ACCOUNTED
dnode maxblkid: 0
(бонус зашифрован)
(объект зашифрован)
Косвенные блоки:
root@srv01:/zpool-hdd/encr# setfattr -n user.comment -v "это комментарий" test.txt
root@srv01:/zpool-hdd/encr# zdb -ddddddd zpool-hdd/encr 5
Набор данных zpool-hdd/encr [ZPL], ID 37543, cr_txg 750114, 216K, 10
объектов, rootbp DVA[0]=<0:fb29d447000:1000> DVA[1]=<0:e8951e4b000:1000>
[L0 DMU objset] fletcher4 без сжатия аутентифицированный LE непрерывный
уникальный двойной размер=1000L/1000P рождение=1268365L/1268365P заполнение=10
cksum=00000024b0170731:00006736da953e0f:009984adba612070:9f9b98f2774578d7
Объект уровень iblk dblk dsize dnsize lsize %полный тип
5 1 128K 512 0 512 512 0.00 ZFS
обычный файл (K=унаследовать) (Z=унаследовать=lz4)
176 бонус Системные
атрибуты
флаги dnode: USERUSED_ACCOUNTED USEROBJUSED_ACCOUNTED
dnode maxblkid: 0
(бонус зашифрован)
(объект зашифрован)
Косвенные блоки:
root@srv01:/zpool-hdd/encr#
Ответ или решение
Проверка способа хранения XATTR в ZFS: SA или DIR
Проверка, как именно хранятся расширенные атрибуты (XATTR) в файловой системе ZFS, требует внимательного подхода, особенно если у вас есть данные, которые ранее использовали режим XATTR=LEGACY/DIR и были мигрированы в XATTR=SA. В данном ответе мы обсудим, как можно надежно установить, какая методология хранения используется для определенных файлов.
Шаг 1: Понимание режимов хранения XATTR
В ZFS существуют два основных режима хранения XATTR:
- LEGACY (DIR): Расширенные атрибуты хранятся в отдельных файлах в подкаталоге
.ZFS
. Этот метод имеет свои преимущества, но может снижать производительность из-за дополнительных операций ввода-вывода. - SA (System Attribute): Расширенные атрибуты хранятся в буфере с данными файла, что улучшает производительность за счет уменьшения числа операций обращения к диску.
Для новых файлов режим хранения будет определяться настройкой xattr
на уровне файловой системы, но для уже существующих файлов эта настройка может не быть применена.
Шаг 2: Использование ZDB для анализа хранилища
Использование команды zdb
поможет вам глубже проанализировать, как именно хранятся XATTR для определенной группы файлов. Ваша команда zdb -dddd <dataset> <inode>
позволяет получить информацию о конкретном иноде, но если вы не видите изменений или расширенных атрибутов, проблема может заключаться в том, что они не были обновлены в метаданных.
Пример использования ZDB:
-
Создайте файл и добавьте к нему расширенные атрибуты:
touch test.txt setfattr -n user.comment -v "this is a comment" test.txt
-
Проверьте inode файла:
stat test.txt
-
Выполните команду ZDB для получения информации о inode:
zdb -dddd zpool-hdd/encr <inode>
Шаг 3: Интерпретация результата
На основе вывода ZDB вы сможете увидеть тип объема, используемый для хранения атрибутов. В выводе вы ищете строчку:
176 bonus System attributes
Если там указано bonus
, это может означать, что расширенные атрибуты хранятся в режиме SA. Если они указаны как legacy
, это будет указывать на использование режима DIR.
Шаг 4: Проверка существующих файлов
Так как ваши данные могли быть обновлены с помощью RSYNC без изменения XATTR, вам необходимо повторно проверить XATTR для уже существующих файлов. Если они были созданы до переключения в SA и не были изменены, они могут по-прежнему использовать режим DIR.
Для проверки всех файлов в директории вы можете написать скрипт на Bash, который будет использовать stat
и zdb
для анализа каждого файла на предмет его хранения XATTR.
Заключение
Для надежной проверки, используете ли вы SA или DIR для хранения XATTR, следуйте описанным шагам. Будьте внимательны, что если ваши данные были скопированы или мигрированы, информация может измениться в зависимости от способа, которым файловая система обрабатывает XATTR. Использование zdb
предоставляет вам мощный инструмент для анализа, но важно также понимать, что текущее состояние файлов и их атрибутов может быть сложным из-за изначальных настроек и изменений, сделанных в процессе их использования.
Помните, что модификация старых данных может потребовать дополнительных действий, таких как изменение метаданных файлов для приведения их в соответствие с новыми настройками вашей ZFS.