一、磁盘基础概念
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