linux磁盘常用命令

工具教程3个月前发布 hank
442 0 0

这篇笔记主要整理 Linux 磁盘日常操作:扫盘、挂载、查盘、LVM、修复和取消挂载。

扫盘

1. 扫描 SCSI 磁盘

添加新磁盘后,操作系统有时不会立刻识别,例如 lsblk 看不到新盘。只要磁盘走的是 SCSI 协议,例如 SATA、SAS 等,一般都可以用下面的命令触发扫描。

echo "- - -" | tee /sys/class/scsi_host/host*/scan
扫描 SCSI 磁盘后查看块设备
执行扫描后,再通过 lsblkfdisk -l 确认新磁盘是否已经被系统识别。

2. 救援模式下激活 LVM

在救援模式(Rescue Mode)下,LVM 分区不能像普通 ext4、xfs 分区一样直接挂载,需要先激活卷组。

vgchange -ay vg_name

挂载

1. 临时挂载与永久挂载

挂载一般分为临时挂载和永久挂载。临时挂载适合临时备份、排障;永久挂载则需要把磁盘信息写入 /etc/fstab,然后用 mount -a 验证。

mount -t 可以指定文件系统类型,例如 xfsext4nfsntfs-3g。挂载 ISO 文件时,文件系统类型一般写 iso9660

/etc/fstab 常见格式

# 设备路径 / 挂载点 / 文件系统类型 / 挂载参数 / dump备份 / fsck检查
/dev/sda /mnt xfs defaults 0 0

# 官方一点的格式:
[设备]  [挂载点]  [文件系统类型]  [挂载参数(options)]  [dump备份]  [fsck开机自检]
字段 说明
设备 可以写设备路径,也可以写 UUID。设备路径可能变化,生产环境更建议使用 blkid 获取 UUID。
挂载点 目标目录,例如 /data/mnt
文件系统类型 常见为 xfsext4nfsiso9660
挂载参数 常见为 defaults,也可以按场景追加 nofailnoatime 等参数。
dump 备份 现在基本不用,通常写 0
fsck 检查 0 不检查,1 优先检查,一般给根目录;2 次优先级检查。

2. 常见挂载参数

大多数场景写 defaults 就可以。如果需要优化或规避启动风险,可以按场景追加参数。

# 示例:在 defaults 后追加参数
defaults,noatime,nodiratime,commit=600,errors=remount-ro
参数 作用 适合场景
nofail 开机检查 fstab 时,即使该磁盘找不到或挂载失败,也会跳过,不会直接进入紧急模式。 NFS、外部存储、非关键数据盘。
noatime 禁止更新文件访问时间,减少写入。 SSD、PCDN、读多写少场景。
nodiratime 禁止更新目录访问时间,通常和 noatime 一起使用。 SSD、PCDN、目录访问频繁场景。
errors=remount-ro 文件系统底层出错时,重新挂载为只读模式,尽量保留现场并避免继续写坏数据。 希望在故障时先保数据、再排查的场景。
commit=600 控制文件系统日志提交周期。默认通常较短,调大后可以降低写入压力,但掉电风险会增加。 特殊调优场景;正规生产环境一般建议保持默认。

关于 commit 和脏页:Linux 写入数据时,通常会先写到内存里的 Page Cache。已经被修改但还没落盘的数据叫脏页(Dirty Page)。到达提交周期后,文件系统日志线程会把这部分数据刷写到磁盘,脏页变成干净页。commit 调得越低,数据安全性越高,但 I/O 压力也越大;调得越高,写入压力可能降低,但异常断电时风险也更高。

3. 移除文件系统签名

做 LVM 前,如果磁盘本身已经带有文件系统签名,例如已经被格式化成 xfs,再做物理卷 PV 时可能出现冲突。比如先把磁盘做成 PV,后来又用 mkfs.xfs 格式化,就可能导致同一磁盘同时存在 LVM 元数据和文件系统签名。

wipefs -a /dev/sdx

wipefs 的局限:有些 GPT 分区表会在磁盘末尾保留备份表。wipefs 可能只清理了头部签名,内核块设备层仍然能从尾部读到备份 GPT,从而误认为磁盘还有分区结构。

# 强行擦除 GPT 分区表和相关签名
sgdisk --zap-all /dev/sdX

# 或者直接用 parted/fdisk 重新分区,例如全盘单分区 /dev/sda1

