16 Linux-文件系统管理
16.1.1 硬盘的逻辑结构
每个扇区的大小事固定的,为512Byte。扇区也是磁盘的最小存贮单位。
硬盘的大小是使用“磁头数×柱面数×扇区数×每个扇区的大小”这样的公式来计算的,其中
-
磁头数(Heads)表示硬盘总共有几个磁头,也可以理解成为硬盘有几个盘面,然后乘以二;
-
柱面数(Cylinders)表示硬盘每一面盘片有几条磁道;
-
扇区数(Sectors)表示每条磁道上有几个扇区;每个扇区的大小一般是512Byte。
16.1.2 硬盘接口
IDE硬盘接口(Integrated Drive Electronics,并口,即电子集成驱动器)也称作“ATA硬盘”或“PATA硬盘”,是早期机械硬盘的主要接口,ATA133硬盘的理论速度可以达到133MB/s(此速度为理论平均值),IDE硬盘接口
SATA接口(Serial ATA,串口)是速度更高的硬盘标准,具备了更高的传输速度,并具备了更强的纠错能力。目前已经是SATA三代,理论传输速度达到600MB/s(此速度为理论平均值)
SCSI接口(Small Computer System Interface,小型计算机系统接口)广泛应用在服务器上,具有应用范围广、多任务、带宽大、CPU占用率低及支持热插拔等优点,理论传输速度达到320MB/s
16.2 文件系统
16.2.1 Linux文件系统的特性
super block(超级块):
记录整个文件系统的信息,包括block与inode的总量,已经使用的inode和block的数量,未使用的inode和block的数量,block与inode的大小,文件系统的挂载时间,最近一次的写入时间,最近一次的磁盘检验时间等。
date block(数据块,也称作block):
用来实际保存数据的(柜子的隔断),block的大小(1KB、2KB或4KB)和数量在格式化后就已经决定,不能改变,除非重新格式化(制作柜子的时候,隔断大小就已经决定,不能更改,除非重新制作柜子)。
每个blcok只能保存一个文件的数据,要是文件数据小于一个block块,那么这个block的剩余空间不能被其他文件是要;要是文件数据大于一个block块,则占用多个block块。
Windows中磁盘碎片整理工具的原理就是把一个文件占用的多个block块尽量整理到一起,这样可以加快读写速度。
inode(i节点,柜子门上的标签):
用来记录文件的权限(r、w、x),文件的所有者和属组,文件的大小,文件的状态改变时间(ctime),文件的最近一次读取时间(atime),文件的最近一次修改时间(mtime),文件的数据真正保存的block编号。每个文件需要占用一个inode。
16.2.2 Linux常见文件系统
| 文件系统 | 描述 |
|---|---|
| ext | Linux中最早的文件系统,由于在性能和兼容性上具有很多缺陷,现在已经很少使用 |
| ext2 | 是ext文件系统的升级版本,Red Hat Linux 7.2版本以前的系统默认都是ext2文件系统。于1993年发布,支持最大16TB的分区和最大2TB的文件(1TB=1024GB=1024×1024KB) |
| ext3 | 是ext2文件系统的升级版本,最大的区别就是带日志功能,以便在系统突然停止时提高文件系统的可靠性。支持最大16TB的分区和最大2TB的文件 |
| ext4 | 是ext3文件系统的升级版。ext4 在性能、伸缩性和可靠性方面进行了大量改进。ext4的变化可以说是翻天覆地的,比如向下兼容ext3、最大1EB文件系统和16TB文件、无限数量子目录、Extents连续数据块概念、多块分配、延迟分配、持久预分配、快速FSCK、日志校验、无日志模式、在线碎片整理、inode增强、默认启用barrier等。它是CentOS 6.x的默认文件系统 |
| xfs | XFS最早针对IRIX操作系统开发,是一个高性能的日志型文件系统,能够在断电以及操作系统崩溃的情况下保证文件系统数据的一致性。它是一个64位的文件系统,后来进行开源并且移植到了Linux操作系统中,目前CentOS 7.x将XFS+LVM作为默认的文件系统。据官方所称,XFS对于大文件的读写性能较好。 |
| swap | swap是Linux中用于交换分区的文件系统(类似于Windows中的虚拟内存),当内存不够用时,使用交换分区暂时替代内存。一般大小为内存的2倍,但是不要超过2GB。它是Linux的必需分区 |
| NFS | NFS是网络文件系统(Network File System)的缩写,是用来实现不同主机之间文件共享的一种网络服务,本地主机可以通过挂载的方式使用远程共享的资源 |
| iso9660 | 光盘的标准文件系统。Linux要想使用光盘,必须支持iso9660文件系统 |
| fat | Windows下的fat16文件系统,在Linux中识别为fat |
| vfat | Windows下的fat32文件系统,在Linux中识别为vfat。支持最大32GB的分区和最大4GB的文件 |
| NTFS | Windows下的NTFS文件系统,不过Linux默认是不能识别NTFS文件系统的,如果需要识别,则需要重新编译内核才能支持。它比fat32文件系统更加安全,速度更快,支持最大2TB的分区和最大64GB的文件 |
| ufs | Sun公司的操作系统Solaris和SunOS所采用的文件系统 |
| proc | Linux中基于内存的虚拟文件系统,用来管理内存存储目录/proc |
| sysfs | 和proc一样,也是基于内存的虚拟文件系统,用来管理内存存储目录/sysfs |
| tmpfs | 也是一种基于内存的虚拟文件系统,不过也可以使用swap交换分区 |
16.3 常用的硬盘管理命令
16.3.1 df命令
示例:
16.3.2 du命令
示例:
du与df的区别:du是用于统计文件大小的,统计的文件大小是准确的;df是用于统计空间大小的,统计的剩余空是准确的
lsof | grep deleted”查看被删除的文件,然后一个进程一个进程的手工kill也是可以的
16.3.3 fsck文件系统修复命令
16.3.4 dumpe2fs显示磁盘状态
示例:
16.3.5 stat查看文件的详细时间
示例:
16.3.6 判断文件类型
16.4 fdisk命令手工分区流程介绍
16.4.1 查看系统所有硬盘及分区
16.4.2 选择硬盘进行分区
fdisk交互指令说明:
| 命令 | 说明 |
|---|---|
| a | 设置可引导标记 |
| b | 编辑bsd磁盘标签 |
| c | 设置DOS操作系统兼容标记 |
| d | 删除一个分区 |
| l | 显示已知的文件系统类型。82为Linux swap分区,83为Linux分区 |
| m | 显示帮助菜单 |
| n | 新建分区 |
| o | 建立空白DOS分区表 |
| p | 显示分区列表 |
| q | 不保存退出 |
| s | 新建空白SUN磁盘标签 |
| t | 改变一个分区的系统ID |
| u | 改变显示记录单位 |
| v | 验证分区表 |
| w | 保存退出 |
| x | 附加功能(仅专家) |
常见流程:
有时因为系统的分区表正忙,则需要重新启动系统之后才能使新的分区表生效。
16.4.3 强制重读所有分区文
强制重读所有分区文件,重新挂载分区文件内所有分区。这不是分区必须命令,如果没有提示重启,可以不执行,也可以重启系统
如果这个命令不存在请安装parted-2.1-18.el6.i686这个软件包
16.4.4 格式化建立文件系统
mkfs命令非常简单易用,不过是不能调整分区的默认参数的(比如块大小是4096),这些默认参数除非特殊情况,否则不需要调整,如果想要调整就需要使用mke2fs命令进行重新格式化,命令格式如下:
16.4.5 建立挂载点
16.4.6 挂载硬盘分区
16.4.7 查看挂载信息
16.4.8 自动挂载
修改分区自动挂载文件
-
第一列: 设备文件名
-
第二列 挂载点
-
第三列 文件系统
-
第四列 挂载选项
-
第五列 1 是否可以被备份 0不备份 1 每天备份 2不定期备份
-
第六列 2 是否检测磁盘fsck 0不检测 1启动时检测 2启动后检测
也可以使用UUID进行挂载,UUID(硬盘通用唯一识别码,可以理解为硬盘的ID)
这个字段在CentOS 5.5的系统当中是写入分区的卷标名或分区设备文件名的,现在变成了硬盘的UUID。这样做的好处是当硬盘增加了新的分区,或者分区的顺序改变,再或者内核升级后,任然能够保证分区能够正确的加载,而不至于造成启动障碍,可以使用dumpe2fs命令查看到硬盘的uuid
16.4.9 挂载测试
重启服务器或使用 mount -a 重新挂载所有内容,进行测试
16.5 /etc/fstab/文件修复
重启服务器后出现该错误
一般这种情况很有可能是fstab文件编写问题,导致无法正常开机,可以进入应急模式进行恢复后重启,输入root用户的密码
修改/etc/fstab文件
出现这个错误是应为没有写的权限,那么只要把/分区重新挂载下,挂载为读写权限,就可以正常修改
再去修改/etc/fstab文件,修改完成后,即可正常启动
16.6 parted命令分区
Linux系统中有两种常见的分区表MBR分区表(主引导记录分区表)和GPT分区表(GUID分区表),其中:
-
MBR分区表:支持的最大分区是2TB(1TB=1024GB);最多支持4个主分区,或3个主分区1个扩展分区
-
GPT分区表:支持最大18EB的分区(1EB=1024PB=1024*1024TB);最多支持128个分区,其中1个系统保留分区,127个用户自定义分区
16.6.1 parted交互模式
| parted交互命令 | 说 明 |
|---|---|
| check NUMBER | 做一次简单的文件系统检测 |
| cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER | 复制文件系统到另外一个分区 |
| help [COMMAND] | 显示所有的命令帮助 |
| mklabel,mktable LABEL-TYPE | 创建新的磁盘卷标(分区表) |
| mkfs NUMBER FS-TYPE | 在分区上建立文件系统 |
| mkpart PART-TYPE [FS-TYPE] START END | 创建一个分区 |
| mkpartfs PART-TYPE FS-TYPE START END | 创建分区,并建立文件系统 |
| move NUMBER START END | 移动分区 |
| name NUMBER NAME | 给分区命名 |
| print [devices|free|list,all|NUMBER] | 显示分区表,活动设备,空闲空间,所有分区 |
| quit | 退出 |
| rescue START END | 修复丢失的分区 |
| resize NUMBER START END | 修改分区大小 |
| rm NUMBER | 删除分区 |
| select DEVICE | 选择需要编辑的设备 |
| set NUMBER FLAG STATE | 改变分区标记 |
| toggle [NUMBER [FLAG]] | 切换分区表的状态 |
| unit UNIT | 设置默认的单位 |
| Version | 显示版本 |
16.6.2 查看分区
使用print可以查看分区表信息,包括硬盘参数,硬盘大小,扇区大小,分区表类型和分区信息。分区信息总共七列,分别是:
-
Number:分区号
-
Start:分区起始位置,这里不再像fdisk用柱面表示,而是使用Byte更加直观
-
End:分区结束位置
-
Size:分区大小
-
Type:分区类型
-
File system:文件系统类型。我不是说parted不支持ext4文件系统吗?注意,我一直都是说parted不能直接把分区直接格式化成ext4文件系统,但是它是可以识别的。
-
标志:Flags,就是分区的标记
16.6.3 修改成GPT分区表
修改了分区表,如果这块硬盘已经有分区了,那么原有分区和分区中的数据都会消失,而且需要重启系统才会生效。
转换分区表的目的是为了支持大于2TB 的分区,如果分区并没有大于2TB,那么这步是可以不执行的。
注意:一定要把/etc/fstab 文件中和原有分区的内容删除掉,才能重启动。要不系统启动就一定会报错的。
16.6.4 建立分区
因为修改过了分区表,所以/dev/sdb 中的所有数据都消失了,所以我们可以重新对这块硬盘分区了。不过建立分区时,默认文件系统就只能建立成ext2 了,命令如下:
现在的print 查看的分区,和第一次查看MBR 分区表的分区时有些不一样了,少了Type 这个字段,也就是分区类型的字段,多了Name 分区名字段。
分区类型是标识主分区、扩展分区和逻辑分区的,不过这种标识只在MBR 分区表中使用,我们现在已经变成了GPT 分区表了,所以就不再有Type 类型了。也就说折磨我们很久的主分区、扩展分区和逻辑分区的概念不再有用了。
16.6.5 建立文件系统
分区分完了,还需要进行格式化。
16.6.6 调整分区大小
parted 命令还有一大优势,就是可以调整分区的大小(windows 中也可以实现,不过要不需要转换成动态磁盘,要不需要依赖第三方工具,如硬盘分区魔术师)。起始Linux 中LVM 和RAID 是可以支持分区调整的,不过这两种方法也可以看成是动态磁盘方法,我们在下一个章节中介绍。使用parted命令调整分区要更加简单。
注意:parted 调整已经挂载使用的分区时,是不会影响分区中的数据的,也就是说数据不会丢失。但是一定要先卸载分区,再调整分区大小,否则数据是会出现问题的。还有要调整大小的分区必须已经建立了文件系统(格式化),否则会报错
16.6.7 删除分区
还有件事要注意,parted中所有的操作都是立即生效,没有保存生效的概念。这点和fdisk交互命令明显不同,所以所做的所有操作大家要倍加小心。
那么到底使用fdisk进行分区?还是parted命令呢?这个完全看个人习惯,我们更加习惯fdisk命令。
16.7 分配swap分区
16.7.1 分区,并修改为swap分区ID
16.7.2 格式化
16.7.3 激活交换空间
16.7.4 开机自动挂载
加入新swap分区的相关内容,可以使用UUID来进行自动挂载







