Linux 磁盘管理

一、磁盘基础概念

1.1 磁盘类型

  • HDD(机械硬盘):传统磁盘,容量大,价格低
  • SSD(固态硬盘):速度快,无机械部件
  • NVMe SSD:PCIe接口,速度最快

1.2 磁盘命名规则

bash 复制代码
# SATA/SAS/USB 磁盘
/dev/sda     # 第一块磁盘
/dev/sdb     # 第二块磁盘
/dev/sdc     # 第三块磁盘

# 分区
/dev/sda1    # 第一块磁盘的第一个分区
/dev/sda2    # 第一块磁盘的第二个分区

# NVMe 磁盘
/dev/nvme0n1     # 第一个NVMe磁盘
/dev/nvme0n1p1   # 第一个NVMe磁盘的第一个分区
/dev/nvme1n1     # 第二个NVMe磁盘

# 虚拟磁盘
/dev/vda     # 虚拟化环境中的磁盘
/dev/xvda    # Xen虚拟化环境

# 旧IDE磁盘(已淘汰)
/dev/hda     # 主IDE主盘
/dev/hdb     # 主IDE从盘

二、磁盘信息查看命令

2.1 lsblk - 列出块设备

命令格式:

bash 复制代码
lsblk [选项] [设备]

常用选项:

  • -a:显示所有设备(包括空设备)
  • -f:显示文件系统类型
  • -m:显示权限信息
  • -p:显示完整设备路径
  • -o:指定输出列
  • -d:只显示磁盘,不显示分区
  • -S:只显示SCSI设备
  • -t:显示拓扑信息

使用示例:

bash 复制代码
# 基本查看
lsblk
# 输出:
# NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
# sda      8:0    0 238.5G  0 disk
# ├─sda1   8:1    0   512M  0 part /boot/efi
# ├─sda2   8:2    0   488M  0 part /boot
# └─sda3   8:3    0 237.5G  0 part
#   ├─ubuntu--vg-root 253:0    0  50G  0 lvm  /
#   └─ubuntu--vg-swap 253:1    0   4G  0 lvm  [SWAP]

# 显示文件系统信息
lsblk -f
# 输出:
# NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
# sda
# ├─sda1 vfat         C5A3-1234                            /boot/efi
# ├─sda2 ext4         12345678-1234-1234-1234-1234567890ab /boot
# └─sda3 LVM2_member  87654321-4321-4321-4321-0987654321ba
#   ├─ubuntu--vg-root ext4   abcdef12-3456-7890-abcd-ef1234567890 /
#   └─ubuntu--vg-swap swap   09876543-2109-8765-4321-098765432109 /

# 显示完整设备路径
lsblk -p
# 输出:
# /dev/sda
# ├─/dev/sda1
# ├─/dev/sda2
# └─/dev/sda3

# 自定义输出列
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,LABEL
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,LABEL,STATE

# 显示设备拓扑结构
lsblk -t
# 显示设备的主从关系、SCSI地址等

# 只显示磁盘(不显示分区)
lsblk -d
lsblk -d -o NAME,SIZE,TYPE,ROTA  # ROTA=1是HDD,ROTA=0是SSD

# 树状显示(默认)
lsblk --tree

# JSON格式输出
lsblk -J
lsblk -o NAME,SIZE,TYPE --json

# 获取特定设备信息
lsblk /dev/sda
lsblk /dev/nvme0n1

2.2 fdisk - 磁盘分区表操作

命令格式:

bash 复制代码
fdisk [选项] 设备

常用选项:

  • -l:列出分区表
  • -u:显示分区大小时使用扇区数
  • -s:显示分区大小(块数)
  • -v:显示版本信息

交互模式常用命令:

  • m:显示帮助菜单
  • p:打印分区表
  • n:新建分区
  • d:删除分区
  • t:更改分区类型
  • w:保存并退出
  • q:不保存退出
  • g:创建新的GPT分区表
  • o:创建新的DOS分区表

使用示例:

bash 复制代码
# 查看所有磁盘分区表
sudo fdisk -l

# 查看特定磁盘
sudo fdisk -l /dev/sda
sudo fdisk -l /dev/nvme0n1

# 以扇区为单位显示
sudo fdisk -lu /dev/sda

# 进入交互分区模式
sudo fdisk /dev/sdb
# 进入后输入 m 查看可用命令

# 创建分区的完整示例
sudo fdisk /dev/sdb
# 命令序列:
# g     # 创建GPT分区表(或 o 创建MBR分区表)
# n     # 新建分区
# 1     # 分区号
#       # 起始扇区(默认)
# +20G  # 分区大小
# n     # 再建一个分区
# 2     # 分区号
#       # 起始扇区(默认)
# +30G  # 分区大小
# t     # 更改分区类型
# 1     # 选择分区1
# 1     # 类型1:EFI系统分区(GPT)或 83:Linux(MBR)
# w     # 保存并退出

# 查看分区类型代码
sudo fdisk /dev/sdb
# 输入:l  # 列出已知分区类型

2.3 parted - 高级分区工具(支持GPT)

命令格式:

bash 复制代码
parted [选项] [设备 [命令]]

