Linux磁盘管理

一、Linux系统中查看磁盘及挂载情况的命令

1.1 df命令

df -h 可以显示磁盘挂载情况,并以可读的方式展示各分区的使用情况、剩余空间等信息。

1.2 mount命令

mount 可以显示已挂载的文件系统及其挂载点。

1.3 cat命令

cat /proc/mounts 可以查看已挂载的文件系统信息,包括文件系统类型、挂载设备、挂载点等。

1.4 lsblk命令

lsblk 可以显示系统的块设备信息,包括磁盘、分区、挂载点等。

1.5 blkid命令

blkid 可以显示块设备的UUID等信息,包括已挂载的和未挂载的设备。

1.6 fdisk命令

fdisk -l 可以列出系统中的磁盘和分区信息。

1.7 parted命令

parted -l 可以显示磁盘的分区信息,同时还可以进行更多的磁盘操作,如创建分区、调整分区大小等。

以上命令中,df和mount是最常用的两个命令,可以较为直观地查看磁盘挂载情况。而cat、lsblk、blkid和fdisk命令则提供了更详细的信息,适合用于特定的需要。可以根据实际需求选择合适的命令来查看磁盘挂载情况。

二、调整 Linux 系统 swap/home/root等分区 大小

2.1 Linux 系统 swap/home/root等分区简介

在安装 Linux 操作系统(CentOS、Ubuntu、Debian 等)时,如果采用分区向导提供的各类标准分区方案对系统盘进行分区,基本上给 home 的分区分配的磁盘空间都很大(占比能达到 80% 左右),其它分区(/ 跟分区、/var 分区、swap分区等)却很小。可在实际生产应用中,home 分区并不需要那么大,大部分数据是放在 / 目录下,因此安装好系统后就需要调整这些分区大小,不然在生产环境当中,容易导致硬盘分区写满溢出,没有写入权限。

Tips: 安装 Linux 系统时建议对系统盘分区采用 “使用整个磁盘并配置LVM” 向导 进行分区,并且 将 /home、/var 和 /tmp 分别放在单独分区。在对磁盘进行分区时,推荐设置分区向导使用部分(40% - 50%)系统盘卷组,这样安装好 Linux 系统后,就可以使用逻辑卷管理(LVM)增加逻辑卷(分区)容量,所以安装时使用一部分系统盘空间 可以提高系统灵活性。

如下图为安装 debian 12.6 时,“使用整个磁盘并配置LVM” 向导 进行分区,并将 /home、/var 和 /tmp 分别放在单独分区,然后 设置分区向导使用 50% 的系统盘卷组(保留50% 的系统盘空间带安装好后做动态分配)。

安装好系统后, 上踹 df -h 命令可以查看各分区的信息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
root@debian-5:~# df -h
Filesystem                   Size  Used Avail Use% Mounted on
udev                          63G     0   63G   0% /dev
tmpfs                         13G  2.1M   13G   1% /run
/dev/mapper/debian--vg-root  122G  7.6G  109G   7% /
tmpfs                        120G     0  120G   0% /dev/shm
tmpfs                        5.0M   12K  5.0M   1% /run/lock
/dev/nvme0n1p2               456M  150M  282M  35% /boot
/dev/mapper/debian--vg-tmp   101G   48K   97G   1% /tmp
/dev/mapper/debian--vg-var   108G  364M  103G   1% /var
/dev/mapper/debian--vg-home  331G   36M  314G   1% /home
/dev/nvme0n1p1               511M  5.9M  506M   2% /boot/efi
/dev/md127                    22T   24K   21T   1% /data
tmpfs                         13G   44K   13G   1% /run/user/1000

2.2 vgdisplay 命令查看LVM的信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
root@debian-5:~# vgdisplay
  --- Volume group ---
  VG Name               debian-vg
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  9
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                5
  Open LV               5
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               930.53 GiB
  PE Size               4.00 MiB
  Total PE              238216
  Alloc PE / Size       172084 / 672.20 GiB
  Free  PE / Size       66132 / <258.33 GiB
  VG UUID               hLHdz3-ntzI-vlHI-SoSO-yE4e-ydnJ-clvsBw

