磁盘管理

基本概述:机械hdd与固态ssd

系统的第⼀块SCSI接⼝的硬盘名称为 /dev/sda
系统的第⼆块SCSI接⼝的硬盘名称为 /dev/sdb

物理硬盘 /dev/sd[a-z]
KVM虚拟化 /dev/vd[a-z] online
//第⼀块磁盘
/dev/sda
//第⼆块磁盘第⼀个分区
/dev/sdb1
//第⼀块KVM虚拟化磁盘, 第⼀个分区
/dev/vda1

fdisk -l         # 查看磁盘详细信息
# /dev/sda 是硬盘设备名,⼤⼩为 59.1 GB,共有 115343360 个扇区
Disk /dev/sda: 59.1 GB, 59055800320 bytes, 115343360 sectors
# 每个扇区⼤⼩为 512 字节
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000ba7c9
#硬盘分为三个分区,分别为 /dev/sda1、/dev/sda2 和 /dev/sda3。其中 /dev/sda1 是启动分区⽂件系统为
Linux;/dev/sda2 是 Linux 交换分区;/dev/sda3 是 Linux ⽂件系统。
 Device Boot Start End Blocks Id System
/dev/sda1 * 2048 616447 307200 83 Linux
/dev/sda2 616448 6909951 3146752 82 Linux swap / Solaris
/dev/sda3 6909952 115343359 54216704 83 Linux

MBR (Master Boot Record)⽅式只能分4个主分区, GPT (GUID Partition Table)可分128个主分区
MBR 与 GPT 之间互相转换会导致数据丢失

# 检查磁盘使用情况
df -h

# 检查inode
df -i

# 查看类型
df -T

# 查看分区情况
lsblk

NAME       MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda              8:0 0 55G 0 disk
├─sda1       8:1 0 300M 0 part /boot
├─sda2      8:2 0 3G 0 part [SWAP]
└─sda3      8:3 0 51.7G 0 part /
sr0              11:0 1 53.9M 0 rom 
sr1               11:1 1 4.2G 0 rom

lsblk 命令输出结果中每⼀列的详细解释:
NAME :该列显示块设备的名称,通常是硬盘或硬盘上的分区。在这个例⼦中,块设备是 sda 、 sr0 和
sr1 。
MAJ:MIN :该列显示块设备的主设备号和次设备号。系统使⽤这些数字来识别块设备。
RM :该列显示块设备是否为可移动设备。如果该值为0,则表示该设备是固定设备,如果该值为1,则表示
该设备是可移动设备。
SIZE :该列显示块设备的总⼤⼩。在这个例⼦中,设备 sda 的总⼤⼩为55G。
RO :该列显示块设备是否为只读设备。如果该值为0,则表示该设备是可读写设备,如果该值为1,则表示
该设备是只读设备。
TYPE :该列显示块设备的类型。在这个例⼦中,设备 sda 和其分区的类型为 disk ,设备 sr0 和 sr1 的类
型为 rom 。
MOUNTPOINT :该列显示块设备的挂载点。如果该设备没有挂载点,则该列显示为空。在这个例⼦中,设
备 sda1 的挂载点为 /boot ,设备 sda2 没有挂载点,设备 sda3 的挂载点为 / 。


# 磁盘分区

# ⼩于2TB存储磁盘, 可选分区⼯具 fdisk
//⽣产分区建议: 如⽆特殊需求, 直接使⽤整个磁盘即可, ⽆需分区
//学习分区建议:1P+1E(3L) 2P+1E(2L) 3P+1E(1L) (仅适⽤于练习) 
fdisk -l
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分区⽅式
fdisk /dev/sdb -l|grep type
Disk label type: dos

//安装parted, 刷新内核⽴即⽣效,⽆需重启
yum -y install parted
// partprobe - inform the OS of partition table changes
partprobe /dev/sdb

// 格式化
mkfs.xfs /dev/sdb1

// 挂载
mount -t xfs /dev/sdb1 /db1/

# ⼤于2TB使⽤分区⼯具 gdisk
//安装gdisk⼯具
[root@i-m60lx3hh ~]#yum install gdisk

 [root@i-m60lx3hh ~]#gdisk /dev/sdb

Command (? for help): n //创建新分区
Partition number (1-128, default 1):
First sector (34-2097118, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-2097118, default = 2097118) or {+-}size{KMGTP}: +500M //分配500M⼤⼩

Command (? for help): p //打印查看
Number Start (sector) End (sector) Size Code Name
 1 2048 1026047 500.0 MiB 8300 Linux filesystem

Command (? for help): w //保存分区
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@i-m60lx3hh ~]# fdisk /dev/sdb -l|grep type
Disk label type: gpt

//安装parted, 刷新内核⽴即⽣效,⽆需重启
[root@i-m60lx3hh ~]# yum -y install parted
[root@i-m60lx3hh ~]# partprobe /dev/sdb

// 格式化
mkfs.xfs /dev/sdb2

// 挂载
mount -t xfs /dev/sdb1 /db2/

