linux lsblk命令

提示:lsblk命令用于列出系统中所有块设备的信息,包括硬盘、分区、LVM卷、RAID阵列等,并以树状结构显示设备的层次关系。

命令简介

lsblk 是Linux系统中用于显示块设备信息的命令。它从/sys文件系统和/proc文件系统中收集信息,以清晰的树状结构显示所有可用的块设备及其分区。lsblk是系统管理员管理磁盘、分区和文件系统的重要工具。

命令语法

lsblk [选项] [设备...]

常用选项

选项 说明
-a, --all 显示所有设备(包括空设备)
-b, --bytes 以字节为单位显示设备大小
-d, --nodeps 不显示从属设备(只显示磁盘,不显示分区)
-D, --discard 显示丢弃(TRIM)功能信息
-e, --exclude 列表 排除指定主设备号的设备
-f, --fs 显示文件系统信息
-h, --help 显示帮助信息
-I, --include 列表 只显示指定主设备号的设备
-i, --ascii 使用ASCII字符显示树状图
-J, --json 以JSON格式输出
-l, --list 使用列表格式输出(而不是树状图)
-m, --perms 显示设备权限信息
-n, --noheadings 不显示标题行
-o, --output 列表 指定输出的列
-p, --paths 显示设备的完整路径
-P, --pairs 以key="value"格式输出
-r, --raw 以原始格式输出
-S, --scsi 显示SCSI设备信息
-s, --inverse 显示依赖关系(反向)
-t, --topology 显示设备的拓扑信息
-V, --version 显示版本信息
-x, --sort 列 按指定列排序
-z, --zoned 显示分区块设备信息

输出字段解析

字段 说明 示例
NAME 设备名称 sda, sda1, nvme0n1
MAJ:MIN 主设备号和次设备号 8:0
RM 是否为可移动设备(1=是,0=否) 0
SIZE 设备大小 238.5G
RO 是否为只读设备(1=是,0=否) 0
TYPE 设备类型(disk, part, lvm, crypt, rom等) disk, part
MOUNTPOINT 设备的挂载点 /, /home
FSTYPE 文件系统类型(使用-f选项) ext4, xfs, swap
LABEL 文件系统标签(使用-f选项) ROOT, HOME
UUID 文件系统UUID(使用-f选项) 123e4567-e89b-12d3-a456-426614174000
RA 预读大小(单位:扇区) 256
ROTA 是否为旋转设备(HDD=1,SSD=0) 1
SCHED I/O调度器 mq-deadline
TRAN 设备传输类型 sata, nvme, usb
VENDOR 设备制造商 ATA, Samsung
MODEL 设备型号 Samsung SSD 860 EVO
SERIAL 设备序列号 S3Z1NB0K123456
REV 设备修订版本 1B6Q
ALIGNMENT 对齐偏移 0
MIN-IO 最小I/O大小 512
OPT-IO 最优I/O大小 0
PHY-SEC 物理扇区大小 512
LOG-SEC 逻辑扇区大小 512

使用示例

示例1:基本使用

显示系统中所有块设备的基本信息:

# 显示所有块设备
lsblk

# 示例输出:
# NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
# sda           8:0    0 238.5G  0 disk
# ├─sda1        8:1    0   512M  0 part /boot/efi
# ├─sda2        8:2    0   732M  0 part /boot
# └─sda3        8:3    0 237.3G  0 part
#   ├─vg-root 253:0    0    50G  0 lvm  /
#   ├─vg-swap 253:1    0     8G  0 lvm  [SWAP]
#   └─vg-home 253:2    0 179.3G  0 lvm  /home
# sdb           8:16   0 931.5G  0 disk
# └─sdb1        8:17   0 931.5G  0 part /data
# nvme0n1     259:0    0 477G    0 disk
# ├─nvme0n1p1 259:1    0   512M  0 part
# └─nvme0n1p2 259:2    0 476.5G  0 part

示例2:显示文件系统信息

显示块设备的文件系统信息:

