磁盘管理

存储管理

一、认识磁盘

什么是磁盘:

磁盘是一种计算机的外部存储器设备,由一个或多个覆盖有磁性材料的铝制或玻璃制的碟片组成,用来存储用户的信息,这种信息可以反复地被读取和改写。绝大多数磁盘被永久封存在一个密封的盒子里。

img

img

磁盘运行机理:

简单来说就是多个盘片之间靠主轴连接,电机带动主轴做旋转运动,通过多个磁头臂的摇摆和磁盘的旋转,磁头就可以在磁盘旋转的过程中就读取到磁盘中存储的各种数据

磁盘的扇区、磁道、柱面:

(1)磁道:磁盘的每个盘面被划分为许多同心圆,这些同心圆的轨道叫做磁道。 (2)扇区:一个盘面划分为若干个内角相同的扇形,这样盘面上的每个磁道就被分为若干段圆弧,每段圆弧叫做一个扇区。每个扇区中的数据作为一个单元同时被读入或写入。每一个扇区是512字节,其中有64个字节存储的是分区表,一条分区信息占16个字节 (3)柱面:每一个盘片同一大小的同心圆可以看成连在一起的柱面,磁盘在分区的时候最小单位是柱面,每一个盘片的上下面都可以读取数据,每一个磁头,不可以跨盘面读取数据。

img

img

 

二、磁盘的分区

为什么要分区

(1)易于管理和使用:

比如说我们把磁盘分了sda1、sda2、sda3、sda4盘,我们假设sda1盘为系统盘,其他的比如说游戏、办公、软件盘,这样我们要重新分哪个区就直接在对应的盘分就可以了,不需要整块磁盘进行分区。根据用途我们也能较快的去使用相应的磁盘。

(2)有利于数据的安全:

通过分区可以降低数据损失的风险。出现硬盘坏道、错误操作、重装系统都有可能造成数据损失,如果分区了,那么我们就可以将损失最小化。

(3)节约寻找文件的时间:

这个我觉得跟第一条比较像,但是这里所说的寻找文件的时间,是指电脑搜索文件的时间。分区以后,电脑搜索文件时只需要在相对应的分区搜索就可以了,没必要进行全盘搜索。大大节省了寻找文件的时间。

下图为硬盘的柱面区间示意图:

img

由于我们之前说过一个扇区是512字节,其中有64个字节存储的是分区表,一条分区信息占16个字节,因此磁盘最多只能分四个分区,要想有多个分区怎么办?这时候就有了扩展分区。

扩展分区:

比如说是图中p4为扩展分区,扩展分区可以被继续划分为多个逻辑分区,逻辑分区是可以进行格式化的。扩展分区把逻辑分区的分区信息在扩展分区中找了一个位置给存起来。假如说p4扩展分区划分了三个逻辑分区那么第1个逻辑分区命名为sda5、第2个为sda6、第3个sda7,以此类推。 上面所说的是一个磁盘被分为四个分区,第四个分区被设置为扩展分区,第一个逻辑分区为sda5。但是当整个磁盘被分为3个分区的时候,我们把扩展分区划分的第1个逻辑分区依然命名为sda5,而不是其它的。总结一下,就是不论磁盘有几个主分区,第一个逻辑分区一定是从sda5开始。

 

三、磁盘在系统同的命名

设备名称分区信息设备类型
/dev/sda /dev/sda1 第一块物理磁盘第一分区
/dev/sdb /dev/sdb 第二块磁盘第二个分区
/dev/vdd /dev/vdd4 第四块虚拟磁盘的四个分区

分区主要分为三类:主分区《--- 扩展分区《--- 逻辑分区

#1、逻辑分区属于扩展分区, 扩展分区属于主分区
#2、主分区又叫做引导分区, 是可以安装系统的分区

image-20201106201911589

目前常见的磁盘分区格式有两种, MBR 分区和 GPT 分区:

  • MBR 分区, MBR 的意思是 " 主引导记录"。MBR 最大支持 2TB 容量, 在容量方面存在着极大的瓶颈。最多4个主分区、通常用于<2T的硬盘空间。

  • GPT 分区, GPT 意为 GUID 分区表, 它支持的磁盘容量比 MBR 大得多。这是一个正逐渐取代 MBR 的新标准, 它是由 UEFI辅住而形成的, 将来 UEFI 用于取代老旧的 BIOS , 而 GBT 则取代老旧的 MBR 。最多128个主分区、通常用于>2T的硬盘空间

磁盘分区工具

  • MBR分区格式====》分区工具fdisk(最多4个主分区、通常用于<2T的硬盘空间)

  • GPT分区格式=====》分区工具gdisk(最多128个主分区、通常用于>2T的硬盘空间)

MBR格式和GPT格式区别:

  • 支持的硬盘空间大小不同

  • 支持主分区大小不同

四、磁盘的分区

MBR分区

  • fdisk命令用法:

用法:
fdisk [选项] <磁盘>   更改分区表
fdisk [选项] -l <磁盘> 列出分区表
fdisk -s <分区>       给出分区大小(块数)

选项:
-b <大小>             扇区大小(512、1024、2048或4096)
-c[=<模式>]           兼容模式:“dos”或“nondos”(默认)
-h                   打印此帮助文本
-u[=<单位>]           显示单位:“cylinders”(柱面)或“sectors”(扇区,默认)
-v                   打印程序版本
-C <数字>             指定柱面数
-H <数字>             指定磁头数
-S <数字>             指定每个磁道的扇区数
  • fdisk工具

    适用于磁盘小于2TB的磁盘, 分区类型MBR, 主分区4或主分区3+扩展分区 (逻辑分区+…) , 分区后需要保存后才能生效

(1) 在进行分区时,首先我们需要查看当前磁盘的一个分区状况,使用命令:fdisk -l

[root@localhost ~]# fdisk -l

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000e88a1

  设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      976895      487424   83  Linux
/dev/sda2          976896     4882431     1952768   82  Linux swap / Solaris
/dev/sda3         4882432    41943039    18530304   83  Linux

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/sdc:2684.4 GB, 2684354560000 字节,5242880000 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

#注意:/dev/sda1 后面有个*,表示该磁盘用于引导系统进行启动。
sda1:存放的是与系统相关的文件
sda2:虚拟内存交换分区
sda3:为我们系统上的根分区

start、end表示分区开始的扇区位置和结束的扇区位置。
blocks:表示块的信息,一个块里面有多个扇区。
Id:表示磁盘编号
system:表示Linux系统分区的一个分区信息。

PS:也可用lsblk命令查看设备详情,以及分区的情况

