在全栈开发项目中,当项目已经部署到服务器(虚拟机、物理机或者云主机)后,有些分区若空间分配不合理,数据库以及相关日志文件将很快占满磁盘空间,因此需在后期手动为项目所在服务器空间进行扩容。
步骤
- 查看
- 分区
- 格式化
- 挂载到相应目录上
查看fdisk -l
确认容量不足,可以使用dd命令创建一个1G文件看看
1
2
3
4
5[root@nn ~]# dd if=/dev/zero of=1.0G.img bs=1M count=1000
dd: error writing ‘1.0G.img’: No space left on device
134+0 records in
133+0 records out
139460608 bytes (139 MB) copied, 0.471449 s, 296 MB/sdd: error writing ‘1.0G.img’: No space left on device
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[root@nn ~]# fdisk -l
Disk /dev/sda: 4294 MB, 4294967296 bytes, 8388608 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: dos
Disk identifier: 0x000cef21
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 8388607 3144704 8e Linux LVM
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/mapper/centos-root: 2785 MB, 2785017856 bytes, 5439488 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/mapper/centos-swap: 432 MB, 432013312 bytes, 843776 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes以上指:
两个存储(硬盘)设备分别sda和sdb
Disk /dev/sda: 4294 MB,该硬盘已分区:sda1,sda2,原系统使用4G的存储空间
Disk /dev/sdb: 5368 MB,==该硬盘未分区,5G硬盘为新增==
==以下信息,扇区有分逻辑扇区和物理扇区,对应512字节和4096字节,为何如此规划?==
Disk /dev/sda: 4294 MB, 4294967296 bytes, 8388608 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
参考IBM官网开发者论坛的解释:
解释得挺通俗易懂
- 大致意思:原计算机界存储底层设计一个物理扇区对应512字节,里面包括数据和纠错冗余码,但现在需要存储大量数据,需要 ==提高每个物理扇区的字节容量,才能从整体上扩大硬盘容量,也让每个扇区放入更强大的纠错算法==,从而达到增加磁盘容量+提高可靠性两方面提升
- 在以往计算机的软件产业链里面,都是基于512 字节扇区来设计和实现,例如在基本输入/输出系统(BIOS)、引导装载程序、操作系统内核、文件系统代码和磁盘工具等工具中,也就是“软件层”只认512标准,物理扇区却提供4096,如何处理这种矛盾?
- 采用“中间件(内核驱动?)”软件层, ==将底层物理扇区划分为8个512字节的扇区,对于“软件层”来说,它们还是基于在512字节的扇区去操作数据==,西部数据是第一家生产这种磁盘的制造商,它用“ Advanced Format ”来代表带 4096 字节物理扇区且向 512 字节逻辑扇区转换的磁盘
既然涉及到数据写入4096字节物理扇区的的磁盘,中间需要分8个逻辑扇区去写入,那么这个过程是性能损耗的,具体说明如下:
最新的文件系统使用 4096 字节或更大尺寸的数据结构,因此,大部分磁盘 I/O 操作占用4k倍数的大小扇区,假设现在Linux系统要将一个文件写入到磁盘,
(1)当文件系统数据结构正好与底层物理分区4k大小一致,对 4k字节数据结构的读,就是直接对单一扇区的读写,因此硬盘的固件不需要做其他操作,不影响性能;
(2) 但当文件系统数据结构与底层物理扇区4k不完全一致时,例如文件为7k大小,读写操作必须使用两个物理扇区,对于读操作,因为读写头总是以大概率扫过连续两个扇区,不会消耗而外时间,==而对于写操作,磁盘的固件首先读取两个物理扇区,修改两个扇区的分区(分成2*8=16个逻辑扇区),然后入两个物理扇区。该操作所需时间比 4k占用一个扇区时所需时间多。因此,性能下降。==
(3)如何判断文件数据结构是否得到合理对齐(放置到扇区上)? 大多数文件系统将其数据结构与包含其本身的分区开头对齐。因此,如果一个分区起始于以一个 4096 字节(或8 个扇区的分界)边界,例如下表所示,则表示它得到合理对齐
分区 | start | end |
---|---|---|
sda1 | 2048 | 4096 |
sda2 | 4096 | 8192 |
sda3 | 8192 | (8192+4096*10000) |
分区
在使用fdisk /dev/sdb 进行分区时,由于centos已经默认第一个分区的边界时从2048开始,而是不是从0,128等小值开始,以下是以4096作为分区的起始值,为何要以一个大值作为第一个扇区边界值:==为 MBR 与第一个分区之间的未分配空间中的装载引导程序代码留出空间==
Partition number (1-4, default 1):
First sector ==(2048-10485759, default 2048)== 4096
Last sector, +sectors or +size{K,M,G} (4096-10485759, default 10485759):
Using default value 10485759
Partition 1 of type Linux and of size 5 GiB is set
==要设为LVM分区,t命令更改==
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition ‘Linux’ to ‘Linux LVM’
Command (m for help): w
The partition table has been altered!
查看最新分区1
2 Device Boot Start End Blocks Id System
/dev/sdb1 2048 10485759 5241856 8e Linux LVM
5G硬盘已经被分区sdb1,LVM类型
格式化
格式化为一定格式的文件系统,与目标挂载目录的文件系统一致
通过命令查看以上可以看到根目录/ 文件系统格式为 xfs1
2
3
4
5
6
7
8
9
10[root@dn1 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 2G 1.9G 1 80% /
devtmpfs devtmpfs 482M 0 482M 0% /dev
tmpfs tmpfs 494M 0 494M 0% /dev/shm
tmpfs tmpfs 494M 7.0M 487M 2% /run
tmpfs tmpfs 494M 0 494M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 162M 853M 16% /boot
tmpfs tmpfs 99M 0 99M 0% /run/user/0
....
故将sdb1格式为xfs1
2
3
4
5可以看到mkfs有常见的文件系统格式
[root@nn ~]# mkfs
mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.minix mkfs.xfs
将新分区格式为xfs
[root@nn ~]# mkfs.xfs /dev/sdb1- 调整目标LVM大小
(1)查看现有Volume Group名称
1 | [root@nn ~]# vgdisplay |
这里vg名称为默认值:centos
(2)对新分区sdb1创建对应的物理卷1
pvcreate /dev/sdb1
(3) 用以上物理卷扩展VG:centos1
2
3
4
5vgextend centos /dev/sdb1
No physical volume label read from /dev/sdb1 Writing physical volume
data to disk "/dev/sdb1"
Physical volume "/dev/sdb1" successfully created
Volume group "centos" successfully extended
(4) 扩展 LVM 的逻辑卷 centos-root
查看有哪些LVM逻辑卷
1
2
3
4
5
6
7
8
9
10
11[root@nn ~]# lvdisplay
--- Logical volume ---
LV Path /dev/centos/swap
LV Name swap
VG Name centos
LV Size 412.00 MiB
--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos
LV Size 2.59 GiB
截取关键行,以上显示有两个逻辑卷,swap和root,都归属于VG:centos
现在要用sdb1增加的容量来扩展的root 逻辑卷,对于的LV path:/dev/centos/root
==扩展==
==lvextend /dev/centos/root /dev/sdb1
==
==调整大小==
==xfs_growfs /dev/centos/root
==
(5) 查看扩展效果1
2
3[root@nn ~]# lvscan
ACTIVE '/dev/centos/swap' [412.00 MiB] inherit
ACTIVE '/dev/centos/root' [<7.59 GiB] inherit
1 | [root@nn ~]# df -Th |
以上都说明逻辑卷root对于根目录,容量从2.6G,扩展到7.6G