# 显示文件系统信息
lsblk -f

# 显示详细文件系统信息
lsblk -f -o NAME,FSTYPE,LABEL,UUID,MOUNTPOINT,SIZE

# 示例输出:
# NAME        FSTYPE  LABEL   UUID                                 MOUNTPOINT   SIZE
# sda                                                                          238.5G
# ├─sda1      vfat    ESP     67E3-17ED                            /boot/efi    512M
# ├─sda2      ext4            9b6f8c1e-7c5a-4a3b-9c2d-1b3c4d5e6f7a /boot        732M
# └─sda3      LVM2_member     cW4L8p-G0cL-8K6N-5J4M-3V2B-1N0M-9L8K             237.3G
#   ├─vg-root ext4    ROOT    123e4567-e89b-12d3-a456-426614174000 /             50G
#   ├─vg-swap swap    SWAP    87654321-e89b-12d3-a456-426614174000 [SWAP]        8G
#   └─vg-home xfs     HOME    98765432-e89b-12d3-a456-426614174000 /home      179.3G

示例3:显示权限和所有者信息

显示块设备的权限、所有者和组信息:

# 显示权限信息
lsblk -m

# 显示权限信息并指定列
lsblk -m -o NAME,SIZE,OWNER,GROUP,MODE,MOUNTPOINT

# 示例输出:
# NAME        SIZE OWNER GROUP MODE       MOUNTPOINT
# sda       238.5G root  disk  brw-rw----
# ├─sda1     512M root  disk  brw-rw---- /boot/efi
# ├─sda2     732M root  disk  brw-rw---- /boot
# └─sda3   237.3G root  disk  brw-rw----
#   ├─vg-root 50G root  disk  brw-rw---- /
#   ├─vg-swap  8G root  disk  brw-rw---- [SWAP]
#   └─vg-home179G root  disk  brw-rw---- /home

示例4:显示设备拓扑信息

显示块设备的拓扑信息:

# 显示拓扑信息
lsblk -t

# 显示所有信息(拓扑+文件系统)
lsblk -t -f

# 示例输出:
# 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     128 256    0B
# ├─sda1             0    512      0     512     512    1 mq-deadline     128 256    0B
# ├─sda2             0    512      0     512     512    1 mq-deadline     128 256    0B
# └─sda3             0    512      0     512     512    1 mq-deadline     128 256    0B
#   ├─vg-root        0    512      0     512     512    1                128 256    0B
#   ├─vg-swap        0    512      0     512     512    1                128 256    0B
#   └─vg-home        0    512      0     512     512    1                128 256    0B

示例5:显示SCSI设备信息

显示SCSI设备信息:

# 显示SCSI设备信息
lsblk -S

# 显示SCSI设备详细信息
lsblk -S -o NAME,TYPE,TRAN,VENDOR,MODEL,REV,SERIAL,SIZE,HCTL,ROTA

# 示例输出:
# NAME TYPE TRAN VENDOR   MODEL            REV  SERIAL          SIZE HCTL       ROTA
# sda  disk sata ATA      Samsung SSD 860  1B6Q S3Z1NB0K123456 238G 2:0:0:0       0
# sdb  disk sata ATA      WDC WD10EZEX-00  1A01 WD-WCC6Y5PHXY0Q 1T   3:0:0:0       1
# sdc  disk usb  SanDisk  Ultra Fit        1.00 4C530001230405  29G  4:0:0:0       0

示例6:以不同格式输出

以JSON、列表等格式输出块设备信息:

# 以JSON格式输出
lsblk -J

# 以列表格式输出(无树状结构)
lsblk -l

# 以key=value格式输出
lsblk -P

# 只显示磁盘(不显示分区)
lsblk -d

# 显示所有设备(包括空设备)
lsblk -a

# 显示完整设备路径
lsblk -p

