磁盘
磁盘相关系统配置与应用教程
📘 磁盘信息查看
smartctl
terminal
apt install smartmontools
smartctl -a /dev/xxx
lsblk
terminal
lsblk -o NAME,HCTL,TRAN,SIZE,MODEL,SERIAL
udevadm
terminal
udevadm info --query=all --name=/dev/sda | grep ID_
NVMe 磁盘
terminal
apt install nvme-cli
nvme list
lshw
terminal
sudo apt install lshw -y
sudo lshw -class disk -class storage
📘 格式化硬盘
环境信息
查看当前磁盘:
terminal
fdisk -l
示例输出:
terminal
Disk /dev/vda: 160 GiB
/dev/vda1 160G Linux filesystem
Disk /dev/vdb: 3.63 TiB
我们来格式化 /dev/vdb 并挂在到 /root 目录
创建分区
/dev/vdb 还没有分区,需要先创建。
执行:
terminal
fdisk /dev/vdb
输入:
terminal
# 创建 GPT 分区表
Command (m for help): g
Created a new GPT disklabel (GUID: C60C8BFE-FF2F-45B7-8E85-84351C34A09C).
# 创建新分区
Command (m for help): n
## 默认分区号
Partition number (1-128, default 1):
## 默认起始
First sector (2048-7801405406, default 2048):
## 使用全部空间
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-7801405406, default 7801403391):
Created a new partition 1 of type 'Linux filesystem' and of size 3.6 TiB.
# 写入
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
完成后查看:
terminal
fdisk -l
应该看到:
terminal
/dev/vdb1
格式化文件系统
terminal
root@g3sstd8:~# mkfs.ext4 /dev/vdb1
mke2fs 1.47.2 (1-Jan-2025)
Discarding device blocks: done
Creating filesystem with 975175168 4k blocks and 243793920 inodes
Filesystem UUID: 640f14b7-e345-42b6-921b-906902897108
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000, 550731776, 644972544
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
备份 /root 目录(可选)
我需要挂载到 /root 目录,因为原来有文件,挂载 /root 会覆盖原目录,所以先备份。
备份:
terminal
mkdir /root_backup
cp -a /root/. /root_backup/
或者:
terminal
rsync -av /root/ /root_backup/
临时挂载测试
先测试挂载:
terminal
mount /dev/vdb1 /root
查看:
terminal
df -h
应该看到:
terminal
/dev/vdb1 3.6T /root
恢复 /root 数据(可选)
terminal
rsync -av /root_backup/ /root/
设置开机自动挂载
获取 UUID:
terminal
root@g3sstd8:~# blkid /dev/vdb1
/dev/vdb1: UUID="640f14b7-e345-42b6-921b-906902897108" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="27d01d8a-563d-4e3e-9914-ffb3ff13b7f8"
编辑 /etc/fstab
加入:
terminal
UUID=640f14b7-e345-42b6-921b-906902897108 /root ext4 defaults 0 2
测试 fstab
terminal
mount -a
如果没有报错说明配置正确。
再次确认:
terminal
df -h
重启验证
terminal
reboot
重启后查看:
terminal
df -h
应该看到:
terminal
/dev/vdb1 → /root
说明挂载成功。
释放空间(可选)
如果磁盘主要用于存储文件,可以关闭 ext4 预留空间:
terminal
tune2fs -m 0 /dev/vdb1
默认 ext4 会预留 5% 空间。
例如:
3.6TB × 5% ≈ 180GB
关闭后可以释放空间。
📘 LVM(Logical Volume Manager)
基本概念
- 物理磁盘 (Physical Volume, PV):/dev/xxx 通常会被初始化为 LVM 的物理卷。
- 卷组 (Volume Group, VG):多个 PV 可以组合成一个卷组(比如 vg0),它就像一个大的“存储池”。
- 逻辑卷 (Logical Volume, LV):在卷组里面,你可以切分出多个逻辑卷,比如:/dev/mapper/vg0-root → 根目录的逻辑卷,大小 3.63 TiB,/dev/mapper/vg0-swap → swap 交换分区的逻辑卷,大小 4 GiB。它们的路径一般出现在 /dev/mapper/ 下,也会有 /dev/vg0/root、/dev/vg0/swap 这样的别名。
terminal
/dev/nvme0n1p3 (LVM PV)
↓
vg0 (卷组)
├── lv_root (/dev/mapper/vg0-root, ~3.63T)
└── lv_swap (/dev/mapper/vg0-swap, 4G)
要查看逻辑卷 (LV) 的类型
terminal
lvs -a -o +devices,lv_attr
terminal
# -wi- → 普通卷 (linear)
# rwi- → RAID1
# rwi-a-r--- → active RAID1
# rwi-a-s--- → Striped (RAID0)
root@digvps:~# lvs -a -o +devices,lv_attr
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices Attr
root digvps-vg -wi-ao---- 59.79g /dev/sda5(0) -wi-ao----
swap_1 digvps-vg -wi-ao---- 3.25g /dev/sda5(15307) -wi-ao----
Linear(普通卷)扩展
确认磁盘是否已分区
通常裸盘可以直接用作 PV(Physical Volume)。 如果之前分过区,可以先清理:
terminal
wipefs -a /dev/nvme1n1
创建 LVM 物理卷 (PV)
terminal
pvcreate /dev/nvme1n1
检查
terminal
pvs
扩展现有卷组 (VG)
terminal
vgextend vg0 /dev/nvme1n1
检查
terminal
pvs
扩展逻辑卷 (LV)
假设你有两个 LV:root 和 swap。 一般是扩展 root,例如把所有新空间都加到 root:
terminal
lvextend -l +100%FREE /dev/vg0/root
扩展文件系统
terminal
# 如果是 ext4:
resize2fs /dev/vg0/root
# 如果是 xfs
xfs_growfs /
检查结果
应该能看到 root 逻辑卷容量扩展了。
terminal
df -h
lsblk
📘 常用命令
磁盘空间不足,需快速定位日志目录
terminal
du -x --max-depth=1 /|sort -k1 -nr
# du # disk usage,统计磁盘使用量
# -x # 只统计同一文件系统,跨挂载点的目录不算
# --max-depth=1 # 只显示指定目录下一层子目录的大小
# / # 要统计的目录,这里是根目录
#
# sort # 对输出结果排序
# -k1 # 以第 1 列(du 输出的大小)作为排序关键字
# -n # 按数值大小排序(numeric sort)
# -r # 逆序排序(从大到小)
系统产生很多碎片文件,导致 inode 资源不足
terminal
find -type f | awk -F / -v OFS=/ '{$NF="";dir[$0]++}END{for(i in dir)print dir[i]""i}' | sort -k1 -nr | head
# find # 查找文件
# -type f # 只查找普通文件,不包含目录
#
# awk # 文本处理工具
# -F / # 指定输入字段分隔符为 “/”
# -v OFS=/ # 指定输出字段分隔符为 “/”
# $NF # NF = 字段总数,$NF 表示最后一个字段(文件名)
# $NF="" # 删除最后一个字段,只保留目录路径
# dir[$0]++ # 以目录路径为键,统计该目录下文件数量
# END{...} # 在输入处理完成后执行,输出统计结果
# print dir[i]""i # 输出格式:文件数 + 目录路径
#
# sort # 排序
# -k1 # 按第 1 列(文件数)排序
# -n # 数字大小排序
# -r # 逆序,从大到小
#
# head # 只显示前 10 行(文件最多的 10 个目录)

