Linux磁盘管理技术

GO

这一章学习:如何分区、如何格式化、如何挂载、如何卸载。

0. MBR和GPT

0.1. MBR

MBR全称Master Boot Record,中文叫做“主引导记录”,又叫做“主引导扇区”,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的地址为0柱面0磁道1扇区。MBR 的主要作用是检查分区状态,寻找活动分区,并将控制权交给活动分区引导记录DBR,再由分区引导程序加载操作系统。标准MBR的结构如下:

标准MBR结构

主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。MBR是由分区程序所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而能够实现多系统引导。

硬盘分区表占据主引导扇区的64个字节(偏移0x01BE至偏移0x01FD),可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节。具体每个字节的定义可以参见硬盘分区结构信息:

硬盘分区结构信息

结束标志字0x55和0xAA是主引导扇区的最后两个字节,是检验主引导记录是否有效的标志。

0.2. GPT

0.2.1. GPT概述

全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区结构。它是可扩展固件接口标准的一部分,用来替代BIOS中的主引导记录分区表。 传统的主启动记录 (MBR) 磁盘分区支持最大卷为 2.2 TB (terabytes) ,每个磁盘最多有 4 个主分区(或 3 个主分区,1 个扩展分区和无限制的逻辑驱动器)。 与MBR 分区方法相比,GPT 具有更多的优点,因为它允许每个磁盘有多达 128 个分区,支持高达 18 千兆兆字节 (exabytes,1EB=10^6TB) 的卷大小,允许将主磁盘分区表和备份磁盘分区表用于冗余,还支持唯一的磁盘和分区 ID (GUID)。

与 MBR 分区的磁盘不同,GPT的分区信息是在分区中,而不象MBR一样在主引导扇区。为保护GPT不受MBR类磁盘管理软件的危害,GPT在主引导扇区建立了一 个保护分区 (Protective MBR)的MBR分区表,这种分区的类型标识为0xEE,这个保护分区的大小在Windows下为128MB,Mac OS X下为200MB,在Window磁盘管理器里名为GPT保护分区,可让MBR类磁盘管理软件把GPT看成一个未知格式的分区,而不是错误地当成一个未分 区的磁盘。另外,GPT 分区磁盘有多余的主要及备份分区表来提高分区数据结构的完整性。

在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。跟现代的MBR一样,GPT也使用逻辑区块地址(LBA)取代了早期的CHS寻址方式。传统MBR信息存储于LBA 0,GPT头存储于LBA 1,接下来才是分区表本身。64位Windows操作系统使用16,384字节(或32扇区)作为GPT分区表,接下来的LBA 34是硬盘上第一个分区的开始。为了减少分区表损坏的风险,GPT在硬盘最后保存了一份分区表的副本。与主启动记录 (MBR) 分区方法相比,GPT 具有更多的优点,因为它允许每个磁盘有多达 128 个分区,支持高达18 千兆兆字节的卷大小,允许将主磁盘分区表和备份磁盘分区表用于冗余,还支持唯一的磁盘和分区ID(GUID)。

0.2.2. GPT结构

MBR和GPT

0.2.3. 传统MBR(LBA 0)

在GPT分区表的最开头,处于兼容性考虑仍然存储了一份传统的MBR,用来防止不支持GPT的硬盘管理工具错误识别并破坏硬盘中的数据,这个MBR也叫做保护MBR。在支持从GPT启动的操作系统中,这里也用于存储第一阶段的启动代码。在这个MBR中,只有一个标识为0xEE的分区,以此来表示这块硬盘使用GPT分区表。不能识别GPT硬盘的操作系统通常会识别出一个未知类型的分区,并且拒绝对硬盘进行操作,除非用户特别要求删除这个分区。这就避免了意外删除分区的危险。另外,能够识别GPT分区表的操作系统会检查保护MBR中的分区表,如果分区类型不是0xEE或者MBR分区表中有多个项,也会拒绝对硬盘进行操作。

在使用MBR/GPT混合分区表的硬盘中,这部分存储了GPT分区表的一部分分区(通常是前四个分区),可以使不支持从GPT启动的操作系统从这个MBR启动,启动后只能操作MBR分区表中的分区。如Boot Camp就是使用这种方式启动Windows。

