浅谈硬盘分区和选择文件系统以及挂载


  磁盘分区可以优化I/O性能,实现磁盘空间配额限制,提高修复速度,隔离系统和程序,安装多个OS,采用不同文件系统。
  硬盘分区主要有两种分区方式:MBR,GPT

  • 1.MBR使用32位表示扇区数,分区不超过2T,分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区),逻辑结构如下:
  • 硬盘主引导记录MBR由4个部分组成
    ①.主引导程序(偏移地址0000H–0088H),它负责从活动分区中装载,并运行系统引导程序
    ②.出错信息数据区,偏移地址0089H–00E1H为出错信息,00E2H–01BDH全为0字节
    ③.分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH–01FDH,每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4
    ④.结束标志字,偏移地址01FE–01FF的2个字节值为结束标志55AA
  • 2.GPT:GUID partition table 支持128个分区,使用128位UUID表示磁盘和分区 GPT分区表自动备份在头和尾两份,并有CRC校验位,GPT分区表支持最多128PB的硬盘和分区

  • 列出块设备
    lsblk
lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1  6.7G  0 rom  
nvme0n1     259:0    0  200G  0 disk 
├─nvme0n1p1 259:1    0    1G  0 part /boot
├─nvme0n1p2 259:2    0  100G  0 part /data
├─nvme0n1p3 259:3    0   50G  0 part /
├─nvme0n1p4 259:4    0    1K  0 part 
└─nvme0n1p5 259:5    0    2G  0 part [SWAP]
  • 创建分区使用:
  • fdisk创建MBR分区
    fdisk 命令用于观察硬盘实体使用情况,也可对硬盘分区。它采用传统的问答式界面,而非类似DOS fdisk的cfdisk互动式操作界面,因此在使用上较为不便,但功能却丝毫不打折扣。
    示例如下:
  • 1.选择要进行操作的磁盘:
fdisk /dev/sdb     #注意一定要选的是硬盘,不是分区,别选错了
  • 2.输入 m 可以列出各种可以执行的命令
command (m for help): m
Command action
a   toggle a bootable flag
b   edit bsd disklabel
c   toggle the dos compatibility flag
d   delete a partition
l   list known partition types
m   print this menu
n   add a new partition
o   create a new empty DOS partition table
p   print the partition table
q   quit without saving changes
s   create a new empty Sun disklabel
t   change a partition's system id
u   change display/entry units
v   verify the partition table
w   write table to disk and exit
x   extra functionality (experts only)
  • 3.输入 p 可以列出目前这个磁盘的分区情况:
Command (m for help): p

 Disk /dev/sdb: 3221 MB, 3221225472 bytes
 255 heads, 63 sectors/track, 391 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

  Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1           1        8001   8e  Linux LVM
/dev/sdb2               2          26      200812+  83  Linux
  • 4.可以看出目前这个磁盘有两个分区,用 d 把他们删除掉
Command (m for help): d
Partition number (1-4): 1

Command (m for help): d
Selected partition 2
  • 5.查看分区情况确认已经删除
Command (m for help): p

 Disk /dev/sdb: 3221 MB, 3221225472 bytes
 255 heads, 63 sectors/track, 391 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

  Device Boot      Start         End      Blocks   Id  System

  Command (m for help):
  • 6.输入 n 开始建立新的分区:
Command (m for help): n
Command action
e   extended
p   primary partition (1-4)
p                 #建立主分区
Partition number (1-4): 1  #分区号
First cylinder (1-391, default 1):  #分区起始位置
Using default value 1
last cylinder or +size or +sizeM or +sizeK (1-391, default 391): 100  #分区结束位置,单位为扇区,扇区可以不用带+号

 Command (m for help): n  //再建立一个分区
 Command action
 e   extended
 p   primary partition (1-4)
 p 
 Partition number (1-4): 2  //分区号为2
 First cylinder (101-391, default 101):
 Using default value 101
 Last cylinder or +size or +sizeM or +sizeK (101-391, default 391): +200M  //分区结束位置,单位为M,必须带+号
  • 7.确认建立分区成功:
Command (m for help): p

  Disk /dev/sdb: 3221 MB, 3221225472 bytes
  255 heads, 63 sectors/track, 391 cylinders
  Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
  /dev/sdb1               1         100      803218+  83  Linux
  /dev/sdb2             101         125      200812+  83  Linux
  • 8.逻辑分区操作过程同上,只不过选择的时候注意选择用 l 即可
  • 9.最后对分区要保存操作,上面的只是对分区的规划,还没实现。
Command (m for help): w
  The partition table has been altered!

  Calling ioctl() to re-read partition table.
  Syncing disks.
  • gdisk 创建GPT分区,功能类似 fdisk

分区结束后要同步分区表

  • 查看内核是否已经识别的新的分区
    cat /proc/partations
  • 同步分区Centos6,5-7,8 有一些差别
  • Centos6的命令如下:
partx -a  /dev/sdxx           #新增分区使用
partx -x  --nr M-N /dev/sdxx  #删除分区使用
  • Centos 5-7 命令如下:
partprobe /dev/sdxx
  • Centos 8 根本不需要同步,如果同步类似Centos7

给分区建立文件系统

  文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即
在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结
构称为文件管理系统,简称文件系统。
  从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文
件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立
文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压
缩,加密等,
  文件系统分类如下:

Linux文件系统:
ext2:适用于那些分区容量不是太大,更新也不频繁的情况,
例如 /boot 分区
ext3:是 ext2 的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中恢复。它通常被用作通用的文件系统
ext4:是 ext 文件系统的最新版。提供了很多新的特性,包括纳秒级时间戳、创建和使用巨型文件(16TB)、最大1EB的文件系统,以及速度的提升
xfs:SGI,支持最大8EB的文件系统
swap: 独特的文件系统,是缓存分区特有的
光盘:ISO9660

  cat /proc/filesystems 可以查看当前系统支持的所有文件系统。

  文件系统常用选择:

  • EXT3

最多只能支持32TB的文件系统和2TB的文件,实际只能容纳2TB的文件系统和16GB的文件
Ext3目前只支持32000个子目录
Ext3文件系统使用32位空间记录块数量和 inode数量
当数据写入到Ext3文件系统中时,Ext3的数据块分配器每次只能分配一个4KB的块

  • EXT4:EXT4是Linux系统下的日志文件系统,是EXT3文件系统的后继版本

Ext4的文件系统容量达到1EB,而文件容量则达到16TB
理论上支持无限数量的子目录
Ext4文件系统使用64位空间记录块数量和 inode数量
Ext4的多块分配器支持一次调用分配多个数据块
修复速度更快

  • XFS

根据所记录的日志在很短的时间内迅速恢复磁盘文件内容
采用优化算法,日志记录对整体文件操作影响非常小
是一个全64-bit的文件系统,最大可以支持8EB的文件系统
能以接近裸设备I/O的性能存储数据

创建文件系统

  mkfs命令
  语法:mkfs.文件类型 /dev/ 设备名字

[root@Centos8 ~]#mkfs
mkfs         mkfs.ext2    mkfs.ext4    mkfs.minix   mkfs.vfat    
mkfs.cramfs  mkfs.ext3    mkfs.fat     mkfs.msdos   mkfs.xfs

  文件系统标签是指向设备的另一种方法与设备无关
  blkid: 块设备属性信息查看

blkid [OPTION]... [DEVICE]
blkid /dev/nvme0n1p1
/dev/nvme0n1p1: UUID="8bc9beb6-f5f8-49b9-8eec-fcfcbb5c161d" TYPE="ext4" PARTUUID="b1e5ead3-01"
#因为UUID是128位,所以基本不可能出现重复现象
-U UUID 根据指定的UUID来查找对应的设备
-L LABEL 根据指定的LABEL来查找对应的设备
  • tune2fs:重新设定ext系列文件系统可调整参数的值

-l 查看指定文件系统超级块信息;super block
-L 'LABEL’ 修改卷标
-m # 修预留给管理员的空间百分比
-j 将ext2升级为ext3
-O 文件系统属性启用或禁用, –O ^has_journal
-o 调整文件系统的默认挂载选项,–o ^acl
-U UUID 修改UUID号

  • dumpe2fs:显示ext文件系统信息,将磁盘块分组管理

-h:查看超级块信息,不显示分组信息

  • xfs_info:显示已挂载的 xfs 文件系统信息

xfs_info mountpoint


文件系统检测和修复

  文件系统夹故障常发生于死机或者非正常关机之后,挂载为文件系统标记为“no clean”
  注意:一定不要在挂载状态下执行下面命令修复

fsck: File System Check
   fsck.FS_TYPE
   fsck -t FS_TYPE
注意:FS_TYPE 一定要与分区上已经文件类型相同
   -a  自动修复
   -r  交互式修复错误
e2fsck:ext系列文件专用的检测修复工具
   -y  自动回答为yes
   -f  强制修复
   -p  自动进行安全的修复文件系统问题
xfs_repair:xfs文件系统专用检测修复工具
   -f  修复文件,而不是设备
   -n  只检查
   -d  允许修复只读的挂载设备,在单用户下修复 / 时使用,然后立即reboot

文件系统的挂载和卸载

  挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为
  卸载:为解除此关联关系的过程

  • 把设备关联挂载点:mount Point
  • mount:后面不接任何参数可以查看/etc/mtab文件显示当前已挂载的所有设备
  • 用mount命令挂载文件系统