常用选项:

  • -l:列出所有磁盘分区
  • -s:脚本模式,不交互
  • -a optimal:对齐分区

交互模式常用命令:

  • help:显示帮助
  • print:显示分区表
  • mklabel:创建分区表(msdos/gpt)
  • mkpart:创建分区
  • rm:删除分区
  • resizepart:调整分区大小
  • set:设置分区标志
  • quit:退出

使用示例:

bash 复制代码
# 查看磁盘分区
sudo parted -l

# 查看特定磁盘
sudo parted /dev/sdb print

# 进入交互模式
sudo parted /dev/sdb

# 创建GPT分区表
sudo parted /dev/sdb mklabel gpt

# 创建分区(交互模式)
sudo parted /dev/sdb
# 命令序列:
# mkpart primary ext4 1MB 20GB
# mkpart primary linux-swap 20GB 24GB
# mkpart primary ext4 24GB 100%

# 脚本模式创建分区
sudo parted -s /dev/sdb mklabel gpt
sudo parted -s /dev/sdb mkpart primary ext4 1MiB 20GiB
sudo parted -s /dev/sdb mkpart primary linux-swap 20GiB 24GiB
sudo parted -s /dev/sdb mkpart primary ext4 24GiB 100%

# 设置分区标志
sudo parted /dev/sdb set 1 boot on  # 设置启动标志

# 删除分区
sudo parted /dev/sdb rm 1

# 调整分区大小(需要先卸载)
sudo parted /dev/sdb resizepart 2 30GB

# 显示单位
sudo parted /dev/sdb unit GB print
sudo parted /dev/sdb unit s print   # 扇区
sudo parted /dev/sdb unit MB print

2.4 blkid - 查看块设备属性

命令格式:

bash 复制代码
blkid [选项] [设备]

常用选项:

  • -L:根据LABEL查找设备
  • -U:根据UUID查找设备
  • -o:指定输出格式
  • -p:探测低级信息
  • -s:显示指定标签

使用示例:

bash 复制代码
# 显示所有块设备信息
sudo blkid

# 显示特定设备
sudo blkid /dev/sda1

# 根据UUID查找设备
sudo blkid -U "12345678-1234-1234-1234-1234567890ab"

# 根据LABEL查找设备
sudo blkid -L "MY_DATA"

# 只显示特定信息
sudo blkid -s UUID
sudo blkid -s TYPE
sudo blkid -s UUID -s TYPE

# 格式化输出
sudo blkid -o list
sudo blkid -o full
sudo blkid -o value -s UUID  # 只输出UUID值

# 探测新设备
sudo blkid -p /dev/sdb1

# 查看所有ext4文件系统
sudo blkid -t TYPE=ext4

2.5 hdparm - 硬盘参数工具

命令格式:

bash 复制代码
hdparm [选项] 设备

常用选项:

  • -I:显示详细磁盘信息
  • -t:测试读取速度
  • -T:测试缓存读取速度
  • -g:显示磁盘几何参数
  • -S:设置待机超时
  • -y:使硬盘进入待机模式
  • -Y:使硬盘进入睡眠模式
  • -f:同步和刷新缓冲区
  • -r:只读模式(1=只读,0=读写)

使用示例:

bash 复制代码
# 查看磁盘详细信息
sudo hdparm -I /dev/sda

# 测试磁盘读取性能
sudo hdparm -tT /dev/sda
# 输出:
# Timing cached reads:   10000 MB in  2.00 seconds = 5000.00 MB/sec
# Timing buffered disk reads: 500 MB in  3.00 seconds = 166.67 MB/sec

# 显示磁盘几何参数
sudo hdparm -g /dev/sda

# 设置待机超时(省电)
sudo hdparm -S 120 /dev/sda  # 10分钟无活动后待机

# 启用/禁用写入缓存
sudo hdparm -W 1 /dev/sda    # 启用写入缓存
sudo hdparm -W 0 /dev/sda    # 禁用写入缓存

# 安全擦除(SSD)
sudo hdparm --user-master u --security-set-pass p /dev/sda
sudo hdparm --user-master u --security-erase p /dev/sda

# 检查磁盘状态
sudo hdparm -C /dev/sda
# 输出:active/idle, standby, sleeping

# 获取序列号
sudo hdparm -i /dev/sda | grep SerialNo

三、文件系统管理

3.1 mkfs - 创建文件系统

命令格式:

bash 复制代码
mkfs.类型 [选项] 设备

常用选项:

  • -L:设置卷标
  • -m:设置保留空间百分比(默认5%)
  • -t:指定类型
  • -c:检查坏块
  • -f:强制创建
  • -V:详细输出

常用文件系统:

  • ext4:Linux最常用
  • xfs:高性能,大文件支持好
  • btrfs:支持快照、压缩等高级特性
  • vfat:Windows兼容(U盘常用)
  • ntfs:Windows NT文件系统
  • swap:交换分区

使用示例:

bash 复制代码
# 格式化为ext4
sudo mkfs.ext4 /dev/sdb1
sudo mkfs -t ext4 /dev/sdb1

# 格式化为xfs
sudo mkfs.xfs /dev/sdb2
sudo mkfs -t xfs /dev/sdb2

