1 概述

本文通过对讲解了磁盘的基本概念,分区,创建文件系统,挂载,卸载等步骤进行讲解。使得用户能够创建基本的磁盘并挂载使用空间。

2 磁盘基本概念

2.1 磁盘空间

每个扇区大小是512byte,这是磁盘的最小单位

每一个磁道上有多少个扇区就是扇区数 sectors

每一圈叫做磁道(track),最外面的叫做0磁道

依次往里增加,最里面的磁道数最大

每个盘有两个面,都有两个磁头(head)读取数据

相同的磁道组成的叫做柱面(cylinder),同样最外面叫0柱面,最里面柱面数最大

因此,

每个盘面的存储空间:512*sectors*tracks

每个柱面的空间:512*sectors*heads

每个硬盘的空间是:512*sectors*tracks*heads

扇区数是由6bit来决定,所以每个磁道最大有2^6就64个扇区

磁道的数量是由10bit来决定磁道的数量,所以磁道最多是2^10=1024个

盘面的数量是由8bit决定的,所以每个硬盘最大有2^8=256个磁头

所以早期每个柱面的大小为 512byte*64*256/1024/1024=8M.

CentOS6或者之前的版本默认柱面是划分分区的基本单位是8M,centOS7默认用扇区为单位分区,512byte。centOS7要显示以柱面为单位,就加-u=cylinder,如下语句

fdisk -l -u=cylinder /dev/sda

但是,早期每个磁盘的最大空间就是1024*8M/1024=8G.现在的磁盘为了解决这个问题,就采用了区位记录磁盘扇区结构(ZBRzoned bit recording)来定义磁盘的空间,磁盘大小因此得到了扩展。

扇区图片

2.2 磁盘寻址方式

分为CHS 和 LBA 两种

CHS

采用24bit位寻址

其中前10位表示cylinder,中间8位表示head,后面6位表示sector。

最大寻址空间8GB

LBA(logical block addressing)

LBA是一个整数,通过转换成CHS格式完成磁盘具体寻址

LBA采用48个bit位寻址

最大寻址空间128PB

由于CHS寻址方式的寻址空间在大概8GB以内,所以在磁盘容量小于大概8GB时,可以使用CHS寻址方式或是LBA寻址方式;在磁盘容量大于大概8GB时,则只能使用LBA寻址方式

2.3 分区的概念

2.3.1 分区的原因

优化I/O性能

实现磁盘空间配额限制

提高修复速度

隔离系统和程序

安装多个OS

采用不同文件系统


2.3.2 使用分区空间


设备识别

设备分区

创建文件系统

标记文件系统

在/etc/fstab文件中创建条目

挂载新的文件系统


2.3.3 管理分区

两种分区方式:MBR,GPT

分区相当于是把一块大硬盘分成几个小房间。MBR是比较旧的分区方式,只能分区较小的空间已经分区的数量也会比较少,GPT则是克服了MBR的缺点。

MBR和GPT引导系统启动的方式不一样


BIOS 和 UEFI 引导系统启动流程

BIOS+MBR引导计算机进行启动,BIOS写入到ROM里面,当计算机启动时,BIOS就会去读取MBR分区。通过BIOS配合MBR引导启动分区

但是BIOS并跟GPT搭配。如果一定要用,可以通过 BIOS+MBRsda 系统盘,引导系统启动+GPT(其他盘)分区的方式来进行分区。

默认情况下 UEFI+GPT进行系统的启动


2.3.3.1 MBR分区概念

MBR: Master Boot Record,1982年,使用32位表示扇区数,分区不超过2T

如何分区:按柱面

0磁道0扇区:512bytes

446bytes: boot loader

64bytes:分区表

16bytes: 标识一个分区

2bytes: 55AA

4个主分区;3主分区+1扩展(N个逻辑分区)


MBR分区结构图

硬盘主引导记录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.3.3.2 GPT分区

GPT:GUID(Globals Unique Identifiers)partition table 支持128个分区,使用64位,支持8Z(512Byte/block )64Z (4096Byte/block)

使用128位UUID(Universally Unique Identifier) 表示磁盘和分区GPT分区表自动备份在头和尾两份,并有CRC校验位

UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动


GPT分区结构

