如何检测光驱中是否有光驱?

Aar*_*lla 9 linux compact-disc

我知道我的 CD-ROM 设备 ( /dev/sr0) 但如何从脚本中检测驱动器是否为空或其中是否有磁盘?

use*_*723 9

您可以使用该命令获取有关任何块设备的信息blkid

[root@arch32-vm ~]# blkid /dev/sr0
/dev/sr0: UUID="2013-05-31-23-04-19-00" LABEL="ARCH_201306" TYPE="iso9660" PTTYPE="dos"
[root@arch32-vm ~]# echo $?
0
Run Code Online (Sandbox Code Playgroud)

如果我移除磁盘,我不会得到任何输出并且退出值为 2。(0 表示成功。非零值通常表示发生异常或发生错误)

[root@arch32-vm ~]# blkid /dev/sr0
[root@arch32-vm ~]# echo $?
2
Run Code Online (Sandbox Code Playgroud)

  • blkid 检测分区,如果我放了一张音频 CD,则检测不到它。没有找到比使用 ioctl 创建程序更简单的解决方案,如 http://stackoverflow.com/questions/15652520/how-to-check-if-cd-drive-is-open-or-closed-in- 中所述linux (5认同)
  • `blkid` 导致 CD/DVD 驱动器关闭。我想要一些可以先检查盘子是否打开/关闭的东西,我想。一旦(由一个人)关闭,那么查看是否有媒体存在是有意义的。_对此有什么想法吗?_ (2认同)

der*_*ert 6

setcd -i(在setcd软件包中,至少在 Debian 上)可以告诉您驱动器的状态。与其他一些方法不同(至少安装,也可能是 blkid),这不会尝试关闭托盘,即使在能够关闭托盘的驱动器上也是如此。(如果它试图在您放入光盘时关闭您,这真的很烦人)。

打开托盘:

$ setcd -i /dev/sr0
/dev/sr0:
  CD 托盘已打开

关闭托盘后:

$ setcd -i /dev/sr0
/dev/sr0:
  驱动器未就绪

准备好后:

$ setcd -i /dev/sr0
/dev/sr0:
  在驱动器中找到的光盘:数据光盘类型 1
    卷名:«名称»
    出版商:MKISOFS ISO 9660/HFS FILESYSTEM BUILDER & CDRECORD CD-R/DVD CREATOR (C) 1993 E.YOUNGDALE (C) 1997 J.PEARSON/J.SCHILLING 2005030913034700?20050309000000340000003
    数据准备者:MKISOFS ISO 9660/HFS FILESYSTEM BUILDER & CDRECORD CD-R/DVD CREATOR (C) 1993 E.YOUNGDALE (C) 1997 J.PEARSON/J.SCHILLING 2005030913034700?2005030000000005030000001

关闭,但没有光盘:

$ setcd -i /dev/sr0
/dev/sr0:
  没有插入光盘

你可以很容易地编写脚本:

$ setcd -i /dev/sr0
/dev/sr0:
  CD tray is open


小智 5

您可以使用 Python3 和标准库执行以下操作:

import fcntl
import os

CDROM_DRIVE = '/dev/sr0'

def detect_tray(CDROM_DRIVE):
    """detect_tray reads status of the CDROM_DRIVE.
    Statuses:
    1 = no disk in tray
    2 = tray open
    3 = reading tray
    4 = disk in tray
    """
    fd = os.open(CDROM_DRIVE, os.O_RDONLY | os.O_NONBLOCK)
    rv = fcntl.ioctl(fd, 0x5326)
    os.close(fd)
    print(rv)
Run Code Online (Sandbox Code Playgroud)