[root@localhost ~]# lsblk /dev/sda
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk
├─sda1   8:1    0  476M  0 part /boot
├─sda2   8:2    0  1.9G  0 part [SWAP]
└─sda3   8:3    0 17.7G  0 part /
[root@localhost ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  20G  0 disk
[root@localhost ~]# lsblk /dev/sdc
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdc    8:32   0  2.5T  0 disk

(2)然后使用命令:fdisk /dev/sda  让硬盘进入分区模式

[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xfa3cb009 创建新的 DOS 磁盘标签。

# 此时命令栏提示输入m来寻求帮助,那么我们输入m,来看一下都有哪些选项。
Command (m for help): m #输入m查看帮助
Command action
a toggle a bootable flag #切换分区启动标记
b edit bsd disklabel #编辑sdb磁盘标签
c toggle the dos compatibility flag #切换dos兼容模式
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 #创建新的sun磁盘标签
t change a partitions system id #修改分区ID,可以通过1查看id
u change display/entry units #修改容量单位,磁柱或扇区
v verify the partition table #检验分区表
w write table to disk and exit #保存退出
x extra functionality (experts only) #拓展功能

优先掌握:

n添加一个新分区q不保存就退出p打印分区表m打印选项菜单
d 删除一个分区 w 保存退出 t 改变系统id号    

(3)开始创建分区,因此我们输入n,然后回车

命令(输入 m 获取帮助):n
Partition type:
  p   primary (0 primary, 0 extended, 4 free)
  e   extended
Select (default p):

我们看到primary显示的是0个主要分区,0个扩展分区,还有4个闲置分区。
绿色光标前的default p表示的是默认为主分区。我们除了直接回车进入下一步,也可以输入p进入下一步。

#1、首先让我们选择分区号,此时在所在的位置选选择输入起始位置,也就是起始扇区。当然,我们不用输入,直接回车就好进入下一步。它就是为了能够将后面的所有可用扇区充分的利用上,而默认选择可用扇区的起始最小扇区。

分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048

# 2、此时光标所在的位置表示选择输入终了位置,也就是结束扇区。我们输入:+1G,然后回车。

Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+1G
分区 1 已设置为 Linux 类型,大小设为 1 GiB

# 3、到这里我们创建的主分区已经创建好了,我们在命令行界面输入p查看一下分区情况:

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xd7acfcfc

  设备 Boot     Start         End     Blocks   Id System
/dev/sdb1            2048     2099199     1048576   83 Linux
# 以上就是我们创建的主分区以及他的起始,终了扇区位置信息;块信息;id编号信息,分区信息。

(4)重复上述步骤,创建四个主分区

命令(输入 m 获取帮助):n
Partition type:
  p   primary (1 primary, 0 extended, 3 free)
  e   extended
Select (default p): p
分区号 (2-4,默认 2):
起始 扇区 (2099200-41943039,默认为 2099200):
将使用默认值 2099200
Last 扇区, +扇区 or +size{K,M,G} (2099200-41943039,默认为 41943039):+1G
分区 2 已设置为 Linux 类型,大小设为 1 GiB

命令(输入 m 获取帮助):n
Partition type:
  p   primary (2 primary, 0 extended, 2 free)
  e   extended
Select (default p): p
分区号 (3,4,默认 3):
起始 扇区 (4196352-41943039,默认为 4196352):
将使用默认值 4196352
Last 扇区, +扇区 or +size{K,M,G} (4196352-41943039,默认为 41943039):+1G
分区 3 已设置为 Linux 类型,大小设为 1 GiB

命令(输入 m 获取帮助):n
Partition type:
  p   primary (3 primary, 0 extended, 1 free)
  e   extended
Select (default e): p
已选择分区 4
起始 扇区 (6293504-41943039,默认为 6293504):
将使用默认值 6293504
Last 扇区, +扇区 or +size{K,M,G} (6293504-41943039,默认为 41943039):+1G
分区 4 已设置为 Linux 类型,大小设为 1 GiB
命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xd7acfcfc

  设备 Boot     Start         End     Blocks   Id System
/dev/sdb1            2048     2099199     1048576   83 Linux
/dev/sdb2         2099200     4196351     1048576   83 Linux
/dev/sdb3         4196352     6293503     1048576   83 Linux
/dev/sdb4         6293504     8390655     1048576   83 Linux

此时虽然空间够用,但已经无法创建新的了

命令(输入 m 获取帮助):n
If you want to create more than four partitions, you must replace a
primary partition with an extended partition first.

删除主分区4,然后新建一个扩展分区,剩余空间都给它

命令(输入 m 获取帮助):n #删除主分区4
Partition type:
  p   primary (3 primary, 0 extended, 1 free)
  e   extended
Select (default e): e #创建扩展分区
已选择分区 4
起始 扇区 (6293504-41943039,默认为 6293504):
将使用默认值 6293504
Last 扇区, +扇区 or +size{K,M,G} (6293504-41943039,默认为 41943039):   #直接回车,把剩余空间都给它
将使用默认值 41943039
分区 4 已设置为 Extended 类型,大小设为 17 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xd7acfcfc

  设备 Boot     Start         End     Blocks   Id System
/dev/sdb1            2048     2099199     1048576   83 Linux
/dev/sdb2         2099200     4196351     1048576   83 Linux
/dev/sdb3         4196352     6293503     1048576   83 Linux
/dev/sdb4         6293504    41943039    17824768    5 Extended

有了扩展分区,那么我们才可以创建逻辑分区。我们在命令行输入n添加一个新分区,此时添加的分区就是逻辑分区。

命令(输入 m 获取帮助):n
All primary partitions are in use
添加逻辑分区 5
起始 扇区 (6295552-41943039,默认为 6295552):
将使用默认值 6295552

# 到这里它在询问扇区结束位置,说白了就是我们在设置逻辑分区大小。输入格式为:+扇区 或者 +数值大小{单位}

然后我们输入:+2G  表示设置大小为的2G的逻辑空间。回车之后就完成了新的分区的设置。


Last 扇区, +扇区 or +size{K,M,G} (6295552-41943039,默认为 41943039):+2G
分区 5 已设置为 Linux 类型,大小设为 2 GiB

#创建第二个逻辑分区
命令(输入 m 获取帮助):n
All primary partitions are in use
添加逻辑分区 6
起始 扇区 (10491904-41943039,默认为 10491904):
将使用默认值 10491904
Last 扇区, +扇区 or +size{K,M,G} (10491904-41943039,默认为 41943039):+3G
分区 6 已设置为 Linux 类型,大小设为 3 GiB

# 紧接着我们输入p打印分区表查看分区信息。
命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xd7acfcfc

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     4196351     1048576   83  Linux
/dev/sdb3         4196352     6293503     1048576   83  Linux
/dev/sdb4         6293504    41943039    17824768    5  Extended
/dev/sdb5         6295552    10489855     2097152   83  Linux
/dev/sdb6        10491904    16783359     3145728   83  Linux
  • 此时不要着急,我们一定要记住要保存,在命令行输入w保存分区信息。我们通过w保存并退出后,使用fdisk -l  可以查看到磁盘的分区信息。

    命令(输入 m 获取帮助):w #保存退出
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    正在同步磁盘。
    
    [root@localhost ~]# fdisk -l 
    
    磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x000e88a1
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048      976895      487424   83  Linux
    /dev/sda2          976896     4882431     1952768   82  Linux swap / Solaris
    /dev/sda3         4882432    41943039    18530304   83  Linux
    
    磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0xd7acfcfc
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048     2099199     1048576   83  Linux
    /dev/sdb2         2099200     4196351     1048576   83  Linux
    /dev/sdb3         4196352     6293503     1048576   83  Linux
    /dev/sdb4         6293504    41943039    17824768    5  Extended
    /dev/sdb5         6295552    10489855     2097152   83  Linux
    /dev/sdb6        10491904    16783359     3145728   83  Linux
    
    磁盘 /dev/sdc:2684.4 GB, 2684354560000 字节,5242880000 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    

     

  • 但是当你在格式化的时候,有可能找不到这个分区。这是因为Linux没有把分区信息读到内核来,我们需要输入partprobe这个命令,来使我们内核重读一下我们的分区信息。

[root@localhost ~]# partprobe 
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。

GPT分区

新增一块2500的硬盘,然后用GPT的方式格式化

需要安装命令

[root@localhost ~]# yum install gdisk -y
[root@localhost ~]# gdisk /dev/sdc
Command (? for help): m
b	back up GPT data to a file #将GPT数据备份到文件中
c	change a partition's name #更改分区的名称
d	delete a partition #删除分区
i	show detailed information on a partition #显示分区的详细信息
l	list known partition types #列出已知的分区类型
n	add a new partition #添加一个新的分区
o	create a new empty GUID partition table (GPT) #创建一个新的空GUID分区
p	print the partition table #打印分区表
q	quit without saving changes #没有保存更改就退出
r	recovery and transformation options (experts only) #恢复和转换选项(仅限专家使用)
s	sort partitions #年代分类分区
t	change a partition's type code #不要更改分区的类型代码
v	verify disk #验证磁盘
w	write table to disk and exit #将表写入磁盘并退出
x	extra functionality (experts only) #额外功能(仅限专家使用)
?	print this menu #打印菜单

优先掌握

npdw
新建分区 打印分区表 删除分区 将表写入磁盘并退出

gdisk创建分区

Command (? for help): n #新建分区
Partition number (1-128, default 1):  #直接回车,默认分区号为1
First sector (34-5242879966, default = 2048) or {+-}size{KMGTP}:  #直接回车,使用默认的起始位置
Last sector (2048-5242879966, default = 5242879966) or {+-}size{KMGTP}: +1G #设定1G的空间
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): L #列出所有文件系统,会看到一系列文件系统信息, 默认的8300编号代表工Linux filesystem, 用它就好。
0700 Microsoft basic data  0c01 Microsoft reserved    2700 Windows RE          
3000 ONIE boot             3001 ONIE config           4100 PowerPC PReP boot   
4200 Windows LDM data      4201 Windows LDM metadata  7501 IBM GPFS            
7f00 ChromeOS kernel       7f01 ChromeOS root         7f02 ChromeOS reserved   
8200 Linux swap            8300 Linux filesystem      8301 Linux reserved      
8302 Linux /home           8400 Intel Rapid Start     8e00 Linux LVM           
a500 FreeBSD disklabel     a501 FreeBSD boot          a502 FreeBSD swap        
a503 FreeBSD UFS           a504 FreeBSD ZFS           a505 FreeBSD Vinum/RAID  
a580 Midnight BSD data     a581 Midnight BSD boot     a582 Midnight BSD swap   
a583 Midnight BSD UFS      a584 Midnight BSD ZFS      a585 Midnight BSD Vinum  
a800 Apple UFS             a901 NetBSD swap           a902 NetBSD FFS          
a903 NetBSD LFS            a904 NetBSD concatenated   a905 NetBSD encrypted    
a906 NetBSD RAID           ab00 Apple boot            af00 Apple HFS/HFS+      
af01 Apple RAID            af02 Apple RAID offline    af03 Apple label         
af04 AppleTV recovery      af05 Apple Core Storage    be00 Solaris boot        
bf00 Solaris root          bf01 Solaris /usr & Mac Z  bf02 Solaris swap        
bf03 Solaris backup        bf04 Solaris /var          bf05 Solaris /home       
bf06 Solaris alternate se  bf07 Solaris Reserved 1    bf08 Solaris Reserved 2  
bf09 Solaris Reserved 3    bf0a Solaris Reserved 4    bf0b Solaris Reserved 5  
c001 HP-UX data            c002 HP-UX service         ea00 Freedesktop $BOOT   
eb00 Haiku BFS             ed00 Sony system partitio  ed01 Lenovo system partit
Press the <Enter> key to see more codes: 
ef00 EFI System            ef01 MBR partition scheme  ef02 BIOS boot partition 
fb00 VMWare VMFS           fb01 VMWare reserved       fc00 VMWare kcore crash p
fd00 Linux RAID            
Hex code or GUID (L to show codes, Enter = 8300):  #直接回车用默认8300就好
Changed type of partition to 'Linux filesystem'

# 再新建一个分区
Command (? for help): n
Partition number (2-128, default 2): 
First sector (34-5242879966, default = 2099200) or {+-}size{KMGTP}: 
Last sector (2099200-5242879966, default = 5242879966) or {+-}size{KMGTP}: +1G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): w #保存

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y #输入y保存
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.

 

