Linux技术栈 —— 记一次Ubuntu系统 / 目录磁盘扩容
给linux磁盘扩容,是开发和运维绕不过的课题,熟练掌握,大有裨益。
一、系统情况
我使用的是Ubuntu Server 22.04.3,现有情况如下
# 系统情况
lyp@Ubuntu:~$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
root@Ubuntu:/home/lyp# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 63.9M 1 loop /snap/core20/2264
loop1 7:1 0 87M 1 loop /snap/lxd/28373
loop2 7:2 0 63.9M 1 loop /snap/core20/2318
loop3 7:3 0 87M 1 loop /snap/lxd/29351
loop4 7:4 0 38.8M 1 loop /snap/snapd/21759
loop5 7:5 0 38.7M 1 loop /snap/snapd/21465
sda 8:0 0 80G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 2G 0 part /boot
└─sda3 8:3 0 23G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 23G 0 lvm /
sr0 11:0 1 1024M 0 rom
root@Ubuntu:/home/lyp# pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 ubuntu-vg lvm2 a-- <23.00g 0
root@Ubuntu:/home/lyp# vgs
VG #PV #LV #SN Attr VSize VFree
ubuntu-vg 1 1 0 wz--n- <23.00g 0
# 下面这两条命令根本没用,因为/ubuntu--vg-ubuntu--lv虚拟卷所在的已经到sda3的上限了
root@Ubuntu:/home/lyp# sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
New size (5887 extents) matches existing size (5887 extents).
root@Ubuntu:/home/lyp# sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs 1.46.5 (30-Dec-2021)
The filesystem is already 6028288 (4k) blocks long. Nothing to do!
二、操作步骤
下面是按照GPT给的命令执行的
# 关键命令(1):用fdisk创建新分区
root@Ubuntu:/home/lyp# fdisk /dev/sda
Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
GPT PMBR size mismatch (52428799 != 167772159) will be corrected by write.
This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.
Command (m for help): p
Disk /dev/sda: 80 GiB, 85899345920 bytes, 167772160 sectors
Disk model: VMware Virtual S
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: gpt
Disk identifier: 56324E8E-9FCB-4FD5-A114-8017CB8626CF
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 4198399 4194304 2G Linux filesystem
/dev/sda3 4198400 52426751 48228352 23G Linux filesystem
# 关键命令(2):输入 n 创建新分区
Command (m for help): n
# 关键命令(3):选择分区编号,由于sda3是我最后一个分区,故此处是4
Partition number (4-128, default 4): 4
# 关键命令(4):设置起始扇区,通常,默认的起始扇区是正确的,所以按 Enter 使用默认值。
First sector (52426752-167772126, default 52426752):
# 关键命令(5):设置结束扇区,通常,默认的起始扇区是正确的,所以按 Enter 使用默认值。
Last sector, +/-sectors or +/-size{K,M,G,T,P} (52426752-167772126, default 167772126):
# 关键命令(6.1):开始更改分区类型
Command (m for help): t
# 关键命令(6.2):选择分区编号,就是我们刚刚创建的,分区号为4
Partition number (1-4, default 4): 4
# 关键命令(6.3):输入类型代码前如果不确定,按L看下代码编号,可以看到30或lvm都是我们要的,根据你自己的机器来定
Partition type or alias (type L to list all): L
1 EFI System C12A7328-F81F-11D2-BA4B-00A0C93EC93B
2 MBR partition scheme 024DEE41-33E7-11D3-9D69-0008C781F39F
3 Intel Fast Flash D3BFE2DE-3DAF-11DF-BA40-E3A556D89593
......
30 Linux LVM E6D6D379-F507-44C2-A23C-238F2A3DF928
......
107 HiFive FSBL 5B193300-FC78-40CD-8002-E86C45580B47
108 HiFive BBL 2E54B353-1271-4842-806F-E436D6AF6985
Aliases:
linux - 0FC63DAF-8483-4772-8E79-3D69D8477DE4
swap - 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
home - 933AC7E1-2EB4-4F13-B844-0E14E2AEF915
uefi - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
raid - A19D880F-05FC-4D3B-A006-743F0F84911E
lvm - E6D6D379-F507-44C2-A23C-238F2A3DF928
# 关键命令(6.3):然后按q退出类型代码查看,就进入到输入type和alias的环境,30和lvm都可以
Partition type or alias (type L to list all): 30
# 可选命令:查看下我们最后的分区效果,可以看到/dev/sda4了,喜悦感上来了
Command (m for help): p
Disk /dev/sda: 80 GiB, 85899345920 bytes, 167772160 sectors
Disk model: VMware Virtual S
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: gpt
Disk identifier: 56324E8E-9FCB-4FD5-A114-8017CB8626CF
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 4198399 4194304 2G Linux filesystem
/dev/sda3 4198400 52426751 48228352 23G Linux filesystem
/dev/sda4 52426752 167772126 115345375 55G Linux LVM
# 关键命令(7):保存并退出
Command (m for help): w
# 关键命令(8):重启系统
root@Ubuntu:/home/lyp# reboot
# 关键命令(9):将新的分区初始化为LVM物理卷
root@Ubuntu:/home/lyp# pvcreate /dev/sda4
Physical volume "/dev/sda4" successfully created.
# 关键命令(10):将新物理卷添加到现有卷组
root@Ubuntu:/home/lyp# vgextend ubuntu-vg /dev/sda4
Volume group "ubuntu-vg" successfully extended
# 关键命令(11):扩展逻辑卷以使用卷组中的所有可用空间
root@Ubuntu:/home/lyp# lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
Size of logical volume ubuntu-vg/ubuntu-lv changed from <23.00 GiB (5887 extents) to 77.99 GiB (19966 extents).
Logical volume ubuntu-vg/ubuntu-lv successfully resized.
# 关键命令(12):扩展文件系统以使用逻辑卷中的新增空间
root@Ubuntu:/home/lyp# resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 10
The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 20445184 (4k) blocks long.
三、优秀目录结构与名词解释
一个合理的,好的磁盘文件结构是什么?按我的理解,应该是根目录/
每个下的目录,都有自己的空间,这样的话,哪个目录空间不够就分配空间给哪个目录
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 1.8T 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot/efi
├─nvme0n1p2 259:2 0 2G 0 part /boot
└─nvme0n1p3 259:3 0 1.8T 0 part
├─ubuntu--vg-root 253:0 0 30G 0 lvm /
├─ubuntu--vg-swap 253:1 0 16G 0 lvm [SWAP]
├─ubuntu--vg-var 253:2 0 50G 0 lvm /var
├─ubuntu--vg-home 253:3 0 200G 0 lvm /home
├─ubuntu--vg-opt 253:4 0 50G 0 lvm /opt
├─ubuntu--vg-usr 253:5 0 100G 0 lvm /usr
├─ubuntu--vg-tmp 253:6 0 20G 0 lvm /tmp
└─ubuntu--vg-data 253:7 0 1.332T 0 lvm /data
sda 8:0 0 7.3T 0 disk
└─data--vg-backup 253:8 0 7.3T 0 lvm /backup
loop0 7:0 0 63.9M 1 loop /snap/core20/2264
loop1 7:1 0 63.9M 1 loop /snap/core20/2318
loop2 7:2 0 87M 1 loop /snap/lxd/28373
loop3 7:3 0 87M 1 loop /snap/lxd/29351
loop4 7:4 0 38.7M 1 loop /snap/snapd/21465
loop5 7:5 0 38.8M 1 loop /snap/snapd/21759
解释上述结构:
nvme0n1 是主磁盘,容量为 1.8TB,分为多个分区和逻辑卷。
nvme0n1p1 (1G, /boot/efi): EFI 引导分区,用于存放 UEFI 引导加载器。
nvme0n1p2 (2G, /boot): 引导分区,存放内核和其他引导相关文件。
nvme0n1p3 (1.8T, LVM): 主分区,分配给 LVM,用于创建多个逻辑卷。
逻辑卷 (LVM): 使用 LVM 提供灵活的存储管理,便于动态调整大小。
ubuntu–vg-root (30G, /): 根分区,存放系统的核心文件。30G 足够大,适用于大多数系统。
ubuntu–vg-swap (16G, [SWAP]): 交换分区,用作虚拟内存,通常大小是物理 RAM 的大小。
ubuntu–vg-var (50G, /var): 变量数据分区,存放日志文件、邮件等动态增长的文件。
ubuntu–vg-home (200G, /home): 用户目录分区,存放用户的个人文件和配置。
ubuntu–vg-opt (50G, /opt): 可选软件包分区,存放第三方应用和软件包。
ubuntu–vg-usr (100G, /usr): 系统应用程序和库文件分区,足够容纳大多数软件包。
ubuntu–vg-tmp (20G, /tmp): 临时文件分区,存放临时文件,防止 / 根目录因临时文件占满。
ubuntu–vg-data (1.332T, /data): 数据分区,存放大数据、数据库或其他用户数据。
sda 是第二块磁盘,容量为 7.3TB。
data–vg-backup (7.3T, /backup): 备份分区,存放系统备份、快照等重要数据,确保数据安全。
为什么要这样分区?
灵活性和扩展性:使用 LVM(逻辑卷管理)使得每个分区的大小可以根据需要动态调整,而不需要重启系统或重装操作系统。
安全性和稳定性:分开不同用途的分区,如 /var、/tmp、/home 等,可以减少系统崩溃的风险。例如,日志填满 /var 不会影响 / 根目录。
性能优化:一些目录(如 /var、/tmp)的读写频率较高,分开分区可以优化文件系统的性能,并减少磁盘碎片的影响。
备份和恢复便利:独立分区使得备份和恢复更加高效。例如,备份 /home 和 /data 分区,而不是整个系统分区。
防止磁盘占满:特定目录(如 /tmp 或 /var)容易填满磁盘,独立分区可以防止它们影响系统的其他部分。
实施建议
分区时使用 GPT 分区表:支持大于 2TB 的分区,并且可以定义更多的主分区。
使用 LVM 来管理分区:提供更大的灵活性和扩展性。
根据实际需求调整大小:例如,/home 分区在多用户系统中可能需要更大,或者 /data 在存储大量数据时需要更多空间。
通过这种合理的分区策略,你可以更好地管理 Linux 系统的磁盘空间,提高系统的性能和安全性。
理解分区(Partition)、物理卷(Physical Volume, PV)、逻辑卷(Logical Volume, LV)、和逻辑卷管理(LVM)之间的关系对于有效管理 Linux 系统的存储是非常重要的。下面我将详细解释这些概念,并通过 Mermaid 图示来帮助你更好地理解它们之间的关系。
1. 分区(Partition)
分区是指在物理磁盘上划分的逻辑区域。分区是将磁盘的存储空间划分为独立的部分,使得每个部分都可以独立使用和管理。分区的主要类型有:
- 主分区(Primary Partition):每个磁盘最多可以有四个主分区。
- 扩展分区(Extended Partition):一种特殊类型的主分区,允许在其中创建多个逻辑分区。
- 逻辑分区(Logical Partition):在扩展分区中创建的分区,用于突破四个主分区的限制。
2. 物理卷(Physical Volume, PV)
**物理卷(PV)**是 LVM(逻辑卷管理器)中使用的最基本的存储单位。一个物理卷可以是一个完整的硬盘,也可以是一个分区。物理卷是 LVM 管理的起点。LVM 使用物理卷来创建更高级的存储结构。
3. 卷组(Volume Group, VG)
**卷组(VG)**是由一个或多个物理卷组成的逻辑存储池。卷组可以看作是一个可以用来创建逻辑卷的“存储池”。一个卷组可以跨越多个物理磁盘,从而让逻辑卷的大小和数量更加灵活和可扩展。
4. 逻辑卷(Logical Volume, LV)
**逻辑卷(LV)**是从卷组中分配的存储单元,可以看作是“虚拟分区”。逻辑卷的大小可以动态调整,而无需担心物理磁盘的实际布局。这使得逻辑卷特别适合需要灵活管理磁盘空间的环境。
5. 逻辑卷管理器(LVM)
**逻辑卷管理器(LVM)**是 Linux 下的一种磁盘管理技术。LVM 提供了一种更灵活的管理磁盘空间的方式,支持将多个物理卷组合成一个逻辑卷组,然后在其上创建逻辑卷。这种方式使得调整文件系统大小、增加或减少磁盘空间变得更加容易。
- 物理磁盘(Physical Disk)(大地):
A
和A2
表示两块不同的物理磁盘。 - 分区(Partition)(划片):
B1
,B2
,B3
,B4
代表每个磁盘上的分区。 - 物理卷(PV)(工业用地、农业用地、生活用地):
C1
,C2
,C3
,C4
表示每个分区初始化为 LVM 物理卷。 - 卷组(VG)(市区、县城):
D
表示由多个物理卷组成的一个逻辑存储池。 - 逻辑卷(LV)(落地到各企业所占地皮):
E1
,E2
,E3
,E4
表示从卷组中分配的存储单元,它们分别被挂载到不同的文件系统路径(如/
(root),/home
,/var
,/opt
)。
四、磁盘划分与土地政策异同探讨
前一章节提到了,我们可以做如下的类比:
- 物理磁盘(Physical Disk)—— 大地
- 分区(Partition)—— 划片
- 物理卷(PV)—— 工业用地、农业用地、生活用地
- 卷组(VG)—— 高新开发区
- 逻辑卷(LV)—— 落地到各企业所占地皮
那么为何可以做这种类比呢?这种类比的底层逻辑是什么呢?就像人有出生、生活、死亡,进程有新建、运行、终止,很明显就可以做这样的类比:
- 人出生 —— 进程新建
- 人生活 —— 进程运行
- 人死亡 —— 进程终止
这是因为这两者完全遵守同样的生命周期规律即有始必有终,那么刚刚提到的磁盘划分,空间所遵循的生命周期规律是什么呢?我觉得可以这样想:
- 物理磁盘(待分配) —— 大地(待开发)
- 分区(分区,对应于fdisk命令) —— 土地划片(区域规划,对应于行政命令)
- 物理卷(选择分区类型代码并转换为物理卷,)—— 工业用地、农业用地、生活用地(建设成特定用途的土地)
- 卷组(卷组可添加物理卷)—— 市区、县城(市区可新增工业用地)
- 逻辑卷(逻辑卷是对卷组的再细分)—— 各企业所占地皮(各企业用地是对市区、县城的再细分)
这个规律就是,无用 -> 开辟(利用) -> 分化 -> 合并 -> 使用