# 格式化为btrfs
sudo mkfs.btrfs /dev/sdb3

# 格式化为vfat(FAT32)
sudo mkfs.vfat /dev/sdb4
sudo mkfs -t vfat /dev/sdb4

# 格式化为NTFS
sudo mkfs.ntfs /dev/sdb5
sudo apt install ntfs-3g  # 需要先安装

# 创建交换分区
sudo mkswap /dev/sdb6
sudo swapon /dev/sdb6

# 带标签格式化
sudo mkfs.ext4 -L "DATA_DISK" /dev/sdb1
sudo mkfs.xfs -L "BACKUP" /dev/sdb2

# 指定块大小
sudo mkfs.ext4 -b 4096 /dev/sdb1  # 4KB块大小

# 保留部分空间(给root)
sudo mkfs.ext4 -m 1 /dev/sdb1  # 保留1%给root

# 强制格式化(不询问)
sudo mkfs.ext4 -F /dev/sdb1

# 显示详细信息
sudo mkfs.ext4 -V /dev/sdb1

3.2 fsck - 检查修复文件系统

命令格式:

bash 复制代码
fsck [选项] [文件系统...]

常用选项:

  • -A:检查/etc/fstab中的所有文件系统
  • -C:显示进度条
  • -M:不检查已挂载的文件系统
  • -N:只显示做什么,不执行
  • -P:并行检查文件系统
  • -R:使用-A时跳过根文件系统
  • -t:指定文件系统类型
  • -y:对所有问题回答yes
  • -n:对所有问题回答no
  • -p:自动修复(不询问)

使用示例:

bash 复制代码
# 检查ext4文件系统
sudo fsck /dev/sda1
sudo fsck.ext4 /dev/sda1

# 自动修复
sudo fsck -p /dev/sda1

# 强制检查(即使已挂载,危险!)
sudo fsck -f /dev/sda1

# 检查所有文件系统
sudo fsck -A

# 交互式修复
sudo fsck -r /dev/sda1

# 指定文件系统类型
sudo fsck -t ext4 /dev/sda1

3.3 tune2fs - 调整ext2/3/4文件系统参数

命令格式:

bash 复制代码
tune2fs [选项] 设备

常用选项:

  • -c:设置最大挂载次数
  • -i:检查间隔(d-天,w-周,m-月)
  • -L:设置卷标
  • -m:保留块百分比
  • -j:添加ext3日志
  • -U:设置UUID
  • -O:启用或禁用特性

使用示例:

bash 复制代码
# 查看文件系统信息
sudo tune2fs -l /dev/sda1

# 设置最大挂载次数
sudo tune2fs -c 30 /dev/sda1

# 设置检查间隔(每3个月)
sudo tune2fs -i 3m /dev/sda1

# 设置卷标
sudo tune2fs -L "ROOT" /dev/sda1

# 设置保留块百分比
sudo tune2fs -m 5 /dev/sda1

# 添加ext3日志(将ext2转为ext3)
sudo tune2fs -j /dev/sda1

# 生成新的UUID
sudo tune2fs -U random /dev/sda1

# 禁用时间戳(用于数据库等)
sudo tune2fs -O ^has_journal,^extent /dev/sda1       

3.4 xfs_admin - 管理XFS文件系统

命令格式:

bash 复制代码
xfs_admin [选项] 设备

常用选项:

  • -e:启用32位项目编号
  • -f:强制操作
  • -j:启用版本2日志(默认)
  • -l:打印卷标
  • -p:启用project配额
  • -u:打印UUID
  • -U:设置UUID
  • -L:设置卷标

使用示例:

bash 复制代码
# 查看XFS信息
sudo xfs_admin -l -u /dev/sdb1

# 设置卷标
sudo xfs_admin -L "DATA" /dev/sdb1

# 生成新UUID
sudo xfs_admin -U generate /dev/sdb1

# 启用项目配额
sudo xfs_admin -p /dev/sdb1    

四、磁盘挂载管理

4.1 mount - 挂载文件系统

命令格式:

bash 复制代码
mount [选项] [设备] [挂载点]

常用选项:

  • -a:挂载/etc/fstab中的所有文件系统
  • -f:模拟挂载(不实际执行)
  • -F:为每个设备fork新进程
  • -n:不写入/etc/mtab
  • -o:挂载选项(逗号分隔)
  • -r:只读挂载
  • -t:文件系统类型
  • -v:详细输出
  • -w:读写挂载(默认)

使用示例:

bash 复制代码
# 基本挂载
sudo mount /dev/sdb1 /mnt/data

# 指定文件系统类型
sudo mount -t ext4 /dev/sdb1 /mnt/data
sudo mount -t xfs /dev/sdb1 /mnt/video

# 只读挂载
sudo mount -o ro /dev/sdb1 /mnt/backup

# 设置挂载选项
sudo mount -o noatime,nodiratime /dev/sdb1 /mnt/data
sudo mount -o defaults,noexec /dev/sdb1 /mnt/downloads

# 挂载所有文件系统
sudo mount -a

# 绑定挂载(目录挂载到另一个位置)
sudo mount --bind /var/www /mnt/www

# 重新挂载(如改为只读)
sudo mount -o remount,ro /mnt/data

