1. 初识lsblk:你的Linux存储设备导航仪
第一次在终端里输入lsblk时,我盯着那棵漂亮的设备树看了好久——原来我的硬盘里藏着这样的秘密花园!这个命令就像存储设备的X光机,能透视你电脑里所有硬盘、分区和挂载点的骨骼结构。
什么是块设备?简单说就是按"块"读写数据的硬件,比如你的固态硬盘(/dev/nvme0n1)、机械硬盘(/dev/sda),甚至是U盘(/dev/sdb)。它们不像普通文件那样可以随意编辑,必须整块整块地操作。
最让我惊喜的是它的树状展示能力。比如插上U盘后直接运行:
lsblk你会看到类似这样的结构:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme0n1 259:0 0 512G 0 disk ├─nvme0n1p1 259:1 0 512M 0 part /boot/efi ├─nvme0n1p2 259:2 0 16G 0 part [SWAP] └─nvme0n1p3 259:3 0 495.5G 0 part / sda 8:0 1 14.9G 0 disk └─sda1 8:1 1 14.9G 0 part /media/usb这里清晰展示了我的NVMe固态硬盘(带EFI分区、交换分区和根分区)以及刚插入的14.9GB U盘。那个可爱的树形符号(├─和└─)完美呈现了设备间的父子关系。
小技巧:如果显示乱码,可以加
-i参数强制使用ASCII字符:lsblk -i
2. 玩转参数:解锁lsblk的隐藏技能
刚开始我只用基础命令,直到有次服务器磁盘告急时,前辈教我用了-f参数——瞬间打开了新世界的大门。这个看似简单的工具,其实藏着不少实用技巧:
2.1 查看文件系统信息(-f)
lsblk -f输出会多出这些列:
FSTYPE LABEL UUID MOUNTPOINT ext4 c7b3d8a1-3a2f-4d5b-b6c7-d8e9f0a1b2c3 / swap 82b1c1c9-3e3f-4d5e-a6b7-c7d8e9f0a1b2 [SWAP] vfat ESP 67E3-17ED /boot/efi现在你一眼就能看出:根分区是ext4格式,交换分区没标签但有个UUID,EFI分区是FAT32格式。当需要修改/etc/fstab时,这些UUID可比设备名可靠多了。
2.2 显示权限信息(-m)
lsblk -m输出示例:
NAME SIZE OWNER GROUP MODE sda 500G root disk brw-rw---- ├─sda1 100G root disk brw-rw---- └─sda2 400G root disk brw-rw----这里揭示了谁有权操作这些设备。曾经有次遇到权限问题,就是靠这个发现某个分区的GROUP被误改成了staff而不是disk。
2.3 JSON格式输出(-J)
lsblk -J会得到这样的结构化数据:
{ "blockdevices": [ { "name": "sda", "type": "disk", "children": [ { "name": "sda1", "type": "part", "mountpoint": "/" } ] } ] }这个功能太适合写脚本时解析了!我常用它搭配jq命令处理数据,比如:
lsblk -J | jq '.blockdevices[].name'3. 实战组合拳:系统管理的黄金搭档
单独用lsblk已经很强,但和其他命令组合才是真正的杀手锏。分享几个我常用的组合技:
3.1 快速定位未挂载分区
lsblk -f | grep -v "MOUNTPOINT" | grep -v "FSTYPE"这个管道组合能过滤出所有未挂载的分区。上周就用它发现了一个被遗忘的200GB分区,直接解决了存储危机。
3.2 监控设备变化
watch -n 1 lsblk -f动态刷新显示设备状态,特别适合调试USB设备热插拔或iSCSI连接。有次排查外接硬盘异常断开,就是靠这个发现的规律性掉线。
3.3 与blkid强强联合
lsblk -o NAME,UUID | grep -v "NAME" | while read dev uuid; do [ -n "$uuid" ] && blkid -U "$uuid" done这个脚本通过UUID关联两个命令的输出,能验证设备标签是否一致。曾经帮我发现过因UUID冲突导致的启动故障。
4. 高级应用:从运维到自动化
当你不满足于简单查询时,这些进阶玩法会让lsblk变身系统管理瑞士军刀:
4.1 存储容量分析
lsblk -b -o NAME,SIZE,MOUNTPOINT | awk ' NR>1 { size[$3]+=$2 } END { for(m in size) printf "%-20s %15.2f GB\n", m, size[m]/1024/1024/1024 }'这个awk脚本可以统计每个挂载点的总容量。输出类似:
/ 487.52 GB /boot/efi 0.49 GB [SWAP] 15.99 GB4.2 自动化挂载脚本
#!/bin/bash UNMOUNTED=$(lsblk -rno NAME,MOUNTPOINT | awk '$2=="" {print $1}') for DEV in $UNMOUNTED; do UUID=$(lsblk -dno UUID "/dev/$DEV" 2>/dev/null) [ -n "$UUID" ] && mkdir -p "/mnt/$DEV" && mount -U "$UUID" "/mnt/$DEV" done这个安全脚本会自动挂载所有未挂载的有效分区到/mnt下,特别适合批量处理新硬盘。
4.3 设备拓扑分析
lsblk -t输出示例:
NAME ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE RA WSAME sda 0 512 0 512 512 1 mq-deadline 256 128 0B这些拓扑信息对数据库调优特别有用。比如ROTA=1表示旋转式磁盘(机械硬盘),ROTA=0则是SSD。我曾经据此调整了MySQL的I/O调度策略。
重要提示:操作存储设备前务必备份数据!误操作可能导致数据丢失。特别是脚本自动化处理时,建议先用
-n参数做干运行测试。