磁盘管理

概览

Linux磁盘管理这块也有很多命令和知识,建议大家学习完基础知识后,抓住业务主线整理自己的知识体系,一般情况下无论我们是云机器还是物理机器,创建安装一个全新的机器都至少有一块盘,也就是系统盘,这是自带的,创建好就能直接用的,常见的其它业务场景有:

  • 增加数据盘
  • 扩容系统盘
  • 扩容数据盘

物理结构 分区 命名 性能

现在的磁盘按照物理结构通常分为 机械硬盘(HDD) 和 固态硬盘(SSD),机械硬盘通常原型的碟片组成,工作的时候会转动,噪音稍大,固态硬盘的原理比较像U盘,工作时几乎没有噪音,固态硬盘的性能要好于机械硬盘,机械硬盘读取速度一般100M/S左右,固态硬盘一般500M/S

硬盘的性能指标,比较常见的是看顺序读写速度和随机读写速度,一般电脑上都可以下载到一些测评软件来测试,这里不多说,附一份阿里云磁盘性能的对比,以供参考 https://help.aliyun.com/document_detail/25382.html?spm=a2c4g.11186623.6.772.5658559bLL6BM1

一般的磁盘都需要分区,一块物理硬盘可以分成多个逻辑硬盘,比如我们的windows台式机箱里插入一块1T的硬盘,可以在电脑里分成C盘,D盘,E盘等

常见的分区格式有MBR和GPT,只有GPT支持2T以上的硬盘

/dev/sd[a-p][1-128]:为实体磁盘的磁盘文件名
/dev/vd[a-d][1-128]:为虚拟磁盘的磁盘文件名

一块磁盘可以只分一个区,windows支持的分区格式有,FAT32,NTFS等,Linux支持的常见分区格式有EXT4,XFS,Windows上分区完毕并格式化后是指定磁盘符,也就是C盘,D盘这样来访问的,而是Linux下是指定一个目录,后面往这个目录存放东西,就相当于存在了这个磁盘上

查看系统中支持的文件格式可以使用 ls -l /lib/modules/$(uname -r)/kernel/fs

相关命令

lsblk  列出系统中所有的磁盘
blkid  列出磁盘的UUID等参数
df    查看系统剩余磁盘空间
du    经常用来查看某个目录的总使用磁盘空间大小
ln    建立软连接(快捷方式),硬链接
dd
fdisk  小于2T硬盘用
parted 大于2T硬盘用
parted /dev/sda print 列出磁盘的分区表类型(MBR OR GPT)
fdisk -lu /dev/sda   查看磁盘信息
partprobe 通知系统更新分区表
mount    挂载
umount   卸载
mkfs     格式化文件系统,ext4、xfs等
swapon 
swapoff

新增磁盘核心步骤

正常新增一块磁盘的步骤是:

  1. 给机箱里插入一块磁盘 (或者到云平台界面购买一块磁盘,lsblk能看到类似/dev/sdb)
  2. 对磁盘进行分区(partition),一般一块磁盘分一个区就足够,如/dev/sdb1,确定分区的格式,MBR OR GPT,一般默认是MBR格式
  3. 把某个分区(如/dev/sda1)格式化为需要的文件系统(filesystem) EXT4、XFS等 (mkfs.ext4 /dev/sdc1)
  4. 把格式化好的分区挂载到某个目录下 (通过这个目录访问这块磁盘 mount /dev/sdb1 /data)

简要概括,磁盘的使用一般需要经过:分区、格式化、挂载

MBR(Master Boot Record,主分区引导记录) GPT(Globally Unique Identifier Partition Table,GUID分区表)

增加一块数据盘使用(小于2T)

假设这块硬盘是全新的,上面没有数据,可以随意格式化

操作系统为CentOS 7.6,为一块新的20GiB数据盘(设备名为/dev/sdb)创建一个MBR格式的单分区,挂载的是ext4文件系统,挂载目录是 /xdata

1 给系统增加一块磁盘,如果是物理机直接插入硬盘,vmware或virtual box上也有相应的操作,云服务器就是购买硬盘,也可能服务商已经给你插入好硬盘了,此处不再赘述

2 查看新增的数据盘 可用 fdisk -l OR lsblk 之类的命令

3 这一步就有2种选择:创建分区号和不创建分区号(把整块硬盘当成一个分区),任选其一即可

3.1 不创建分区号 (阿里云称呼为裸设备文件系统)

mkdir -p /xdata
echo yes | mkfs.ext4 /dev/sdb
partprobe
parted /dev/sdb print
echo "/dev/sdb    /xdata   ext4    defaults    0 0" >> /etc/fstab
cat /etc/fstab
mount -a   OR  mount /dev/sdb /xdata
df -h

3.2 创建分区号

这块阿里云的文档非常详细,附上 https://help.aliyun.com/document_detail/25426.html?spm=a2c4g.11186623.2.24.133b3b94gjsuAr#concept-jl1-qzd-wdb

mkdir /xdata
parted /dev/sdc print
fdisk -u /dev/sdc  p  n 1 w 
fdisk -lu /dev/sdc  OR  parted /dev/sdc print
mkfs.ext4 /dev/sdc1     (其他文件系统格式修改mkfs对应的命令)
lsblk
echo "/dev/sdc1    /xdata   ext4    defaults    0 0" >> /etc/fstab
cat /etc/fstab
mount -a  OR  mount /dev/sdc1 /xdata
df -h

增加一块数据盘使用(大于2T)

假设这块硬盘是全新的,上面没有数据,可以随意格式化