# 移动挂载点
sudo mount --move /mnt/old /mnt/new

# 挂载ISO文件
sudo mount -o loop ubuntu.iso /mnt/iso

# 挂载NFS共享
sudo mount -t nfs server:/share /mnt/nfs  

4.2 umount - 卸载文件系统

命令格式:

bash 复制代码
umount [选项] {设备|挂载点}

常用选项:

  • -a:卸载/etc/mtab中的所有文件系统
  • -f:强制卸载(文件系统忙时)
  • -d:如果使用了loop设备也释放
  • -l:延迟卸载(断开连接,等不忙时清理)
  • -n:不写入/etc/mtab
  • -r:如果卸载失败,尝试只读重新挂载
  • -t:只卸载指定类型的文件系统
  • -v:详细输出

使用示例:

bash 复制代码
# 通过挂载点卸载
sudo umount /mnt/data

# 通过设备卸载
sudo umount /dev/sdb1

# 强制卸载(当设备忙时)
sudo umount -f /mnt/data

# 延迟卸载
sudo umount -l /mnt/data

# 卸载所有文件系统(除了根)
sudo umount -a

# 卸载指定类型的文件系统
sudo umount -a -t nfs

五、磁盘空间管理

5.1 df - 磁盘空间使用情况

bash 复制代码
# 基本使用
df                              # 显示所有文件系统
df -h                           # 人性化显示(K/M/G/T)
df -H                           # 1000进制而非1024
df -T                           # 显示文件系统类型
df -t ext4                      # 只显示ext4文件系统
df -x tmpfs                     # 排除tmpfs
df -i                           # 显示inode使用情况
df -a                           # 显示所有文件系统
df --total                      # 显示总计
df -l                           # 只显示本地文件系统
df -P                           # POSIX格式(无换行)

# 实用示例:
df -hT                          # 查看类型和使用率
df -h /home                     # 查看特定目录
df -ih                          # 查看inode使用(人性化)
df -h --output=source,fstype,size,used,avail,pcent,target  # 自定义输出

# 监控脚本示例:
#!/bin/bash
THRESHOLD=80
for line in $(df -hP | awk 'NR>1 {print $5 " " $6}' | sed 's/%//'); do
    usage=$(echo $line | awk '{print $1}')
    mount=$(echo $line | awk '{print $2}')
    if [ $usage -ge $THRESHOLD ]; then
        echo "警告: $mount 使用率 ${usage}%"
    fi
done

5.2 du - 目录空间使用

bash 复制代码
# 基本使用
du                              # 当前目录大小
du -sh /home                    # 查看/home总大小
du -sh *                        # 查看当前目录所有项目大小
du -h --max-depth=1 /var        # 查看/var一级目录大小

# 高级选项:
du -c                          # 显示总计
du -a                          # 显示所有文件
du -d 2                        # 限制深度为2级
du -x                          # 不跨越文件系统边界
du -t 100M                     # 只显示大于100M的
du --time                      # 显示修改时间
du --apparent-size             # 显示逻辑大小
du --exclude="*.log"           # 排除日志文件
du --exclude-dir=node_modules  # 排除目录