0.2.4. 分区表头(LBA 1)

分区表头定义了硬盘的可用空间以及组成分区表的项的大小和数量。在使用64位Windows Server 2003的机器上,最多可以创建128个分区,即分区表中保留了128个项,其中每个都是128字节。(EFI标准要求分区表最小要有16,384字节,即128个分区项的大小)

分区表头还记录了这块硬盘的GUID,记录了分区表头本身的位置和大小(位置总是在LBA 1)以及备份分区表头和分区表的位置和大小(在硬盘的最后)。它还储存着它本身和分区表的CRC32校验。固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否出错,如果出错了,可以使用软件从硬盘最后的备份GPT中恢复整个分区表,如果备份GPT也校验错误,硬盘将不可使用。所以GPT硬盘的分区表不可以直接使用16进制编辑器修改。

分区表头的格式如下:

起始字节 所占长度 内容
0 8字节 签名(”EFI PART”, 45 46 49 20 50 41 52 54)
8 4字节 修订(在1.0版中,值是 00 00 01 00)
12 4字节 分区表头的大小(单位是字节,通常是92字节,即 5C 00 00 00)
16 4字节 分区表头(第0-91字节)的CRC32 校验,在计算时,把这个字段作为0处理,需要计算出分区串行的CRC32校验后再计算本字段
20 4字节 保留,必须是0
24 8字节 当前LBA(这个分区表头的位置)
32 8字节 备份LBA(另一个分区表头的位置)
40 8字节 第一个可用于分区的LBA(主分区表的最后一个LBA+1)
48 8字节 最后一个可用于分区的LBA(备份分区表的第一个LBA-1)
56 16字节 硬盘GUID(在类UNIX 系统中也叫UUID)
72 8字节 分区表项的起始LBA(在主分区表中是2)
80 4字节 分区表项的数量
84 4字节 一个分区表项的大小(通常是128)
88 4字节 分区串行的CRC32校验
92 * 保留,剩余的字节必须是0(对于512字节LBA的硬盘即是420字节)

主分区表和备份分区表的头分别位于硬盘的第二个扇区(LBA 1)以及硬盘的最后一个扇区。备份分区表头中的信息是关于备份分区表的。

0.2.5. 分区表项(LBA 2-33)

GPT分区表使用简单而直接的方式表示分区。一个分区表项的前16字节是分区类型GUID。例如,EFI系统分区的GUID类型是{C12A7328-F81F-11D2-BA4B-00A0C93EC93B}。接下来的16字节是该分区唯一的GUID(这个GUID指的是该分区本身,而之前的GUID指的是该分区的类型)。再接下来是分区起始和末尾的64位LBA编号,以及分区的名字和属性。

GPT分区表项的格式如下:

起始字节 所占长度 内容
0 16字节 分区类型GUID
16 16字节 分区GUID
32 8字节 其实LBA(小端序)
40 8字节 末尾LBA
48 8字节 属性标签(如:60表示“只读”)
56 72字节 分区名(可以包括36个UTF-16(小端序)字符)

1. 查看磁盘或目录的容量

监控磁盘的使用率在日常的监控工作中是必须要做的。

1.1. df

df (disk filesystem)用于查看已挂载磁盘的总容量、使用容量、剩余容量等。

常用选项 选项说明
不加选项 默认以KB为单位显示
-i 查看inodes的使用状况,如已使用100%,即使磁盘空间有富余,也会提示磁盘空间已满
-h 以合适的单位显示
-k 以KB为单位显示(默认)
-m 以MB为单位显示
-T 查看每个分区的文件系统类型

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda3 16561152 3760600 12800552 23% /
devtmpfs 1006276 0 1006276 0% /dev
tmpfs 1016076 0 1016076 0% /dev/shm
tmpfs 1016076 8796 1007280 1% /run
tmpfs 1016076 0 1016076 0% /sys/fs/cgroup
/dev/sdb5 991512 2516 921412 1% /newdir
/dev/sda1 201380 95320 106060 48% /boot
tmpfs 203216 0 203216 0% /run/user/0
df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 16G 3.6G 13G 23% /
devtmpfs 983M 0 983M 0% /dev
tmpfs 993M 0 993M 0% /dev/shm
tmpfs 993M 8.6M 984M 1% /run
tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sdb5 969M 2.5M 900M 1% /newdir
/dev/sda1 197M 94M 104M 48% /boot
tmpfs 199M 0 199M 0% /run/user/0

