ceph存储 scsi设备驱动体系架构

2024-01-05 11:18

本文主要是介绍ceph存储 scsi设备驱动体系架构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

scsi设备驱动体系架构

从这一层开始,整个文件读写的中心将由request转向scsi的命令结构scsi_cmnd。那么这个命令结构到底是怎么一回事呢,这还得从SCSI架构谈起。SCSI 实现了一种客户机/服务器风格的通信架构,发起者向目标设备发送命令请求。该目标处理此请求并向发起者返回响应。发起者可以是托管计算机中的一个 SCSI 设备,而 SCSI 目标则可以是一个磁盘、光盘和磁带设备或特殊设备(比如箱体设备)。

 

这里要提到一个概念——Lower Level Device(LDD):在最低层的是一组驱动器,称为 SCSI 低层驱动器。它们是一些可与物理设备(比如 HBA)链接的特定驱动器。LLD 提供了自公共中间层到特定于设备的 HBA 的一种抽象。每个 LLD 都提供了到特定底层硬件的接口,但所使用的到中间层的接口却是一组标准接口。

 

较低层包含大量代码,原因是它要负责处理各种不同的 SCSI 适配器类型。例如,Fibre Channel 协议包含了针对 Emulex 和 QLogic 的各种适配器的 LLD。面向 Adaptec 和 LSI 的 SAS 适配器的 LLD 也包括在内。

 

与存储相关的 SCSI 命令一般是在 SCSI Architecture Model (SAM)、SCSI Primary Commands (SPC) 和 SCSI Block Commands (SBC) 中定义的:

 

l  SAM:定义SCSI 系统模型、SCSI 标准集的功能性分区,以及适用于所有 SCSI 实现和实现标准的需求。

l  SPC:定义:对所有 SCSI 设备模型通用的行为。

l  SBC:定义命令集扩展,以方便操作 SCSI 直接访问块设备。

 

每个 SCSI 命令都由 Command Descriptor Block (CDB) 描述,它定义 SCSI 设备执行的操作。SCSI 命令涉及到用于向 SCSI 设备传输数据(或从中输出数据)的数据命令,以及用于设置 SCSI 设备的配置参数的非数据命令。

 

典型的CDB格式如下图所示:

 

 

位 7

位 6

位 5

位 4

位 3

位 2

位 1

位 0

字节 0

Operation code = 12h

字节 1

LUN

Reserved

EVPD

字节 2

Page code

字节 3

Reserved

字节 4

Allocation length

字节 5

Control

 

如果 EVPD 参数位(用于启用关键产品数据)为 0 并且 Page Code 参数字节为 0,那么目标将返回标准命令数据(如inquiry)。如果 EVPD 参数为 1,那么目标将返回对应 page code 字段的特定于供应商的数据。

 

scsi_cmnd结构中的cmnd[MAX_COMMAND_SIZE]数组就是这个CDB的内容。我们看到这个数组虽然最大可有16个元素,每个元素1字节,但是我们仅仅用了其中6个元素,用来存放CDB,其中cmnd[0]最为重要,对应scsi操作码。所有的scsi操作码都有定义,在include/scsi/scsi.h中:

 

#define TEST_UNIT_READY       0x00

#define REZERO_UNIT           0x01

#define REQUEST_SENSE         0x03

#define FORMAT_UNIT           0x04

#define READ_BLOCK_LIMITS     0x05

#define REASSIGN_BLOCKS       0x07

#define INITIALIZE_ELEMENT_STATUS 0x07

#define READ_6                0x08

#define WRITE_6               0x0a

#define SEEK_6                0x0b

#define READ_REVERSE          0x0f

#define WRITE_FILEMARKS       0x10

#define SPACE                 0x11

#define INQUIRY               0x12

#define RECOVER_BUFFERED_DATA 0x14

#define MODE_SELECT           0x15

#define RESERVE               0x16

#define RELEASE               0x17

#define COPY                  0x18

#define ERASE                 0x19

#define MODE_SENSE            0x1a

#define START_STOP            0x1b

#define RECEIVE_DIAGNOSTIC    0x1c

#define SEND_DIAGNOSTIC       0x1d

#define ALLOW_MEDIUM_REMOVAL  0x1e

 

#define SET_WINDOW            0x24

#define READ_CAPACITY         0x25

#define READ_10               0x28

#define WRITE_10              0x2a

#define SEEK_10               0x2b

#define POSITION_TO_ELEMENT   0x2b

#define WRITE_VERIFY          0x2e

#define VERIFY                0x2f

#define SEARCH_HIGH           0x30

#define SEARCH_EQUAL          0x31

#define SEARCH_LOW            0x32

#define SET_LIMITS            0x33

#define PRE_FETCH             0x34

#define READ_POSITION         0x34

#define SYNCHRONIZE_CACHE     0x35

#define LOCK_UNLOCK_CACHE     0x36

#define READ_DEFECT_DATA      0x37

#define MEDIUM_SCAN           0x38

#define COMPARE               0x39

#define COPY_VERIFY           0x3a

#define WRITE_BUFFER          0x3b

#define READ_BUFFER           0x3c

