Featured image of post Proxmox VE 新硬盘添加与配置 💾

Proxmox VE 新硬盘添加与配置 💾

Proxmox VE 新硬盘添加与配置 💾 本指南详细介绍如何在 PVE 系统中添加新硬盘,包括分区、格式

Proxmox VE 新硬盘添加与配置 💾

本指南详细介绍如何在 PVE 系统中添加新硬盘,包括分区、格式化、挂载和自动挂载配置,以及如何将其集成到 PVE 存储系统中。🚀


📖 导航目录


🔍 一、查看现有硬盘

1. 查看所有硬盘信息

1
2
3
4
5
6
7
8
# 查看所有块设备的信息,包括挂载点和文件系统
lsblk -f

# 查看更详细的设备树
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE,LABEL,UUID

# 只显示磁盘设备(排除分区和循环设备)
lsblk -d -o NAME,SIZE,TYPE,MODEL,SERIAL

2. 详细硬盘信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 显示所有硬盘的详细分区信息
fdisk -l

# 查看特定硬盘详情
fdisk -l /dev/sda

# 使用 parted 查看更详细的信息
parted -l

# 查看硬盘型号和序列号
hdparm -i /dev/sda | grep -E "Model|Serial"

# 检查硬盘健康状态
smartctl -a /dev/sda | grep -E "Model|Serial|Temperature|Reallocated|Pending|Uncorrectable"

3. 识别新硬盘

1
2
3
4
5
6
7
8
9
# 比较插入新硬盘前后的设备列表
ls /dev/sd* > /tmp/before.txt
# 插入硬盘后
ls /dev/sd* > /tmp/after.txt
diff /tmp/before.txt /tmp/after.txt

# 或者查看内核日志识别新设备
dmesg | grep -i sd
tail -f /var/log/syslog | grep -i attached

🛠️ 二、硬盘分区

1. 进入 fdisk 分区工具

1
2
# 对新硬盘进行分区(以 /dev/sdb 为例)
fdisk /dev/sdb

2. fdisk 常用命令

在 fdisk 交互界面中:

命令 说明 中文解释
m 显示帮助菜单 列出所有可用命令
p 打印当前分区表 显示现有分区情况
n 创建新分区 新建一个分区
p 创建主分区 创建主分区(最多4个)
e 创建扩展分区 创建扩展分区
l 列出分区类型 显示所有可用的分区类型
d 删除分区 删除指定分区
t 改变分区类型 修改分区类型
w 保存并退出 保存更改并退出
q 不保存退出 放弃更改并退出

3. 创建分区步骤

1
2
3
4
5
6
7
# 在 fdisk 中的操作顺序:
1. 输入 `n`    # 创建新分区
2. 输入 `p`    # 选择主分区
3. 按回车      # 使用默认分区号 (1)
4. 按回车      # 使用默认起始扇区
5. 按回车      # 使用所有可用空间
6. 输入 `w`    # 保存并退出

4. 使用 parted 进行高级分区

1
2
3
4
5
6
7
8
# 对于大于2TB的硬盘,使用 parted
parted /dev/sdb

# 在 parted 中的操作:
(parted) mklabel gpt          # 创建 GPT 分区表
(parted) mkpart primary 0% 100% # 创建占用整个磁盘的分区
(parted) print                # 打印分区信息
(parted) quit                 # 退出

5. 使用脚本自动化分区

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 使用 sfdisk 进行自动化分区
echo 'type=83' | sfdisk /dev/sdb

# 或者创建更复杂的分区方案
cat > partition.sfdisk << EOF
label: gpt
,10G,LVM
,20G
,+
EOF

sfdisk /dev/sdb < partition.sfdisk

💽 三、格式化硬盘

1. 格式化分区

1
2
3
4
5
6
7
8
# 格式化为 ext4 文件系统
mkfs -t ext4 /dev/sdb1

# 或者使用更详细的命令
mkfs.ext4 /dev/sdb1

# 对于大容量硬盘,可以使用更大的inode比例
mkfs.ext4 -i 2048 /dev/sdb1

2. 格式化选项(可选)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 添加卷标
mkfs.ext4 -L "pve_data" /dev/sdb1

