Linux cdrom: Difference between revisions

From miki
Jump to navigation Jump to search
(Created page with "== Tips == === Backup cdrom === Here a script I use to backup cdrom on Linux, named {{file|ripcd.sh}}. * Use '''cdrdao''' for raw extraction. :* extra AUDIO tracks. :* extra M...")
 
Line 10: Line 10:
* Compare files on ISO with those on cdrom.
* Compare files on ISO with those on cdrom.


;Limitations:
Note that some CD may have extraction errors in the 2s lead out (150 last sectors). The `rip-dd` function in the script (not used) work around that by extracting only the data part, excludind that lead out track. Note however that `rip-cd` does not make a complete rip (ignore audio tracks for instance).
* Note that some CD may have extraction errors in the 2s lead out (150 last sectors). This is normal.
* Sub-channel extraction (<code>rip-cdrdao-raw-sub</code>) does not work. At least, it does not produce same data as CloneCD.

;rip-dd
* The <code>rip-dd</code> function in the script (not used) work around that by extracting only the data part, excludind that lead out track.
* Note however that <code>rip-cd</code> does not make a complete rip (ignore audio tracks for instance).


<source lang="bash">
<source lang="bash">

Revision as of 12:15, 4 April 2020

Tips

Backup cdrom

Here a script I use to backup cdrom on Linux, named ripcd.sh.

  • Use cdrdao for raw extraction.
  • extra AUDIO tracks.
  • extra MODE2 tracks.
  • Use edccchk to check ECC/ECD on raw image
  • Make sure raw image has no ECC/ECD warning/error (if so, better extract ISO to have errors corrected).
  • Use raw2iso (original) to convert raw image into iso file.
  • Compare files on ISO with those on cdrom.
Limitations
  • Note that some CD may have extraction errors in the 2s lead out (150 last sectors). This is normal.
  • Sub-channel extraction (rip-cdrdao-raw-sub) does not work. At least, it does not produce same data as CloneCD.
rip-dd
  • The rip-dd function in the script (not used) work around that by extracting only the data part, excludind that lead out track.
  • Note however that rip-cd does not make a complete rip (ignore audio tracks for instance).
#! /bin/bash
#
# ./ripcd.sh [--sub] image_name

unset SUB
NAME="$1"
if [ "$NAME" = "--sub" ]; then
    SUB=sub
    shift
    NAME="$1"
fi
if [ -z "$NAME" ]; then
    echo "Usage: ripcd.sh [--sub] image_name"
    exit 1
fi

MNT1=/mnt/any
MNT2=/mnt/cdrom
DEV=/dev/cdrom

cmd=$(basename "$0")

die()
{
    echo "cmd -- ERROR: $@" >&2
    exit 1
}

rip-dd()
{
    isoinfo -d -i $DEV

    # Reading block size/count - rawread http://www.troubleshooters.com/linux/coasterless.htm
    BLOCKSIZE=`isoinfo -d -i $DEV | grep "^Logical block size is:" | cut -d " " -f 5`
    [ -n "$BLOCKSIZE" ] || die Blank blocksize

    BLOCKCOUNT=`isoinfo -d -i $DEV | grep "^Volume size is:" | cut -d " " -f 4`
    [ -n "$BLOCKCOUNT" ] || die Blank blockcount

    mkdir "$NAME"
    echo "Ripping cd to '$NAME/$NAME.iso' (${BLOCKCOUNT}x${BLOCKSIZE} bytes)"
    sudo dd if=$DEV of="$NAME/$NAME.iso" bs=$BLOCKSIZE count=$BLOCKCOUNT conv=notrunc,noerror
}

rip-cdrdao-raw()
{
    mkdir "$NAME"
    pushd "$NAME"
    echo "Ripping cd to '$NAME/$NAME.bin' (cdrdao-raw)"
    cdrdao read-cd --device $DEV --read-raw --datafile "$NAME.bin" -v 2 "$NAME.toc"
    # Note: Convert .bin to .iso using https://github.com/not-a-user/raw2iso (or ccd2iso)
    popd
}

rip-cdrdao-raw-sub()
{
    # Not working properly? sub-channel not the same as extracted by clonecd

    mkdir "$NAME"
    pushd "$NAME"
    echo "Ripping cd to '$NAME/$NAME.bin+sub' (cdrdao-raw-sub)"
    cdrdao read-cd --device $DEV --read-raw --read-subchan rw_raw --datafile "$NAME.bin+sub" -v 2 "$NAME.toc+sub"
    echo "Reading normal TOC"
    cdrdao read-toc --device $DEV --read-raw --datafile "$NAME.bin" -v 2 "$NAME.toc"
    # Separate RAW and SUB data
    # raw2iso - https://github.com/not-a-user/raw2iso
    TYPE=$(egrep -o '(MODE1_RAW|MODE1|MODE2_RAW|MODE2_FORM1|MODE2_FORM2|MODE2_FORM_MIX)' "$NAME.toc+sub")
    echo "Extracting RAW from type $TYPE"
    raw2iso $TYPE RW_RAW RAW < $NAME.bin+sub > $NAME.bin
    echo "Extracting SUBCHANNEL from type $TYPE"
    raw2iso $TYPE RW_RAW SUB < $NAME.bin+sub > $NAME.sub
    rm $NAME.bin+sub
    # Note: Convert .bin to .iso using https://github.com/not-a-user/raw2iso (or ccd2iso)
    popd
}

check-raw()
{
    pushd "$NAME"

    echo "Checking EDC/ECC in RAW image."
    # edccchk - https://github.com/claunia/edccchk
    edccchk "$NAME.bin"

    TYPE=$(egrep -o '(MODE1_RAW|MODE1|MODE2_RAW|MODE2_FORM1|MODE2_FORM2|MODE2_FORM_MIX)' "$NAME.toc")
    echo "Converting RAW image (type $TYPE) to ISO"
    # raw2iso - https://github.com/not-a-user/raw2iso
    raw2iso $TYPE < $NAME.bin > $NAME.iso

    echo "Comparing files on ISO image with CDROM..."
    sudo mkdir -p $MNT1 $MNT2
    sudo mount -o loop "$NAME.iso" $MNT1
    sudo mount /dev/cdrom $MNT2
    diff -r $MNT1 $MNT2
    sudo umount $MNT1 $MNT2

    rm $NAME.iso
    popd
}

rip-cdrdao()
{
    mkdir "$NAME"
    pushd "$NAME"
    echo "Ripping cd to '$NAME/$NAME.iso' (cdrdao-raw)"
    cdrdao read-cd --device $DEV --datafile "$NAME.iso" -v 2 "$NAME.toc"
    popd
}

check()
{
    echo "Verifying..."
    sudo mkdir -p $MNT1 $MNT2
    sudo mount /dev/cdrom $MNT2
    sudo mount -o loop "$NAME/$NAME.iso" $MNT1
    diff -r $MNT1 $MNT2
    sudo umount $MNT1 $MNT2
}

# Updat sudo credentials
sudo -v

[ -n "$SUB" ] && rip-cdrdao-raw-sub || rip-cdrdao-raw
# rip-cdrdao

check-raw
# check