五、磁盘的格式化制作文件系统

认识格式化:

格式化:指将分区格式化成不同的文件系统。 那什么是文件系统呢? 文件系统:指操作系统用于明确存储设备或分区上的文件的方法和数据结构:即在存储设备上组织文件的方法。就好比一个教室,同学们的坐的位置总是与桌子凳子排列的方式有关系。桌子,凳子怎么摆放,就导致了同学坐的位置在哪里。文件系统存放数据也是这么个道理。

Linux系统下的文件类型:

Linux下的文件类型有ext2、ext3、ext4、xfs等等,我们可以使用命令:mkfs. 然后用按两下Tab来查看都有哪些文件类型。

[root@localhost ~]# mkfs.
mkfs.btrfs   mkfs.ext2    mkfs.ext4    mkfs.xfs
mkfs.cramfs  mkfs.ext3    mkfs.minix 

磁盘的格式化:

我们现在要对刚才创建的分区进行格式化。

可以不分区, 直接格式化制作文件系统

[root@localhost ~]# mkfs.xfs /dev/sdb #/dev/sdb整体就是一个分区

 

(1)在命令行输入mkfs.xfs /dev/sdb1      意思就是格式化devx下的sdb1式化类型为.xfs

[root@localhost ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
root@localhost ~]# mkfs.xfs /dev/sdb2
[root@localhost ~]# mkfs.xfs /dev/sdb3
[root@localhost ~]# mkfs.xfs /dev/sdb4  #拓展分区,里面包含逻辑分区表,扩展分区不能被格式化,只能用来划分逻辑分区
mkfs.xfs: /dev/sdb4 appears to contain a partition table (dos).
mkfs.xfs: Use the -f option to force overwrite.
[root@localhost ~]# mkfs.xfs /dev/sdb5
[root@localhost ~]# mkfs.xfs /dev/sdb6

强制重新格式化需要加-f

[root@localhost ~]# mkfs.xfs -f /dev/sdc3 
meta-data=/dev/sdc3              isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

PS:

centos7 选择xfs 格式作为默认文件系统, 而且不再使用以前的ext, 仍然支持ext4 , xfs 专为大数据产 生, 每个单个文件系统最大可以支持8eb , 单个文件可以支持16tb , 不仅数据量大, 而且扩展性高。还可以通过xfsdump, xfsrestore 来备份和恢复。

(2)格式化完毕后我们使用命令:ll  来查看我们格式化完毕后的分区的文件类型信息。

[root@localhost ~]# ll /dev/sdb1
brw-rw---- 1 root disk 8, 17 11月  8 15:47 /dev/sdb1
# 我们从信息中可以看出来sdc为一个块设备文件。8表示主设备号,17表示的为从设备号。

[root@localhost ~]# ll /dev/sdb2
brw-rw---- 1 root disk 8, 18 11月  8 15:48 /dev/sdb2
[root@localhost ~]# ll /dev/sdb3
brw-rw---- 1 root disk 8, 19 11月  8 15:48 /dev/sdb3
[root@localhost ~]# ll /dev/sdb4
brw-rw---- 1 root disk 8, 20 11月  8 15:48 /dev/sdb4
[root@localhost ~]# ll /dev/sdb5
brw-rw---- 1 root disk 8, 21 11月  8 15:48 /dev/sdb5
[root@localhost ~]# ll /dev/sdb6
brw-rw---- 1 root disk 8, 22 11月  8 15:48 /dev/sdb6
[root@localhost ~]# ll /dev/sdc1
brw-rw---- 1 root disk 8, 33 11月  8 16:08 /dev/sdc1
[root@localhost ~]# ll /dev/sdc2
brw-rw---- 1 root disk 8, 34 11月  8 16:08 /dev/sdc2

六、磁盘的挂载

认识挂载:

(1)Linux的宗旨是一切皆文件。我们存储的所有文件都在sda3下存放着,sda3也就是我们的根。那我们要在其他分区中写入文件时,首先要其他分区要与sda3先建立一个联系,这个联系就是一个目录。建立联系的过程我们叫做挂载 (2)当我们访问sda3底下的这个目录的时候,实际上我们访问的才是其他分区的设备文件。这个目录相当于一个访问其他分区的入口,可以理解为一个接口,有了这个接口才可以访问这个磁盘。

[root@localhost ~]# cd /
[root@localhost /]# ll -d m*
drwxr-xr-x. 2 root root 6 11月  5 2016 media
drwxr-xr-x. 2 root root 6 11月  5 2016 mnt

 

磁盘的挂载:

(1)挂载点目录:我们将磁盘切到根目录, mediamnt 这两个目录被叫做挂载点目录。除此之外,我们也可以自己创建一个目录作为一个挂载点目录。我们这里选择创建文件夹

[root@localhost ~]# cd /
[root@localhost /]# ll -d m*
drwxr-xr-x. 2 root root 6 11月  5 2016 media
drwxr-xr-x. 2 root root 6 11月  5 2016 mnt