#define UPDATE_BLOCK          0x3d

#define READ_LONG             0x3e

#define WRITE_LONG            0x3f

#define CHANGE_DEFINITION     0x40

#define WRITE_SAME            0x41

#define READ_TOC              0x43

#define LOG_SELECT            0x4c

#define LOG_SENSE             0x4d

#define MODE_SELECT_10        0x55

#define RESERVE_10            0x56

#define RELEASE_10            0x57

#define MODE_SENSE_10         0x5a

#define PERSISTENT_RESERVE_IN 0x5e

#define PERSISTENT_RESERVE_OUT 0x5f

#define REPORT_LUNS           0xa0

#define MOVE_MEDIUM           0xa5

#define EXCHANGE_MEDIUM       0xa6

#define READ_12               0xa8

#define WRITE_12              0xaa

#define WRITE_VERIFY_12       0xae

#define SEARCH_HIGH_12        0xb0

#define SEARCH_EQUAL_12       0xb1

#define SEARCH_LOW_12         0xb2

#define READ_ELEMENT_STATUS   0xb8

#define SEND_VOLUME_TAG       0xb6

#define WRITE_LONG_2          0xea

#define READ_16               0x88

#define WRITE_16              0x8a

#define VERIFY_16            0x8f

#define SERVICE_ACTION_IN     0x9e

/* values for service action in */

#define    SAI_READ_CAPACITY_16  0x10

 

/* Values for T10/04-262r7 */

#define    ATA_16                0x85    /* 16-byte pass-thru */

#define    ATA_12                0xa1    /* 12-byte pass-thru */

 

我们列出最常使用的命令:

 

命令

描述

INQUIRY

请求目标设备的摘要信息

TEST_UNIT_READY

检测目标设备是否准备好进行传输

READ_6

SCSI 目标设备传输数据

WRITE_6

SCSI 目标设备传输数据

REQUEST_SENSE

请求最后一个命令的检测数据

READ_CAPACITY

获得存储容量信息

 

所有 SCSI 命令都要以操作代码的第一个字节为开端,以表明它所代表的操作。并且所有 SCSI 命令都要包含一个控制字节。这个字节通常是该命令的最后一个字节,用于表示与供应商相关的信息等等。

 

scsi_cmnd 结构就完全是SCSI记录的抽象,不仅cmnd数组字段记录了命令描述块 (CDB);还有用于感测数据缓存 (SENSE BUFFER)的sense_buffer字段,以及用于存放IO 超时时间等 SCSI 相关的信息和 SCSI 子系统处理命令需要的一些其他信息的字段,如回调函数等。

来自include/scsi/scsi_cmnd.h:

 

struct scsi_cmnd {

       struct scsi_device *device;

       struct list_head list;  /* scsi_cmnd participates in queue lists */

       struct list_head eh_entry; /* entry for the host eh_cmd_q */

       int eh_eflags;         /* Used by error handlr */

       void (*done) (struct scsi_cmnd *);       /* Mid-level done function */

 

       unsigned long serial_number;

 

       unsigned long jiffies_at_alloc;

 

       int retries;

       int allowed;

       int timeout_per_command;

 

       unsigned char cmd_len;

       enum dma_data_direction sc_data_direction;

 

       /* These elements define the operation we are about to perform */

#define MAX_COMMAND_SIZE       16

       unsigned char cmnd[MAX_COMMAND_SIZE];

       unsigned request_bufflen;      /* Actual request size */

 

       struct timer_list eh_timeout;  /* Used to time out the command. */

       void *request_buffer;            /* Actual requested buffer */

 

       /* These elements define the operation we ultimately want to perform */

       unsigned short use_sg;   /* Number of pieces of scatter-gather */

       unsigned short sglist_len;      /* size of malloc'd scatter-gather list */

 

       unsigned underflow;     

 

       unsigned transfersize;    

 

       int resid;        

 

       struct request *request;

 

#define SCSI_SENSE_BUFFERSIZE        96

       unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE];

                            /* obtained by REQUEST SENSE when

                             * CHECK CONDITION is received on original

                             * command (auto-sense) */

 

       void (*scsi_done) (struct scsi_cmnd *);

 

       struct scsi_pointer SCp;  /* Scratchpad used by some host adapters */

 

       unsigned char *host_scribble;      

 

       int result;        /* Status code from lower level driver */

 

       unsigned char tag;  /* SCSI-II queued command tag */

       unsigned long pid;  /* Process ID, starts at 0. Unique per host. */

};

 

这篇关于ceph存储 scsi设备驱动体系架构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/572685

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

创业者该如何设计公司的股权架构

本文来自七八点联合IT橘子和车库咖啡的一系列关于设计公司股权结构的讲座。 主讲人何德文: 在公司发展的不同阶段,创业者都会面临公司股权架构设计问题: 1.合伙人合伙创业第一天,就会面临股权架构设计问题(合伙人股权设计); 2.公司早期要引入天使资金,会面临股权架构设计问题(天使融资); 3.公司有三五十号人,要激励中层管理与重要技术人员和公司长期走下去,会面临股权架构设计问题(员工股权激