linux ecs 挂载分区

展示盘

lsblk

nvme0n1 259:3 0 1.8T 0 disk

nvme1n1 259:0 0 1.8T 0 disk

nvme2n1 259:2 0 1.8T 0 disk

nvme3n1 259:1 0 1.8T 0 disk

为nvme1n1创建一个新的分区

sudo fdisk /dev/nvme1n1

使用fdisk的命令序列:

n - 新建分区

p - 主分区

1 - 分区号

回车 - 第一个扇区(使用默认值)

回车 - 最后一个扇区(使用默认值)

w - 写入新分区并退出

格式化新分区为ext4文件系统

sudo mkfs.ext4 /dev/nvme1n1p1

为分区创建挂载点

sudo mkdir /mnt/nvme1

将新分区挂载到挂载点

sudo mount /dev/nvme1n1p1 /mnt/nvme1

编辑fstab以实现开机自动挂载

#使用 blkid 的方法会自动获取设备的UUID,而不是用设备的路径(例如 /dev/nvme1n1p1)。UUID的优点是即使设备的路径在系统启动时发生变化,它也能保持不变,提供更稳定的挂载方式。

#在你给出的具体 echo 用法中,末尾使用了 0 0 而不是 0 2。数字 0 2 中的第一个 0 表示是否对文件系统进行备份。通常,只有 / 文件系统(root filesystem)会设置为 1,其他所有文件系统都设置为 0。第二个数字指的是启动时 fsck 检查文件系统的顺序,/ 文件系统设置为 1,而其他文件系统设置为 2 或更大的数字。给定 echo 命令中的 0 0 配置会停止 fsck 在启动时检查该文件系统。

sudo cp /etc/fstab /etc/fstab.bak

echo `blkid /dev/nvme1n1p1 | awk '{print $2}' | sed 's/\"//g'` /mnt/nvme1 ext4 defaults 0 2 >> /etc/fstab

#检查

检查 UUID

echo "检查 fstab 中的 UUID 与实际分区是否一致..."

UUID_NVME=$(sudo blkid -o value -s UUID /dev/nvme1n1p1)

UUID_FSTAB=(grep -oP 'UUID=\\K\[\^ \]+' /etc/fstab \| grep "UUID_NVME")

if "$UUID_FSTAB" != "$UUID_NVME" ; then

echo "错误:fstab 中的 UUID 与实际分区不一致。"

exit 1

else

echo "UUID 检查通过。"

fi

测试 fstab 设置是否正确

echo "测试 fstab 配置..."

sudo mount -a

if $? -ne 0 ; then

echo "错误:fstab 配置测试失败,请检查 fstab 文件的格式和设置。"

exit 1

else

echo "fstab 配置测试通过。"

fi

验证挂载点

echo "验证挂载点是否挂载成功..."

MOUNT_POINT=$(mount | grep nvme1n1p1)

if -z "$MOUNT_POINT" ; then

echo "错误:/dev/nvme1n1p1 分区没有被挂载到预期的挂载点。"

exit 1

else

echo "/dev/nvme1n1p1 分区挂载成功。"

fi

echo "所有检查已通过,没有检测到问题。"

复制代码
#!/bin/bash

# 函数:检查分区是否已挂载
is_mounted() {
  local PARTITION=$1
  mount | grep -q "$PARTITION"
  return $?
}

# 函数:为磁盘创建新分区
create_partition() {
  local DEVICE=$1
  echo -e "n\np\n1\n\n\nw" | sudo fdisk $DEVICE
  local PARTITION="${DEVICE}p1"
  echo $PARTITION
}

# 函数:格式化分区
format_partition() {
  local PARTITION=$1
  sudo mkfs.ext4 $PARTITION
}

# 函数:挂载分区
do_mount() {
  local PARTITION=$1
  local MOUNTPOINT=$2
  sudo mkdir -p $MOUNTPOINT
  sudo mount $PARTITION $MOUNTPOINT
}

# 函数:更新 fstab 文件
update_fstab() {
  local PARTITION=$1
  local MOUNTPOINT=$2
  sudo cp /etc/fstab /etc/fstab.bak
  local UUID=$(sudo blkid -o value -s UUID $PARTITION)
  echo "UUID=$UUID $MOUNTPOINT ext4 defaults 0 2" | sudo tee -a /etc/fstab
}