(2)临时挂载:将指定的一个目录作为挂载点目录时,如果挂载点的目录有文件,那么文件会被隐藏。因此当我们需要挂载目录时,最好新建一个空文件夹来作为挂在点目录。(重启后失效

1、首先在根下创建一个test目录用于测试,在test目录中创建一个文件夹
[root@localhost /]# mkdir -p /test/{a..f}

2、然后我们挂载sdb1,使用命令:mount 
实例如下:
[root@localhost test]# mount /dev/sdb1 /test/a
[root@localhost test]# mount /dev/sdb2 /test/b
[root@localhost test]# mount /dev/sdb3 /test/c
[root@localhost test]# mount /dev/sdb5 /test/d
[root@localhost test]# mount /dev/sdb6 /test/f
3、使用命令df -h这更易于我们对磁盘的信息的了解。包括文件的大小,已经使用的分区大小,总共可用分区的大小,使用率,以及挂载的位置。
[root@localhost test]# df -H 
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        19G  1.1G   18G    6% /
devtmpfs        997M     0  997M    0% /dev
tmpfs           1.1G     0  1.1G    0% /dev/shm
tmpfs           1.1G  9.1M  998M    1% /run
tmpfs           1.1G     0  1.1G    0% /sys/fs/cgroup
/dev/sda1       496M  116M  380M   24% /boot
tmpfs           202M     0  202M    0% /run/user/0
/dev/sdb1       1.1G   34M  1.1G    4% /test/a
/dev/sdb2       1.1G   34M  1.1G    4% /test/b
/dev/sdb3       1.1G   34M  1.1G    4% /test/c
/dev/sdb5       2.2G   34M  2.2G    2% /test/d
/dev/sdb6       3.3G   34M  3.2G    2% /test/f

[root@localhost test]# mount /dev/sdb4 /test/e #扩展分区,无法挂载,我们真正要使用的是逻辑分区。
mount: /dev/sdb4 写保护,将以只读方式挂载
mount: 未知的文件系统类型“(null)”

卸载:

[root@localhost ~]# umount /dev/sdb2 #或者umount /test/b

# 强制卸载:
[root@localhost ~]# umount -l /test/e/ #或者/dev/sdb
[root@localhost ~]# df -H 
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        19G  1.1G   18G    6% /
devtmpfs        997M     0  997M    0% /dev
tmpfs           1.1G     0  1.1G    0% /dev/shm
tmpfs           1.1G  9.1M  998M    1% /run
tmpfs           1.1G     0  1.1G    0% /sys/fs/cgroup
/dev/sda1       496M  116M  380M   24% /boot
tmpfs           202M     0  202M    0% /run/user/0
/dev/sdb1       1.1G   34M  1.1G    4% /test/a
/dev/sdb3       1.1G   34M  1.1G    4% /test/c
/dev/sdb5       2.2G   34M  2.2G    2% /test/d
/dev/sdb6       3.3G   34M  3.2G    2% /test/f

永久挂载:使用永久挂载,就意味着它开机会自动挂载。

命令:blkid:查看对应分区的UUID(编号)。UUID唯一标识每一个分区,防止错误的挂载。除此之外,还会显示分区的类型。(先复制一下分区的UUID,一会儿会用到)

[root@localhost ~]# blkid 
/dev/sr0: UUID="2017-09-06-10-51-00-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" 
/dev/sda1: UUID="1cf1fc42-bd0a-47bd-a440-760918d7dee0" TYPE="xfs" 
/dev/sda2: UUID="63801999-c870-43b4-96ad-5007f35314ff" TYPE="swap" 
/dev/sda3: UUID="459bd90a-e904-4505-a79a-fee152337270" TYPE="xfs" 
/dev/sdb1: UUID="753f1b55-af7f-4811-86b2-86c40f5348d2" TYPE="xfs" 
/dev/sdb2: UUID="40c6284f-c740-445f-a76d-1f761ee787d9" TYPE="xfs" 
/dev/sdb3: UUID="36ec48ec-0546-4e5b-b2d1-13e1771a2d5b" TYPE="xfs" 
/dev/sdb5: UUID="a10e872d-ca6e-4d34-8963-423bd85c3bd2" TYPE="xfs" 
/dev/sdb6: UUID="8954f2af-d23e-4d75-ae3d-a00f8ecc6f03" TYPE="xfs" 
/dev/sdc1: UUID="77a36418-e51d-4b96-9bc1-ef816de72bba" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="c553df0c-c4e2-4284-b157-8a252c4d6268" 
/dev/sdc2: UUID="32ce7d31-58fc-4053-836d-09829b2f9d52" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="1d3cf3dc-38f3-4864-a4f7-f090279388c6" 
/dev/sdc3: UUID="35a5a857-bf15-4b27-998c-486b2dc6d0ee" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="ee238f81-04bb-4530-a383-7d24ace9ce85" 

 

使用vim编辑 /etc/fstab  在命令行直接输入vim /etc/fstab 就可以编辑,实现开机自动挂载。

[root@localhost ~]# cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sun Oct 25 00:06:48 2020
#
# 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=459bd90a-e904-4505-a79a-fee152337270 /                       xfs     defaults        0 0
UUID=1cf1fc42-bd0a-47bd-a440-760918d7dee0 /boot                   xfs     defaults        0 0
UUID=63801999-c870-43b4-96ad-5007f35314ff swap                    swap    defaults        0 0
[root@localhost ~]# cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sun Oct 25 00:06:48 2020
#
# 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=459bd90a-e904-4505-a79a-fee152337270 /                       xfs     defaults        0 0
UUID=1cf1fc42-bd0a-47bd-a440-760918d7dee0 /boot                   xfs     defaults        0 0
UUID=63801999-c870-43b4-96ad-5007f35314ff swap                    swap    defaults        0 0
字段含义
第一字段 UUID或设备名,推荐UUID
第二字段 挂载点
第三字段 文件系统,光盘文件系统为iso9660
第四字段 文件系统的选项,也就是mount -o 选项可指定的属性。
第五字段 能否被dump指令备份,0表示不备份,1表示每天备份,2不定日期备份。
第六字段 开机是否以fsck检测。xfs文件系统会自动检测,这项也置0即可。

补充: 磁盘挂载mount

  • 使用mount命令,查看到当前系统上所有磁盘的挂载信息,但读起来较费劲,红色线条可以告诉我们在哪里挂载的,磁盘的格式类型,读写权限,等其他信息。

    image-20201108174241211

    补充

-t 指定文件系统
-a 挂载/etc/fstab 中配置文件中的所有
[root@localhost ~]# mount -t xfs /dev/sdb1 /test/a/
可以看到文件系统的UUID并挂载
[root@egon ~]# blkid | grep sdb1
/dev/sdb1: UUID="10a939a8-d17c-4a0f-9a89-8066ac013855" TYPE="xfs" 
[root@egon ~]# mount UUID="10a939a8-d17c-4a0f-9a89-8066ac013855" /opt
[root@egon ~]# mount -a #挂载配置文件etc/fstab 中的所有
[root@egon ~]# df #查看挂载情况
[root@localhost ~]# lsblk 查看每个分区下有分区信息
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk 
├─sda1   8:1    0  476M  0 part /boot
├─sda2   8:2    0  1.9G  0 part [SWAP]
└─sda3   8:3    0 17.7G  0 part /
sdb      8:16   0   20G  0 disk 
├─sdb1   8:17   0    1G  0 part /test/a
├─sdb2   8:18   0    1G  0 part 
├─sdb3   8:19   0    1G  0 part /test/c
├─sdb4   8:20   0    1K  0 part 
├─sdb5   8:21   0    2G  0 part /test/d
└─sdb6   8:22   0    3G  0 part /test/f
sdc      8:32   0  2.5T  0 disk 
├─sdc1   8:33   0    1G  0 part 
├─sdc2   8:34   0    1G  0 part 
└─sdc3   8:35   0    1G  0 part 
sr0     11:0    1  4.2G  0 rom  
  • mount命令:显示当前系统已挂载的所有设备。

格式:#mount Device Drictory
     device:指明要挂载的设备
        设备文件,例如/dev/sda2 
        卷标:-L ‘LABEL' 例如:-L ‘MYDATA' 
        UUID:-U 伪文件系统名称:proc,sysfs,devtmpfs
 dir:挂载点,必须事先存在,建议使用空目录,挂载点下原有文件会在挂载完成后被临时隐藏 
-t vsftype:指定要挂载设备上的文件系统类型 
-r :readonly,只读挂载
-w:read and write,读写挂载 
-n:不更新/etc/fstab 
-a:自动挂载所有支持自动挂载的设备:(定义在/etc/fstab文件中,且挂载选项中有自动挂载功能)
-B,--bind:绑定目录到另一个目录上 
-o options:(启用或关闭挂载文件系统的选项) 
    async:异步模式 
    sync:同步模式 
    atime:每次查看目录或文件更新时间戳 
    noaitme:每次查看目录或文件不更新时间戳 
    diratime/nodiratime:目录的访问时间戳 
    auto/noauto:是否支持自动挂载 
    exec/noexec:是否支持将文件系统上应用程序运行为进程 
    dev/nodev:是否支持在此文件系统上使用设备文件 
    suid/nosuid: 是否允许suid和sgid权限生效。
    remount:重新挂载 
    ro:只读 
    rw:只写 
    user/nouser:是否允许普通用户挂载此设备 
    acl:启用此文件系统上的acl功能 
上述选项可多个同时使用,使用逗号分隔,尽量禁止普通用户挂载设备。
默认的挂载选项:defalts:rw,suid,dev,exec,auto,nouser,and async

一个设备可以挂在两个挂载点上。一个挂载点挂两个设备时,存取数据是以后挂载的设备为准。

七.制作 swap 分区

1.使用fdisk 或者 gdisk 工具分出一个磁盘空间

 

🌵分出一块空间,然后查看一下
[root@shawn ~]#gdisk /dev/sdc
Command (? for help): n   #创建分区
Partition number (2-128, default 2):   #分区号默认
First sector (34-6291455966, default = 1026048) or {+-}size{KMGTP}: #起始位置
Last sector (1026048-6291455966, default = 6291455966) or {+-}size{KMGTP}: +1G   #分区大小
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):   #文件系统类型默认
--------------------------------------------------------------
Command (? for help): p   #查看
Number  Start (sector)  End (sector)  Size   Code  Name
  1      2048     1026047   500.0 MiB   8300  Linux filesystem
  2   1026048     3123199   1024.0 MiB  8300  Linux filesystem  #成功
