问题标签 [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.

0 投票
2 回答
5517 浏览

linux - SCSI LUN id 是什么意思,它的用途是什么?

在 Linux 中,ioctl SCSI_IOCTL_GET_LUNID 中的 LUN id 是什么意思?这意味着什么?它将如何提供帮助?

0 投票
1 回答
947 浏览

scsi - vSphere Client 和 ESX 4.1 上的 LUN Id 和 Target Id 不匹配

我对 SCSI 和存储还很陌生。我几乎没有从阵列向 ESX 主机公开的 LUN。当我在 ESX 4.1 上运行 sg_map -x 时,我看到所有 LUN 的 LUN ID 都显示为 0。

[root@SRESX41 ~]# sg_map -x

/dev/sg0 4 0 0 0 0 /dev/sda

/dev/sg1 4 0 1 0 0 /dev/sdb

/dev/sg2 4 0 2 0 0 /dev/sdc

/dev/sg3 4 0 3 0 0 /dev/sdd

/dev/sg4 4 0 4 0 0 /dev/sde

/dev/sg5 4 0 5 0 0 /dev/sdf

/dev/sg6 4 0 6 0 0 /dev/sdg

/dev/sg7 4 0 7 0 0 /dev/sdh

/dev/sg8 4 0 8 0 0 /dev/sdi

/dev/sg9 4 0 9 0 0 /dev/sdj

/dev/sg10 4 0 10 0 0 /dev/sdk

/dev/sg11 4 0 11 0 0 /dev/sdl

/dev/sg12 4 0 12 0 0 /dev/sdm

/dev/sg13 4 0 13 0 0 /dev/sdn

/dev/sg14 4 0 14 0 0 /dev/sdo

/dev/sg15 4 0 15 0 0 /dev/sdp

/dev/sg16 4 0 16 0 0 /dev/sdq

/dev/sg17 0 0 0 0 0 /dev/sdr

/dev/sg18 4 0 17 0 0 /dev/sds

/dev/sg19 4 0 18 0 0 /dev/sdt

/dev/sg20 4 0 19 0 0 /dev/sdu

但是对于相同的 LUN,LUN id 在 vSphere Client 上的显示不同。请查看随附的 vSphere 客户端屏幕截图。谁能告诉我为什么不匹配?

0 投票
1 回答
15247 浏览

linux - 使用 SCSI 通用接口的 SCSI 读取 (10) 和写入 (10)

我尝试向SSD发出 scsi read(10)write(10) 。将此示例代码用作参考/基本代码。

这是我的 scsi 阅读:

这是我的 scsi 写的:

在下面的例子中,我做

  1. scsi 读取
  2. SCSI写
  3. scsi 读取

我打印了写入数据的十六进制转储(scsi write)和读取的数据(scsi read)

再次运行这三个命令后,我应该阅读Abcdefg第一次阅读。对?但是再次运行它们并没有改变。您现在可以假设,我使用的内存仍然具有来自先前函数的数据,但即使我在发生memset(Readbuff,0,sizeof(Readbuff))之前运行,我也会得到相同的结果sys_read()

我假设,我尝试写入的 LBA 可能被禁止写入,我读取了缓存。但是从 0x00-0xFF 对 LBA 地址进行交互没有任何改变——这意味着,我读取了相同的数据 ( Abcdefg)。

您知道使用 scsi 通用接口进行 scsi 读取或写入的示例实现吗?

0 投票
1 回答
1966 浏览

windows - 来自 Windows 7 应用程序的 SPTI/SCSI 操作

我需要一些有关更新某些 Windows 软件以与非存储 SCSI 设备通信的安全问题的帮助。

最初的软件是为 Windows XP 编写的 DLL,并通过 Adaptec 的 ASPI API 与设备通信。ASPI 没有任何安全性,因此任何用户运行的任何应用程序都可以使用我的 DLL 与这些设备之一进行通信,并且一切正常。

我现在正在使用 Microsoft 的现代 SPTI(SCSI Pass-Through Interface)API 更新软件以与 Windows 7 一起使用。在 XP 下使用 SPTI 一切正常,但 Windows 7 具有更严格的安全性,对于普通用户甚至管理员来说,SPTI 调用会返回一个错误,表明权限不足。如果我使用隐藏的“管理员”帐户登录,我的软件可以在 SPTI 上正常运行,但这不是可接受的部署选项。

以下是我迄今为止研究过的一些替代方案,以降低必须重写现有代码的水平:

  • 分离一个线程并提升其权限以伪装成“管理员”,以便它可以与 SPTI 对话。[我无法使用 LogonUser()/ImpersonateLoggedOnUser()/LoadUserProfile() 让它工作;对 LoadUserProfile() 的调用失败,SPTI 调用也因权限不足错误而失败。]
  • 编写一个具有足够权限与 SPTI 对话的 Windows 服务,然后让我的 DLL 与该服务对话。
  • 用户空间 (UMDF) 驱动程序。这将是一个昂贵的重写,我不清楚 UMDF 是否支持访问 SCSI 设备。
  • 内核 (KMDF) 驱动程序。应该可以工作,但会是一个更长、更昂贵的重写。

我希望这里的社区可以提供一些智慧/经验/想法,让我的代码在 Windows 7 下与这个 SCSI 设备对话,理想情况下不必重写太多。

0 投票
0 回答
176 浏览

c++ - 在虚拟磁盘驱动程序中处理系统关闭

我正在为 Windows 开发一个虚拟磁盘驱动程序,它使用普通文件作为存储(很像 Windows 7 附带的 VHD 虚拟磁盘驱动程序)。

我的虚拟驱动程序支持写入并且有一个缓存,当操作系统关闭时我需要刷新它。明显的解决方案是处理SRB_FUNCTION_SHUTDOWN/SRB_FUNCTION_FLUSHSCSI 请求。

但是,如果真实磁盘(我的文件所在的磁盘)在我的虚拟驱动程序之前收到关闭请求怎么办?显然它将不再接受任何写入请求,我将无法刷新数据。

这个问题有什么解决办法吗?谢谢

0 投票
1 回答
796 浏览

macos - 获取驱动程序父级(或祖先)的属性

我有一个用于连接 USB 的自定义 SCSI 设备的驱动程序,它实现了一些特定于供应商的命令。每个 USB 设备承载多个 SCSI LUN。这工作非常愉快,但是根据设备对 SCSI LUN 进行分组存在问题,因为从IOSCSILogicalUnitNub级别向下(我的驱动程序继承自),没有将 LUN 链接在一起的识别功能(有 SCSI 逻辑单元号,但是这些对于每个新设备都会发生冲突;它们都有一个单元 0x0)。

我想做一些事情,比如根据 USBlocationID字段(或任何其他唯一键)链接它们,但我不知道如何在仅给出io_service_t匹配的 SCSI 驱动程序的情况下获取父 USB 设备。这也最好在应用程序端完成,而不是在驱动程序中完成,因为应用程序需要跟踪哪个服务具有哪些 LUN 以及由哪个处理程序实例打开。

IO Registry 中的层次结构是:

0 投票
0 回答
81 浏览

algorithm - 用于跟踪写入 2 次方 32 元素的空间高效算法

这是我在工作中遇到的要求之一。我们有一个 (2 power 32) 连续的 4294967296 个整数在内存中分配为一个数组,其功能是在另一个表中提供映射。有些条目比其他条目写得更频繁。我们想要跟踪热点并提供近似直方图。问题是,这将在固件中实现,并且可以使用的内存不多。

信息:该映射用于从主机到目标上的 lbas 的 scsi lba,可能是驱动器或闪存。

假设我们有 1 MB 的空间来处理跟踪冷热信息所需的元数据。除了显示它是否被写入的位映射之外,我们如何有效地使用它。我们可以根据用于跟踪的内存大小来扩展我们收集的数据的准确性,并对其进行数学扩展。

0 投票
0 回答
1844 浏览

linux - Linux scsi 命令队列

我是这个论坛的新手。我目前遇到一个问题。

我是 Linux 内核驱动程序的初学者,目前正在为块大容量存储设备开发 Linux SCSI 设备驱动程序。开发平台位于使用 Fedora 14 的高端机器上。设置是 1 台主机到 1 台 LU/设备。长话短说,驱动程序在初始化时没有问题,它可以检测设备并向其发送 scsi 帧,它可以读取和写入设备,并且我可以进行稳定的 Iometer 读取和写入通过驱动程序进行测试。当一次只有一个未完成的命令(没有排队)时,所有这些。

问题是,我不能排队上班。除非我是第一个命令,否则上层 SCSI 层不会向我 (LLD) 发送多个未完成scsi_done()的命令。我希望上层queuecommand()在我将命令发送到设备进行处理之前可以多次调用,然后设备会中断我的响应并LLD使用scsi_done(). 不用排队,我们的速度很慢。

我已经调整了我认为与排队有关的值,例如在 .can_queue 和 .can_queue 中设置我.cmd_per_lun的目标 queue_depth 。基本上我玩过各种值,包括 1,但无济于事。如果这有任何影响,我也确实禁用和启用了标记,但仍然没有改变。到目前为止,我不记得在驱动程序中做了太多事情,除了. 有什么我遗漏的并且仍然可以在驱动程序级别做的吗?我不敢相信 Linux 不支持命令队列。我在这里遗漏了一些东西。 scsi_hostscsi_host_templatescsi_deviceslave_configure

0 投票
1 回答
113 浏览

macos - IOSCSIBlockCommandsDevice.cpp 和朋友在哪里?

我正在编写一个依赖于 IOKit 的 SCSI 部分的驱动程序(我使用的是 10.6,但这也适用于 10.7 和 10.8),并且我使用内核框架将标头链接到我的项目中。虽然我可以看到文件的标题IOSCSIBlockCommandsDevice.h,但我无法在任何地方找到对应的 .cpp 文件。我正在寻找,因为它们会帮助我理解如何结束糟糕的状态,因为我不知道软件试图实现什么(顺便说一下 SCSI 命令 0x1B、0x03、0x00、0x03 的循环)

我查看了10.6 opensource.apple目录,甚至用 Google 搜索了文件名以及 2009 年(匹配标头修改的年份)(日期戳)并出现空白。苹果网站上的所有文件似乎IOSCSIArchitectureModelFamily都丢失了,或者至少隐藏得很好。

有谁知道这些 .cpp 文件保存在哪里?

0 投票
1 回答
114 浏览

java - Eclipse 中每个 GUI 程序的奇怪错误

在我使用 GUI 编写的几乎每个程序中,当程序执行完毕时都会出现这两个错误。它只是随机开始的,我认为我没有做任何事情让它变成这样。怎么了?