Skip to content

磁盘管理

磁盘分区

fdisk - MBR 分区工具

bash
fdisk -l                           # 列出所有分区
fdisk -l /dev/sda                  # 列出指定磁盘分区
fdisk /dev/sda                     # 分区操作

fdisk 交互命令:

命令功能
m帮助
p打印分区表
n新建分区
d删除分区
t修改分区类型
l列出分区类型
w保存并退出
q不保存退出

gdisk - GPT 分区工具

bash
gdisk -l /dev/sda                  # 列出分区
gdisk /dev/sda                     # 分区操作

gdisk 交互命令:

命令功能
?帮助
p打印分区表
n新建分区
d删除分区
t修改分区类型
l列出分区类型
w保存并退出
q不保存退出

parted - 分区工具

bash
parted -l                          # 列出所有分区
parted /dev/sda print              # 打印分区表
parted /dev/sda                    # 交互模式

非交互模式:

bash
parted /dev/sda mklabel gpt                    # 创建 GPT 分区表
parted /dev/sda mklabel msdos                  # 创建 MBR 分区表
parted /dev/sda mkpart primary ext4 1MiB 100GiB    # 创建分区
parted /dev/sda mkpart primary 100GiB 200GiB       # 创建分区
parted /dev/sda rm 1                           # 删除分区
parted /dev/sda set 1 boot on                  # 设置启动标志
parted /dev/sda resizepart 1 150GiB            # 调整分区大小

分区类型代码

MBR 分区类型:

代码类型
83Linux
82Linux Swap
8eLinux LVM
fdLinux RAID
07NTFS

GPT 分区类型:

代码类型
8300Linux filesystem
8200Linux swap
8e00Linux LVM
fd00Linux RAID
ef00EFI System Partition

文件系统

mkfs - 创建文件系统

bash
mkfs.ext4 /dev/sda1                # 创建 ext4 文件系统
mkfs -t ext4 /dev/sda1             # 同上
mkfs.xfs /dev/sda1                 # 创建 XFS 文件系统
mkfs.btrfs /dev/sda1               # 创建 Btrfs 文件系统
mkfs.vfat /dev/sda1                # 创建 FAT32
mkfs.ntfs /dev/sda1                # 创建 NTFS
mke2fs -t ext4 /dev/sda1           # 创建 ext4
mke2fs -t ext4 -L data /dev/sda1   # 设置卷标
mke2fs -t ext4 -b 4096 /dev/sda1   # 设置块大小

mkswap - 创建交换分区

bash
mkswap /dev/sda2                   # 创建交换分区
swapon /dev/sda2                   # 启用交换分区
swapoff /dev/sda2                  # 禁用交换分区
swapon -a                          # 启用所有交换分区
swapoff -a                         # 禁用所有交换分区
swapon -s                          # 查看交换分区状态
cat /proc/swaps                    # 查看交换分区

文件系统特性对比

特性ext4XFSBtrfs
最大文件16TB8EB16EB
最大卷1EB8EB16EB
日志
快照
压缩
在线扩展
在线缩小

挂载管理

mount - 挂载文件系统

bash
mount                              # 查看已挂载
mount /dev/sda1 /mnt               # 挂载分区
mount -t ext4 /dev/sda1 /mnt       # 指定文件系统类型
mount -o ro /dev/sda1 /mnt         # 只读挂载
mount -o rw /dev/sda1 /mnt         # 读写挂载
mount -o noexec /dev/sda1 /mnt     # 禁止执行
mount -o nosuid /dev/sda1 /mnt     # 禁用 SUID
mount -o nodev /dev/sda1 /mnt      # 禁用设备文件
mount -o remount,rw /mnt           # 重新挂载
mount -a                           # 挂载所有
mount --bind /old /new             # 绑定挂载
mount -o loop disk.iso /mnt        # 挂载 ISO

umount - 卸载文件系统

bash
umount /mnt                        # 卸载
umount /dev/sda1                   # 卸载
umount -l /mnt                     # 懒卸载
umount -f /mnt                     # 强制卸载
umount -a                          # 卸载所有

查看挂载信息

bash
mount                              # 查看挂载
df -h                              # 磁盘使用
findmnt                            # 挂载树
findmnt /dev/sda1                  # 指定设备
lsblk                              # 块设备
lsblk -f                           # 显示文件系统
cat /etc/mtab                      # 挂载表
cat /proc/mounts                   # 挂载信息