---------------------------------------------------------------
Command (? for help): w     #保存退出
Do you want to proceed? (Y/N): y    #确认
The operation has completed successfully.   #分区成功

2.再次查看一下磁盘设备

 

🌵查看
# lsblk
# ll /dev/sd   +   双击 Tab 键
🌵如果没有显示出来就使用"partprobe"命令刷新一下内核(经常使用的命令)
# partprobe /dev/sdc

3.制作swap文件系统

 

[root@shawn ~]#mkswap /dev/sdc2
正在设置交换空间版本 1,大小 = 1048572 KiB
无标签,UUID=537af376-fe42-4b9f-9bf8-f1e036a27295

4.激活swap分区,并对比前后大小

 

🌵激活前使用"free"内存查看命令查看"swap"空间大小
[root@shawn ~]#free -m
      total    used    free   shared  buff/cache   available
Mem:   972      125      532     7      313         702
Swap:   1906     0       1906    #可以看到大小为"1964M"

🌵使用"swapon"命令激活分区
[root@shawn ~]#swapon /dev/sdc2

🌵再次查看"swap"空间大小
[root@shawn ~]#free -m
      total    used    free   shared  buff/cache   available
Mem:   972      126     532     7       314         701
Swap:  2930      0      2930      #空间已经变成了"2930M"
    
🌵也可以使用"swapon -s"查看到"swap"空间及设备
[root@shawn ~]#swapon -s
文件名		 类型        大小      已用    权限
/dev/sda3   partition   1952764   0       -2
/dev/sdc2   partition   1048572   0       -3

ps: 如果磁盘没有过多的分区给 swap, 可以通过文件来增加 swap空间, 但本质上还是磁盘空间

5.使用文件来制作swap

 

🌵首先制作一个500M(大小自己设置)大小的文件,可以使用"泡泡机"
[root@shawn ~]#dd if=/dev/zero of=/swap_file bs=500M count=1

🌵查看文件信息
[root@shawn ~]#ll -h /swap_file 
-rw-r--r-- 1 root root 500M 11月  7 16:56 /swap_file  #大小"500M"

🌵制作"swap"文件系统
[root@shawn ~]#mkswap /swap_file 

🌵激活这个"文件swap分区"
[root@shawn ~]#swapon /swap_file 

#使用"swapon -s"查看"swap"设备信息
[root@shawn ~]#swapon -s
文件名      类型       大小       已用   权限
/dev/sda3   partition  1952764   264   -2
/swap_file  file       511996     0    -3
可以发现是"file"类型的"swap"分区

6.关闭swap分区

 

🌵"swapoff /dev/sdc2"关闭某一个"swap"分区
[root@shawn ~]#swapoff /dev/sdc2
[root@shawn ~]#free -m
      total  used   free  shared  buff/cache   available
Mem:  972    125    533   7         313         701
Swap: 1906   0      1906      #对比之前可以发现"swap"空间减少了

"swapoff -a"关闭所有"swap"分区
[root@shawn ~]#swapoff -a
[root@shawn ~]#free
      total   used     free    shared  buff/cache   available
Mem:  995684  127240   547912  7736    20532      720260
Swap: 0       0        0       #"swap"分区被置空了

7.设置开机自动挂载新增的swap分区

  • /etc/fstab: 方法与上面磁盘设置相似

方式一:使用"UUID"
例: "UUID=de5f8b73-bebd-487d-8c80-53c6721b4a7f  swap  swap  defaults 0 0"

方式二
例: "/dev/sdc2 swap swap defaults 0 0"        #正常磁盘设备
例: "/dev/sdc1 /file_swap swap defaults 0 0"  #磁盘文件

DEll R740服务器配置RAID卡方式

https://www.cnblogs.com/linhaifeng/articles/13921161.html

八、修复服务器文件系统

1.什么情况会造成文件系统错误

  • Linux系统中,为了提升读写速度, 通常将要写入硬盘的数据先放在内存中(buff区)

  • 够了一波再写入内存, 如果这时突然断电或其它未知原因产生后

  • 从新启动系统后,可能会发现系统提示: 文件系统错误信息

    ps : 查看运行日志可以提示出损坏的文件系统

2.真实情况下修复方式

  • 操作系统进不去, 可以先进到单用户模式进行操作

  • 首先尝试 mountumount ,看看能不能重放日志进行修复

  • 不行再执行 xfs_repair -n [磁盘设备名], 只检查不修复 (它会检查文件系统, 如果损坏会列出将要执行的操作)

  • 如果检测到日志与数据不一致, 系统会推荐以读写的方式挂载, "xfs"会在挂载的时候修复这种不一致. 命令 : mount -o rw,norecovery [磁盘设备] [挂载目录]

  • 上述不成功只能使用以下实验中的方法

2.文件系统损坏与修复演示

  • 为了让情况更明白, 我们来模拟一下文件系统损坏的实验

  • 我们模拟把我的"/dev/sdc1"损坏

 

🌵首先查看一下"/dev/sdc1"的挂载与空间情况
[root@shawn ~]#df -h | grep "/dev/sdc1"
/dev/sdc1    497M   26M  472M    6% /test2   #总共"497M"空间

🌵查看一下文件
[root@shawn ~]#echo 2222 > /test2/a.txt
[root@shawn ~]#cat !$
2222

🌵使用"泡泡机"模拟损坏文件系统
[root@shawn ~]#dd if=/dev/zero of=/dev/sdc1 bs=1M count=200
记录了200+0 的读入
记录了200+0 的写出
209715200字节(210 MB)已复制,0.632261 秒,332 MB/秒

🌵再次操作"/test2/a.txt"文件
[root@shawn ~]#echo 5555 > /test2/a.txt 
[root@shawn ~]#cat !$
5555     #发现文件读写还是正常的

🌵卸载然后再次挂载---->发现已经损害
[root@shawn ~]#umount /dev/sdc1
[root@shawn ~]#mount /dev/sdc1 /test2
mount: 将 /dev/sdc1 挂载到 /test2 失败: 结构需要清理
        
🌵使用"xfs_repair"命令修复文件系统
[root@shawn ~]#xfs_repair /dev/sdc1
..............
......
done      #修复操作完成

🌵再次挂载,并查看文件
[root@shawn ~]#mount /dev/sdc1 /test2
[root@shawn ~]#cat /test2/a.txt 
5555  #文件也有,说明修复成功了
  • 紧接着实验

  • 上面我们是用"泡泡机"制造了 200M 的大小进行覆盖

  • 现在我们来加大一点空间 255M 来进行实验

 

🌵开始模拟损坏 255M
[root@shawn ~]#dd if=/dev/zero of=/dev/sdc1 bs=1M count=255
记录了255+0 的读入
记录了255+0 的写出
267386880字节(267 MB)已复制,0.475109 秒,563 MB/秒

🌵对文件进行读写直接就报错了
[root@shawn ~]#echo 5555 > /test2/a.txt 
-bash: /test2/a.txt: 结构需要清理
[root@shawn ~]#ls /test2/a.txt
ls: 无法访问/test2/a.txt: 输入/输出错误

🌵于是来卸载进行修复----呵呵
[root@shawn ~]#umount /dev/sdc1
[root@shawn ~]#xfs_repair /dev/sdc1
.....................
............
.Sorry,balabala    #失败了
  • 修复失败了

  • 那我们只能进行强制修复了

  • 选项 "-L" 进行强制修复, 但这种情况会清除日志文件, 数据也就没有了, 意义就在于能用

 

