How to detect whether there is a CD-ROM in the drive?
I know my CD-ROM device ( /dev/sr0 ) but how can I detect from a script whether the drive is empty or whether there is a disk in it?
7 Answers 7
You can get information about any block device using the command 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
If I remove the disk, I don’t get any output and exit value is 2. (0 means success. A non-zero value will typically mean something abnormal happen or an error occurred)
[root@arch32-vm ~]# blkid /dev/sr0 [root@arch32-vm ~]# echo $? 2
blkid detects partitions, If i put a audio CD, it is not detected. Didn’t find a easier solution than create a program using ioctl as described in stackoverflow.com/questions/15652520/…
blkid causes the CD/DVD drive to close. I want something that can check if the platter is OPEN / CLOSED first, I think. Once closed (by a person), then it makes sense to see if there’s media present. Any thoughts on that?
setcd -i (in the setcd package, at least on Debian) can tell you the state of the drive. Unlike some of the other approaches (mount at least, probably blkid too), this will not attempt to close the tray, even on drives capable of that. (Which is really annoying if it tries to close on you while you’re putting a disc in).
$ setcd -i /dev/sr0 /dev/sr0: CD tray is open
Right after closing the tray:
$ setcd -i /dev/sr0 /dev/sr0: Drive is not ready
$ setcd -i /dev/sr0 /dev/sr0: Disc found in drive: data disc type 1 Volume name: «name» Publisher: MKISOFS ISO 9660/HFS FILESYSTEM BUILDER & CDRECORD CD-R/DVD CREATOR (C) 1993 E.YOUNGDALE (C) 1997 J.PEARSON/J.SCHILLING 2005030913034700�2005030913034700�0000000000000000 Data preparer: 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: No disc is inserted
You can fairly easily script it:
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
You can do the following with Python3 and the standard library:
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)
You can try with lsblk command:
If under FSTYPE for line /dev/sr0 there is nothing -> media not loaded into cdrom drive. If there is something under FSTYPE, probably iso9660 -> media is loaded into cdrom drive.
Another, I think the simplest way:
cat: /dev/sr0: No medium found
If output is anything but this:
cat: /dev/sr0: No medium found
Notice: I didn’t try this with audio nor empty cds, but I believe result would be the same.
With an audio CD, lsblk did not show any information, and trying to retrieve data gives Input/output error or no simply no data, while it works accessing a track through nautilus with a standard media player.
mount -t iso9660 /dev/sr0 /mnt/cdrom
Then check the return value $?
If the return is 0, «good» then there was disc present. Else, it will return not good «1» or anything but «0»
So to check silently, I would script it as so.
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
This is a very simplistic example, but you could do something similar.
A blank CD will fail to be mounted, so using mount does not really work. A broken CD will also fail to be mounted, but it is however present in the drive.
The issue with this shell-scripting approach is that none of the shell commands, mount, lsblk, blkid, can wait/block/pause and determine whether a cdrom is reporting «no medium found» because the tray has just closed and it is initializing itself to read the cd, or because there is no cd in the device, and «no medium found» will be reported forever. So you can choose a reasonable number of tries to pester the cdrom device at a certain sleep interval before giving up, as in the shell script below, or you can write a piece of c code with a few ioctl calls, and get some information from the cdrom, directly through the kernel.
#!/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=$ 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
Here is the shell script I use for my own purposes. It’s partially based on Allan’s answer.
The reasoning behind it is basically that I was using it in an extended shell command using && and needed it to wait for the device to be ready to mount.
#!/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 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
Не видит привод cd-rom
Вообщем не знаю куда уже и обратиься.Проблема такая: Пробовал устанавливпать многие версии Linux не видит привод.Этапы: 1.Язык 2.Раскладка клавиатуры 3. Поиск оборудования — на этом этапе зависает и пишет про драйвер, на старых версиях Linux.На более новых просто тупо зависает. Конфигурация компа:Intel(R) Core(TM) 2Duo E6750 2,66GHz 1,00 ГБ ОЗУ Видеокарта Ge Force 8800 GTS Винт SATA 160 ГБ Привод DVD RW AD-7173S в нем OW4253T VIA947J SCSI Мамка Asus Commando. Просил помощь у себя на форуме, но никто не знает что делать.Был в магазине. Говорят проблема с SATA контролёром CD. Надо найти драйвер на диске который с мамкой шёл и попробовать залить с дискетой. Но очень бы хотелось узнать как обзывается сей чудо-драйвер, а то их там много.Да и новые версии Linux про драйвер не спрашивают, а просто зависают. Советы типа: 1.Выдери привод и замени.2.Левая мамка и т.п. не нужны. Если не возможно поставить Linux на мой комп,то я очень разочарован в этой Оси. Все переходят на SАТА интерфейсы, а Linux их игнорирует что ли. Тогда у этой Оси нет будущего.
Re: Не видит привод cd-rom
Э-э-э. Что означает «в нем OW4253T VIA947J SCSI»? Как называется привод? NEC?
Для начала надо посмотреть, последний ли биос. Потом надо выставить в биосе режим AHCI/Native на контроллер. Удостовериться, что привод включен не в дополнительный контроллер, а в ICH8
Re: Не видит привод cd-rom
> Если не возможно поставить Linux на мой комп,то я очень разочарован в этой Оси. Все переходят на SАТА интерфейсы, а Linux их игнорирует что ли. Тогда у этой Оси нет будущего.
Да, и я бы на твоём месте поостерёгся так быстро делать далекоидущие выводы. У меня SATA HDD и SATA DWD-RW — отлично всё работает.
P.S. Попробовал скачать мануалку от твоей матери — асусовый сайт работает нереально медленно. Так что штудируй её сам.
Не устанавливается система с USB. Не было найдено дисков CD-ROM
Здравствуйте. Подскажите как установить дистрибутив с флешки? Дело в том что начатая установка, заканчивается ошибкой, и требованием диска. Неужели нельзя установить с флешки (у меня нет рабочего сидюка) или я что то делаю не так? Жёсткий диск видит, разметку принимает и как только дело доходит до записи изменений, всё завершается.
Вложения
Montfer
New member
Я создавал установочные флешки с помощью программ win32diskimager и winSetupFromUSB. Эти проги для винды
vekuve
New member
Fox909
New member
Я создавал установочные флешки с помощью программ win32diskimager и winSetupFromUSB. Эти проги для винды
Fox909
New member
Вы пробовали так делать или просто предполагаете? Дело в том что любой другой Linux дистрибутив, устанавливается без проблем, обычной записью iso, win32diskimager или утилитой от ROSA.
Montfer
New member
vekuve
New member
Вы пробовали так делать или просто предполагаете? Дело в том что любой другой Linux дистрибутив, устанавливается без проблем, обычной записью iso, win32diskimager или утилитой от ROSA.
я так и kali linux Записываю live cd и атсру делал (буквально на той неделе), тогда он воспринимался как привод с диском (грубо говоря), и инсталер его нормально подхватывал.
cogniter
Moderator
в Астре есть своя утилита для записи образа на флешку
vekuve
New member
в Астре есть своя утилита для записи образа на флешку
cogniter
Moderator
запишите из той системы, которая установлена. Записывать надо не программами ultraiso, а в режиме посекторного копирования.
Есть два способа создания LiveUSB флешки из прилагаемого загрузочного ISO образа. Первый способ более простой, но работает только на современных ЭВМ с поддержкой UEFI. Второй способ потребует некоторых технических знаний, но работает в том числе на старых ЭВМ без поддержки UEFI.
Флешку нужно отформатировать в файловую систему FAT32 и скопировать на неё все файлы с образа ISO, в том числе скрытую папку «.disk».
Внимание: если вы не понимаете как работает второй способ, то лучше им не пользуйтесь. Вы рискуете уничтожить свои данные и сделать ЭВМ неработоспособной.
Файл ISO образа нужно побайтно записать на USB флешку. В ОС Astra Linux это можно сделать с помощью команды:
# dd if=orel_live_2015030601.iso of=/dev/sdX bs=1M
/dev/sdX необходимо заменить на название устройства которым является USB флешка, обычно это /dev/sdb или /dev/sdc.
vekuve
New member
запишите из той системы, которая установлена. Записывать надо не программами ultraiso, а в режиме посекторного копирования.
Есть два способа создания LiveUSB флешки из прилагаемого загрузочного ISO образа. Первый способ более простой, но работает только на современных ЭВМ с поддержкой UEFI. Второй способ потребует некоторых технических знаний, но работает в том числе на старых ЭВМ без поддержки UEFI.
Флешку нужно отформатировать в файловую систему FAT32 и скопировать на неё все файлы с образа ISO, в том числе скрытую папку «.disk».
Внимание: если вы не понимаете как работает второй способ, то лучше им не пользуйтесь. Вы рискуете уничтожить свои данные и сделать ЭВМ неработоспособной.
Файл ISO образа нужно побайтно записать на USB флешку. В ОС Astra Linux это можно сделать с помощью команды:
# dd if=orel_live_2015030601.iso of=/dev/sdX bs=1M
/dev/sdX необходимо заменить на название устройства которым является USB флешка, обычно это /dev/sdb или /dev/sdc.
Еслиб вы тему почитали, то видели бы что у меня проблема решена. И я пробовал оба способа. Так что отвечать не мне надо было.
Первый способ (так назвыаемая в rufus «Записываем в режиме ISO-образа») с Astra SE1.6 приводит как раз к той ошибке что выше тут и не важно в уефи или нет. Т.е. установка начинается, а потом инсталер не видит «диск».
Нормально везде работает только второй сопсоб. лучше в википедии поправить раздел про руфус и указать что только в режиме dd