# 实用组合:
# 查找最大的10个目录
du -ah / | sort -rh | head -10
# 查找最大的10个文件
find / -type f -exec du -sh {} + 2>/dev/null | sort -rh | head -10
# 按大小排序目录
du -sh /* 2>/dev/null | sort -h
# 查找特定类型大文件
find / -type f -name "*.mp4" -exec du -sh {} + 2>/dev/null | sort -rh

# 排除多个目录
du -sh --exclude={dir1,dir2,*.tmp} /path

六、交换空间管理

6.1 mkswap - 创建交换空间

命令格式:

bash 复制代码
mkswap [选项] 设备 [大小]

常用选项:

  • -c:检查坏块
  • -f:强制创建
  • -L:设置标签
  • -p:设置页大小
  • -U:设置UUID
  • -v:详细输出

使用示例:

bash 复制代码
# 创建交换分区
sudo mkswap /dev/sdb2

# 创建带标签的交换分区
sudo mkswap -L "SWAP" /dev/sdb2

# 检查坏块
sudo mkswap -c /dev/sdb2

# 设置UUID
sudo mkswap -U 1234-5678 /dev/sdb2

6.2 swapon - 启用交换空间

命令格式:

bash 复制代码
swapon [选项] [设备]

常用选项:

  • -a:启用/etc/fstab中的所有交换设备
  • -d:启用discard(TRIM)支持
  • -e:只启用存在的设备
  • -f:重新初始化页大小
  • -p:设置优先级(0-32767)
  • -s:显示交换空间摘要

使用示例:

bash 复制代码
# 启用交换分区
sudo swapon /dev/sdb2

# 启用所有交换设备
sudo swapon -a

# 显示交换空间信息
sudo swapon -s
cat /proc/swaps       # 同样效果
free -h               # 查看内存和交换空间使用

# 设置优先级(优先级高的先使用)
sudo swapon -p 100 /dev/sdb2

# 启用TRIM支持(SSD优化)
sudo swapon -d /dev/sdb2

6.3 swapoff - 禁用交换空间

命令格式:

bash 复制代码
swapoff [选项] [设备]

常用选项:

  • -a:禁用所有交换设备
  • -v:详细输出

使用示例:

bash 复制代码
# 禁用交换分区
sudo swapoff /dev/sdb2

# 禁用所有交换设备
sudo swapoff -a

# 安全关闭交换(先同步数据)
sync && sudo swapoff -a

6.4 交换文件管理

bash 复制代码
# 创建交换文件
sudo fallocate -l 4G /swapfile      # 创建4GB交换文件(推荐)
# 或
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096  # 传统方式

# 设置权限
sudo chmod 600 /swapfile

# 格式化为交换空间
sudo mkswap /swapfile

# 启用交换文件
sudo swapon /swapfile

# 永久启用(添加到fstab)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# 调整swappiness(交换倾向)
cat /proc/sys/vm/swappiness        # 默认值通常为60
sudo sysctl vm.swappiness=10       # 临时修改
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf  # 永久修改

七、逻辑卷管理(LVM)

7.1 LVM 基本概念

LVM(Logical Volume Manager) 是Linux系统中用于管理磁盘分区的系统,提供比传统分区更灵活的磁盘管理方式。

7.2 LVM 核心组件

7.2.1 物理卷(Physical Volume, PV)

  • 基础存储单元,可以是硬盘分区、整个硬盘或RAID设备
  • 使用 pvcreate 命令创建
bash 复制代码
# pvcreate - 创建物理卷
sudo pvcreate /dev/sdb /dev/sdc

# pvdisplay - 显示物理卷信息
sudo pvdisplay
sudo pvdisplay /dev/sdb

# pvs - 简要显示物理卷
sudo pvs

# pvscan - 扫描所有物理卷
sudo pvscan

# pvremove - 删除物理卷
sudo pvremove /dev/sdc

# pvmove - 移动物理卷上的数据
sudo pvmove /dev/sdb /dev/sdc
sudo pvmove /dev/sdb    # 移动到同VG的其他PV

# pvresize - 调整物理卷大小
sudo pvresize /dev/sdb
sudo pvresize --setphysicalvolumesize 100G /dev/sdb

7.2.2 卷组(Volume Group, VG)

  • 由一个或多个物理卷组成的存储池
  • 在VG上可以创建逻辑卷
bash 复制代码
# vgcreate - 创建卷组
sudo vgcreate vg_data /dev/sdb /dev/sdc

# vgdisplay - 显示卷组信息
sudo vgdisplay
sudo vgdisplay vg_data

# vgs - 简要显示卷组
sudo vgs

# vgextend - 扩展卷组(添加物理卷)
sudo vgextend vg_data /dev/sdd

# vgreduce - 缩减卷组(移除物理卷)
sudo vgreduce vg_data /dev/sdc
# 需要先移动数据:sudo pvmove /dev/sdc

# vgremove - 删除卷组
sudo vgremove vg_data

# vgrename - 重命名卷组
sudo vgrename old_vg new_vg

# vgscan - 扫描所有卷组
sudo vgscan

# vgsplit - 拆分卷组
sudo vgsplit vg_data vg_new /dev/sdd

# vgmerge - 合并卷组
sudo vgmerge vg_data vg_new

7.2.3 逻辑卷(Logical Volume, LV)

  • 从卷组中划分出来的逻辑存储单元
  • 可以像普通分区一样格式化和挂载
bash 复制代码
# lvcreate - 创建逻辑卷
sudo lvcreate -L 20G -n lv_home vg_data           # 指定大小
sudo lvcreate -l 100%FREE -n lv_data vg_data      # 使用所有空间
sudo lvcreate -L 10G -s -n lv_snapshot vg_data/lv_home  # 创建快照

# lvdisplay - 显示逻辑卷信息
sudo lvdisplay
sudo lvdisplay /dev/vg_data/lv_home

# lvs - 简要显示逻辑卷
sudo lvs

# lvextend - 扩展逻辑卷
sudo lvextend -L +10G /dev/vg_data/lv_home        # 增加10G
sudo lvextend -L 30G /dev/vg_data/lv_home         # 设为30G
sudo lvextend -l +100%FREE /dev/vg_data/lv_home   # 使用所有空闲空间

# lvreduce - 缩减逻辑卷(危险!先备份数据)
sudo lvreduce -L -5G /dev/vg_data/lv_home
# 需要先缩小文件系统

# lvremove - 删除逻辑卷
sudo lvremove /dev/vg_data/lv_home

# lvrename - 重命名逻辑卷
sudo lvrename vg_data lv_old lv_new

# lvresize - 调整逻辑卷大小
sudo lvresize -L 25G /dev/vg_data/lv_home

# lvscan - 扫描所有逻辑卷
sudo lvscan

# lvconvert - 转换逻辑卷类型
sudo lvconvert --type raid1 /dev/vg_data/lv_home  # 转换为RAID1

7.3 LVM 完整示例

bash 复制代码
#!/bin/bash
# LVM配置示例

# 1. 创建物理卷
sudo pvcreate /dev/sdb /dev/sdc

# 2. 创建卷组
sudo vgcreate vg_storage /dev/sdb /dev/sdc

# 3. 创建逻辑卷
sudo lvcreate -L 50G -n lv_home vg_storage
sudo lvcreate -L 100G -n lv_data vg_storage
sudo lvcreate -l 100%FREE -n lv_backup vg_storage

# 4. 创建文件系统
sudo mkfs.ext4 /dev/vg_storage/lv_home
sudo mkfs.xfs /dev/vg_storage/lv_data
sudo mkfs.ext4 /dev/vg_storage/lv_backup

# 5. 挂载使用
sudo mkdir -p /{home2,data,backup}
echo "/dev/vg_storage/lv_home /home2 ext4 defaults 0 2" | sudo tee -a /etc/fstab
echo "/dev/vg_storage/lv_data /data xfs defaults 0 2" | sudo tee -a /etc/fstab
echo "/dev/vg_storage/lv_backup /backup ext4 defaults 0 2" | sudo tee -a /etc/fstab
sudo mount -a

# 6. 扩展逻辑卷(当需要更多空间时)
# 添加新磁盘
sudo pvcreate /dev/sdd
sudo vgextend vg_storage /dev/sdd
sudo lvextend -L +50G /dev/vg_storage/lv_data
sudo xfs_growfs /data  # 对于XFS文件系统
# 对于ext4:sudo resize2fs /dev/vg_storage/lv_data

八、RAID 管理

8.1 RAID 基本概念

RAID(Redundant Array of Independent Disks)即独立磁盘冗余阵列,通过将多个磁盘组合成一个逻辑单元来提高性能、可靠性和/或容量。

8.2 mdadm - 管理RAID阵列

命令格式:

bash 复制代码
mdadm [模式] <raid设备> [选项] <组件设备>

模式:

  • --create, -C:创建新阵列
  • --assemble, -A:组装已存在的阵列
  • --manage, --add, --remove:管理阵列
  • --detail, -D:显示详细信息
  • --stop, -S:停止阵列
  • --examine, -E:检查组件设备
  • --grow, -G:调整阵列大小

使用示例:

bash 复制代码
# 创建RAID阵列示例
# RAID 0(条带化)
sudo mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc

# RAID 1(镜像)
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

# RAID 5(带奇偶校验的条带化)
sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

# RAID 6(双重奇偶校验)
sudo mdadm --create /dev/md0 --level=6 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# RAID 10(镜像+条带化)
sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# 查看RAID信息
sudo mdadm --detail /dev/md0
cat /proc/mdstat

# 组装已存在的阵列
sudo mdadm --assemble /dev/md0 /dev/sdb /dev/sdc

# 添加热备盘
sudo mdadm --add /dev/md0 /dev/sde

# 移除故障盘
sudo mdadm --remove /dev/md0 /dev/sdb

# 停止阵列
sudo mdadm --stop /dev/md0

# 监控RAID状态
watch cat /proc/mdstat

# 保存配置
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u

8.3 RAID 故障恢复

bash 复制代码
# 模拟故障
sudo mdadm /dev/md0 --fail /dev/sdb

# 查看故障状态
cat /proc/mdstat
# [U_] 表示一个设备故障

# 移除故障设备
sudo mdadm /dev/md0 --remove /dev/sdb

# 添加新设备
sudo mdadm /dev/md0 --add /dev/sde

# 监控重建进度
watch cat /proc/mdstat
# [UU] 表示重建完成

# 从故障中恢复数据
# 1. 停止RAID
sudo mdadm --stop /dev/md0
# 2. 强制组装(一个设备)
sudo mdadm --assemble --force /dev/md0 /dev/sdc
# 3. 挂载为只读
sudo mount -o ro /dev/md0 /mnt
# 4. 备份数据
sudo rsync -av /mnt/ /backup/

九、磁盘性能监控与优化

9.1 iostat - 监控磁盘I/O

命令格式:

bash 复制代码
iostat [选项] [间隔秒数] [统计次数]

常用选项:

  • -c:显示CPU使用率
  • -d:显示设备使用率
  • -h:人类可读格式
  • -k:以KB为单位
  • -m:以MB为单位
  • -p [设备]:显示指定设备或所有设备
  • -t:显示时间戳
  • -x:显示扩展统计信息
  • -y:跳过第一个报告(显示启动后的统计)
  • -z:跳过零活动设备

使用示例:

bash 复制代码
iostat                      # 显示一次报告
iostat 2                    # 每2秒显示一次
iostat 1 5                  # 每1秒显示一次,共5次
iostat -dx                  # 显示扩展设备统计
iostat -dm 2 3              # 以MB为单位,每2秒一次,共3次
iostat -p sda               # 显示sda的详细统计
iostat -t                   # 带时间戳
iostat -xz 1                # 扩展统计,跳过零活动设备

9.2 iotop - 监控进程磁盘I/O

bash 复制代码
# 安装
sudo apt install iotop      # Debian/Ubuntu
sudo yum install iotop      # RHEL/CentOS

# 常用选项
-o, --only           # 只显示正在执行I/O的进程
-b, --batch          # 非交互模式
-n NUM               # 在非交互模式下迭代次数
-d SEC               # 刷新间隔(秒)
-P, --processes      # 只显示进程
-k, --kilobytes      # 使用KB而非B
-t, --time           # 添加时间戳
-u, --user USER      # 只显示指定用户的进程
-p PID, --pid PID    # 只显示指定PID的进程
-a, --accumulated    # 显示累计I/O

# 使用示例
sudo iotop                    # 实时监控
sudo iotop -o                 # 只显示活跃I/O的进程
sudo iotop -b -n 5            # 批处理模式,输出5次
sudo iotop -d 2               # 每2秒刷新
sudo iotop -u mysql           # 只显示mysql用户的I/O
sudo iotop -p 1234            # 只显示PID 1234
sudo iotop -a                 # 显示累计I/O

9.3 fio - 灵活I/O测试器

bash 复制代码
# 安装
sudo apt install fio         # Debian/Ubuntu
sudo yum install fio         # RHEL/CentOS

# 基本测试示例
# 顺序读测试
fio --name=seq_read --rw=read --direct=1 --bs=1M --size=1G --numjobs=1 --runtime=60 --time_based --group_reporting

# 顺序写测试
fio --name=seq_write --rw=write --direct=1 --bs=1M --size=1G --numjobs=1 --runtime=60 --time_based --group_reporting

# 随机读写测试
fio --name=rand_rw --rw=randrw --direct=1 --bs=4k --size=1G --numjobs=4 --runtime=60 --time_based --group_reporting

# 使用配置文件
cat > test.fio << EOF
[global]
ioengine=libaio
direct=1
size=1G
runtime=60
time_based
group_reporting

[seq-read]
rw=read
bs=1M

[seq-write]
rw=write
bs=1M

[rand-read]
rw=randread
bs=4k
numjobs=4

[rand-write]
rw=randwrite
bs=4k
numjobs=4
EOF

fio test.fio

9.4 hdparm - 硬盘参数测试

bash 复制代码
# 基本格式
hdparm [选项] 设备

# 性能测试
sudo hdparm -Tt /dev/sda     # 缓存和磁盘读取速度测试

# 查看信息
sudo hdparm -I /dev/sda      # 显示详细信息
sudo hdparm -i /dev/sda      # 显示基本信息

# 设置参数
sudo hdparm -S 120 /dev/sda  # 设置待机超时(12分钟)
sudo hdparm -B 127 /dev/sda  # 设置高级电源管理
sudo hdparm -M 128 /dev/sda  # 设置噪音管理

# 安全擦除(SSD优化)
sudo hdparm --user-master u --security-set-pass pwd /dev/sda
sudo hdparm --user-master u --security-erase pwd /dev/sda

十、磁盘维护与故障处理

10.1 坏道检测与修复

bash 复制代码
# badblocks - 检查坏道
sudo badblocks -v /dev/sda           # 只读检测
sudo badblocks -sv /dev/sda          # 非破坏性读写检测
sudo badblocks -wsv /dev/sda         # 破坏性写测试(会破坏数据!)

# 配合e2fsck标记坏道
sudo badblocks -v /dev/sda > badblocks.txt
sudo e2fsck -l badblocks.txt /dev/sda1

# smartctl - SMART监控(需要安装smartmontools)
sudo apt install smartmontools       # Debian/Ubuntu
sudo smartctl -a /dev/sda            # 显示所有SMART信息
sudo smartctl -H /dev/sda            # 显示健康状态
sudo smartctl -t short /dev/sda      # 开始短测试
sudo smartctl -t long /dev/sda       # 开始长测试
sudo smartctl -l selftest /dev/sda   # 显示测试日志

10.2 磁盘对齐检查(SSD优化)

bash 复制代码
# 检查分区对齐
sudo fdisk -l /dev/sda -u=sectors

# 检查文件系统对齐
sudo blockdev --getalignoff /dev/sda1
sudo filefrag -v /dev/sda1 | head -20

# 对齐优化
# 使用parted创建对齐分区
sudo parted -a optimal /dev/sdb mkpart primary 1MiB 100%

10.3 磁盘健康监控脚本

bash 复制代码
#!/bin/bash
# disk_health_check.sh

echo "=== 磁盘健康检查报告 ==="
echo "检查时间: $(date)"
echo "=================================="

# 1. 检查磁盘使用率
echo -e "\n1. 磁盘使用情况:"
df -h | grep -E "^/dev/|^文件系统"

# 2. 检查inode使用率
echo -e "\n2. Inode使用情况:"
df -i | grep -E "^/dev/|^文件系统"

# 3. 检查SMART状态
echo -e "\n3. SMART健康状态:"
for disk in /dev/sd[a-z]; do
    if [ -b $disk ]; then
        echo -n "$disk: "
        if command -v smartctl >/dev/null; then
            sudo smartctl -H $disk 2>/dev/null | grep -E "SMART overall-health|PASSED|FAILED" | head -1 || echo "SMART不可用"
        else
            echo "smartctl未安装"
        fi
    fi
done

# 4. 检查RAID状态
echo -e "\n4. RAID阵列状态:"
if [ -f /proc/mdstat ]; then
    cat /proc/mdstat
else
    echo "无RAID配置"
fi

# 5. 检查LVM状态
echo -e "\n5. LVM状态:"
sudo pvs 2>/dev/null || echo "无LVM配置或需要sudo权限"

# 6. 检查磁盘错误
echo -e "\n6. 磁盘错误统计:"
dmesg | grep -i "error\|fail\|bad" | grep -i "sd\|disk"

# 7. 检查I/O等待
echo -e "\n7. I/O等待统计:"
iostat -dx 1 1 | tail -n +4

echo -e "\n=== 检查完成 ==="

十一、实用技巧与最佳实践

11.1 磁盘性能优化技巧

bash 复制代码
# 1. 调整I/O调度器(SSD推荐使用noop或deadline)
echo noop | sudo tee /sys/block/sda/queue/scheduler

# 2. 调整预读大小(RAID或SSD可增加)
sudo blockdev --setra 4096 /dev/sda

# 3. 启用写入缓存(有UPS的情况下)
sudo hdparm -W 1 /dev/sda

# 4. SSD优化(启用TRIM)
sudo systemctl enable fstrim.timer
sudo fstrim -v /

# 5. 调整脏页比例
echo 10 | sudo tee /proc/sys/vm/dirty_ratio
echo 5 | sudo tee /proc/sys/vm/dirty_background_ratio

# 6. 使用noatime挂载选项(减少写操作)
# 在/etc/fstab中添加noatime,nodiratime

11.2 磁盘安全擦除

bash 复制代码
# 安全擦除磁盘数据
# 方法1:使用dd(慢但安全)
sudo dd if=/dev/zero of=/dev/sdb bs=1M status=progress

# 方法2:使用shred(多次覆盖)
sudo shred -v -n 3 -z /dev/sdb

# 方法3:使用blkdiscard(仅SSD,快速)
sudo blkdiscard /dev/sdb

# 方法4:使用hdparm安全擦除(SSD推荐)
sudo hdparm --user-master u --security-set-pass pwd /dev/sdb
sudo hdparm --user-master u --security-erase pwd /dev/sdb

11.3 磁盘备份与恢复

bash 复制代码
# 1. 完整磁盘备份
sudo dd if=/dev/sda of=/backup/sda.img bs=4M status=progress

# 2. 使用partclone备份分区
sudo partclone.ext4 -c -s /dev/sda1 -o /backup/sda1.pc.img

# 3. 使用fsarchiver备份文件系统
sudo fsarchiver savefs /backup/backup.fsa /dev/sda1

# 4. 增量备份(使用rsync)
sudo rsync -av --delete --link-dest=/backup/last_full/ /data/ /backup/incremental/$(date +%Y%m%d)

# 5. 创建磁盘镜像
sudo dd if=/dev/cdrom of=cdrom.iso bs=2048

11.4 磁盘故障预警

bash 复制代码
# 监控脚本示例
#!/bin/bash
# disk_monitor.sh

# 阈值设置
DISK_USAGE_THRESHOLD=80
INODE_USAGE_THRESHOLD=80
EMAIL="admin@example.com"

# 检查磁盘使用率
df -h | grep '^/dev/' | while read line; do
    usage=$(echo $line | awk '{print $5}' | sed 's/%//')
    mount=$(echo $line | awk '{print $6}')
    if [ $usage -ge $DISK_USAGE_THRESHOLD ]; then
        echo "警告: $mount 使用率 $usage% 超过阈值 $DISK_USAGE_THRESHOLD%" | mail -s "磁盘空间警告" $EMAIL
    fi
done

# 检查inode使用率
df -i | grep '^/dev/' | while read line; do
    usage=$(echo $line | awk '{print $5}' | sed 's/%//')
    mount=$(echo $line | awk '{print $6}')
    if [ $usage -ge $INODE_USAGE_THRESHOLD ]; then
        echo "警告: $mount inode使用率 $usage% 超过阈值 $INODE_USAGE_THRESHOLD%" | mail -s "Inode使用警告" $EMAIL
    fi
done

# 添加到crontab定期执行
# crontab -e
# 0 * * * * /path/to/disk_monitor.sh
相关推荐
X.Ming 同学2 小时前
深度解析 Qt 自定义图表视图:频谱图 的设计与高级功能拓展
服务器·网络·数据库
qq_366086222 小时前
sql server 整数转百分比
运维·服务器·数据库
oMcLin2 小时前
如何排查 Linux 系统服务器的性能故障问题:使用 `top`、`htop`、`iostat` 等工具
linux·服务器·数据库
Howrun7772 小时前
Linux进程通信---4---信号量System V & POSIX
linux·数据库
喂自己代言2 小时前
Linux基础命令速查指南
linux·运维·服务器
bkspiderx2 小时前
详解Linux下xrandr工具:从基础配置到三显示器扩展桌面
linux·运维·计算机外设·显示器·分屏·xrandr·显示器扩展桌面
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [fs]namei
linux·笔记·学习
航Hang*2 小时前
第六章:网络系统建设与运维(中级)——链路聚合
运维·服务器·网络·笔记·华为·ensp
翼龙云_cloud2 小时前
阿里云云渠道商:GPU 服务器安全组配置指南 3 步解决端口开放问题
运维·服务器·安全·阿里云·云计算