挂载语法:mount DEVICE MOUNT_POINT
device:指明要挂载的设备;
(1) 设备文件:例如/dev/sda5
(2) 卷标:-L ‘LABEL’, 例如 -L ‘MYDATA’
(3) UUID, -U ‘UUID’:例如 -U ‘0c50523c-43f1-45e7-
85c0-a126711d406e’
(4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs
dir:挂载点
事先存在,建议使用空目录
进程正在使用中的设备无法被卸载

  • mount常用命令选项
-t vsftype 指定要挂载的设备上的文件系统类型
 -r readonly,只读挂载
 -w read and write, 读写挂载
 -n 不更新/etc/mtab,mount不可见
 -a 自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)
 -L 'LABEL' 以卷标指定挂载设备
 -U 'UUID' 以UUID指定要挂载的设备
 -B, --bind 绑定目录到另一个目录上
  • 查看内核追踪到的已挂载的所有设备
cat /proc/mounts
  • mount -o options:是一个特殊的用法就是选择挂载文件系统的选项,可以多个选项用逗号隔开即可
async 异步模式 sync 同步模式,内存更改时,同时写磁盘
 atime/noatime 包含目录和文件, 根据访问时间自动更新
 diratime/nodiratime  目录的访问时间戳,根据时间条件更新
 auto/noauto  是否支持自动挂载,是否支持-a选项
 exec/noexec  是否支持将文件系统上运行应用程序
 dev/nodev  是否支持在此文件系统上使用设备文件
 suid/nosuid  是否支持suid和sgid权限
 remount  重新挂载
 ro 只读 rw 读写
 user/nouser  是否允许普通用户挂载此设备,/etc/fstab使用
 acl  启用此文件系统上的acl功能
 loop  使用loop设备
 _netdev  当网络可用时才对网络资源进行挂载,如:NFS文件系统
 defaults  相当于rw, suid, dev, exec, auto, nouser, async
  • 卸载
  • 查看挂载情况
findmnt MONT_POINT|device
  • 查看正在访问指定文件系统的进程
fuser -v 挂载点
fuser -v /data
             USER        PID ACCESS COMMAND
/data:       root     kernel mount /data
             root       7426 ..c.. bash
  • 终止所有在正访问指定的文件系统的进程
fuser -km 挂载点
fuser -km /data
/data:                7426c
Connection closing...Socket close.

Connection closed by foreign host.

Disconnected from remote host(192.168.39.8) at 22:28:03.

Type `help' to learn how to use Xshell prompt.
[C:\~]$ 
#直接提出系统了,root用户也布列外。
  • fuser 可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息.显示使用指定文件或者文件系统的进程ID.默认情况下每个文件名后面跟一个字母表示访问类型。
  • 常用选项如下:

a 显示所有命令行中指定的文件,默认情况下被访问的文件才会被显示。
-k 杀掉访问文件的进程。如果没有指定-signal就会发送SIGKILL信号。
-i 杀掉进程之前询问用户,如果没有-k这个选项会被忽略。
-l 列出所有已知的信号名称。
-m name 指定一个挂载文件系统上的文件或者被挂载的块设备(名称name)。这样所有访问这个文件或者文件系统的进程都会被列出来。如果指定的是一个目录会自动转换成"name/",并使用所有挂载在那个目录下面的文件系统。
-n space 指定一个不同的命名空间(space).这里支持不同的空间文件(文件名,此处默认)、tcp(本地tcp端口)、udp(本地udp端口)。对于端口, 可以指定端口号或者名称,如果不会引起歧义那么可以使用简单表示的形式,例如:name/space (即形如:80/tcp之类的表示)。
-s 静默模式,这时候-u,-v会被忽略。-a不能和-s一起使用。
-signal 使用指定的信号,而不是用SIGKILL来杀掉进程。可以通过名称或者号码来表示信号(例如-HUP,-1),这个选项要和-k一起使用,否则会被忽略。
-u 在每个PID后面添加进程拥有者的用户名称。
-v 详细模式。输出似ps命令的输出包含PID,USER,COMMAND等许多域,如果是内核访问的那么PID为kernel. -V 输出版本号。
-4 使用IPV4套接字,不能和-6一起应用,只在-n的tcp和udp的命名存在时不被忽略。
-6 使用IPV6套接字,不能和-4一起应用,只在-n的tcp和udp的命名存在时不被忽略。
重置所有的选项,把信号设置为SIGKILL.

  • 卸载
umount device
umount 挂载点

  • 文件开机自动挂载系统
  • 要修改 /etc/fstab 配置文件
vim /etc/fstab
UUID=65bdf300-b361-40c7-aa7a-53087bc78a2a /                       xfs     defaults        0 0
UUID=8bc9beb6-f5f8-49b9-8eec-fcfcbb5c161d /boot                   ext4    defaults        1 2
UUID=59a4110a-f477-49e0-9be8-533d8bf8328d /data                   xfs     defaults        0 0
UUID=1a693b1a-93f7-4b41-905b-dbf4357db1ca swap                    swap    defaults        0 0
:r!blkid /dev/sdxx 读取UUID插入文件
:wq

结 束