Linux CD

From miki
Jump to navigation Jump to search

Links

  • CRC / sha1sum database of many game disc. Useful to check a cd rip.
  • CD rip program: DICUI (windows only)
  • edccchk — Tool to check ECC/ECD in RAW CD image.
  • Useful to check integrity of a RAW image, making sure there is no error that should be corrected (better correct the errors first before burning the CD).
This guide mainly targets standard ISO9660 CD that can be ripped as ISO image (using dd).
Lots of useful information.
Explains the origin of input/output error when using dd (often due to bad sector in the lead out part, 2s blank at the end of the CD).
Backing up CD
Package to scan for activate copy-protection in executables
  • THE* site for backing up games / bypassing copy-protection mechanisms.
  • Suggest to install older version of DaemenTools (typically 4.x series). For Win7, 4.35 is first version to support Win7, and 4.49 the latest 4.x version.
  • Suggest to use ProtectionID to identify whether a game is using a protection mechanism.

CDROM info

Tips

Backup a 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.
  • Endianness of audio track is SWAPPED. If mounting in Daemon Tools, byte order of audio track must be swap (see script). [1] [2] [3].
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()
{
    echo "################################################################################"
    echo "# !!! If CD contains AUDIO track, endianness will be wrong if mounted with     #"
    echo "# !!! DAEMON TOOLS for instance                                                #"
    echo "#                                                                              #"
    echo "# To fix, do                                                                   #"
    echo "#     dd if=IMAGE.bin of=IMAGE.data bs=2352 count=XXX                          #"
    echo "#     dd if=IMAGE.bin of=IMAGE.audio bs=2352 skip=XXX conv=swab                #"
    echo "#     cat IMAGE.data IMAGE.audio > IMAGE.bin                                   #"
    echo "#                                                                              #"
    echo "#     where XXX = is the size in byte of the first data track (see .toc)       #"
    echo "#                                                                              #"
    echo "# Or consider using --swap in cdrdao                                           #"
    echo "#                                                                              #"
    echo "################################################################################"
    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

Ripping mixed mode CD (DATA + AUDIO)

Might consider using Cue Ripper or Exact Audio Copy to extract the audio tracks.

In that case the RAW CD image must be recombined. For instance, if extracting as .flac file:

# Say XXX = size in byte of first MODE1_RAW DATA track (see .toc file)
dd if=IMAGE.bin of=IMAGE.data bs=2352 count=XXX
for f in *.flac; do flac -d $f; done
for f in *.wav; do dd if=$f of=$f.strip bs=44 skip=1; done  # Must remove WAV header
cat IMAGE.data *.strip > IMAGE.bin

Convert RAW CD image to ISO

Use raw2iso (original) to convert raw image into iso file.

raw2iso MODE1_RAW < data.bin > data.iso

See help for other parameters.

Rip an Audio CD

  • NEW CUERipper, under wine.
Faster than EAC. Provide accuterip report. My current preferred method.
  • Exact Audio Copy, under wine.
  • whipper, Linux.
Using Python3. Never tried.