发布时间:2026-05-22 21:47
给你一个**带交互、带安全检查、带日志**的完整脚本,保存成 `.sh` 文件直接跑就行。
### 完整挂载脚本
把下面内容保存为 `mount_disk.sh`:
```bash
#!/bin/bash
# ============================================
# 云服务器 CentOS 数据盘自动挂载脚本
# 用法: bash mount_disk.sh
# ============================================
set -e # 出错立即停止
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo -e "${GREEN}=== 云盘挂载脚本 ===${NC}"
echo ""
# 必须 root
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}请用 root 运行: sudo bash $0${NC}"
exit 1
fi
# ===== 第 1 步:列出可用磁盘 =====
echo -e "${YELLOW}[1/6] 当前磁盘列表:${NC}"
lsblk
echo ""
# ===== 第 2 步:用户输入 =====
read -p "请输入要挂载的磁盘设备 (例如 /dev/vdb): " DISK
read -p "请输入挂载点目录 (默认 /data): " MOUNT
MOUNT=${MOUNT:-/data}
read -p "请输入文件系统类型 (ext4/xfs, 默认 ext4): " FSTYPE
FSTYPE=${FSTYPE:-ext4}
# ===== 第 3 步:安全检查 =====
echo ""
echo -e "${YELLOW}[2/6] 安全检查...${NC}"
# 检查设备是否存在
if [ ! -b "$DISK" ]; then
echo -e "${RED}错误: 设备 $DISK 不存在${NC}"
exit 1
fi
# 检查是否已挂载
if mount | grep -q "^$DISK "; then
echo -e "${RED}错误: $DISK 已经挂载,请先卸载${NC}"
mount | grep "^$DISK "
exit 1
fi
# 检查是否是系统盘
ROOT_DISK=$(df / | tail -1 | awk '{print $1}' | sed 's/[0-9]*$//')
if [ "$DISK" = "$ROOT_DISK" ] || [[ "$DISK" == "$ROOT_DISK"* ]]; then
echo -e "${RED}错误: $DISK 是系统盘,禁止操作${NC}"
exit 1
fi
# 检查盘上是否有现成的文件系统
EXISTING_FS=$(blkid -s TYPE -o value "$DISK" 2>/dev/null || true)
if [ -n "$EXISTING_FS" ]; then
echo -e "${RED}警告: $DISK 上已有 $EXISTING_FS 文件系统,格式化会清空所有数据!${NC}"
read -p "确定继续吗? 输入 yes 继续: " CONFIRM
if [ "$CONFIRM" != "yes" ]; then
echo "已取消"
exit 0
fi
fi
# ===== 第 4 步:格式化 =====
echo ""
echo -e "${YELLOW}[3/6] 格式化 $DISK 为 $FSTYPE...${NC}"
mkfs.$FSTYPE -F "$DISK"
# ===== 第 5 步:创建挂载点并挂载 =====
echo ""
echo -e "${YELLOW}[4/6] 创建挂载点 $MOUNT 并挂载...${NC}"
mkdir -p "$MOUNT"
mount "$DISK" "$MOUNT"
# ===== 第 6 步:写入 fstab =====
echo ""
echo -e "${YELLOW}[5/6] 写入 /etc/fstab (开机自动挂载)...${NC}"
# 备份 fstab
cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d%H%M%S)
# 获取 UUID
UUID=$(blkid -s UUID -o value "$DISK")
# 检查是否已存在相同 UUID 的记录,有就先删除
sed -i "/UUID=$UUID/d" /etc/fstab
# 追加新记录
echo "UUID=$UUID $MOUNT $FSTYPE defaults,nofail 0 2" >> /etc/fstab
# ===== 第 7 步:测试 fstab =====
echo ""
echo -e "${YELLOW}[6/6] 测试 fstab 配置...${NC}"
umount "$MOUNT"
if mount -a; then
echo -e "${GREEN}✓ fstab 配置正确${NC}"
else
echo -e "${RED}✗ fstab 配置有误,已回滚${NC}"
# 恢复 fstab
LATEST_BAK=$(ls -t /etc/fstab.bak.* | head -1)
cp "$LATEST_BAK" /etc/fstab
exit 1
fi
# ===== 完成 =====
echo ""
echo -e "${GREEN}=== 挂载成功 ===${NC}"
df -h | grep -E "Filesystem|$MOUNT"
echo ""
echo -e "${GREEN}磁盘信息:${NC}"
echo " 设备: $DISK"
echo " UUID: $UUID"
echo " 挂载点: $MOUNT"
echo " 文件系统: $FSTYPE"
echo " fstab 备份: /etc/fstab.bak.*"
echo ""
echo -e "${GREEN}重启后会自动挂载,无需再操作${NC}"
```
### 使用方法
**1. 创建脚本文件**
```bash
vi mount_disk.sh
# 粘贴上面内容,保存退出
```
或者一键创建(推荐):
```bash
cat > mount_disk.sh << 'EOF'
(把上面整段脚本粘贴这里)
EOF
```
**2. 运行**
```bash
sudo bash mount_disk.sh
```
**3. 按提示输入**
脚本会问你:
- 要挂载哪块盘(例如 `/dev/vdb`)
- 挂载到哪(默认 `/data`,回车跳过)
- 文件系统类型(默认 `ext4`,回车跳过)
### 这个脚本帮你做了什么
| 功能 | 说明 |
|---|---|
| ✅ 自动列出磁盘 | 不用先 `lsblk` |
| ✅ 系统盘保护 | 防止误格式化系统盘 |
| ✅ 已挂载检测 | 防止重复挂载 |
| ✅ 已有数据警告 | 盘上有数据会二次确认 |
| ✅ fstab 备份 | 改之前自动备份 |
| ✅ fstab 测试 | 失败自动回滚,**不会导致重启起不来** |
| ✅ 防重复 UUID | 同一块盘多次跑也不会写两遍 |
| ✅ 带颜色输出 | 看得清楚 |
### 全自动版本(不交互)
如果你想完全免交互,把开头几行改成:
```bash
# 直接写死参数,不再 read
DISK=/dev/vdb
MOUNT=/data
FSTYPE=ext4
```
把所有 `read -p` 那几行注释掉就行,然后 `bash mount_disk.sh` 直接跑完。
### 卸载脚本(附赠)
万一想撤销,给你一个对应的卸载脚本 `umount_disk.sh`:
```bash
#!/bin/bash
read -p "请输入要卸载的挂载点 (例如 /data): " MOUNT
# 卸载
umount "$MOUNT" && echo "已卸载 $MOUNT"
# 从 fstab 删除
cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d%H%M%S)
sed -i "\| $MOUNT |d" /etc/fstab
echo "已从 fstab 移除 $MOUNT 的记录"
------------------分割线------------------
# 云服务器 CentOS 挂载数据盘(最常用流程)
云服务器的数据盘挂载比物理机简单——**不用分区,直接格式化整盘挂载**就行。以下是阿里云、腾讯云、华为云通用的标准流程:
### 一、前置:先在云控制台挂载磁盘到实例
在云厂商控制台找到**云硬盘 / 块存储**,把数据盘**挂载到你的实例**。这一步在网页上点几下就好,挂载后系统才能看到这块盘。
### 二、登录服务器,查看磁盘
```bash
lsblk
```
典型输出:
```
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 40G 0 disk
└─vda1 253:1 0 40G 0 part / ← 系统盘
vdb 253:16 0 100G 0 disk ← 新挂的数据盘,没有挂载点
```
云服务器的设备名通常是:
- **阿里云、腾讯云老实例**:`/dev/vdb`、`/dev/vdc`
- **AWS、新一代云实例**:`/dev/nvme1n1`、`/dev/nvme2n1`
- **华为云**:`/dev/vdb` 或 `/dev/sdb`
**这里以 `/dev/vdb` 为例**,你按实际设备名替换。
### 三、一键挂载脚本(推荐)
直接复制粘贴执行,把 `/dev/vdb` 替换成你的设备名,`/data` 改成你想挂的目录:
```bash
# 设置变量(按需修改)
DISK=/dev/vdb
MOUNT=/data
# 1. 格式化(整盘不分区,云盘可以这么做)
mkfs.ext4 $DISK
# 2. 创建挂载点
mkdir -p $MOUNT
# 3. 挂载
mount $DISK $MOUNT
# 4. 写入 fstab(开机自动挂载)
UUID=$(blkid -s UUID -o value $DISK)
echo "UUID=$UUID $MOUNT ext4 defaults,nofail 0 2" >> /etc/fstab
# 5. 测试 fstab 配置(避免重启起不来)
umount $MOUNT
mount -a
# 6. 验证
df -h
```
执行完看到类似这样就成功了:
```
/dev/vdb 99G 60M 94G 1% /data
```
### 四、关键注意点(云服务器特有)
**1. 用 `nofail` 选项**
fstab 里写 `defaults,nofail` 而不是 `defaults`。
**作用**:如果某天数据盘没挂上(比如控制台手贱卸载了),系统**仍然能正常启动**,不会卡在 emergency mode。这是云服务器的最佳实践。
**2. 用 UUID 不要用 /dev/vdb**
云盘的设备名**可能在重启后变化**(特别是挂载多块盘时)。**UUID 是磁盘自己的身份,永远不变**。
**3. 不用分区**
云盘已经是虚拟设备,再分区没有意义,**整盘格式化挂载最简单**。除非你要在一块盘上挂多个挂载点。
**4. 文件系统选 ext4 还是 xfs**
- **ext4**:兼容性最好,**推荐日常使用**
- **xfs**:CentOS 7+ 默认,**大文件、高并发更好**,比如数据库、日志服务器
CentOS 7/8 用 xfs,CentOS 6 用 ext4。
**5. 数据盘扩容后怎么办**
云控制台扩容后,系统里还要执行:
```bash
# ext4
resize2fs /dev/vdb
# xfs
xfs_growfs /data
```
------------------分割线------------------
# CentOS 挂载磁盘完整流程
挂载磁盘分**临时挂载**和**永久挂载**两种,下面是完整步骤:
### 一、查看磁盘信息
```bash
# 查看所有磁盘和分区
lsblk
# 或者更详细的
fdisk -l
# 查看已挂载的磁盘
df -h
```
输出里类似 `/dev/sdb`、`/dev/vdb`、`/dev/nvme1n1` 这种**没有挂载点的就是新磁盘**。
### 二、给磁盘分区(如果是全新磁盘)
**方法 1:fdisk(适合 ≤ 2TB 磁盘,MBR 分区)**
```bash
fdisk /dev/sdb
```
进入交互界面后依次输入:
- `n` → 新建分区
- `p` → 主分区
- `1` → 分区号
- 回车 → 默认起始扇区
- 回车 → 默认结束扇区(用全部空间)
- `w` → 写入并退出
**方法 2:parted(适合 > 2TB 磁盘,GPT 分区)**
```bash
parted /dev/sdb
(parted) mklabel gpt
(parted) mkpart primary 0% 100%
(parted) quit
```
**方法 3:不分区直接用整块盘**(云服务器常见做法)
跳过分区,直接对 `/dev/sdb` 格式化。
### 三、格式化文件系统
```bash
# ext4(最常用,推荐)
mkfs.ext4 /dev/sdb1
# 或者 xfs(CentOS 7+ 默认,大文件性能更好)
mkfs.xfs /dev/sdb1
# 如果是整盘不分区
mkfs.ext4 /dev/sdb
```
### 四、创建挂载点并挂载
```bash
# 1. 创建挂载目录
mkdir -p /data
# 2. 临时挂载(重启后失效)
mount /dev/sdb1 /data
# 3. 验证
df -h
```
### 五、设置开机自动挂载(永久)
**1. 获取磁盘的 UUID**(推荐用 UUID 而不是设备名,因为设备名可能变)
```bash
blkid /dev/sdb1
```
输出示例:
```
/dev/sdb1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"
```
**2. 编辑 /etc/fstab**
```bash
vi /etc/fstab
```
在末尾添加一行:
```
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /data ext4 defaults 0 2
```
字段含义(用空格或 Tab 分隔):
| 字段 | 含义 | 常用值 |
|---|---|---|
| UUID/设备 | 磁盘标识 | UUID=xxx 或 /dev/sdb1 |
| 挂载点 | 挂载到哪里 | /data |
| 文件系统 | 类型 | ext4 / xfs |
| 挂载选项 | 参数 | defaults |
| dump | 是否备份 | 0 |
| fsck | 开机检查顺序 | 根分区为 1,其他为 2,不检查为 0 |
**3. 测试 fstab 配置(重要!)**
```bash
# 卸载先
umount /data
# 测试自动挂载(如果 fstab 写错,这一步会报错,避免重启起不来)
mount -a
# 验证
df -h
```
⚠️ **fstab 写错可能导致系统无法启动**,**一定要先 `mount -a` 测试再重启**。
### 六、完整示例(一条龙)
假设有一块新磁盘 `/dev/sdb`,要挂载到 `/data`:
```bash
# 1. 格式化(整盘不分区)
mkfs.ext4 /dev/sdb
# 2. 创建挂载点
mkdir -p /data
# 3. 挂载
mount /dev/sdb /data
# 4. 获取 UUID
blkid /dev/sdb
# 5. 写入 fstab
echo "UUID=$(blkid -s UUID -o value /dev/sdb) /data ext4 defaults 0 2" >> /etc/fstab
# 6. 测试
umount /data
mount -a
df -h
```
### 七、常见问题
**Q1: mount 提示 "wrong fs type"**
→ 没格式化,或格式化类型和 mount 时指定的不一致。重新 `mkfs.ext4` 或加上 `-t ext4` 参数。
**Q2: 磁盘已经有数据,不能格式化怎么办**
→ 直接跳过格式化,从挂载步骤开始。`mount /dev/sdb1 /data` 即可。
**Q3: 想扩容怎么办**
→ 如果是 LVM 卷可以在线扩容。如果是普通分区,需要先 `umount`,再 `resize2fs`(ext4)或 `xfs_growfs`(xfs)。
**Q4: 阿里云/腾讯云的磁盘挂载**
→ 流程一样,设备名通常是 `/dev/vdb`、`/dev/vdc` 或 `/dev/nvme1n1`。先在云控制台**挂载磁盘到实例**,再到系统里执行上面步骤。
**Q5: 想卸载磁盘**
```bash
umount /data
# 并从 /etc/fstab 删除对应行
```
### 八、查看挂载状态的实用命令
```bash
df -h # 已挂载磁盘和使用率
lsblk # 块设备树状图
mount | grep /data # 查看某挂载点详情
du -sh /data # 查看目录占用空间
```
我们很高兴能为您服务
您可以通过工单等方式联系我们~