我有一个程序,其中没有安装或以任何其他方式使用的驱动器需要spindown。文件描述符关闭后SCSI驱动器spinup
我注意到驱动器在关闭filedescriptor后自动启动。
我还没有找到任何信息为什么这是,有什么办法可以禁用这个?
这里有一个简短的程序来测试它自己。任何帮助或指针,将不胜感激
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <scsi/sg.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
sg_io_hdr_t io_hdr;
const unsigned char stopcmdblk[6] = { 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00 };
int fd = open(argv[1], O_RDWR);
if (fd == -1) {
perror("couldn't open device");
exit(1);
}
memset(&io_hdr, 0, sizeof(sg_io_hdr_t));
io_hdr.interface_id = 'S';
io_hdr.cmd_len = 6;
io_hdr.mx_sb_len = 32;
io_hdr.dxfer_direction = SG_DXFER_NONE;
io_hdr.dxfer_len = 0;
io_hdr.dxferp = NULL;
io_hdr.cmdp = malloc(6);
io_hdr.sbp = calloc(32, 1);
memcpy(io_hdr.cmdp, stopcmdblk, 6);
errno = 0;
int ret = ioctl(fd, SG_IO, &io_hdr);
if (ret < 0) {
perror("ioctl error");
exit(1);
}
if ((io_hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK) {
printf("SCSI err\n");
exit(1);
}
printf("finished spindown\n");
sleep(30);
printf("close file now\n");
close(fd);
printf("file closed\n");
exit(0);
}
难道是文件系统维护磁盘上的文件锁定信息(隐藏的锁文件或类似的)?您打开文件R/W,以便它必须被锁定。访问磁盘的网络上的其他Linux节点可以读取此信息以确定它们是否可以安全地访问该文件。然后,当你关闭文件时,启动是这样的,锁可以从磁盘上删除。 –
是否有可能在文件关闭后强制锁定?减速后,驱动器将被删除,无论如何 –