Comment mettre à jour la taille du CD-ROM sous Linux sans éjecter le CD-ROM?

Comment puis-je amener Linux à mettre à jour son idée de la taille d’un CD-ROM sans l’éjecter? En d’autres termes, comment puis-je monter un CD-ROM fraîchement brûlé sans l’éjecter en premier?

Je fais des sauvegardes incrémentielles sans surveillance sur un CDROM. Chaque jour, mon script utilise “wodim -msinfo” et “genisoimage -C” pour générer une image qui est ajoutée au CD-ROM en utilisant “wodim -multi”. Mon script monte ensuite le CD-ROM pour vérifier que les nouveaux fichiers ont été correctement ajoutés. Le script ne peut lire que les nouveaux fichiers si l’idée de Linux de la taille du CD-ROM est mise à jour avant le assembly. La taille est dans / sys / block / sr2 / size et / proc / partitions. Auparavant, mon script utilisait “eject” puis “eject -t” pour que Linux relise le CD-ROM. “eject -t” ne fonctionne pas sur mon nouveau graveur de CD-ROM. Comment puis-je obtenir / proc / partitions à jour sans éjecter le CD-ROM?

Il semble que les étapes “wodim -msinfo” et “genisoimage -C” exigent également que le CD-ROM ait été éjecté depuis la gravure précédente sur le CD-ROM, sinon le message “genisoimage: argument invalide” apparaît.

Quelqu’un a posé cette question en 2003 mais la réponse qu’ils ont reçue ne met pas à jour la taille du CD-ROM pour moi. http://compgroups.net/comp.os.linux.questions/rescan-cdrom-frm-command-line/456190

#include  #include  #include  int main(void) { int i = 0; int fd = open("/dev/cdrom", O_RDWR); if (fd == -1) { perror("Could not open cdrom"); return 1; } if (ioctl(fd, CDROM_MEDIA_CHANGED)) perror("ioctl"); if (ioctl(fd, CDROMRESET)) perror("ioctl CDROMRESET"); if (ioctl(fd, CDROM_NEXT_WRITABLE, &i)) perror("ioctl CDROM_NEXT_WRITABLE,"); else printf("CDROM_NEXT_WRITABLE %d\n", i); if (ioctl(fd, CDROM_LAST_WRITTEN, &i)) perror("ioctl CDROM_LAST_WRITTEN,"); else printf("CDROM_LAST_WRITTEN %d\n", i); return 0; } 

C’est exactement ce qui se passe lorsque je crée un nouveau CD-ROM. Je dois l’éjecter puis le repousser pour le monter.

 % genisoimage -r -V archive -input-charset ASCII -quiet /usr/lib/vlc > /tmp/libvlc.iso % grep -H sr2 /proc/partitions ; cat /sys/block/sr2/size /proc/partitions: 11 2 2 sr2 4 % wodim driveropts=burnfree -tao -data dev=/dev/sr2 /tmp/libvlc.iso wodim: Operation not permitted. Warning: Cannot raise RLIMIT_MEMLOCK limits. Device type : Removable CD-ROM Version : 0 Response Format: 2 Capabilities : Vendor_info : 'TSSTcorp' Identification : 'CDDVDW SE-S084C ' Revision : 'TU00' Device seems to be: Generic mmc2 DVD-R/DVD-RW. Using generic SCSI-3/mmc CD-R/CD-RW driver (mmc_cdr). Driver flags : MMC-3 SWABAUDIO BURNFREE Supported modes: TAO PACKET SAO SAO/R96P SAO/R96R RAW/R16 RAW/R96P RAW/R96R Speed set to 1764 KB/s Starting to write CD/DVD at speed 10.0 in real TAO mode for single session. Last chance to quit, starting real write in 0 seconds. Operation starts. Track 01: Total bytes read/written: 17078272/17078272 (8339 sectors). % grep -H sr2 /proc/partitions ; cat /sys/block/sr2/size /proc/partitions: 11 2 2 sr2 4 % sudo mount /dev/sr2 /mnt mount: /dev/sr2 is write-protected, mounting read-only mount: wrong fs type, bad option, bad superblock on /dev/sr2, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so. % grep -H sr2 /proc/partitions ; cat /sys/block/sr2/size /proc/partitions: 11 2 2 sr2 4 % sudo mount /dev/sr2 /mnt mount: /dev/sr2 is write-protected, mounting read-only mount: wrong fs type, bad option, bad superblock on /dev/sr2, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so. % sudo eject /dev/sr2 % #push CDRW back in % grep -H sr2 /proc/partitions ; cat /sys/block/sr2/size /proc/partitions: 11 2 16682 sr2 33364 % sudo mount /dev/sr2 /mnt mount: /dev/sr2 is write-protected, mounting read-only 

J’ai essayé différentes options hdparm, mais aucune ne fonctionne, ni ne change l’idée du kernel quant à la taille du CD-ROM ou permet son assembly.

 :; sudo hdparm -z /dev/sr2 /dev/sr2: re-reading partition table BLKRRPART failed: Invalid argument :; sudo hdparm -F /dev/sr2 /dev/sr2: SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 :; sudo hdparm -Y /dev/sr2 /dev/sr2: issuing sleep command SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 :; sudo hdparm -w /dev/sr2 /dev/sr2: resetting drive HDIO_DRIVE_RESET failed: Invalid argument :; grep -H sr2 /proc/partitions ; cat /sys/block/sr2/size /proc/partitions: 11 2 2 sr2 4 :; sudo mount /dev/sr2 /mnt mount: /dev/sr2 is write-protected, mounting read-only mount: wrong fs type, bad option, bad superblock on /dev/sr2, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so. 

Spécifier le type du système de fichiers n’aide pas.

 :; grep -H sr2 /proc/partitions ; cat /sys/block/sr2/size /proc/partitions: 11 2 2 sr2 4 :; sudo mount -t iso9660 /dev/sr2 /mnt [sudo] password for root: (pam_mount.c:365): pam_mount 2.14: entering auth stage mount: /dev/sr2 is write-protected, mounting read-only mount: wrong fs type, bad option, bad superblock on /dev/sr2, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so. (pam_mount.c:133): clean system authtok=0x7f0a33b97450 (1073741824) :; grep -H sr2 /proc/partitions ; cat /sys/block/sr2/size /proc/partitions: 11 2 2 sr2 4 

Le message que je reçois de dmesg (1) est

 [1209552.092616] isofs_fill_super: bread failed, dev=sr2, iso_blknum=16, block=16 

J’ai le même problème avec un lecteur BD. Ce qui a fonctionné pour moi, c’est de détacher l’appareil et de le reconnecter à nouveau. Voici les étapes difficiles

  • trouver le périphérique USB via “lsscsi -v”

     [11:0:0:0] cd/dvd TSSTcorp BDDVDW SE-506AB TS01 /dev/sr1 dir: /sys/bus/scsi/devices/11:0:0:0 [/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/host11/target11:0:0/11:0:0:0] 
  • éteindre l’appareil / préparer à la déconnexion

     sudo bash -c "echo 2-1.2 | tee /sys/bus/usb/drivers/usb/unbind" 
  • allumer l’appareil / se connecter à nouveau

     sudo bash -c "echo 2-1.2 | tee /sys/bus/usb/drivers/usb/bind" 

Unbind / bind est un excellent moyen de réinitialiser de nombreux périphériques USB …

Peut-être en utilisant la commande blockdev (8)?

blockdev –flushbufs –rereadpt / dev / sr0