/etc/fstab 配置

# <device>    <mount>    <type>    <options>    <dump>    <fsck>
/dev/sda1      /         ext4      defaults     0         1
/dev/sda2      swap      swap      defaults     0         0
/dev/sda3      /data     ext4      defaults     0         2
UUID=xxx       /home     ext4      defaults     0         2

字段说明:

  • device: 设备名、UUID 或 LABEL
  • mount: 挂载点
  • type: 文件系统类型
  • options: 挂载选项
  • dump: dump 备份标志
  • fsck: fsck 检查顺序

常用挂载选项:

选项说明
defaultsrw,suid,dev,exec,auto,nouser,async
rw/ro读写/只读
exec/noexec允许/禁止执行
suid/nosuid允许/禁止 SUID
auto/noauto自动/手动挂载
user/nouser允许/禁止用户挂载
sync/async同步/异步 I/O
noatime不更新访问时间
nodiratime不更新目录访问时间
data=ordered数据写入顺序

使用 UUID 挂载:

bash
blkid /dev/sda1                    # 查看 UUID
UUID=xxx-xxx /data ext4 defaults 0 2

磁盘空间管理

df - 磁盘空间

bash
df                                 # 显示磁盘使用
df -h                              # 人类可读格式
df -T                              # 显示文件系统类型
df -i                              # 显示 inode 使用
df -x tmpfs                        # 排除文件系统
df --total                         # 显示总计
df /path                           # 指定路径

du - 目录大小

bash
du                                 # 显示目录大小
du -h                              # 人类可读格式
du -sh /path                       # 显示总大小
du -h --max-depth=1                # 显示一层深度
du -ah                             # 显示所有文件
du -sh *                           # 当前目录各文件大小
du -h --exclude="*.log"            # 排除文件
du -h --time                       # 显示修改时间
du -sh --apparent-size             # 实际大小

ncdu - 磁盘使用分析

bash
ncdu                               # 分析当前目录
ncdu /path                         # 分析指定目录
ncdu -x /                          # 不跨文件系统
ncdu --exclude "*.log"             # 排除文件

LVM 逻辑卷管理

LVM 架构

┌─────────────────────────────────────────┐
│              Logical Volume (LV)         │
│                 /dev/vg0/lv0             │
├─────────────────────────────────────────┤
│              Volume Group (VG)           │
│                   vg0                    │
├───────────────┬───────────────┬─────────┤
│ Physical      │ Physical      │ Physical│
│ Volume (PV)   │ Volume (PV)   │ Volume  │
│ /dev/sda1     │ /dev/sdb1     │ /dev/sdc1│
└───────────────┴───────────────┴─────────┘

PV 物理卷管理

bash
pvcreate /dev/sda1                 # 创建物理卷
pvcreate /dev/sda1 /dev/sdb1       # 创建多个
pvdisplay                          # 显示物理卷
pvdisplay /dev/sda1                # 显示指定
pvs                                 # 简要显示
pvscan                             # 扫描物理卷
pvremove /dev/sda1                 # 删除物理卷
pvmove /dev/sda1                   # 移动数据

VG 卷组管理

bash
vgcreate vg0 /dev/sda1             # 创建卷组
vgcreate vg0 /dev/sda1 /dev/sdb1   # 使用多个 PV
vgcreate -s 16M vg0 /dev/sda1      # 指定 PE 大小
vgdisplay                          # 显示卷组
vgdisplay vg0                      # 显示指定
vgs                                 # 简要显示
vgscan                             # 扫描卷组
vgextend vg0 /dev/sdc1             # 扩展卷组
vgreduce vg0 /dev/sda1             # 缩减卷组
vgremove vg0                       # 删除卷组
vgrename vg0 newvg                 # 重命名

LV 逻辑卷管理

bash
lvcreate -L 10G -n lv0 vg0         # 创建 10G 逻辑卷
lvcreate -l 100%FREE -n lv0 vg0    # 使用所有空间
lvcreate -L 10G -n lv0 -T vg0      # 创建精简池
lvcreate -V 5G -T vg0/lv0 -n thin1 # 创建精简卷
lvdisplay                          # 显示逻辑卷
lvdisplay /dev/vg0/lv0             # 显示指定
lvs                                 # 简要显示
lvscan                             # 扫描逻辑卷
lvextend -L +5G /dev/vg0/lv0       # 扩展 5G
lvextend -l +100%FREE /dev/vg0/lv0 # 扩展所有空间
lvextend -L 20G /dev/vg0/lv0       # 扩展到 20G
lvreduce -L -5G /dev/vg0/lv0       # 缩减 5G
lvremove /dev/vg0/lv0              # 删除逻辑卷
lvrename vg0 lv0 newlv             # 重命名

