详解Linux磁盘相关命令:从基础查看到底层运维

在Linux系统中,磁盘是存储数据的核心硬件,无论是日常的磁盘空间查看、分区管理,还是底层的磁盘性能监控、故障排查,都离不开一系列专用命令。掌握这些命令,是Linux运维、开发及服务器管理的必备技能。本文将全面梳理Linux磁盘相关核心命令,按功能分类详解,结合实际使用场景给出示例,帮助读者快速上手、灵活运用。

一、基础磁盘信息查看命令(必学)

这类命令主要用于查看磁盘的整体信息、分区情况、挂载状态,是了解磁盘现状的第一步,无需特殊权限(部分细节需root)。

1. lsblk:查看磁盘及分区整体结构

lsblk(list block devices)用于列出所有块设备(磁盘、分区、虚拟磁盘等),以树状结构展示,直观清晰,是查看磁盘分区布局的首选命令。

常用用法

bash 复制代码
lsblk          # 查看所有块设备的简要信息(默认树状)
lsblk -f       # 查看块设备的文件系统类型、UUID、挂载点
lsblk -l       # 以列表形式展示(非树状),便于筛选
lsblk -a       # 显示所有块设备(包括未挂载的隐藏设备)
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT  # 自定义显示列(名称、大小、类型、挂载点)

示例解析

执行 lsblk -f 后,输出如下(关键信息说明):

bash 复制代码
NAME   FSTYPE UUID                                 MOUNTPOINT
sda                                                 
├─sda1 ext4   5a2b9c8d-xxxx-xxxx-xxxx-xxxxxxx      /boot
├─sda2 swap   6b3c4d5e-xxxx-xxxx-xxxx-xxxxxxx      [SWAP]
└─sda3 ext4   7c4d5e6f-xxxx-xxxx-xxxx-xxxxxxx      /
sr0    iso9660 2024-01-01-xxxx-xxxx-xxxxxxx        /media/cdrom
  • NAME:设备名称(sda为第一块物理磁盘,sda1/sda2/sda3为其分区,sr0为光盘设备);

  • FSTYPE:文件系统类型(ext4为常用磁盘文件系统,swap为交换分区,iso9660为光盘文件系统);

  • UUID:磁盘唯一标识(用于挂载配置,避免设备名称变动导致挂载失败);

  • MOUNTPOINT:挂载点(磁盘分区挂载到系统的目录,未挂载则为空)。

2. fdisk:查看/管理磁盘分区(MBR格式)

fdisk是Linux传统的分区管理命令,主要用于查看MBR(Master Boot Record)格式磁盘的分区表,也可创建、删除、修改分区(需root权限)。注意:fdisk不支持GPT格式磁盘(需用gdisk)。

常用用法

bash 复制代码
fdisk -l       # 查看所有磁盘及分区的详细信息(需root)
fdisk /dev/sda # 进入sda磁盘的分区管理模式(需root)

示例解析

执行 fdisk -l /dev/sda(查看指定磁盘sda),输出关键信息:

bash 复制代码
Disk /dev/sda: 500 GiB, 536870912000 bytes, 1048576000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos  # 分区表类型为MBR(dos)
Disk identifier: 0x12345678

Device     Boot    Start       End   Sectors   Size Id Type
/dev/sda1  *        2048   2099199   2097152     1G 83 Linux
/dev/sda2         2099200  43007999  40908800    19.5G 82 Linux swap / Solaris
/dev/sda3        43008000 1048575999 1005568000  479.5G 83 Linux
  • Disk /dev/sda:磁盘名称及容量(500GiB)、扇区数量;

  • Disklabel type: dos:分区表格式为MBR(若为gpt则显示gpt);

  • Device:分区设备名称;

  • Boot:是否为引导分区(*表示是,即sda1为系统引导分区);

  • Size:分区大小;

  • Id/Type:分区类型(83为Linux分区,82为swap交换分区)。

进入分区管理模式(fdisk /dev/sda)后,常用交互命令:

  • p:查看当前磁盘分区表;

  • n:创建新分区;

  • d:删除分区;

  • w:保存修改并退出;

  • q:放弃修改并退出。

3. gdisk:查看/管理磁盘分区(GPT格式)

gdisk是fdisk的GPT版本,专门用于GPT(GUID Partition Table)格式磁盘的分区管理,支持大于2TB的磁盘(MBR格式最大支持2TB),用法与fdisk类似,需root权限。