🌵我们来进行"-L"选项进行强制修复
⛅第一种情况强制修复成功,可以挂载了,但没有数据
[root@shawn ~]#xfs_repair -L /dev/sdc1
[root@shawn ~]#mount /dev/sdc1 /test2
[root@shawn ~]#cat /test2/a.txt
cat: /test2/a.txt: 没有那个文件或目录

⛅第二种情况,使用了强制修复也无法成功
[root@shawn ~]#xfs_repair -L /dev/sdc1
........................
..............
..Sorry, balabala
EXiting now.    #强制也失败了

🌵强制也是失败的情况下只能重做文件系统了
[root@shawn ~]#mkfs.xfs /dev/sdc1
#于是一块新的磁盘分区就诞生了

4.修复总结

  • xfs_repair方法, 成功后恢复数据

  • xfs_repair -L强制, 成功后数据消失

  • mkfs.xfs格式化是最终解决方案, 数据消失

  • 修复不了数据是因为磁盘分区信息表被损坏导致的, 能修复可能是没有损坏到分区信息(随机性)

  • 做本次实验的目的在于: 数据不可能 100% 的修复回来, 这时候就需要你有备份意识, 可见备份的重要性

九.xfs文件系统备份与恢复

1.XFS的备份级别

级别说明
0 完全备份
1~9 增量备份

2.两种备份说明

备份名称说明
完全备份 每次都将指定的目录完完整整的复制一份
增量备份 每次都将之前备份后有变化的文件进行备份

3.备份与恢复命令

  • 备份: xfsdump

xfsdump -l 0 -L xxx_bak -M "bak_all" -f /opt/xxx_bak_all /test
选项作用
-l (小写L) 指定level, 0~9, 默认为 0
-L 纪录每次备份的 session 标头, 这里可以填写针对此文件系统的简易说明
-M 可以纪录储存媒体的标头, 这里可以填写此媒体的简易说明
-f 后面接 [将要产生的备份路径及名字] [想要备份的原路径]
-I (大写 i) 从"/var/lib/xfsdump/inventoty" 里列出目前备份的信息状态
  • 恢复: xfsrestore

xfsrestore -f /opt/xxx_bak_all /xxx路径
选项作用
-f 后面接 [备份文件路径] [想要恢复到的路径]

4.xfsdump使用限制

  • 必须用 root 权限

  • 只能备份已挂载的文件系统

  • 只能备份XFS文件系统

  • 只能用xfsrestore恢复

  • 透过文件系统的UUID来分辨备份档,因此不能备份相同UUID的文件系统

5.备份与恢复原则

  • 备份 : 先做全量备份, 然后再做增量备份 (源路径的末尾不能有"/")

  • 恢复 : 先恢复全量备份, 然后按时间点从远到近恢复增量备份

6.数据备份与恢复演示

  • 数据备份

 

🌵先准备一个已经关联了一个目录的文件系统
🌵怎么分区制作文件系统上面已经介绍,这里不做赘述
[root@shawn ~]#df -h | grep "/dev/sdc1"
/dev/sdc1    497M   26M  472M    6% /test2   

🌵在"/test2"下创建文件
[root@shawn ~]#echo 222 > /test2/2.txt
[root@shawn ~]#cat /test2/1.txt /test2/2.txt 
111
222

🌵开始一次全量备份"xfsdump", 并查看
[root@shawn ~]#xfsdump -l 0 -L sdc1_bak_all -M "all_bak" -f /mnt/sdc1_bak_all /test2
.....................
........:SUCCESS  #提示"SUCCESS"代表成功
[root@shawn ~]#ls /mnt
sdc1_bak_all      #发现备份文件存在

🌵我们在"/test2"下修改"2.txt",并新增"3.txt",然后进行增量备份
[root@shawn ~]#echo 555 >> /test2/2.txt 
[root@shawn ~]#echo 666 > /test2/3.txt
[root@shawn ~]#cat /test2/2.txt /test2/3.txt 
222
555       #追加了这一行
666       #新加了这个文件
[root@shawn ~]#xfsdump -l 1 -L sdc1_bak_all -M "add1" -f /mnt/sdc1_bak_add1 /test2
[root@shawn ~]#ls /mnt
sdc1_bak_add1  sdc1_bak_all     #出现了第一次的增量备份文件
  • 数据恢复

 

🌵我们将"/test2"下的文件全部删除来演示数据消失
[root@shawn ~]#rm -rf /test2/*
[root@shawn ~]#ll /test2/
总用量 0    #清理干净了

🌵先恢复全量备份"sdc1_bak_all", 并查看文件
[root@shawn ~]#xfsrestore -f /mnt/sdc1_bak_all /test2
[root@shawn ~]#ls /test2
1.txt  2.txt
[root@shawn ~]#cat /test2/1.txt /test2/2.txt 
111
222      #发现是最开始的全量备份的数据状态

🌵再恢复第一次的增量备份"sdc1_bak_add1", 并查看文件
[root@shawn ~]#xfsrestore -f /mnt/sdc1_bak_add1 /test2
[root@shawn ~]#ls /test2
1.txt  2.txt  3.txt
[root@shawn ~]#cat /test2/1.txt /test2/2.txt /test2/3.txt 
111
222
555
666       #发现正是第一次增量备份时的数据状态

十、LVM

为何要用LVM

我们在对磁盘分区的大小进行规划时, 往往不能确定每个分区使用的空间大小, 只能凭经验分配一个大小, 而我们通常使用的 fdisk、gdisk 等工具对磁盘分区后, 每个分区的大小就固定死了, 这么做的问题是

  • 如果分区设置的过大, 就白白浪费了磁盘空间。

  • 如果分区设置的过小, 就会导致空间不够用的情况出现。

    对于分区过小的问题, 我们可以重新划分磁盘的分区, 或者通过软连接的方式将此分区的目录链接到另外一个分区。这样做虽然能够临时解决问题, 但是给管理带来了麻烦。

什么是LVM

LVM(Logical Volume Manager)逻辑卷管理通过将底层物理硬盘抽象封装起来,以逻辑卷形式表现给上层系统。

  • 与传统磁盘的方式:传统磁盘由操作系统直接操作,文件系统都是建立在磁盘或者磁盘分区上。

  • 使用逻辑卷:上层操作系统不在操作直接底层的分区或者磁盘,这些底层的分区或者磁盘已经被逻辑卷管理起来了(抽象封装起来了),而是新建了一个叫做逻辑卷的东西,所有的文件系统都是建立在逻辑卷之上的,格式化也是格式化的逻辑卷。

  • 底层的硬件改变不会在影响上层系统、应用程序了。

  • 逻辑卷大小可以动态调整,而且不会丢失现有数据。增加逻辑卷的大小,对上层系统来说,逻辑卷是不变的,对应用层来说,感知不到逻辑卷的存在。

  • 新加入硬盘也不会改变现有上层的逻辑卷。

LVM是建立在硬盘和分区之上、文件系统之下的一个逻辑层,作为一种动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性。

无论在Linux或者其他类似的系统, 都是非常的好用。传统分区使用固定大小分区, 重新调整大小十分麻烦。但是, LVM可以创建和管理"逻辑"卷, 而不是直接使用物理硬盘。可以让管理员弹性的管理逻辑卷的扩大缩小, 操作简单, 而不损坏已存储的数据。可以随意将新的硬盘添加到LVM, 以直接扩展已经存在的逻辑卷。LVM并不需要重启就可以让内核知道分区的存在。

LVM原理

要想理解好LVM的原理,我们必须首先要掌握4个基本的逻辑卷概念:

  • 物理卷( PV): (physical volume ) ,把常规的磁盘设备通过pvcreate命令对其进行初始化, 形成了物理卷。其实就是硬盘或分区。 (面粉)

  • 卷组(VG ): (volume group) ,把多个物理卷组成一个逻辑的整体, 这样卷组的大小就是多个硬盘之和。或者理解就是由一个或多个Pv 组成的整体。 (面团)

  • 逻辑卷( LV ): (logical volume ) , 从卷组中划分需要的空间大小出来。用户仅需对其格式化然后即可挂载使用。从vG 中切割出的空间用于创建文件系统。 (切成馒头)

  • 基本单元( PE ): ( physical extend ) ,分配的逻辑大小的最小单元, 默认为4MB 的基本块。 (假设分配100MB 逻辑空间, 则需要创建25 个PB )

