您好,欢迎访问三七文档
王文斌CHS编码(Cylinder/Head/Sector)盘面数=磁头数(Heads):表示硬盘总共有几个磁头,也就是有几面盘面,最大为0~255(用8个二进制位存储),一盘片有两个盘面;磁道数=柱面数(Cylinders):表示硬盘每一面盘片上有几条磁道,最大为0~1023(用10个二进制位存储);扇区数(Sectors):表示每一条磁道上有几个扇区,最大为1~63(用6个二进制位存储);理论上磁盘最大容量为:256*1024*63*512/1048576=8064MB=7.875GB(1M=1048576Bytes)这就是所谓的磁盘8GB的限制,所以在后面的发展中CHS编码逐渐被淘汰。硬盘厂商常用的单位:256*1024*63*512/1000000=8.456GB(1M=1000000Bytes)注:(1)磁头数最大256是理论值,有的设置FF值无效,取值为最大为255,这些不在讨论范围内,注意后面的发展磁头只是一个逻辑概念,盘片一般只有2~4片。(2)磁道数1024也只是理论值,3FF有时也是无效值。(3)扇区数取值以前固定为1~63,所以只为63个扇区。LBA:LogicalBlockAddress逻辑块地址CHS编码问题:(1)容量问题,突破不了8GB的限制。一个磁道扇区数远远不只63个。(2)物理概念和逻辑概念混用,后期用的磁头数(磁道数,扇区数)不是指的物理存在的磁头数,而是逻辑的磁头数。扇区排列顺序问题:扇区在磁道中一般不是顺序排列的,由于磁盘在旋转过程中速度太快,还没等磁头准备好第二个扇区的数据,磁盘已经转到第四个或后面的扇区了,接着写第二个扇区就要转第二圈。使用交叉因子解决。例如:17个扇区交叉因子为3:1,则磁盘扇区顺序为:1,7,13,2,8,14,3,9,15,4,10,16,5,11,17,6,12struct_sas_device{structlist_headlist;//sas设备链表,_scsih_add_device()u64sas_address;//sas地址,sas_device_pg0配置页读取u64device_name;//设备名,sas_device_pg0配置页获取u16handle;//设备句柄,sas_device_pg0配置页获取u64sas_address_parent;//上一级sas地址,sas_device_pg0配置页获取u16enclosure_handle;//参见_scsih_add_device()u64enclosure_logical_id;//逻辑槽位号,sas_device_pg0配置页u32device_info;//设备信息,sas_device_pg0配置页获取intid;//未使用,初始化为0intchannel;//未使用,初始化为0u16slot;//未使用,初始化为0u8phy;//实际phyID,如下D0.15.0对应于0xfu8responding;在拔出和插入磁盘的时候会打印详细信息,如下:Removedevice.BEGINTOPRINTdeviceinfo-------------------SASAddress:0x5000c500436fa855,devicename:0x5000c500436fa855,handle:0x000d,Parentaddress:0x500605b0000272bf,enclosurehandle:0x0000,enclosurelogicalid:0x0000000000000000deviceinfo:0x00000401,id:0x00000000,channel:0x00000000,slot:0x0000,phy:0x0f,responding:0charSerial_Number[20];//磁盘序列号,SN号charModel_Number[40];//磁盘厂商和型号charFirmware_Revision[8];//磁盘固件版本u64Max_LBA;//磁盘大小,最大的LBAu32SectorSize;//扇区大小,设置为512bytesu16Capacity;//磁盘容量,未使用,用max_LBA表示u16Setting;//磁盘设置,未使用,置0};在拔出和插入磁盘的时候会打印详细信息,如下:serialnumber:6SL2C9JE,modelnumber:SEAGATEST3600057SS,firmwarerev:ES64,maxLBA0x0000000045dd2faf,sectorsize:512,capacity:0x000a,setting:0x0000磁盘作为Target端,要获取磁盘信息,只需要向磁盘发送SCSI命令和Inquiry命令即可。_scsih_get_drive_info()获取磁盘的信息。获取磁盘容量:0x9e,sas_device-Max_LBA大于2T:_scsih_inquiry_lba_sectorsize_by_read_capacity_16()小于2T:_scsih_inquiry_lba_sectorsize_by_read_capacity_10()获取磁盘厂商,型号和版本信息:0x12inquiry标准inquiry数据:_scsih_inquiry_model_revision()获取磁盘sn序列号:0x12inquiry配置页配置页0x80:_scsih_inquiry_vpd_sn()sas2hdfs文件系统与dpart对应bind-k{sas2hd0}/dev/hd:raid;ls/dev/hd/0.13.0raw#defineHDP_RAW0/*rawpartition*/data#defineHDP_DATA1/*datapartition*/rconfig#defineHDP_RCONFIG2/*raidconfigurationpartition*/label#defineHDP_LABEL3/*labelpartition*/dna#defineHDP_DNA4/*dnapartition*/syslog#defineHDP_SYSLOG5/*syslogpartition*/cachev#defineHDP_CACHEVAULT6/*cachevaultingpartition*/K9磁盘初始化:将所有的扇区全部写零。Windows/Linux磁盘初始化:具有具体应用的文件系统,如NTFS或ext3文件系统,有超级块,文件链等。在创建Raid和Pool后,使用__sfsmk创建可用的文件系统,从而可以创建虚拟盘等操作。LBA00x0000000000000000LBA10x0000000000000001…….…….…….LBA_max0x0000000045dd2faf磁盘初始化zoutzerooutadrive‘sdatapartition.磁盘数据区域写零。Usage:zoutDc.s.l|-sSN如:zoutD0.12.0zout_thread(Dcsl)初始化流程(1)首先通过sn号判断D0.12.0位置磁盘是否存在,再通过dnablk的标志位来判断此磁盘是否已经初始化。如果磁盘存在且未初始化则进行下一步。(2)打开磁盘文件系统的数据域,/dev/hd/0.12.0/data,以K9_RDWR读写方式打开。(3)分配写buffer,1024个block的buffer,即1024*512Bytes=512KB。(4)计算出磁盘的总扇区和buffer的扇区,计算出需要多少个buffer和剩余多少个扇区。(5)分别写buffer扇区和剩余的扇区,进行写磁盘K9write(fd,(char*)zerobuf,buf_sz),通过文件系统架构调用do_hdwritev(),调用hd_raw_io()做一些检查校验,最后调用hd_asyncio()实际写IO,先准备好异步IO(ASYNCio),然后通过NCRend给磁盘下发IO,NCRwait等待写完成。(6)通过调用步骤5写完所有的扇区,进度条计算,将需要的总buffer分成10份,每完成一份就上报一个进度。全部完成后,更新dnablk的标志位,初始化完成。王文斌物理盘:物理盘是指创建Raid所用的每块独立的物理硬盘,创建为Raid后,就成为Raid的成员盘。逻辑盘:多块物理盘经过Raid卡进行创建为Raid后,就组成了一块新的虚拟的磁盘,磁块磁盘即为逻辑盘。热备盘:热备盘是指空闲的,加电并待机的磁盘,当Raid中某个成员盘发生故障后,Raid卡可以用热备盘代替故障磁盘。去Raid化:Raid出现故障后,逻辑盘就无法被系统识别,此时物理盘可能只有部分有故障,从槽位上取下来可以继续分析恢复数据,从raid中拔插出来的过程就是去Raid化。盘数和盘序:组成Raid逻辑盘的个数就是盘数,Raid创建出来后,Raid磁盘的顺序就固定,即为盘序。条带和条带组:条带是Raid的最小单位,即将多个扇区组合起来成为一个条带,如K9中使用128个扇区,64KB作为条带。条带组是指raid0和raid5上多个磁盘的条带组成一个组。Raid0是将多块物理磁盘连接在一起形成一个容量更大的的存储设备,Raid0的磁盘容量等于物理盘的的容量乘以磁盘数目。磁盘号=LBA%磁盘数组织结构校验读出磁盘LBA0数据。读出Raid0的LBA0/128数据。对比Raid0的数据是分别在两块磁盘上还是在一块磁盘上。LBA0LBA128LBA256LBA384LBA512RAID1又称为磁盘镜像,需要两个物理磁盘共同构建,使用磁盘镜像技术而成,方法是在工作磁盘之外再额外的弄一块备份磁盘。磁盘号=两块磁盘组织结构校验读出两块磁盘LBA0数据。读出Raid1LBA0/128数据。对比Raid1的数据是否在两块磁盘上镜像。LBA0LBA128LBA256LBA384LBA512Raid5是在Raid0的基础上增加了校验数据,校验数据是分散到所有的磁盘上的,校验算法是异或运算,XOR。校验磁盘号=数据盘数-LBA/数据盘数%磁盘数磁盘号=LBA%数据盘数,小于P不动,大于等于自加1组织结构校验读出三块磁盘LBA0数据。读出Raid5LBA0/128/256数据。对比Raid5的数据和三块磁盘的数据,是否按照此格式进行排列。LBA0LBA128LBA256LBA384LBA512K9Raid5的格式和标准的Raid5的格式有一定的区别,区别在于找盘的算法不一样,导致盘的位置也不一样。校验磁盘号=数据盘数-LBA/数据盘数%磁盘数磁盘号=LBA%磁盘数组织结构校验读出三块磁盘LBA0数据。读出Raid5LBA0/128/256数据。对比Raid5的数据和三块磁盘的数据,是否按照算法所进行的格式排列。LBA0LBA128LBA256LBA384LBA512Raid6是在Raid5的基础上增加了多增加了一个校验盘,第一个校验数据是异或得出来的,第二个校验数据通过伽罗华域计算出来的。组织结构校验读出三块磁盘LBA0数据。读出Raid6LBA0/128/256数据。对比Raid6的数据和三块磁盘的数据,是否按照算法所进行的格式排列。LBA0LBA1LBA2LBA3LBA4Raid虚拟文件系统Raidfs:raid;ls/raid/R5_000/raid/R5_000:#defineROOT_ID(unsignedlong)(0|K9_DIRBIT)ctl#defineCTL_ID1ULdata#defineRAW_ID2ULrepair#defineREPAIR_ID3ULstats#defineSTATS_ID4ULstaticK9naminfo_tnamtab[]={{ROOT_ID,ctl,CTL_ID},{ROOT_ID,data,RAW_ID},{ROOT_ID,repair,REPAIR_
本文标题:磁盘和Raid基础
链接地址:https://www.777doc.com/doc-3826228 .html