这里写目录标题
- Linux系统磁盘管理
- 磁盘容量检查
- 磁盘分区
- fdisk分区
- gdisk分区
- 磁盘格式化
- 磁盘挂载
- 临时挂载磁盘
- 永久挂载磁盘
- 卸载挂载磁盘
- 交换分区SWAP
- 创建swapfile
- 格式化swap分区
- 检测当前swap分区情况
- 开启新建的SWAP分区
- 关闭新建的swap分区
- 生产磁盘故障案例
Linux系统磁盘管理
磁盘容量检查
使用df
命令查看磁盘容量,不加参数以k为单位:
df -i //查看inode使用情况
df -h //以G或者T或者M人性化方式显示
df -T //查看文件类型
//使用df命令查看磁盘,下面分别介绍每列什么含义
[root@localhost ~]# df -h
//设备名称 //文件类型 磁盘大小 已用大小 可用大小 使用百分比 挂载点
[root@zyq ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 1.6G 9.1M 1.6G 1% /run
/dev/mapper/rhel-root xfs 17G 1.2G 16G 8% /
/dev/sda1 xfs 1014M 184M 831M 19% /boot
tmpfs tmpfs 791M 0 791M 0% /run/user/0
使用lsblk
查看分区情况:
[root@zyq ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 8.4G 0 rom
使用du
命令查看目录或者文件的容量,不加参数以k为单位:
du -sh /opt //人性化输出显示大小
-s:列出总和
-h:人性化显示容量信息
[root@zyq ~]# du -sh /opt/
32K /opt/
[root@zyq ~]#
磁盘分区
分区之前, 需要先给虚拟机添加一块磁盘,以便于我们做后续的实验vmware虚拟机,请按如下进行操作:
1.找到对应虚拟主机点击右键, 选择设置
2.在硬件向导里面点击添加按钮, 在硬件类型中选中“硬盘”, 点击下一步
3.磁盘类型选择默认, 然后创建新虚拟磁盘, 调整大小(不要勾选立即分配空间)
4.最后点击下一步, 完成即可
分区工具有fdisk和gdisk,当硬盘小于2T的时候我们应该用fdisk来分区,而当硬盘大于2T的时候则应用gdisk来进行分区
fdisk分区
//生产分区建议: 如无特殊需求, 直接使用整个磁盘即可, 无需分区
//学习分区建议:1P+1E(3L) 2P+1E(2L) 3P+1E(1L) (仅适用于练习)
fdisk -l --->查看磁盘分区详细信息
[root@zyq ~]# 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 //扩展分区
Select (default p): p //选择主分区
Partition number (1-4, default 1): //默认回车
First sector (2048-2097151, default 2048): //默认扇区回车
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +50M //分配50MB
//创建扩展分区
Command (m for help): n //新建分区
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e //创建扩展分区
Partition number (2-4, default 2):
First sector (104448-2097151, default 104448):
Using default value 104448
Last sector, +sectors or +size{K,M,G} (104448-2097151, default 2097151): //默认划分所有空间给扩展分区
//创建逻辑分区
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
First sector (106496-2097151, default 106496):
Using default value 106496
Last sector, +sectors or +size{K,M,G} (106496-2097151, default 2097151): +100M
//分配100MB空间
//查看分区创建
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/sdb1 2048 104447 51200 83 Linux
/dev/sdb2 104448 2097151 996352 5 Extended
/dev/sdb5 106496 311295 102400 83 Linux
//保存分区
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
//检查磁盘是否是MBR分区方式
[root@zyq ~]# fdisk -l /dev/sdb|grep type
Disk label type: dos
//安装parted, 刷新内核立即生效,无需重启
[root@zyq ~]# yum -y install parted
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered with an entitlement server. You can use subscription-manager to register.
Last metadata expiration check: 0:04:05 ago on Mon 10 Jul 2023 05:24:54 PM CST.
Package parted-3.5-2.el9.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[root@zyq ~]# partprobe /dev/sdb
[root@zyq ~]#
gdisk分区
//安装gdisk工具
[root@zyq ~]# yum -y install 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}: +500M
Current type is 8300 (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
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
//检查磁盘是否是gpt格式
[root@zyq /]# fdisk /dev/sdb -l|grep type
Disk label type: gpt
//安装parted, 刷新内核立即生效,无需重启
[root@localhost ~]# yum -y install parted
[root@localhost ~]# partprobe /dev/sdb
磁盘格式化
使用mkfs
命令格式化磁盘,创建文件系统
//mkfs常用的选项有
-b //设定数据区块占用空间大小,目前支持1024、2048、4096 bytes每个块。
-t //用来指定什么类型的文件系统,可以是ext3,ext4, xfs
-i //设定inode的大小
-N //设定inode数量,防止Inode数量不够导致磁盘不足
-L //预设该分区的标签label
//格式化整个sdb磁盘为ext4文件系统
[root@zyq ~]# mkfs.ext4 /dev/sdb1
//也可以使用-t指定方式创建ext4文件系统
[root@zyq ~]# mkfs -t ext4 /dev/sdb1
//也可以格式化sdb1分区为xfs文件系统
[root@zyq ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=32000 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1
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
磁盘挂载
在上面的内容中讲到了磁盘的分区和格式化, 那么格式化完了后, 如何使用, 这就涉及到了挂载这块磁盘
挂载分区前需要创建挂载点, 挂载点以目录形式出现
如果往挂载点目录写入数据, 实际上会写入到该分区
挂载点建议是空目录, 不是也不影响挂载分区的使用,但是会隐藏原有的文件
临时挂载磁盘
命令:mount挂载磁盘,实质为文件系统指定访问入口
mount -t //指定文件系统挂载分区,如ext3,ext4, xfs
mount -a //重新读取/etc/fstab配置文件的所有分区
mount -o //指定挂载参数
//fstab被损坏情况下,让只读文件系统可写(正常情况下不使用)
[root@zyq ~]#mount -o rw,remount /
//挂载/dev/sdb1至db1目录
[root@zyq ~]# mkdir /sdb
[root@zyq ~]# mount -t xfs /dev/sdb1 /sdb/
永久挂载磁盘
//使用blkid命令获取各分区的UUID
[root@zyq ~]# blkid |grep "sdb1"
/dev/sdb1: UUID="8508596e-367a-42b7-88e7-14f11caec1d5" TYPE="xfs" PARTUUID="6b755989-5ce3-d047-91d0-aa60bb8b6760"
//使用UUID挂载磁盘sdb1分区至于db1, 临时挂载
[root@localhost ~]# mount UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9" /db1
//也可以把下面这行写到/etc/fstab中,永久挂载, 开机自动挂载
[root@localhost ~]# tail -1 /etc/fstab
UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1 xfs defaults 0 0
//加载fstab配置文件, 同时检测语法是否有错误
[root@zyq ~]# mount –a
[root@zyq ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 1.6G 9.1M 1.6G 1% /run
/dev/mapper/rhel-root xfs 17G 1.2G 16G 8% /
/dev/sda1 xfs 1014M 184M 831M 19% /boot
tmpfs tmpfs 791M 0 791M 0% /run/user/0
/dev/sdb1 xfs 495M 29M 466M 6% /sdb
已挂载成功
fstab
配置文件介绍:
[root@localhost ~]# vim /etc/fstab
//分区标识(UUID或设备名) 挂载点 文件类型 挂载参数 不检查 不备份
UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1 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@zyq ~]# mount -a
卸载挂载磁盘
umount -lf //强制卸载挂载
//使用站点目录卸载
[root@localhost ~]# umount /db1
//使用设备名卸载/dev/sdb1
[root@localhost ~]# umount /dev/sdb1
[root@zyq ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 1.6G 9.1M 1.6G 1% /run
/dev/mapper/rhel-root xfs 17G 1.2G 16G 8% /
/dev/sda1 xfs 1014M 184M 831M 19% /boot
tmpfs tmpfs 791M 0 791M 0% /run/user/0
/dev/sdb1 xfs 495M 29M 466M 6% /sdb
[root@zyq ~]#
[root@zyq ~]# umount /sdb
[root@zyq ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 1.6G 9.1M 1.6G 1% /run
/dev/mapper/rhel-root xfs 17G 1.2G 16G 8% /
/dev/sda1 xfs 1014M 184M 831M 19% /boot
tmpfs tmpfs 791M 0 791M 0% /run/user/0
[root@zyq ~]#
//umount不能卸载的情况
[root@zyq sdb]# umount /sdb
umount: /db1: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1)
//如上情况解决办法有两种, 切换至其他目录 或使用'-l'选项强制卸载
[root@zyq sdb]# umount -l /sdb
交换分区SWAP
交换分区SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用。
交换分区一般指定虚拟内存的大小为实际内存的1.5–2倍。如果实际内存超过8GB,可以直接划分16GB给虚拟内存即可,如果虚拟内存不够用的情况,须增加一个虚拟磁盘,由于不能给原有的磁盘重新分区,所以可以选择新建。
创建swapfile
[root@zyq ~]# dd if=/dev/zero of=/opt/newdisk bs=1M count=1024
//if:指定源 一般写/dev/zero
//of:指定目标
//bs:定义块大小
//count:数量
格式化swap分区
[root@zyq ~]# mkswap -f /opt/newdisk
mkswap: /opt/newdisk: insecure permissions 0644, fix with: chmod 0600 /opt/newdisk
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=9b953910-786e-46be-8dab-9552d39eb78d
检测当前swap分区情况
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 976 133 325 6 517 646
Swap: 2047 0 2047 //原来分区是2G
开启新建的SWAP分区
[root@zyq ~]# swapon /opt/newdisk
swapon: /opt/newdisk: insecure permissions 0644, 0600 suggested.
[root@zyq ~]# free -m
total used free shared buff/cache available
Mem: 7909 483 6409 9 1262 7426
Swap: 3071 0 3071 //新多出来1G
关闭新建的swap分区
[root@zyq ~]# swapon /opt/newdisk
swapon: /opt/newdisk: insecure permissions 0644, 0600 suggested.
[root@zyq ~]# free -m
total used free shared buff/cache available
Mem: 976 133 325 6 517 646
Swap: 2047 0 2047 //还原到没有增加虚拟磁盘
//创建swap分区并且持久化使用
例子: 给系统新增加一个交换分区(swap)
考试题目:一般是要求新建一个分区,并且把分区作为swap分区使用
查看内存和交换分区的使用情况
# free -m
total used free shared buffers cached
Mem: 1841 613 1227 16 0 258
-/+ buffers/cache: 354 1486
Swap: 0 0 0 <--- 没有交换分区
# swapon -s 也能用该命令查看,只是默认也是没有交换分区所有没有输出
# fdisk -l /dev/sdb
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 83 Linux
/dev/sdb2 2099200 6293503 2097152 83 Linux <---准备把该分区作为交换分区
1、新建一个分区,并且把分区类型更改为82
新分区我们在上面的练习已经完成了,所以本例子不用分区,而是需要修改该分区的类型
# fdisk /dev/sdb
命令(输入 m 获取帮助):l 列出所有支持的分区类型对应的id
命令(输入 m 获取帮助):t 修改分区id
分区号 (1-5,默认 5):2 修改第2个分区
Hex 代码(输入 L 列出所有代码):82 修改成id为82
已将分区“Linux”的类型更改为“Linux swap / Solaris”
命令(输入 m 获取帮助):p
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 83 Linux
/dev/sdb2 2099200 6293503 2097152 82 Linux swap / Solaris <---修改成功
命令(输入 m 获取帮助):w
强烈建议: 对分区做了修改后都刷新一下
# partprobe /dev/sdb
2、把sdb2格式化为交换分区
# mkswap /dev/sdb2
正在设置交换空间版本 1,大小 = 2097148 KiB
无标签,UUID=ba08eb90-2003-44e6-9769-9a9351aebb05
3、启动交换分区
# swapon /dev/sdb2 或者 # swanon -a 启动所有交换分区
查看
# swapon -s
文件名 类型 大小 已用 权限
/dev/sdb2 partition 2097148 0 -1
4、持久化保存交换分区的使用
# blkid /dev/sdb2
/dev/sdb2: UUID="ba08eb90-2003-44e6-9769-9a9351aebb05" TYPE="swap"
# vim /etc/fstab
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=cb3299d6-16e0-4644-9686-27907eefb8f3 /boot xfs defaults 0 0
UUID=ba08eb90-2003-44e6-9769-9a9351aebb05 swap swap defaults 0 0
生产磁盘故障案例
Inode被占满,导致磁盘有可用的剩余空间也无法继续使用
[root@zyq ~]# dd if=/dev/zero of=/opt/newdisk bs=1k count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00186216 s, 563 MB/s
[root@zyq ~]# mkfs.ext4 -i 1024 /opt/newdisk
mke2fs 1.46.5 (30-Dec-2021)
Filesystem too small for a journal
Discarding device blocks: done
Creating filesystem with 1024 1k blocks and 1024 inodes
Allocating group tables: done
Writing inode tables: done
[root@zyq ~]# mkdir /date
[root@zyq ~]# mount -t ext4 -o loop /opt/newdisk /date/
//inode被占满
[root@zyq ~]# touch /date/{1..30000}
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@zyq ~]# df -i|grep data
/opt/newdisk 1024 1024 0 100% /data
[root@zyq ~]# df -h|grep data
/opt/newdisk 891K 34K 806K 5% /data
Block空间即将被占满, 但删除大文件也没有释放空间
假设现在线上正在运行Nginx服务, Nginx产生的日志已经达到了20个G, 磁盘眼看就看沾满了, 请问不重启Nginx的方式如何处理
//是会删除文件, 但Nginx持续占用着文件, 所以空间并不会被释放
rm -f access.log
//正确做法如下, 清空该文件即可释放文件内容
> access.log