linux磁盘管理

磁盘管理也算是安装系统之后的必须要做的一件事

内容主要围绕硬盘的分区展开

1.磁盘简介

1.1命名方式

RHES7/centos7:

并口(IDE)

串口(SATA):
/dev/sda:

/dev:设备文件目录;sda是一个文件:s代表sata串口,d代表磁盘,a代表第一块

1.2分区方式

  1. MBR

    MBR支持最大的磁盘容量是<2TB。设计时分配4个主分区

    如果希望超过4个分区,需放弃主分区,改为扩展分区和逻辑分区

  2. GPT(全局唯一标识分区表)

    GPT支持大于2T的硬盘,支持128个分区

2.基本分区管理

管理三部曲:

新硬盘:分区(MBR或GPT)—->格式化/文件系统操作——>挂载mount

毛坯房:隔间——->放家具/打造格子柜————>加个门/添加目录

2.1查看磁盘信息

命令:ll /dev/sd*

查看所有磁盘文件的信息,这些磁盘文件可以理解为磁盘的抽象,可以看到文件类型是b,也就是block的意思

命令:lsblk

查看硬件磁盘的具体信息

2.2创建主、扩展分区(隔间)

以MBR为例:

MBR内容有64个字节,对应四个主分区每个分配16个字节

创建主分区

  1. 命令:fdisk /dev/sdb(sda系统盘,不要轻易动)

    注意:会将磁盘内容全部清空

    • 确定分区命令:
    1
    2
    3
    4
    5
    命令(输入 m 获取帮助):n
    分区类型
    p 主分区 (0个主分区,0个扩展分区,4空闲)
    e 扩展分区 (逻辑分区容器)
    选择 (默认 p):
    • 选择分区类型:主分区最多只能扩展四个
    1
    2
    选择 (默认 p)
    将使用默认回应 p。
    • 选择分区号
    1
    分区号 (1-4, 默认  1): (默认,回车)
    • 选择开始位置
    1
    第一个扇区 (2048-10485759, 默认 2048): (默认,回车)

    起始扇区:将硬盘看做一个房间,第一个房间就是从头开始画,假设第一个房间画了10平米,然后就会问,第二个房间就从第11平米开始画吗?

    也就是每次划分都是从上一个划分出的区域的结束开始

    比如我给虚拟机装了一个5G的盘,约5368709120个字节,将其按512个字节为一个小单位进行划分,结果就是10485760。也就对应这里的扇区,差1是因为计算机从0开始计数。

    至于0-2048的内容就是放了一个叫MBR的小本本,统计了你的所有分区

    • 选择分区大小
    1
    2
    上个扇区,+sectors 或 +size{K,M,G,T,P} (2048-10485759, 默认 10485759): +2G
    创建了一个新分区 1,类型为“Linux”,大小为 2 GiB。
    • 查看当前硬盘的分区情况
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    命令(输入 m 获取帮助):p
    Disk /dev/sdb:5 GiB,5368709120 字节,10485760 个扇区
    单元:扇区 / 1 * 512 = 512 字节
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x65bfc9af

    设备 启动 起点 末尾 扇区 大小 Id 类型
    /dev/sdb1 2048 4196351 4194304 2G 83 Linux
    /dev/sdb2 4196352 5220351 1024000 500M 83 Linux
    /dev/sdb3 5220352 7317503 2097152 1G 83 Linux
    /dev/sdb4 7317504 10485759 3168256 1.5G 5 扩展
    • 已完成2G大小分区记录,但未生效,通过w保存操作
    1
    2
    3
    4
    命令(输入 m 获取帮助):w
    分区表已调整。
    将调用 ioctl() 来重新读分区表。
    正在同步磁盘。
  • 对分区进行刷新:partprobe /dev/sdb

  • 看分区信息:fdisk -l /dev/sdb

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@localhost ~]# fdisk -l /dev/sdb
    Disk /dev/sdb:5 GiB,5368709120 字节,10485760 个扇区
    单元:扇区 / 1 * 512 = 512 字节
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x65bfc9af

    设备 启动 起点 末尾 扇区 大小 Id 类型
    /dev/sdb1 2048 4196351 4194304 2G 83 Linux
    • 更直观的看磁盘变化:lsblk

      1
      2
      sdb      8:16   0    5G  0 disk 
      └─sdb1 8:17 0 2G 0 part