我们知道在使用LVM对磁盘进行动态管理以后,我们是以逻辑卷的方式呈现给上层的服务的。所以我们所有的操作目的,其实就是去创建一个LV(Logical Volume),逻辑卷就是用来取代我们之前的分区,我们通过对逻辑卷进行格式化,然后进行挂载操作就可以使用了。那么LVM的工作原理是什么呢?所谓无图无真相,咱们下面通过图来对逻辑卷的原理进行解释!!

img

image-20201109163147362

1.将我们的物理硬盘格式化成PV(Physical Volume)

我们看到,这里有两块硬盘,一块是sda,另一块是sdb,在LVM磁盘管理里,我首先要将这两块硬盘格式化为我们的PV(Physical Volume),也就是我们的物理卷,其实格式化物理卷的过程中LVM是将底层的硬盘划分为了一个一个的PE(Physical Extend),我们的LVM磁盘管理中PE的默认大小是4M大小,其实PE就是我们逻辑卷管理的最基本单位。比如说我有一个400M的硬盘,那么在将其格式化成PV的时候,其实际就是将这块物理硬盘划分成了100个的PE,因为PE默认的大小就是4M。这个就是我们的第一步操作。

2.创建一个VG(Volume Group)

在将硬盘格式化成PV以后,我们第二步操作就是创建一个卷组,也就是VG(Volume Group),卷组在这里我们可以将其抽象化成一个空间池,VG的作用就是用来装PE的,我们可以把一个或者多个PV加到VG当中,因为在第一步操作时就已经将该硬盘划分成了多个PE,所以将多个PV加到VG里面后,VG里面就存放了许许多多来自不同PV中的PE,我们通过上面的图片就可以看到,我们格式化了两块硬盘,每个硬盘分别格式化成了3个PE,然后将两块硬盘的PE都加到了我们的VG当中,那么我们的VG当中就包含了6个PE,这6个PE就是两个硬盘的PE之和。通常创建一个卷组的时候我们会为其取一个名字,也就是该VG的名字。

3.基于VG创建我们最后要使用的LV(Logical Volume)

注意】PV以及VG创建好以后我们是不能够直接使用的,因为PV、VG是我们逻辑卷底层的东西,我们其实最后使用的是在VG基础上创建的LV(Logical Volume),所以第三步操作就是基于VG来创建我们最终要使用的LV。

当我们创建好我们的VG以后,这个时候我们创建LV其实就是从VG中拿出我们指定数量的PE,还是拿上图来说,我们看到我们此时的VG里面已经拥有了6个PE,这时候我们创建了我们的第一个逻辑卷,它的大小是4个PE的大小,也就是16M(因为一个PE的默认大小是4M),而这4个PE有三个是来自于第一块硬盘,而另外一个PE则是来自第二块硬盘。当我们创建第二个逻辑卷时,它的大小就最多只有两个PE的大小了,因为其中的4个PE已经分配给了我们的第一个逻辑卷。

所以创建逻辑卷其实就是我们从VG中拿出我们指定数量的PE,VG中的PE可以来自不同的PV,我们可以创建的逻辑卷的大小取决于VG当中PE存在的数量,并且我们创建的逻辑卷其大小一定是PE的整数倍(即逻辑卷的大小一定要是4M的整数倍)。

4.将我们创建好的LV进行文件系统的格式化,然后挂载使用

在创建好LV以后,这个时候我们就能够对其进行文件系统的格式化了,我们最终使用的就是我们刚创建好的LV,其就相当于传统的文件管理的分区,我们首先要对其进行文件系统的格式化操作,然后通过mount命令对其进行挂载,这个时候我们就能够像使用平常的分区一样来使用我们的逻辑卷了。

我们在创建好LV以后,我们会在 /dev 目录下看到我们的LV信息,例如 /dev/vgname/lvname, 我们每创建一个VG,其会在/dev目录下创建一个以该VG名字命名的文件夹,在该VG的基础上创建好LV以后,我们会在这个VG目录下多出一个以LV名字命名的逻辑卷。

下面我们来对整个LVM的工作原理进行一个总结:

(1)物理磁盘被格式化为PV,空间被划分为一个个的PE

(2)不同的PV加入到同一个VG中,不同PV的PE全部进入到了VG的PE池内

(3)LV基于PE创建,大小为PE的整数倍,组成LV的PE可能来自不同的物理磁盘

(4)LV直接可以格式化后挂载使用

(5)LV的扩充缩减实际上就是增加或减少组成该LV的PE数量,其过程不会丢失原始数据

img

我们看到,我们这里如果要对LV进行扩充,直接加进来一块sdc硬盘,然后将其格式化成PE,然后将该PV加入到了VG当中,这个时候我们就可以通过增加LV中PE的数量来动态的对LV进行扩充了,只要我们的LV的大小不要超过我们VG空余空间的大小就行!

LVM优缺点总结:

  • 优点:

    1. 可以在系统运行的状态下动态的扩展文件系统的大小。

    2. 文件系统可以跨多个磁盘, 因此文件系统大小不会受物理磁盘的限制。

    3. 可以增加新的磁盘到工LVM 的存储池中。

    4. 可以以镜像的方式冗余重要的数据到多个物理磁盘。

    5. 可以方便的导出整个卷组到另外一台机器。

  • 缺点:

    1. 因为加入了额外的操作, 存取性能受到影响。

    2. 当卷组中的一个磁盘损坏时, 整个卷组都会受到影响。

      • 解释:LVM如果有一个磁盘损坏,整个LVM都坏了,LVM只有动态扩展作用。

      • 方案:底层用RAID + 上层工LVM = 既有冗余又有动态扩展

      PS:在从卷组中移除一个磁盘的时候必须使用reducevg命令 (该命令要求root权限,并且不允许在快照卷组中使用)

创建LVM逻辑卷

img

 

熟悉了LVM的工作原理,首先是要将我们的物理硬盘格式化成PV,然后将多个PV加入到创建好的VG中,最后通过VG创建我们的LV。

拉伸一个逻辑卷

我们知道相比于传统磁盘管理方式的各种问题,使用LVM逻辑卷来管理我们的磁盘,我们可以对其进行动态的管理。在传统的磁盘管理方式中,我们如果出现分区大小不足的情况下,我们此时只能通过加入一块物理硬盘,然后对其进行分区,因为加入的硬盘作为独立的文件系统存在,所以对原有分区并没有影响,如果此时我们需要扩大分区,就只能先将之前的分区先卸载掉,然后将所有的信息转移到新的分区下,最后再将新的分区挂载上去,如果是在生产环境下,这样是不可想象的,正因为如此,我们才出现了LVM的磁盘管理方式,可以动态的对我们的磁盘进行管理。

我们首先来看下动态拉伸一个逻辑卷的示意图:

img

 

我们从上图可以看到,我们在对逻辑卷进行拉伸时,其实际就是向逻辑卷中增加PE的数量,而PE的数量是由VG中剩余PE的数量所决定的。

注意:逻辑卷的拉伸操作可以在线进行,不需要卸载掉我们的逻辑卷

这样的好处就是当我们的逻辑卷的大小不够用时,我们不需要对其进行卸载,就可以动态的增加我们的逻辑卷的大小,并不会对我们的系统产生任何影响。例如如果我们的服务器上运行着一个重要的服务或者数据库,并要求我们7*24小时不间断保持在线,那么这样的动态增加逻辑卷的大小就非常的有必要了。

LVM的基本使用

image-20201109182122122

创建逻辑卷

下载软件安装包:

[root@localhost ~]# yum install -y lvm2
  1. 制作pv:可以对分区做、也可以对整块盘做

    1.制作
    pvcreate /dev/sdb1 #对分区做
    pvcreate /dev/sdc #对整块盘做
    2.查看
    pvs
    pvscan
  2. 制作vg:将PV划入VG中

    vgcreate vg1 /dev/sdb1 /dev/sdc #包含/dev/sdb1与/dev/sdc两个pv
    vgs #查看
    
    #也可以在制作一个VG2:
    vgcreate vg2 /dev/sdb2 /dev/sdb3 #包含/dev/sdb2 /dev/sdb3两个pv
     vgs   #查看
     VG #PV #LV #SN Attr VSize VFree 
     vg1 2 0 0 wz--n- 20.99g 20.99g
     vg2 2 0 0 wz--n- 1.99g 1.99g
  3. 创建逻辑卷LVM

    选项
    -L  #逻辑卷大小
    -n  #逻辑卷名字
    
    #从VG1中分出来逻辑卷lv1_from_vg1、lv2_from_vg
    lvcreate -L 200M -n lv2_from_vg1 vg1
    
    #从VG2中划分出来建逻辑卷lv1_from_vg2、lv1_from_vg2
    lvcreate -L 300M -n lv1_from_vg2 vg2
    lvcreate -L 400M -n lv2_from_vg2 vg2
    
    #查看
     lvs   #查看
     LV VG Attr LSize Pool Origin Data% Meta% Move Log
    Cpy%Sync Convert
     lv1_from_vg1 vg1 -wi-a----- 100.00m 
     lv2_from_vg1 vg1 -wi-a----- 200.00m 
     lv1_from_vg2 vg2 -wi-a----- 300.00m 
     lv2_from_vg2 vg2 -wi-a----- 400.00m
  4. 格式与挂载

    #格式化
    mkfs.xfs /dev/vg1/lv1_from_vg1
    mkfs.xfs /dev/vg1/lv2_from_vg1
    mkfs.xfs /dev/vg2/lv1_from_vg2
    mkfs.xfs /dev/vg2/lv2_from_vg2
    
    #挂载
    mount /dev/vg1/lv1_from_vg1 /test1/
    mount /dev/vg1/lv2_from_vg1 /test2/
    mount /dev/vg2/lv1_from_vg2 /test3/
    mount /dev/vg2/lv2_from_vg2 /test4/
    
    #查看
    df
    /dev/mapper/vg1-lv1_from_vg1 98980 5344 93636 6% /test1
    /dev/mapper/vg1-lv2_from_vg1 201380 10464 190916 6% /test2
    /dev/mapper/vg2-lv1_from_vg2 303780 15584 288196 6% /test3
    /dev/mapper/vg2-lv2_from_vg2 406180 20704 385476 6% /test4

在线动态扩容

在线动态扩容意思为:在不用卸载的情况下完成扩容

命令如下:

lvextend -L [+]MGT /dev/VG_NAME/VL_NAME
# 注意: -L 100M 与 -L +100M 不是一个意思, 或者代表在原有的基础上扩容

实例如下

1.新增一块盘或者一个分区
fdisk /dev/sdb ......
partprobe
ls /dev/sdb4

2.新增一个pv
pvcreate /dev/sdb4

3.把新增的pv扩到Vg2里
vgextend vg2 /dev/sdb4
vgs  #可以看到VG2扩容了

4.接下来对lv1_from_vg2 扩容
lvextend -L +1000M /dev/vg2/lv1_from_vg2
xfs_growfs /dev/vg2/lv1_from_vg2 #扩展逻辑卷后需要更新fs文件系统

在线动态缩容器

不要缩容!!!并且xfs干脆不支持缩容

删除

1.#删除lv之前需要先卸载挂载点
umount /test3
lvremove /dev/vg2/lv1_from_vg2

2.#删vg
vgremove vg2

3.#删pv:只能删掉哪些不属于任何vg的pv
pvremove /dev/sdb2
pvremove /dev/sdb3

LVM快照

LVM 机制还提供了对 LV 做快照的功能, 也就是说可以给文件系统做一个备份, 这也是设计 LVM 快照的主要目的。LVM 的快照功能采用写时复制技术(Copy-On-Write, COW), 这比传统的备份技术的效率要高很多。创建快照时不用停止服务, 就可以对数据进行备份。说明: LVM 还支持 thin 类型的快照, 但是本文中的快照都是指 COW 类型的快照。

LVM 采用的写时复制, 是指当 LVM 快照创建的时候, 仅创建到实际数据的 inode 的硬链接(hark-Iink)而已。只要实际的数据没有改变, 快照就只包含指向数据的 inode 的指针, 而非数据本身。快照会跟踪原始卷中块的改变, 一旦你更改了快照对应的文件或目录, 这个时候原始卷上将要改变的数据会在改变之前拷贝到快照预留的空间。

Ivm快照的原理:

image-20201109195616475

创建快照实际上也是创建了一个逻辑卷, 只不过该卷的属性与普通逻辑卷的属性有些不一样。我们可以通过上图来理解快照数据卷( 图中的实线框表示快照区域, 虚线框表示文件系统):

# 左图为最初创建的快照数据卷状况, 工vM 会预留一个区域 ( 比如左图的左侧三个 PB 区块) 作为数据存放处。 此时快照数据卷内并没有任何数据, 而快照数据卷与源数据卷共享所有的 PB 数据, 因此你会看到快照数据卷的内容与源数据卷中的内容是一模一样的。 等到系统运行一阵子后, 假设 A 区域的数据被更新了( 上面右图所示), 则更新前系统会将该区域的数据移动到快照数据卷中, 所以在右图的快照数据卷中被占用了一块 PB 成为 A, 而其他 B 到 I 的区块则还是与源数据卷共享!

强调:

由於快照区与原本的 Lv 共享很多 PE 区块, 因此快照区与被快照的 Lv 必须要在同一个 vG 上头, 下面两点非常重要:

  • 1、VG中需要预留存放快照本身的空间, 不能全部被占满。

  • 2、快照所在的VG 必须与被备份的 LV 相同, 否则创建快照会失败。

总结:

快照的本质就是一个特殊的lv, 创建快照后, 如果源数据卷中的文件被更新了, 会将老数据赋给快照的空间, 这就要求快照的空间也是够用的

实例1:

1.准备好原始数据
df 
/dev/mapper/vg1-lv1_from_vg1 98980 5348 93632 6% /test1

echo "hello egon" > /test1/1.txt

2.查看vg1容量是否充足
lv1_from_vg1 属于卷组vg1, 而vg1有足够的容量来分配给快照卷
 vgs   #查看vg1容量
 VG #PV #LV #SN Attr VSize VFree 
 vg1 2 2 0 wz--n- 20.99g <20.70g
 
 3.在vg1卷组里创建一个lv1_from_vg1
  lvcreate -L 1G -s -n lv1_from_vg1_snap /dev/vg1/lv1_from_vg1
  
  4、查看
  lvs   #查看
 LV VG Attr LSize Pool Origin Data% Meta%
Move Log Cpy%Sync Convert
 lv1_from_vg1 vg1 owi-aos--- 100.00m 
 
 lv1_from_vg1_snap vg1 swi-a-s--- 104.00m lv1_from_vg1 0.01
 
 5.修改文件/test/1.txt
  echo "egon say ladygaga" >> /test1/1.txt
  cat /test1/1.txt
  	hello egon
	egon say ladygaga
	
 6、恢复快照
# 挂载快照, 注意: 快照在挂载的时候由于和原来的lvm 是同一个uuID , 而xFs 是不允许相同uuID 的文件系统挂载, 所以需要加选项 - o nouuid
mount -o nouuid /dev/vg1/lv1_from_vg1_snap /opt/
cat /opt/1.txt
 	hello egon
cp /opt/1.txt /test1/1.txt
	cp:是否覆盖"/test1/1.txt"? y
cat /test1/1.txt
	hello egon

实例二:如果要恢复的文件个数过多, 可以直接合并

mount /dev/vg1/lv1_from_vg1 /test1/
echo hello egon > /test1/1.txt
lvcreate -L 1G -s -n lv1_from_vg1_snap /dev/vg1/lv1_from_vg1
echo aaaa >> /test1/1.txtecho aaaa >> /test1/1.txt
echo aaaa >> /test1/1.txt
echo aaaa >> /test1/1.txt
echo aaaa >> /test1/1.txt
echo aaaa >> /test1/1.txt
mount -o nouuid /dev/vg1/lv1_from_vg1_snap /opt/

cat /opt/1.txt
	hello egon
cat /test1/1.txt
	hello egon
	aaaa
	aaaa
	aaaa
	aaaa
	aaaa
	
先卸载数据源与快照, 再进行合并, 快照会自动删除, 一次性的	
[root@egon ~]# umount /test1
[root@egon ~]# umount /opt
[root@egon ~]# lvconvert --mergesnapshot /dev/vg1/lv1_from_vg1_snap
[root@egon ~]# mount /dev/vg1/lv1_from_vg1 /test1/
[root@egon ~]# cat /test1/1.txt # 数据还原回来了
hello egon

 

posted @ 2020-11-08 20:19  贾维斯Echo  阅读(1005)  评论(0)    收藏  举报