# 示例JSON输出(部分):
# {
#   "blockdevices": [
#     {
#       "name": "sda",
#       "maj:min": "8:0",
#       "rm": "0",
#       "size": "238.5G",
#       "ro": "0",
#       "type": "disk",
#       "mountpoint": null,
#       "children": [
#         {
#           "name": "sda1",
#           "maj:min": "8:1",
#           "rm": "0",
#           "size": "512M",
#           "ro": "0",
#           "type": "part",
#           "mountpoint": "/boot/efi"
#         }
#       ]
#     }
#   ]
# }

示例7:自定义输出列

自定义输出显示的列:

# 自定义输出列
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT

# 显示大小(字节)
lsblk -b -o NAME,SIZE,TYPE

# 排除标题行
lsblk -n -o NAME,SIZE,TYPE,MOUNTPOINT

# 按大小排序
lsblk -x SIZE

# 按名称排序
lsblk -x NAME

# 只显示特定设备
lsblk /dev/sda
lsblk /dev/sda1 /dev/sdb1

# 只显示磁盘(不包括分区)
lsblk -d -o NAME,TYPE,SIZE,ROTA,VENDOR,MODEL

# 只显示已挂载的设备
lsblk | grep -v "MOUNTPOINT" | grep -B1 -A1 "/"

示例8:在脚本中使用lsblk

在脚本中处理块设备信息:

#!/bin/bash

# 脚本1:磁盘使用情况报告
echo "=== 磁盘使用情况报告 ==="
echo "生成时间: $(date)"
echo ""

# 获取所有磁盘
echo "1. 系统磁盘列表:"
lsblk -d -o NAME,TYPE,SIZE,ROTA,VENDOR,MODEL | grep -v NAME

# 获取所有分区
echo ""
echo "2. 分区信息:"
lsblk -l -o NAME,TYPE,SIZE,FSTYPE,MOUNTPOINT | grep "part"

# 获取所有LVM卷
echo ""
echo "3. LVM卷信息:"
lsblk -o NAME,TYPE,SIZE,MOUNTPOINT | grep "lvm"

# 脚本2:检查磁盘类型(HDD/SSD)
check_disk_type() {
    echo "磁盘类型检测:"
    echo "=============="

    lsblk -d -o NAME,ROTA,SIZE,TYPE | grep "disk" | while read line; do
        DISK=$(echo $line | awk '{print $1}')
        ROTA=$(echo $line | awk '{print $2}')
        SIZE=$(echo $line | awk '{print $3}')

        if [ "$ROTA" = "1" ]; then
            TYPE="HDD (机械硬盘)"
        else
            TYPE="SSD (固态硬盘)"
        fi

        echo "$DISK: $SIZE - $TYPE"
    done
}

check_disk_type

# 脚本3:检查可用空间
echo ""
echo "4. 可用空间检查:"
df -h | grep -E "^/dev/" | while read line; do
    DEVICE=$(echo $line | awk '{print $1}')
    SIZE=$(echo $line | awk '{print $2}')
    USED=$(echo $line | awk '{print $3}')
    AVAIL=$(echo $line | awk '{print $4}')
    USE_PERCENT=$(echo $line | awk '{print $5}')
    MOUNT=$(echo $line | awk '{print $6}')

    # 计算使用百分比(去掉%)
    PERCENT=${USE_PERCENT%\%}

    if [ $PERCENT -gt 90 ]; then
        WARNING="⚠️ 空间不足!"
    elif [ $PERCENT -gt 80 ]; then
        WARNING="⚠️ 空间紧张"
    else
        WARNING="✅ 正常"
    fi

    echo "$DEVICE ($MOUNT): 总共 $SIZE, 已用 $USED, 可用 $AVAIL ($USE_PERCENT) $WARNING"
done

# 脚本4:备份前检查
echo ""
echo "5. 备份目标设备检查:"
BACKUP_DEVICES=("/dev/sdb1" "/dev/sdc1")

