Я экспериментирую с XAM (раздвижным методом доступа), которое стандарт хранения начатый SNIA (ассоциация индустрии сети хранения и начала первый прототип VIM (модуля интерфейса поставщика) для системы файлов ext4 основанной на добавлять другой namespace к настоящей выдвинутой поддержке атрибутов архива. В виду того что другие проявители Линукс могли быть заинтересованы в как добавить выдвинутый namespace атрибутов к системе файлов, я решил опубликовать этот столб как направляющий выступ.
Выдвинутые атрибуты архива (EA) выдвижения к нормальным атрибутам которые связаны с inodes в системе файлов. Они просто названны: оцените пары связанные с архивами и директориями и который цель обеспечить дополнительную функциональность которая или определена операционной системой или применением потребителя. EA может быть определен или неопределен. Если EA определен, то свое значение может быть пусто или non-empty. Большая часть из начальной работы для того чтобы поддержать EAs в Линукс была сделана Andreas Gruenbacher в временных рамки 2001 до 2004 и основана на работе сделанной в системе файлов SGI XFS.
EAs хранится сразу в inodes и на дополнительных блоках диска если необходимо. В настоящее время все EAs связало с архивом должно приспосабливать в inode и один дополнительный блок. Блоки которые содержат идентичный комплект EAs могут быть поделены среди нескольких inodes. EAs в inodes и на блоках имеет различный коллектор последованный за дискрипторами множественного входа. Дискрипторы входа сортированы в блоках диска но выйдены unsorted в inodes.
Имена EA нул-прекращенные шнуры и всегда определены используя a полно - квалифицированное namespace.attribute например system.posix_acl_access или security.selinux. Namespaces использовано для того чтобы определить различные типы EAs. Различные типы EA необходимы потому что позволения и возможности необходимы для манипулировать EAs в одном namespace могут отличать от одного к другим. В настоящее время Линукс поддерживает namespaces EA для SELinux (обеспеченности.), доверенной системы (системы.), (доверено.) и потребителя (потребителя.).
Fedora 11 приходит с поддержкой EA в стержене Линукс и следовательно стержень который необходимо доработать для того чтобы добавить другой namespace EA. В мой случай я хотел добавить вызванный namespace EA snia для того чтобы поддержать (см. ниже) metadata XAM XSet.
Здесь архив заплаты на Fedora 11 2.6.29.4 - стержень 167.fc11 который снабжает namespace snia. Он должен работать и для трицатидвухразрядных и 64ых-разрядн стерженей но я только испытывал его на 64ом-разрядн стержене.
diff - uNrp kernel-2.6.29.orig/fs/ext4/Makefile kernel-2.6.29.new/fs/ext4/Makefile
--- 22:07 kernel-2.6.29.orig/fs/ext4/Makefile 2009-06-14: 12.191464615 -0400
22:06 +++ kernel-2.6.29.new/fs/ext4/Makefile 2009-06-14: 20.009399924 -0400
@@ +8.6 ext4-y @@ -8.6 : = balloc.o bitmap.o dir.o file.o
ioctl.o namei.o super.o symlink.o hash.o resize.o extents.o \
ext4_jbd2.o migrate.o mballoc.o
- ext4-$ (CONFIG_EXT4_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o
+ext4-$ (CONFIG_EXT4_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o xattr_snia.o
ext4-$ (CONFIG_EXT4_FS_POSIX_ACL) += acl.o
ext4-$ (CONFIG_EXT4_FS_SECURITY) += xattr_security.o
diff - uNrp kernel-2.6.29.orig/fs/ext4/xattr.c kernel-2.6.29.new/fs/ext4/xattr.c
--- 22:11 kernel-2.6.29.orig/fs/ext4/xattr.c 2009-06-14: 20.699475221 -0400
+++ kernel-2.6.29.new/fs/ext4/xattr.c 2009-06-14 22:09: 48.242839367 -0400
@@ -107.6 xattr_handler *ext4_xattr_ struct +107.7 @@ статическое
#ifdef CONFIG_EXT4_FS_SECURITY
[EXT4_XATTR_INDEX_SECURITY] = &ext4_xattr_security_handler,
#endif
+ [EXT4_XATTR_INDEX_SNIA] = &ext4_xattr_snia_handler,
};
xattr_handler *ext4_xattr_handlers struct [] = {
@@ -119.6 xattr_handler *ext4_xattr_handler struct +120.7 @@
#ifdef CONFIG_EXT4_FS_SECURITY
&ext4_xattr_security_handler,
#endif
+ &ext4_xattr_snia_handler,
NULL
};
diff - uNrp kernel-2.6.29.orig/fs/ext4/xattr.h kernel-2.6.29.new/fs/ext4/xattr.h
--- 22:09 kernel-2.6.29.orig/fs/ext4/xattr.h 2009-06-14: 27.016464602 -0400
+++ kernel-2.6.29.new/fs/ext4/xattr.h 2009-06-14 22:07: 44.887839381 -0400
@@ +21.7 @@ -21.6
#define EXT4_XATTR_INDEX_TRUSTED 4
#define EXT4_XATTR_INDEX_LUSTRE 5
#define EXT4_XATTR_INDEX_SECURITY 6
+#define EXT4_XATTR_INDEX_SNIA 7
struct ext4_xattr_header {
__le32 h_magic; магическое число/* для идентификации *
@@ -70.6 xattr_handler ext4_xattr_t struct +71.7 @@ extern
extern xattr_handler ext4_xattr_acl_access_handler struct;
extern xattr_handler ext4_xattr_acl_default_handler struct;
extern xattr_handler ext4_xattr_security_handler struct;
xattr_handler ext4_xattr_snia_handler struct +extern;
extern ssize_t ext4_listxattr (struct dentry *, чарс *, size_t);
diff - uNrp kernel-2.6.29.orig/fs/ext4/xattr_snia.c kernel-2.6.29.new/fs/ext4/xattr_snia.c
--- kernel-2.6.29.orig/fs/ext4/xattr_snia.c 1969-12-31 19:00: 00.000000000 -0500
+++ kernel-2.6.29.new/fs/ext4/xattr_snia.c 2009-06-14 13:37: 02.551476954 -0400
@@ +1.68 @@ -0.0
+/*
+ * linux/fs/ext4/xattr_snia.c
+ * укротитель для выдвинутых атрибутов потребителя.
+ *
+ * авторское право (c) 2001 Andreas Gruenbacher,
+ * авторское право (c) 2009 Finnbarr P. Murphy,
+ *
+
+#include
+#include
+#include
+#include «ext4_jbd2.h»
+#include «ext4.h»
+#include «xattr.h»
+
size_t +static
+ext4_xattr_snia_list (*inode inode struct, *list чарса, size_t list_size,
+ *name чарса const, size_t name_len)
+ {
+ size_t const prefix_len = XATTR_SNIA_PREFIX_LEN;
+ size_t const total_len = prefix_len + name_len + 1;
+
+#if FPM
+ если (! test_opt (inode->i_sb, XATTR_USER))
+ возвращение 0;
+#endif
+
+ если (&& списка total_len <>i_sb, XATTR_USER)), то
+ возвращение - EOPNOTSUPP;
+#endif
+ возвращенное ext4_xattr_get (inode, EXT4_XATTR_INDEX_SNIA, имя, буфер, размер);
+}
+
+static int
+ext4_xattr_snia_set (*inode inode struct, *name чарса const,
+ *value const пустые, размер size_t, флаги int)
+ {
+ если (== 0 strcmp (имени, "")), то
+ возвращение - EINVAL;
+#if FPM
+ если (! test_opt (inode->i_sb, XATTR_USER))
+ возвращение - EOPNOTSUPP;
+#endif
+ возвращенное ext4_xattr_set (inode, EXT4_XATTR_INDEX_SNIA, имя,
+ значение, размер, флаги);
+}
+
xattr_handler +struct ext4_xattr_snia_handler = {
+ .prefix = XATTR_SNIA_PREFIX,
+ .list = ext4_xattr_snia_list,
+ .get = ext4_xattr_snia_get,
+ .set = ext4_xattr_snia_set,
+};
diff - uNrp kernel-2.6.29.orig/fs/xattr.c kernel-2.6.29.new/fs/xattr.c
--- kernel-2.6.29.orig/fs/xattr.c 2009-06-14 22:04: 37.472464234 -0400
+++ kernel-2.6.29.new/fs/xattr.c 2009-06-14 22:05: 56.759530990 -0400
@@ -42.6 xattr_permission +42.7 @@ (*inode inode struct, co
* на эти выходит к основному модулю системы файлов/обеспеченности.
*
если (! strncmp (имя, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) ||
+ ! strncmp (имя, XATTR_SNIA_PREFIX, XATTR_SNIA_PREFIX_LEN) ||
! strncmp (имя, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
возвращение 0;
diff - uNrp kernel-2.6.29.orig/include/linux/xattr.h kernel-2.6.29.new/include/linux/xattr.h
--- kernel-2.6.29.orig/include/linux/xattr.h 2009-06-14 14:53: 02.350464255 -0400
+++ kernel-2.6.29.new/include/linux/xattr.h 2009-06-14 14:51: 07.585839446 -0400
@@ +33.9 @@ -33.6
#define XATTR_USER_PREFIX «потребитель.»
#define XATTR_USER_PREFIX_LEN (sizeof (XATTR_USER_PREFIX) - 1)
+#define XATTR_SNIA_PREFIX «snia.»
+#define XATTR_SNIA_PREFIX_LEN (sizeof (XATTR_SNIA_PREFIX) - 1)
+
inode struct;
struct dentry;
Я иду предположить если вы все еще читаете этот столб, то вы умеете как построить, упаковать и установить стержень Линукс в Fedora. Если не, здесь хорошая консультация. Единственное предостережение я сделал бы проигнорировать комментарий которому «большинств редакторы текста умеют как сломать hardlink правильно для того чтобы во избежание проблемы.» То как раз простая неправда. Вам нужно иметь отдельно автономные экземпляры любого архива источника которым вы предназначаете дорабатывать и в первоначально и новых валах источника стерженя - не одиночном трудном соединенном экземпляре - прежде чем вы начнете сделать изменения в новом вале источника стерженя.
Как только вы бежите на новом стержене, вы можете установить и получить EAs в namespace snia как показано в этом просто примере.
касание $ testfile $ setfattr - n snia.test - мир v «здравствулте!» testfile $ getfattr - n snia.test testfile # архив: testfile мир snia.test= " здравствулте! " $
В следующем примере я устанавливаю и получаю вызванные metadata (полями в терминологии XAM) для образца XAM XSet. Поле имеет имя и значение, и следующие атрибуты стандарта: тип, длина, вязка и только для чтения. Атрибуты и значения грубо соответствуют к полям outputted как документ XML к упорствованному XSet включенным примером ReferenceXSetClient с XAM SDK которое имеющееся на вебсайте SNIA. Для введения к принципиальным схемам XSystem и XSets хорошее начиная место блог `s Марк Carlson.
кот $ xamtest
# архив: testfile
snia.xset.hold.type= " применение/vnd.snia.xam.boolean "
snia.xset.hold.binding= " ложное "
snia.xset.hold.readOnly= " истинное "
snia.xset.hold.length= " 1 "
snia.xset.hold= " 0 "
snia.xset.management.policy.type= " применение/vnd.snia.xam.string "
snia.xset.management.policy.binding= " истинное "
snia.xset.management.policy.readOnly= " истинное "
snia.xset.management.policy.length= " 36 "
snia.xset.management.policy= " org.snia.refvim.default.mgmt.policy "
snia.xset.retention.base.enabled.type= " применение/vnd.snia.xam.boolean "
snia.xset.retention.base.enabled.binding= " истинное "
snia.xset.retention.base.enabled.readOnly= " истинное "
snia.xset.retention.base.enabled.length= " 1 "
snia.xset.retention.base= " 1 "
snia.xset.retention.base.starttime.type= " применение/vnd.snia.xam.datetime "
snia.xset.retention.base.starttime.binding= " истинное "
snia.xset.retention.base.starttime.readOnly= " истинное "
snia.xset.retention.base.starttime.length= " 29 "
snia.xset.retention.base.starttime= " 2009-06-12T22: 34: 35.350-05: 00 "
snia.xset.retention.list.base.type= " применение/vnd.snia.xam.string "
snia.xset.retention.list.base.binding= " истинное "
snia.xset.retention.list.base.readOnly= " истинное "
snia.xset.retention.list.base.length= " 4 "
snia.xset.retention.list.base= " основание "
snia.xset.retention.list.event.type= " применение/vnd.snia.xam.string "
snia.xset.retention.list.event.binding= " истинное "
snia.xset.retention.list.event.readOnly= " истинное "
snia.xset.retention.list.event.length= " 5 "
snia.xset.retention.list.event= " случай "
snia.xset.time.access.type= " применение/vnd.snia.xam.datetime "
snia.xset.time.access.binding= " ложное "
snia.xset.time.access.readOnly= " истинное "
snia.xset.time.access.length= " 29 "
snia.xset.time.access= " 2009-06-12T22: 34: 35.350-05: 00 "
snia.xset.time.com mit.type= " применение/vnd.snia.xam.datetime "
snia.xset.time.com mit.binding= " ложное "
snia.xset.time.com mit.readOnly= " истинное "
snia.xset.time.com mit.length= " 29 "
mit= " 2009-06-12T22 snia.xset.time.com: 34: 35.350-05: 00 "
snia.xset.time.access.type= " применение/vnd.snia.xam.datetime "
snia.xset.time.access.binding= " ложное "
snia.xset.time.access.readOnly= " истинное "
snia.xset.time.access.length= " 29 "
snia.xset.time.access= " 2009-06-12T22: 34: 35.350-05: 00 "
snia.xset.time.com mit.type= " применение/vnd.snia.xam.datetime "
snia.xset.time.com mit.binding= " ложное "
snia.xset.time.com mit.readOnly= " истинное "
snia.xset.time.com mit.length= " 29 "
mit= " 2009-06-12T22 snia.xset.time.com: 34: 35.350-05: 00 "
snia.xset.time.creation.type= " применение/vnd.snia.xam.datetime "
snia.xset.time.creation.binding= " истинное "
snia.xset.time.creation.readOnly= " истинное "
snia.xset.time.creation.length= " 29 "
snia.xset.time.creation= " 2009-06-12T22: 34: 35.331-05: 00 "
snia.xset.time.xuid.type= " применение/vnd.snia.xam.datetime "
snia.xset.time.xuid.binding= " ложное "
snia.xset.time.xuid.readOnly= " истинное "
snia.xset.time.xuid.length= " 29 "
snia.xset.time.xuid= " 2009-06-12T22: 34: 35.331-05: 00 "
snia.xset.xuid.type= " применение/vnd.snia.xam.xuid "
snia.xset.xuid.binding= " истинное "
snia.xset.xuid.readOnly= " истинное "
snia.xset.xuid.length= " 30 "
snia.xset.xuid= " AAA6AwAeVG4xMjQ0ODY0MDc1MzU4AQWDedILNL7Q "
$ setfattr --restore=xamtest
$ getfattr - snia m. - d testfile
# архив: testfile
мир snia.test= " здравствулте! "
snia.xset.hold= " 0 "
snia.xset.hold.binding= " ложное "
snia.xset.hold.length= " 1 "
snia.xset.hold.readOnly= " истинное "
" snia.xset.hold.type= \ «применение/vnd.snia.xam.boolean \» «
snia.xset.management.policy= " org.snia.refvim.default.mgmt.policy "
snia.xset.management.policy.binding= " истинное "
snia.xset.management.policy.length= " 36 "
snia.xset.management.policy.readOnly= " истинное "
snia.xset.management.policy.type= " применение/vnd.snia.xam.string "
snia.xset.retention.base= " 1 "
" snia.xset.retention.base.enabled.binding= \ «true \» «
snia.xset.retention.base.enabled.length= " 1 "
snia.xset.retention.base.enabled.readOnly= " истинные "
snia.xset.retention.base.enabled.type= " применение/vnd.snia.xam.boolean "
snia.xset.retention.base.starttime= " 2009-06-12T22: 34: 35.350-05: 00 "
snia.xset.retention.base.starttime.binding= " истинное "
snia.xset.retention.base.starttime.length= " 29 "
snia.xset.retention.base.starttime.readOnly= " истинное "
" snia.xset.retention.base.starttime.type= \ «применение/vnd.snia.xam.datetime \» «
snia.xset.retention.list.base= " основание "
snia.xset.retention.list.base.binding= " истинное "
snia.xset.retention.list.base.length= " 4 "
snia.xset.retention.list.base.readOnly= " истинное "
snia.xset.retention.list.base.type= " применение/vnd.snia.xam.string "
snia.xset.retention.list.event= " случай "
snia.xset.retention.list.event.binding= " истинное "
snia.xset.retention.list.event.length= " 5 "
snia.xset.retention.list.event.readOnly= " истинное "
snia.xset.retention.list.event.type= " применение/vnd.snia.xam.string "
snia.xset.time.access= " 2009-06-12T22: 34: 35.350-05: 00 "
snia.xset.time.access.binding= " ложное "
snia.xset.time.access.length= " 29 "
snia.xset.time.access.readOnly= " истинное "
snia.xset.time.access.type= " применение/vnd.snia.xam.datetime "
mit= " 2009-06-12T22 snia.xset.time.com: 34: 35.350-05: 00 "
snia.xset.time.com mit.binding= " ложное "
snia.xset.time.com mit.length= " 29 "
snia.xset.time.com mit.readOnly= " истинное "
snia.xset.time.com mit.type= " применение/vnd.snia.xam.datetime "
snia.xset.time.creation= " 2009-06-12T22: 34: 35.331-05: 00 "
snia.xset.time.creation.binding= " истинное "
snia.xset.time.creation.length= " 29 "
snia.xset.time.creation.readOnly= " истинное "
snia.xset.time.creation.type= " применение/vnd.snia.xam.datetime "
snia.xset.time.xuid= " 2009-06-12T22: 34: 35.331-05: 00 "
snia.xset.time.xuid.binding= " ложное "
snia.xset.time.xuid.length= " 29 "
snia.xset.time.xuid.readOnly= " истинное "
snia.xset.time.xuid.type= " применение/vnd.snia.xam.datetime "
snia.xset.xuid= " AAA6AwAeVG4xMjQ0ODY0MDc1MzU4AQWDedILNL7Q "
snia.xset.xuid.binding= " истинное "
snia.xset.xuid.length= " 30 "
snia.xset.xuid.readOnly= " истинное "
snia.xset.xuid.type= " применение/vnd.snia.xam.xuid "
$
Очевидно эта работа доказательств--принципиальная схема только. Фактический namespace XAM org.snia.xam.* и не сокращенная версия, т.е. snia.*, которое я использовал в доказательств--принципиальной схеме. Бедный человек i испытал его достаточно для того чтобы открыть условия на границах или ограничения размера пока. Я подозрюю что могло быть более лучше хранить атрибуты namespace snia в их собственных блоках довольно чем делить inode или блок с другими 4 namespaces и этим чему я предназначу прототип затем.
Если кто-нибудь еще заинтересовано в работе с мной в этом космосе, то я приветствовал бы их запутанность.



























Здравствулте!. Я думаю что статья действительно интересна. Я даже заинтересован в читать больше. Как скоро вы уточните ваш блог?
Что специфически и вы любите прочитать больше около?