GPT的第一个0扇区是保护MBR,一样是512byte,但是这个MBR不是用来启动引导盘的。只是保护的目的,因为传统的操作系统都是支持MBR,并不支持GPT。保护MBR是当旧的电脑系统系统不识别GPT分区的时候,即认不出GPT格式的硬盘有数据的时候,会识别出该硬盘上有个MBR分区,最起码是不会让管理者误认为没有操作系统或者分区,直接对该硬盘进行格式化。

GPT格式做的可以分128个分区。GPT分区表有自动备份的功能,支持更大的分区

2.3.4 格式化分区

给硬盘分区后,还要讲对应的硬盘进行格式化,指定文件系统类型,是指定了对应分区上文件管理的方式,相当于有软件来管理这个文件了。可以理解为所谓的文件是由文件系统产生,没有文件系统,就没有了文件的概念。

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统

从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等

查前支持的文件系统:

cat /proc/filesystems

查看当前系统支持的文件系统,可以进入fs目录下查看,语句如下

cd /lib/modules/`uname -r`/kernel/fs

文件系统类型主要有以下几种

Linux文件系统:ext2(Extended file system), ext3, ext4, xfs(SGI), btrfs(Oracle), reiserfs, jfs(AIX), swap

光盘:iso9660

Windows:FAT32, exFAT,NTFS

Unix: FFS(fast), UFS(unix), JFS2

网络文件系统:NFS, CIFS

集群文件系统:GFS2, OCFS2(oracle)

分布式文件系统:fastdfs,ceph, moosefs, mogilefs, glusterfs, Lustre

RAW:未经处理或者未经格式化产生的文件系统


根据其是否支持"journal"功能:

日志型文件系统: ext3, ext4, xfs, ...

非日志型文件系统: ext2, vfat

文件系统的组成部分:

内核中的模块:ext4, xfs, vfat

用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat

Linux的虚拟文件系统:VFS


当然,在文件系统中也是运行没有文件系统的硬盘存在。

如果没有分区,没有文件系统,叫RAW,裸文件系统

如果没有文件系统,要读数据,可以用hexdump–C –n 512 /dev/sdb1这样来读取。

没有文件系统的话,相当于把数据之间放在磁盘上了,读取速度回比较快,如oracle数据库就会把数据放在裸文件系统里。


3 创建分区

以下三个工具可以创建分区。

fdisk创建MBR分区,

gdisk创建GPT分区

parted高级分区操作


3.1 parted分区

parted的操作都是实时生效的,小心使用

用法:parted [选项]... [设备[命令[参数]...]...]

parted /dev/sdb mklabel gpt|msdos  //给整个硬盘打标签,指定接下来硬盘要分区的类型
parted /dev/sdb print  //显示硬盘的分区信息
parted /dev/sdb mkpart primary 1 200 (默认M)//开始分区,并指定大小,
                                                  //从第1M开始,到第200M结束
parted /dev/sdb rm 1  //数字1,移除掉对应的分区
parted -l  //字母l,显示分区内容

注意

parted /dev/sdb mklabel gpt

如果用parted指定了硬盘lab为gpt分区,则用fdisk命令也可以创建出gpt格式的分区,但是不建议这么用

parted /dev/sdc mklabel msdos

如果用parted指定了硬盘lab为mbr分区,则用gdisk分区的时候,会提示将MBR转换为GPT分区,这个和指定成GPT不一样。

3.2 fdisk分区

3.2.1 创建分区

gfisk /dev/sdb 类fdisk 的GPT分区工具,这里就仅介绍fdisk

fdisk -l [-u] [device...] 查看分区

fdisk /dev/sdb 管理分区

子命令:

p 分区列表

t 更改分区类型,centOS 6和centOS 7 相同类型的code不一样。

n 创建新分区

d 删除分区

v 校验分区

u 转换单位

w 保存并退出

q 不保存并退出


当分区后,新的分区不会马上同步,需要用partprobe 或者 partx进行同步,原理是通知内核重新读取硬盘分区表,重新设置内存中的内核分区表版本

partprobe- 用于centOS5和centOS7上

partx -   用于centOS6上

同步新增加的分区,命令

partx –a /dev/sda //表示通过新增加硬盘的分区表。如果盘里面已经同步的分区,则表示该分区忙碌。

如果是同步删除的分区,用命令 

 partx -d --nr 6-8 /dev/sda//则要指定删除分区的那个具体数字。

