Linux 硬盘挂载综合教程
目录
-
硬盘基础知识
-
识别硬盘设备
-
分区操作
-
格式化文件系统
-
挂载与卸载
-
永久挂载配置
-
权限管理
-
故障排查
-
实用脚本
硬盘基础知识
设备命名规则
-
传统SATA/SCSI硬盘 :
/dev/sda
,/dev/sdb
,/dev/sdc
... -
NVMe硬盘 :
/dev/nvme0n1
,/dev/nvme1n1
,/dev/nvme2n1
... -
分区 : 在设备名后加分区号,如
/dev/sda1
,/dev/nvme0n1p1
文件系统类型
-
ext4: Linux最常用,稳定可靠
-
xfs: 高性能,适合大文件
-
btrfs: 支持快照、压缩等高级功能
-
NTFS: Windows兼容(需要额外软件)
识别硬盘设备
查看所有块设备
bash
# 查看树状结构
lsblk
# 查看详细信息
lsblk -f
# 查看所有磁盘信息
fdisk -l
# 查看SCSI设备
lsscsi
# 查看USB设备
lsusb
识别新硬盘的要点
-
没有挂载点(MOUNTPOINTS列为空)
-
没有分区或分区未格式化
-
容量与您添加的硬盘相符
分区操作
使用 fdisk(MBR/GPT)
bash
# 进入分区工具
sudo fdisk /dev/nvme1n1
# fdisk 常用命令:
# n - 创建新分区
# p - 打印分区表
# d - 删除分区
# t - 更改分区类型
# w - 写入并退出
# q - 退出不保存
使用 parted(GPT推荐)
bash
# 进入parted
sudo parted /dev/nvme1n1
# parted常用命令:
# print - 显示分区信息
# mklabel gpt - 创建GPT分区表
# mkpart primary 0% 100% - 创建主分区使用全部空间
# quit - 退出
快速分区脚本
bash
# 单分区使用整个磁盘
echo -e "n\np\n1\n\n\nw" | sudo fdisk /dev/nvme1n1
# 或者使用parted
sudo parted /dev/nvme1n1 --script mklabel gpt
sudo parted /dev/nvme1n1 --script mkpart primary 0% 100%
格式化文件系统
基本格式化命令
bash
# 格式化为ext4(最常用)
sudo mkfs.ext4 /dev/nvme1n1p1
# 格式化为xfs
sudo mkfs.xfs /dev/nvme1n1p1
# 格式化为btrfs
sudo mkfs.btrfs /dev/nvme1n1p1
# 强制格式化(如果设备已有文件系统)
sudo mkfs.ext4 -F /dev/nvme1n1p1
格式化选项
bash
# 设置卷标
sudo mkfs.ext4 -L "mydata" /dev/nvme1n1p1
# 保留一定空间(5%)
sudo mkfs.ext4 -m 5 /dev/nvme1n1p1
# 指定块大小(对于大文件)
sudo mkfs.ext4 -b 4096 /dev/nvme1n1p1
挂载与卸载
手动挂载
bash
# 创建挂载点
sudo mkdir /mnt/mydata
# 临时挂载
sudo mount /dev/nvme1n1p1 /mnt/mydata
# 指定文件系统类型挂载
sudo mount -t ext4 /dev/nvme1n1p1 /mnt/mydata
# 带选项挂载
sudo mount -o defaults,noatime /dev/nvme1n1p1 /mnt/mydata
挂载选项说明
-
defaults
: 默认选项(rw, suid, dev, exec, auto, nouser, async) -
noatime
: 不更新访问时间,提升性能 -
nodiratime
: 不更新目录访问时间 -
rw
/ro
: 读写/只读模式 -
exec
/noexec
: 允许/禁止执行二进制文件 -
user
/nouser
: 允许/禁止普通用户挂载
卸载操作
bash
# 基本卸载
sudo umount /mnt/mydata
# 如果设备忙,强制卸载
sudo umount -l /mnt/mydata
# 卸载所有可卸载的文件系统
sudo umount -a
永久挂载配置
获取必要信息
bash
# 获取UUID(推荐使用)
sudo blkid /dev/nvme1n1p1
# 获取文件系统类型
lsblk -f /dev/nvme1n1p1
编辑 /etc/fstab
bash
# 备份原文件
sudo cp /etc/fstab /etc/fstab.backup
# 编辑文件
sudo nano /etc/fstab
fstab 条目格式
text
# 设备标识 挂载点 文件系统 挂载选项 dump备份 fsck检查
UUID=xxxxxx /mnt/mydata ext4 defaults 0 2
常用fstab配置示例
bash
# 基本配置
UUID=12345678-1234-1234-1234-123456789abc /mnt/mydata ext4 defaults 0 2
# 性能优化配置
UUID=12345678-1234-1234-1234-123456789abc /mnt/mydata ext4 defaults,noatime,nodiratime 0 2
# 用户数据盘,允许用户执行程序
UUID=12345678-1234-1234-1234-123456789abc /home/user/data ext4 defaults,user,exec 0 2
# 使用设备名(不推荐,设备名可能变化)
/dev/nvme1n1p1 /mnt/mydata ext4 defaults 0 2
测试fstab配置
bash
# 测试fstab语法
sudo mount -a
# 如果没有错误信息,说明配置正确
# 重启后验证
sudo reboot
权限管理
更改挂载点权限
bash
# 更改所有者
sudo chown -R ubuntu:ubuntu /mnt/mydata
# 更改权限
sudo chmod -R 755 /mnt/mydata
# 设置粘滞位(只有文件所有者可以删除文件)
sudo chmod +t /mnt/mydata
在fstab中设置权限
bash
# 指定用户ID和组ID
UUID=xxxxxx /mnt/mydata ext4 defaults,uid=1000,gid=1000 0 2
# 设置umask(权限掩码)
UUID=xxxxxx /mnt/mydata ext4 defaults,umask=022 0 2
故障排查
常见问题及解决方案
1. 设备忙,无法卸载
bash
# 查看哪个进程在使用挂载点
sudo lsof /mnt/mydata
# 或者使用fuser
sudo fuser -v /mnt/mydata
# 结束相关进程后重试卸载
2. 挂载失败
bash
# 查看系统日志
sudo dmesg | tail -20
# 检查fstab语法
sudo mount -a
# 检查文件系统
sudo fsck /dev/nvme1n1p1
3. 磁盘空间问题
bash
# 查看磁盘使用情况
df -h
# 查看inode使用情况
df -i
# 查找大文件
sudo find /mnt/mydata -type f -size +1G
4. 性能问题
bash
# 测试磁盘速度
sudo hdparm -Tt /dev/nvme1n1p1
# 查看IO统计
iostat -x 1
实用脚本
自动化挂载脚本
bash
#!/bin/bash
# auto_mount.sh - 自动检测并挂载新硬盘
set -e
# 配置变量
MOUNT_POINT="/mnt/mydata"
FILESYSTEM="ext4"
echo "开始检测新硬盘..."
# 查找未挂载的硬盘
UNMOUNTED_DISKS=$(lsblk -lnpo NAME,TYPE,MOUNTPOINT | grep -E 'disk\s+$' | awk '{print $1}')
for DISK in $UNMOUNTED_DISKS; do
echo "发现未挂载硬盘: $DISK"
# 检查是否已有分区
PARTITIONS=$(lsblk -lnpo NAME,TYPE "$DISK" | grep part | awk '{print $1}')
if [ -z "$PARTITIONS" ]; then
echo "创建分区..."
echo -e "n\np\n1\n\n\nw" | fdisk "$DISK"
PARTITION="${DISK}p1"
# 等待系统识别新分区
sleep 2
else
PARTITION=$(echo "$PARTITIONS" | head -1)
echo "使用现有分区: $PARTITION"
fi
# 检查是否已格式化
if ! blkid "$PARTITION" &> /dev/null; then
echo "格式化分区..."
"mkfs.$FILESYSTEM" "$PARTITION"
fi
# 创建挂载点
mkdir -p "$MOUNT_POINT"
# 挂载
echo "挂载到 $MOUNT_POINT..."
mount "$PARTITION" "$MOUNT_POINT"
# 获取UUID并添加到fstab
UUID=$(blkid -s UUID -o value "$PARTITION")
if ! grep -q "$UUID" /etc/fstab; then
echo "添加到fstab..."
echo "UUID=$UUID $MOUNT_POINT $FILESYSTEM defaults 0 2" >> /etc/fstab
fi
echo "挂载完成!"
break
done
echo "当前挂载状态:"
df -h "$MOUNT_POINT"
磁盘信息查看脚本
bash
#!/bin/bash
# disk_info.sh - 显示详细磁盘信息
echo "=== 磁盘信息汇总 ==="
echo
echo "1. 块设备列表:"
lsblk
echo
echo "2. 文件系统信息:"
lsblk -f
echo
echo "3. 挂载信息:"
df -hT
echo
echo "4. 磁盘使用详情:"
for mount in $(findmnt -l -n -o TARGET | grep -v '^/$' | grep -v '^/boot' | grep -v '^/sys' | grep -v '^/proc'); do
echo "挂载点: $mount"
df -h "$mount" | tail -1
echo
done
echo "5. Inode使用情况:"
df -i
安全卸载脚本
bash
#!/bin/bash
# safe_umount.sh - 安全卸载硬盘
if [ $# -eq 0 ]; then
echo "用法: $0 <挂载点或设备>"
exit 1
fi
TARGET=$1
# 检查是否已挂载
if ! mountpoint -q "$TARGET" 2>/dev/null; then
echo "错误: $TARGET 未挂载或不是挂载点"
exit 1
fi
echo "准备卸载: $TARGET"
# 检查占用进程
echo "检查占用进程..."
PROCESSES=$(lsof "$TARGET" 2>/dev/null | tail -n +2)
if [ -n "$PROCESSES" ]; then
echo "以下进程正在使用 $TARGET:"
echo "$PROCESSES"
echo
read -p "是否强制卸载?(y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "强制卸载..."
umount -l "$TARGET"
else
echo "取消卸载"
exit 0
fi
else
echo "正常卸载..."
umount "$TARGET"
fi
# 验证卸载
if mountpoint -q "$TARGET"; then
echo "错误: 卸载失败"
exit 1
else
echo "成功卸载: $TARGET"
fi
最佳实践
-
始终使用UUID而不是设备名配置fstab
-
先备份fstab再修改
-
使用mount -a测试配置是否正确
-
考虑性能需求选择合适的文件系统和挂载选项
-
定期检查磁盘健康状态
-
合理规划分区大小和用途
-
重要数据多重备份
这个综合教程涵盖了从基础到高级的硬盘挂载操作,适合各种使用场景。根据您的具体需求选择相应的方法和脚本。