这里可以看到,系统盘总共有 930.53G(VG Size),已经分配(Alloc PE / Size) 672.2G,未分配(Free PE / Size) 258.33G。

未分配(Free PE / Size)的 258.33G 空闲空间就可以使用 LVM 进行手动分配给各分区或创建新分区。

2.3 减少 home 分区大小

Step 1:设置(减少)/home 分区大小

1
2
3
umount /home
resize2fs -p /dev/mapper/debian--vg-home 100G
mount /home

正常情况下,只需要三条命令就可以把 home 分区大小 100G 了。

如果是新系统,执行 umount /home 这条命令是没问题,如果是非全新系统,可能就会出现其他程序在占用 home,那么就得先执行 fuser -m /home 释放一下占用。

一般情况下,执行 resize2fs -p /dev/mapper/debian--vg-home 100G 这条命令都会提示 运行e2fsck -f /dev/mapper/debian--vg-home命令,这时按提示先执行提命令(e2fsck命令)再重新执行 resize2fs 命令。

重新 mount /home 后,使用 df -h 命令就可以看到 /home 分区被设置成了 100G 大小了。

Step 2:缩小(减少)home 逻辑卷组大小

第一步 中的命令减少的是 系统 home 分区的大小,并不是 home 分区所在的逻辑卷组(LV)的大小,使用下面的 lvreduce 将缩小 home 分区所在的逻辑卷组(LV)的大小(多余的空间将释放到 Free PE / Size 池中)。

1
lvreduce -L 100G /dev/mapper/debian--vg-home

使用 lvreduce 指令用于减少LVM逻辑卷占用的空间大小。可能会删除逻辑卷上已有的数据,所以在操作前必须进行确认。建议在新系统下进行调整,如果项目在投入使用阶段了,需要做好数据备份。

2.4 对交换分区 swap 空间进行扩大

swap 交换分区就是内存的交换,一般建议设置成硬件内存的2倍。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
free -m     # 查看 Swap 分区大小

swapoff /dev/mapper/debian--vg-swap_1   # 关闭 swap

# 扩展 /dev/mapper/mapper/debian--vg-swap_1,增加48G
lvextend -L +48G /dev/mapper/debian--vg-swap_1

# 将 /dev/mapper/mapper/debian--vg-swap_1 设置为swap分区
mkswap /dev/mapper/debian--vg-swap_1

swapon /dev/mapper/debian--vg-swap_1    # 打开 swap

2.5 对 / 分区空间进行扩大

1
2
3
4
5
6
7
8
9
vgdisplay   # 查看空闲空间大小(Free PE / Size)

# 将 root 逻辑分区卷组 扩大(添加)300G 空间(New Size = Source Size + Add Size) 
lvextend -L +300G /dev/mapper/debian--vg-root

# 将系统 root 分区设置为 逻辑分区卷组 大小
resize2fs -p /dev/mapper/debian--vg-root

df -h   # 查看修改后的分区情况

2.6 设置 tmpfs 大小

编辑 /etc/fstab 文件,在其中添加 tmpfs 配置项后

1
2
3
echo "tmpfs /dev/shm tmpfs defaults,size=120G 0 0" >> /etc/fstab

systemctl daemon-reload # 使 修改生效

三、RAID磁盘阵列的原理与搭建

3.1 RAID磁盘阵列的原理简介

磁盘阵列(Redundant Arrays of Independent Disks,RAID) 是由 “多个独立磁盘构成的具有冗余能力的阵列”之意(其中一块盘坏了,数据不丢失)。 磁盘阵列是由很多价格较便宜的磁盘,以硬件(RAID卡)或软件(MDADM)形式组合成一个容量巨大的磁盘组,利用多个磁盘组合在一起,提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。 磁盘阵列还能利用同位检查(Parity Check)的观念,在阵列中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中(也就是坏了一块盘,拔掉,插入新盘,数据还能恢复到新盘,利用奇偶校验)

Tips: RAID可以预防数据丢失,但是它并不能完全保证数据不会丢失,所以大家使用RAID的同时还是注意备份重要的数据。

RAID的创建有两种方式:

  • 软RAID:通过操作系统软件(mdadm)来实现;
  • 硬RAID:使用硬件阵列卡;

RAID几种常见的类型:

RAID类型 RAID0 RAID1 RAID10 RAID5 RAID6
别名 条带 镜像 分布式奇偶校验条带 双重奇偶校验条带 镜像加条带
最少磁盘数 2 2 4 3 4
最大容错磁盘数 无 n-1 n/2 1 2
数据安全性 完全没有 最佳 最佳 好 比 RAID5 好
理论写入性能 n 1 n/2 <n-1 <n-2
理论读出性能 n n n <n-1 <n-2
可用容量 100% 50% 50% (n-1)/n (n-2)/n
一般应用 强调性能但数据不重要的环境 数据与备份 服务器、云系统常用 数据与备份 数据与备份

在企业中用的最多的是:raid1、raid5和raid10。不过随着云的高速发展,阿里云,腾讯云等供应商一般可以把硬件问题解决掉。(你在用云的时候,会关注供应商底层是用什么raid类型吗)

3.2 使用4块SSD盘做 软Raid5

创建 软Raid5

 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 查看磁盘信息
lsblk -l 
fdisk -l 

# 安装 mdadm
apt install -y mdadm

# 创建 软 raid5 盘
mdadm -Cv /dev/md0 -n4 -l5 /dev/sd[a-d]     # 创建配置raid5

mdadm /dev/md0 -a /dev/sdf                  # 创建热备盘(可选)

# 等效于上述两条命令
mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sd{a,b,c,d} 
mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sd[a-d] 
# 参数解释
# -C  创建的意思
# /dev/md0  创建的raid5 磁盘名字
# -C 下的 -a yes|no 是否自动创建目标RAID设备的设备文件
# -l Raid的等级
# -n 使用多少块硬盘来创建当前Raid
# -x 空闲盘,也就是热备盘,当正常的盘出问题,这块盘就能从 share状态 转换到 spare rebuilding状态
# /dev/sd{a,b,c,d} 硬盘块名字,也可以写长名字 或 /dev/sd[a-d]

# 扩展命令
mdadm -D /dev/md0                           # (查看创建的raid)
mdadm /dev/md0 -f /dev/sdb                  # (停用磁盘)
mdadm /dev/md0 -r /dev/sdb                  # (移除磁盘)

# 格式化磁盘,格式方式为ext4
mkfs.ext4 /dev/md0

# 挂载磁盘
mkdir /data
mount /dev/md0 /data

df -h # 查看磁盘挂载情况

# 查看磁盘的 UUID 等信息
blkid /dev/md0

# 在 /etc/fstab 中添加开机自动挂载磁盘
echo "UUID=$(blkid /dev/md0 | awk -F'"' '{print $2}') /data ext4 defaults,nofail 0 0" >> /etc/fstab

删除raid5

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mdadm --stop /dev/md0           # 停止RAID阵列,并确保数据已经同步到磁盘:

rm /etc/mdadm/mdadm.conf        # 删除RAID配置文件,以确保系统不会在启动时自动重建RAID:

# 从/proc/mdstat和/etc/mdadm/mdadm.conf中删除任何关于RAID的记录。

mdadm --misc --zero-superblock /dev/sdX1    从/dev/中删除RAID设备
# 其中/dev/sdX1是RAID的一个成员,例如/dev/sdb1。

# 请注意,执行这些操作会导致RAID阵列中的所有数据丢失,所以在执行之前请确保你已经备份了所有重要数据。如果你不确定,请咨询专业的数据恢复专家

3.3 RAID5 掉盘故障处理全流程

  • 阶段一:故障排查与定位(找出真凶) 目标:确认阵列状态,找出哪块盘坏了,并获取其物理序列号。
  1. 检查 RAID 阵列状态
1
2
cat /proc/mdstat            # 显示阵列缺失(如 [3/4] [UUU_]);
mdadm --detail /dev/md0     # 显示 State : inactive 或 degraded,且 Total Devices 数量减少,故障盘可能未列出或显示为 removed。
  1. 检查底层磁盘健康状况 查看所有硬盘的基本信息,提取序列号以防盘符漂移。
1
lsblk -d -o NAME,MODEL,SERIAL,SIZE

预期输出:列出 sda、sdb、sdc、sdd 的型号和序列号 (SERIAL)。记下疑似坏盘的序列号。

