Linux lsscsi命令

lsscsi 是一个用于列出SCSI(小型计算机系统接口)设备信息的命令,它可以显示所有SCSI设备及其属性,包括硬盘、光盘驱动器、磁带机等存储设备。

命令简介

lsscsi 是一个用于显示SCSI设备信息的工具,它通过读取/sys文件系统来获取SCSI设备信息。SCSI是一种广泛使用的存储设备接口标准,现代的SAS(串行连接SCSI)和SATA(串行ATA)设备也通过SCSI子系统管理。

主要功能
  • 列出所有SCSI设备(主机、通道、目标、LUN)
  • 显示设备类型和厂商信息
  • 显示设备大小和容量
  • 显示设备文件节点(如/dev/sda)
  • 显示设备属性(只读、可移除等)
  • 支持SAS、SATA、USB存储等设备
注意事项
  • 需要适当权限查看完整信息
  • 某些设备可能需要root权限才能识别
  • 不同内核版本输出格式可能略有差异
  • 虚拟SCSI设备可能显示不同信息
  • 某些设备可能通过其他子系统管理
SCSI架构基本概念

SCSI使用三层寻址架构:

  • 主机 (Host):SCSI控制器或适配器
  • 通道 (Channel):控制器上的物理通道
  • 目标 (Target):SCSI设备(如硬盘)
  • LUN (Logical Unit Number):目标设备上的逻辑单元

lsscsi输出中,设备通常表示为[主机:通道:目标:LUN]的形式。

安装方法

lsscsi 通常需要单独安装,因为它不是所有Linux发行版的标准命令:

Ubuntu/Debian
sudo apt update
sudo apt install lsscsi
CentOS/RHEL
sudo yum install lsscsi
检查是否已安装: 运行 which lsscsilsscsi --version 2>/dev/null || echo "未安装"

语法格式

lsscsi [选项] [设备]
参数说明:
  • 选项:可选参数,用于控制输出格式和内容
  • 设备:可选,指定要显示的设备(如主机号)
  • 如果不指定选项,将显示所有SCSI设备的摘要信息

常用参数

参数 说明
-h--help 显示帮助信息
-V--version 显示版本信息
-g--generic 显示通用设备文件名称
-d--device 显示设备文件名称(默认)
-k--kname 显示内核设备名称
-l--list 显示附加信息列表
-L--long 显示详细信息(属性列表)
-s--size 显示设备容量
-t--transport 显示传输协议信息
-v--verbose 显示详细信息(类似-l和-t的组合)
-p--protection 显示数据保护信息
-P--protocols 显示支持的SCSI协议
-c--classic 使用经典输出格式
-H--hosts 仅显示SCSI主机(适配器)信息
-b--brief 简洁输出格式
-i--inquiry 显示INQUIRY数据
--hex 以十六进制显示某些信息
--whitelisted 仅显示白名单中的设备

使用示例

示例1:基本使用

显示所有SCSI设备的基本信息:

sudo lsscsi

输出示例:

[0:0:0:0]    disk    ATA      ST2000DM001-1ER1  CC43  /dev/sda
[1:0:0:0]    disk    ATA      Samsung SSD 860   2B6Q  /dev/sdb
[2:0:0:0]    cd/dvd  PLDS     DVD-ROM DH-18D5S  GH11  /dev/sr0
[3:0:0:0]    disk    USB      SanDisk Ultra     1.00  /dev/sdc

输出字段说明:

  • [0:0:0:0]:SCSI地址 [主机:通道:目标:LUN]
  • disk:设备类型
  • ATA:设备厂商或接口类型
  • ST2000DM001-1ER1:设备型号
  • CC43:固件版本
  • /dev/sda:设备文件节点
示例2:显示详细信息

显示详细信息:

sudo lsscsi -l

输出示例:

[0:0:0:0]    disk    ATA      ST2000DM001-1ER1  CC43  /dev/sda
  state=running queue_depth=31 scsi_level=6 type=0 device_blocked=0 timeout=30
[1:0:0:0]    disk    ATA      Samsung SSD 860   2B6Q  /dev/sdb
  state=running queue_depth=31 scsi_level=6 type=0 device_blocked=0 timeout=30

显示更详细的信息:

sudo lsscsi -L

显示传输协议信息:

sudo lsscsi -t

显示容量信息:

sudo lsscsi -s
示例3:过滤和特定设备

仅显示SCSI主机(适配器)信息:

sudo lsscsi -H

显示特定主机的设备(如主机0):

sudo lsscsi 0:

只显示磁盘设备:

sudo lsscsi | grep "disk"

只显示光盘设备:

sudo lsscsi | grep "cd/dvd"

显示特定设备文件的信息:

sudo lsscsi -g /dev/sda
示例4:不同输出格式

显示内核设备名称:

sudo lsscsi -k

显示通用设备文件:

sudo lsscsi -g

以经典格式显示:

sudo lsscsi -c

显示INQUIRY数据:

sudo lsscsi -i

显示支持的SCSI协议:

sudo lsscsi -P
示例5:脚本中使用

获取存储设备统计信息:

#!/bin/bash
echo "SCSI设备统计报告"
echo "================="
echo "生成时间: $(date)"
echo ""

# 统计设备总数
TOTAL_DEVICES=$(sudo lsscsi | wc -l)
echo "设备总数: $TOTAL_DEVICES"

# 统计各类设备数量
DISK_COUNT=$(sudo lsscsi | grep -c "disk")
CD_COUNT=$(sudo lsscsi | grep -c "cd/dvd")
TAPE_COUNT=$(sudo lsscsi | grep -c "tape")
ENCLOSURE_COUNT=$(sudo lsscsi | grep -c "enclosu")

echo "磁盘设备: $DISK_COUNT"
echo "光盘设备: $CD_COUNT"
echo "磁带设备: $TAPE_COUNT"
echo "存储柜设备: $ENCLOSURE_COUNT"

# 列出所有磁盘设备及其容量
echo ""
echo "磁盘设备列表:"
sudo lsscsi -s | grep "disk" | while read line; do
    DEVICE=$(echo "$line" | awk '{print $NF}')
    SIZE=$(echo "$line" | grep -o '\[[0-9.]*[A-Z]*\]')
    echo "  $DEVICE $SIZE"
done
示例6:高级分析和监控

监控SCSI设备状态变化:

#!/bin/bash
echo "开始监控SCSI设备变化..."
OLD_COUNT=$(sudo lsscsi | wc -l)

while true; do
    NEW_COUNT=$(sudo lsscsi | wc -l)
    if [ "$OLD_COUNT" -ne "$NEW_COUNT" ]; then
        echo "$(date): 设备数量变化: $OLD_COUNT -> $NEW_COUNT"

        # 显示当前设备列表
        echo "当前SCSI设备:"
        sudo lsscsi

        OLD_COUNT=$NEW_COUNT
    fi
    sleep 5
done

检查设备连接状态:

#!/bin/bash
echo "检查SCSI设备连接状态..."

sudo lsscsi -l | while read line; do
    if [[ "$line" =~ ^\[.*\].*state=([a-zA-Z]+) ]]; then
        DEVICE=$(echo "$line" | awk '{print $1}')
        STATE="${BASH_REMATCH[1]}"

        if [ "$STATE" = "running" ]; then
            echo "✅ $DEVICE 状态正常 (running)"
        elif [ "$STATE" = "offline" ]; then
            echo "❌ $DEVICE 状态异常 (offline)"
        else
            echo "⚠️  $DEVICE 状态: $STATE"
        fi
    fi
done

设备类型

SCSI设备类型代码

lsscsi输出中,第二列显示设备类型。以下是一些常见的SCSI设备类型:

类型代码 类型名称 说明
disk 磁盘驱动器 硬盘、SSD、USB存储等
cd/dvd 光盘驱动器 CD-ROM、DVD-ROM、蓝光驱动器等
tape 磁带机 磁带备份设备
processor 处理器设备 SCSI处理器设备
enclosu 存储柜 磁盘阵列柜、JBOD等
raid RAID控制器 硬件RAID控制器
mediumx 介质转换器 自动换片机、光盘库等
comm 通信设备 网络设备等
unknown 未知设备 无法识别的设备类型
传输协议类型:

使用-t参数可以显示设备的传输协议:

协议 说明
ATA 并行ATA/SATA设备
USB USB存储设备
SAS 串行连接SCSI
iSCSI 基于IP的SCSI
Fibre Channel 光纤通道
SBP 串行总线协议(如FireWire)

实用技巧

故障排查
  • 使用-l查看设备状态(running/offline)
  • 检查queue_depth参数优化性能
  • 查看timeout设置避免I/O超时
  • 结合dmesg查看SCSI相关错误信息
  • 检查设备是否被阻塞(device_blocked)
系统管理
  • 在存储服务器上监控设备变化
  • 热插拔SCSI/SAS设备前检查状态
  • 识别多路径设备(MPIO)
  • 检查RAID控制器和虚拟磁盘
  • 监控存储柜和环境传感器