该命令所显示的内容中,每列所代表的意义如下:

列数 意义
第一列 分区的名字
第二列 该分区的总容量
第三列 已使用容量
第四列 可用的剩余容量
第五列 使用容量的百分比(若该数值达到90%以上,就需要进行管理了)
第六列 分区的挂载点

该命令所显示的内容中,挂载点的说明:

  • /dev和//dev/shm 为内存分区,默认大小为内存的1/2,如果我们把文件存在这个分区下,相当于存在了内存中,好处是读写速度非常快,坏处是系统重启时文件会丢失。
  • /run、/sys/fs/cgroup等分区都是tmpfs,跟/dev/shm类似,为临时文件系统,最好不要碰它们

1.2. du

du (disk useage)用来查看某个目录或文件所占空间的大小。

格式 du [-abckmsh] [文件或目录名]

常用选项 选项说明
不加参数 只会列出目录(包含子目录)的大小。默认单位为KB
-a 表示全部文件和目录的大小都列出来
-b 以B为单位输出
-k 以KB为单位输出
-m 以MB为单位输出
-h 自动以合适的单位输出
-c 表示最后加总(不常用)
-s 只列出总和(用的最多)

说明:这个命令用的最多的情况是这种形式: du -sh filename


2. 磁盘的分区

2.1. fdisk

fdisk 是Linux下硬盘的分区工具,是一个非常实用的命令,但是fdisk只能划分小于2TB的分区。大于2T的用parted命令。注意,分区是非常危险的操作,操作失误很可能会把数据弄丢,所以一定要高度警惕!

格式 fdisk [-l] 设备名称

说明:

  • fdisk 的选项只有-l这一个。
  • 选项-l的后面不加设备名称,会直接列出系统中所有的磁盘设备以及分区表。
  • 选项-l的后面加上设备名称,则会列出该设备的分区表。
  • fdisk -l 显示系统能够识别到的硬盘有哪些,每个硬盘的分区有哪些(类似 /dev/sda,/dev/sdb 等,和/dev/sda1,/dev/sda2等,大于2T用GPT分区表)。示例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    fdisk -l
    磁盘 /dev/sdb:5368 MB, 5368709120 字节,10485760 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x8de7a46e
    设备 Boot Start End Blocks Id System
    /dev/sdb1 2048 10485759 5241856 5 Extended
    /dev/sdb5 4096 2052095 1024000 83 Linux
    /dev/sdb6 2054144 4102143 1024000 83 Linux
    磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x000f3f8d
    设备 Boot Start End Blocks Id System
    /dev/sda1 * 2048 411647 204800 83 Linux
    /dev/sda2 411648 8800255 4194304 82 Linux swap / Solaris
    /dev/sda3 8800256 41943039 16571392 83 Linux
    # fdisk -l /dev/sda1
    磁盘 /dev/sda1:209 MB, 209715200 字节,409600 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
  • fdisk 如果不加-l选项,则会进入另一个模式,在该模式下,可以对磁盘进行分区操作。示例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    fdisk /dev/sdb
    欢迎使用 fdisk (util-linux 2.23.2)。
    更改将停留在内存中,直到您决定将更改写入磁盘。
    使用写入命令前请三思。
    命令(输入 m 获取帮助):m
    命令操作
    a toggle a bootable flag
    b edit bsd disklabel
    c toggle the dos compatibility flag
    d delete a partition
    g create a new empty GPT partition table
    G create an IRIX (SGI) partition table
    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)
    命令(输入 m 获取帮助):
  • 进入分区模式后,可以输入m获取命令列表的说明和帮助。其常用的操作命令如下:

命令 功能
m 获取命令列表和帮助
p 打印当前磁盘的分区情况
n 新建一个新的分区
w 保存分区
q 表示退出,若未进行保存,则会未保存退出,在此之前的一切分区工作都失效
d 删除一个分区
l 已知的分区类型列表

在工作中,常使用的就是给一个盘分一个主分区。

2.2. parted

2.2.1. 使用方法

parted命令是由GNU组织开发的一款功能强大的磁盘分区和分区大小调整工具,与fidisk不通,它支持调整分区的大小。作为一种设计用于Linux的工具,它没有构建成处理与fdisk关联的多种分区类型,但是,它可以处理最常见的分区格式,包括:ext2、ext3、XFS、fat16、fat32、NTFS、ReiserFS、JFS、UFS、HFS以及Linux交换分区。

语法:
parted [选项] [参数]

常用选项如下:

选项 意义
-h –help,显示帮助信息
-l –list,列出所有设备的分区信息
-i –interactive,交互式模式
-s –script,脚本模式,不提示用户
-v –version,显示版本号

参数说明如下:

  • 磁盘设备 :指定要分区的硬盘所对应的设备文件
  • 操作命令 :要执行的parted命令

操作命令如下:

操作命令 意义
cp [FROM-DEVICE] FROM-MINOR TO-MINOR 将文件系统复制到另一个分区
help [COMMAND] 打印通用求助信息,或关于COMMAND的信息
mklabel 标签类型 创建新的磁盘标签(分区表)
mkfs MINOR 文件系统类型 在 MINOR 创建类型为“文件系统类型”的文件系统
mkpart 分区类型 [文件系统类型] 起始点 终止点 创建一个分区
mkpartfs 分区类型 文件系统类型 起始点 终止点 创建一个带有文件系统的分区
move MINOR 起始点 终止点 移动编号为 MINOR 的分区
name MINOR 名称 将编号为 MINOR 的分区命名为“名称”
print [free或MINOR或all] 打印分区表,或者分区
quit 退出程序
rescue 起始点 终止点 挽救临近“起始点”、“终止点”的遗失的分区
resize MINOR 起始点 终止点 改变位于编号为 MINOR 的分区中文件系统的大小
rm MINOR 删除编号为 MINOR 的分区
select 设备 选择要编辑的设备
set MINOR 标志 状态 改变编号为 MINOR 的分区的标志(对于PC常用的msdoc分区表来说,分区标记FLAG可有如下值:boot(引导)、hidden(隐藏)、raid(软RAID磁盘阵)、lvm(逻辑卷)、lba(LBA,Logic Block Addressing模式))。状态的取值是: on或off

2.2.2. 操作实例

1、选择分区硬盘

首先类似fdisk一样,先选择要分区的硬盘,此处为/dev/hdd。((parted)表示在parted中输入的命令,其它为自动打印的信息):

1
2
3
4
[root@10.10.90.97 ~]# parted /dev/hdd
GNU Parted 1.8.1
Using /dev/hdd
Welcome to GNU Parted! Type 'help' to view a list of commands.

2、创建分区

选择了/dev/hdd作为我们操作的磁盘,接下来需要创建一个分区表(在parted中可以使用help命令打印帮助信息):

1
2
(parted) mklabel
New disk label type? gpt (我们要正确分区大于2TB的磁盘,应该使用gpt方式的分区表,输入gpt后回车)

3、完成分区操作

创建好分区表以后,接下来就可以进行分区操作了,执行mkpart命令,分别输入分区名称、文件系统和分区的起止位置:

1
2
3
4
5
(parted) mkpart
Partition name? []? dp1
File system type? [ext2]? ext3
Start? 0 (可以用百分比表示,比如Start? 0% , End? 50%)
End? 500GB

4、验证分区信息

分好区后可以使用print命令打印分区信息,下面是一个print的样例:

1
2
3
4
5
6
7
(parted) print
Model: VBOX HARDDISK (ide)
Disk /dev/hdd: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 500GB 500GB dp1

5、删除分区示例

如果分区错了,可以使用rm命令删除分区,比如我们要删除上面的分区,然后打印删除后的结果:

1
2
3
4
5
6
7
(parted)rm 1 #rm后面使用分区的号码,就是用print打印出来的Number
(parted) print
Model: VBOX HARDDISK (ide)
Disk /dev/hdd: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags

6、完整示例

按照上面的方法把整个硬盘都分好区,下面是一个分完后的样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(parted) mkpart
Partition name? []? dp1
File system type? [ext2]? ext3
Start? 0
End? 500GB
(parted) mkpart
Partition name? []? dp2
File system type? [ext2]? ext3
Start? 500GB
End? 2199GB
(parted) print
Model: VBOX HARDDISK (ide)
Disk /dev/hdd: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 500GB 500GB dp1
2 500GB 2199GB 1699GB dp2

7、格式化和挂载操作

完成以后我们可以使用quit命令退出parted并使用系统的mkfs命令对分区进行格式化了。

1
2
3
4
5
6
7
8
9
10
11
12
[root@10.10.90.97 ~]# fdisk -l
WARNING: GPT (GUID Partition Table) detected on '/dev/hdd'! The util fdisk doesn't support GPT. Use GNU Parted.
Disk /dev/hdd: 2199.0 GB, 2199022206976 bytes
255 heads, 63 sectors/track, 267349 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hdd1 1 267350 2147482623+ ee EFI GPT
[root@10.10.90.97 ~]# mkfs.ext3 /dev/hdd1
[root@10.10.90.97 ~]# mkfs.ext3 /dev/hdd2
[root@10.10.90.97 ~]# mkdir /dp1 /dp2
[root@10.10.90.97 ~]# mount /dev/hdd1 /dp1
[root@10.10.90.97 ~]# mount /dev/hdd2 /dp2


3. 格式化磁盘分区

磁盘分区后,还需要对其进行格式化操作才能使用。格式化就是为分区配置相应的文件系统。Win系统用Fat32和NTFS文件系统,而Linux用ext3、ext4或xfs文件系统在 CentOS 7 系统中,是以XFS作为默认的文件系统的,但是我们依旧可以给它指定ext3和ext4格式。

cat /etc/filesystems 查看系统支持哪些文件系统

3.1. mke2fs

mke2fs 用于给磁盘进行格式化。它和这几个工具具有相同的功能:

  • mkfs.ext2
  • mkfs.ext3
  • mkfs.ext4
    但需要注意的是,mke2fs并不支持把分区格式化为XFS系统,而只能使用mkfs.xfs。

mke2fs 的常用选项如下:

常用选项 选项说明
-b 分区时设定每个数据区块占用的空间大小。目前,每个数据块支持1024B、2048B和4096B。(设定为别的值可能会不能用)
-I 设定inode的大小
-i 设定块和inode数量的比例,比如块大小为4096,则后面加上8192,格式化后inode的数量是块数量的两倍
-N 设定inode的数量。有时默认的inode数不够用,所以要自定义inode的数量
-c 在格式化前先检测一下磁盘是否有问题,加上这个选项后,运行速度会非常慢
-L 预设该分区的标签(Label)
-j 建立ext3格式的分区。如果使用mkfs.ext3命令,就不用加这个选项了
-t 指定文件系统的类型,可以是ext2、ext3和ext4
-m 1 (表示百分之一对super user的保留,最小也支持0.1)格式化时,指定预留给管理员的磁盘比例,是一个百分比,只针对 mke2fs 命令

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# mke2fs -t ext4 /dev/sdb5
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
64000 inodes, 256000 blocks
12800 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=262144000
8 block groups
32768 blocks per group, 32768 fragments per group
8000 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

使用mkfs.xfs把分区格式化为XFS类型,示例如下:

1
2
3
4
5
6
7
8
9
10
# mkfs.xfs /dev/sdb7
meta-data=/dev/sdb7 isize=512 agcount=4, agsize=64000 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=256000, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

可以使用-L选项来指定标签。标签会在挂载磁盘的时候使用,也可以写入配置文件,这样会很可靠。示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# mke2fs -L TEST -t ext4 /dev/sdb5
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=TEST
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
64000 inodes, 256000 blocks
12800 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=262144000
8 block groups
32768 blocks per group, 32768 fragments per group
8000 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