创建扩展分区

尝试创建第5个主分区时会提示让你删除一个主分区,并改用扩展分区

命令:fdisk /dev/sdb(sda系统盘,不要轻易动)

  1. 执行删除命令

    1
    2
    3
    命令(输入 m 获取帮助):d
    分区号 (1-4, 默认 4):
    分区 4 已删除。
  2. 添加扩展分区

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    命令(输入 m 获取帮助):n
    分区类型
    p 主分区 (3个主分区,0个扩展分区,1空闲)
    e 扩展分区 (逻辑分区容器)
    选择 (默认 e):

    将使用默认回应 e。
    已选择分区 4
    第一个扇区 (7317504-10485759, 默认 7317504):
    上个扇区,+sectors 或 +size{K,M,G,T,P} (7317504-10485759, 默认 10485759):

    创建了一个新分区 4,类型为“Extended”,大小为 1.5 GiB。

注意:此时第四个扩展分区无法执行格式化和挂载,存不了东西

2.3创建文件系统(格子柜)

命令:mkfs.ext4 /dev/sdb1

意思:make filesystem extend4(扩展文件系统第四代,是文件系统的类型)

​ 第二块串口硬盘的第一个分区,准备格式化了

每次执行都是将格子柜全部清除然后再铺一遍

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.44.3 (10-July-2018)
创建含有 524288 个块(每块 4k)和 131072 个inode的文件系统
文件系统UUID:56c5bc78-5615-4e32-b33b-3aeca6869b2a
超级块的备份存储于下列块:
32768, 98304, 163840, 229376, 294912

正在分配组表: 完成
正在写入inode表: 完成
创建日志(16384 个块)完成
写入超级块和文件系统账户统计信息: 已完成

2.4挂载mount和卸载umount

挂载点就像是给分区开了一个门,有了门才能实现数据的调用

1.创建挂载点,一个分区一个挂载点

  1. 创建目录作为挂载点:mkdir /mnt/disk1
  2. 将分区挂载到挂载点上: mount -t ext4 /dev/sdb1 /mnt/disk1
  3. 查看当前文件系统:df-hT(挂载后才能看到)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# mkdir /mnt/disk1
[root@localhost ~]# mount -t ext4 /dev/sdb1 /mnt/disk1
[root@localhost ~]# df -ht
df: 选项需要一个参数 -- t
请尝试执行 "df --help" 来获取更多信息。
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 889M 0 889M 0% /dev
tmpfs tmpfs 904M 0 904M 0% /dev/shm
tmpfs tmpfs 904M 9.7M 894M 2% /run
tmpfs tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/sda5 xfs 13G 4.5G 8.1G 36% /
/dev/sda2 xfs 5.0G 69M 5.0G 2% /home
/dev/sda1 ext4 477M 128M 320M 29% /boot
tmpfs tmpfs 181M 28K 181M 1% /run/user/42
tmpfs tmpfs 181M 2.3M 179M 2% /run/user/0
/dev/sr0 iso9660 6.7G 6.7G 0 100% /run/media/root/CentOS-8-BaseOS-x86_64
/dev/sdb1 ext4 2.0G 6.0M 1.8G 1% /mnt/disk1

用windows来理解:

所有的盘符都类似于挂载点,像我的笔记本只有一块硬盘,这些挂载点也就指向同一块硬盘的不同分区。

假如我现在增加了一块硬盘,同时想要c:\program目录为挂载点,只需要挂载成功,此时的c:\program也就指向我新硬盘中设置好的分区

本章学习内容中的所有挂载方法都不是永久挂载,重启之后会发现挂载消失。

2.删除挂载点

就相当于把门关上了,数据还在,但是失去了被调用的路径

就像是把u盘给拔了