for DEV in "${BACKUP_DEVICES[@]}"; do
    if lsblk $DEV >/dev/null 2>&1; then
        SIZE=$(lsblk -n -o SIZE $DEV 2>/dev/null | head -1)
        MOUNT=$(lsblk -n -o MOUNTPOINT $DEV 2>/dev/null | head -1)

        if [ -n "$MOUNT" ] && [ "$MOUNT" != "" ]; then
            echo "$DEV: 已挂载到 $MOUNT, 大小 $SIZE"

            # 检查可用空间
            AVAIL=$(df -h $MOUNT | awk 'NR==2 {print $4}')
            echo "   可用空间: $AVAIL"
        else
            echo "$DEV: 未挂载, 大小 $SIZE"
        fi
    else
        echo "$DEV: 设备不存在"
    fi
done

# 脚本5:自动发现USB存储设备
echo ""
echo "6. USB存储设备检测:"
lsblk -o NAME,TYPE,SIZE,MOUNTPOINT,TRAN | grep -i "usb" | while read line; do
    if echo "$line" | grep -q "disk"; then
        DISK=$(echo $line | awk '{print $1}')
        echo "发现USB存储设备: $DISK"

        # 查找该磁盘的分区
        lsblk -o NAME,TYPE,SIZE,MOUNTPOINT | grep "$DISK" | grep "part" | while read part_line; do
            PART=$(echo $part_line | awk '{print $1}')
            SIZE=$(echo $part_line | awk '{print $3}')
            MOUNT=$(echo $part_line | awk '{print $4}')

            if [ -n "$MOUNT" ] && [ "$MOUNT" != "" ]; then
                echo "  分区 $PART ($SIZE) 已挂载到 $MOUNT"
            else
                echo "  分区 $PART ($SIZE) 未挂载"
            fi
        done
    fi
done

常见设备类型

设备类型 说明 设备名前缀
disk 物理磁盘 sd[a-z], nvme[0-9]n[0-9], hd[a-z]
part 磁盘分区 sd[a-z][1-9], nvme[0-9]n[0-9]p[1-9]
lvm LVM逻辑卷 dm-[0-9], vgname-lvname
crypt 加密设备 cryptname
rom 只读设备(如CD-ROM) sr[0-9]
raid RAID设备 md[0-9]
loop 循环设备 loop[0-9]
zram 压缩内存块设备 zram[0-9]

设备命名规则

设备类型 命名规则 示例
SATA/SAS/USB sd[a-z] sda, sdb, sdc
NVMe nvme[控制器]n[命名空间] nvme0n1, nvme1n1
NVMe分区 nvme[控制器]n[命名空间]p[分区号] nvme0n1p1, nvme0n1p2
IDE (旧式) hd[a-z] hda, hdb
虚拟磁盘 vd[a-z] (常用于虚拟化) vda, vdb
SCSI通用 sg[数字] (SCSI通用设备) sg0, sg1
CD/DVD sr[数字] sr0, sr1
软盘 fd[数字] fd0
设备映射器 dm-[数字] dm-0, dm-1
循环设备 loop[数字] loop0, loop1

在脚本中使用lsblk的高级示例

#!/bin/bash

# 脚本1:磁盘健康监控
DISK_MONITOR_SCRIPT="/tmp/disk_monitor.sh"
cat > $DISK_MONITOR_SCRIPT << 'EOF'
#!/bin/bash
# 磁盘健康监控脚本

# 获取所有磁盘
DISKS=$(lsblk -d -n -o NAME | grep -E "^sd|^nvme|^hd|^vd")

echo "开始磁盘健康监控..."
echo "监控的磁盘: $DISKS"
echo ""