# 磁盘挂载
命令:mount挂载磁盘,实质为⽂件系统指定访问⼊⼝
mount -t //指定⽂件系统挂载分区,如ext4, xfs
mount -a //读取/etc/fstab配置⽂件的所有分区
mount -o //指定挂载参数
//fstab被损坏情况下,让只读⽂件系统可写(正常情况下不使⽤)
[root@i-m60lx3hh ~]#mount -o rw,remount / 
//挂载/dev/sdb1⾄db1⽬录
[root@i-m60lx3hh ~]# mkdir /db1
[root@i-m60lx3hh ~]# mount -t xfs /dev/sdb1 /db1/


# 永久挂载磁盘

# 先获取磁盘的uuid
blkid | grep "sdb1"

//使用UUID挂载磁盘sdb1分区至于db1,临时挂载
mount UUID="0a251763-b1c8-4cf0-961b-652004ddda82" /db1

//把UUID写到/etc/fstab中,永久挂载
vi /etc/fstab
UUID=0a251763-b1c8-4cf0-961b-652004ddda82 /db1 xfs defaults 0 0

⚠️:fstab一定要按照格式写
//分区标识(UUID或设备名)                          挂载点            ⽂件类型             挂载参数     不检查      不备份
UUID=683a861a-0d76-4f87-9dcc-a3424a87e58b       /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

# 卸载挂载磁盘
umount /db1

//强制卸载
umount -lf

//使用设备名卸载
umount /dev/sdb1

//过滤谁在使用磁盘
lsof |egrep db1
fuser也可以

# 虚拟磁盘SWAP
通过将一部分硬盘空间作为虚拟内存使用,来扩展内存容量。当物理内存不足时,系统会将一部分暂时不用的内存数据存储到虚拟磁盘SWAP中,以释放物理内存,从而保证系统的正常进行。

1、创建swapfile

dd if=/dev/zero of=/opt/newdisk bs=40k count=102400
//if:指定源 ⼀般写/dev/zero
//of:指定⽬标
//bs:定义块⼤⼩
//count:数量

2、格式化swap分区
mkswap -f /opt/newdisk

3、检测当钱swap分区情况
free -m

4、启动虚拟磁盘,并检查
swapon /opt/newdisk

5、关闭虚拟硬盘,并检查
swapoff /opt/newdisk


# 创建swap分区并且持久化使用
考试题目:一般是新建一个分区,并且把分区作为swap分区使用

# 查看内存和交换分区的使用情况
free -m

# swapon -s 也能⽤该命令查看,只是默认也是没有交换分区所有没有输出

fdisk -l /dev/sdb
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase.
Use at your own discretion.
Disk /dev/sdb: 21.5 GB, 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
Disk label type: gpt
Disk identifier: 38070BAD-1DC0-4CFE-844A-D88D3DABB696
# Start End Size Type Name
 1 2048 1026047 500M Linux filesyste Linux filesystem <---准备把该分区作
为交换分区
1、新建⼀个分区,并且把分区类型更改为82
 新分区我们在上⾯的练习已经完成了,所以本例⼦不⽤分区,⽽是需要修改该分区的类型
# fdisk /dev/sdb
命令(输⼊ m 获取帮助):l 列出所有⽀持的分区类型对应的id
命令(输⼊ m 获取帮助):t 修改分区id
分区号 (1-5,默认 5):1 修改第1个分区
Hex 代码(输⼊ L 列出所有代码):14 修改成id为14
已将分区“Linux”的类型更改为“Linux swap / Solaris”
命令(输⼊ m 获取帮助):p
。。。
设备 Boot Start End Blocks Id System
 1 2048 1026047 500M Linux swap Linux filesystem<---修改成功
命令(输⼊ m 获取帮助):w
强烈建议: 对分区做了修改后都刷新⼀下
# partprobe /dev/vdb
2、把vdb2格式化为交换分区
# mkswap /dev/sdb1
mkswap: /dev/sdb1: warning: wiping old xfs signature.
Setting up swapspace version 1, size = 511996 KiB
no label, UUID=cd146d62-e6ab-4d06-8c9b-1958af263a95
3、启动交换分区
# swapon /dev/sdb1 或者 # swanon -a 启动所有交换分区
查看
# swapon -s
# swapon -s
Filename Type Size Used Priority
/dev/sda2 partition 3146748 0 -1
/dev/sdb1 partition 511996 0 -2
4、持久化保存交换分区的使⽤
# blkid /dev/sdb1
/dev/sdb1: UUID="cd146d62-e6ab-4d06-8c9b-1958af263a95" TYPE="swap" PARTLABEL="Linux
filesystem" PARTUUID="d16478c9-448d-4ffd-8742-aaaf23e8b248"
# vim /etc/fstab
....
UUID=cd146d62-e6ab-4d06-8c9b-1958af263a95 swap swap defaults 0 0

# 案例
Inode被沾满,导致磁盘有可⽤的剩余空间也⽆法继续使⽤
[root@i-m60lx3hh ~]#  dd if=/dev/zero of=/opt/newdisk bs=1k count=1024
[root@i-m60lx3hh ~]#  mkfs.ext4 -i 1024 /opt/newdisk
[root@i-m60lx3hh ~]#  mkdir /data
[root@i-m60lx3hh ~]#  mount -t ext4 -o loop /opt/newdisk /data/

