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
相关推荐
AlfredZhao4 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346610 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪12 小时前
linux 拷贝文件或目录到指定的位置
linux
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
小宇宙Zz1 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信