命令lsblk可以列出块设备

查看内核是否已经识别新的分区,命令如下

cat /proc/partitions

3.2.2删除分区

常规办法:通过fdisk /dev/sdb 进入,输入 d,然后输入对应的分区号进行删除。即可


注意,删除分区后,表的结构还是存在,所以可以通过清理0扇区上的512个字节,或者单纯清空掉55(第0x015E位)和aa(0x015F位)这两个分区位也可以达到删掉分区的效果。

dd if=/dev/zero of=/dev/sdb bs=1 count=2 skip=510 seek=510

以上语句表示跳过510个字节,二进制表从第0位开始排序,跳过510位,实际是跳过第0-0x015D(509)这510个字节。seek表示从第510个字节(第0x015E位)开始.

以上这条语句,如果是MBR分区,则确实是已经清空掉分区表的分区信息,虽然通过lsblk还是可以看到原来的旧分区,但是通过partx同步信息后就同步了。通过fdsik -l /dev/sdb里面也看不到信息了。

这个也说明,分区表在系统上有两份,一份是在内存上,一份在磁盘上。

但是GPT特殊,虽然清空510和511位后,通过partprobe同步分区表信息,lsblk看不到旧的分区,但是通过gdisk -l /dev/sdb可以看到原来就的分区表的信息,这个可能是由于GPT分区信息有备份导致,所以gdt分区不建议这么清空。

这里做个小实验,把系统当前正在使用的系统盘/dev/sda的的0扇区 做个备份, 然后清空这个0扇区,最后在通过备份的512字节的0扇区进行恢复。当然了,这个备份最好放到其他机器上,因为一旦重启被清空0扇区的机器,则该机器也启动不了,需要通过其他机器拷贝该机器旧的分区表后才能恢复。当然生产上不能这么操作。

生产上,如果要恢复mbr,可以将被破坏的硬盘拆到其他有mbr备份信息的机器上,然后再新的机器上通过dd命令把mbr信息恢复到被破坏的硬盘上,恢复后再把硬盘拆会原来机器。这个是单块硬盘才能这么做,如果是raid系统,就不能这么恢复了。

生产上,如果该机器很重要,除了备份数据,建议也备份一下mbr

dd if=/dev/sda of=sdambr  bs=1 count=512


4  创建文件系统

创建文件系统,就是要将分好的分区进行格式化,指定对应的文件系统

4.1 mkfs命令

(1) mkfs.FS_TYPE /dev/DEVICE ,其中FS_TYPE可以指定为ext3,ext4,xfs,vfat等

(2) mkfs -t  FS_TYPE  /dev/DEVICE

(3) mkfs -L  'LABEL'  /dev/DEVICE: 设定卷标

4.2 mke2fs命令

mke2fs:ext系列文件系统专用管理工具,专门用来格式化ext文件系统格式的工具

-t {ext2|ext3|ext4}

-b {1024|2048|4096}

-L 'LABEL'

-j: 相当于-t ext3

mkfs.ext3 = mkfs-t ext3 = mke2fs -j = mke2fs -t ext3

-i#: 为数据空间中每多少个字节创建一个inode;此大小不应该小于block的大小

-N #:指定分区中创建多少个inode

-I 一个inode记录占用的磁盘空间大小,128---4096

-m #: 默认5%,为管理人员预留空间占总空间的百分比

-O FEATURE[,...]:启用指定特性

-O ^FEATURE:关闭指定特性

4.3 文件系统标签

指向设备的另一种方法

与设备无关

blkid:块设备属性信息查看

blkid[OPTION]... [DEVICE]

-U UUID: 根据指定的UUID来查找对应的设备

blkid 默认只显示块设备文件,如果非块设备,如通过dd创建,然后在格式化成ext4的普通文件,需要跟着文件名才会显示

dd if=/dev/zero of=tt bs=1M count=5
mkfs.ext4 tt
blkid  //显示不出tt文件
blkid tt

如果硬盘不重新格式化,则UUID不会变,且是唯一,因为磁盘的命名或者标签可能会改变,所以,挂载建议用设备的UUID进行挂载

-L LABEL:根据指定的LABEL来查找对应的设备

e2label:管理ext系列文件系统的LABEL

e2label DEVICE [LABEL]

findfs:查找分区

findfs[options] LABEL=

findfs[options] UUID=

