有谁知道是否有一种优雅的方法可以告诉外部 USB 驱动器在一段时间不活动后不要减速?我见过基于 cron 的解决方案每分钟写入一个文件,但没有任何东西散发出unixey 优雅的气息。必须有一个 hdparm 或 scsi 命令,我可以向驱动器发出(通过 OpenBSD 中的 sd 驱动程序访问 USB 驱动器)来告诉它不要休眠。恐怕这可能是机箱控制器内置的一个功能,因此除了将驱动器从机箱中取出并直接放入机器之外,没有太多可以改变它,但我想我会问,在关闭的机会。
理想情况下,我正在寻找 OpenBSD 解决方案,但我知道还有其他解决方案存在同样的问题,因此将考虑任何解决方案作为答案。
看看块设备命令喜欢什么lsblk或blkid返回什么,似乎linux HDD支持SCSI驱动程序而不管设备的类型,就像一个USB闪存驱动程序,在lsblk命令中显示如下:
...
sdb 8:16 1 30G 0 disk
??sdb1 8:17 1 30G 0 part /run/media/user/HP v224w
...
Run Code Online (Sandbox Code Playgroud)
为什么 sdb 和 sda 驱动程序被称为 SCSI 驱动程序?这个术语有什么关系Small Computer System Interface?
我的系统上有 3 个 SATA 设备。它们显示在 下/proc/scsi/scsi,尽管它们不是 SCSI 设备。为什么我的 SATA 设备显示在 SCSI 目录下?
$ cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: WDC WD2500AAJS-6 Rev: 01.0
Type: Direct-Access ANSI SCSI revision: 05
Host: scsi1 Channel: 00 Id: 00 Lun: 00
Vendor: TSSTcorp Model: CDDVDW TS-H653Z Rev: 4303
Type: CD-ROM ANSI SCSI revision: 05
Host: scsi4 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: ST3320620AS Rev: 3.AA
Type: Direct-Access ANSI SCSI revision: …Run Code Online (Sandbox Code Playgroud) 我的软件 RAID6 的 I/O 经常冻结大约 30 秒,之后一切都恢复正常。
冻结结束后,将其放入系统日志:
Mar 14 18:43:57 server kernel: [35649.816060] sd 5:0:23:0: [sdy] CDB: Read(10): 28 00 6c 52 68 58 00 04 00 00
Mar 14 18:43:58 server kernel: [35651.149020] mptbase: ioc0: LogInfo(0x31140000): Originator={PL}, Code={IO Executed}, SubCode(0x0000) cb_idx mptscsih_io_done
Mar 14 18:43:58 server kernel: [35651.151962] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff8807b02dfe80)
Mar 14 18:43:58 server kernel: [35651.151967] mptscsih: ioc0: attempting task abort! (sc=ffff88002a7f30c0)
Mar 14 18:43:58 server kernel: [35651.151972] sd 5:0:23:0: [sdy] CDB: Read(10): …Run Code Online (Sandbox Code Playgroud) 我正在尝试将原始数据写入连接到我的计算机的 USB 设备。我正在使用 Kali Linux,我找到了正确的文件路径: "/dev/usb/003/013" 。但是,当我尝试向其中写入数据时,出现错误。
root@kali:~/usb# printf "test" > /dev/bus/usb/003/013
bash: printf: write error: Invalid argument
Run Code Online (Sandbox Code Playgroud)
我也试过用猫:
root@kali:~/usb# cat test > /dev/bus/usb/003/013
cat: write error: Invalid argument
Run Code Online (Sandbox Code Playgroud)
在前一种情况下,文件“test”确实存在并且其中包含数据。似乎系统无法写入文件描述符,即使它在那里。
经过研究,我得出的结论是,您要么:
A. 需要一个可以与设备连接的 USB 驱动程序。
B. 使用 SCSI Pass Through 将数据直接写入设备上的端点。
我是 USB 编程的新手,虽然我很想尝试,但我以前从未编写过驱动程序。任何建议或帮助将不胜感激。
是否可以像我最初尝试的那样将原始数据写入设备?如果没有,你能解释一些可供我使用的选项吗?
我正在试验一些旧的 SCSI 磁带驱动器,我已经成功地将一些数据写入磁带,但我正在努力尝试再次读取它。
# tar tvf /dev/st0
tar: /dev/st0: Cannot read: Cannot allocate memory
tar: At beginning of tape, quitting now
tar: Error is not recoverable: exiting now
# dd if=/dev/st0 of=test
dd: error reading '/dev/st0': Cannot allocate memory
0+0 records in
0+0 records out
0 bytes copied, 3.20155 s, 0.0 kB/s
Run Code Online (Sandbox Code Playgroud)
在这些命令之后,dmesg说:
st 10:0:3:0: [st0] Block limits 1 - 16777215 bytes.
st 10:0:3:0: [st0] Failed to read 65536 byte block with 512 byte transfer.
st 10:0:3:0: [st0] …Run Code Online (Sandbox Code Playgroud) 我有一个小问题。我有一个在 RHEL 6.7 (VM) 上运行的实时系统,并且有 VMware 6.5(不是由我们组管理的)。问题是,另一组试图扩展 VM 上现有磁盘的容量。之后,我像往常一样运行了一个扫描命令来检测新磁盘echo "- - -" > /sys/class/scsi_host/host0/scan,但什么也没发生。他们在 sdb 磁盘上添加了 40G,应该是 100G,我看到它在 VM 上发生了变化,但在 Linux 中没有发生变化。那么问题出在哪里呢?正如我所说,这是一个实时系统,所以我不想重新启动它。
这是系统:
# df -h /dev/mapper/itsmvg-bmclv
59G 47G 9.1G 84% /opt/bmc
# lsblk sdb 8:16 0 60G 0 disk ??itsmvg-bmclv (dm-2) 253:2 0 60G 0 lvm /opt/bmc
# vgs VG #PV #LV #SN Attr VSize VFree itsmvg 1 1 0 wz--n- 59.94g 0
# pwd /sys/class/scsi_host
# ll lrwxrwxrwx 1 root root 0 Nov 13 16:18 host0 …Run Code Online (Sandbox Code Playgroud) 我有一个需要删除的 scsi 磁盘列表。该列表最多被认为是随机的,并且会不时更改。我想删除除我创建的预定义列表之外的所有内容。现在让我们假设我只想保留:
/dev/sda
/dev/sdb
Run Code Online (Sandbox Code Playgroud)
我需要执行的命令是:
"echo 1 > /sys/block/sdX/device/delete"
Run Code Online (Sandbox Code Playgroud)
其中 X 是要移除的设备。
我不擅长 bash 脚本,所以我真的不知道从哪里开始。
回顾一下,这样我就不会因为不清楚而被 DV。
除了预定的列表之外,我需要为系统上的每个 sdX 设备“echo 1 > /sys/block/sdX/device/delete”。
编辑:在下面的答案之后,这就是我决定使用的。“LocalDisks.txt”应该包含像“/dev/sda”这样的行
#!/bin/bash
exclude=$(cut -d/ -f3 LocalDisks.txt)
for sysfile in /sys/block/sd* ; do
dev=$(basename $sysfile)
del=$sysfile/device/delete
if [[ $exclude == *$dev* ]] ; then
echo "Device $dev excluded"
elif [ ! -w $del ] ; then
echo "$del does not exist or is not writable"
else
echo 1 > $del
fi
done
Run Code Online (Sandbox Code Playgroud) 从 df -k 命令中,我看到了 sda、sdb、sdc 磁盘。他们有一些分区(例如,sda 有 sda1、sda3)。我想暂时分离 sdb 和 sdc 以进行操作系统升级。我如何确切地知道哪个磁盘是哪个?(实际上我知道 sdc 是我最近连接的磁盘,但是我如何从 SCSI 连接中告诉 sda、sdb、sdc?我记得 SCSI 连接器没有任何顺序..)
ckim@stph45:/boot/grub] cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: Samsung SSD 850 Rev: EXM0
Type: Direct-Access ANSI SCSI revision: 05
Host: scsi1 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: ST2000DM001-1CH1 Rev: CC27
Type: Direct-Access ANSI SCSI revision: 05
Host: scsi2 Channel: 00 Id: 00 Lun: 00
Vendor: HL-DT-ST Model: BD-RE BH16NS40 Rev: …Run Code Online (Sandbox Code Playgroud)