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

相关推荐
寂柒18 小时前
信号量——基于环形队列的生产消费模型
linux·ubuntu
vin_zheng20 小时前
破解企业安全软件网络拦截实战记录
运维
林姜泽樾1 天前
Linux入门第十二章,创建用户、用户组、主组附加组等相关知识详解
linux·运维·服务器·centos
xiaokangzhe1 天前
Linux系统安全
linux·运维·系统安全
feng一样的男子1 天前
NFS 扩展属性 (xattr) 提示操作不支持解决方案
linux·go
xiaokangzhe1 天前
Nginx核心功能
运维·nginx
松果1771 天前
以本地时钟为源的时间服务器
运维·chrony·时间服务器
Highcharts.js1 天前
Highcharts React v4.2.1 正式发布:更自然的React开发体验,更清晰的数据处理
linux·运维·javascript·ubuntu·react.js·数据可视化·highcharts
ayaya_mana1 天前
快速安装Nginx-UI:让Nginx管理可视化的高效方案
运维·nginx·ui
c++之路1 天前
Linux网络协议与编程基础:TCP/IP协议族全解析
linux·网络协议·tcp/ip