磁盘及文件系统管理
欢迎来到 来到大浪涛天的博客 !
一、磁盘及文件系统管理
1. 计算体系简介:
- 在计算机系统里,最重要的三大组件是计算器,存储器,IO交互。
- 计算器主要是指cpu,目前cpu的主频很高,运行速度很快,而普通的IO设备读取又很慢,瓶颈非常严重。
- 内存的出现,在cpu和内存通过总线,cpu需要处理的数据提前从硬盘提前到内存,然后再转入cpu处理,cpu处理完成后再返回内存,内存再写入硬盘。
- 在一些比较高端的cpu上,如i5或者i7甚至i9,因为cpu内含多核心多线程,处理速度急速上升,内存也不能完全满足,因此在cpu上自带缓存器,1级缓存,2级缓存,3级缓存等等。
- 所以说目前的计算领域中硬件的瓶颈都是体现在IO设备上。
- IO主要是硬盘(块设备)和显示器键盘(字符设备)类的设备,其中硬盘因为是作为主存储器,在数据为王的时代里,显得尤为重要。
2. 设备类型
- 块设备(block):随机访问,数据交换单位是“块”。
- 字符设备(character):线性访问,数据交换单位是“字符”。
3. 磁盘分类
- IDE接口:并口,133M/S
- SCSI:并口,320M/S-640M/S
- SATA:串口,6gbps
- SAS:串口,6gbps
- USB:串口,480M/S
- SSD:特别是PCI-E接口的固态硬盘速度达到32gbps,每秒读写速度3000M,和机械硬盘不是一个时代的产品,会成为机械硬盘的替代品。好一点的SAS机械硬盘IOPS只有100多一点,而好一点的企业级固态硬盘
可以达到数十万的IOPS。
4. 机械硬盘结构:

机械硬盘到目前都是采用最原始的技术,慢慢的肯定会沦落到磁带设备的类型,再过几年肯定会被固态硬盘替代。
- 磁道(track)
- 机械臂
- 扇区(sector),一个扇区512个字节
- 柱面(cylinder),不同盘面的同一个编号的磁道就叫柱面,真正的分区划分存储是基于柱面实现的,最靠外的柱面的性能最好,因此最外层磁道较长,单位时间内存储的数据也就越多。
5. 磁盘分区:MBR GPT
MBR(Master boot record)位于0扇区,MBR分为三部分:
- 446byters:bootoader,程序,引导启动操作系统的程序。
- 64byters:分区表,每16byters表识一个分区,所以一共只能标识4个分区。
- 2byters:MBR区域的有效标识,55AA为有效。
6. fdisk命令
6-1. fdisk 命令用法:
fdisk [选项] <磁盘> 更改分区表
fdisk [选项] -l <磁盘> 列出分区表
fdisk -s <分区> 给出分区大小(块数)
fdisk 提供了一个交互式的接口来管理分区,包含一些子命令,分别用于不同的管理功能;所有操作均在内存中完成,没有直接同步到磁盘,直到使用w命令保存到磁盘上。
常用命令:
n 创建新分区
d 删除已有分区
t 修改分区类型
w 保存并退出
q 不保存并退出
m 查看帮助信息
p 打印分区信息
注意:在已经分区并且已经挂载其中某个分区的磁盘设备上创建新分区,内核可能在创建完成后无法直接识别;需要通知内核强制重读磁盘分区表:
查看内核是否识别分区
[root@test01 ~]# cat /proc/partitions
通知内核强制重读磁盘分区表
centos5:partprobe [device]
centos6,7:partx -a [device]; kpartx -af [device]
[root@test01 ~]# partx -a /dev/sda
partx: /dev/sda: error adding partitions 1-2
7. 磁盘格式化
磁盘格式化分为:
- 低级格式化:分区之前完成,磁盘硬件厂商在出厂时完成,用于划分磁道
- 高级格式化:分区之后完成,创建文件系统
7-1. 文件系统
- 文件系统分为元数据区,数据区;
- 元数据区包含文件元数据inode(index node),大小、权限、属主属组、时间戳、数据块指针.....值得注意的是不包含文件名
- 因为inode的格式都是一样的,只是内容不一样,因此创建文件系统的时候会提前把inode都划分好,只是不包含数据,没有使用的inode就是空的,inode的大小都是一样的,大小单位是字节。
- 数据存在block中,block可以在分区的时候决定大小,文件存储按文件的大小一次提供多少block,如果block的使用是连续的表示磁盘良好,如果不连续代表存在碎片。
- 因为block是最小的存储单元,如果需要存储的数据都是小文件,那block设置小一点比较好,如果是大文件,则block可以相对设置大一些,这样性能比较好
- 单个文件的大小是有上限的,原因是inode里包含的数据块的指针存储空间是有限的,当单个文件越大,数据块的指针就越多,这样当大到数据块的指针空间存不下指针后,这样就是大文件的存储上限。
- 企业当中不同的文件系统设计是各不相同的。
- 符号链接文件:存储数据指针的空间当中存储的是真实文件的访问路径,都是不占用block的数据块空间的
- 设备文件:存储数据指针的空间当中存储的是设备的主设备号和次设备号,都是不占用block的数据块空间的
- 任何数据块均必须要元数据来指向,因此inode必须要大于block的3-4倍(具体要根据历史经验来分析),不然inode占用完了,但是block却只用了1/3,剩余的block因为缺少inode指向而无法使用。
- 预留空间,在数据区域有一块数据区预留,防止磁盘空间用满后,供超级管理员来进行操作处理。
- 位图索引,在数据区有一段位置存放位图索引,位置对应每一个数据块,而且只标志0(未使用)-1(已使用)
- 文件系统创建的时候一般会平均分成多个逻辑块组,每个块组包含自己的元数据区和数据区,当一个块组无法存下文件,可以延伸到下一个块组来取block。
- 超级块,里面包含了文件系统分为了多少个块组,每个块组的起止位置,因为超级快本身也是块,因此它也是存在某些的块组当中。
- 每个块组里都包含了一个数据块描述符,数据块描述符包含了块组内含的所有块以及元数据。块组不一定有超级快,但是一定有数据块描述符。
- 每个元数据都包含了一个编号,ls -i可以看到每个元数据的编号,需要查看元数据内容则需要stat 文件名。
- 目录其实是路径的映射,比方/var/log/messages的查找过程:
- 首先定位/的inode,这是固定的,通过/的inode可以在数据区中找到/的数据块
- /的数据块里面包含了所有和/相连接的目录及对应的inode,在/的数据块中定位到/var对应的inode
- 通过/var的inode在元数据区中定位到了/var的数据块,/var的数据块中包含了所有和/var对应的下一级目录以及相应的inode,进而找到/var/log/的inode
- 通过/var/log的inode在元数据区中定位到了/var/log的数据块,/var/log的数据块中包含了所有和/var/log对应的下一级目录以及相应的inode,进而找到/var/log/messages的inode.
- 通过/var/log/messages的inode在元数据区中定位到了/var/log/messages的数据块,此时messages是一个文件,因此inode里包含了所有存储messge这个文件的block的数据块指针,通过这些指针定位到具体数量及位置的block。
7-2. VFS:virtual file system
Linux为了支持各种文件系统,在真实的文件系统上面抽象了一层虚拟层,也就是VFS层,这样用户存储文件因为有VFS做转化不需要关心下层的文件系统。
- Linux支持的文件系统有:ext2、ext3、ext4、xfs、reiserfs、brrfs
- 光盘文件系统:iso9660
- 网络文件系统:nfs、cifs
- 集群文件系统: gfs2、ocfs2
- 内核级分布式文件系统:ceph
- Windows文件系统:vfat、ntfs
- 伪文件系统:proc、sysfs、tmpfs、hugepagefs
- unix文件系统: ufs、ffs、jfs
- 交换文件系统: swap
- 用户空间的分布式文件系统:mogilefs、moosefs、glusterfs
7-3. 文件系统管理工具:
7-3-1. 创建文件系统的工具:mkfs
mkfs.ext2、mkfs.ext3、mkfs.ext4、mkfs.xfs、mkfs.vfat
7-3-2. ext系列文件系统专用管理工具:mke2fs
mke2fs语法:
mke2fs [options] device
mke2fs选项如下:
-t {ext2|ext3|ext4};指明要创建文件系统的类型
mkefs.ext4=mkfs -t ext4=mke2fs -t ext4
-b {1024|2048|4096}:指定文件系统的块大小
-L LABLE:指明卷标
-j:创建具有日志功能的文件系统ext3
mke2fs -j=mke2fs -t ext3=mkfs -t ext3=mkfs.ext3
-i#:指明inode与字节的比率,即多少字节创建一个inode
-N#:直接指明要给此文件系统创建的inode的数量
-m#:指定预留的空间,百分比
-O :以指定的特性创建目标文件系统
7-3-3. ext系列文件系统专用管理工具:e2label
卷标的查看与设定
查看:e2label device
更改:e2label device LABLE
确认: blkid device
7-3-4. ext系列文件系统专用管理工具:tune2fs
查看或修改ext系列文件系统的某些属性,注意块的大小一旦创建文件系统后便无法再次修改
语法:
tune2fs [option] device
修改指定文件系统的属性:
-j:ext2-ext3
-L LABLE:修改卷标
-m# :更改预留的空间,百分比
-O:开启或关闭某种特性
7-3-5. ext系列文件系统专用管理工具:dumpe2fs
文件系统的具体查看:
查看:dumpe2fs -h /dev/sdb (-h 查看粗略信息)
dumpe2fs /dev/sdb (不带h是显示详细信息)
7-3-6. 检测及修复文件系统的工具:fsck
fsck.ext2、fsck.ext3、fsck.ext4、fsck.xfs、fsck.vfat
因进程意外中止或系统奔溃等原因导致既定操作非正常终止时可能导致文件损坏,此时应该检测并修复文件系统,建议离线进行。
ext系列文件系统的专用修复工具:e2fsck - check a Linux ext2/ext3/ext4 file system
语法:
e2fsck [option] device
选项:
-y:对所有问题自动回复为yes
-f:即使文件系统处于clean状态,也强制进行检测
LINUX的通用修复工具:fsck - 检查并修复Linux文件系统
语法:
fsck [option] device
选项:
-t fstype:指定文件系统,不指定也可以
-a:自动修复所有的错误,不建议使用,fsck修复就是删除日志区所有未完成写入的文件,可能会丢数据导致欲哭无泪
-r:交互式修复错误
7-3-7. blkid
blkid - locate/print block device attributes
用法:
blkid device
定位设备
blkid -L LABLE:通过卷标来定位设备
blkid -U UUID:通过UUID来定位设备
7-3-8. 查看文件系统属性的工具
dump2fs、tune2fs
7-4. 链接文件
链接文件是:指向一个文件的不同路径,分为硬链接和软链接
7-4-1. 硬链接:指向同一个inode的多个文件路径
- 目录不支持硬链接(防止死循环)
- 硬链接不能跨文件系统,因为硬链接和原文件具有相同的inode,而不同的文件系统inode分配不同
- 创建硬链接会增加inode的引用计数。
7-4-1-1. 创建方法
ln src link_file
7-4-2. 软链接:符号链接,指向一个文件路径的另一个文件
- 符号链接与原文件是两个相互独立的文件,各有各自的inode,对原文件创建符号链接不会增加引用计数。
- 支持对目录创建符号链接,可以跨文件系统
- 删除符号链接文件不影响原文件,但是删除原文件,符号指定的路径不存在,此时会变成无效链接
- 因为符号链接只是提供一个指向另一个文件的路径,因此对另一个文件内容不识别,只要另外一个文件的路径存在就可以了
[root@test01 ~]# cp /etc/fstab /tmp/fstab
[root@test01 ~]# ln -s /tmp/fstab fstab.slink
[root@test01 ~]# ls -l fstab.slink
lrwxrwxrwx 1 root root 10 6月 3 21:54 fstab.slink -> /tmp/fstab
[root@test01 ~]# rm -f /tmp/fstab
[root@test01 ~]# ls -l fstab.slink
lrwxrwxrwx 1 root root 10 6月 3 21:54 fstab.slink -> /tmp/fstab(红而且闪,代表符号链接无效)
[root@test01 ~]# cp /etc/issue /tmp/fstab
[root@test01 ~]# ls -l fstab.slink
lrwxrwxrwx 1 root root 10 6月 3 21:54 fstab.slink -> /tmp/fstab(正常状态)
7-5. 文件系统的journal日志功能
Linux文件系统中除了ext2不具备日志功能,其他的文件系统都有日志功能,支持日志功能的文件系统在创建文件系统的时候会在存储空间划分一块区域作为日志区域,文件写入的过程如下:
- 文件写入,先在日志区域写入一个inode
- 数据块区域先8个块,8个块的分配存储,当存储完成后,日志区域写入的inode移动到元数据区
- 当还没存储完成,由于断电或其他问题导致无法存储的时候,日志区域的inode会持续保存
- 待重新开机后文件系统会自动扫描日志区域的inode,看能否续存,如果不能则会自动删除无效数据
- 带有journal日志功能的文件系统相对来说更安全,但是因为inode要写入两次,性能相对来说较差一些