下面CentOS 7.6 64位操作系统为例,说明如何在Linux实例上使用parted工具和e2fsprogs工具分区并格式化一个大容量数据盘。假设需要处理的数据盘是一个新建的3TiB的空盘,设备名为/dev/sdb,挂载到/xdata目录下

参考资料 https://help.aliyun.com/document_detail/34377.html?spm=a2c4g.11186623.2.25.133b3b94gjsuAr#title-f8r-9od-yn9

1 检查软件版本

[root@node1 ~]# rpm -qa | egrep "parted|e2fsprogs"
parted-3.1-29.el7.x86_64
e2fsprogs-1.42.9-13.el7.x86_64
e2fsprogs-libs-1.42.9-13.el7.x86_64

2 开始操作

parted /dev/sdb
(parted) mklabel gpt              (将默认的MBR分区格式转为GPT分区格式)
(parted) mkpart primary 1 100%    (划分一个主分区,并设置分区的开始位置和结束位置)
(parted) align-check optimal 1    (检查分区是否对齐)
(parted) print
(parted) quit
partprobe
mkfs.ext4 /dev/sdb1      (mkfs.xfs /dev/sdb1)
mkdir -p /xdata
echo "/dev/sdb1    /xdata   ext4    defaults    0 0" >> /etc/fstab
cat /etc/fstab
mount -a  OR  mount /dev/sdb1 /xdata
df -h
parted /dev/sdb1 print


以下执行命令的详细记录
[root@node1 ~]# parted /dev/sdb
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt                                                      
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Yes
(parted) mkpart primary 1 100%                                            
(parted) align-check optimal 1                                            
1 aligned
(parted) print                                                            
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  21.5GB  21.5GB  ext4         primary

(parted)                                                                  
(parted) quit                                                             
Information: You may need to update /etc/fstab.

[root@node1 ~]# partprobe                                                 
[root@node1 ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 5242368 blocks
262118 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2153775104
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done   

[root@node1 ~]# mkdir -p /xdata
[root@node1 ~]# echo "/dev/sdb1    /xdata   ext4    defaults    0 0" >> /etc/fstab
[root@node1 ~]# mount -a
[root@node1 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G  7.8G   43G  16% /
devtmpfs                 2.0G     0  2.0G   0% /dev
tmpfs                    2.0G     0  2.0G   0% /dev/shm
tmpfs                    2.0G  8.6M  2.0G   1% /run
tmpfs                    2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sda1               1014M  133M  882M  14% /boot
/dev/mapper/centos-home  202G   33M  201G   1% /home
tmpfs                    396M     0  396M   0% /run/user/0
/dev/sdb1                 20G   45M   19G   1% /xdata

增加数据盘 小于2T XFS文件系统

parted /dev/sdb mklabel msdos mkpart p xfs 0% 100%
mkfs.xfs /dev/sdb1

blkid
# Edit /etc/fstab and add
UUID="<UUID-from-output-above>" /mnt/sdb1 xfs noatime 0 0

mkdir /mnt/sdb1
mount -a

参考链接

https://docs.openstack.org/swift/latest/development_saio.html
https://blog.csdn.net/dufufd/article/details/53508367

csdn 111378574

系统盘容量不足

系统盘容量不足,解决方法有:

  • 删数据
  • 重装系统,扩大磁盘容量
  • 扩容系统盘的容量

数据盘容量不足

数据盘容量不足,解决方法有:

  • 删数据
  • 新增一块磁盘,把数据存放到新的磁盘上
  • 扩容数据盘的容量

磁盘容量不足,扩容的操作步骤,建议参考相关云平台的文档,例如阿里云

https://help.aliyun.com/document_detail/35095.html?spm=a2c4g.11186623.2.27.5658559bLL6BM1#concept-e1g-44g-ydb

卸载磁盘

[root@node1 xdata]# df -h | grep sdb
/dev/sdb                  20G   45M   19G   1% /xdata
[root@node1 xdata]# cd /root    (卸载的时候不能处在当前磁盘所在的目录)
[root@node1 xdata]# umount /xdata

swap (把磁盘当内存用)

目前swap内存已经几乎不再使用,内存不足拿硬盘凑在某些服务上非常慢,甚至无法使用,比如docker,另外有些时候内存不足报OOM,及时收到告警加内存即可,否则服务一直处于使用swap内存的状态,一直慢,一直死不到,这也很尴尬,取消使用swap功能操作如下

1 swapoff -a
2 注释掉 /etc/fstab 里swap挂载部分
3 partprobe
4 mount -a
5 free 检查

LVM

LVM 强调的是『弹性的变化文件系统的容量』

pvdisplay vgdisplay lvdisplay

待更新

挂载光盘示例

简易磁盘监控

[root@nexus3 ~]# cat  /root/disk-check.sh
opsemail="xys4k@qq.com"
if df | grep '/dev/vdb1' | awk -F '[ %]+' '{print $(NF-1)}' | egrep '9[0-9]+'; then
    df -h > /tmp/disk-usage.txt
    /usr/bin/mailx -v -s "Docker 镜像仓库所在机器磁盘使用已超过90%" $opsemail < /tmp/disk-usage.txt
fi

https://blog.csdn.net/xys2015/article/details/112545937

lsblk

查看磁盘是否为固态硬盘
https://blog.csdn.net/u011436427/article/details/120372514
[root@localhost ~]# lsblk --topology
NAME    ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED       RQ-SIZE   RA WSAME
sr0             0   2048      0    2048    2048    1 deadline        128  128    0B
vda             0    512      0     512     512    1 mq-deadline     256 4096    0B
└─vda1          0    512      0     512     512    1 mq-deadline     256 4096    0B
nvme0n1         0    512      0     512     512    0 none           1023  128    0B