AWS | Linux 硬盘挂载综合教程
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; doecho "发现未挂载硬盘: $DISK"# 检查是否已有分区PARTITIONS=$(lsblk -lnpo NAME,TYPE "$DISK" | grep part | awk '{print $1}')if [ -z "$PARTITIONS" ]; thenecho "创建分区..."echo -e "n\np\n1\n\n\nw" | fdisk "$DISK"PARTITION="${DISK}p1"# 等待系统识别新分区sleep 2elsePARTITION=$(echo "$PARTITIONS" | head -1)echo "使用现有分区: $PARTITION"fi# 检查是否已格式化if ! blkid "$PARTITION" &> /dev/null; thenecho "格式化分区...""mkfs.$FILESYSTEM" "$PARTITION"fi# 创建挂载点mkdir -p "$MOUNT_POINT"# 挂载echo "挂载到 $MOUNT_POINT..."mount "$PARTITION" "$MOUNT_POINT"# 获取UUID并添加到fstabUUID=$(blkid -s UUID -o value "$PARTITION")if ! grep -q "$UUID" /etc/fstab; thenecho "添加到fstab..."echo "UUID=$UUID $MOUNT_POINT $FILESYSTEM defaults 0 2" >> /etc/fstabfiecho "挂载完成!"break doneecho "当前挂载状态:" df -h "$MOUNT_POINT"
磁盘信息查看脚本
bash
#!/bin/bash # disk_info.sh - 显示详细磁盘信息echo "=== 磁盘信息汇总 ===" echoecho "1. 块设备列表:" lsblk echoecho "2. 文件系统信息:" lsblk -f echoecho "3. 挂载信息:" df -hT echoecho "4. 磁盘使用详情:" for mount in $(findmnt -l -n -o TARGET | grep -v '^/$' | grep -v '^/boot' | grep -v '^/sys' | grep -v '^/proc'); doecho "挂载点: $mount"df -h "$mount" | tail -1echo doneecho "5. Inode使用情况:" df -i
安全卸载脚本
bash
#!/bin/bash # safe_umount.sh - 安全卸载硬盘if [ $# -eq 0 ]; thenecho "用法: $0 <挂载点或设备>"exit 1 fiTARGET=$1# 检查是否已挂载 if ! mountpoint -q "$TARGET" 2>/dev/null; thenecho "错误: $TARGET 未挂载或不是挂载点"exit 1 fiecho "准备卸载: $TARGET"# 检查占用进程 echo "检查占用进程..." PROCESSES=$(lsof "$TARGET" 2>/dev/null | tail -n +2)if [ -n "$PROCESSES" ]; thenecho "以下进程正在使用 $TARGET:"echo "$PROCESSES"echoread -p "是否强制卸载?(y/N): " -n 1 -rechoif [[ $REPLY =~ ^[Yy]$ ]]; thenecho "强制卸载..."umount -l "$TARGET"elseecho "取消卸载"exit 0fi elseecho "正常卸载..."umount "$TARGET" fi# 验证卸载 if mountpoint -q "$TARGET"; thenecho "错误: 卸载失败"exit 1 elseecho "成功卸载: $TARGET" fi
最佳实践
始终使用UUID而不是设备名配置fstab
先备份fstab再修改
使用mount -a测试配置是否正确
考虑性能需求选择合适的文件系统和挂载选项
定期检查磁盘健康状态
合理规划分区大小和用途
重要数据多重备份
这个综合教程涵盖了从基础到高级的硬盘挂载操作,适合各种使用场景。根据您的具体需求选择相应的方法和脚本。