命令:umount /dev/sdb1

3.思考题

  1. 创建的目录—文件保存在当前磁盘或者说分区内(file1-file5)
  2. 将创建的目录挂载到新分区上—之前保存的文件夹(file1-file5)就看不到了,只能看到我在新分区保存的内容(file6-file10)

  3. 对加了门的分区进行卸载—保存在当前分区下的(file6-file10)就看不到了,这时候目录又变回了那个目录,file1-file5他就又回来了

  4. 再给保存了(file6-file10)的分区添加一个新的挂载点,就又能把这些文件也看到了

2.5lsblk和df -hT的区别

lsblk:显示全部的磁盘,也就是房子有多少隔间,每个房子或者隔间有多大

1
2
3
4
5
6
7
8
9
10
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
├─sda2 8:2 0 5G 0 part /home
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 12.5G 0 part /
sdb 8:16 0 5G 0 disk
└─sdb1 8:17 0 2G 0 part /mnt/disk1
sdc 8:32 0 5G 0 disk

以上都是虚拟机上加的乱七八糟的磁盘

df -hT:显示具体的文件系统,也就是隔间的具体信息

1
2
3
4
5
6
7
8
9
10
11
12
文件系统       类型      容量  已用  可用 已用% 挂载点
devtmpfs devtmpfs 889M 0 889M 0% /dev
tmpfs tmpfs 904M 0 904M 0% /dev/shm
tmpfs tmpfs 904M 9.7M 894M 2% /run
tmpfs tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/sda5 xfs 13G 4.5G 8.1G 36% /
/dev/sda2 xfs 5.0G 69M 5.0G 2% /home
/dev/sda1 ext4 477M 128M 320M 29% /boot
tmpfs tmpfs 181M 28K 181M 1% /run/user/42
tmpfs tmpfs 181M 2.3M 179M 2% /run/user/0
/dev/sr0 iso9660 6.7G 6.7G 0 100% /run/media/root/CentOS-8-BaseOS-x86_64
/dev/sdb1 ext4 2.0G 6.0M 1.8G 1% /mnt/disk1

3. 交换分区管理

3.1Swap简介

Swap分区就是一个基本分区

  • 作用:”提升”内存的容量,防止oom(out of memory),也就是虚拟内存

    类似cache和内存的关系(但是并不会像cache有读写速度的提升,毕竟Swap还是硬盘的一个分区),将热点内容保存到Swap,以映射的方式实现对硬盘内容的调用。

  • 大小:对于小于16G内存存在一定效果,大小一般为内存的两倍

    但是当内存数量足够大时,那么大的Swap意义不大