常用用法

bash 复制代码
gdisk -l /dev/sda  # 查看GPT格式磁盘sda的分区信息
gdisk /dev/sda     # 进入sda磁盘的GPT分区管理模式

4. df:查看磁盘空间使用情况

df(disk free)用于查看文件系统的磁盘空间使用情况,包括总空间、已用空间、剩余空间、使用率及挂载点,是日常排查磁盘满的核心命令。

常用用法

bash 复制代码
df -h       # 以人类可读格式(KB/MB/GB)显示,最常用
df -a       # 显示所有文件系统(包括虚拟文件系统,如/proc)
df -T       # 显示文件系统类型
df -i       # 查看inode使用情况(而非磁盘空间,inode满会导致无法创建文件)
df /root    # 查看指定目录(/root)所在文件系统的空间使用情况

示例解析

执行 df -h,输出如下:

bash 复制代码
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       479G   80G  375G  18% /
tmpfs           7.8G     0  7.8G   0% /dev/shm
/dev/sda1       974M  120M  787M  14% /boot
/dev/sr0        4.3G  4.3G     0 100% /media/cdrom
  • Filesystem:文件系统(对应磁盘分区);

  • Size:总空间;

  • Used:已用空间;

  • Avail:剩余可用空间;

  • Use%:使用率(超过80%需警惕,超过90%可能导致系统异常);

  • Mounted on:挂载点。

注意:df查看的是"文件系统"的空间,而非单个目录的大小;若需查看目录大小,需用du命令。

5. du:查看目录/文件占用磁盘空间大小

du(disk usage)用于查看指定目录或文件占用的磁盘空间大小,与df互补(df看整体文件系统,du看局部目录/文件),常用於定位大文件/大目录。

常用用法

bash 复制代码
du -h        # 以人类可读格式显示当前目录下所有文件/目录的大小
du -sh       # 显示当前目录的总大小(不列出子目录/文件细节),最常用
du -sh /root # 查看指定目录(/root)的总大小
du -h --max-depth=1 /home  # 查看/home目录下一级子目录的大小(不深入子目录)
du -h /var/log  # 查看/var/log目录下所有文件/目录的大小(定位日志文件)

示例解析

执行 du -sh /root,输出:12.5G /root(表示/root目录总占用12.5GB);

执行 du -h --max-depth=1 /home,输出:

bash 复制代码
4.0G    /home/user1
8.5G    /home/user2
12.5G   /home

二、磁盘挂载与卸载命令(核心运维)

Linux中,磁盘分区、U盘、光盘等设备,必须挂载到某个目录下才能被系统访问。挂载(mount)是将设备与系统目录关联,卸载(umount)是解除关联,需root权限。

1. mount:挂载磁盘设备

基本语法

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

常用选项与用法

bash 复制代码
mount /dev/sdb1 /mnt/usb  # 将U盘设备(/dev/sdb1)挂载到/mnt/usb目录
mount -t ext4 /dev/sdb1 /mnt/usb  # 指定文件系统类型(ext4)挂载
mount -o ro /dev/sdb1 /mnt/usb    # 以只读模式挂载(防止误修改)
mount -a       # 挂载/etc/fstab文件中配置的所有设备(开机自动挂载)

关键注意事项

  • 挂载点目录必须提前创建(如 mkdir -p /mnt/usb),否则挂载失败;

  • 挂载点目录为空(若有文件,挂载后会被隐藏,卸载后恢复);

  • 若不知道设备路径,可通过 lsblkfdisk -l 查看。

2. umount:卸载磁盘设备

基本语法

bash 复制代码
umount 设备路径  # 方式1:通过设备路径卸载
umount 挂载点路径 # 方式2:通过挂载点路径卸载(更常用)

常用用法

bash 复制代码
umount /mnt/usb  # 卸载/mnt/usb挂载点的设备
umount /dev/sdb1 # 卸载/dev/sdb1设备

常见问题:卸载失败(device is busy)

原因:有进程正在访问该挂载点(如当前目录在挂载点下、有程序读取挂载点内文件)。

解决方法:

bash 复制代码
fuser -km /mnt/usb 2>/dev/null || true  # 强制终止访问挂载点的所有进程(前文提到的命令)
umount /mnt/usb                         # 再次卸载
# 若仍失败,用lsof查看占用进程,手动终止后再卸载
lsof /mnt/usb  # 查看访问/mnt/usb的进程
kill -9 进程ID  # 强制终止进程

3. /etc/fstab:配置开机自动挂载

手动挂载的设备,重启系统后会失效。若需开机自动挂载,需将设备信息写入 /etc/fstab 文件(需root权限),配置后执行 mount -a 测试是否生效。

配置格式(每行一条记录)

bash 复制代码
设备路径/UUID  挂载点  文件系统类型  挂载选项  备份标记  自检顺序

示例配置

bash 复制代码
# 将/dev/sdb1(UUID:5a2b9c8d-xxxx-xxxx-xxxx-xxxxxxx)挂载到/mnt/data,ext4格式,开机自动挂载
UUID=5a2b9c8d-xxxx-xxxx-xxxx-xxxxxxx  /mnt/data  ext4  defaults  0  2
  • UUID:推荐使用UUID(而非设备路径),避免设备名称变动(如插入U盘后sdb变sdc)导致挂载失败;

  • defaults:默认挂载选项(rw、suid、dev、exec、auto、nouser、async);

  • 备份标记(0/1):0表示不备份,1表示备份;

  • 自检顺序(0/1/2):0表示不自检,1表示优先自检(仅/分区设为1),2表示次要自检。

三、磁盘格式化命令(谨慎使用)

格式化(format)是为磁盘分区创建文件系统的过程,格式化后分区内所有数据会被彻底删除,务必谨慎操作,需root权限。常用命令有mkfs、mkswap。

1. mkfs:格式化磁盘分区(创建文件系统)

mkfs(make filesystem)是格式化的核心命令,支持多种文件系统(ext4、xfs、fat32等),语法为 mkfs.文件系统类型 设备路径

常用用法

bash 复制代码
mkfs.ext4 /dev/sdb1  # 将/dev/sdb1分区格式化为ext4格式(Linux最常用)
mkfs.xfs /dev/sdb1   # 格式化为xfs格式(CentOS 7+默认文件系统,支持大文件)
mkfs.vfat /dev/sdb1  # 格式化为fat32格式(支持Windows和Linux互通,单个文件最大4GB)
mkfs.ntfs /dev/sdb1  # 格式化为ntfs格式(需安装ntfs-3g工具,支持大文件)

注意事项

  • 格式化前,务必确认设备路径正确(避免误格式化系统分区,如/dev/sda3);

  • 格式化前,若分区已挂载,需先卸载(umount);

  • ext4格式格式化后,会自动分配inode和block,无需额外配置。

2. mkswap:格式化交换分区

交换分区(swap)是Linux系统的虚拟内存,需单独格式化(文件系统类型为swap),用mkswap命令,需root权限。

常用用法

bash 复制代码
mkswap /dev/sda2  # 将/dev/sda2分区格式化为swap格式
swapon /dev/sda2  # 启用该交换分区(临时生效)
swapoff /dev/sda2 # 关闭该交换分区

若需开机自动启用交换分区,需将其写入/etc/fstab:

bash 复制代码
UUID=6b3c4d5e-xxxx-xxxx-xxxx-xxxxxxx  swap  swap  defaults  0  0

四、磁盘性能监控命令(进阶运维)

这类命令用于监控磁盘的读写速度、I/O负载、响应时间,排查磁盘性能瓶颈(如磁盘读写缓慢、I/O占用过高)。

1. iostat:查看磁盘I/O性能

iostat(input/output statistics)用于查看系统I/O设备的负载情况,包括CPU使用率、磁盘读写速度、I/O等待时间等,需安装sysstat工具(yum install sysstat / apt install sysstat)。

常用用法

bash 复制代码
iostat -x 1 5  # 每1秒采集1次数据,共采集5次,-x显示详细I/O统计信息
iostat -d 2    # 每2秒采集1次,仅显示磁盘I/O信息(不显示CPU)
iostat /dev/sda 1  # 仅监控sda磁盘,每1秒采集1次

关键指标解析(iostat -x输出)

  • %util:磁盘I/O使用率(核心指标),数值接近100%表示磁盘I/O饱和,性能瓶颈在磁盘;

  • tps:每秒I/O请求数(读写请求总和);

  • rMB/s:每秒磁盘读取速度(MB);

  • wMB/s:每秒磁盘写入速度(MB);

  • await:磁盘I/O请求的平均响应时间(毫秒),数值越小越好,过大表示磁盘响应缓慢。

