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


Answers:


8

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

4
blkid检测分区,如果我放了音频CD,则检测不到。没有找到比使用ioctl创建程序更简单的解决方案,如中所述 stackoverflow.com/questions/15652520/...
BatchyX

1
blkid 导致CD / DVD驱动器关闭。我想要一些可以检查盘片是否先打开/关闭的东西。一旦关闭(由一个人),那么看看是否存在媒体是有意义的。 有什么想法吗?
will

2

您可以尝试使用lsblk命令:

lsblk -fp

如果在FSTYPE下用于行/ dev / sr0则没有 - >媒体未加载到cdrom驱动器。 如果在FSTYPE下有什么东西,可能是iso9660 - >媒体被加载到cdrom驱动器中。

另外,我认为最简单的方法:

cat /dev/sr0 | head -1

如果输出是:

cat: /dev/sr0: No medium found

- >没有媒体加载。

如果输出是这样的:

cat: /dev/sr0: No medium found

- >媒体已加载。

注意:我没有尝试使用音频或空cds,但我相信结果会是一样的。


1

尝试安装设备。

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

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


不是那样的 -gt 应该 -eq
SHW

空白CD将无法安装,因此使用mount无法正常工作。损坏的CD也将无法安装,但它存在于驱动器中。
Étienne

1

这种shell脚本方法的问题在于,没有任何shell命令mount,lsblk,blkid可以等待/阻止/暂停并确定cdrom是否报告“找不到介质”,因为托盘刚刚关闭并且正在初始化本身要读取CD,或者因为设备中没有CD,并且“将找不到介质”将永远报告。因此,您可以选择合理数量的尝试在放弃之前以某个休眠间隔对cdrom设备进行纠缠,如下面的shell脚本中所示,或者您可以使用一些ioctl调用编写一段c代码,并从中获取一些信息cdrom,直接通过内核。

#!/bin/sh

# cd.close
#
# Close the CD-ROM tray, and mount the CD-ROM device:
#
# mount status codes: see man mount(8)
# ------------------------------------
# 0   success
# 1   incorrect invocation or permissions
# 2   system error (out of memory, cannot fork, no more loop devices)
# 4   internal mount bug
# 8   user interrupt
# 16  problems writing or locking /etc/mtab
# 32  mount failure
# 64  some mount succeeded (in the case of mount -a)

CDROM=/dev/sr0
TRIES="1 2 3"
INTERVAL=5
MOUNT=0

TOKENS=( $TRIES )
STOP=${TOKENS[-1]}

for i in $TRIES; do
echo close: ATTEMPT $i of $STOP
output=`mount $CDROM -t iso9660 /cdrom 2>&1`
status=$?
echo mount: OUTPUT $output
echo mount: STATUS $status
if [ $status -eq 0 ]; then
  MOUNT=1
  break
else
  if [[ "$output" =~ "already mounted" ]]; then
    MOUNT=1
    break
  fi
fi
if [ $i -eq $STOP ]; then
  break
fi
echo sleep: $INTERVAL SECONDS...
sleep $INTERVAL
done

if [ $MOUNT -eq 1 ]; then
  echo final: MOUNTED $CDROM
  printf "final: LABEL "
  volname $CDROM
else
  echo final: NO MEDIUM
fi

0

这是我用于自己目的的shell脚本。它部分基于 艾伦 的答案。

它背后的原因基本上是我在扩展的shell命令中使用它 && 并需要它等待设备准备好安装。

#!/bin/bash
# mountdvd:
#   A shell script to wait until the optical drive can be mounted.
#
#   Important Notes:
#    - By default, this will wait about 10 seconds for the drive to finish reading a newly
#      inserted disk.
#    - Works best already be given a mount point in /etc/fstab
#    - Works best if fs type is set to auto
#    - Assumes /etc/fstab allows user to mount device
#
#   Example /etc/fstab listing:
#    /dev/cdrom /media/dvd auto nofail,auto,user,exec,utf8,noatime,ro,uid=plex,gid=pi 0 0

# Command name
COMMAND=`basename $0`

# Device to mount
DVD_DEVICE=/dev/cdrom
MOUNT_POINT=/media/dvd

# Number of attempts before giving up (Total time = ATTEMPTS * WAIT_TIME, default: 10 seconds)
ATTEMPTS=20

# Wait time in seconds
WAIT_TIME=0.5

# Check if already mounted first
MOUTPUT=`mountpoint -q $MOUNT_POINT`
MSTATUS=$?

if [ $MSTATUS -eq 0 ]; then
    echo "$COMMAND: $DVD_DEVICE was already mounted."
    exit 0
fi

#for ATTEMPT in {1..$ATTEMPTS}
while [ $ATTEMPTS -gt 0 ];
do
    # Attempt to mount device
    OUTPUT=`mount $DVD_DEVICE 2>&1`
    STATUS=$?

    if [ $STATUS -eq 0 ]; then
        # Device mounted
        exit 0
    else
        # Double check here, just in case earlier check failed.
        if [[ "$OUTPUT" =~ "already mounted" ]]; then
            # Device was already mounted
            echo "$COMMAND: $DVD_DEVICE was already mounted."
            exit 0
        fi
    fi

    if [ $ATTEMPTS -ne 1 ]; then
        # Wait a moment before trying again.
        sleep $WAIT_TIME
    fi

    let ATTEMPTS=ATTEMPTS-1
done

echo "$COMMAND: ERROR: Unable to mount $DVD_DEVICE."
exit 1

0

您可以使用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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.