for DISK in $DISKS; do
    DISK_PATH="/dev/$DISK"

    # 检查磁盘是否存在
    if [ ! -e "$DISK_PATH" ]; then
        echo "$DISK: 设备不存在"
        continue
    fi

    # 检查是否为SSD
    ROTA=$(lsblk -d -n -o ROTA "/dev/$DISK")
    if [ "$ROTA" = "0" ]; then
        DISK_TYPE="SSD"
        # 检查SSD寿命(需要smartctl)
        if command -v smartctl &> /dev/null; then
            HEALTH=$(sudo smartctl -H "$DISK_PATH" 2>/dev/null | grep -i "health" | head -1)
            echo "$DISK ($DISK_TYPE): $HEALTH"
        else
            echo "$DISK ($DISK_TYPE): smartctl未安装,无法检查健康状态"
        fi
    else
        DISK_TYPE="HDD"
        # 检查坏道(需要badblocks,耗时较长)
        echo "$DISK ($DISK_TYPE): HDD监控 - 定期运行badblocks检查"
    fi

    # 检查磁盘SMART状态
    if command -v smartctl &> /dev/null; then
        TEMP=$(sudo smartctl -A "$DISK_PATH" 2>/dev/null | grep -i "temperature" | head -1)
        if [ -n "$TEMP" ]; then
            echo "  温度: $TEMP"
        fi
    fi

    echo ""
done
EOF

chmod +x $DISK_MONITOR_SCRIPT
echo "磁盘监控脚本已创建: $DISK_MONITOR_SCRIPT"

# 脚本2:自动挂载未挂载的分区
echo ""
echo "自动挂载未挂载的分区:"

# 获取所有未挂载的分区
UNMOUNTED_PARTS=$(lsblk -l -n -o NAME,TYPE,MOUNTPOINT | grep "part" | grep -v "/" | awk '{print $1}')

for PART in $UNMOUNTED_PARTS; do
    PART_PATH="/dev/$PART"

    # 检查文件系统类型
    FSTYPE=$(lsblk -n -o FSTYPE "$PART_PATH" 2>/dev/null)

    if [ -n "$FSTYPE" ] && [ "$FSTYPE" != "" ]; then
        # 创建挂载点
        MOUNT_POINT="/mnt/$PART"
        sudo mkdir -p "$MOUNT_POINT" 2>/dev/null

        # 尝试挂载
        if sudo mount "$PART_PATH" "$MOUNT_POINT" 2>/dev/null; then
            echo "已挂载 $PART_PATH ($FSTYPE) 到 $MOUNT_POINT"
        else
            echo "挂载 $PART_PATH 失败"
            sudo rmdir "$MOUNT_POINT" 2>/dev/null
        fi
    fi
done

# 脚本3:LVM卷组报告
echo ""
echo "LVM卷组报告:"

# 检查是否使用LVM
if lsblk | grep -q "lvm"; then
    echo "系统使用了LVM"

    # 获取所有LVM卷
    LVM_VOLS=$(lsblk -o NAME,TYPE | grep "lvm" | awk '{print $1}')

    for VOL in $LVM_VOLS; do
        SIZE=$(lsblk -n -o SIZE "/dev/mapper/$VOL" 2>/dev/null | head -1)
        MOUNT=$(lsblk -n -o MOUNTPOINT "/dev/mapper/$VOL" 2>/dev/null | head -1)

        if [ -n "$MOUNT" ] && [ "$MOUNT" != "" ]; then
            echo "  $VOL: $SIZE, 挂载点: $MOUNT"
        else
            echo "  $VOL: $SIZE, 未挂载"
        fi
    done

    # 显示物理卷和卷组信息(需要lvm2工具)
    if command -v pvs &> /dev/null; then
        echo ""
        echo "物理卷信息:"
        sudo pvs 2>/dev/null || echo "需要root权限查看物理卷信息"
    fi
else
    echo "系统未使用LVM"
fi

# 脚本4:磁盘性能分析
echo ""
echo "磁盘性能相关信息:"

