Запись CD-R дисков.
Автор : Олег Цыбульский
Здесь расписано почти пошаговое прохождение этапов установки девайса для записи CD дисков и сам процесс занесения на них информации. На момент приобретения CD-RW привода уже имелся обыкновенный CD-ROM и винчестер, так сказать при нём. Винчестер назывался в народе /dev/hda, a CD-RW и CD-ROM были помещены на второй контроллер, как master и slave соответственно. Они назывались бы hdc и hdd, но по древней кармической традиции надо перевести свой IDE CD-RW в режим SCSI emulation, чтобы он заработал как пишущий. Для этого заходим в исходники ядра,
make menuconfig
в секции "ATA/IDE/MFM/RLL support --->IDE, ATA and ATAPI Block devices" изничтожаем все отметки напротив "Include IDE/ATAPI CDROM support", ну в крайнем случае делаем их модулем (M), и включаем "SCSI emulation support". Затем идем в "SCSI support --->", добавляем "SCSI support", "SCSI CD-ROM support" (можно модулем) и "SCSI generic support". Теперь небольшой трюк. Чтобы новое ядро отличалось по имени от остальных, в частности от предыдущего, в Makefile находим строчку с EXTRAVERSION и заменяем ее на EXTRAVERSION = .new1 Всё, компилируем:
make dep
make bzImage
make install
make modules
make modules_install
Осталось в загрузчике прописать новое ядро, которое называется у меня, например, /boot/vmlinuz-2.4.20.new1, но если у вас загрузчик настроен на vmlinuz, то добавить надо старое ядро на случай неудачной загрузки, потому что /boot/vmlinuz - это обычно ссылка, которая уже указывает на новое. Загружаемся, и если видим в dmesg|less примерно такие строчки
scsi0 : SCSI host adapter emulation for IDE ATAPI devices
Vendor: HL-DT-ST Model: CD-RW GCE-8481B Rev: 1.01
Type: CD-ROM ANSI SCSI revision: 02
Vendor: TEAC Model: CD-532E-B Rev: 1.0A
Type: CD-ROM ANSI SCSI revision: 02
значит наш cd-writer теперь сидит на /dev/scd0, а cd-rom на /dev/scd1. Не забываем прописать в /etc/fstab
/dev/scd1 /cdrom iso9660
defaults,iocharset=koi8-r,ro,user,noauto,noexec 0 0
/dev/scd0 /mnt/cdrw iso9660
defaults,iocharset=koi8-r,ro,user,noauto,noexec 0 0
Устанавливаем пакет cdrecord, проверяем, что он видит
cdrecord -scanbus
у меня он видит следующее
scsibus0:
0,0,0 0) 'HL-DT-ST' 'CD-RW GCE-8481B ' '1.01' Removable CD-ROM
0,1,0 1) 'TEAC ' 'CD-532E-B ' '1.0A' Removable CD-ROM
и это хорошо. Так в /etc/default/cdrecord и запишем
CDR_DEVICE=0,0,0
CDR_SPEED=24
Последнее - это скорость, на которой будем писать по умолчанию, с этим можно экспериментировать. Ну вот, теперь приступаем к самой записи. Создаём папку, в которую складываем то, что будет потом на диске. Например, /tmp/new/. Название здесь не важно, потому что на диск попадет только её содержимое. Теперь набрасываем в это new всё, что надо и создаем образ диска:
mkisofs -o /tmp/img_1.raw -R -J ~/tmp/new
Опция -o по традиции указывает, как назвать и куда положить наш образ. Опции -R -J добавляют расширения к стандартной файловой системе cd-диска - такие, как RockRidge (полезная вещь) и Joliet (глупая придумка майкрософт, но добавить надо, чтобы из-под их ОС можно было этот диск прочесть). Если пользуетесь файлами с русскими именами, то замените -J на -jcharset koi8-r. Теперь проверим, хороший ли мы образ создали.
mount /tmp/img_1.raw -r -o loop /mnt/loop
ls /mnt/loop
Если все прошло без ошибок, то
umount /mnt/loop
и можно диск писать
cdrecord -v -eject -multi /tmp/img_1.raw
Опция -multi нужна, чтобы сделать диск мультисессионным, -eject выдвигает диск по окончании записи, а -v - просто чтоб буковки по экранчику побегали. Теперь в нас нарастает ощущение, что записать-то мы записали, но как-то маловато - вон ещё сколько места осталось, если болванку на свет посмотреть. И поэтому тут же докидываем в папку /tmp/new ещё чего-нибудь и готовимся сделать вторую сессию на нашем диске.
cdrecord -msinfo
позволит узнать нам для этих целей начало предыдущей дорожки и начало новой. Будет что-то примерно следующее:
0,41757
Создадим теперь образ новой сессии с учётом, конечно, предыдущей:
mkisofs -o /tmp/img_2.raw -R -J -C 0,41757 -M /dev/scd0 /tmp/new
img_2.raw просто так не примонтируешь, просмотреть, что там получилось можно таким образом:
mkisofs -o /tmp/img_3.raw -R -J -C 0,0 -M /dev/scd0 /tmp/new
mount /tmp/img_3.raw -r -o loop /mnt/loop
Если всё нормально выглядит, то img_2.raw можно записывать
cdrecord -v -eject -multi /tmp/img_2.raw
Да, чуть не забыл, чтобы не отягощать себя для записи правами суперпользователя, полезно добавить себя в группу cdrom
adduser oleg cdrom
Сейчас о ещё паре тонкостей. Как прочесть любую предыдущую сессию? Для начала просмотрим, вообще, какие у нас на cdrom'е есть.
cdrecord -toc
И, для примера, видим:
track: 1 lba: 0 ( 0) 00:02:00 adr: 1 control: 4 mode: 1
track: 2 lba: 41757 ( 167028) 09:18:57 adr: 1 control: 4 mode: 1
track: 3 lba: 77510 ( 310040) 17:15:35 adr: 1 control: 4 mode: 1
track: 4 lba: 87437 ( 349748) 19:27:62 adr: 1 control: 4 mode: 1
track:lout lba: 88882 ( 355528) 19:47:07 adr: 1 control: 4 mode: -1
Допустим, нас интересует третья дорожка. Возьмём адрес её начала - 77510, сделаем пустую папку mkdir /tmp/empt и теперь создадим образ того, что содержал диск после третьей сессии.
mkisofs -o /tmp/s3.raw -R -J -C 77510,0 -M /dev/scd0 /tmp/empt
Монтируем s3.raw и смотрим. Но вот мы решили, что 3-я и 4-я сессии были неудачны и хотим сделать новую продолжением 2-й. Для этого надо знать адреса начала 2-й сессии (в нашем случае 41757) и адрес начала новой дорожки. Последний узнаётся или как окончание последней сессии (у нас 88882) плюс 6900 и выходит 95782, или, что ещё проще, из вывода
cdrecord -msinfo
87437,95782
берём второе число, как видим, то же самое. Теперь образ для записи получаем так:
mkisofs -o /tmp/img_5.raw -R -J -C 41757,95782 -M /dev/scd0 /tmp/new
что получилось смотрим через chk.raw
mkisofs -o /tmp/chk.raw -R -J -C 41757,0 -M /dev/scd0 /tmp/new
а запишем его ради интереса на 2-й скорости
cdrecord -v speed=2 -eject -multi /tmp/img_5.raw
Ну, вот на этом, вроде, и всё, пока.