DigVPS

磁盘

磁盘相关系统配置与应用教程

📘 磁盘信息查看

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 个目录)