lsscsi 是一个用于显示SCSI设备信息的工具,它通过读取/sys文件系统来获取SCSI设备信息。SCSI是一种广泛使用的存储设备接口标准,现代的SAS(串行连接SCSI)和SATA(串行ATA)设备也通过SCSI子系统管理。
SCSI使用三层寻址架构:
在lsscsi输出中,设备通常表示为[主机:通道:目标:LUN]的形式。
lsscsi 通常需要单独安装,因为它不是所有Linux发行版的标准命令:
sudo apt update
sudo apt install lsscsi
sudo yum install lsscsi
which lsscsi 或 lsscsi --version 2>/dev/null || echo "未安装"
lsscsi [选项] [设备]
选项:可选参数,用于控制输出格式和内容设备:可选,指定要显示的设备(如主机号)| 参数 | 说明 |
|---|---|
-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 |
仅显示白名单中的设备 |
显示所有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:设备文件节点显示详细信息:
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
仅显示SCSI主机(适配器)信息:
sudo lsscsi -H
显示特定主机的设备(如主机0):
sudo lsscsi 0:
只显示磁盘设备:
sudo lsscsi | grep "disk"
只显示光盘设备:
sudo lsscsi | grep "cd/dvd"
显示特定设备文件的信息:
sudo lsscsi -g /dev/sda
显示内核设备名称:
sudo lsscsi -k
显示通用设备文件:
sudo lsscsi -g
以经典格式显示:
sudo lsscsi -c
显示INQUIRY数据:
sudo lsscsi -i
显示支持的SCSI协议:
sudo lsscsi -P
获取存储设备统计信息:
#!/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
监控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
在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相关错误信息#!/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工具集合lsscsi 与 lsblk 的主要区别:
| 特性 | lsscsi |
lsblk |
|---|---|---|
| 关注点 | SCSI设备层次和属性 | 块设备层次和分区 |
| 设备范围 | SCSI/SAS/SATA/USB存储 | 所有块设备(包括非SCSI) |
| 输出内容 | 设备类型、厂商、型号、固件 | 设备名称、大小、挂载点、类型 |
| 层次显示 | 主机-通道-目标-LUN | 磁盘-分区-LVM-文件系统 |
| 使用场景 | 硬件识别、故障排查、存储管理 | 磁盘管理、分区查看、挂载信息 |
建议:
lsscsilsblklsscsi -l 和 dmesglsscsi显示的是SCSI子系统识别的设备,可能与物理设备不完全对应