这个思路也可以用于清理分区痕迹,但操作前一定要确认设备名,避免误清数据盘。

查盘

1. 常用查看命令

fdisk -l
lsblk
blkid   # 获取 UUID、文件系统类型等
df -h   # 查看已挂载磁盘、文件系统和磁盘使用情况
df -hi  # 查看 inode 使用率
findmnt # 查看目录和挂载点归属
mount   # 查看当前挂载信息

lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
lsblk -o NAME,SIZE,TYPE,FSTYPE,RO,ROTA,RM,MOUNTPOINT
lsblk -d -o NAME,SIZE,ROTA,RO,RM,TYPE,MODEL
命令 作用
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT 查看磁盘/分区名称、容量、文件系统类型、挂载点,适合快速确认分区挂载情况。
lsblk -o NAME,SIZE,TYPE,FSTYPE,RO,ROTA,RM,MOUNTPOINT 查看更完整的磁盘信息,包括设备类型、是否只读、是否机械盘、是否可移动、文件系统和挂载点。
lsblk -d -o NAME,SIZE,ROTA,RO,RM,TYPE,MODEL 只查看整块磁盘,不显示分区。适合判断磁盘容量、型号、是否机械盘、是否只读、是否可移动。

LVM 类

1. PV、VG、LV 基础流程

LVM 的基础关系可以简单理解为:PV(物理卷)→ VG(卷组)→ LV(逻辑卷)。

# 创建物理卷 PV
pvcreate /dev/sdx

# 查看物理卷
pvs
pvdisplay

# 创建卷组,将 /dev/sdx 这个 PV 加入 vg_name
vgcreate vg_name /dev/sdx

# 查看卷组
vgs
vgdisplay

# 创建逻辑卷
lvcreate -l 100%free -n lv_name vg_name
lvcreate -L +10G -n lv_name vg_name

# 格式化逻辑卷
mkfs.xfs /dev/vg_name/lv_name
mkfs.ext4 /dev/vg_name/lv_name

2. 逻辑卷扩容

逻辑卷扩容通常分为四步:新盘做 PV、加入现有 VG、扩容 LV、扩容文件系统。

第一步:新添加磁盘并做成 PV

pvcreate /dev/sdb
pvcreate 创建物理卷
新磁盘初始化为 LVM 物理卷。

第二步:将新 PV 加入已有 VG

vgextend vg_name /dev/sdb
vgextend 将新物理卷加入卷组
加入卷组后,可以通过 vgs 查看 VFree,这个值就是当前 VG 剩余可用容量。

如果报错 Couldn't create temporary archive name建议先检查元数据存储路径所在分区的空间,例如根目录使用率是否已经 100%。LVM 操作需要在 /etc/lvm/archive//etc/lvm/backup/ 目录生成临时元数据文件,根分区满了就可能创建失败。除此之外,还要排查权限、卷组状态异常等问题。

第三步:扩容 LV

lvextend -L +50G -n /dev/rhel/root

第四步:扩容文件系统

lvextend 成功后,df -h 可能还看不到容量变化,因为它只扩容了底层逻辑卷,还需要把容量同步到上层文件系统。

# xfs
xfs_growfs /dev/rhel/root

# ext4
resize2fs /dev/rhel/root
LVM 逻辑卷扩容过程
扩容逻辑卷后,继续扩容文件系统。
df 查看扩容后的容量
最后用 df -h 确认文件系统容量是否已经生效。

修复

1. 救援模式激活并挂载 LVM

进入光盘救援模式后,如果原根目录是 LVM 分区,需要先扫描并激活 VG,再挂载原系统根目录。

# 扫描 VG
vgscan

# 激活 VG
vgchange -a y vgname
救援模式下激活 LVM 卷组
vgchange -a y 会激活该卷组下所有逻辑卷,一般不需要再单独执行 lvchange -ay
# 挂载原系统根目录
mount /dev/vg_name/lv_name /mnt/sysroot

# chroot 进入故障系统
chroot /mnt/sysroot

2. 使用 mount –bind 临时映射系统目录

如果故障系统里的系统目录缺失,或者修复过程中需要使用救援环境的 /dev/proc/sys,可以使用 mount --bind 临时映射。若已经进入 chroot,需要先 exit 回到救援交互界面。

# 假设故障系统里缺少 /proc,先确保挂载点目录存在
mkdir -p /mnt/sysroot/proc
mount --bind /proc /mnt/sysroot/proc

3. 文件系统修复