2. dd:测试磁盘读写速度

dd命令主要用于数据备份和转换,也可用于简单测试磁盘的读写速度(无专门测试工具时可用),注意:测试会生成临时文件,需确保磁盘有足够空间。

常用用法(测试读写速度)

bash 复制代码
# 测试磁盘写入速度(生成1个1GB的临时文件,写入到/mnt/data)
dd if=/dev/zero of=/mnt/data/test bs=1G count=1 oflag=direct
# 测试磁盘读取速度(读取刚才生成的临时文件,丢弃输出)
dd if=/mnt/data/test of=/dev/null bs=1G count=1 iflag=direct
# 删除临时文件
rm -rf /mnt/data/test

参数说明

  • if:输入文件(/dev/zero为无限零字节流,用于生成临时文件);

  • of:输出文件(测试写入时为临时文件,测试读取时为/dev/null(空设备));

  • bs:每次读写的块大小(1G表示每次读写1GB,可调整为1M、4K等);

  • count:读写的块数(count=1表示总共读写1块,即1GB);

  • oflag=direct/iflag=direct:跳过系统缓存,直接读写磁盘,测试结果更准确。

3.iotop:实时监控磁盘I/O进程

iotop用于实时监控哪些进程占用磁盘I/O资源(读写速度、I/O使用率),直观定位导致磁盘I/O过高的进程,需root权限,需安装iotop工具。

常用用法

bash 复制代码
iotop          # 实时监控磁盘I/O进程(默认每2秒刷新1次)
iotop -o       # 仅显示正在进行I/O操作的进程(过滤空闲进程)
iotop -d 1     # 每1秒刷新1次
iotop -u root  # 仅监控root用户的进程

五、磁盘故障排查命令(应急处理)

当磁盘出现异常(如挂载失败、文件系统损坏、磁盘报错)时,需用以下命令排查和修复,需root权限,部分命令会修改磁盘数据,需谨慎。

1. fsck:修复文件系统损坏

fsck(filesystem check)用于检查和修复文件系统的损坏(如意外断电、磁盘异常导致的文件系统错误),修复前需卸载分区,否则可能导致数据丢失。

常用用法

bash 复制代码
fsck /dev/sdb1  # 检查并修复/dev/sdb1分区(ext4格式,默认自动修复轻微错误)
fsck -y /dev/sdb1  # 自动确认修复操作(无需手动输入y确认)
fsck.ext4 /dev/sdb1 # 明确指定修复ext4格式的分区(避免自动识别错误)

注意事项

  • 修复前必须卸载分区(umount /dev/sdb1);

  • 若分区为系统分区(/),无法直接卸载,需进入单用户模式或使用救援光盘修复;

  • 严重损坏时,fsck可能无法完全修复,需提前备份数据。

2. dmesg:查看磁盘硬件报错

dmesg用于查看系统内核日志,包括磁盘硬件的报错信息(如磁盘损坏、接口松动、I/O错误),可快速定位磁盘硬件问题。

常用用法

bash 复制代码
dmesg | grep sda  # 查看sda磁盘的相关内核日志(报错信息)
dmesg | grep -i error  # 查看所有与错误相关的日志(忽略大小写)

若输出中出现"bad sector"(坏道)、"I/O error"(I/O错误),可能表示磁盘硬件损坏。

3. badblocks:检测磁盘坏道

badblocks用于检测磁盘的坏道(物理坏道/逻辑坏道),物理坏道无法修复,需标记为不可用;逻辑坏道可通过fsck修复。

常用用法

bash 复制代码
badblocks -v /dev/sdb1  # 检测/dev/sdb1分区的坏道,-v显示详细过程(只读检测)
badblocks -w /dev/sdb1  # 读写检测坏道(会破坏分区数据,谨慎使用)
# 将坏道信息写入文件,后续用fsck标记坏道
badblocks -o /root/badblocks.log /dev/sdb1
fsck -l /root/badblocks.log /dev/sdb1  # 标记坏道,避免系统使用

六、常用命令总结与实战场景

1. 常用命令分类总结

