磁盘基本概述

磁盘分类

固态硬盘

image-1659768930699

image-1659768950857

机械磁盘

image-1659768981268
image-1659769007265
image-1659769004526

服务器磁盘

image-1659769040955

Linux中磁盘命名方式

Linux中磁盘的命名方式与磁盘的接口有关,规则如下:

  • 传统IDE接口硬盘:/dev/hd[a-z]
  • SCISI接口硬盘:/dev/sd[a-z]
  • 虚拟化硬盘:/dev/vd[a-z]

在设备名称的定义规则如下, 其他的分区可以以此类推
系统的第一块SCSI接口的硬盘名称为/dev/sda
系统的第二块SCSI接口的硬盘名称为/dev/sdb
系统中分区由数字编号表示, 1-4留给主分区使用和扩展分区, 逻辑分区从5开始

/第一块磁盘
/dev/sda
//第一块磁盘的第一个分区
/dev/sda1
//第二块磁盘的第一个分区
/dev/sdb1

MBR与GPT

在使用新磁盘之前,你必须对其进行分区。MBR(Master Boot Record)和GPT(GUID Partition Table)是在磁盘上存储分区信息的两种不同方式。这些分区信息包含了分区从哪里开始的信息,这样操作系统才知道哪个扇区是属于哪个分区的,以及哪个分区是可以启动的。在磁盘上创建分区时,你必须在MBR和GPT之间做出选择

MBR是Master Boot Record的简称,也就是主引导记录,是位于磁盘最前边的一段引导(Loader)代码,主要用来引导操作系统的加载与启动

特点:

  1. MBR支持最大2TB磁盘,它无法处理大于2TB容量的磁盘
  2. 只支持最多4个主分区。若想要更多分区,需要创建扩展分区,并在其中创建逻辑分区

GPT磁盘是指使用GUID分区表的磁盘,GUID磁盘分区表(GUID Partition Table,缩写:GPT)其含义为“全局唯一标识磁盘分区表”,是一个实体硬盘的分区表的结构布局的标准

特点:

  1. GPT对磁盘大小没有限制
  2. 最多可以创建128个分区

注意:

MBR与GPT之间互相转换会导致数据丢失

GPT磁盘概述
MBR与GPT的区别

磁盘容量检查

df -i   //查看inode使用情况
df -h   //以G或者T或者M人性化方式显示
df -T   //查看文件类型
df
[root@localhost ~]# df -i
Filesystem                Inodes IUsed    IFree IUse% Mounted on
devtmpfs                  438504   422   438082    1% /dev
tmpfs                     443517     1   443516    1% /dev/shm
tmpfs                     443517   697   442820    1% /run
tmpfs                     443517    17   443500    1% /sys/fs/cgroup
/dev/mapper/cs_192-root 33583104 46609 33536495    1% /
/dev/sr0                       0     0        0     - /mnt/cdrom
/dev/sda1                 524288   310   523978    1% /boot
/dev/mapper/cs_192-home 16396288    10 16396278    1% /home
tmpfs                     443517     5   443512    1% /run/user/0