# 函数:检查挂载和 fstab
check_mount_and_fstab() {
  local PARTITION=$1
  local MOUNTPOINT=$2
  
  # 检查 UUID
  echo "检查 fstab 中的 UUID 与实际分区是否一致..."
  local UUID=$(sudo blkid -o value -s UUID $PARTITION)
  local UUID_FSTAB=$(grep -w "$UUID" /etc/fstab)
  if [ -z "$UUID_FSTAB" ]; then
    echo "错误:fstab 中的 UUID 与实际分区不一致。"
    exit 1
  else
    echo "UUID 检查通过。"
  fi
  
  # 测试 fstab 设置是否正确
  echo "测试 fstab 配置..."
  sudo mount -o remount $MOUNTPOINT
  if [ $? -ne 0 ]; then
    echo "错误:fstab 配置测试失败,请检查 fstab 文件的格式和设置。"
    exit 1
  else
    echo "fstab 配置测试通过。"
  fi
  
  # 验证挂载点是否挂载成功
  echo "验证挂载点是否挂载成功..."
  if ! mount | grep -q "$MOUNTPOINT"; then
    echo "错误:$PARTITION 分区没有被挂载到预期的挂载点。"
    exit 1
  else
    echo "$PARTITION 分区挂载成功。"
  fi
}

# 主函数
main() {
  # 设备和挂载点的数组
  declare -A DEVICES=( ["nvme0n1"]="/mnt/nvme0" ["nvme1n1"]="/mnt/nvme1" ["nvme2n1"]="/mnt/nvme2" ["nvme3n1"]="/mnt/nvme3" )
  
  # 展示所有盘信息
  lsblk

  # 遍历所有 NVMe 设备
  for DEVICE in "${!DEVICES[@]}"; do
    echo "处理设备 /dev/$DEVICE ..."

    # 检查是否有分区已挂载
    if ! is_mounted "/dev/${DEVICE}p1"; then
      echo "没有挂载的分区,正在创建新分区并挂载..."
      
      # 创建并格式化分区
      PARTITION=$(create_partition "/dev/$DEVICE")
      format_partition "$PARTITION"
      
      # 挂载分区和更新 fstab
      do_mount "$PARTITION" "${DEVICES[$DEVICE]}"
      update_fstab "$PARTITION" "${DEVICES[$DEVICE]}"
      
      # 检查挂载和 fstab 更新
      check_mount_and_fstab "$PARTITION" "${DEVICES[$DEVICE]}"
      
      echo "/dev/$DEVICE 分区创建并挂载完成。"
    else
      echo
相关推荐
桌管小李1 分钟前
终端安全一体化实战:AI 审计、行为分析、零信任、防拍照与远程运维全解析
运维·服务器·网络·人工智能·windows·安全·macos
流星白龙22 分钟前
【Docker】14.存储卷与管理卷Volume
运维·docker·容器
迪康Defender34 分钟前
端点安全选型观察:一体化平台与传统 EDR 的场景差异
运维·经验分享·安全·自动化·学习方法·远程工作·安全架构
amcomputer37 分钟前
Docker 常用命令总结:从安装到日常使用
运维·docker·容器
ZKNOW甄知科技43 分钟前
燕千云迭代版本发布:智能Agent深入业务现场
运维·人工智能·低代码·机器学习·自然语言处理·自动化·aigc
张张123y1 小时前
2026 Agent 框架怎么选?拆 3 层底层逻辑(运行循环 / 记忆 / 工具协议)+ 一张决策表
linux·ubuntu·microsoft·langgraph·mcp·crewai·agent 框架
零域行者1 小时前
Linux入门基础命令
linux·服务器·安全·web安全
打工仔折腾 AI1 小时前
Linux 网络编程:从零掌握 TCP Socket 编程与 C++ 实战落地
linux·网络·人工智能·后端·python·tcp/ip·性能优化
FY@-@1 小时前
云计算基础(下):虚拟化原理与 DAS/NAS/SAN 存储
运维·服务器·云计算