linux磁盘管理
1 为什么要分区
易于管理和使用
比如说我们把磁盘分了sda1、sda2、sda3、sda4盘,我们假设sda1盘为系统盘,其他的比如说游戏、办公、软件盘,电脑搜索文件时只需要在相对应的分区搜索就可以了,没必要进行全盘搜索。大大节省了寻找文件的时间
有利于数据的安全
通过分区可以降低数据损失的风险。出现硬盘坏道、错误操作、重装系统都有可能造成数据损失,如果分区了,那么我们就可以将损失最小化。
2 相关概念
磁盘 Disk 计算机的外部存储器设备
分区 Disk Partition 分区是在磁盘上划分出来的一块独立的区域
主分区(Primary Partition):主分区是硬盘的启动分区,它是独立的,在一个物理磁盘(disk)上,最多只能有四个主分区
扩展分区(Extended Partition):扩展分区是除主分区外,硬盘上剩下的空间所建立起来的分区。扩展分区不能直接使用,它需要以逻辑分区的方式来使用,所以说扩展分区可以分成若干逻辑分区。所有的逻辑分区都是扩展分区的一部分
物理卷 PV 这也是一个磁盘分区,它可以更灵活地被划分和组合。可以将多个物理卷组合成一个卷组,然后在卷组上创建一个或多个逻辑卷。逻辑卷的大小可以随时调整,而不受物理卷的位置或大小的限制
卷组 vg是一个或多个物理卷的组合,相当于是一个存储资源池
逻辑卷 Logical Volume 这是卷组中抽象出来的一个磁盘空间
格式化 将分区格式化成不同的文件系统,常用的有ext4, xfs
文件系统 linux系统中"一切皆文件",文件系统决定了如何在磁盘/分区上对文件进行命名、存储、和检索
挂载 我们无法直接访问磁盘中的文件,必须指定一个本地的一个文件目录关联到目标磁盘上的文件系统,通过指定的本地的文件目录才能直接查看磁盘中的文件,这个文件目录成为挂载点,这个行为称为挂载
这张图画的很清楚:
3 查看磁盘信息
df
disk filesystem 磁盘文件系统,用于显示文件系统的磁盘空间使用情况
Filesystem Size Used Avail Use% Mounted on
tmpfs 388M 2.0M 386M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 18G 12G 5.0G 71% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
/dev/sda2 1.8G 381M 1.3G 24% /boot
tmpfs 388M 120K 388M 1% /run/user/1000
/dev/sr0 2.0G 2.0G 0 100% /media/xhs/Ubuntu-Server 22.04.3 LTS amd64
/run:这是一个tmpfs文件系统,tmpfs是基于内存的文件系统,可以使用内存或swap分区来存储文件,读写速度非常快。
/:这是主文件系统,它是一个逻辑卷(/dev/mapper/ubuntu–vg-ubuntu–lv)
/dev/shm:这是一个共享内存tmpfs,使用RAM作为存储介质,读写速度非常快
/run/lock:这是一个tmpfs文件系统,用于存储锁文件
/boot:俗称启动盘(/dev/sda2),包含了启动linux系统所需的一些重要文件
/run/user/1000:这是一个tmpfs文件系统,用于存储用户级别的session数据
/media/xhs/Ubuntu-Server 22.04.3 LTS amd64:这是光盘驱动器(/dev/sr0),一个Ubuntu Server 22.04.3 LTS的安装光盘。
随机访问存储(Random Access Memory,简称RAM)是计算机中的一种主要存储设备。它可以快速读取和写入数据,并且能够随机访问任意位置的存储单元,因此被称为"随机访问存储"。RAM一般用于存储正在运行的程序、数据和操作系统等信息,RAM具有快速读取和写入数据的能力,可以使计算机更快地执行操作。RAM可以被认为是一种短期存储,因为当计算机关闭时,RAM中的所有数据都会被清除。
du
Disk Usage 磁盘使用情况,用于检查文件和目录的磁盘使用信息,显示的是文件和目录占用信息,而不是它们实际使用的空间,例如,如果文件系统的块大小是4KB,那么即使创建一个只有1字节的文件,文件系统也会为这个文件预留4KB的空间。du命令显示的文件大小可能会大于文件实际的大小。
du 会显示出所有挂载的文件系统的空间使用情况
-s 只显示总计,-h 以人类可读的格式显示
du -sh ./cloud-deploy
300K cloud-deploy
du -h ./cloud-deploy
8.0K ./cloud-deploy/.git/info
8.0K ./cloud-deploy/.git/refs/remotes/origin
12K ./cloud-deploy/.git/refs/remotes
4.0K ./cloud-deploy/.git/refs/tags
...
lsblk
用于列出所有块设备信息
设备名称 主设备号:次设备号 可移动设备 只读 类型 挂载点
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 4K 1 loop /snap/bare/5
loop2 7:2 0 74.1M 1 loop /snap/core22/1033
loop3 7:3 0 63.5M 1 loop /snap/core20/2015
...
loop10 7:10 0 40.4M 1 loop /snap/snapd/20671
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1.8G 0 part /boot
└─sda3 8:3 0 18.2G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 18.2G 0 lvm /
sdb 8:16 0 20G 0 disk
sr0 11:0 1 2G 0 rom /media/xhs/Ubuntu-Server 22.04.3 LTS amd64
主设备号:主设备号用于标识设备的类型。例如,所有的SCSI硬盘设备都有相同的主设备号。
次设备号:次设备号用于标识同一类型的设备中的特定设备。例如,第一个SCSI硬盘的次设备号是0,第二个SCSI硬盘的次设备号是1,以此类推。
fdisk
可以是Fixed Disk也可以是Format Disk,用来查看、创建、删除、检查磁盘分区
-l 列出所有分区表
~# fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VMware Virtual S # 磁盘的型号。在这种情况下,它是一个VMware虚拟磁盘。
Units: sectors of 1 * 512 = 512 bytes # 每个扇区是512字节
Sector size (logical/physical): 512 bytes / 512 bytes # 逻辑扇区和物理扇区的大小
I/O size (minimum/optimal): 512 bytes / 512 bytes # 最小和最优的I/O大小
Disklabel type: gpt # 磁盘标签的类型。GPT(GUID Partition Table)。
Disk identifier: D1840A28-5A7D-4F13-8495-D55FDDF187F7 # 磁盘的唯一标识符
设备 开始扇区 结束扇区 扇区总数
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 3719167 3715072 1.8G Linux filesystem
/dev/sda3 3719168 41940991 38221824 18.2G Linux filesystem
...
pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 ubuntu-vg lvm2 a-- 18.22g 0
/dev/sdb1 vg156 lvm2 a-- 1020.00m 0
/dev/sdb3 vg0 lvm2 a-- <3.00g <2.00g
/dev/sdb5 vg156 lvm2 a-- 1020.00m 1012.00m
/dev/sdb6 vg156 lvm2 a-- <2.00g 0
pvdisplay 查看更详细的信息
Physical volume
PV Name /dev/sdb3
VG Name vg0
PV Size 3.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 767
Free PE 511
Allocated PE 256
PV UUID K9XGZP-Wj8m-okSb-Bd7l-aiRS-iOMr-Mswu56
vgs
VG #PV #LV #SN Attr VSize VFree
ubuntu-vg 1 1 0 wz--n- 18.22g 0
vg0 1 1 0 wz--n- <3.00g <2.00g
vg156 3 1 0 wz--n- <3.99g 1012.00m
PV 物理卷数量
LV 逻辑卷数量
SN 快照数量
Attr 卷组属性,表示此卷组可读写(w),大小可调整(z),没有 RAID(-),没有部分模式(-),没有集群(n),没有内部策略(-)
vgdisplay 查看更详细的信息
lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
ubuntu-lv ubuntu-vg -wi-ao 18.22g
lv0 vg0 -wi-a- 1.00g
lv156 vg156 -wi-a- 3.00g
lvdisplay 查看更详细的信息
4 添加
添加partition
~# fdisk /dev/sdb
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.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x868fc991.
Command (m for help): m # 查看帮助
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table
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): 默认分区号是1
First sector (2048-41943039, default 2048): # 默认开始扇区是2048
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039): +1G # 选择结束扇区,这里使用+1G表示创建1G空间,默认选项会将所有空间用于创建分区
Created a new partition 1 of type 'Linux' and of size 1 GiB.
Command (m for help): p # 查看分区信息,
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 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: dos
Disk identifier: 0x868fc991
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 2099199 2097152 1G 83 Linux
Command (m for help): wq # w保存,q退出
再创建三个主分区,大小分别为2、3、4G
Command (m for help): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 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: dos
Disk identifier: 0x868fc991
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 2099199 2097152 1G 83 Linux
/dev/sdb2 2099200 6293503 4194304 2G 83 Linux
/dev/sdb3 6293504 12584959 6291456 3G 83 Linux
/dev/sdb4 12584960 20973567 8388608 4G 83 Linux
此时再想创建,就会提示不能创建
Command (m for help): n
To create more partitions, first replace a primary with an extended partition.
必须将主分区替换为扩展分区,扩展分区可以包含多个逻辑分区,将刚刚创建的4号分区删除
Command (m for help): d
Partition number (1-4, default 4):
Partition 4 has been deleted.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): e # 选择e即可,接下来流程都一样
之后创建的分区都称为逻辑分区
Command (m for help): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 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: dos
Disk identifier: 0x868fc991
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 2099199 2097152 1G 83 Linux
/dev/sdb2 2099200 6293503 4194304 2G 83 Linux
/dev/sdb3 6293504 12584959 6291456 3G 83 Linux
/dev/sdb4 12584960 20973567 8388608 4G 5 Extended
/dev/sdb5 12587008 14684159 2097152 1G 83 Linux
/dev/sdb6 14686208 18880511 4194304 2G 83 Linux
lsblk 发现sdb4只有1k
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 1G 0 part
├─sdb2 8:18 0 2G 0 part
├─sdb3 8:19 0 3G 0 part
├─sdb4 8:20 0 1K 0 part
├─sdb5 8:21 0 1G 0 part
└─sdb6 8:22 0 2G 0 part
扩展分区本身并不包含任何数据,它只是一个容器,用于包含逻辑分区(如/dev/sdb5和/dev/sdb6)。因此,扩展分区的大小显示为1K,这只是一个占位符,表示这是一个扩展分区,而不是实际的数据分区。实际的数据存储在逻辑分区中,可以看到/dev/sdb5和/dev/sdb6各有1G和2G的存储空间。
只能拥有一个扩展分区,所有逻辑分区都被挂在扩展分区下面,逻辑分区的大小总和不能超过扩展分区(上文中是4G)
创建物理卷
pvcreate /dev/sdb3
创建卷组
vgcreate vg0 /dev/sdb3
创建lvm
lvcreate -n lv0 -L 1G vg0
# -n 指定名称 -L 指定大小
lsblk 查看
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 1G 0 part
├─sdb2 8:18 0 2G 0 part
├─sdb3 8:19 0 3G 0 part
│ └─vg0-lv0 253:1 0 1G 0 lvm
挂载文件系统
# 指定一个用于挂载的目录
mkdir -p /mnt/lv0
# 将逻辑卷初始化为ext4
mkfs.ext4 /dev/vg0/lv0
# 挂载
mount /dev/vg0/lv0 /mnt/lv0/
# part也能进行挂载,同样需要先初始化,然后挂载到一个目录即可
mount /dev/sdb1 /mnt/lv1/
lsblk
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 1G 0 part /mnt/lv1
├─sdb2 8:18 0 2G 0 part
├─sdb3 8:19 0 3G 0 part
│ └─vg0-lv0 253:1 0 1G 0 lvm /mnt/lv0
...
在/mnt/lv1和/mnt/lv0目录中写一些文件,使用df查看:
/dev/mapper/vg0-lv0 974M 257M 650M 29% /mnt/lv0
/dev/sdb1 974M 514M 393M 57% /mnt/lv1
mount是临时挂载,实现永久挂载:
cat >> /etc/fstab << EOF
/dev/vg0/lv0 /mnt/lv0/ ext4 defaults 0 0
EOF
# 参数解释,从左往右分别为:
# 要挂载的设备 挂载点 文件系统类型 挂载选项(选默认选项)
# 第一个0 是dump备份的参数。0表示不备份,1表示需要备份。
# 第二个0 是文件系统检查的顺序。0表示不检查,1表示首先检查(通常用于根文件系统),2表示接下来检查(用于非根文件系统)默认设置为0就好了
5 删除
必须按照和创建相反的顺序删除分区。直接使用fdisk删除sdb3会发生这种事情:
fdisk -l
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 2099199 2097152 1G 83 Linux
/dev/sdb2 2099200 6293503 4194304 2G 83 Linux
/dev/sdb4 12584960 20973567 8388608 4G 5 Extended
/dev/sdb5 12587008 14684159 2097152 1G 83 Linux
/dev/sdb6 14686208 18880511 4194304 2G 83 Linux
lsblk
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 1G 0 part /mnt/lv1
├─sdb2 8:18 0 2G 0 part
├─sdb3 8:19 0 3G 0 part
│ └─vg0-lv0 253:1 0 1G 0 lvm /mnt/lv0
├─sdb4 8:20 0 512B 0 part
├─sdb5 8:21 0 1G 0 part
...
可以看到两个命令的结果不一致,事实上除了fdisk外,其它的命令都显示sdb3仍然还在,所以sdb3根本没有被删除,这种不一致不好好处理会产生更大的麻烦,最好按以下顺序删除:
卸载文件系统
# umount <挂载点>
umount /mnt/lv0/
如果提示挂载点被占用,可以使用 lsof /mnt/lv0/ 查看有什么进程在使用,并可以选择kill它们
强制卸载命令:umount -l /mnt/lv0
删除逻辑卷
lvremove /dev/vg0/lv0
删除卷组
vgremove /dev/vg0
删除物理卷
pvremove /dev/sdb3
删除分区
fdisk /dev/sdb
Command (m for help): d
Partition number (1-6, default 6): 3
Partition 3 has been deleted.
如果还是提示不能删除,那么使用 partprobe 更新分区表
6 扩容
fdisk扩容必须确保当前分区后面没有其它分区。
先使用d删除分区,然后用n创建更大的分区,而且新分区的起始位置必须和原分区的起始位置相同,否则会丢失数据。这一步就不演示了。
扩大分区后, 还需要扩大文件系统的空间
fdisk /dev/sdb`
# d 删除3, 4, 5 6号分区
# n 创建更大的3号分区
# 扩大文件系统的空间
resize2fs /dev/sdb3
扩容不能跨区这点很麻烦,假如4,5,6号分区有数据不能删除,那3号分区就无法扩容,gparted可以调整其它分区的大小,但是gparted是图形化工具,使用的情况有限。
卷组可以解决这个情况
lsblk
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 1G 0 part
...
├─sdb5 8:21 0 1G 0 part
└─sdb6 8:22 0 2G 0 part
# 创建物理卷
pvcreate /dev/sdb1
pvcreate /dev/sdb5
pvcreate /dev/sdb6
# 创建卷组
vgcreate vg156 /dev/sdb1 /dev/sdb5 /dev/sdb6
# 已有的卷组可以添加物理卷
vgextend vg156 /dev/sdb2
# 创建lvm
lvcreate -n lv156 -L 1G vg156
lsblk
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 1G 0 part
...
├─sdb5 8:21 0 1G 0 part
└─sdb6 8:22 0 2G 0 part
└─vg156-lv156 253:2 0 1G 0 lvm
# 可以随时给lvm扩容
lvextend -L 3G /dev/vg156/lv156
lsblk
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 1G 0 part
│ └─vg156-lv156 253:2 0 3G 0 lvm
...
├─sdb5 8:21 0 1G 0 part
│ └─vg156-lv156 253:2 0 3G 0 lvm
└─sdb6 8:22 0 2G 0 part
└─vg156-lv156 253:2 0 3G 0 lvm