3.2Swap分区的创建

  1. 正常创建分区

  2. 输入命令P:查看当前硬盘的所有分区,及其Id

  3. 此时输入命令t,可以修改分区类型,输入82即为交换分区的类型

    按系统提示的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
    28
    29
    30
    31
    命令(输入 m 获取帮助):t
    分区号 (1-4, 默认 4): 3
    Hex 代码(输入 L 列出所有代码):L

    024 NEC DOS 81 Minix / 旧 Linu bf Solaris
    1 FAT12 27 隐藏的 NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
    2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
    3 XENIX usr 3c PartitionMagic 84 OS/2 隐藏 或 In c6 DRDOS/sec (FAT-
    4 FAT16 <32M 40 Venix 80286 85 Linux 扩展 c7 Syrinx
    5 扩展 41 PPC PReP Boot 86 NTFS 卷集 da 非文件系统数据
    6 FAT16 42 SFS 87 NTFS 卷集 db CP/M / CTOS / .
    7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux 纯文本 de Dell 工具
    8 AIX 4e QNX4.x 第2部分 8e Linux LVM df BootIt
    9 AIX 可启动 4f QNX4.x 第3部分 93 Amoeba e1 DOS 访问
    a OS/2 启动管理器 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
    b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
    c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad 休 ea Rufus 对齐
    e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs
    f W95 扩展 (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT
    10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/
    11 隐藏的 FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC
    12 Compaq 诊断 5c Priam Edisk a9 NetBSD f1 SpeedStor
    14 隐藏的 FAT16 <3 61 SpeedStor ab Darwin 启动 f4 SpeedStor
    16 隐藏的 FAT16 63 GNU HURD 或 Sys af HFS / HFS+ f2 DOS 次要
    17 隐藏的 HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS
    18 AST 智能睡眠 65 Novell Netware b8 BSDI swap fc VMware VMKCORE
    1b 隐藏的 W95 FAT3 70 DiskSecure 多启 bb Boot Wizard 隐 fd Linux raid 自动
    1c 隐藏的 W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep
    1e 隐藏的 W95 FAT1 80 旧 Minix be Solaris 启动 ff BBT
    Hex 代码(输入 L 列出所有代码):82
    已将分区“Linux”的类型更改为“Linux swap / Solaris”。
  4. w保存

  5. partprobe刷新

  6. fdisk -l /dev/sdb查看现在分区分好了没

    1
    2
    设备       启动  起点    末尾    扇区 大小 Id 类型
    /dev/sdc1 2048 2099199 2097152 1G 82 Linux swap / Solaris
  7. 格式化:mkswap /dev/sdb3

  8. 挂载:swapon /dev/sdb3

  9. 查看内存:free -m

    可以看到swap分区的大小和使用情况

    注意:swap分区不能够通过df -hT查看

4.逻辑卷LVM

4.1简介

术语:PV:物理卷(physical volume)

​ VG:卷组(volume group)

​ LV:逻辑卷(logical volume)

意义

物理磁盘的空间是限定的,不便于管理(拷贝,删除,授权)

单靠物理磁盘,是解决不了空间增长问题的。

LVM存在的意义就是为了摆脱物理磁盘的空间限制

4.2创建LVM

  1. 创建物理卷
  2. 加入卷组
  3. 在卷组中,抽调空间,制作逻辑卷(就像分区一样)
  4. 格式化
  5. 挂载

将基本分区的创建分区步骤变成了:1,2,3三个步骤

现在只需要将不同磁盘添加到一个卷组下就行了,

  1. 创建物理卷(pv):pvcreate /dev/sdd

    1
    2
    [root@localhost ~]# pvcreate /dev/sdd
    Physical volume "/dev/sdd" successfully created.
  2. 创建卷组(vg):vgcreate vg1 /dev/sdd

    1
    2
    [root@localhost ~]# vgcreate vg1 /dev/sdd
    Volume group "vg1" successfully created
  3. 制作逻辑卷(lv):lvcreate -L +4G -n lv1 vg1

    1
    2
    [root@localhost ~]# lvcreate -L 3G -n lv1 vg1
    Logical volume "lv1" created.
  4. 格式化:mkfs.ext4 /dev/vg1/lv1

    逻辑卷格式化的路径规则:dev/卷组名/逻辑卷名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@localhost ~]# mkfs.ext4 /dev/vg1/lv1
    mke2fs 1.44.3 (10-July-2018)
    创建含有 786432 个块(每块 4k)和 196608 个inode的文件系统
    文件系统UUID:b9889457-80d2-487d-8d89-ca13c226968e
    超级块的备份存储于下列块:
    32768, 98304, 163840, 229376, 294912

    正在分配组表: 完成
    正在写入inode表: 完成
    创建日志(16384 个块)完成
    写入超级块和文件系统账户统计信息: 已完成
  5. 挂载:mkdir mnt/lv1

    ​ mount /dev/vg1/lv1 mnt/lv1

    1
    2
    3
    4
    [root@localhost ~]# mount /dev/vg1/lv1 /mnt/lv1
    [root@localhost ~]# df -hT
    文件系统 类型 容量 已用 可用 已用% 挂载点
    /dev/mapper/vg1-lv1 ext4 6.9G 14M 6.5G 1% /mnt/lv1

4.3vg管理

扩大卷组

/dev/vg1容量由5G扩容到10G。

步骤:

  • 创建pv,将pv增加到vg中:pvcreate /dev/sde
  • 扩展vg:vgextend vg1 /dev/sde

查看物理卷和卷组的命令:pvs、vgs

4.4lv扩容

  1. lv扩容:

    • 查看vg空间:

      vgs

    • 扩容lv

      lvextend -L +4G /dev/vg1/lv1

  2. fs扩容:(相当于刷新文件,增加对文件的修改)

    resize2fs /dev/vg1/lv1

5.文件系统详解

格式化的目的:创造文件系统(ext4)

将分区推翻,然后以4K(4096个字节)为一个单位,对分区进行划分

解决了两个问题:

1、文件是如何准确放到磁盘的某个位置的

2、文件是如何在磁盘(渺茫的空间中)被快速读取的

5.1ext3或ext4文件系统:

简介

类型:索引(index)型文件系统。就像是目录,字典的前几页

主要包含两个名词:

  1. inode(索引节点):类似超市存东西时的小票

    大小为128个字节。指向具体文件(文件的元数据metadata)

    记录文件的属性(大小,权限,属主,属组,连接数,占块数,块的编号等)

  2. block(块):类似超市存东西时的柜子

    每个单位,也就是4k个字节就是一个block。它是文件存储的基本单位。比如5k的文件就要占两个block,且第二个没写满的block不能再写入。

  3. superblock:就是一个汇总

    • 记录block与inode的总量
    • 未使用和已使用的inode/block数量

问题:为啥买来8G的盘总是不满呢?

答:inode和块的边界都是占空间的

实例

  1. 创建一个新分区

    1
    /dev/sdf1      ext4      2.0G  6.0M  1.8G    1% /mnt/disk3
  2. 像分区写入文件并查看

    1
    2
    [root@localhost disk3]# ls -l -i 1.txt
    12 -rw-r--r--. 1 root root 0 810 10:04 1.txt

    此时的12就是已建的inode

  3. 查看分区的当前inode的数量及可建总数

    1
    2
    [root@localhost disk3]# df -i | grep sdf1
    /dev/sdf1 131072 12 131060 1% /mnt/disk3

    此时的12就是已建inode,131072就是还可以建的inode数量

  4. inode决定了文件系统中文件的数量

    1
    2
    [root@localhost disk3]# touch {1..131061}
    touch: 无法创建 '131061': 设备上没有空间

    剩下131060个inode都被用了,就131061刚好没法创建了

  5. 现在有一个有趣的现象,就是磁盘可用空间没被使用,但是不能创建新文件了

    向已有文件中写入内容是可行的,因为block一个都没被使用

总结

磁盘空间的限制被分为inode和block两个方面,请清理到填满的分区,避免不必要的报错

6.文件链接(软连接和硬连接)

  1. 符号链接(win 的快捷方式):软连接

    • 创建一个文件,并输入内容
    • 创建一个软连接
    1
    ln -s 源文件  快捷方式(路径/文件名)
    • 观察软连接文件:ls -l

      文件类型:l

    总结:

    软连接像快捷方式,可以对文件和目录做软连接。

    软连接记录的只是源文件的绝对路径

    软连接失去源文件不可用

  2. 硬链接

    1
    ln  源文件  快捷方式(路径/文件名)

    命令行和软连接的区别就是没有-s

    和软连接的区别

    硬连接像镜像,只能对文件做硬连接,目录不行

    硬连接只能在同一分区下进行

    硬连接失去源文件还可用

    ls -l还会显示文件的硬连接数,就是有几个相同文件

7.raid

(廉价磁盘冗余阵列)redundant array of independent disks

目的:1.保障存储的安全性:自动备份

​ 2.提升读写速度:并行读写

raid类型:

raid1:镜像卷2块磁盘,容量50%,容错

raid5:至少三块硬盘大小相同。两块保存原始数据 ,一块作为检验

​ 一旦有一块盘损坏,通过另外两块就可以恢复

​ 这时候就可以准备热备盘,一旦有盘损坏就可以拿新的填上

raid0:条带集,2块磁盘,读写速度提升100%

​ 数据分两半分别传输