AWS | Linux 硬盘挂载综合教程

Linux 硬盘挂载综合教程

目录

  1. 硬盘基础知识

  2. 识别硬盘设备

  3. 分区操作

  4. 格式化文件系统

  5. 挂载与卸载

  6. 永久挂载配置

  7. 权限管理

  8. 故障排查

  9. 实用脚本


硬盘基础知识

设备命名规则

  • 传统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

识别新硬盘的要点

  1. 没有挂载点(MOUNTPOINTS列为空)

  2. 没有分区或分区未格式化

  3. 容量与您添加的硬盘相符


分区操作

使用 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

最佳实践

  1. 始终使用UUID而不是设备名配置fstab

  2. 先备份fstab再修改

  3. 使用mount -a测试配置是否正确

  4. 考虑性能需求选择合适的文件系统和挂载选项

  5. 定期检查磁盘健康状态

  6. 合理规划分区大小和用途

  7. 重要数据多重备份

这个综合教程涵盖了从基础到高级的硬盘挂载操作,适合各种使用场景。根据您的具体需求选择相应的方法和脚本。

相关推荐
绵羊20233 小时前
ImmuCellAI 免疫浸润分析
linux·python
胡斌附体4 小时前
linux docker 离线 安装
linux·docker·卸载·自启动·离线安装·系统服务
大聪明-PLUS6 小时前
通过 Telnet 实现自动化
linux·嵌入式·arm·smarc
Lin_Aries_04216 小时前
容器化 Tomcat 应用程序
java·linux·运维·docker·容器·tomcat
吃不胖没烦恼6 小时前
Alibaba Cloud Linux 3 +Docker 部署 ThinkPHP6 (宝塔环境)-问题篇
运维·docker·容器
HAORChain6 小时前
Fabric 2.x 外部链码部署(External Chaincode Service)实战攻略
linux·docker·区块链·fabric
Lin_Aries_04217 小时前
部署 GitLab 服务器
linux·运维·服务器·docker·gitlab·github
appdeveloperxg7 小时前
Centos 7 创建ftp 匿名登录和专用用户名登录可上传下载
linux·服务器
停走的风7 小时前
关于Pycharm的conda虚拟环境包更改路径问题的配置问题
linux·pycharm·conda