存储 (Storage)
存储是用于保有数据的技术。
目前计算机存储采用的技术方式主要有以下几种:磁介质(硬盘,磁带),半导体(内存,固态硬盘,闪存卡等),光介质(光盘)等。不同的存储方式在各方面具有不同的特点,如易失性(断电是否失去数据),容量大小,读写支持(读写,只读,快读慢写,一次性写入等),数据存取方式(连续存取,随机存取),性能(如延迟,吞吐量等),能耗等。
下文所说的存储指二级存储,又称外存,或辅存。与此对应的主要存储是指内存,即“运行内存”。事实上只有这一种内存,把移动设备的持久化存储称为内存在技术上是错误的,这些其实是外存。外存与内存的区别在于是否能直接与 CPU 连接。常见的外存设备包括硬盘,固态硬盘等。
硬盘 (HDD, Hard Disk Drive)
硬盘是一种电子机械设备,使用转动的磁盘和可平面移动的磁头来存取数据。
硬盘的存取延迟一般在几毫秒左右。它支持随机存取,每秒大概几十次到二百次。硬盘适用于连续存取较多的场景如多媒体数据或备份等,其吞吐量可达到 100 ~ 200 MB/s.
硬盘驱动器中可以有多张磁碟,互相平行重叠,碟间和两侧有读写磁头(Head)。每张碟被划分为若干个同心圆,称为磁道(Track),每个磁道划分为多个扇区(Sector);所有碟相同位置的磁道构成一个柱面(Cylinder)。硬盘可以通过 CHS 方式对每个扇区进行寻址:Cylinde 编号(0 ~ 1023),Head 编号(0~254),Sector(1 ~ 63)。这种方式在常见的 512 字节扇区大小下,能处理的最大硬盘容量是 7844 GB。历史上这些值直接对应硬盘的内部的物理器件,但随着存储密度的增大,硬盘向 BIOS 报告的参数也变为了逻辑数据。为解决更大容量的寻址问题,同时提升部分场景的性能,AF (Advanced Formatting) 技术将扇区大小调整为 4 KB。较新的存储系统现在主要采用 LBA(Logical Block Addressing) 寻址方式,直接使用 32 位或 64 位的扇区编号。
硬盘根据磁极与盘面的方向关系可分为 LMR 和 PMR 两种。LMR(Longitudinal Magnetic Recording, 纵向磁性记录)仅用于早期的硬盘,磁极与盘面平行。PMR(Perpendicular Magnetic Recording, 垂直磁性记录)是目前所有硬盘都采用的技术,磁极与盘面垂直,这样能做到更高的数据密度。PMR 又分为两种:CMR 和 SMR。CMR(Conventional PMR) 中磁道之间留有空白区域,以避免存取时与相邻磁道相互影响。SMR(Shingled Magnetic Recording , 叠瓦磁性记录) 中磁道间没有间隔,修改数据时需要特殊处理,以免影响相邻磁道。SMR 提升了数据存储密度,在性能和稳定性上做了一定的妥协。
硬盘的“硬”字是相对于软盘而言的。软盘(Floppy disk)是一种可移动的磁存储媒体,塑料硬壳里边的盘片使用较软的聚酯薄膜制成。硬盘的盘片则由铝或玻璃制成。
固态硬盘 (SDD, Solid-state Drive/Solid-state Disk)
固态硬盘使用闪存芯片存储数据。
固态硬盘的存取延迟一般在几十到几百微秒之间。随机存取每秒可以达到千次以上,并且可在内部使用类似 RAID 0 的技术进一步提升性能。吞吐量一般大于硬盘,高端的产品甚至经常被物理接口(SATA, PCIE等)所限制。
由于 NAND(Not AND) 闪存的特性,固态硬盘长期不通电会损失数据(正常室温情况下若干年)。闪存芯片可按字节读取,但是写入时则只能在特定情况下进行:代表 1 的位(bit)可被改写为 0, 反之则不行;只有整块(一般单块在 16KB 到 512KB 之间)擦写才能将 0 变为 1。闪存具有有限的 P/E 周期(Program-Eraspe),数据写入量过大会造成写入耗尽(wear out)。由于这些特性,针对固态硬盘,固件及软件系统需要进行相关的处理,才能将保持高性能和保证设备状态。文件系统可以发送 TRIM 命令,通知 SSD 块已经不再使用,可以擦除;固件可能会将数据分布到不同的位置,以平衡不同块的写入量。
固态硬盘里边没有“盘”。它不包含可运动的机械装置,因此称为“固态”。它也不包含磁性组件,但是由于习惯和翻译的原因,通常还是把它和硬盘等可按块随机访问的二级存储设备统称为磁盘(disk)。
S.M.A.R.T (Self-Monitoring, Analysis and Reporting Technology)
磁盘可能因为机械磨损,材料降级等原因发生故障。为增强数据安全性,现代的磁盘基本都支持通过 S.M.A.R.T. 向软件系统报告自身健康状态。S.M.A.R.T. 标准仅定义了软硬件间通信的接口协议,并未规定具体的监控指标(Attribute, 特性),因此不同厂商的产品或不同的产品系列报告的数据意义并不完全相同。
S.M.A.R.T 报告的数据中,有一个最基本的状态,代表是否已超过健康阈值。另外还有一系列的指标,每个指标包含以下几个值:
- ID,整数,指标的标识,由厂商定义,但有部分是通用的
- 原始值(Raw value),整数,其意义由厂商定义
- 正规值(Normalized value),1 到 253 之间,通常默认为 100,数字越小代表磁盘健康情况越差
- 最差值(Worst value),代表历史记录到的最差的正规值
- 阈值(Threshold value),当正规值小于或等于该值时,磁盘的健康程度已经到达了临界点,必须进行处理了
部分较关键的通用指标包括 5(0x05, Reallocated Sectors Count,重映射扇区数), 10(0x0A, Spin Retry Count,旋转重试次数), 187(0xBB, Reported Uncorrectable Errors, 无法使用硬件 ECC 恢复的错误次数), 196(0xC4, Reallocation Event Count, 重映射事件次数),197(0xC5, Current Pending Sector Count,待重映射扇区数) 等。
独立磁盘冗余阵列 (RAID, Redundant Array of Independent Disks)
RAID 技术用于将多个二级存储设备(下称磁盘)虚拟为一个,以提升性能和/或安全性。 RAID 有不同的等级,分别达到不同的整合效果。常用的等级有以下几种:
RAID 0 将两个以上的磁盘并联,提供多倍容量,多倍性能。数据无冗余,无容错,单个磁盘损坏时会丢失所有数据。
RAID 1 使用两个以上的磁盘互为镜像,提供单盘的容量,多倍读取性能,略低于单盘的写入性能。只有所有磁盘同时损坏才会丢失数据。
RAID 5 使用三个以上的磁盘分布式存储数据和容错信息。读写性能稍低于 RAID 0, 单个磁盘损坏时不会丢失数据。
RAID 6 类似 RAID 5,存储两份容错信息,使用四个以上磁盘。读写性能类似 RAID 5。两个以内磁盘损坏时不会丢失数据。
RAID 10 为 RAID 1 和 RAID 0 的结合,以更高的代价同时提供性能和安全性。
文件系统 (FS, File System)
文件系统是用于在存储介质上组织和存取数据的软件。它提供了数据分组的抽象机制(文件,目录等),以及在此抽象机制上的操作接口。文件系统有很多种,以适应不同的底层存储机制(如硬盘,光盘,网络等),达到不同的设计目标(如速度,灵活性,安全等)。
磁盘文件系统 (Disk file system)
磁盘文件系统借助于磁盘的随机读写能力,提供方便而高效的文件服务。它通常把存储介质抽象为卷(Volume),即逻辑磁盘,一个卷可能对应一个或多个物理磁盘或磁盘分区。常见的磁盘文件系统包括以下几种:
FAT(File Allocation Table) 家族是支持最广泛的文件系统。FAT 把卷的空间分为三个部分:目录表,文件分配表和数据区。其中数据区被分为不同的簇(cluster),每个簇包含 N (N 可以为 1, 2, 4, 8, 16, 32, 64, 128)个物理连续的扇区。文件内容存储在这些簇中,单个文件至少占用一个簇。文件分配表中为记录了每个簇的使用情况:未使用,文件末尾,同文件下个簇的编号。这样,文件内容所使用的簇就形成了一个单链表。磁盘上存有两份文件分配表,以便在数据损坏或硬件故障时进行恢复。目录表中记录每个文件/目录的名称,属性,存取日期等元数据,以及内容起始簇的编号等。FAT 中文件名最长为 8 个字符加上 3 个字符的扩展名(称为 8.3 文件名格式),Windows 95 以后对此进行了扩展,最多可达 255 个 UCS-2 字符。目前最常用的 FAT32 中单个文件不能超过 4 GB,单卷(逻辑磁盘)不能超过 2 TB(格式化为 4KB 扇区时为 16 TB)。
exFAT 是在 FAT32 的基础上,专门为闪存设备设计的文件系统,通常用于移动存储,移动设备或嵌入式系统。它放宽了 FAT32 对文件和卷尺寸的限制。exFAT 中只有一份文件分配表,它支持对连续的文件内容使用扩展(extend),而忽略文件分配表中的数据,从而减少了文件修改时对闪存的写入量。Windows 10 仅允许 32 GB 以上的分区格式化为 exFAT, 更小的分区会被推荐使用 FAT32 格式。
NTFS (New Technology File System) 是 Windows 的默认文件系统,在 macOS 和 Linux 中也能作为只读装载。NTFS 中,文件/目录的所有信息都是属性(Attribute),包括文件内容(称为流,一个文件可以有多个流,其中至少有一个是默认流,其它的需要单独命名)。这些属性都保存在主文件表(Master File Table, MFT)的记录里,每条记录大小为 1 KB。如果空间足够,一个文件仅需要这么一条记录即可,无需另外分配磁盘空间;如果空间不足以容纳所有的属性,则会把部分属性存储在同卷的其它地方,在MFT中记录这些位置。NTFS 使用了日志系统,保证文件系统元数据不被意外破坏。
ext系列(ext2/ext3/ext4)是 Linux 下常用的文件系统。ext2 中每个文件或目录对应一个索引节点(inode, index node),其中记录了文件的尺寸,权限等信息,以及数据块的位置(指针)。单个 inode 中可以有 15 个指针:其中前 12 个直接指向数据块;第 13 个是间接指针,它指向一个指针块,指针块中包含若干指向数据块的指针;第 14 个是双重间接指针,指向指向指针块的指针块;第 15 个是三重间接指针。ext3 在 ext2的基础上增加了日志功能,提升了系统故障时的容错性。ext4 支持更大的卷,为元数据和日志添加了校验码,同时在其它方面也有更多的改进。这些文件系统也可以通过第三方软件在 Windows/macOS 中受限使用(部分特性不受支持)。
ZFS 是一种独特的先进文件系统,在 Solaris 操作系统中原生可用,也可通过第三方软件在 Linux/macOS 中使用。ZFS 为长期大量数据存储而设计,有多种安全措施来防止软硬件错误带来的数据丢失:所有数据都存有多层级校验码,数据和校验码可存储多份,支持写入日志,提供软 RAID。功能上它支持快照,写时复制(copy-on-write);性能上,ZFS 支持多级缓存设备,如内存和固态硬盘。与大部分其它文件系统不同的是,ZFS 还提供了虚拟设备的功能,在虚拟设备上可以使用其它文件系统,这样可以用 ZFS 提供优异的性能和数据安全性,同时使用其它文件系统的功能。ZFS 是新一代文件系统中较为成熟和完善的,但是潜在的版权法律问题,限制了它在 Linux 各发行版中的采用率。
Btrfs(B-tree file system) 基于写时复制(copy-on-write)的原则,解决传统文件系统中欠缺存储池,快照,校验码,多设备整合等功能的问题。功能上它和 ZFS 类似,经过完善和成熟后,有希望成为未来 Linux 的默认文件系统。
ReFS(Resilient File System) 是微软设计开发的新一代文件系统,类似 ZFS 和 Btrfs,尚未大规模普及,目前仅在 Windows Server 和 Windows 10 企业版本可用。
网络文件系统 (Network File System)
网络文件系统作为远程文件访问协议的客户端,提供服务器上文件的存取服务。常见的网络文件系统(及类似系统)包括以下几种:
NFS(Network File System) 是一套分布式文件系统协议的开放标准。目前主要在 *nix 系统上应用,在 macOS 和 Windows 下使用较少。目前主流使用的 NFS v3 以上版本,可选使用 TCP 或 UDP 作为底层传输协议。NFS v4 及以后的版本只使用一个端口 2049。
SMB(Server Message Block) 也叫 CIFS(Common Internet File System),是 Windows 自带的网络协议,用于共享文件,打印机等。macOS 自带了 SMB 支持, Linux 可使用包
cifs-utils
和samba
来使用该协议。SMB v2.0 及以后的版本基于 TCP, 使用端口 445。9P(Plan 9 File System Protocol) 是一套轻量级的远程文件系统协议,经常用于虚拟机与外界的文件共享。WSL2(Windows Subsystem for Linux 2) 就使用了该协议与 Linux 文件系统交互。 9P 通常使用 TCP 端口 564。
WebDAV(Web Distributed Authoring and Versioning) 是 HTTP 的扩展,允许客户端执行远程文件编辑操作。它在标准的 HTTP 方法(GET, POST, PUT, DELETE 等)外,添加了新的方法:COPY, LOCK, UNLOCK, MKCOL, MOVE, PROPFIND, PROPPATCH。主流 HTTP 服务器(Nginx, Apache, IIS 等)都有内置或第三方的 WebDAV 支持,部分私人云软件(ownCloud, Nextcloud等)也支持 WebDAV 访问方式。 Windows 集成了 WebDAV 客户端。WebDAV 和 HTTP/HTTPS 使用相同的端口,默认为 80 和 443。
FTP(File Transfer Protocol) 是用于文件传输的标准网络协议,应用十分广泛。FTP 的控制流和数据流使用不同的端口(通常是21 和 20)。数据连接可选主动或被动模式,被动模式下服务器侦听客户端的请求,可解决客户端由于 NAT 或防火墙等原因无公开端口的问题。 FTP 可设置为匿名连接,也可使用明文传输的用户名/密码进行身份认证。FTPS(FTP Secure) 在 FTP 的基础上增加了数据加密的功能,以提升安全性,它通常使用 990(控制)和 989 端口。
SFTP(SSH File Transfer Protocol) 用于在安全数据连接上管理和传输文件。它是 SSH(Secure Shell)协议的扩展,通常由 SSH 服务器提供支持,但是也可以作为独立的文件服务使用。一般 SFTP 和 SSH 使用同一端口 22。