判断cat /sys/block//queue/rotational的返回值(其中为你的硬盘设备名称,例如sda等等),如果返回1 则表示磁盘可旋转,那么就是HDD了; 如果返回0,则表示磁盘不可以旋转,那么就是SSD了。
IDE
即「电子集成驱动器」,或者叫「集成设备电路」。 IDE接口,也称之为ATA接口。 ATA的英文拼写为「Advanced Technology Attachment」,含义是「高级技术附加装置」。 2003年推出SATA(Serial ATA)后,原有的ATA改名为PATA(并行高技术配置,Parallel ATA)。一个IDE接口只能接两个外部设备。 IDE代表着硬盘的一种类型,但在实际的应用中,人们也习惯用IDE来称呼最早出现IDE类型硬盘ATA-1,这种类型接口随着接口技术的发展已经被淘汰了,而其后发展分支出更多类型的硬盘接口,比如ATA、Ultra ATA、DMA、Ultra DMA等接口都属于IDE硬盘。目前硬件接口已经向SATA转移。
IDE接口优点:价格低廉、兼容性强、性价比高。 IDE接口缺点:数据传输速度慢、线缆长度过短、连接设备少。
ATA(Advanced Technology Attachment)
ATA技术是一个关于IDE(Integrated Device Electronics)的技术规范族。最初,IDE只是一项企图把控制器与盘体集成在一起的硬盘接口技术。随着IDE/EIDE得到的日益广泛的应用,全球标准化协议将该接口自诞生以来使用的技术规范归纳成为全球硬盘标准,这样就产生了ATA。在ATA接口发展到ATA100的时候,这种并行接口的电缆属性、连接器和信号协议都表现出了很大的技术瓶颈,而在技术上突破这些瓶颈存在相当大的难度。 IDE硬盘厂商则停止了对IDE接口的开发,转而生产Serial ATA接口标准的硬盘。
PATA(Parallel ATA——并行ATA硬盘)
采用的是一根四芯的电源线和一根80芯的数据线与主板相连接,把数据并列传输和成列(串)传输。传输速率由于受到并行传输的限制,传输率较低,PATA硬盘是不需要安驱动的。
SATA
(Serial ATA——串行ATA硬盤)
SATA硬盤
SATA(Serial Advanced Technology Attachment,串行高级技术附件)是一种基于行业标准的串行硬件驱动器接口,是由Intel、IBM、Dell、APT、Maxtor和Seagate公司共同提出的硬盘接口规范。它是一种电脑总线,主要功能是用作主板和大量存储设备(如硬盘及光盘驱动器)之间的数据传输之用。这是一种完全不同于串行PATA的新型硬盘接口类型,由于采用串行方式传输数据而得名。 SATA总线使用嵌入式时钟信号,具备了更强的纠错能力,与以往相比其最大的区别在于能对传输指令(不仅仅是数据)进行检查,如果发现错误会自动矫正,这在很大程度上提高了数据传输的可靠性。串行接口还具有结构简单、支持热插拔的优点。
SCSI(Small Computer System Interface)
小型计算机系统接口,一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。 SCSI是一种智能的通用接口标准。 SCSI接口广泛应用于小型机上的高速数据传输技术。 SCSI接口具有应用范围广、多任务、带宽大、CPU占用率低,以及热插拔等优点。
- IDE的工作方式需要CPU的全程参与,CPU读写数据的时候不能再进行其他操作,这种情况在Windows 95/NT的多任务操作系统中,自然就会导致系统反应的大大减慢。而SCSI接口,则完全通过独立的高速的SCSI卡来控制数据的读写操作,CPU就不必浪费时间进行等待,显然可以提高系统的整体性能。不过,IDE接口为改善这个问题也做了很大改进,已经可以使用DMA模式而非PIO模式来读写,数据的交换由DMA通道负责,对CPU的占用可大大减小。尽管如此,比较SCSI和IDE在CPU的占用率,还是可以发现SCSI仍具有相当的优势。
- SCSI的扩充性比IDE大,一般每个IDE系统可有2个IDE通道,总共连4个IDE设备,而SCSI接口可连接7—15个设备,比IDE要多很多,而且连接的电缆也远长于IDE。
- 虽然SCSI设备价格高些,与IDE相比,SCSI的性能更稳定、耐用,可靠性也更好。
SAS(Serial Attached SCSI——串行SCSI)
串行连接SCSI接口,串行连接小型计算机系统接口。和现在流行的Serial ATA(SATA)硬盘相同,都是采用串行技术以获得更高的传输速度,并通过缩短连结线改善内部空间等SAS的接口不仅看起来和SATA类似,而且可以向下兼容SATA标准。即SAS系统的背板(Backpanel)既可以连接具有双端口、高性能的SAS驱动器,也可以连接高容量、低成本的SATA驱动器。由此SAS驱动器和SATA驱动器可以同时存在于一个存储系统之中。但需要注意的是,SATA系统并不兼容SAS,所以SAS驱动器不能连接到SATA背板上。
总结
1. 物理接口
M.2 , U.2 , AIC, NGFF 这些属于物理接口。
像 M.2 可以是 SATA SSD 也可以是 NVMe(PCIe) SSD。金手指上有一个 SATA/PCIe 的选择信号,来区分两者。很多笔记本的M.2 接口也是同时支持两种类型的盘的。
- SATA接口,SATA接口属于老式的接口,分SATA 3GB和SATA6 GB,我们的机械硬盘使用的也是这种接口,兼容性强,新老电脑基本都通用。只不过,这种接口SSD速度稍慢,延迟稍高,最大速度不会超过600MB/s
- mSATA接口,这种接口不多,一般会用在早期笔记本上。如今笔记本大都用的是M.2接口,因此这种接口基本逐渐被淘汰了。
- M.2 , 主要用在 笔记本上,优点是体积小,缺点是散热不好。
- U.2,主要用在 数据中心或者一些企业级用户,对热插拔需求高的地方。优点热插拔,散热也不错。一般主要是pcie ssd(也有sas ssd),受限于接口,最多只能是 pcie 4lane
- AIC,企业,行业用户用的比较多。通常会支持pcie 4lane/8lane,带宽上限更高
- PCI-E接口,这个长得跟显卡一样的固态硬盘也是 PCI-E ×4的接口,支持PCI-E ×4的总线。但是现在的主板大多数是没有PCIE-4的插槽的。所以一般都是接在显卡的插槽里使用的,这种接口固态硬盘速度虽然快,但很多平台可能不支持,因此市面上相对不是很常见。
2. 高速信号协议
SAS,SATA,PCIe 这三个是同一个层面上的,模拟串行高速接口。
- SAS 对扩容比较友好,也支持双控双活。接上SAS RAID 卡,一般在阵列上用的比较多。
- SATA 对热插拔很友好,早先台式机装机市场的 SSD基本上都是SATA的,现在的机械硬盘也是SATA接口居多。但速率上最高只能到 6Gb/s,上限 550MB/s左右,现在已经慢慢被pcie取代。
- PCIe 支持速率更高,也离CPU最近。很多设备如网卡,显卡也都走pcie接口,当然也有SSD。现在比较主流的是PCIe 3.0,8Gb/s 看起来好像也没比 SATA 高多少,但是 PCIe 支持多个LANE,每个LANE都是 8Gb/s,这样性能就倍数增加了。目前,SSD主流的是 PCIe 3.0x4 lane,性能可以做到 3500MB/s 左右。
3. 传输层协议
SCSI(SAS),ATA(SATA),NVMe 都属于这一层。主要是定义命令集,数字逻辑层。
- SCSI 命令集 历史悠久,应用也很广泛。U盘,SAS 盘,还有手机上 UFS 之类很多设备都走的这个命令集。
- ATA 则只是跑在SATA 协议上
- NVMe 协议是有特意为 NAND 进行优化。相比于上面两者,效率更高。主要是跑在 PCIe 上的。当然,也有NVMe-MI,NVMe-of之类的。是个很好的传输层协议。
4. 总结
M.2,U.2,AIC是物理规格,像是公路,铁路。
PCIe,SATA,SAS是模拟高速接口,像是县道,省道,高速这样。速率上限不同
SCSI,ATA,NVMe 是传输层协议,命令集。就是跑在路上面的小车,只是有跑车 和面包车之分。
所以,如果要买SSD的话,不是只看 M.2就完事了 ,得分清了是 SATA 的,还是 NVMe 的,看看主板支持的到底是哪种。否则,买回来的东西可能会用不了!
磁盘阵列
冗余磁盘阵列已经通过首字母缩略词 RAID 而闻名,它最初代表廉价磁盘的冗余阵列,尽管有些人更喜欢在首字母缩略词中使用 I 的独立一词。从故障中恢复的能力加上更高的吞吐量(以每秒兆字节数或每秒 I/O 数来衡量),使 RAID 具有吸引力。当与小直径驱动器的更小尺寸和更低功耗的优点相结合时,RAID 现在在大规模存储系统中占主导地位。
RAID 0 — 它没有冗余,有时被昵称为 JBOD,仅表示一堆磁盘,尽管数据可能会在阵列中的磁盘上条带化。通常包含此级别,以作为其他RAID级别的成本,性能和可靠性方面的衡量标准。
RAID 1 — 也称为镜像或重影,每条数据有两个副本。它是最简单和最古老的磁盘冗余方案,但它也具有最高的成本。某些阵列控制器将通过允许镜像磁盘独立执行读取操作来优化读取性能,但这种优化意味着镜像写入可能需要更长的时间才能完成。
RAID 2 — 此组织的灵感来自于将内存样式纠错码 (ECC) 应用于磁盘。之所以包含它,是因为在最初的RAID论文发布时就有这样的磁盘阵列产品,但此后就没有了,因为其他RAID组织更具吸引力。
RAID 3 — 由于更高级别的磁盘接口了解磁盘的运行状况,因此很容易找出哪个磁盘出现故障。设计人员意识到,如果多一个磁盘包含数据磁盘中信息的奇偶校验,单个磁盘允许从磁盘故障中恢复。数据按条带形式组织,有 N 个数据块和一个奇偶校验块。当故障发生时,我们只是从好的块中“减去”好的数据,剩下的就是丢失的数据。(无论故障磁盘是数据磁盘还是奇偶校验磁盘,这都适用。RAID 3 假定数据在读取和写入时分布在所有磁盘上,这在读取或写入大量数据时很有吸引力。
RAID 4 — 许多应用程序以小型访问为主。由于扇区有自己的错误检查,因此您可以通过允许每个磁盘执行独立读取来安全地增加每秒的读取次数。如果您必须读取每个磁盘来计算奇偶校验,那么写入似乎仍然很慢。为了增加每秒的写入次数,另一种方法仅涉及两个磁盘。首先,数组读取即将被覆盖的旧数据,然后计算在写入新数据之前将更改的位。然后,它读取检查磁盘上奇偶校验的旧值,根据更改列表更新奇偶校验,然后将奇偶校验的新值写入检查仍然比小读取慢 — 它们涉及四个磁盘访问 — 但它们比您必须在每次写入时读取所有磁盘时更快。RAID 4 具有与 RAID 3 相同的低检查磁盘开销,除了进行小型读写外,它还可以像 RAID 3 一样快速地进行大型读取和写入,但控制更为复杂。
RAID 5 - 请注意,RAID 4 中小型写入操作的一个性能缺陷是它们都必须读取和写入相同的校验磁盘,因此这是一个性能瓶颈。RAID 5 只是将奇偶校验信息分布在阵列中的所有磁盘上,从而消除了瓶颈。旋转每个条带中的奇偶校验块,以便奇偶校验均匀分布在所有磁盘上。磁盘阵列控制器现在必须计算哪个磁盘在想要写入给定块时具有奇偶校验,但这可以是一个简单的计算。RAID 5 具有与 RAID 3 和 4 相同的低检查磁盘开销,它可以执行 RAID 3 的大读取和写入以及 RAID 4 的小读取,但它具有比 RAID 4 更高的小写入带宽。尽管如此,RAID 5 需要经典 RAID 级别中最复杂的控制器。
RAID 6:超越单个磁盘故障
逻辑单元是从磁盘阵列导出的存储元素,通常由阵列磁盘的子集构造而成。逻辑单元在服务器中显示为单个虚拟“磁盘”。 在 RAID 磁盘阵列中,逻辑单元配置为特定的 RAID 布局,例如 RAID 5。物理卷是文件系统用于访问逻辑单元的设备文件。逻辑卷提供一定程度的虚拟化,使文件系统能够将物理卷拆分为多个部分,或将数据条带化到多个物理卷之间。逻辑单元是磁盘阵列的抽象,它向操作系统提供虚拟磁盘,而物理卷和逻辑卷是操作系统用来将这些虚拟磁盘划分为更小的独立文件系统的抽象。
服务器使用文件系统协议与存储进行通信。示例协议包括用于 UNIX 系统的网络文件系统 (NFS) 和用于 Windows 系统的通用 Internet 文件系统 (CIFS)。此类设备称为网络连接存储 (NAS) 设备,因为将存储直接连接到服务器是没有意义的。这个名字有点用词不当,因为像 FC-AL 这样的存储区域网络也可用于连接到块服务器。术语“文件管理器”通常用于仅提供文件服务和文件存储的 NAS 设备。Network Appliance 是最早制造文件管理器的公司之一。
异步I/O
I/O 的简单方法是请求数据,然后开始使用它。然后,操作系统切换到另一个进程,直到所需数据到达,然后操作系统切换回请求进程。这种样式称为同步 I/O,该进程会一直等到从磁盘读取数据。
另一种模型是让进程在发出请求后继续,并且在尝试读取请求的数据之前不会被阻止。这种异步 I/O允许进程继续发出请求,以便可以同时运行许多 I/O 请求。异步 I/O 与无序 CPU 中的缓存具有相同的理念,无序 CPU 通过具有多个未完成事件来实现更大的带宽。
常见文件/命令
sudo dumpe2fs /dev/*
查看superblock内容展示
dmidecode
查看dmi(Desktop Management Interface)桌面管理接口
lshw -short
hdparm -i /dev/sda
smartctl -a /dev/sda
仅显示设备的所有 SMART 属性信息
iostat 参数
%user
显示在用户级别(应用程序)执行时发生的CPU利用率百分比
%nice
显示在用户级别执行时具有较高优先级的CPU利用率百分比
%system
显示在系统级别(内核)执行时发生的CPU利用率百分比
%iowait
显示在系统有未完成的磁盘I / O请求期间,一个或多个CPU空闲的时间百分比
%steal
显示在管理程序为另一个虚拟处理器提供服务时,一个或多个虚拟CPU在非自愿等待中花费的时间百分比
%idle
显示一个或多个CPU空闲且系统没有未完成的磁盘I / O请求的时间百分比
tps
设备每秒的传输次数。传输是对设备的I / O请求。可以将多个逻辑请求合并为对设备的单个I / O请求。"一次传输"意思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。指示写入设备的数据量,以每秒的块数(千字节,兆字节)表示
Blk_read/s (kB_read/s, MB_read/s)
表示从设备读取的数据量,以每秒的块数(千字节,兆字节)表示。块等同于扇区,因此大小为512字节。
Blk_wrtn/s (kB_wrtn/s, MB_wrtn/s)
表示写入设备的数据量,以每秒的块数(kB,MB)表示
Blk_dscd/s (kB_dscd/s, MB_dscd/s)
表示设备每秒丢弃的数据量,以每秒的块数(kB,MB)表示
Blk_read (kB_read, MB_read)
读取的总块数(kB,MB)
Blk_wrtn (kB_wrtn, MB_wrtn)
写入的总块数(kB,MB)
Blk_dscd (kB_dscd, MB_dscd)
丢弃的总块数(kB,MB)
r/s
每秒设备完成的读取请求数(合并后)
w/s
每秒设备完成的写请求数(合并后)
d/s
每秒设备完成的丢弃请求的数量(合并后)
sec/s (kB/s, MB/s)
每秒从设备读取,写入或丢弃的扇区数(kB,MB)
rsec/s (rkB/s, rMB/s)
每秒从设备读取的扇区数(kB,MB)
wsec/s (wkB/s, wMB/s)
每秒写入设备扇区数(kB,MB)
dsec/s (dkB/s, dMB/s)
每秒为设备丢弃的扇区数(kB,MB)
rqm/s
每秒排队到设备中的I / O请求的数量
rrqm/s
每秒排队到设备中的合并的读取请求数
wrqm/s
每秒排队到设备中的合并写入请求的数量
drqm/s
每秒排队到设备的合并的丢弃请求数
%rrqm
读取请求在发送到设备之前已合并在一起的百分比
%wrqm
写入请求在发送到设备之前已合并在一起的百分比
%drqm
丢弃请求在发送到设备之前已合并在一起的百分比
areq-sz
发出给设备的I / O请求的平均大小(以千字节为单位)
rareq-sz
发出给设备的读取请求的平均大小(以千字节为单位)
wareq-sz
发出给设备的写请求的平均大小(以千字节为单位)
dareq-sz
发出给设备的丢弃请求的平均大小(以千字节为单位)
await
发出给要服务的设备的I / O请求的平均时间(以毫秒为单位)。这包括队列中的请求所花费的时间以及为请求服务所花费的时间
r_await
发送给要服务的设备的读取请求的平均时间(以毫秒为单位)。这包括队列中的请求所花费的时间以及为请求服务所花费的时间
w_await
发布给要服务的设备的写请求的平均时间(以毫秒为单位)。这包括队列中的请求所花费的时间以及为请求服务所花费的时间
d_await
发出要服务的设备的丢弃请求的平均时间(以毫秒为单位)。这包括队列中的请求所花费的时间以及为请求服务所花费的时间
aqu-sz
发出到设备的请求的平均队列长度
%util
向设备发出I / O请求的经过时间百分比(设备的带宽利用率)。当串行服务请求的设备的此值接近100%时,将发生设备饱和。但是对于并行处理请求的设备(例如RAID阵列和现代SSD),该数字并不反映其性能限制
avgqu-sz
是平均请求队列的长度。毫无疑问,队列长度越短越好。
await:
每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm:
表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。
%util:
在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
FLASH
Flash属于EEPROM(电可擦除可编程只读存储器),Flash存储器又分为Flash芯片设备(Raw Flash device,包括EEPROM,也叫MTD设备)和带Flash控制器的设备(Flash Translation Layer device, FTL设备),两者的关键区别是是否带有Flash控制器,这也直接决定了文件系统分为不同的两类。
其中MTD设备包括NOR Flash、NAND Flash等,SSD、MMC、eMMC、RS-MMC、SD、mini-SD、micro-SD、USB 闪存驱动器、CompactFlash、MemoryStick、MemoryStick Micro 和其他 FTL 设备是块设备。
如图 2.1和图 2.2所示JFFS2、YAFFS2、UBIF、LogFS支持MTD设备,FAT、EXT3/4、XFS和Btrfs支持 FTL设备和硬盘(HDD)。MTD设备对应的设备文件为/dev/mtd,FTL设备对应的设备文件可为/dev/mtdblock。
绝大部分手机和平板等移动设备中所使用的 eMMC 内部的 Flash Memory 都属于 NAND Flash。PC 中的固态硬盘中也是使用 NAND Flash。
文件系统
inode:每个文件对应的信息,包括磁盘上的和内存上的,每个文件都有对应的inode
/dev/×:dev下的文件对应一个inode,这个inode是入口,用于找到设备
page cache:读写时如果通过page cache,会在内存上开辟一块区域并分配一个inode,通过这个inode快速访问需要的区域
bios 检测 efi 分区,efi分区启动文件设定挂载的boot分区和根文件系统分区,之后启动 UEFI 引导不同内核的操作系统,根据boot分区里面的initramfs和kernel文件启动操作系统,系统启动时会根据efi启动文件中的参数挂载根文件系统分区,并重新挂载boot分区
DM指的是整个Device Mapper的设计框架。MD(Mapped Device)是框架所虚拟出来的各种设备。简而言之DM就是不同种类的MD经过特定的关系连接到块设备管理器上的大构架。
DM的内核代码集中在drivers/md目录中。DM构架相关的代码在dm.c和dm-io.c文件中,各种抽象的MD虚拟设备代码分散在同目录的其他文件中,除了dm-ioctl.c是dm设置接口设备。
Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备。
DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射”)于DM结构下的块设备,不管他们是如何组织,如何通讯,在Linux看来都是一个完整的DM块设备。因此DM让不同组织形式的块设备或者块设备集群在Linux内核面前有一个完整统一的DM表示。
sb=get_super(inode->i_dev)
block = 2 + sb->s_imap_blocks + sb->s_zmap_blocks + (inode->i_num-1)/INODES_PER_BLOCK;
bh=bread(inode->i_dev,block)
*(struct d_inode *)inode = ((struct d_inode *)bh->b_data)[(inode->i_num-1)%INODES_PER_BLOCK];
open: 获取root inode,建立dir_entry与/关联
查找文件/foo/bar过程
1.通过super block先找到/的inode
2.通过/的inode找到对应的block数据
3.从block数据中找到foo对应的inode,内存上已经建立了/的dentry结构,可以直接通过dentry找到foo对应的dentry
4.从foo的inode对应的block数据中找到bar对应的inode,现在对应的是从foo的dentry找到bar对应的dentry,从dentry中找到bar的inode
4.1.用nameidata保存中间查找信息,主要是path信息,path包含dentry和vfsmount,vfsmount表示dentry和super_block之间的关系
4.2."nameidata->path->dentry"暂存的是路径中当前解析的最后一个dentry,如果某一个目录节点是另一个文件系统的mount point,那么将借助"nd->path->mnt"跳转到新的文件系统继续查找
5.找到inode后创建file与inode关联
block_device super_block
| |
gendisk - > backing_dev_info
|
block_device_operations
/dev/xxx → inode → block_device(i_bdev) → bd_inode 这个 inode 更紧密地参与到块设备的 I/O 中,/dev中的原始 inode 只是一个指针
gendisk 上方是一个或多个struct block_device,正如我们已经看到的,它是从/dev中的 inode 链接的。当一个 gendisk有一个分区表时,它可以与多个block_device结构相关联。将有一个block_device代表整个 gendisk,可能还有一些其他的 block_device 代表 gendisk 中的分区。
“md”(用于软件 RAID)和“dm”(例如,用于 LVM2)
| block_device | block_device | block_device |
gendisk
block_device不仅可以表示一个完整的逻辑设备,还可以表示一个逻辑块设备中的一个分区。如果是一个完整的块设备,'bd_part'代表这个设备的分区信息。如果是分区,'bd_contains' 表示属于哪个块设备。当一个块设备或它的分区已经打开时,内核会创建一个'block_device',我们将在后面讨论。'block_device' 用于连接虚拟文件系统和块设备驱动程序,因此块设备驱动程序几乎没有机会控制它。“block_device”通常与“bdev”文件系统一起使用。