# 设置保留块比例为 0%(最大化可用空间)
mkfs.ext4 -m 0 /dev/sdb1

# 使用特定块大小(性能优化)
mkfs.ext4 -b 4096 /dev/sdb1

# 强制格式化(即使设备已挂载)
mkfs.ext4 -F /dev/sdb1

3. 其他文件系统格式

1
2
3
4
5
6
7
8
# 格式化为 XFS 文件系统(适合大文件)
mkfs.xfs -f /dev/sdb1

# 格式化为 Btrfs 文件系统(高级特性)
mkfs.btrfs -f /dev/sdb1

# 格式化为 NTFS 文件系统(Windows 兼容)
mkfs.ntfs -f /dev/sdb1

4. 验证格式化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 检查文件系统
blkid /dev/sdb1

# 查看详细信息
tune2fs -l /dev/sdb1 | head -20

# 检查文件系统完整性
fsck -f /dev/sdb1

# 查看磁盘空间使用情况(格式化后)
df -h /dev/sdb1

📂 四、挂载硬盘

1. 创建挂载点

1
2
3
4
5
6
7
8
# 创建挂载目录
mkdir -p /mnt/sdb1

# 或者使用更有意义的名称
mkdir -p /mnt/pve-data

# 创建多层目录结构
mkdir -p /mnt/storage/{backup,iso,template,images}

2. 手动挂载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 挂载分区到目录
mount -t ext4 /dev/sdb1 /mnt/sdb1

# 使用特定挂载选项
mount -t ext4 -o noatime,nodiratime /dev/sdb1 /mnt/sdb1

# 验证挂载
df -h /mnt/sdb1

# 查看详细挂载信息
mount | grep sdb1

# 检查目录权限
ls -ld /mnt/sdb1

3. 设置权限

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 设置合适的权限
chmod 755 /mnt/sdb1
chown root:root /mnt/sdb1

