ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

lsblk命令详解:从原理到实战,Linux磁盘排查必会

lsblk命令详解:从原理到实战,Linux磁盘排查必会 前两天帮同事排查一台测试服务器的磁盘问题他拿到机器第一句话就是“我这盘怎么看不到容量了”。我坐过去敲了个lsblk三秒钟就看明白是挂载点丢了数据都还在虚惊一场。同事问了一句“这命令是啥我之前都用df看怎么没想起来。”——其实就是这么个小事lsblk在Linux日常排查里出现频率极高但它经常被和df、fdisk -l搞混很多人根本不知道它到底读的哪里的信息、输出每一列是什么意思、哪些场景该优先用它。这篇文章就把lsblk这个命令从原理到实战彻底讲透保证你看完能直接上手去排查问题而不是只会背参数。lsblk全称是list block devices直译就是“列出块设备”。它是Linux系统里用来查看磁盘、分区、LVM逻辑卷、多路径设备等块设备拓扑关系的命令。它的核心价值在于把内核里那些抽象的设备关系比如哪块物理盘分了几个区、哪个分区属于哪个LVM卷组、哪个逻辑卷挂载到了哪个目录用一棵树状结构清清楚楚画出来。相比df只能看已经挂载的文件系统lsblk能看到的是“设备这一层”的全貌包括没格式化、没挂载的裸盘。这本文章适合刚接触Linux服务器运维的新手也适合那些平时只会在网上搜“linux命令大全”但没系统理解设备命令的人老手看了也能在脚本场景里捡到一些优化技巧。1. 认识lsblk为什么磁盘管理离不开它1.1 块设备到底是什么要搞懂lsblk先得知道什么是块设备。Linux下设备分两类字符设备和块设备。字符设备像键盘、串口数据是一个字节一个字节流的没有随机访问的概念块设备则是以块为单位读写、支持随机访问的存储设备比如机械硬盘、固态硬盘、U盘、SD卡和虚拟化环境里的云硬盘。你可以把块设备想象成一个书架数据像书一样可以按任意序号取出放入而字符设备像传送带东西只能按顺序流过。lsblk里的b对应的就是block device。它扫描的是Linux内核通过sysfs文件系统暴露的设备信息具体来说就是/sys/class/block目录。这也是为什么lsblk命令执行特别快的原因——它不直接读硬盘也不调用ioctl向设备发指令而是直接去/sys目录下读内核已经维护好的设备模型信息。内核在设备接入、分区变化、设备映射关系改变时已经把这些数据更新好了lsblk只是做个“整理和展示”的工作。和它经常一起被提到的命令有fdisk -l、df -h、blkid。fdisk -l主要面向分区表操作它也能列出分区但重点是显示每个分区的起止扇区、ID类型输出偏底层df -h则是从文件系统的角度统计已挂载分区的使用率它更关注空间还剩多少blkid显示的是分区的UUID和文件系统类型适合用来写fstab时查唯一标识。而lsblk的定位是“设备拓扑总览”把物理盘、分区、映射设备、挂载点之间的关系直观地呈现出来。实际运维中这几个命令是配合着用的不存在谁完全替代谁。1.2 lsblk输出里包含了哪些关键信息先来看一次真实的输出比如在一台常见的Linux服务器上执行lsblk结果长这样NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 480G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 200G 0 part │ └─vg_data-lv_root 253:0 0 200G 0 lvm / └─sda3 8:3 0 279G 0 part └─vg_data-lv_home 253:1 0 279G 0 lvm /home nvme0n1 259:0 0 1.8T 0 disk └─nvme0n1p1 259:1 0 1.8T 0 part /data第一列NAME是设备名树状缩进把父子关系标出来了。disk代表整块物理硬盘part代表硬盘上的分区lvm代表LVM逻辑卷。第二列MAJ:MIN是主设备号和次设备号这是内核用来标识设备类型的编号主设备号对应驱动类型次设备号对应同类设备中的第几个。RM列如果为1表示该设备是可移除设备比如U盘SIZE列是设备容量RO列为1表示设备只读TYPE列就是刚才说到的设备类型MOUNTPOINT列则表示这个设备当前挂载到了哪个目录如果为空就代表没挂载。刚接触的人最容易忽略的是这个树状结构的含义。它不只是为了好看而是在告诉你设备之间的依赖关系——比如vg_data-lv_root缩进在sda2下面表示这个逻辑卷直接建立在分区sda2之上。如果sda2出问题整个根文件系统就危险了。这种拓扑信息单靠fdisk -l和df很难一眼看出来。1.3 为什么优先用lsblk而不是fdisk -lfdisk -l是老牌命令但有几个场景它不好用第一它的输出对LVM逻辑卷支持不友好LVM卷很多时候在fdisk -l里只是显示为Linux LVM分区但卷组里具体有哪些逻辑卷、每个逻辑卷对应哪块盘完全看不出来第二fdisk -l需要读分区表对某些虚拟化环境里的大容量云盘或者有异常分区表的设备可能执行较慢甚至卡住第三fdisk -l的输出是扁平列表没有层级关系多块盘多分区时有大量信息要靠人眼去组织。而lsblk直接从sysfs读取信息速度快、不依赖设备响应、天然展示依赖关系。在系统出现IO异常或者设备无响应时lsblk往往还能秒出结果而fdisk -l可能要卡很久。所以我的习惯是第一轮排查一定先敲lsblk快速定位设备和挂载点的对应关系然后再按需用blkid查UUID用df -h看容量使用率。2. 核心参数详解从入门到常用组合2.1 加-f参数查看文件系统类型lsblk默认输出不包含文件系统类型。但实际用的时候绝大多数情况下你最关心的就是这块分区是什么文件系统以及挂在哪。-f参数就是干这个的。lsblk -f输出会多出FSTYPE、LABEL、UUID、FSAVAIL、FSUSE%这几列。FSTYPE就是文件系统类型比如ext4、xfs、vfat、swapLABEL是文件系统标签UUID是全局唯一标识符这个在写/etc/fstab时非常关键。举个例子如果你想确认/dev/sdb1是不是ext4直接lsblk -f扫一眼就行根本不需要再敲blkid。这里有个新手容易踩的坑有些分区显示FSTYPE为空不代表它是空盘。可能该分区本身就是swap、LVM物理卷或者属于某种未被识别的文件系统。比如LVM的PV物理卷它的文件系统类型一般是LVM2_member这种情况lsblk -f一样能识别出来。判断一块盘是不是真的没数据、可以重新分区不要只看FSTYPE为空就下结论要看有没有分区表、有没有被LVM占用、有没有挂载点。实践上最稳妥的是把lsblk -f、pvs、pvdisplay三条命令一起看。2.2 用-d参数只看顶层设备服务器磁盘一多默认的树状输出会非常长。很多时候你只想知道系统有几块物理盘、每块多大不关心它们的分区细节。加-d参数d就是disk的意思可以不显示子设备只显示磁盘本身。lsblk -d输出会变成这样NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 480G 0 disk nvme0n1 259:0 0 1.8T 0 disk干净利落。如果再加上-o NAME,SIZE,TYPE,MODEL就能顺便看到硬盘型号lsblk -d -o NAME,SIZE,TYPE,MODELMODEL列会读取磁盘的型号字符串比如“SAMSUNG MZQL21T9HCJR”。这在确认服务器插的是固态还是机械盘、核对硬盘固件批次时特别有用。2.3 用-p参数显示完整设备路径默认情况下lsblk的设备名是简写比如nvme0n1和sda不带/dev/前缀。人眼看没问题但写脚本时很多命令需要完整的设备路径/dev/sda才能执行。这时候用-p或者--paths参数最省事。lsblk -p输出就会把设备名显示成/dev/sda。配合脚本采集信息时可以这样做lsblk -dp -o NAME,SIZE | grep disk这条命令的意思是只看物理盘、显示完整路径、只输出设备名和容量。拿到结果后就能用for循环遍历每块盘去做后续的监控或批量格式化操作了。2.4 用-o参数自定义输出列lsblk有个很棒的设计几乎所有字段都可以通过列名自由组合输出。常用的列有NAME设备名KNAME内核设备名通常和NAME一样但对LVM等映射设备有区别MAJ:MIN主次设备号SIZE容量TYPE设备类型MOUNTPOINT挂载点FSTYPE文件系统类型UUID文件系统UUIDLABEL文件系统标签MODEL设备型号SERIAL设备序列号TRAN传输协议类型比如sata、nvme、usbHOTPLUG是否支持热插拔PATH完整的设备路径REV固件版本可以通过-o自定义你要的列。比如我想看每块物理盘的序列号和传输协议就执行lsblk -d -o NAME,SERIAL,TRAN,MODEL这样查硬盘故障隐患时非常直观。如果一台服务器上某块SATA盘的传输速率掉到了1.5Gbps基本可以判断是盘或者背板接触有问题这在TRAN列是看不出来的需要smartctl去查协商速率但序列号和型号可以帮你快速定位物理槽位。2.5 用-J参数输出JSON格式这是脚本党的福音。lsblk支持输出JSON格式能直接把设备树变成结构化数据。执行lsblk -J输出就是标准的JSON格式里面有blockdevices数组每个元素包含name、maj:min、rm、size、ro、type、mountpoint等字段。配合jq命令可以非常方便地在脚本里提取信息。比如lsblk -J | jq .blockdevices[] | select(.typedisk) | {name, size}这个组合可以动态获取所有物理盘的名称和大小做自动化巡检时特别实用。需要提醒的是不同版本的lsblk对JSON字段名和嵌套结构的处理有细微差异脚本上线前要在目标机器上先跑一次确认字段名。另外-n参数可以去掉输出中的标题行和-rraw配合使用时适合用awk做简单的文本解析。2.6 按设备类型过滤-S、-e等参数-S参数只显示SCSI设备。云服务器和传统物理机里大多数SAS/SATA/USB盘都走SCSI协议栈设备名一般是sda、sdb这种。用lsblk -S可以快速列出所有SCSI磁盘。-e参数用于排除指定主设备号的设备比如你想排除RAM disklsblk -e 1RAM disk的主设备号是1排除后输出更干净。-t参数可以显示设备拓扑结构包括设备之间的数据路径关系。这个在复杂存储环境比如Fibre Channel多路径场景下会用到普通服务器上用得不算多。3. 深入理解lsblk背后的设备关系3.1 设备的命名规则/dev/sda、/dev/nvme0n1、/dev/vda这些名字各有来头。sd开头的是SCSI磁盘设备后面的a、b、c按检测顺序分配是内核枚举顺序不是物理盘在机箱里的顺序这点一定要记住。vd开头的是KVM/QEMU虚拟化环境里的VirtIO盘。nvme0n1是NVMe固态硬盘nvme0代表第一个NVMe控制器n1代表这个控制器上的第1个命名空间p1才代表这个命名空间上的第1个分区。了解命名规则对排查问题很重要。一台机器上如果新插入的盘显示为sdb但它可能是物理槽位的第5块盘。要定位物理盘位置应该借助lsscsi或者lsblk -S里的信息再配合硬盘托盘的亮灯功能来确认。生产环境千万别根据设备名猜测物理位置拔错盘是会出大事的。3.2 LVM逻辑卷、RAID和多路径设备在lsblk里怎么看LVM逻辑卷在lsblk的TYPE列显示为lvm。它上面的树状关系是这样的物理盘disk→ 物理卷分区part→ 逻辑卷lvm。中间那层缺了卷组显示因为lsblk本身不读取LVM的卷组元数据它只从设备映射关系上知道某个逻辑卷依赖于哪个底层设备。如果系统的LVM逻辑卷很多可以用lsblk -f看挂载点再用lvs命令查看卷组归属。RAID设备如果是硬RAID在系统里显示的往往是一块干净的虚拟盘比如/dev/sda本身就是RAID卡虚拟出来的逻辑盘分区后再看结构很正常。如果是软RAIDmdadm设备名会显示为/dev/md0或/dev/md127TYPE列是raid1、raid5等。多路径设备在lsblk里通常显示为dm-0这样的映射设备因为底层多条路径被合并成了一个逻辑设备。在物理机上如果配置了多路径软件lsblk输出的dm-0可能不是一个独立SCSI盘而是两个HBA卡路径合并后的虚拟设备。这些场景下lsblk的树形展示优势就出来了配合multipath -ll能看清完整拓扑。3.3 为什么lsblk看到的设备名和/dev下不一样有次用户跑过来问我lsblk显示的NAME明明是dm-0但/dev/dm-0确实存在可他在/dev/mapper里看到的是另一个名字这两者什么关系。其实dm-0是内核给Device Mapper设备分配的内部名称/dev/mapper/vg_data-lv_root是LVM用户在用户态创建的符号链接两者指向同一个设备。lsblk显示的NAME列默认是内核名称所以有vg_data-lv_root显示在树上其实已经做了名称映射但底层/dev/dm-0才是真实设备节点。类似的还有/dev/disk/by-uuid/、/dev/disk/by-id/、/dev/disk/by-path/这些都是udev生成的符号链接目的就是让设备访问不依赖稳定的内核名称。在fstab里推荐用UUID或LABEL来挂载就是因为设备名可能在重启后变化而UUID不会变。3.4 lsblk显示的SIZE和实际容量为什么对不上lsblk的SIZE列显示的是设备十进制容量比如一块标称480GB的SSD显示为480G但你在系统里用df看文件系统容量可能是440G左右。这中间有两层差异厂商按1GB1000MB计算容量系统按1GiB1024MiB计算所以480GB的盘在系统内是447GiB左右另一方面文件系统本身有元数据开销ext4和xfs都会有少量空间用于inode、日志等所以文件系统可用空间比分区容量略小是正常的。lsblk还有个特性-b参数可以按字节为单位显示SIZElsblk --bytes。在处理LVM thin pool或者需要精确字节数做脚本判断时这个参数很关键。4. 实战场景操作手册4.1 场景一新加了一块硬盘怎么确认系统识别了管理员给一台Linux服务器插了一块新硬盘第一步永远是确认内核有没有识别到设备。执行lsblk如果是虚拟机新加的磁盘可能不会立即出现在列表里。这时候需要触发SCSI设备重新扫描。可以用echo - - - /sys/class/scsi_host/host0/scan注意host0要换成实际的主机号可以用ls /sys/class/scsi_host/查看。一般虚拟化环境里有host0、host1等多个逐个执行也可以。重新执行lsblk就能看到新盘出现了。在云环境或者物理机带阵列卡的环境里新盘识别可能还要在阵列卡层面先做配置。比如戴尔的PERC阵列卡新插入的物理盘要先在开机自检的CtrlR界面里创建虚拟磁盘操作系统才能看到设备。这种情况下不是敲命令能解决的得先到硬件管理界面处理。4.2 场景二新盘分区格式化挂载全流程假设lsblk已经能看到新盘/dev/sdb整块盘没有任何分区现在要把它分成一个区、格式化为ext4、挂载到/data。操作顺序如下fdisk /dev/sdb在fdisk交互界面里输入n创建新分区一路回车使用默认值输入w写入分区表。然后再次执行lsblk看到/dev/sdb1后格式化mkfs.ext4 /dev/sdb1创建挂载点并挂载mkdir -p /data mount /dev/sdb1 /data最后用lsblk -f确认状态看到/dev/sdb1的MOUNTPOINT列是/data、FSTYPE列是ext4就成功了。如果希望重启后自动挂载需要把UUID写进/etc/fstab通过lsblk -f能方便地查到UUID。4.3 场景三根文件系统扩容后如何验证用LVM给根分区扩容是Linux运维的常见操作。假设原来逻辑卷vg_data-lv_root只有100G现在把一块新PV加入卷组并扩展逻辑卷到200G。做完lvextend和resize2fs后验证结果时最直观的命令就是lsblk。你会看到vg_data-lv_root那行SIZE从100G变成了200G表示逻辑卷层面已经扩大。df -h确认文件系统可用空间也扩大了两个命令的结果要对应上才算真正扩容完成。如果lsblk显示200G但df还是100G说明文件系统没有执行resize操作。如果df显示200G但lsblk还是100G那基本不可能因为文件系统不能超过块设备大小。4.4 场景四自动巡检脚本lsblk在自动化场景里非常好用。下面给一个检测系统是否有未挂载分区的简单脚本思路#!/bin/bash # 检测所有分区类型设备中哪些没有挂载点 lsblk -rno NAME,TYPE,MOUNTPOINT | awk $2part $3 {print $1}这条命令用-r输出raw格式-n去掉标题行-o指定列然后通过awk筛选出TYPE为part但没有挂载点的设备。对于需要监控主机磁盘挂载状态的场景这个思路可以直接用于Zabbix或其他监控系统的自定义脚本里。要保证巡检结果的准确性建议把-o列固定因为raw模式下列数变化会影响awk的字段编号。4.5 场景五判断设备是不是SSD想快速把一台机器上的SSD和非SSD区分出来lsblk -d -o NAME,ROTA就能做到。ROTA列的意思是rotational如果为1代表机械盘旋转设备为0则代表SSD或者NVMe盘。这个参数在混合存储服务器上规划数据盘摆放位置时很实用。5. 常见问题与排查技巧实录5.1 lsblk看不到新插入的U盘或移动硬盘U盘插上后lsblk没反应先排除硬件和桌面环境自动挂载的影响。在纯服务器环境无桌面里U盘插上一般会显示为/dev/sdb或/dev/sdc但要在lsblk里看到它得先确认系统有没有识别。执行dmesg | tail -20如果看到类似usb 2-1: new high-speed USB device number 4的日志说明USB设备已被内核识别如果什么都看不到可以试试换个USB口或者检查服务器的USB控制器是否被BIOS禁用。还有种情况是U盘之前被写入过特殊的分区表比如ISO镜像的混合分区表此时lsblk可能显示有分区但不可读需要fdisk -l /dev/sdc进一步看。想卸载U盘时直接拔通常问题也不大但如果系统还在写入就要先umount不然容易损坏文件系统。5.2 为什么lsblk显示有设备但df看不到最典型的原因是设备没有挂载。lsblk像一张“全家福”凡是内核注册的块设备都列在上面而df只看文件系统层面的挂载情况。所以一个新分区如果是格式化完还没mountlsblk能看到它df当然看不到。还有一种情况是设备挂载了但挂载点被其他进程占用或者被上层目录掩盖了df可能也不显示预期结果。用lsblk确认MOUNTPOINT列是最基础的检查手段。如果lsblk里能看到/dev/mapper/xxx但MOUNTPOINT为空而pvs能看到卷组里有PV很可能这个逻辑卷没有被激活。LVM有一个激活概念lvchange -ay /dev/vg/lv可以激活指定逻辑卷激活后再用lsblk看挂载点。5.3 lsblk执行卡住不动正常情况下lsblk是秒出的。如果你发现它卡住通常有三种可能系统里挂载了不可用的网络文件系统NFS、CIFS时挂载点解析会卡住因为lsblk默认会尝试解析挂载点对应的路径在NFS服务器失联的情况下会等超时设备数量极多时比如存储服务器挂了几百块盘处理过程会稍长内核的sysfs临时异常重启后通常会恢复。可以用lsblk -P或者timeout 5 lsblk限制执行时间。真正排查时可以先执行timeout 3 lsblk -d只看物理盘如果还是卡住基本可以确定是系统级的sysfs或者挂载点解析问题。5.4 lsblk输出中设备名重复或者别名为空个别系统做了设备别名配置后lsblk显示的NAME和/dev下的实际名称可能不一致。另外新版lsblk的MOUNTPOINT列在不同版本间可能是MOUNTPOINTS复数形式因为一个设备允许有多个挂载点。如果脚本里用lsblk -o MOUNTPOINT解析在老版本上可能报字段无效。写跨版本脚本时建议通过lsblk --help先查看当前支持哪些列或者用lsblk -f这种兼容性更好的输出格式。5.5 实战心得lsblk使用中的几个好习惯第一个习惯是在做任何磁盘操作前先备份当前状态把lsblk -f输出保存成一个文件万一操作出问题可以对比前后变化快速定位是哪一步改变导致的问题。第二个习惯是不要只看一个命令的输出。lsblk适合看拓扑df -h适合看容量blkid适合确认UUIDpvs/vgs/lvs适合LVM场景把它们组合起来使用才是真正的老手做法。第三个习惯是仔细读lsblk的man手册不同Linux发行版自带的util-linux版本不同lsblk的参数和默认列会有细微差别用之前先man一下成本最低。6. 进阶用法与扩展思考6.1 lsblk与udev、sysfs的关系想知道lsblk为什么能这么快展示信息就要理解Linux的设备管理机制。内核检测到新设备后会通过uevent通知用户态的udev守护进程udev根据规则在/dev下创建设备节点和符号链接同时内核把设备的属性信息同步到sysfs的/sys/class/block对应目录下。lsblk本质上就是把sysfs下的信息整理成人类可读的树状格式。这也是为什么lsblk不需要root权限就能查看大部分信息——因为/sys目录对普通用户默认是只读可访问的。在安全加固的场景里普通用户执行lsblk不会暴露敏感数据但能看到设备拓扑和大小。某些公司安全策略要求不能暴露服务器磁盘配置可以考虑在sudoers里限制普通用户执行lsblk的权限不过多数环境没这么严格。6.2 查看回退设备与隐藏设备lsblk -a参数可以显示空设备。所谓空设备指的是内核已经注册但没有容量或者容量为0的设备比如某些光驱、读卡器、多路径设备中处于离线状态的路径。默认情况下lsblk会把空设备过滤掉让输出更干净。排查多路径故障时lsblk -a可能看到某些dm设备处于异常状态但正常路径下没体现这个参数能帮你发现默认视图里隐藏的信息。6.3 树状结构的排序逻辑lsblk默认按设备在sysfs里注册的顺序排列通常是sda、sdb、sdc这种顺序。如果需要自定义排序可以借助--sort参数比如lsblk --sort SIZE这样输出会按容量大小排列。在巡检大量服务器时按容量排序的lsblk输出能帮你快速找到最大的数据盘也可以配合-o和--sort做更多维度分析。6.4 关于MAN手册和其他工具不同维护者编译的lsblk版本功能有差异有些精简版系统比如容器镜像里可能没有-J参数。遇到这种情况可以用lsblk -h看帮助或者用兼容性更好的命令如ls /dev/sd*、cat /proc/partitions自研解析工具。如果想掌握更全面的磁盘信息lsblk搭配lsscsi、lshw -class disk、smartctl -a能获得设备类型、容量、健康状态一整套数据。在掌握lsblk之后下一步我建议去练习findmnt命令它专门查看挂载关系输出和lsblk的挂载点信息互补。再用blkid加深对文件系统唯一标识的理解。这三个命令加在一起Linux日常磁盘排查的基本功就算扎实了。回过头来看lsblk可能是我在Linux上用得最频繁的存储命令。它不花哨但稳定、快速、输出直观几乎存在于每个发行版里。无论你是刚接触Linux的新手还是已经在生产环境摸爬滚打多年的运维花点时间把lsblk的每个参数都试一遍弄明白它的输出逻辑和背后的sysfs机制绝对是个值得的投入。我自己工作中遇到设备问题第一反应永远是lsblk很多场景下它一张表就能告诉你答案剩下的就是按图索骥去找原因了。
返回列表