4.4 调整ext文件系统参数值

tune2fs:重新设定ext系列文件系统可调整参数的值

-l:查看指定文件系统超级块信息;super block

-L 'LABEL':修改卷标

-m #:修预留给管理员的空间百分比

-j: 将ext2升级为ext3

-O: 文件系统属性启用或禁用,–O ^has_journal

-o: 调整文件系统的默认挂载选项,–o ^acl

-U UUID: 修改UUID号

4.5 查看ext文件系统信息

命令:dumpe2fs

块分组管理,32768块

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

4.6 文件系统检测和修复

常发生于死机或者非正常关机之后

挂载为文件系统标记为“no clean”,注意,如果文件系统是ext2,则可能会显示no clean,但是没挂载的时候用dumpe2fs检查又是clean状态

注意:一定不要在挂载状态下修复

fsck检查文件系统的状态。可以修复故障的文件系统,取消挂载后才能执行该命令,否则可能会破坏文件系统。该命令慎用,非必要时候不要执行。

fsck -f  /dev/sdb5 多了-f选项,强制检查硬盘,如果没有-f,大致检查。只能修复文件系统,如果数据已经被破坏了,被覆盖掉的数据就不能修复了,还没被破坏的数据可以继续查看

因异常导致的丢失的文件可以到 lost+found文件夹下查找

fsck: File System Check

fsck.FS_TYPE

fsck-t FS_TYPE

-p: 自动修复错误

-r: 交互式修复错误

FS_TYPE一定要与分区上已经文件类型相同

e2fsck:ext系列文件专用的检测修复工具

-y:自动回答为yes

-f:强制修复

5 挂载

5.1 mount 挂载

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

卸载:为解除此关联关系的过程

把设备关联挂载点:mount Point

卸载时:可使用设备,也可以使用挂载点

挂载点下原有文件在挂载完成后会被临时隐藏

挂载点目录一般为空

挂载方法:mount DEVICE MOUNT_POINT

mount:通过查看/etc/mtab文件显示当前已挂载的所有设备

mount [-fnrsvw] [-t vfstype] [-o options] device dir

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: 绑定目录到另一个目录上


-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设备

defaults:图形界面自动挂载相当于rw, nosuid, dev, exec, auto, nouser,async

    defaults:但是通过mount分区挂载默认是相当于rw, suid, dev, exec, auto, nouser, async

查看内核追踪到的已挂载的所有设备

cat /proc/mounts

5.2 写入配置命令

要使得挂载长期有效,即开机时自动挂载,需要往配置文件/etc/fstab写入相关的信息

配置文件系统体系

被mount、fsck和其它程序使用

系统重启时保留文件系统体系

可以在设备栏使用文件系统卷标

使用mount -a 命令挂载/etc/fstab中的所有文件系统

/etc/fstab每行定义一个要挂载的文件系统,里面每个字段的含义如下:


要挂载的设备或伪文件系统

设备文件

LABEL:LABEL=""

UUID:UUID=""

伪文件系统名称:proc, sysfs

挂载点

文件系统类型,相关文件系统类型可见2.3.4节内容

挂载选项:defaults

转储频率:0:不做备份1:每天转储2:每隔一天转储

自检次序:0:不自检

                    1:首先自检;一般只有rootfs才用1

自检次序字段 如果有分区填写大于1的话,则在检查完根分区后,接着按填写的数字从小到大依次检查下去。同数字 的同时检查。比如第一和第二个分区填写2,第三和第四个分区填写3,则系统在检查完根分区后,接着同时检查第一和第二个分区,然后再同时检查第三和第四个分区。




特殊文件挂载举例

其中,可以用showmount –e  ip 可以看到对应ip上的共享文件夹,然后再将其挂载上nfs文件格式上


6 卸载

一般情况下,正在被访问的挂载设备是不能被正常卸载,所以卸载前可以先用以下命名查看情况后在进行卸载

查看挂载情况,可以检查挂载是否成功

findmnt  MOUNT_POINT|device

查看正在访问指定文件系统的进程

lsof   MOUNT_POINT

fuser  -v  MOUNT_POINT

终止所有在正访问指定的文件系统的进程

fuser -km MOUNT_POINT

卸载

umountDEVICE

umountMOUNT_POINT

到这里为止,普通分区的使用已经完成,可以正常使用新的分区