存储器技术和linux下的磁盘管理工具介绍
存储器技术和linux下的磁盘管理工具介绍
1引言
声明
部分资料参考至网络,如有侵权请联系笔者删除。
编写目的
本文档主要是介绍磁盘管理技术以及linux下的磁盘管理工具。
术语及名词解释
Acronyms & Abbreviations | Description |
---|---|
MBR | Master Boot Record 主引导记录(一种磁盘分区结构) |
GPT GUID | Partition Table 全局唯一分区表(一种磁盘分区结构) |
FAT File | Allocate Table 文件分配表(一种广泛使用的文件系统、FAT32) |
exFAT | Extended File Allocation Table File 拓展文件分配表(又称FAT64) |
NTFS | New Technology File System 新技术文件系统 |
ext | Linux extended file system linux扩展文件系统,目前发展到ext4 |
fdisk | Linux下一种用于磁盘分区的工具 |
parted | Linux下一种用于磁盘分区的工具 |
参考资料
链接: parted工具.
链接: 分区结构.
链接: 文件系统介绍.
链接: linux下的文件系统.
2 简介
本文主要介绍了目前常用的“分区结构”、“文件系统”以及“linux下的磁盘管理”工具。
分区结构:
MBR分区结构
GPT分区结构
磁盘类文件系统:
FAT32
NTFS
exFAT
ext
Flash类文件系统:
jffs
yaffs
logfs
cramfs
romfs
ubifs
RAM类文件系统:
ramdisk
tmpfs
磁盘管理工具:
df
fdisk
parted
mkfs
fsck
mount/umount
分区结构
3.1 MBR分区结构
MBR分区结构中的0号扇区又被称作“MBR”扇区,扇区大小512字节。其中包含3块内容:
引导代码:引导代码占MBR分区的前440字节,负责整个系统启动。如果引导代码被破坏,系统将无法启动。
磁盘签名:4个字节签名+0x00,0x00
MBR分区表:引导代码后的64个字节,是整个硬盘的分区表。有四张分区表
MBR结束标志:占MBR扇区最后2个字节,一直为“55 AA”。
3.1.1 MBR分区表
MBR一共占用64个字节,其中每16个字节为一个分区表项。也就是在MBR扇区中只能记录4个分区信息,可以是4个主分区,或者是3个主分区1个扩展分区。
字节偏移(hex) | 字段长度 | 字段名和定义 |
---|---|---|
1BE | 1B | 引导标志(Boot Indcator);指明该分区是否是活动分区。 |
1BF | 1B | 开始磁头(Start Head) |
1C0 | 6b | 起始扇区(Start Sector)6位,6~7位被“起始柱面”占用 |
1C1 | 10b | 起始柱面(Start Cylinder):10位 |
1C2 | 1B | 分区类型(Partition type indicator);详见下表 |
1C3 | 1B | 结束磁头(END Head) |
1C4 | 6b | 结束扇区(END Sector)6位,6~7位被“结束柱面”占用 |
1C5 | 10b | 结束柱面(End Cylinder):10位 |
1C6 | 4B | 扇区偏移量(Sectors preceding partiton) |
1CA | 4B | 分区扇区数(Sectors in partition)。 |
3.1.2 拓展分区
MBR分区由于仅仅支持4个分区,为了使用更多的分区,从而引入了“拓展分区”的概念。在“拓展分区”中存在一个类似“MBR”的一个“拓展引导记录”(EBR)。EBR中不包含“引导代码”,即在EBR中前446个字节是空的。EBR中包含2个有效的内容:
EBR分区表:有两个表项,第一个表项描述“逻辑分区”,第二个表项则指向下一个逻辑分区的EBR。
EBR结束标志“55 AA”
3.2 GPT分区结构
GPT分区结构解决了MBR只有4个主分区的缺点,理论上而言,GPT磁盘结构对分区数量上是没有限制的,但是某些操作系统对此会有限制。
3.2.1 保护MBR
保护MBR位于GPT磁盘的第一个扇区,即0号扇区,其中的结构同传统的MBR结构一致,但是内容上有所不同:
引导代码:占440个字节,但是内容是空的。
磁盘签名:4字节+0x00,0x00
MBR分区表:引导代码后的64个字节,只有一张分区表。
MBR结束标志:占MBR扇区最后2个字节,一直为“55 AA”。
保护MBR的内容对于GPT分区本身而言是没有用处的,它的存在只是为了兼容MBR分区结构,让系统认为这个磁盘是合法的。
3.2.2 GPT头
GPT头位于GPT磁盘的第二个磁盘,也就是1号扇区,该扇区是在创建GPT磁盘时生成,GPT头会定义分区表的起始位置,分区表的结束位置、每个分区表项的大小、分区表项的个数及分区表的校验和等信息。
3.2.3 分区表
每个分区表项中记录着分区的起始,结束地址,分区类型的GUID,分区的名字,分区属性和分区GUID
3.2.4 分区区域
GPT分区区域就是用户使用的分区,也是用户进行数据存储的区域。分区区域的起始地址和结束地址由GPT头定义。
3.2.5 GPT头备份
GPT头有一个备份,放在GPT磁盘的最后一个扇区。
3.2.6 分区表备份
分区区域结束后就是分区表备份,其地址在GPT头备份扇区中有描述。分区表备份是对分区表32个扇区的完整备份。如果分区表被破坏,系统会自动读取分区表备份,也能够保证正常识别分区。
3.3 两种分区结构的对比
分区结构 | MBR | GPT |
---|---|---|
最大容量 | 2TB | 18EB |
主分区数量 | 4 | 无限制 |
注意:1EB=1024PB,1PB=1024 TB
4 常见文件系统
4.1 基于磁盘的文件系统
文件系统 | FAT32 | NTFS | exFAT |
---|---|---|---|
操作系统 | Win 95 OSR2之后 | Windows2000之后 | Windows CE 6/Vista SP1/Windows 8 |
最小扇区 | 512Bytes | 512Bytes | 512Bytes |
最大扇区 | 64KB | 64KB | 32768KB |
最大单一文件 | 2Bytes-4GB | 受最大分割容量 | 16EB(理论值 |
最大格式化容量 | 2TB(但NT内核系统限制为32GB) | 2TB~256TB(受MBR影响,GPT分区格式可以更大) | 16EB(理论值)(目前支持到256TB) |
档案数量 | 4194304 | 无 | 至少可以大于1000 |
文件系统 | 最大文件名长度 | 最大文件大小 | 最大分区大小 |
---|---|---|---|
ext2 | 255 bytes | 2 TB | 16 TB |
ext3 | 255 bytes | 2 TB | 16 TB |
ext4 | 255 bytes | 16 TB | 1 EB |
XFS | 255 bytes | 8 EB | 8 EB |
Btrfs | 255 bytes | 16 EB | 16 EB |
4.2 基于FLASH的文件系统
Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦 除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为 单位进行的。
闪存主要有NOR和NAND两种技术(简单比较见附录)。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因 此,必须针对Flash的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系统会有诸多弊端。
在嵌入式Linux下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上 面的Linux下的文件系统结构图)。使用MTD驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有 更好的支持、管理和基于扇区的擦除、读/写操作接口。顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。
4.2.1 jffs2
JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系 统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux, uCLinux中。
Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2)
主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。
目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。
jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另 外,jffsx文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。
JFFS2
https://www.ibm.com/developerworks/cn/linux/l-jffs2/
4.2.2 yaffs
yaffs/yaffs2(Yet Another Flash File System)是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数 据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。
yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。
yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。
4.2.3 Cramfs
Cramfs(Compressed ROM File System)是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。
在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。
Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并 不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目 前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时 解压缩到RAM中。
另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。
由于以上特性,Cramfs在嵌入式系统中应用广泛。
但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。
Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback 设备可以把它安装别的文件系统里。
4.2.4 Romfs
传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以 XIP(eXecute In Place,片内运行)方式运行,在系统运行时,节省RAM空间。uClinux系统通常采用Romfs文件系统。
4.2.5 UBIFS
UBIFS最早在2006年由IBM与Nokia的工程师Thomas Gleixner,Artem Bityutskiy所设计,专门为了解决MTD(Memory Technology Device)设备所遇到的瓶颈。由于Nand Flash容量的暴涨,YAFFS等皆无法再去控制Nand Flash的空间。UBIFS通过子系统UBI处理与MTD device之间的动作。与JFFS2一样,UBIFS 建构于MTDdevice 之上,因而与一般的block device不兼容。
UBIFS在设计与性能上均较YAFFS2、JFFS2更适合MLC NAND FLASH。[1]例如:UBIFS 支持 write-back, 其写入的数据会被cache, 直到有必要写入时才写到flash, 大大地降低分散小区块数量并提高I/O效率。UBIFS文件系统目录存储在flash上,UBIFS mount时不需要scan整个flash的数据来重新创建文件目录。支持on-the-flight压缩文件数据,而且可选择性压缩部份文件。另外UBIFS使用日志(journal),可减少对flash index的更新频率。
https://www.cnblogs.com/youngerchina/p/5624559.html
4.3 基于RAM的文件系统
4.3.1 Ramdisk
Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。
在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。
4.3.2 ramfs/tmpfs
Ramfs是Linus Torvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。)
Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。
Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。
5 Linux下的磁盘管理工具
磁盘管理,即查看磁盘的信息(如大小、使用量、挂载点等等)、对磁盘进行分区、对磁盘中的某个分区格式化、检查或者修复磁盘中的某个分区等等。
5.1 df
显示文件系统的信息。
常用用法:
df –hT
5.2 fdisk
fdisk是一种磁盘分区工具,它默认采用MBR分区结构。因此它适用于小分区。但是较新的fdisk工具也支持建立GPT分区结构等其它类型的分区结构。
fdisk -l 列出系统下的磁盘设备
fdisk /dev/vdc 对vdc进行分区操作
5.3 parted
parted也是一种磁盘分区工具,与fdisk不同的是它默认采用GPT分区结构。因此它一般用于规划大小超过2T的分区,也可以用于小分区的规划。使用方法和fdisk工具类似。
parted -l 列出系统下的磁盘设备
parted /dev/vdc 对vdc进行分区操作
5.4 mkfs
磁盘分区格式化,分区分割完毕后,利用本工具来对磁盘中的某个分区进行格式化操作。
可以使用“-t”选项来指定文件系统类型,也可以直接使用mkfs.[fs]的方式来指定文件系统类型。
例如,格式化为fat32文件系统
mkfs.fat /dev/sdb1
5.5 fsck
文件系统检验,用于检查或者修复文件系统。
可以使用“-t”选项来指定文件系统类型,也可以直接使用fsck.[fs]的方式来指定文件系统类型。
例如,检查/dev/sdb1分区
fsck.vfat -a /dev/sdb1
5.6 mount/umount
文件系统挂载/卸载