# 创建常用子目录并设置权限
mkdir -p /mnt/sdb1/{backup,iso,template,images}
chmod 755 /mnt/sdb1/*
chown root:root /mnt/sdb1/*

# 为特定用户或组设置权限
chown -R nobody:nogroup /mnt/sdb1/backup
chmod 770 /mnt/sdb1/backup

🔄 五、配置开机自动挂载

1. 编辑 fstab 文件

1
2
3
4
5
6
7
8
9
# 备份原有 fstab 文件
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d)

# 添加自动挂载配置到 /etc/fstab
echo '/dev/sdb1 /mnt/sdb1 ext4 defaults,nofail,x-systemd.device-timeout=15s 0 0' >> /etc/fstab

# 或者使用 UUID(推荐)
UUID=$(blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID /mnt/sdb1 ext4 defaults,nofail,x-systemd.device-timeout=15s 0 0" >> /etc/fstab

2. fstab 参数解释

1
2
3
4
5
6
7
8
# 配置项说明:
# /dev/sdb1 或 UUID=... - 设备路径或唯一标识
# /mnt/sdb1            - 挂载点
# ext4                 - 文件系统类型
# defaults             - 默认挂载选项
# nofail               - 启动时如果设备不存在也不报错
# x-systemd.device-timeout=15s - 设备超时时间
# 0 0                  - dump 和 fsck 选项

3. 其他有用的挂载选项

1
2
3
4
5
6
7
8
# 性能优化选项
defaults,noatime,nodiratime,data=writeback

# 安全选项
defaults,nosuid,nodev,noexec

# 网络文件系统选项
defaults,_netdev,auto

4. 测试 fstab 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 测试 fstab 配置是否正确
mount -a

# 如果出现错误,检查并修复
mount -a 2>&1 | grep -i error

# 验证自动挂载
umount /mnt/sdb1
systemctl daemon-reload
systemctl restart local-fs.target

# 检查启动时挂载
systemctl status local-fs.target

🗑️ 六、取消挂载

1. 安全卸载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 卸载分区
umount /dev/sdb1

# 或者通过挂载点卸载
umount /mnt/sdb1

# 检查是否卸载成功
df -h | grep sdb1

# 查看哪些进程正在使用挂载点
lsof /mnt/sdb1
fuser -vm /mnt/sdb1

2. 强制卸载(如果需要)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 如果设备忙,强制卸载
umount -f /mnt/sdb1

# 或者使用 lazy unmount
umount -l /mnt/sdb1

# 终止使用挂载点的进程
fuser -km /mnt/sdb1

# 然后再次尝试卸载
umount /mnt/sdb1

3. 从 fstab 中移除配置

1
2
3
4
5
6
7
# 移除 fstab 中的挂载配置
sed -i '/\/mnt\/sdb1/d' /etc/fstab

# 或者备份并编辑文件
cp /etc/fstab /etc/fstab.modified
vi /etc/fstab.modified
mv /etc/fstab.modified /etc/fstab

⚙️ 七、高级配置

1. 使用 UUID 挂载(推荐)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 获取分区的 UUID
blkid /dev/sdb1

# 使用 UUID 替换设备路径
UUID=$(blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID /mnt/sdb1 ext4 defaults,nofail 0 0" >> /etc/fstab

# 验证 UUID 挂载
umount /mnt/sdb1
mount -U $UUID /mnt/sdb1

2. 挂载选项优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 性能优化挂载选项
cat >> /etc/fstab << EOF
/dev/sdb1 /mnt/sdb1 ext4 defaults,noatime,nodiratime,data=writeback,commit=60 0 0
EOF

# 重新挂载应用新选项
mount -o remount /mnt/sdb1

# 检查当前挂载选项
mount | grep sdb1

3. 创建符号链接

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 创建方便的符号链接
ln -sf /mnt/sdb1 /pve-data

# 验证链接
ls -la /pve-data

# 为不同用途创建多个链接
ln -sf /mnt/sdb1/backup /pve-backup
ln -sf /mnt/sdb1/iso /pve-iso
ln -sf /mnt/sdb1/template /pve-template

4. 配置磁盘调度器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 查看当前调度器
cat /sys/block/sdb/queue/scheduler

# 修改调度器(例如改为 deadline)
echo deadline > /sys/block/sdb/queue/scheduler

# 永久修改调度器
echo 'ACTION=="add|change", KERNEL=="sdb", ATTR{queue/scheduler}="deadline"' > /etc/udev/rules.d/60-ioscheduler.rules

# 重新加载 udev 规则
udevadm control --reload-rules
udevadm trigger

🔧 八、PVE 存储配置

1. 添加为 PVE 存储(Web 界面)

  1. 登录 PVE Web 管理界面
  2. 选择数据中心 → 存储
  3. 点击"添加" → “目录”
  4. 填写信息:
    • ID: sdb1-storage(唯一标识符)
    • 目录: /mnt/sdb1
    • 内容: 选择需要的类型(磁盘镜像、ISO、备份等)
    • 节点: 选择可用节点或所有节点
  5. 点击"添加"

2. 命令行添加存储

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 使用命令行添加存储
pvesm add dir sdb1-storage --path /mnt/sdb1 --content images,iso,backup

# 添加特定类型的存储
pvesm add dir sdb1-images --path /mnt/sdb1/images --content images
pvesm add dir sdb1-iso --path /mnt/sdb1/iso --content iso
pvesm add dir sdb1-backup --path /mnt/sdb1/backup --content backup

# 验证存储添加
pvesm status
pvesm list

3. 配置存储选项

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 设置存储选项
pvesm set sdb1-storage --maxfiles 0  # 不限制文件数

# 查看存储配置
pvesm config sdb1-storage

# 启用共享存储
pvesm set sdb1-storage --shared 1

# 设置存储权限
pvesm set sdb1-storage --nodes node1,node2

4. 使用存储

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 创建虚拟机并使用新存储
qm create 100 --name test-vm --storage sdb1-storage

# 上传 ISO 镜像到存储
qm importdisk 100 /path/to/iso.iso sdb1-storage

# 备份虚拟机到新存储
vzdump 100 --storage sdb1-backup

# 查看存储使用情况
pvesm status
df -h /mnt/sdb1

⚠️ 九、注意事项

1. 安全警告

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 不要挂载系统关键目录
# 确保有足够的权限
# 定期检查磁盘健康

# 检查磁盘健康
smartctl -a /dev/sdb

# 监控磁盘温度
smartctl -A /dev/sdb | grep -i temperature

# 定期检查文件系统
fsck -n /dev/sdb1

2. 性能考虑

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 对于 SSD 硬盘,使用适当的挂载选项
echo noop > /sys/block/sdb/queue/scheduler  # SSD 调度器
echo 0 > /proc/sys/vm/dirty_background_ratio
echo 0 > /proc/sys/vm/dirty_ratio

# 启用 TRIM(SSD 专用)
fstrim /mnt/sdb1

# 定期清理缓存
sync && echo 3 > /proc/sys/vm/drop_caches

3. 备份重要数据

1
2
3
4
5
6
7
8
# 在操作前备份重要数据
tar -czf /root/fstab-backup-$(date +%Y%m%d).tar.gz /etc/fstab

# 备份分区表
sfdisk -d /dev/sdb > /root/sdb-partition-backup.txt

# 定期备份存储配置
pvesm status > /root/pve-storage-status-$(date +%Y%m%d).txt

4. 监控和维护

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 设置磁盘监控
echo '#!/bin/bash
USAGE=$(df /mnt/sdb1 | awk "NR==2{print $5}" | sed "s/%//")
if [ $USAGE -gt 90 ]; then
    echo "警告: 磁盘空间不足 ${USAGE}%" | logger -t disk-monitor
fi' > /usr/local/bin/disk-alert.sh

chmod +x /usr/local/bin/disk-alert.sh

# 添加到计划任务
echo "*/30 * * * * /usr/local/bin/disk-alert.sh" >> /etc/crontab

