Ubuntu Server 新手教程:扩展系统盘 + 挂载 NTFS 数据盘(Windows 通用)
适合 Linux 新手,一步步教会你如何充分利用硬盘空间
背景问题
安装 Ubuntu Server 时,如果使用默认分区设置,可能会出现:
- 128GB 硬盘只用了 58GB,剩余空间浪费
- 额外的大容量机械硬盘不知道如何使用
- 希望机械硬盘能在 Windows 和 Ubuntu 之间通用
本文将完整解决这些问题。
最终效果
- 系统盘从 58GB 扩展到 115GB(充分利用)
- 1TB 机械硬盘格式化为 NTFS,挂载到
/data - 硬盘可以在 Windows 电脑上直接读写
- 开机自动挂载大容量机械硬盘,无需手动操作
第一部分:检查当前状态
# 查看磁盘分区情况
lsblk
# 查看磁盘使用情况
df -h
# 查看 LVM 逻辑卷信息(如果使用 LVM)
sudo lvdisplay
第二部分:扩展系统盘(LVM)
下面命令扩展的是整个根目录 /,不是指定某个文件夹。
类比:
土地总面积:119GB
已盖房子:58GB(当前系统用的)
空闲土地:58GB(没盖房子的空地)
lvextend 命令的作用:
- 把房子扩建到整个土地大小(58GB → 116GB)
- 房子内部空间(/dev、/home、/etc等)自动变大
- 房子的门牌号还是
/(根目录)
2.1 扩展逻辑卷
# 使用所有剩余空间扩展逻辑卷
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
2.2 扩展文件系统
# 调整文件系统大小(ext4 格式)
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
2.3 验证扩展结果
df -h /
# 应该看到根分区从 58G 变成约 115G
第三部分:挂载 NTFS 数据盘(Windows 通用)
NTFS 是 Linux 和 Windows 都能识别的文件格式,所以不用担心数据盘在 Windows 系统中无法使用的问题。
3.1 安装 NTFS 支持驱动
sudo apt update && sudo apt install ntfs-3g -y
3.2 创建分区
sudo fdisk /dev/sda
在 fdisk 中依次输入(每行按回车):
n # 新建分区
p # 主分区
1 # 分区编号 1
回车 # 默认起始位置
回车 # 默认结束位置(使用全部空间)
w # 写入并退出
3.3 格式化为 NTFS
sudo mkfs.ntfs -f /dev/sda1
3.4 创建挂载点并挂载
# 创建挂载目录
sudo mkdir -p /data
# 临时挂载
sudo mount -t ntfs-3g /dev/sda1 /data
# 设置用户权限
sudo chown -R $USER:$USER /data
3.5 测试读写
echo "Hello from Ubuntu Server" > /data/test.txt && cat /data/test.txt
3.6 获取 UUID 并设置开机自动挂载
# 获取硬盘 UUID
sudo blkid /dev/sda1
# 备份 fstab 配置文件
sudo cp /etc/fstab /etc/fstab.backup
# 添加开机挂载配置(请替换 UUID)
echo 'UUID=你的UUID /data ntfs-3g defaults,uid=1000,gid=1000,umask=022 0 0' | sudo tee -a /etc/fstab
# 验证配置
sudo mount -a
3.7 重启测试
sudo reboot
# 重启后运行 df -h /data 确认挂载成功
验证最终结果
lsblk
df -h
预期输出:
sda 931.5G
└─sda1 931.5G /data
sdb 119.2G
└─sdb3 116.2G
└─ubuntu--vg-ubuntu--lv 116.2G /
/dev/sda1 932G 94M 932G 1% /data
/dev/mapper/ubuntu--vg-ubuntu--lv 115G 6.7G 103G 7% /
常见问题
Q: 扩展系统盘时提示 "No free space"?
sudo vgdisplay # 查看卷组剩余空间
Q: 挂载后无法写入文件?
sudo chown -R $USER:$USER /data
Q: 如何安全拔出硬盘?
sudo umount /data # 先卸载
# 然后再拔硬盘
Q: 硬盘插到 Windows 上不识别?
确保格式化为 NTFS(本文已采用),Windows 原生支持。
命令速查表
| 用途 | 命令 |
|---|---|
| 查看磁盘 | lsblk |
| 查看空间 | df -h |
| 查看 UUID | sudo blkid /dev/sda1 |
| 手动挂载 | sudo mount /dev/sda1 /data |
| 手动卸载 | sudo umount /data |
| 查看 LVM | sudo lvdisplay |
扩展
一键脚本(带详细注释)
保存为 setup-storage.sh
#!/bin/bash
# ============================================================
# 脚本名称: setup-storage.sh
# 功能: 扩展 Ubuntu Server 系统盘 + 挂载 NTFS 数据盘
# 适用: Ubuntu Server (LVM 分区 + 额外硬盘)
# 作者: 自动生成
# 版本: 1.0
# ============================================================
set -e # 遇到错误立即退出
# 颜色定义(让输出更好看)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 打印带颜色的消息
print_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 确认操作
confirm() {
read -p "$1 [y/N]: " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
print_error "操作已取消"
exit 1
fi
}
# ============================================================
# 第一部分:检查当前环境
# ============================================================
print_info "开始检查系统环境..."
# 检查是否为 root 或 sudo 权限
if [[ $EUID -ne 0 ]]; then
print_warning "需要 sudo 权限,后续命令将使用 sudo"
fi
# 检查是否使用 LVM
if ! command -v lvdisplay &> /dev/null; then
print_error "未检测到 LVM,此脚本需要 LVM 分区方案"
exit 1
fi
# 获取逻辑卷信息
LV_PATH=$(sudo lvdisplay | grep "LV Path" | awk '{print $3}' | head -1)
VG_NAME=$(sudo lvdisplay | grep "VG Name" | awk '{print $3}' | head -1)
if [[ -z "$LV_PATH" ]]; then
print_error "无法检测到 LVM 逻辑卷"
exit 1
fi
print_success "检测到逻辑卷: $LV_PATH"
print_success "检测到卷组: $VG_NAME"
# 显示当前磁盘状态
print_info "当前磁盘状态:"
lsblk
# ============================================================
# 第二部分:扩展系统盘
# ============================================================
echo ""
print_info "========== 开始扩展系统盘 =========="
confirm "是否要扩展系统盘(使用所有剩余空间)?"
# 扩展逻辑卷
print_info "正在扩展逻辑卷..."
sudo lvextend -l +100%FREE "$LV_PATH"
print_success "逻辑卷扩展完成"
# 扩展文件系统
print_info "正在扩展文件系统..."
sudo resize2fs "$LV_PATH"
print_success "文件系统扩展完成"
# 验证
print_info "验证扩展结果:"
df -h /
print_success "系统盘扩展完成!"
# ============================================================
# 第三部分:挂载 NTFS 数据盘
# ============================================================
echo ""
print_info "========== 开始配置数据盘 =========="
# 检测数据盘(默认识别 sda)
DATA_DISK="/dev/sda"
if [[ ! -b "$DATA_DISK" ]]; then
print_error "未检测到 $DATA_DISK 硬盘"
exit 1
fi
print_info "检测到数据盘: $DATA_DISK"
print_warning "此操作将格式化 $DATA_DISK,所有数据将丢失!"
confirm "是否继续配置数据盘?"
# 安装 NTFS 驱动
print_info "安装 NTFS 驱动..."
sudo apt update
sudo apt install ntfs-3g -y
print_success "NTFS 驱动安装完成"
# 创建分区
print_info "正在创建分区..."
sudo fdisk "$DATA_DISK" << EOF
n
p
1
w
EOF
print_success "分区创建完成"
# 等待分区表更新
sleep 2
# 格式化
print_info "正在格式化为 NTFS..."
sudo mkfs.ntfs -f "${DATA_DISK}1"
print_success "格式化完成"
# 创建挂载点
MOUNT_POINT="/data"
print_info "创建挂载点: $MOUNT_POINT"
sudo mkdir -p "$MOUNT_POINT"
# 挂载
print_info "正在挂载硬盘..."
sudo mount -t ntfs-3g "${DATA_DISK}1" "$MOUNT_POINT"
# 设置权限
print_info "设置权限..."
sudo chown -R "$USER:$USER" "$MOUNT_POINT"
print_success "权限设置完成"
# 测试读写
print_info "测试读写..."
echo "Hello from Ubuntu Server - $(date)" | sudo tee "$MOUNT_POINT/test.txt" > /dev/null
if cat "$MOUNT_POINT/test.txt" | grep -q "Hello"; then
print_success "读写测试通过"
sudo rm "$MOUNT_POINT/test.txt"
else
print_error "读写测试失败"
exit 1
fi
# 获取 UUID
UUID=$(sudo blkid -s UUID -o value "${DATA_DISK}1")
print_success "硬盘 UUID: $UUID"
# 备份 fstab
print_info "备份 /etc/fstab..."
sudo cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d_%H%M%S)
# 添加到 fstab
print_info "配置开机自动挂载..."
echo "UUID=$UUID $MOUNT_POINT ntfs-3g defaults,uid=1000,gid=1000,umask=022 0 0" | sudo tee -a /etc/fstab
# 验证 fstab
print_info "验证配置..."
if sudo mount -a 2>&1; then
print_success "fstab 配置正确"
else
print_error "fstab 配置错误,正在恢复备份..."
sudo mv /etc/fstab.backup.* /etc/fstab
exit 1
fi
# ============================================================
# 第四部分:最终验证
# ============================================================
echo ""
print_info "========== 最终验证 =========="
print_info "磁盘分区状态:"
lsblk
echo ""
print_info "磁盘使用情况:"
df -h | grep -E "(Filesystem|/dev/sda|/dev/mapper)"
echo ""
print_success "=========================================="
print_success "配置完成!"
print_success "=========================================="
echo ""
print_info "配置摘要:"
echo " - 系统盘: $(df -h / | tail -1 | awk '{print $2}')"
echo " - 数据盘: $(df -h /data | tail -1 | awk '{print $2}')"
echo " - 数据盘 UUID: $UUID"
echo " - 数据盘挂载点: $MOUNT_POINT"
echo ""
print_warning "建议重启服务器验证开机自动挂载: sudo reboot"
print_warning "重启后运行: df -h /data"
# ============================================================
# 可选:重启确认
# ============================================================
echo ""
read -p "是否立即重启?(重启后验证开机挂载) [y/N]: " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
print_info "系统将在 3 秒后重启..."
sleep 3
sudo reboot
else
print_info "请稍后手动重启验证: sudo reboot"
fi
脚本使用方法
1. 创建脚本文件
nano setup-storage.sh
2. 粘贴上面的脚本内容,保存退出(Ctrl+O, Enter, Ctrl+X)
3. 添加执行权限
chmod +x setup-storage.sh
4. 运行脚本
./setup-storage.sh
5. 按提示确认操作
脚本会:
- 自动检测 LVM 配置
- 询问是否扩展系统盘
- 询问是否格式化数据盘
- 自动完成所有配置
- 最后询问是否重启
脚本安全特性
| 特性 | 说明 |
|---|---|
set -e | 遇到错误自动停止 |
| 备份 fstab | 自动备份配置文件 |
| 读写测试 | 挂载后自动测试 |
| 颜色输出 | 清晰区分信息/成功/警告/错误 |
| 二次确认 | 危险操作需要确认 |