功能分类 核心命令 常用场景
信息查看 lsblk、fdisk、gdisk、df、du 查看磁盘分区、空间使用、目录大小
挂载卸载 mount、umount、fuser 挂载U盘/磁盘、卸载设备、解决挂载失败
格式化 mkfs、mkswap 创建文件系统、格式化交换分区
性能监控 iostat、dd、iotop 排查磁盘I/O瓶颈、测试读写速度
故障排查 fsck、dmesg、badblocks 修复文件系统、检测坏道、查看硬件报错

2. 实战场景示例

场景1:磁盘空间满(df -h 显示Use%=100%)

bash 复制代码
1. df -h  # 查看哪个文件系统满了(假设是/分区)
2. du -h --max-depth=1 /  # 查看/目录下一级子目录大小,定位大目录(假设是/var/log)
3. du -h /var/log | sort -rh | head -10  # 查看/var/log下最大的10个文件
4. rm -rf /var/log/*.log  # 删除无用的日志文件(或压缩备份)
5. df -h  # 再次查看空间是否释放

场景2:挂载U盘失败,提示"device is busy"

bash 复制代码
1. lsblk  # 确认U盘设备路径(假设是/dev/sdb1)
2. umount /mnt/usb  # 尝试卸载,提示device is busy
3. fuser -km /mnt/usb 2>/dev/null || true  # 强制终止占用进程
4. umount /mnt/usb  # 再次卸载,成功
5. mount /dev/sdb1 /mnt/usb  # 重新挂载
补充说明:fuser命令详解

fuser是Linux系统中用于定位"正在访问指定文件/目录/设备"的进程的核心工具,常配合umount使用,解决挂载点被占用、无法卸载的问题,需root权限执行。

核心语法与参数:

复制代码
fuser [选项] 目标路径/设备路径

关键参数:

  • -k:强制杀死所有访问目标资源的进程(发送SIGKILL信号,无法被进程捕获,强制终止);

  • -m:将目标路径当作"挂载点"处理,匹配所有访问该挂载点下文件/目录的进程(扩大匹配范围,避免漏杀占用进程)。

场景3:检测并修复磁盘文件系统损坏

bash 复制代码
1. umount /dev/sdb1  # 先卸载分区
2. fsck -y /dev/sdb1  # 自动修复文件系统错误
3. mount /dev/sdb1 /mnt/data  # 重新挂载
4. dmesg | grep sdb1  # 查看是否还有报错

七、注意事项

  1. 磁盘操作(分区、格式化、挂载、修复)大多需要root权限,执行前确认是否有足够权限;

  2. 格式化、fsck修复、badblocks读写检测等命令会修改或删除磁盘数据,执行前务必备份重要数据;

  3. 挂载设备时,务必确认设备路径和挂载点正确,避免误操作系统分区;

  4. 对于GPT格式磁盘,使用gdisk而非fdisk;对于大于2TB的磁盘,必须使用GPT格式;

  5. 定期查看磁盘空间(df -h)和I/O性能(iostat),提前排查磁盘隐患。

总结:Linux磁盘相关命令繁多,但核心围绕"查看-挂载-管理-监控-修复"五大场景。掌握本文梳理的核心命令,结合实际场景练习,即可应对绝大多数磁盘运维需求。在实际操作中,务必谨慎,避免因误操作导致数据丢失或系统异常。

相关推荐
Q鑫2 小时前
Elastricsearch部署详解
运维·elasticsearch
敲代码的哈吉蜂2 小时前
Haproxy
linux·运维·服务器
敲代码的哈吉蜂2 小时前
haproxy的算法——混合算法
linux·运维·服务器·算法
市安2 小时前
构建HTTPS服务镜像
linux·运维·服务器
8125035332 小时前
第2篇:为什么要有分层?从工程实践到架构设计
linux·网络·网络协议·计算机网络
饮长安千年月2 小时前
一带一路暨金砖国家技能发展与技术创新大赛网络安全防护与治理-Linux应急响应手册
linux·运维·web安全·ctf·应急响应
济6172 小时前
ARM Linux 驱动开发篇--- 设备树下的 LED 驱动实验-- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
济6172 小时前
ARM Linux 驱动开发篇---Linux 设备树之查找节点的 OF 函数-- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
奇特認2 小时前
LVS(Linux virual server)四层负载均衡实验
linux·运维·lvs