💡 十、完整操作示例

新硬盘初始化脚本

 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
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/bash
# PVE 新硬盘初始化脚本
set -e

DISK="/dev/sdb"
MOUNT_POINT="/mnt/pve-data"
STORAGE_ID="pve-data"

echo "正在初始化新硬盘 $DISK..."

# 1. 检查磁盘是否存在
if [ ! -b $DISK ]; then
    echo "错误: 磁盘 $DISK 不存在!"
    exit 1
fi

# 2. 分区
echo "创建分区..."
echo -e "n\np\n1\n\n\nw" | fdisk $DISK
partprobe $DISK
sleep 2

# 3. 格式化
echo "格式化分区..."
mkfs.ext4 -m 0 -L "pve_data" ${DISK}1

# 4. 创建挂载点
echo "创建挂载点..."
mkdir -p $MOUNT_POINT

# 5. 临时挂载
echo "临时挂载..."
mount ${DISK}1 $MOUNT_POINT

# 6. 创建子目录
mkdir -p $MOUNT_POINT/{images,iso,backup,template}

# 7. 配置自动挂载
echo "配置自动挂载..."
UUID=$(blkid -s UUID -o value ${DISK}1)
echo "UUID=$UUID $MOUNT_POINT ext4 defaults,nofail,x-systemd.device-timeout=15s 0 0" >> /etc/fstab

# 8. 添加为 PVE 存储
echo "添加为 PVE 存储..."
pvesm add dir $STORAGE_ID --path $MOUNT_POINT --content images,iso,backup

# 9. 设置权限
chmod 755 $MOUNT_POINT
chown root:root $MOUNT_POINT

echo "新硬盘初始化完成!"
echo "挂载点: $MOUNT_POINT"
echo "存储 ID: $STORAGE_ID"
df -h $MOUNT_POINT
pvesm status

使用脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 下载脚本
curl -O https://example.com/pve-disk-init.sh

# 赋予执行权限
chmod +x pve-disk-init.sh

# 运行脚本(谨慎操作!)
./pve-disk-init.sh

# 或者直接运行
bash pve-disk-init.sh

验证脚本执行结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 检查挂载
df -h /mnt/pve-data

# 检查 fstab 配置
grep "pve-data" /etc/fstab

# 检查 PVE 存储
pvesm status
pvesm list

# 测试自动挂载
umount /mnt/pve-data
mount -a
df -h /mnt/pve-data

🎯 提示: 在生产环境中操作前,请确保已经备份重要数据,并确认操作的是正确的硬盘设备。建议先在测试环境中验证脚本和操作流程。

通过以上步骤,您应该能够成功在 PVE 中添加和配置新硬盘。如果遇到任何问题,可以参考相关日志文件或寻求社区帮助。

最后更新于 2025-09-28