脚本示例:SCSI设备健康检查
#!/bin/bash
# SCSI设备健康检查脚本

echo "SCSI设备健康检查报告"
echo "===================="
echo "检查时间: $(date)"
echo ""

# 检查所有设备状态
ERROR_COUNT=0
WARNING_COUNT=0

sudo lsscsi -l | while read line; do
    if [[ "$line" =~ ^\[([0-9:]+)\] ]]; then
        DEVICE="${BASH_REMATCH[1]}"

        # 提取设备状态
        if echo "$line" | grep -q "state=running"; then
            echo "✅ 设备 [$DEVICE] 状态正常"
        elif echo "$line" | grep -q "state=offline"; then
            echo "❌ 设备 [$DEVICE] 状态异常 (offline)"
            ERROR_COUNT=$((ERROR_COUNT + 1))
        else
            STATE=$(echo "$line" | grep -o 'state=[a-zA-Z]*' | cut -d= -f2)
            echo "⚠️  设备 [$DEVICE] 状态: $STATE"
            WARNING_COUNT=$((WARNING_COUNT + 1))
        fi

        # 检查设备是否被阻塞
        if echo "$line" | grep -q "device_blocked=1"; then
            echo "   ⚠️  警告: 设备被阻塞"
            WARNING_COUNT=$((WARNING_COUNT + 1))
        fi
    fi
done

echo ""
echo "检查结果汇总:"
echo "  正常设备: $(sudo lsscsi | wc -l) 个"
echo "  警告设备: $WARNING_COUNT 个"
echo "  错误设备: $ERROR_COUNT 个"

if [ $ERROR_COUNT -gt 0 ]; then
    echo "❌ 发现错误设备,请检查系统日志"
    exit 1
elif [ $WARNING_COUNT -gt 0 ]; then
    echo "⚠️  发现警告设备,建议检查"
    exit 2
else
    echo "✅ 所有设备状态正常"
    exit 0
fi
存储管理技巧
# 1. 识别SSD和HDD
sudo lsscsi -t | grep -E "ATA|SAS" | grep "disk"

# 2. 检查多路径设备
sudo lsscsi | grep -E "\[[0-9:]+\].*disk.*/dev/sd[a-z]"

# 3. 查看设备容量(人类可读)
sudo lsscsi -s | while read line; do
    DEVICE=$(echo "$line" | awk '{print $NF}')
    SIZE=$(echo "$line" | grep -o '\[.*\]')
    echo "$DEVICE: $SIZE"
done

# 4. 检查USB存储设备
sudo lsscsi -t | grep "USB"

# 5. 查看设备属性和设置
for device in /sys/class/scsi_device/*; do
    echo "设备: $(basename $device)"
    cat $device/device/state 2>/dev/null
    cat $device/device/queue_depth 2>/dev/null
    echo ""
done
存储相关命令
  • lsblk - 列出块设备信息
  • fdisk - 磁盘分区工具
  • parted - 分区编辑工具
  • hdparm - 硬盘参数工具
  • smartctl - SMART磁盘监控
系统信息命令
  • dmesg - 显示内核消息
  • lspci - 列出PCI设备
  • lsusb - 列出USB设备
  • lscpu - 显示CPU信息
  • lsscsi-tools - SCSI工具集合
命令比较

lsscsilsblk 的主要区别:

特性 lsscsi lsblk
关注点 SCSI设备层次和属性 块设备层次和分区
设备范围 SCSI/SAS/SATA/USB存储 所有块设备(包括非SCSI)
输出内容 设备类型、厂商、型号、固件 设备名称、大小、挂载点、类型
层次显示 主机-通道-目标-LUN 磁盘-分区-LVM-文件系统
使用场景 硬件识别、故障排查、存储管理 磁盘管理、分区查看、挂载信息

建议:

  • 查看SCSI设备详细信息使用 lsscsi
  • 查看块设备和分区信息使用 lsblk
  • 诊断SCSI问题时结合使用 lsscsi -ldmesg
  • 在存储服务器管理中结合使用多个工具
注意事项
  • lsscsi显示的是SCSI子系统识别的设备,可能与物理设备不完全对应
  • 某些设备可能通过其他接口(如NVMe)管理,不会出现在lsscsi输出中
  • 虚拟化环境中的虚拟SCSI设备可能显示不同的信息
  • 某些SCSI命令可能需要root权限才能执行
  • 热插拔设备时,建议先检查设备状态再操作
  • 存储柜和多路径设备可能需要额外工具管理