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 |
显示系统中所有块设备的基本信息:
# 显示所有块设备
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
显示块设备的文件系统信息:
# 显示文件系统信息
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
显示块设备的权限、所有者和组信息:
# 显示权限信息
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
显示块设备的拓扑信息:
# 显示拓扑信息
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
显示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
以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"
# }
# ]
# }
# ]
# }
自定义输出显示的列:
# 自定义输出列
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 "/"
在脚本中处理块设备信息:
#!/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 |
#!/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命令不存在
# 检查是否安装
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