问题标签 [scsi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
winapi - SPTI“模式选择”在 Win 7 64 位中意外失败
我正在转换一些旧代码以与自定义 SCSI 设备通信。原始代码是为 WinXP 和 ASPI 编写的,而较新的代码需要在 Win7 和 SPTI 上工作。我的问题是,较新的代码在调用 SCSI“模式选择”操作时失败,状态代码为 2,这是一个 SCSI“检查条件”错误 - 但 WinXP 下的旧代码不会发生这种情况。
通常,当您获得“检查条件”代码时,您可以向设备发出“请求感知”命令以查明发生了什么。不幸的是,这个设备(在我看来)是有问题的,当你执行请求感知时总是返回“一切正常”。所以我在这里在黑暗中工作。
因此,我希望对我可能在 SPTI 代码中做错的地方提出一些建议,并感谢任何反馈。
以下是我想到的一些可能会影响这一点的事情:
- 设备期望的顺序是“Reserve Unit”、“Rezero Unit”、“Mode Select”,然后是一些其他操作,然后是“Release Unit”。看起来“保留单元”、“重新归零单元”和“释放单元”都工作正常,但其他操作失败,因为“模式选择”失败。
- 对于每个操作,SPTI 代码打开和关闭 SCSI 主机适配器的句柄。我应该在“保留单元”中打开一个句柄并让它在整个序列中保持打开状态吗?
- 发送到 DeviceIoControl() 的 ioctl 是 IOCTL_SCSI_PASS_THROUGH。我应该使用 IOCTL_SCSI_PASS_THROUGH_DIRECT 进行“模式选择”操作吗?这是一个简单的操作,所以我认为更简单的 API 就足够了,但也许我错了。
有问题的代码是:
filesystems - 在 USB 大容量存储类设备上,块大小是否等于集群大小?如何确定 USB 驱动器的簇大小?
在 USB 大容量存储类设备(usb 棒,例如 4gb)上,如何确定“集群”大小。
这里的集群,取自 Fat32 文件系统的上下文。
使用 SCSI 命令,我可以确定逻辑块大小,即 512 字节。这与集群大小相同吗?这可以被视为集群大小吗?
对于这样的无盘设备,集群大小仍然相关吗?
最后,在这种情况下,逻辑块和集群之间的关系是什么?
windows - 到 USB 驱动器的 ATA 命令
Windows 7
C 编程
Visual C++ 2008(在 VMWare 中)
我想用DeviceIOContro
l 向 USB 硬盘驱动器发送一些 ATA 命令(IDENTIFY DEVICE、READ NATIVE MAX ADDRESS、SET MAX ADDRESS)。因此我有一些问题。
据我了解,USBSTOR 无法直接处理 ATA 命令(使用IOCTL_ATA_PASS_THROUGH
)。我试过这个,它适用于本机 IDE 硬盘,但不适用于 USB。
应用程序将 SCSI 命令发送到设备并将它们转发到设备是否正确?所以我需要创建一个封装了相应 ATA 命令的 SCSI 命令?
我
dwIoControlCode
能用什么来做到这一点?我试过了,IOCTL_SCSI_MINIPORT
但错误是ERROR_NOT_SUPPORTED
. 它可以与 minport 一起使用吗?微型端口是否仍然是最新的?
linux - 是否可以从内核模块中向 USB 设备发送 SCSI 命令?
问题
鉴于 udev 传递给我的内核模块的信息(可能是块设备路径),我如何向块设备发送 SCSI 命令?(但让它正常运行,否则意味着分区已安装,没有数据丢失等)
我想做的事
我有一个 USB 大容量存储设备,它具有通过 SCSI 命令控制的 LED。我想编写一个 LED 驱动程序为其提供 /sys/class/leds/* 条目。
这里的目标是让设备正常运行(分区安装和运行等),但也允许 /sys/class/leds/* 交互,这些交互将发送 SCSI 命令来控制 LED。
使用 sg_raw 在用户空间发送我需要的 SCSI 命令很容易。但我需要一个 kmod 来提供 /sys/class/leds/...
基本上我需要的是ioctl()。但是,我知道从 kmod 中调用 open()、ioct() 等通常是一个坏主意。
c++ - ioctrl 使用 SCSI 直通
使用 Windows,我可以使用以下简化代码轻松地与我的 USB 设备进行通信:
我正在尝试在 linux 中做同样的事情,但无法弄清楚 ioctrl() 参数,或者更好地放置结构。非常感谢代码片段。谢谢。
storage - 在 AIX 中使用 lsattr 解释 LUN id 和 Target id
我对 AIX 很陌生,我在 AIX 中发现了一个命令 lsattr,它有助于获取设备的 SCSI id 和 LUN id。我无法理解如何解释 SCSI id 和 LUN id 的值。这是一个示例输出:
我跳过了不相关的行。
1) LUN id 是 0x25f000000000000 ,这是巨大的,在一些博客中读到我们必须将它右移 48 位才能得到实际值,这是在哪里记录的?
2) 还有SCSI id 呢,即使这个值看起来很大,0x21300
有人可以帮我吗?
感谢和问候,
阿伦·维贾普尔
c - 将 WRITE SECTOR(S) EXT ATA 命令与 SCSI ATA PASS-THROUGH(16) 一起使用
欢迎。我在为 WRITE SECTOR(S) EXT - 34h、PIO Data-Out(对于 WRITE DMA EXT - 35h、DMA 相同结果)执行 SCSI 命令 ATA PASS-THROUGH(16) 时遇到问题。我使用内核 2.6.39。我有一个由 SCSI 控制的 HDD(SATA)。我想将数据写入该驱动器的特定扇区。为了实现这个目标,我使用了 SCSI 命令 ATA PASS_THROUGH(16)。在源代码中,它可以像这样执行 ioctl:
当 ATA 命令的 LBA 小于 0xFE2600 时,此操作可以正常工作。数据写入驱动器,可以读取,重启后仍然存在。但是,当 LBA >= 0xFE2600 时执行此 ATA 命令时,将显示以下消息:
[5127.415214]ata1.00:异常Emask 0x0 SAct 0x0 SErr 0x0动作0x0
[5127.421751]ata1.00:irq_stat 0x40000001
[5127.425737]ata1.00:命令失败:写入 DMA EXT
[5127.430659] ata1.00: cmd 35/00:01:ff:ff:00/00:00:ff:00:00/40 标签 0 dma 512 输出
[5127.430664] res 51/10:01:ff:ff:00/00:00:ff:00:00/40 Emask 0x81(无效参数)
[5127.446389]ata1.00:状态:{DRDY ERR}[5127.450446]ata1.00:
错误:{ IDNF }
一开始我在想内核可能有问题,它只支持LBA 24位,不支持LBA 48位,但是这个理论与阈值0xFE2600并不完全一致(我认为如果阈值为 0x1000000)。从 IDENTIFY DEVICE - ECh, PIO Data-In 返回的数据中,我可以读到最大 LBA 为 0x2542EAB0,并且该驱动器支持 LBA 48 位。现在真的不要在哪里统计调查这个问题。如果有人有一些想法,请与我分享。如果您希望我提供其他信息,请告诉我,我会尽快提供。
sockets - SCSI 之上的套接字 API?
是否有任何现有软件可以在不同的传输上执行通常的套接字 API?我现在对 SCSI 特别感兴趣,但是知道是否有其他传输可用的东西也很好。它需要在连接的两边都有一些东西,在 SCSI 的情况下,一个在下面使用 SCSI 的仿真层和一些目标端软件也是如此。
至于我为什么需要这个,我需要支持一个使用套接字在 FC 上工作的现有应用程序,而 SCSI 在这方面非常适合。IP over FC 早就死了。
提前致谢。
c++ - 在 Linux C++ 应用程序中获取 SCSI 磁盘名称的方法
在我的 Linux C++ 应用程序中,我想获取系统上存在的所有 SCSI 磁盘的名称。例如/dev/sda、/dev/sdb、...等等。
目前我正在使用以下代码从文件 /proc/scsi/sg/devices 输出中获取它:
但是文件 /proc/scsi/sg/devices 还包含有关先前存在于系统上的磁盘的信息。例如,如果我从系统中分离磁盘 (LUN) /dev/sdc,则文件 /proc/scsi/sg/devices 仍然包含无效的 /dev/sdc 信息。
告诉我有什么不同的方法来获取 SCSI 磁盘名称吗?像系统调用?
谢谢
c - SCSI 通用 write() 线程安全吗?
我有一个应用程序在高级别上同时执行 SCSI READ10 和 WRITE10 操作。当他们到达我的代码的较低级别时,他们在 /dev/sgXX 上调用 write(),然后调用 read()。不过,在接收我的应用程序命令的设备上,我得到了非常奇怪的结果,而且它们偶尔会发生。让这种低级同时 write() / read() 安全吗?或者我可能会将数据发送到 HBA 吗?