针对疑似坏盘(假设为 /dev/sdd)提取 SMART 数据:

1
2
3
4
5
6
sudo smartctl -a /dev/sdd

# 预期输出关键指标:
# ID 5 Reallocated_Sector_Ct(重映射扇区):值大于 0。
# ID 187 Reported_Uncorrect(不可纠正错误):值大于 0(关键致命项)。
# ID 197 Current_Pending_Sector(待映射扇区):值大于 0。

结论:若 5 和 187 均大于 0,且伴随 dmesg 中的 I/O error 或 UNC,确认为物理坏道,不可强行修盘,必须更换。

  • 阶段二:降级抢救与数据备份(最高优先级) 目标:排除坏盘,用剩余好盘强制拉起 RAID5,修复文件系统并备份数据。
  1. 停掉占用 I/O 的服务(如 Docker) 避免在拉起阵列和修复文件系统时发生二次崩溃或数据不一致。
1
2
3
4
5
6
7
sudo systemctl stop docker.service
sudo systemctl disabel docker.service

sudo systemctl stop docker.socket
sudo systemctl disabel docker.socket

# 或 docker stop $(docker ps -q)
  1. 强制拉起降级阵列 假设确认好的三块盘是 /dev/sda、/dev/sdb、/dev/sdc(绝对不要包含坏盘)。
1
2
3
4
sudo mdadm --stop /dev/md0
sudo mdadm --assemble --force --run /dev/md0 /dev/sda /dev/sdb /dev/sdc

cat /proc/mdstat  # 显示 active raid5 ... [3/3] [UUU](处于 degraded 降级状态)。
  1. 检查并修复文件系统 确认文件系统类型,强制修复因掉盘导致的元数据错误。
1
2
# 查看文件系统类型
lsblk -f /dev/md0

如果是 ext4 格式:

1
2
sudo e2fsck -f /dev/md0
# 交互提示处理:遇到 Optimize<y>? 或 Fix<y>?,全部输入 y。直到提示 FILE SYSTEM WAS MODIFIED 并退出。

复盘检查:再次运行 sudo e2fsck /dev/md0(不加 -f),若秒出结果并显示 clean,说明修复完成。

  1. 挂载并备份
1
2
sudo mkdir -p /mnt/recovery
sudo mount /dev/md0 /mnt/recovery

操作:立即使用 rsync -av 或 cp 将数据拷贝至外置存储或 NAS。备份完成前,严禁向 /mnt/recovery 写入新数据。

  • 阶段三:物理更换硬盘 目标:将坏盘从系统中剥离,插入新盘。
  1. 逻辑剔除坏盘 (如果是强制拉起的,坏盘可能不在阵列里,但为了保险起见执行一次)
1
2
sudo mdadm /dev/md0 --fail /dev/sdd
sudo mdadm /dev/md0 --remove /dev/sdd
  1. 物理更换
1
sudo shutdown -h now

操作:断电后,根据阶段一记录的序列号(SERIAL),在机箱中拔出坏盘,插入新盘(容量必须 ≥ 原盘)。通电开机。

  1. 识别与准备新盘
1
lsblk -d -o NAME,MODEL,SERIAL,SIZE

预期输出:找到新盘(假设系统分配为 /dev/sde)。

对新盘进行分区,设为 Linux RAID 类型(可选,如果是使用一整块盘,可以不分区):

1
sudo fdisk /dev/sdd

依次输入:n -> p -> 1 -> 回车 -> 回车 -> t -> fd -> w

1
sudo partprobe /dev/sdd

清除新盘上可能残留的旧 RAID 信息(非常重要):

1
sudo mdadm --zero-superblock /dev/sdd
  • 阶段四:加入阵列与数据重建 目标:将新盘加入阵列,触发重建,恢复 RAID5 冗余。
  1. 加入新盘
1
sudo mdadm /dev/md0 --add /dev/sdd
  1. 监控重建进度 重建过程极耗 I/O(8TB 盘约需 10-24 小时),期间绝对不能重启。
1
2
3
4
5
6
7
mdadm --detail /dev/md0

watch -n 5 cat /proc/mdstat

# md0 : active raid5 sdd[4] sdc[2] sda[0] sdb[1]
#       23441683464 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
#       [====>................]  recovery = 20.5% (4804012104/23441683464) finish=1500.2min speed=200000K/sec