扩展文件系统:

bash
lvextend -L +5G /dev/vg0/lv0 && resize2fs /dev/vg0/lv0    # ext4
lvextend -L +5G /dev/vg0/lv0 && xfs_growfs /data          # XFS
lvextend -r -L +5G /dev/vg0/lv0    # 自动扩展文件系统

磁盘阵列 RAID

mdadm - 软件 RAID

bash
mdadm --detail /dev/md0            # 查看 RAID 信息
cat /proc/mdstat                   # 查看 RAID 状态

创建 RAID:

bash
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sda1 /dev/sdb1    # RAID 0
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1    # RAID 1
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sda1 /dev/sdb1 /dev/sdc1    # RAID 5
mdadm --create /dev/md0 --level=6 --raid-devices=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1    # RAID 6
mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1    # RAID 10

RAID 管理:

bash
mdadm --add /dev/md0 /dev/sde1     # 添加磁盘
mdadm --remove /dev/md0 /dev/sda1  # 移除磁盘
mdadm --fail /dev/md0 /dev/sda1    # 标记故障
mdadm --grow /dev/md0 --raid-devices=4    # 扩展设备数
mdadm --stop /dev/md0              # 停止 RAID
mdadm --assemble /dev/md0          # 组装 RAID
mdadm --assemble --scan            # 扫描组装

保存配置:

bash
mdadm --detail --scan >> /etc/mdadm.conf

RAID 级别对比

级别最少磁盘冗余容量利用率性能
RAID 02100%最高
RAID 1250%读高
RAID 53(n-1)/n中等
RAID 64(n-2)/n中等
RAID 10450%

磁盘健康检查

smartctl - SMART 监控

bash
smartctl -a /dev/sda               # 显示所有信息
smartctl -H /dev/sda               # 健康状态
smartctl -i /dev/sda               # 设备信息
smartctl -c /dev/sda               # 能力信息
smartctl -A /dev/sda               # 属性信息
smartctl -l error /dev/sda         # 错误日志
smartctl -l selftest /dev/sda      # 自检日志
smartctl -t short /dev/sda         # 短自检
smartctl -t long /dev/sda          # 长自检
smartctl -X /dev/sda               # 中止自检
smartctl -s on /dev/sda            # 启用 SMART

badblocks - 坏块检测

bash
badblocks -v /dev/sda              # 只读检测
badblocks -n /dev/sda              # 非破坏性读写检测
badblocks -w /dev/sda              # 破坏性写检测
badblocks -v /dev/sda > bad.txt    # 保存结果
badblocks -v -s /dev/sda           # 显示进度

文件系统检查与修复

fsck - 文件系统检查

bash
fsck /dev/sda1                     # 检查文件系统
fsck -y /dev/sda1                  # 自动修复
fsck -n /dev/sda1                  # 只检查不修复
fsck -f /dev/sda1                  # 强制检查
fsck -t ext4 /dev/sda1             # 指定类型
fsck -A                            # 检查所有
fsck -R -A                         # 排除根分区
e2fsck /dev/sda1                   # ext2/3/4 检查
xfs_repair /dev/sda1               # XFS 修复
btrfs check /dev/sda1              # Btrfs 检查

磁盘性能测试

hdparm - 磁盘参数

bash
hdparm -I /dev/sda                 # 显示信息
hdparm -t /dev/sda                 # 读取测试
hdparm -T /dev/sda                 # 缓存读取测试
hdparm -tT /dev/sda                # 组合测试
hdparm -i /dev/sda                 # 内部信息

fio - I/O 性能测试

bash
fio --name=randread --ioengine=libaio --iodepth=16 --rw=randread --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --filename=/dev/sda
fio --name=randwrite --ioengine=libaio --iodepth=16 --rw=randwrite --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --filename=/dev/sda

dd - 简单测试

bash
dd if=/dev/zero of=test bs=1M count=1000 conv=fdatasync    # 写测试
dd if=test of=/dev/null bs=1M                              # 读测试
dd if=/dev/zero of=test bs=1M count=1000 oflag=direct      # 直接 I/O

下一步学习