[root@i-m60lx3hh data]# touch {1..20000}
touch: cannot touch ‘19986’: No space left on device
touch: cannot touch ‘19987’: No space left on device
touch: cannot touch ‘19988’: No space left on device

[root@i-m60lx3hh data]# df -h
/dev/loop0      891K   38K  782K   5% /data      #有空间可以使用

[root@i-m60lx3hh data]# df -i
/dev/loop0         1024  1024        0  100% /data     # inode满了无法创建文件

// 清理
[root@i-m60lx3hh data]# find ./ -type f -name "[0-9]*" |xargs rm -rf
⚠️:find后边的路径一定是删除文件的路径

# 案例Block空间即将被沾满, 但删除⼤⽂件也没有释放空间
[root@i-m60lx3hh data]# yum install nginx -y
[root@i-m60lx3hh data]# vim /etc/nginx/nginx.conf
access_log /data/log/nginx/access.log main;
[root@i-m60lx3hh data]# mkdir -p /data/log/nginx/      # 创建目录
[root@i-m60lx3hh data]#  chown nginx:nginx -R /data/log/      #更改属为nginx

//模拟⼤量的⽂件写⼊
[root@i-m60lx3hh nginx]#  seq 120000 > access.log
[root@i-m60lx3hh nginx]#  seq 140000 > access.log
seq: write error: No space left on device

[root@i-m60lx3hh nginx]# nginx -s reload     #重启nginx可以解决

方法二:
[root@i-m60lx3hh nginx]# lsof |grep delete       #查询delete操作
[root@i-m60lx3hh nginx]# ps aux |egrep 16166      #实际上是由于资源文件已经被删除了,但是nginx进程还在打开的一个程序,nginx把它打开后会把它加载到内存和磁盘里,人工删除文件后不会释放data目录的数据,此时需要杀掉进程解决
[root@i-m60lx3hh nginx]# kill -9 15816 16166 16167     # 但是此时nginx进程也挂了

方法三:
通过重定向
[root@i-m60lx3hh nginx]# > access.log

LVM

在linux上的磁盘管理技术。允许用户将多个硬盘分区或者整个硬盘合并成一个逻辑卷,并且可以在逻辑卷上创建、删除、调整大小等操作,而不需要重新分区或者重新格式化硬盘。

1、部署逻辑卷
创建物理卷,添加物理硬盘
创建卷组,添加物理卷加入到该卷组
在卷组中划分逻辑卷

//准备物理硬盘
lsblk |grep "sd[bcd]"

//将磁盘加入pv
pvcreate /dev/sdb

//检查pv创建情况
pvs


//创建名为datavg的卷组
vgcreate datavg /dev/sdb

//检查卷组
vgs

//创建逻辑卷,分配名称,以及大小,指定卷组
lvcreate -L 100M -n lv1 datavg

//检查逻辑卷
lvscan

//格式化文件系统
mkfs.xfs /dev/datavg/lv1

//挂载并使⽤
 mkdir /lv1
 mount /dev/datavg/lv1 /lv1/
 df -h

# 卷组池管理
// 扩展卷组VG, 扩⼤VG卷组

1、新硬盘加⼊pv
pvcreate /dev/sdc

2、使⽤vgextend扩展
vgextend datavg /dev/sdc

//移除卷组VG, 移除vg组中某⼀块硬盘
 vgreduce datavg /dev/sdb

# 数据迁移卷组VG, 同⼀卷组的磁盘才可以进⾏在线迁移
1、检查当前逻辑卷VG中pv使用情况
pvs

2、pvmove在线数据迁移⾄其他pv
pvmove /dev/sdb

3、检查是否将sdb数据迁移⾄sdc
pvs


# 扩容逻辑卷
//逻辑卷的扩展, 取决于vg卷中剩余多少容量, 扩展容量不能超过卷组VG
vgs
VG #PV #LV #SN   Attr      VSize VFree
vg1   2     2     0 wz --n-   1.88g 1.00g

1、扩展lv逻辑卷
lvextend -L +800M /dev/datavg/lv1

lvextend -l +50%FREE /dev/datavg/lv1

3、扩展fs⽂件系统
//xfs扩容
 xfs_growfs /dev/datavg/lv1      #刷新

//ext扩容
 resize2fs /dev/datavg/lv1

# 缩小逻辑卷
umount /lv1

lvresize -L 500M /dev/datavg/lv1

 WARNING: Reducing active logical volume to 500.00 MiB.
 THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce datavg/lv1? [y/n]: y
 Size of logical volume datavg/lv1 changed from <1.05 GiB (268 extents) to 500.00 MiB
(125 extents).
 Logical volume datavg/lv1 successfully resized.

 mkfs.xfs -f /dev/datavg/lv1       #格式化

 mount /dev/datavg/lv1 /lv1/

# 删除逻辑卷
umount /lv1
lvremove /dev/datavg/lv1
posted @ 2025-03-09 17:26  basickill  阅读(113)  评论(0)    收藏  举报