如何检测驱动器中是否有CD-ROM?

如何检测驱动器中是否有CD-ROM?

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

答案1

您可以使用命令获取有关任何块设备的信息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

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

[root@arch32-vm ~]# blkid /dev/sr0
[root@arch32-vm ~]# echo $?
2

答案2

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

托盘打开时:

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

关闭托盘后:

$ setcd -i /dev/sr0
/dev/sr0:
  驱动器尚未准备好

准备好之后:

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

已关闭,但没有光盘:

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

您可以相当轻松地编写脚本:

while true; do
    cdinfo=$(setcd -i "$dev")
    case "$cdinfo" in
        *'Disc found'*)
            break;
            ;;
        *'not ready'*)
            echo '(waiting for drive to be ready)' >&2;
            sleep 3;
            ;;
        *'is open'*)
            echo '(drive is open)' >&2;
            sleep 5;
            ;;
        *)
            printf 'Confused by setcd -i, bailing out:\n%s\n' "$cdinfo" &2
            exit 1
    esac
done

答案3

您可以使用 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)

答案4

尝试安装该设备。

mount -t iso9660 /dev/sr0 /mnt/cdrom

然后检查返回值$?

如果返回 0,即“良好”,则表示有光盘。否则,它将返回“不良”的“1”或除“0”之外的任何内容

因此,为了默默检查,我会编写如下脚本。

cdrom_mount=0
mount -t iso9660 /dev/sr0 /mnt/cdrom >/dev/null 2>&1
if [[ $? -gt 0 ]]
    then
    cdrom_mount=true
else
    cdrom_mount=false
fi

这是一个非常简单的例子,但您可以做类似的事情......

相关内容