基于对象的存储设备.doc_第1页
基于对象的存储设备.doc_第2页
基于对象的存储设备.doc_第3页
基于对象的存储设备.doc_第4页
基于对象的存储设备.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

参考(/solaris/articles/osd.html)介绍有两种类型的网络存储系统,以不同的命令集加以区分: 存储区域网络(SAN)中使用的SCSI块I / O的命令集,它通过直接访问在磁盘驱动器或光纤通道层次的数据提供了较高的随机I / O和数据吞吐性能。 网络附加存储(NAS)系统使用网络文件系统(NFS)或通用互联网文件系统(CIFS)的命令集访问数据。因为在媒介上的元数据是共享的,多个节点可以同时访问数据。相反,对象存储是基于封装了用户数据的数据对象,包括数据的属性和元数据。数据,属性和元数据的结合,使对象存储得以确定数据的布局或每个对象的基础上的服务质量,这就提高了灵活性和可管理性。对象存储的独特设计,不同于传统的基于块接口的标准存储设备。对象存储是一个磁盘驱动器的智能进化,它可以存储和提供对象而不仅仅是简单地将数据存放于磁道和扇区。这个任务的完成是通过将底层存储功能移动到存储设备中,并通过对象接口来访问设备实现的。使用对象存储的系统提供以下好处,这是在典型的IT存储应用范围内是广泛可取的: 存储层的智能空间管理 数据感知的预取和缓存 健壮性,多个客户端的共享访问 使用卸载的数据路径的可扩展 可靠的安全保障OSD历史在1983年推出第一小型计算机系统接口(SCSI)光盘驱动器,SCSI标准是由美国国家标准学会(ANSI)于1986年批准的。从那时起的未来数年,这一基本协议已没有显著改变。在存储设备和主机电脑之间的物理接口却有过从宽SCSI到快速SCSI再到光纤通道SCSI(FCP)、串行连接SCSI(SAS)的巨大变化。在1983年初始的接口速度为5 MB /秒。如今,接口速度可达320 MB /秒。第一个SCSI磁盘的容量为5 MB。今天,SCSI逻辑接口用到了300 GB的磁盘驱动器上。纵向记录的面密度已达到约200 GB /in2,新兴的垂直记录技术和热辅助磁记录(HAMR)技术将是这一数值达到1TB /in2。然而,逻辑接口,或者说命令集,在此期间只有少量的增加。今天的接口作为ANSI T10 SCSI OSD V1标准化了,ANSI T10 SCSI OSD V1由卡内基梅隆大学在始于1994年被称为网络连接的安全磁盘(NASD)的政府资助研究项目中完成。在接下来的几年中,这一工作仍将得到一组由国家存储工业协会(NSIC)组织的业界合作者的支持和提倡。这项工作促成了草案接口标准化的ANSI T10规范的提交,该委员会负责SCSI接口标准,并将其命名为项目T10/1355-D。在接下来的几年中,这个接口由具有各种工业界和学术界的贡献者的全球网络存储工业协会(SNIA)的OSD技术工作组进行了修改和扩展,并促成了在2004年T10标准草案的完成。该标准于2004年9月被批准,并成为了ANSI T10 SCSI OSD的V1的命令集,作为INCITS 400-2004公布。SNIA继续致力于接口的进一步扩展,如ANSI T10 SCSI OSD的V2的命令集。OSD功能:基本概念与传统的数据访问方法,包括基于块的方法(并行SCSI、SAS、FCP,ATA,SATA)和基于文件的方法(NFS和CIFS)相比,基于对象的数据访问模型是一个新兴的技术。一个OSD类似于一个逻辑单元。不同于传统的面向块的设备提供作为无关联块阵列组织的数据的访问方式,对象存储允许以存储对象的方式来访问数据。存储对象是一个组织数据的虚拟个体,该虚拟个体通过用户以逻辑上相关的方式进行制定。存储对象的空间是由OSD的本身进行分配而不是一个基于主机的文件系统。OSDs对所有必要的底层存储设备进行管理,包括空间管理和提供安全功能。因为对于对象没有基于主机的元数据(如inode信息),那么对于应用程序而言获取一个对象的唯一方法就是通过它的对象标识符(OID)。下图将传统的基于块的磁盘数据结构与基于对象的磁盘数据结构进行了对比。图 1基于块的磁盘与基于对象的磁盘的对比OSD中对象的集合,形成一个单一的OID的平坦空间。虚拟文件的层次结构可以通过重新排列对象的指针来模拟,如下所示。图 2传统的层次,平坦模型和虚拟的数据访问模型对象是在OSD中数据存储的基本单位。每个对象是完备的,它由用户数据、一个OID、元数据(构成对象的块的物理位置)和属性构成,如下所示。图3包含数据、OID、元数据和属性的对象ANSI T10 SCSI OSD标准定义了四种不同的对象: 根对象-OSD本身 用户对象 由来自应用程序或客户端的SCSI命令创建 集合对象 一组用户对象,如所有的.mp3对象或所有属于同一个项目的对象 分区对象-为一组用户对象和集合对象的容器,这些用户对象和集合对象具有相同的安全和空间管理的特点,如配额和密钥值这些对象,如下图所示。图 4对象类型:根对象,分区对象,用户对象,集合对象因为每个对象是完备的,这样不同对象的迁移和共享是可能的。文件系统和其他基于主机的数据管理应用程序同时存储用户数据和元数据。OSD的对象属性保证了OSD对象上应用程序的关联性,如根对象、分区对象、集合对象或用户对象。属性可以用来描述一个OSD对象的具体特点,如OSD的对象所占用的总字节数,OSD的对象的逻辑大小,或OSD对象的最后修改时间。属性页的编号表明了该属性页所关联的OSD对象类型,据ANSI T10 SCSI OSD标准的定义对于每个对象有232种属性页,而每个属性页有232种属性。只有小范围的属性命名空间是由标准预定义的。最主要的部分可以由应用程序定义,这就提供了很好的数据服务和有助于改善服务质量(QoS)。两类属性包括: 存储属性(类似的inode)- OSD使用来管理对于数据的块的分配,如OID、数据块的指针、逻辑长度、使用的容量。 用户属性-用于应用程序和元数据管理者存储对象相关的更高层次的信息,如密度、容量、性能、成本、适应性、权能、可管理性、可靠性、可用性、可维护性、互操作性、安全性、用电量、配额数据对象的属性和元数据的存储是直接的,并在层与层之间和跨设备自动进行的。当对象通过某个系统层或设备,该系统层能根据它所理解的属性值产生反应。忽略其他属性,不修改也没有动作。因此,标记为高可靠性的对象与标记为临时的对象是区别对待的。数据的存储属性将高服务级别与数据关联起来,以获得更好的数据缓存、预取和迁移等,如本图所示。图 5属性层服务级别SCSI 架构模型SCSI架构模型(SAM)的扩展OSD定义了这些OSD特定命令和扩展的SCSI命令描述块(CDB): APPEND (write without offset) CREATE (object), REMOVE (object) CREATE COLLECTION, REMOVE COLLECTION, LIST COLLECTION, FLUSH COLLECTION CREATE PARTITION, REMOVE PARTITION, FLUSH PARTITION FLUSH (force object to media), FLUSH OSD, LIST (objects) FORMAT (OSD) GET ATTR (of an object), SET ATTR PERFORM SCSI COMMAND (such as a SCSI INQUIRY) READ (object with OID), WRITE SET KEY (shared secret for a single object) SET MASTER KEY (shared secret for OSD)图 6 SCSI标准架构图OSD的安全在ANSI T10 SCSI OSD标准为基于权能的协议定义了强安全性,该协议强制性地保证SCSI请求的完整性和客户端的合法使用。每个命令必须附有哈希码(HMAC-SHA1算法的160位密钥的哈希消息认证码),它标识一个特定的对象以及针对该对象执行的操作列表。在下面的步骤和图的过程中详细介绍。1. 安全管理端与一个OSD交换共享密钥。2. 客户端必须从安全管理端发出请求获取一个权能并对访问的对象指定OSD的名称、分区ID和OID。3. 安全管理端来决定客户端通过LDAP,NIS或Kerberos的方法发出请求是否被授权。4. 因为这种身份认证的方法是超出了ANSI T10 SCSI OSD协议的范围之外,安全管理端与策略管理端交互来确定客户端是否被授权来对指定的对象执行请求操作。如果操作是允许的,安全管理端将生成证书,包括所请求的权能和CAP_key(完整性校验值)。CAP_key是通过使用一个OSD的密钥和权能的伪随机函数产生的。5. 证书从安全管理端发送到客户端。6. 客户端发出请求、权能以及对每个OSD命令验证标签。验证标签是由客户端使用CAP_key计算出来的。在处理命令之前,OSD验证了以下内容:o 验证标签,基于密钥和权能信息o 该功能尚未以任何方式修改o 该功能允许对指定对象的请求的操作如果通过测试,OSD允许基于权能中编码的权利的操作。一个客户端可以请求允许多种类型的操作的证书,如读、写或删除。这允许客户端主动缓存和重用凭证,最大限度地减少安全管理的信息数量。证书可以被缓存、传播、阻塞、撤销或过期。图 7 OSD安全过程流图权能SCSI命令描述块(CDB)的字段,指定命令可以请求的命令功能(哪个OSD对象可以被访问)。权能的内容,可以由策略管理端管理用于应用程序客户端,也可以由安全管理端通过证书进行保护。证书一个由安全管理端准备的数据结构,由完整性检查值(CAP_key)进行保护。此证书被发送到应用程序客户端来定义对某个OSD逻辑单元的访问用于指定OSD对象上指定命令的执行。证书包括由策略管理端准备并由应用程序客户端复制到每个CDB来请求指定的命令功能的一种权能。OSD的共享密钥层次结构共享密钥的层次结构如图8所示。从最高到最低,密钥包括以下内容:1. 主密钥层次结构中位于最高层次密钥,可以允许对驱动器不受限制的访问。主密钥的丢失被认为是一个灾难性的事件。因为主密钥的这种重要性,该协议限制了它的使用仅仅局限于设置的根密钥这种罕见事件。主密钥仅仅在驱动器的所有者发生改变的情况下才能修改。2. 根密钥-与主密钥类似,根密钥提供对驱动器不受限制的访问。然而,根密钥不能被用来初始化驱动器或设置一个新的主密钥或密钥。根密钥设置后,它可以用来设置分区密钥。根密钥是可以根据需要或者作为一个用于维护安全的预定的更新操作的一部分被修改的。3. 分区密钥-用于为每个分区产生工作密钥。对象存储分为多个分区,每个分区都有一个唯一的分区密钥和工作密钥。4. 工作密钥-用于生成客户端用于访问单个对象的权能密钥。由于它们的频繁使用,工作密钥应经常刷新,如每隔一小时。不幸的是,一密钥刷新就会立即导致该密钥所产生的所有证书的失效,当所有的客户端必须与安全管理端通信以获得新的凭据时也可能会导致性能的显着下降。由于所有证书在被对象存储缓冲之前必须进行验证,这也就增加了OSD上的负载。为了解决这些问题,对象存储可以将最多16更新版本的工作密钥声明为可用。这将有效地定义多个工作密钥同时可用。因此,一个密钥的刷新会影响到有限数量的权能。为了支持这一功能,该协议需要一个被纳入到特定的权能中的密钥版本,那些权能标示了哪些密钥在验证过程中可用。图 8 OSD的共享密钥层次总结感谢李思阳同学的作图Linux下的访问接口这一章主要介绍Linux 下OSD所提供的访问接口以及与之相关的数据结构。数据结构篇osd设备信息描述符:./include/scsi/osd_initiator.hstruct osd_dev struct scsi_device *scsi_device;unsigned def_timeout;#ifdef OSD_VER1_SUPPORTenum osd_std_version version;#endif;这并不是一个完全的linux设备,它仅仅是一个挂linux请求相关联的资源以及默认属性的地方。请求队列描述符(用户态):./include/open-osd/linux/blkdev.hstruct request_queue int fd;volatile int num_requests;scsi设备描述符(用户态):./include/open-osd/scsi/scsi_device.hstruct scsi_device struct request_queue *request_queue;OSD设备标志信息描述符:./include/scsi/osd_initiator.hstruct osd_dev_info unsigned systemid_len;u8 systemidOSD_SYSTEMID_LEN;unsigned osdname_len;u8 *osdname;OSD命令描述符格式:./include/open-osd/scsi/scsi.hstruct scsi_varlen_cdb_hdr /10字节的命令描述块头部u8 opcode; /* opcode always = VARIABLE_LENGTH_CMD */操作码,统一定义为0x7Fu8 control;/控制码u8 misc5;u8 additional_cdb_length; /* total cdb length - 8 */CDB附加部分的长度200-8=192_be16 service_action;/服务动作,表示用户请求的动作。每个服务动作都有特定的附加域与之关联/* service specific data follows */后面是190字节的附加域,为特殊服务数据;struct osd_cdb_head /命令描述块的头部struct scsi_varlen_cdb_hdr varlen_cdb;/*10*/u8options;u8command_specific_options;u8timestamp_control;/*13*/u8reserved13;/*16*/_be64partition;/此次命令所针对的分区ID号/*24*/_be64object;/此次命令所针对的对象ID号,分区ID和对象ID可以唯一地标志一个用户对象/*32*/union /* V1 vs V2 alignment differences */struct _osdv1_cdb_addr_len /*32*/_be32 list_identifier;/* Rarely used */*36*/_be64length;/读写操作需要传送的字节数/*44*/_be64start_address;/用户对象上的偏移量,说明读/写命令操作的开始位置。 _packed v1;struct _osdv2_cdb_addr_len /* called allocation_length in some commands */*32*/_be64length;/读写操作需要传送的字节数/*40*/_be64start_address;/用户对象上的偏移量,说明读/写命令操作的开始位置。union /*48*/_be32 list_identifier;/* Rarely used */* OSD2r05 5.2.5 CDB continuation length */*48*/_be32 cdb_continuation_length; _packed v2;/*52*/union /* selected attributes mode Page/List/Single */struct osd_attributes_page_mode /*52*/_be32get_attr_page;/*56*/_be32get_attr_alloc_length;/*60*/osd_cdb_offsetget_attr_offset;/*64*/_be32set_attr_page;/*68*/_be32set_attr_id;/*72*/_be32set_attr_length;/*76*/osd_cdb_offsetset_attr_offset;/*80*/ _packed attrs_page;struct osd_attributes_list_mode /*52*/_be32get_attr_desc_bytes;/*56*/osd_cdb_offsetget_attr_desc_offset;/*60*/_be32get_attr_alloc_length;/*64*/osd_cdb_offsetget_attr_offset;/*68*/_be32set_attr_bytes;/*72*/osd_cdb_offsetset_attr_offset;_be32 not_used;/*80*/ _packed attrs_list;/* osd2r03: Set one attribute value using CDB fields */struct osd_attributes_cdb_mode /*52*/_be32set_attr_page;/*56*/_be32set_attr_id;/*60*/_be16set_attr_len;/*62*/u8set_attr_val18;/*80*/ _packed attrs_cdb;/*52*/u8 get_set_attributes_parameters28; _packed;/*80*/struct osdv1_cdb struct osd_cdb_head h;u8 capsOSDv1_CAP_LEN;struct osdv1_security_parameters sec_params; _packed;struct osdv2_cdb /v2版本的命令描述块struct osd_cdb_head h;u8 capsOSD_CAP_LEN;/用户获得的权能描述,表示命令的操作权限struct osdv2_security_parameters sec_params; _packed;struct osd_cdb union struct osdv1_cdb v1;struct osdv2_cdb v2;u8 buffOSD_TOTAL_CDB_LEN; _packed;OSD标准定义了由CDB成员指向的IO段的复杂的数据结构。在IN-Buffer中用到了3个段,在OUT-buffer中用到了4个段。下图描述了一个管理attributes-lists中的get+set的安全读(secure-read),从不使用段到使用所有的段都是基于同一个基本主题。一个块设备请求通过将bidi_read请求与主要写请求关联能支持双向有效负载(bidirectional payload)。每个IO请求都由一个与该请求关联的bio链表进行描述。根据OSD标准,每个段的起始位置都必须严格对齐。在结构体struct osd_request的代码中,有两个_osd_io_info 结构体来描述上述的In-buffer和OUT-Buffer。OSD命令列表:./include/scsi/osd_protocol.henum osd_service_actions OSD_ACT_V2(OBJECT_STRUCTURE_CHECK,0x00)OSD_ACT_(FORMAT_OSD,0x01)OSD_ACT_(CREATE,0x02)/创建并初始化一个到多个用户对象。不能在0号分区上创建对象。在Create命令中可以为新用户对象指定ID号,也可以让设备服务器为新用户对象分配ID号。该ID号不能与分区中任何其它用户对象的ID号相同,也不与任何集合对象的ID号相同OSD_ACT_(LIST,0x03)OSD_ACT_V2(PUNCH,0x04)OSD_ACT_(READ,0x05)OSD_ACT_(WRITE,0x06)OSD_ACT_(APPEND,0x07)/将指定数量的数据写到指定用户对象的尾部,写入的字节数由struct osd_cdb_head中的length指定,写入的内容在struct osd_cdb_head的?,Append命令执行完之后,用户对象的逻辑长度属性会增加(在用户对象信息属性页中)。如果增加后的逻辑长度超过该对象的配额,该命令会产生配额错误。Append命令会消耗分区的容量,如果导致已用分区容量超过分区的配额限制,也会产生配额错误。OSD_ACT_(FLUSH,0x08)OSD_ACT_V2(CLEAR,0x09)OSD_ACT_(REMOVE,0x0A)OSD_ACT_(CREATE_PARTITION,0x0B)OSD_ACT_(REMOVE_PARTITION,0x0C)OSD_ACT_(GET_ATTRIBUTES,0x0E)OSD_ACT_(SET_ATTRIBUTES,0x0F)OSD_ACT_(CREATE_AND_WRITE,0x12)OSD_ACT_(CREATE_COLLECTION,0x15)OSD_ACT_(REMOVE_COLLECTION,0x16)OSD_ACT_(LIST_COLLECTION,0x17)OSD_ACT_(SET_KEY,0x18)OSD_ACT_(SET_MASTER_KEY,0x19)OSD_ACT_(FLUSH_COLLECTION,0x1A)OSD_ACT_(FLUSH_PARTITION,0x1B)OSD_ACT_(FLUSH_OSD,0x1C)OSD_ACT_V2(QUERY,0x20)OSD_ACT_V2(REMOVE_MEMBER_OBJECTS,0x21)OSD_ACT_V2(GET_MEMBER_ATTRIBUTES,0x22)OSD_ACT_V2(SET_MEMBER_ATTRIBUTES,0x23)OSD_ACT_V2(CREATE_CLONE,0x28)OSD_ACT_V2(CREATE_SNAPSHOT,0x29)OSD_ACT_V2(DETACH_CLONE,0x2A)OSD_ACT_V2(REFRESH_SNAPSHOT_CLONE,0x2B)OSD_ACT_V2(RESTORE_PARTITION_FROM_SNAPSHOT, 0x2C)OSD_ACT_V2(READ_MAP,0x31)OSD_ACT_V2(READ_MAPS_COMPARE,0x32)OSD_ACT_V1_V2(PERFORM_SCSI_COMMAND,0x8F7E, 0x8F7C)OSD_ACT_V1_V2(SCSI_TASK_MANAGEMENT,0x8F7F, 0x8F7D)/* 0x8F80 to 0x8FFF are Vendor specific */;OSD请求描述符:./include/scsi/osd_initiator.hstruct osd_request struct osd_cdb cdb;struct osd_data_out_integrity_info out_data_integ;struct osd_data_in_integrity_info in_data_integ;struct osd_dev *osd_dev;struct request *request;struct _osd_req_data_segment void *buff;unsigned alloc_size; /* 0 here means: dont call kfree */unsigned total_bytes; cdb_cont, set_attr, enc_get_attr, get_attr;struct _osd_io_info struct bio *bio;u64 total_bytes;u64 residual;struct request *req;struct _osd_req_data_segment *last_seg;u8 *pad_buff; out, in;gfp_t alloc_flags;unsigned timeout;unsigned retries;unsigned sense_len;u8 senseOSD_MAX_SENSE_LEN;enum osd_attributes_mode attributes_mode;osd_req_done_fn *async_done;void *async_private;int async_error;int req_errors;OSD请求描述符(struct osd_request)用来编码一个OSD命令以及在执行过程中保存命令的状态。每个请求都经过以下几步:a. osd_start_request()分配一个请求b. 通过某种osd_req_*方法将请求编码成某一指定类型c. 通过osd_req_add_get,set_attr_*方法来给CDB增加get/set属性。互斥地使用”List”或者”Page”模式。在同一请求(request)上,attribute-list API可以调用多次。但是,正如OSD标准中规定的,只有一个attribute-page可读。(该步可选)d. osd_finalize_request()计算data-in和data-out缓冲区的偏移,并利用权能密钥和完整性检验参数。为后面请求的执行做准备。e. 通过块设备层调用osd_execute_request()来执行请求并等待其完成。请求可以通过直接调用块设备层的API异步地执行。(该步可选)f. 在执行完成之后,调用osd_req_decode_sense()来解码请求中的有用信息来验证执行结果。g. osd_req_decode_get_attr()来收集osd_add_get_attr_list()的返回值(该步可选)h. 调用osd_end_request()来释放请求以及与之关联的所有资源。该函数在任一步都可以调用来清理所有资源,但是必须保证先前osd_start_request()调用成功。库osd设备描述符:./lib/osddev.cstruct libosd_dev struct osd_dev od; /* keep this first! (container_of not) */struct osd_dev_info odi;struct request_queue bsg;struct scsi_device scsi_device;对象标识描述符:./include/scsi/osd_types.hstruct osd_obj_id osd_id partition;osd_id id;对象由它的分区ID(partition)和用户对象ID(id)进行唯一的标识,分区ID和用户对象ID都是8字节长。分区对象ID和用户对象ID的分配范围如下:Partition_IDUser_Object_ID意义0h0h根对象0h1h-FFFF FFFF FFFF FFFFh保留1h-FFFFh0h- FFFF FFFF FFFF FFFFh保留10000h-FFFF FFFF FFFF FFFFh0h分区对象10000h-FFFF FFFF FFFF FFFFh1h-FFFFh保留10000h-FFFF FFFF FFFF FFFFh10000h- FFFF FFFF FFFF FFFFh集合或用户对象osd权能结构描述符:./include/scsi/osd_protocol.hstruct osd_capability_head u8 format; /* low nibble */权能格式,0表示没有权能,1表示标准权能。如果该域的值是1,设备服务器将检验由CDB(Command Descriptor Block 命令描述块)所请求的命令功能是否为该权能所许可。设备服务器在真正执行某个命令功能之前检验其合法性。u8 integrity_algorithm_key_version; /* MAKE_BYTE(integ_alg, key_ver) */这个字节分两部分,integ_alg为计算证书完整性检验值(权能密钥)的所使用的算法,key_ver为计算证书完整性检验值(权能密钥)的工作密钥的编号u8 security_method;/安全方法,表示要检验或者签名的内容,例如不做检验、仅对权能结构签名、对所有数据签名等。设备服务器将根据安全方法的约定验证请求中心的部分或者全部数据的完整性。u8 reserved1;/*04*/struct osd_timestamp expiration_time;/权能失效时间,如果该值不为0,设备服务器会将它与定义在根信息属性页中时钟(当前时钟)进行比较。如果该值小于属性页中的时钟值,权能将失效。/*10*/u8 audit20;/审计信息,为一个开发商专用的数值,策略/存储管理器和安全管理器利用该值将权能或证书与特定的应用客户关联起来,用于审计。/*30*/u8 discriminator12;/权能判别器,是一个现时值(nonce),用于区分权能和证书。两个不同权能的discriminator肯定是不同的。/*42*/struct osd_timestamp object_created_time;/权能所针对的对象创建时间。设备服务器会将该时间与对象的创建时间属性比较,如果不等,则会终止命令的执行。0表示所有对象的创建时间都是允许的。/*48*/u8 object_type;/权能针对的对象类型,包括Root(根对象)、Partition(分区对象)、Collection(集合对象)和User(用户对象)/*49*/u8 permissions_bit_mask5;/许可掩码,是一个位图,表示权能所允许的命令功能,包括Read(读数据)、Write(写数据)、Get_attr(读属性)、Set_attr(设置属性)、Create(创建对象)、Remove(删除对象)、Obj_mgmt(管理对象)、Append(追加对象)、Dev_mgmt(设备管理)、Global(所有对象)、Pol/Sec(策略/安全)等。该位图中的某一被置1表示运行应用客户执行相应的命令功能,清零表示禁止应用客户执行相应的命令功能。如Read被置1表示允许读osd对象中的数据。/*54*/u8 reserved2;/*55*/u8 object_descriptor_type; /* high nibble */对象描述符类型,表示出现在结构体struct osd_cap_object_descriptor中的信息格式,包括两类:单个用户或集合对象(U/C)、分区对象(PAR) _packed;/*56 v2*/struct osd_cap_object_descriptor union struct /*56*/_be32 allowed_attributes_access;/*60*/_be32 policy_access_tag;/策略存取标签,如果该值不为0,则作为权能检查的一部分,要求该标签域的值必须与对象的policy access tag属性(在策略/安全属性页中)一致,否则命令将终止执行。/*64*/_be16 boot_epoch;/*66*/u8 reserved6;/*72*/_be64 allowed_partition_id;/*80*/_be64 allowed_object_id;/ allowed_partition_id和allowed_object_id唯一地描述了一个用户/集合对象/*88*/_be64 allowed_range_length;/*96*/_be64 allowed_range_start; _packed obj_desc;/*56*/u8 object_descriptor48; _packed;/*104 v2*/这里是运用2.0版本的osd标准struct osd_capability struct osd_capability_head h;struct osd_cap_object_descriptor od; _packed;应用客户的每个请求中都必须包含一个权能。策略/存储管理器复制为应用客户准备权能(Capability)。安全管理器负责将权能加密成安全证书(Credential)。在执行美国命令时都需要检查权能的有效性。事实上,每个命令需要的权能也是不一样的。下表列出命令及需要的权能。命令权能Append用户对象上的Append权能Create and Write用户对象上的Create和Write权能Create Partition分区对象上的Create权能根对象的List根对象上的Read权能根对象的Set Key根对象的Dev_mgmt、Pol/Sec权能根对象的Set Master Key根对象的Dev_mgmt、Pol/Sec和Global权能Get AttributesGet_attr权能Set Attributes(不包括Policy/Security)Set_attr权能Set Attributes(包括Policy/Security)Set_attr权能和Pol/Sec权能读对象额外需要Get_attr权能修改对象Set_attr权能对象类型:./include/scsi/osd_protocol.henum object_type OSD_SEC_OBJ_ROOT = 0x1,/根对象OSD_SEC_OBJ_PARTITION = 0x2,/分区对象OSD_SEC_OBJ_COLLECTION = 0x40,/集合对象OSD_SEC_OBJ_USER = 0x80,/用户对象;根信息属性页:./include/scsi/osd_attributes.henum OSD_ATTR_RI_OSD_SYSTEM_ID = 0x3, /* 20 */一个20字节的标识符,能唯一的标识一个osd系统,该id号是一个结构,定义在spc标准中。OSD_ATTR_RI_VENDOR_IDENTIFICATION = 0x4, /* 8 */obsd设备生产商的标识OSD_ATTR_RI_PRODUCT_IDENTIFICATION = 0x5, /* 16 */OBSD产品的标识OSD_ATTR_RI_PRODUCT_MODEL = 0x6, /* 32 */32字节的字符串,标识OBSD的型号OSD_ATTR_RI_PRODUCT_REVISION_LEVEL = 0x7, /* 4 */OBSD产品的版本号OSD_ATTR_RI_PRODUCT_SERIAL_NUMBER = 0x8, /* variable */OBSD产品的序列号OSD_ATTR_RI_OSD_NAME = 0x9, /* variable */OSD逻辑单元的名字OSD_ATTR_RI_MAX_CDB_CONTINUATION_LEN = 0xA, /* 4 */OSD_ATTR_RI_TOTAL_CAPACITY = 0x80, /* 8 */OSD逻辑单元的总容量,单位为字节OSD_ATTR_RI_USED_CAPACITY = 0x81, /* 8 */OSD逻辑单元已经用掉的容量,包括各种OSD对象及其属性所用掉的容量OSD_ATTR_RI_NUMBER_OF_PARTITIONS = 0xC0, /* 8 */OSD逻辑单元中的分区数OSD_ATTR_RI_CLOCK = 0x100, /* 6 */当前时间OARI_DEFAULT_ISOLATION_METHOD = 0X110, /* 1 */OARI_SUPPORTED_ISOLATION_METHODS = 0X111, /* 32 */OARI_DATA_ATOMICITY_GUARANTEE = 0X120, /* 8 */OARI_DATA_ATOMICITY_ALIGNMENT = 0X121, /* 8 */OARI_ATTRIBUTES_ATOMICITY_GUARANTEE = 0X122, /* 8 */OARI_DATA_ATTRIBUTES_ATOMICITY_MULTIPLIER = 0X123, /* 1 */OARI_MAXIMUM_SNAPSHOTS_COUNT = 0X1C1, /* 0 or 4 */OARI_MAXIMUM_CLONES_COUNT = 0X1C2, /* 0 or 4 */OARI_MAXIMUM_BRANCH_DEPTH = 0X1CC, /* 0 or 4 */OARI_SUPPORTED_OBJECT_DUPLICATION_METHOD_FIRST = 0X200, /* 0 or 4 */OARI_SUPPORTED_OBJECT_DUPLICATION_METHOD_LAST = 0X2ff, /* 0 or 4 */OARI_SUPPORTED_TIME_OF_DUPLICATION_METHOD_FIRST = 0X300, /* 0 or 4 */OARI_SUPPORTED_TIME_OF_DUPLICATION_METHOD_LAST = 0X30F, /* 0 or 4 */OARI_SUPPORT_FOR_DUPLICATED_OBJECT_FREEZING = 0X310, /* 0 or 4 */OARI_SUPPORT_FOR_SNAPSHOT_REFRESHING = 0X311, /* 0 or 1 */OARI_SUPPORTED_CDB_CONTINUATION_DESC_T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论