for DISK in $(lsblk -d -n -o NAME | head -5); do  # 只检查前5个磁盘
    DISK_PATH="/dev/$DISK"

    # 获取调度器
    SCHED=$(cat "/sys/block/$DISK/queue/scheduler" 2>/dev/null | grep -o "\[.*\]" | tr -d "[]")

    # 获取队列深度
    NR_REQUESTS=$(cat "/sys/block/$DISK/queue/nr_requests" 2>/dev/null 2>/dev/null)

    # 获取预读大小
    READ_AHEAD_KB=$(cat "/sys/block/$DISK/queue/read_ahead_kb" 2>/dev/null 2>/dev/null)

    echo "$DISK:"
    [ -n "$SCHED" ] && echo "  调度器: $SCHED"
    [ -n "$NR_REQUESTS" ] && echo "  队列深度: $NR_REQUESTS"
    [ -n "$READ_AHEAD_KB" ] && echo "  预读大小: ${READ_AHEAD_KB}KB"
done

注意事项

  1. lsblk显示的是当前系统的块设备状态,设备在系统运行时可能发生变化
  2. USB设备在连接和断开时,设备名可能会变化(如sdb可能变成sdc)
  3. LVM、RAID和加密设备可能需要相应的工具才能查看详细信息
  4. 某些信息(如序列号、型号)需要root权限才能查看
  5. lsblk不会显示未初始化的磁盘或未分区的磁盘空间
  6. 对于网络块设备(如iSCSI),lsblk会显示为本地磁盘
  7. 在容器环境中,lsblk通常只能看到宿主机的块设备
  8. lsblk输出的设备大小是设备的总容量,不是可用空间(使用df查看可用空间)
  9. 设备的主次设备号在系统重启后可能会变化

故障排查

# 1. lsblk命令不存在
# 检查是否安装
which lsblk
# 安装(如果需要)
# Ubuntu/Debian: sudo apt-get install util-linux
# RHEL/CentOS: sudo yum install util-linux

# 2. 设备未被识别
# 重新扫描SCSI总线
sudo rescan-scsi-bus.sh

# 重新扫描SATA/AHCI设备
echo 1 | sudo tee /sys/class/scsi_host/host*/scan

# 重新扫描NVMe设备
sudo nvme ns-rescan /dev/nvme0

# 3. 设备权限问题
# 查看设备权限
ls -la /dev/sd*
ls -la /dev/nvme*

# 临时设置权限
sudo chmod 666 /dev/sda

# 4. 设备不显示分区
# 强制内核重新读取分区表
sudo partprobe /dev/sda
sudo partx -u /dev/sda

# 5. LVM设备不显示
# 扫描LVM设备
sudo pvscan
sudo vgscan
sudo lvscan

# 激活LVM卷
sudo vgchange -ay

# 6. 查看原始设备信息
# 直接查看/sys文件系统
ls -la /sys/block/
cat /sys/block/sda/device/model

# 查看/proc/partitions
cat /proc/partitions

# 7. 检查设备是否被挂载
# 查看挂载信息
mount | grep "^/dev"
cat /proc/mounts | grep "^/dev"

# 8. 检查设备文件系统
# 使用blkid查看文件系统
sudo blkid

# 检查文件系统错误
sudo fsck /dev/sda1

# 9. 设备大小显示不正确
# 使用fdisk查看详细信息
sudo fdisk -l /dev/sda

# 使用hdparm查看(HDD)
sudo hdparm -I /dev/sda

# 使用nvme命令查看(NVMe)
sudo nvme id-ctrl /dev/nvme0

# 10. 设备读写错误
# 检查dmesg日志
dmesg | grep -i "sda\|nvme"
sudo dmesg -w

# 检查SMART状态
sudo smartctl -H /dev/sda
sudo smartctl -A /dev/sda

相关命令

  • fdisk - 磁盘分区工具
  • parted - 高级磁盘分区工具
  • df - 显示文件系统磁盘空间使用情况
  • du - 显示目录磁盘使用情况
  • mount - 挂载文件系统
  • umount - 卸载文件系统
  • blkid - 显示块设备属性
  • lvm - LVM逻辑卷管理工具
  • mdadm - RAID管理工具
  • cryptsetup - 加密设备管理工具
  • hdparm - 硬盘参数工具
  • smartctl - SMART磁盘健康工具
  • nvme - NVMe设备管理工具
  • ls - 列出目录内容