文件系统修复前,需要先取消挂载,否则容易造成二次损坏或修复失败。

# 都需要先 umount 取消挂载后再操作

# xfs 文件系统
xfs_repair /dev/sdx

# ext4、ext3 等文件系统
fsck /dev/sdx

# fsck 常用参数:
# -y  对所有修复自动回答 yes
# -f  强制检查

修复后可以查看挂载点下的 lost+found 目录是否存在,以及里面是否有恢复出来的文件。

4. 硬件层检查

smartctl 适合检查物理磁盘健康状态。如果是虚拟机里的虚拟磁盘,很多场景下查不到有效硬件信息。该命令来自 smartmontools 软件包。

# 安装 smartmontools
yum install -y smartmontools
apt install -y smartmontools

# 查看健康状态
smartctl -H /dev/sdx
smartctl 查看磁盘健康状态
显示 PASSED 一般问题不大;如果显示 FAILED,建议尽快备份数据并更换磁盘。
# 查看 SMART 属性
smartctl -A /dev/sdx
smartctl 查看 SMART 属性
重点关注重映射扇区、待处理扇区、CRC 错误等指标。
# 常见重点指标
Reallocated_Sector_Ct   # ID 5
Current_Pending_Sector  # ID 197
UDMA_CRC_Error_Count    # ID 199

不同厂商和型号的 SMART 字段可能略有差异,主要还是结合健康状态、错误计数和实际业务报错判断磁盘是否存在硬件问题。

取消挂载

1. 查看目录命中的挂载点

findmnt -T 可以判断某个目录实际属于哪个挂载点。输出里的 TARGET 就是实际命中的挂载点。

findmnt -T /data
findmnt 查看目录命中的挂载点
通过 TARGET 判断目录归属,避免卸载错挂载点。

2. 处理 umount: target is busy

执行 umount 时,如果提示 target is busy,通常说明挂载点正在被进程、终端、日志、缓存或文件句柄占用。

  1. 当前工作目录在 /data 里面。
  2. 有进程正在读写 /data 下的文件。
  3. 日志文件、缓存文件、数据库文件仍在 /data 下。
  4. Docker、Nginx、业务进程正在使用 /data
  5. 某个 shell 终端 cd 到了 /data
  6. 文件已经被删除,但进程仍然占着文件句柄。

3. 查找占用进程

正规排查可以先用 lsof +f -- /data 看细节;想快速定位是谁占用挂载点,可以用 fuser -vm /data

# 查看挂载点占用详情,输出更细
lsof +f -- /data

# 快速查看哪个进程正在使用挂载点
fuser -vm /data

# 确认无误后再杀占用进程
fuser -km /data

# 更温和地发送 TERM 信号,相当于普通 kill
fuser -k -TERM -m /data
lsof 查看挂载点占用详情
lsof 能看到具体文件路径和 FD 类型。比如 FD 字段为 cwd 时,通常表示进程当前工作目录就在该挂载点下。
fuser 查看挂载点占用进程
fuser -vm /data 适合快速定位占用进程;fuser -km /data 默认接近强制杀进程,确认不影响业务后再使用。

注意:fuser -k 默认发送较强的终止信号,生产环境建议先看清 PID 和进程用途,再决定是否杀进程。需要温和一点时,可以使用 fuser -k -TERM -m /data

4. 查看进程详情

有时候不会直接处理进程,需要先看进程信息和父子进程关系,再决定是否停止服务或杀进程。

ps -fp PID
ps -o pid,ppid,user,stat,etime,cmd -p PID
pstree -asp PID
ps 查看 systemd 进程示例
示例:查看 PID 为 1 的 systemd 进程。
字段 含义
pid 当前进程 ID
ppid 父进程 ID
user 用户
stat 进程状态
etime 已运行多久
cmd 完整命令

5. fuser 与 lsof 的区别

工具 优点 缺点 适合场景
fuser -vm /data 简洁、直接、适合快速处理 busy。 细节少。 快速判断谁占用挂载点。
lsof +f -- /data 细节多,能看到具体文件路径和 FD 类型。 输出多,复杂系统上可能比较慢。 深入分析为什么 busy。
fuser -km /data 可以直接杀占用进程。 杀伤力大,默认偏强制。 确认无误后强制清理。
lsof + kill 可控,能先看再杀。 步骤多。 生产环境更稳。

注:后期会继续更新。

© 版权声明

相关文章