预期输出:显示 recovery = X.X% 进度。重建完成后显示 [4/4] [UUUU] 且无 recovery 字样。

(可选) 限制重建速度,防止影响其他业务:

1
2
# 限制为 100MB/s (单位 KB)
echo 100000 > /proc/sys/dev/raid/speed_limit_max

& 阶段五:收尾与固化配置(防止重启阵列再次消失) 目标:修复 Debian 系统配置,确保下次重启阵列自动组装。

  1. 更新 mdadm 配置文件 Debian 的配置文件位于 /etc/mdadm/mdadm.conf。
1
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

注意:如果原有文件里已有 ARRAY /dev/md0 … 的行,请先手动编辑 /etc/mdadm/mdadm.conf 删掉旧行,避免重复。

  1. 更新 initramfs(核心步骤) 必须将阵列信息打包进启动镜像,否则重启时系统看不到阵列。
1
sudo update-initramfs -u
  1. 验证与重启 重新挂载你的 RAID 阵列,启动 Docker:
1
2
sudo mount /dev/md0 /你的正常挂载点
sudo systemctl start docker

终极测试:在业务允许的时间窗口内,执行一次 sudo reboot,确认重启后 cat /proc/mdstat 能自动显示 [4/4] [UUUU] 且网络、业务正常。

Tips:

  1. 不要对故障盘使用 –create:这会直接抹除 RAID 元数据,导致数据永久丢失。
  2. 修改 /etc/fstab 防止开机卡死:如果你配置了自动挂载,建议加上 nofail 参数(如 defaults,nofail 0 0),这样即使阵列坏了,系统也能正常启动获取 IP,不会掉入紧急模式。

3.4 补充说明

在 Linux 中创建软 RAID,有两种非常主流的做法,关键在于你最初创建 RAID5 时是怎么做的,新加入的盘就必须和原来的保持一致。

回看你之前的截图(/proc/mdstat 显示成员是 sda、sdb、sdc),没有数字后缀。这说明你最初就是用整块裸盘(Whole Disk)直接创建的 RAID,而不是用分区。因此,新盘也必须直接用裸盘加入。

两种做法的区别:

  1. 整盘直接做 RAID(你当前的情况)

特征:成员名为 /dev/sda、/dev/sdb,没有 1、2 等后缀。

优点:少了一层分区表的抽象,结构最简单,直接拿整盘组建。

操作:新盘直接 mdadm --add /dev/sdd。

  1. 分区后做 RAID(很多人习惯的做法)

特征:成员名为 /dev/sda1、/dev/sdb1(带有数字后缀)。

优点:如果你以后想在同一块盘上划出不同区域做不同的 RAID,或者留一点空间做其他用途,就可以这么做。

操作:先用 fdisk /dev/sdd 给新盘分一个区(类型设为 fd),然后加入命令必须是 mdadm --add /dev/sdd1。

为什么新盘不能“临时”分区?

如果你原来的三块盘是整盘(sda),你强行把新盘分区(sdd1)加进去,mdadm 会直接报错,因为它认为阵列的底层结构不一致(一个是整盘,一个是分区)。强行混合加入会导致阵列重建失败,直接损坏数据。

所以,针对你的新 8T 盘,正确命令依然是:

1
2
3
4
5
# 1. 清除新盘可能残留的旧 RAID 信息(整盘操作,不带数字)
sudo mdadm --zero-superblock /dev/sdd

# 2. 直接拿整盘加入阵列
sudo mdadm /dev/md0 --add /dev/sdd

唯一需要注意的例外: 你可以用 lsblk /dev/sdd 或者 fdisk -l /dev/sdd 看一眼新盘。如果这是出厂全新的盘,里面干干净净没分区,那就闭眼直接 mdadm /dev/md0 --add /dev/sdd。

但如果你买的是二手的或者之前用过且带分区表的盘,只要那个分区没被挂载,直接用 mdadm --zero-superblock /dev/sdd 把整盘头部的旧信息抹掉,然后一样可以直接把整盘(/dev/sdd)加进去,完全不用管它里面有没有分区表,mdadm 会接管整块裸盘。