[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 1.7G     0  1.7G   0% /dev
tmpfs                    1.7G     0  1.7G   0% /dev/shm
tmpfs                    1.7G  9.0M  1.7G   1% /run
tmpfs                    1.7G     0  1.7G   0% /sys/fs/cgroup
/dev/mapper/cs_192-root   65G  2.3G   62G   4% /
/dev/sr0                  11G   11G     0 100% /mnt/cdrom
/dev/sda1               1014M  210M  805M  21% /boot
/dev/mapper/cs_192-home   32G  256M   32G   1% /home
tmpfs                    347M     0  347M   0% /run/user/0

[root@localhost ~]# df -T
Filesystem              Type     1K-blocks     Used Available Use% Mounted on
devtmpfs                devtmpfs   1754016        0   1754016   0% /dev
tmpfs                   tmpfs      1774068        0   1774068   0% /dev/shm
tmpfs                   tmpfs      1774068     9160   1764908   1% /run
tmpfs                   tmpfs      1774068        0   1774068   0% /sys/fs/cgroup
/dev/mapper/cs_192-root xfs       67133412  2312788  64820624   4% /
/dev/sr0                iso9660   10812242 10812242         0 100% /mnt/cdrom
/dev/sda1               xfs        1038336   214036    824300  21% /boot
/dev/mapper/cs_192-home xfs       32776564   261608  32514956   1% /home
tmpfs                   tmpfs       354812        0    354812   0% /run/user/0


[root@localhost ~]# df -Th
设备名称               磁盘文件类型  磁盘大小 已用大小 可用大小 使用百分比 挂载点
Filesystem              Type      Size   Used Avail    Use% Mounted on
devtmpfs                devtmpfs  1.7G      0  1.7G      0% /dev
tmpfs                   tmpfs     1.7G      0  1.7G      0% /dev/shm
tmpfs                   tmpfs     1.7G   9.0M  1.7G      1% /run
tmpfs                   tmpfs     1.7G      0  1.7G      0% /sys/fs/cgroup
/dev/mapper/cs_192-root xfs        65G   2.3G   62G      4% /
/dev/sr0                iso9660    11G    11G     0    100% /mnt/cdrom
/dev/sda1               xfs      1014M   210M  805M     21% /boot
/dev/mapper/cs_192-home xfs        32G   256M   32G      1% /home
tmpfs                   tmpfs     347M      0  347M      0% /run/user/0

lsblk

使用lsblk查看分区情况:

[root@localhost ~]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  100G  0 disk 
|-sda1            8:1    0    1G  0 part /boot
`-sda2            8:2    0   99G  0 part 
  |-cs_192-root 253:0    0 64.1G  0 lvm  /
  |-cs_192-swap 253:1    0  3.7G  0 lvm  [SWAP]
  `-cs_192-home 253:2    0 31.3G  0 lvm  /home
sdb               8:16   0   20G  0 disk 
`-sdb1            8:17   0    1G  0 part 
sdc               8:32   0   20G  0 disk 
sr0              11:0    1 10.3G  0 rom  /mnt/cdrom

du

使用du命令查看目录或者文件的容量,不加参数以k为单位:

du -sh (文件&&目录)  //人性化输出显示大小
-s:列出总和
-h:人性化显示容量信息
[root@localhost ~]# du -sh anaconda-ks.cfg 
4.0K    anaconda-ks.cfg

[root@localhost ~]# du -sh /etc/
24M     /etc/

磁盘分区

分区之前, 需要先给虚拟机添加一块磁盘,以便于我们做后续的实验vmware虚拟机,请按如下进行操作:

1.找到对应虚拟主机点击右键, 选择设置

2.在硬件向导里面点击添加按钮, 在硬件类型中选中“硬盘”, 点击下一步
3.磁盘类型选择默认, 然后创建新虚拟磁盘, 调整大小(不要勾选立即分配空间)
4.最后点击下一步, 完成即可

image-1659769085186

分区工具有fdisk和gdisk,当硬盘小于2T的时候我们应该用fdisk来分区,而当硬盘大于2T的时候则应用gdisk来进行分区

fdisk分区

//生产分区建议: 如无特殊需求, 直接使用整个磁盘即可, 无需分区
//学习分区建议:1P+1E(3L) 2P+1E(2L) 3P+1E(1L) (仅适用于练习)      

[root@localhost ~]# fdisk -l
[root@localhost ~]# fdisk  /dev/sdb
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 partition's system id   //修改分区ID,可以通过l查看id
   u   change display/entry units       //修改容量单位,磁柱或扇区
   v   verify the partition table       //检验分区表
   w   write table to disk and exit     //保存退出
   x   extra functionality (experts only)   //拓展功能

命令用法

Command (m for help): n          创建分区
Partition type
   p   primary (0 primary, 0 extended, 4 free)     主分区
   e   extended (container for logical partitions) 扩展分区
Select (default p): p               p,创建主分区
Partition number (1-4, default 1):   //默认回车
First sector (2048-41943039, default 2048): //默认回车
Last sector,+sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039):+500M 分配的大小     

Created a new partition 1 of type 'Linux' and of size 500 MiB.

Command (m for help): p
Disk /dev/sdc: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb33147fb

Device     Boot Start     End Sectors  Size Id Type
/dev/sdc1        2048 1026047 1024000  500M 83 Linux

Command (m for help): n    新建分区
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): e         e,创建扩展分区
Partition number (2-4, default 2): 
First sector (1026048-41943039, default 1026048): 
Last sector, +sectors or +size{K,M,G,T,P} (1026048-41943039, default 41943039): +200M

Created a new partition 2 of type 'Extended' and of size 200 MiB.

Command (m for help): p
Disk /dev/sdc: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb33147fb

Device     Boot   Start     End Sectors  Size Id Type
/dev/sdc1          2048 1026047 1024000  500M 83 Linux     
/dev/sdc2       1026048 1435647  409600  200M  5 Extended


Command (m for help): n    创建分区
Partition type
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l          创建逻辑分区

Adding logical partition 5      逻辑分区从5开始 
First sector (1028096-1435647, default 1028096): 
Last sector, +sectors or +size{K,M,G,T,P} (1028096-1435647, default 1435647): +50M

Created a new partition 5 of type 'Linux' and of size 50 MiB.

Command (m for help): p
Disk /dev/sdc: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb33147fb

Device     Boot   Start     End Sectors  Size Id Type
/dev/sdc1          2048 1026047 1024000  500M 83 Linux   主分区
/dev/sdc2       1026048 1435647  409600  200M  5 Extended  扩展分区
/dev/sdc5       1028096 1130495  102400   50M 83 Linux    逻辑分区

Command (m for help): p    查看创建好的分区
Disk /dev/sdc: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb33147fb

Device     Boot   Start     End Sectors  Size Id Type
/dev/sdc1          2048 1026047 1024000  500M 83 Linux
/dev/sdc2       1026048 1435647  409600  200M  5 Extended
/dev/sdc5       1028096 1130495  102400   50M 83 Linux

Command (m for help): w           保存分区,并退出
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[root@localhost ~]# fdisk -l /dev/sdc |grep type  检查磁盘是否是MBR分区方式
Disklabel type: dos(MBR)

[root@localhost ~]# yum -y install partprobe 
[root@localhost ~]# partprobe  /dev/sdc  安装partprobe,刷新内核立即生效,无需重启
[root@localhost ~]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  100G  0 disk 
|-sda1            8:1    0    1G  0 part /boot
`-sda2            8:2    0   99G  0 part 
  |-cs_192-root 253:0    0 64.1G  0 lvm  /
  |-cs_192-swap 253:1    0  3.7G  0 lvm  [SWAP]
  `-cs_192-home 253:2    0 31.3G  0 lvm  /home
sdb               8:16   0   20G  0 disk 
`-sdb1            8:17   0    1G  0 part 
sdc               8:32   0   20G  0 disk 
|-sdc1            8:33   0  500M  0 part 
|-sdc2            8:34   0  512B  0 part 
`-sdc5            8:37   0   50M  0 part 
sr0              11:0    1 10.3G  0 rom  /mnt/cdrom

gdisk分区

[root@localhost ~]# yum -y install gdisk     安装gdisk工具
[root@localhost ~]# gdisk /dev/sdb
Command (? for help): n         创建新分区    
Partition number (1-128, default 1):  默认回车
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}: 默认回车 
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +900M 分配大小
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): p   查看创建好的分区
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1845247   900.0 MiB   8300  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    确认
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

[root@localhost ~]# fdisk /dev/sdb -l |grep type 检查磁盘是否是gpt格式
Disklabel type: gpt

[root@localhost ~]# yum -y install partprobe 
[root@localhost ~]# partprobe  /dev/sdb  安装partprobe,刷新内核立即生效,无需重启

磁盘格式化

使用mkfs命令格式化磁盘,创建文件系统

//mkfs常用的选项有
-b  //设定数据区块占用空间大小,目前支持1024、2048、4096 bytes每个块。
-t  //用来指定什么类型的文件系统,可以是ext3,ext4, xfs
-i  //设定inode的大小
-N  //设定inode数量,防止Inode数量不够导致磁盘不足
-L  //预设该分区的标签label

//格式化整个sdb磁盘为ext4文件系统
[root@localhost ~]# mkfs.ext4  /dev/sdb1

//也可以使用-t指定方式创建ext4文件系统
[root@localhost ~]# mkfs -t ext4  /dev/sdb1

//也可以格式化sdb1分区为xfs文件系统
[root@localhost ~]# mkfs.xfs  /dev/sdb1
[root@localhost ~]# mkfs.xfs /dev/sdc1
meta-data=/dev/sdc1              isize=512    agcount=4, agsize=32000 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=128000, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1368, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@localhost ~]# mount /dev/sdc1  /qwe/
Filesystem              Type      Size  Used Avail Use% Mounted on
[root@localhost ~]# df -Th | grep qwe     可以看到磁盘sdc1文件类型为 xfs
/dev/sdc1               xfs       495M   29M  466M   6% /qwe

磁盘挂载

在上面的内容中讲到了磁盘的分区和格式化, 那么格式化完了后, 如何使用, 这就涉及到了挂载这块磁盘

挂载分区前需要创建挂载点, 挂载点以目录形式出现
如果往挂载点目录写入数据, 实际上会写入到该分区
挂载点建议是空目录, 不是也不影响挂载分区的使用,但是会隐藏原有的文件

临时挂载磁盘
命令:mount挂载磁盘,实质为文件系统指定访问入口
mount -t       //指定文件系统挂载分区,如ext3,ext4, xfs
mount -a       //重新读取/etc/fstab配置文件的所有分区
mount -o       //指定挂载参数

//fstab被损坏情况下,让只读文件系统可写(正常情况下不使用)
[root@localhost ~]#mount -o rw,remount /  

[root@localhost ~]# mkdir cipan    //创建一个目录,把磁盘/dev/sdc1临时挂载到/cipan这个目录
[root@localhost ~]# mount -t xfs /dev/sdc1  cipan/
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/sdc1                495M   29M  466M   6% /root/cipan

永久挂载磁盘

[root@localhost ~]# blkid | grep sdc    使用blkid命令获取各分区的UUID
/dev/sdc1: UUID="d5be8b5f-f255-42b0-b708-e5f7da663b1c" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="b33147fb-01"
/dev/sdc5: PARTUUID="b33147fb-05"

[root@localhost ~]# blkid | grep sdc1
/dev/sdc1: UUID="d5be8b5f-f255-42b0-b708-e5f7da663b1c" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="b33147fb-01"

[root@localhost ~]# vim /etc/fstab   把下面这行写到/etc/fstab中,永久挂载, 开机自动挂载
[root@localhost ~]# cat /etc/fstab |grep cipan  
UUID="d5be8b5f-f255-42b0-b708-e5f7da663b1c" /root/cipan    xfs   defaults  0  0

fstab配置文件介绍:

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

//分区标识(UUID或设备名)                       挂载点      文件类型  挂载参数    不检查 不备份
UUID="d5be8b5f-f255-42b0-b708-e5f7da663b1c" /root/cipan   xfs   defaults   0      0

//挂载参数, 可写fstab配置文件, 也可以mount时使用-o参数指定
参数              参数意义                               系统默认值
async           系统每隔一段时间把内存数据写入磁盘中,
sync            时时同步内存和磁盘中数据;
suid,nosuid     允许/不允许分区有suid属性                suid
rw,ro           可以指定文件系统是只读(ro)或可写(rw)       rw
exec,noexec     允许/不允许可执行文件执行,不要挂载根分区    exec
user,nouser     允许/不允许root外的其他用户挂载分区        nouser
auto,noauto     开机自动挂载/不自动挂载                    auto
default         默认文件系统挂载设置 rw, suid, dev, exec, auto, nouser, async

//加载所有配置
[root@localhost ~]# mount -a

卸载挂载磁盘

umount -lf   强制卸载挂载


[root@localhost ~]# umount /root/cipan      使用挂载的目录卸载

[root@localhost ~]# umount /dev/sdc1  使用磁盘设备名卸载/dev/sdc1


umount不能卸载的情况
[root@localhost ~]# cd cipan/    进入挂载目录进行卸载会显示正忙
[root@localhost cipan]# umount /root/cipan 
umount: /root/cipan: target is busy.

如上情况解决办法有两种, 切换至其他目录 或使用'-l'选项强制卸载    
[root@localhost db1]# umount -l /db1

交换分区SWAP

交换分区SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用。

交换分区一般指定虚拟内存的大小为实际内存的1~1.5倍。如果实际内存超过8GB,可以直接划分16GB给虚拟内存即可,如果虚拟内存不够用的情况,须增加一个虚拟磁盘,由于不能给原有的磁盘重新分区,所以可以选择新建。

创建swapfile

[root@localhost ~]# dd if=/dev/zero of=/opt/qq bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 3.315 s, 324 MB/s

if:指定源  一般写/dev/zero
of:指定目标
bs:定义块大小
count:数量

格式化swap分区

[root@localhost ~]# mkswap -f /opt/qq 
mkswap: /opt/qq: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=024c584c-cb6e-4015-a8ba-67737019edcf

检测当前swap分区情况

[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3464         267        1903           8        1293        2968
Swap:          3755           0        3755

开启新建的SWAP分区

[root@localhost ~]# swapon /opt/qq
swapon: /opt/qq: insecure permissions 0644, 0600 suggested.
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3464         268        1902           8        1294        2967
Swap:          4779           0        4779

关闭新建的swap分区

[root@localhost ~]# swapoff /opt/qq
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3464         267        1903           8        1294        2968
Swap:          3755           0        3755
[root@localhost ~]# fdisk /dev/sdb1 
Command (m for help): n      创建分区
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p          创建主分区
Partition number (1-4, default 1):  
First sector (2048-1843199, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-1843199, default 1843199): +500M 创建大小

Created a new partition 1 of type 'Linux' and of size 500 MiB.

Command (m for help): p
Disk /dev/sdb1: 900 MiB, 943718400 bytes, 1843200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd88e3e3b

Device      Boot Start     End Sectors  Size Id Type
/dev/sdb1p1       2048 1026047 1024000  500M 83 Linux   把这个分区作为交换分区

Command (m for help): l      列出所有支持的分区类型对应的id
0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 
 Command (m for help): t         修改分区id
Selected partition 1 
Hex code (type L to list all codes): 82     修改成id为82
Changed type of partition 'Linux' to 'Linux swap / Solaris'.

Command (m for help): p
Device      Boot Start     End Sectors  Size Id Type
/dev/sdb1p1       2048 1026047 1024000  500M 82 Linux swap / Solaris 修改为swap类型
Command (m for help): w

[root@localhost ~]# mkswap /dev/sdb1   把sdb1格式化为交换分区
mkswap: /dev/sdb1: warning: don't erase bootbits sectors
        (dos partition table detected). Use -f to force.
Setting up swapspace version 1, size = 900 MiB (943714304 bytes)
no label, UUID=ba815d80-b3e5-4f96-a5e5-815cf3c81838


[root@localhost ~]# swapon /dev/sdb1        启动交换分区
[root@localhost ~]# swapon -s               查看
Filename                                Type            Size    Used    Priority
/dev/sdb1                               partition       921596  0       -3

[root@localhost ~]# blkid | grep sdb1
/dev/sdb1: UUID="ba815d80-b3e5-4f96-a5e5-815cf3c81838" TYPE="swap" PTUUID="d88e3e3b" PTTYPE="dos" PARTLABEL="Linux filesystem" PARTUUID="0d3d3591-273e-4be6-a869-c663f259e3ba"

[root@localhost ~]# vim /etc/fstab    持久化保存交换分区的使用
[root@localhost ~]# cat /etc/fstab | grep swap
UUID="ba815d80-b3e5-4f96-a5e5-815cf3c81838" swap swap  defaults 0 0


生产磁盘故障案例

Inode被占满,导致磁盘有可用的剩余空间也无法继续使用

[root@localhost ~]# dd if=/dev/zero of=/opt/qq bs=1k count=1024
[root@localhost ~]# mkfs.ext3 -i 1024 /opt/qq
[root@localhost ~]# mkdir /qwe
[root@localhost ~]# mount -t ext3 -o loop /opt/qq /qwe/

//inode被占满
[root@localhost ~]# touch {1..20000}
touch: cannot touch `19997': No space left on device
touch: cannot touch `19998': No space left on device
touch: cannot touch `19999': No space left on device
touch: cannot touch `20000': No space left on device

//inode被占满,剩余block也是无法继续使用
[root@localhost ~]# df -i|grep data
/opt/qq      1024  1024       0  100% /data
[root@localhost ~]# df -h|grep qwe
/opt/newdisk    891K   34K  806K   5% /data

Block空间即将被占满, 但删除大文件也没有释放空间

假设现在线上正在运行Nginx服务, Nginx产生的日志已经达到了20个G, 磁盘眼看就看沾满了, 请问不重启Nginx的方式如何处理

//是会删除文件, 但Nginx持续占用着文件, 所以空间并不会被释放
rm -f access.log

//正确做法如下, 清空该文件即可释放文件内容
> access.log

卷的管理

lvm的应用场景及其弊端

应用场景:
随着公司的发展,数据增长较快,最初规划的磁盘容量不够用了

弊端:
数据不是直接存放在硬盘上,而是在硬盘的上面又虚拟出来一层逻辑卷存放数据,故而增加了磁盘数据恢复的难度

物理卷、卷组、逻辑卷

image-1659769125424

物理卷(PV):把常规的块设备(硬盘,分区等可以读写数据的设备)通过pvcreate命令对其进行初始化,就成了物理卷

卷组(VG):把多个物理卷的容量组成一个逻辑整体,可以从里面灵活分配容量

逻辑卷(LV):从卷组中划分部分空间成为一个可以读写数据的逻辑单元。需要对其格式化然后挂载使用

lvm管理

部署lvm

创建lvm步骤:
a) 添加物理磁盘,创建物理卷
b) 创建卷组,将物理卷加入卷组
c) 在卷组中划分逻辑卷
d) 格式化逻辑卷
e) 挂载使用

准备物理磁盘
[root@localhost ~]# lsblk | grep "sd*"
sdb               8:16   0    20G  0 disk 
sdc               8:32   0    30G  0 disk 


[root@localhost ~]# pvcreate /dev/sdc  将磁盘加入pv(物理卷)
  Physical volume "/dev/sdc" successfully created.
[root@localhost ~]# pvs          检查pv创建情况
  PV         VG     Fmt  Attr PSize    PFree 
  /dev/sdc          lvm2 ---    30.00g 30.00g
  
[root@localhost ~]# vgcreate vg1 /dev/sdc  创建一个名为vg1的卷组,把物理卷加入到这个卷组
  Volume group "vg1" successfully created
[root@localhost ~]# vgs                  检查卷组
  VG     #PV #LV #SN Attr   VSize    VFree   
  vg1      1   0   0 wz--n-  <30.00g <30.00g
  
  [root@localhost ~]# lvcreate -n lv1 -L 10G vg1 创建逻辑卷, 分配名称, 以及大小, 指定卷组
  Logical volume "lv1" created.
[root@localhost ~]# lvs                     检查逻辑卷
  LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv1  vg1    -wi-a-----  10.00g
  
[root@localhost ~]# mkfs.xfs /dev/vg1/lv1    格式化文件系统
meta-data=/dev/vg1/lv1           isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=2621440, 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 ~]# blkid | grep lv1    查看lv1的磁盘id
/dev/mapper/vg1-lv1: UUID="d40ec165-388e-4b45-8fa2-f45719531704" BLOCK_SIZE="512" TYPE="xfs"

[root@localhost ~]# mkdir lv1                  创建挂载点目录
[root@localhost ~]# mount /dev/vg1/lv1 lv1/     挂载并使用
[root@localhost ~]# df -Th | grep lv1    
/dev/mapper/vg1-lv1     xfs        10G  104M  9.9G   2% /root/lv1

卷组管理

  • 扩展卷组,将新磁盘加入卷组
[root@localhost ~]# pvcreate /dev/sdc   新硬盘加入pv(物理卷)
  Physical volume "/dev/sdc" successfully created.
[root@localhost ~]# vgs                 查看已有的卷组
  VG     #PV #LV #SN Attr   VSize    VFree  
  vg1      1   0   0 wz--n-  <20.00g <20.00g
[root@localhost ~]# vgextend vg1 /dev/sdc  选择vg1卷组,把物理卷sdc加入到这个卷组
  Volume group "vg1" successfully extended
[root@localhost ~]# vgs        查看扩展后卷组的大小
  VG     #PV #LV #SN Attr   VSize    VFree 
  cs_192   1   3   0 wz--n- <299.00g     0 
  vg1      2   0   0 wz--n-   49.99g 49.99g
  • 缩减卷组,将指定磁盘从卷组中删除
[root@localhost ~]# vgreduce vg1 /dev/sdc  指定sdc从vg1这个卷组里面删除
  Removed "/dev/sdc" from volume group "vg1"
[root@localhost ~]# vgs                    查看所减小的卷组大小 
  VG     #PV #LV #SN Attr   VSize    VFree   
  vg1      1   0   0 wz--n-  <20.00g <20.00g
  • 数据迁移卷组,同一卷组的磁盘才可以进行在线迁移
[root@localhost ~]# pvs    检查当前逻辑卷VG中PV使用情况
PV      VG   Fmt  Attr PSize PFree
/dev/sdb vg1 lvm2 a -- 2.00g 1.76g 
/dev/sdc vg1 lvm2 a -- 2.00g 2.00g

[root@localhost ~]# pvmove /dev/sdb   pvmove在线数据迁移至其他pv 
  /dev/sdb: Moved: 41.33%
  /dev/sdb: Moved: 100.00%


[root@localhost ~]# pvs             检查是否将sdb数据迁移至sdc 
PV      VG   Fmt  Attr PSize PFree 
/dev/sdb vg1 lvm2 a -- 2.00g 2.00g 
/dev/sdc vg1 lvm2 a -- 2.00g 1.76g

逻辑卷管理

  • 逻辑卷扩展,逻辑卷的扩展取决于卷组中的容量,逻辑卷扩展的容量不能超过卷组的容量
1.扩展lv逻辑卷
增加800M分配给逻辑卷 {注意: 800M +800M 不一样}
[root@localhost ~]# lvextend -L +500M /dev/vg1/lv1

分配磁盘池中多少百分比给逻辑卷
[root@localhost ~]# lvextend -l +50%FREE /dev/vg1/lv1

2.扩展fs文件系统
xfs扩容
[root@localhost ~]# xfs_growfs /dev/vg1/lv1
ext扩容
[root@localhost ~]# resize2fs /dev/vg1/lv1
  • ext4文件系统的逻辑卷裁剪容量
[root@localhost ~]# lvcreate -n lv1 -L 1G vg1   首先自己创建一个1G的逻辑卷作为裁剪的对象
[root@localhost ~]# lvs
  LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert       lv1  vg1    -wi-a-----   1.00g                                                    
[root@localhost ~]# mkfs.ext4 /dev/vg1/lv1 
[root@localhost ~]# mkdir lv1
[root@localhost ~]# mount /dev/vg1/lv1  lv1/
[root@localhost ~]# df -Th 
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1     ext4      976M  2.6M  907M   1% /root/lv1


缩减逻辑卷

缩减逻辑卷注意事项:

  1. 不能在线缩减,得先卸载;
  2. 确保缩减后的空间大小依然能存储原有的所有数据;
  3. 在缩减之前应该先强行检查文件,以确保文件系统处于一致性状态。使用命令e2fsck -f /PATH/TO/LV
[root@localhost ~]# umount /root/lv1            如果已经挂载,必须先取消挂载
[root@localhost ~]# e2fsck -f /dev/vg1/lv1       裁剪容量,必须是先检测文件系统
[root@localhost ~]# resize2fs /dev/vg1/lv1 500M    下面剪裁的大小要和这个一样
[root@localhost ~]# lvreduce -L 500M /dev/vg1/lv1  调整完毕后采取裁剪逻辑卷容量
[root@localhost ~]# e2fsck -f /dev/vg1/lv1   强烈建议裁剪后,再次检测文件系统
[root@localhost ~]# mount /dev/vg1/lv1 lv1/ 挂载测试如果能够挂载,一般说明裁剪成功,文件系统没有损坏
[root@localhost ~]# df -Th
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1     ext4      460M  1.6M  424M   1% /root/lv1

## 

举例:

1.如何查看/etc/目录大小

[root@localhost ~]# du -sh /etc/
25M     /etc/

2.如何查看磁盘使用分区情况

[root@localhost ~]# fdisk -l
Disk /dev/sda: 300 GiB, 322122547200 bytes, 629145600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xadb8ebb2

Device     Boot   Start       End   Sectors  Size Id Type
/dev/sda1  *       2048   2099199   2097152    1G 83 Linux
/dev/sda2       2099200 629145599 627046400  299G 8e Linux LVM

3.如何查看inode使用情况

[root@localhost ~]# df -i
Filesystem                 Inodes IUsed     IFree IUse% Mounted on
devtmpfs                   469172   427    468745    1% /dev
tmpfs                      474180     1    474179    1% /dev/shm

4.如何查看磁盘block使用情况

[root@localhost ~]# df 
Filesystem              1K-blocks    Used Available Use% Mounted on
devtmpfs                  1876688       0   1876688   0% /dev
tmpfs                     1896720       0   1896720   0% /dev/shm

5.如何查看分区使用格式

[root@localhost ~]# df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
devtmpfs devtmpfs 1876688 0 1876688 0% /dev

6.如何查看一个设备的UUID

[root@localhost ~]# blkid 
/dev/sda1: UUID="f0ed5bbf-5233-46b2-85bf-4db42ccf3dca" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="adb8ebb2-01"

7.请解释/etc/fstab中每段含义

[root@localhost ~]# vim /etc/fstab 
/分区标识(UUID或设备名)                       挂载点      文件类型  挂载参数    不检查 不备份
UUID="d5be8b5f-f255-42b0-b708-e5f7da663b1c" /root/cipan   xfs   defaults   0      0

8.一个ext4的文件分区,当使用touch test.file命令创建一个新文件是报错,报错的信息提示磁盘已满,但是采用df –h 命令查看磁盘大小时,只是用了60%的磁盘空间,为什么会出现这个情况,说说你的理由.

两种情况,一种是磁盘配额问题,另外一种就是EXT4文件系统的设计不适合很多小文件跟大文件的一种文件格式,出现很多小文件时,容易导致inode  耗尽了。

磁盘分区方案

在虚拟机中添加一块20GB的SCISI磁盘
在新硬盘中建立一个5GB的分区,一个10G的分区
一个格式化为ext4的文件系统, 一个格式化为xfs的文件系统
新建两个目录站点进行挂载, 要求开机自动挂载该分区

[root@localhost ~]# lsblk | grep sdb
sdb               8:16   0    20G  0 disk 
[root@localhost ~]# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x7b397073.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (1-4, default 1): 
First sector (2048-41943039, default 2048): ^C
Command (m for help): n     
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-41943039, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +5G

Created a new partition 1 of type 'Linux' and of size 5 GiB.
Partition #1 contains a ext4 signature.
The signature will be removed by a write command.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 
First sector (10487808-41943039, default 10487808): 
Last sector, +sectors or +size{K,M,G,T,P} (10487808-41943039, default 41943039): +10G

Created a new partition 2 of type 'Linux' and of size 10 GiB.

Command (m for help): p
Device     Boot    Start      End  Sectors Size Id Type
/dev/sdb1           2048 10487807 10485760   5G 83 Linux
/dev/sdb2       10487808 31459327 20971520  10G 83 Linux
Command (m for help): w
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# mkfs.ext4 /dev/sdb1 
[root@localhost ~]# mkfs.xfs /dev/sdb2
[root@localhost ~]# mkdir ext1 xfs1
[root@localhost ~]# blkid | grep sdb*
/dev/sdb1: UUID="339d970e-023c-403f-aa16-2a7690ecc703" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="7b397073-01"
/dev/sdb2: UUID="130f973a-250d-458d-b4aa-e9186830aeb4" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="7b397073-02"
[root@localhost ext1]# vim /etc/fstab
UUID="339d970e-023c-403f-aa16-2a7690ecc703"  /root/ext1 ext4 defaults  0 0
UUID="130f973a-250d-458d-b4aa-e9186830aeb4" /root/xfs1 xfs defaults    0  0
[root@localhost ~]# mount -a
[root@localhost ~]# df -Th | grep sdb*
/dev/sdb1               ext4      4.9G   20M  4.6G   1% /root/ext1
/dev/sdb2               xfs        10G  104M  9.9G   2% /root/xfs1