3.2. e2label

e2label 用于查看或修改分区的标签,它只支持ext格式的文件系统,而不支持XFS文件系统。

示例如下:

1
2
3
4
5
# e2label /dev/sdb5
TEST
# e2label /dev/sdb5 TEST1
# e2label /dev/sdb5
TEST1


4. 挂载和卸载磁盘分区

格式化完成后,如果想要使用这些分区,就需要对它们进行挂载操作。格式化后的磁盘其实是一个块文件,类型为b。

在挂载某个分区之前,需要先建立一个挂载点,这个挂载点是以目录的形式出现的。一旦把某个分区挂载到这个挂载点(目录)下,要再往这个目录写数据时,就都会写到该分区。所以,在挂载该分区前,挂载点(目录)最好是个空目录。其实目录不为空并不影响所挂载分区的使用,但一旦挂载上了,该目录下以前的东西就看不到了(数据并没有丢失),除非卸载该分区。

4.1. /etc/fstab 配置文件

这个文件的内容就是系统启动时需要挂载的各个分区。我们可以在该文件里增加系统启动时需自动挂载的分区。文件内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Aug 15 00:19:30 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=1d54c61a-2320-4f2d-92d3-0bfbcebbf797 / xfs defaults 0 0
UUID=9f03989b-dc6d-4d48-99e1-a85984422d6c /boot xfs defaults 0 0
UUID=4ad00c9e-66f1-42c4-99b3-d9cd326b586a swap swap defaults 0 0
LABEL=TEST123 /newdir ext4 defaul

配置文件中各列的意义如下:

列数 意义
1 分区的标识,可以是分区的Label,分区的UUID,以及分区名(如/dev/sda1)
2 挂载点
3 分区的文件系统类型
4 mount的一些挂载参数。一般情况下,直接写defaults即可
5 是否被dump备份。1表示备份,0表示不备份
6 开机时是否自检磁盘。1和2都表示检测,0表示不检测。自检是,1比2优先级高,所以先检测1,再检测2。如果有多个分区需要开机检测,就都设置成2,1检测玩后会同时检测2.在CentOS7里,所有分区的该值都设置为0

下面是配置文件中第4列的常用选项:

选项 意义
default 表示按照大多数永久文件系统的默认值设置挂载定义,它包含了:rw、suid、dev、exec、auto、nouser和async
async和sync async表示磁盘和内存不同步。系统每隔一段时间就会把内存数据写入磁盘中,而sync则会时时同步内存和磁盘中的数据
auto和noauto 表示开机自动挂载或是不自动挂载
ro 按只读权限挂载
rw 按可读可写权限挂载
exec和noexec 表示允许或不允许可执行文件执行,但千万不要把根分区挂载为noexec,否则将无法只用系统,甚至连mount命令都无法使用
user和nouser 表示允许或不允许root外的其他用户挂载分区。为了安全,请用nouser
suid和nosuid 表示允许或不允许分区有suid属性,一般设置为nosuid
usrquota 表示启动用户的磁盘配额模式。磁盘配额会针对用户限定他们使用的磁盘额度
grquota 表示启动群组的磁盘配额模式

4.2. mount

mount 用于挂载分区。

直接运行 mount,会显示一大推信息,可在其中查看当前系统已挂载的所有分区、分区文件系统的类型、挂载点及一些选项等信息。如果想知道某个已挂载分区的文件系统类型,直接用mount命令查看即可。(查看未挂载的分区,可以使用后面所讲的blkid命令)

挂载操作,可以用分区名(如/dev/sdb5)、也可以用分区的Label和UUID的方式进行(更可靠)。示例如下所示:

1
2
3
# mount /dev/sdb5 /newdir
# mount LABEL=TEST /newdir

mount的常用选项如下:

常用选项 选项说明
-a 会把 /etc/fstab 配置文件中出现的所有磁盘分区挂载上
-t 用来指定挂载的分区类型,默认不指定,会自动识别
-o 用来指定挂载的分区有哪些特性,即上面/etc/fstab配置文件中第4列的哪些(该选项常用)。例如mount -oremount,ro /dev/sdb5 /db5 重新挂载该分区为只读。mount -o loop \*.iso 挂载点 挂载一个镜像文件
–bind 源目录 目标目录 挂载一个目录到另一个目录

建议:在进行分区的挂载操作时,最好用分区的LABEL或UUID挂载。

4.3. blkid

blkid 用来获取全部磁盘分区的UUID。如果分区在格式化时指定了Label,该命令也会显示LABEL值、文件系统的类型。

示例如下:

1
2
3
4
5
6
7
8
# blkid
/dev/sdb5: LABEL="TEST1" UUID="d2c3e579-dc31-4121-95b8-789e41fbdd96" TYPE="ext4"
/dev/sdb6: UUID="e9d355cd-d339-4bfe-ab4e-b6ed0a766964" TYPE="xfs"
/dev/sdb7: UUID="ea87ed23-218c-4fed-a600-823c24ac35b2" TYPE="xfs"
/dev/sda1: UUID="9f03989b-dc6d-4d48-99e1-a85984422d6c" TYPE="xfs"
/dev/sda2: UUID="4ad00c9e-66f1-42c4-99b3-d9cd326b586a" TYPE="swap"
/dev/sda3: UUID="1d54c61a-2320-4f2d-92d3-0bfbcebbf797" TYPE="xfs"
/dev/sr0: UUID="2016-12-05-13-52-39-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"

这个命令后面也可以指定查询哪个分区:

1
2
# blkid /dev/sdb5
/dev/sdb5: LABEL="TEST1" UUID="d2c3e579-dc31-4121-95b8-789e41fbdd96" TYPE="ext4"

查询到某个分区的UUID后,如何使用?用法如下:
mount UUID="d2c3e579-dc31-4121-95b8-789e41fbdd96" /newdir

4.4. umount

umount 用于卸载分区。

格式 umount 挂载点/分区名 。注意,卸载时不能跟LABEL和UUID。

有时,umount的-l选项很有用。当当前目录在即将要卸载的分区内时,会遇到不能卸载的情况。解决这个问题的方法有两个,一个是从该分区切换到别的分区,另一个就是加上-l这个选项。

4.5. 让某个分区在开机后自动挂载

有两个方法:

  1. 在/etc/fstab文件中配置
  2. 在/etc/rc.d/rc.local文件中,添加一行挂载该分区的命令(注意,命令用绝对路径的写法,且把该文件的权限设置一下: chmod a+x /etc/rc.d/rc.local。因为CentOS7中该文件默认没有执行权限)

一个小建议,那就是挂载磁盘分区的时候,尽量使用 UUID 或者 LABEL 这两种方法。


5. 建立一个Swap文件增加虚拟内存

首先介绍一下dd命令。

5.1. dd

dd命令用于创建指定大小的文件。

格式 dd if=指定源 of=指定目标文件 bs=指定块大小 count=指定块数量

说明:

  • 用if指定源(一般是用/dev/zero,它是Unix系统特有的一个文件,它可以源源不断地提供”0”)
  • 用of指定目标文件,这里写上新建文件的名字
  • bs乘以count的得数就是即将创建的文件的大小

5.2. 增加虚拟内存的实现方法

增加虚拟磁盘的思路是:建立swapfile–>格式化为swap格式–>启用该虚拟磁盘。

具体操作如下:

  1. 建立swapfile : dd if=/dev/zero of=/tmp/newdisk bs=1M count=1024
  2. 将其格式化为swap格式: mkswap -f /tmp/newdisk
  3. 挂载使用: swapon /tmp/newdisk
  4. 关闭临时swap: swapoff /tmp/newdisk

6. 补充的内容

6.2. LVM

  1. 好处是扩展性好
  2. 坏处是数据损坏时可恢复性很小,因此LVM在企业中用的很少,初学时可以不学了

6.3. fsck

fsck 用于修复磁盘,但有时会把磁盘中的数据弄丢,因此不常用。

格式 fsck -y 分区名

OK

0%