12.5. Запись и использование оптических носителей (CD & DVD)

Текст предоставилMike Meyer.

12.5.1. Введение

Компакт-диски (CD) имеют несколько особенностей, отличающих их от обычных дисков. Во-первых, на них невозможно производить запись. Они спроектированы с расчетом на то, что их можно читать последовательно без задержек на перемещение головки между дорожками. К тому же их гораздо проще переносить от системы к системе, чем носители близкого объема.

У CD имеются дорожки, но они представляют собой последовательность данных, читаемую последовательно, и не являются физической характеристикой диска. Для записи CD во FreeBSD вы готовите файлы данных, которые будут формировать дорожки на компакт-диске, а затем записываете дорожки на CD.

Файловая система ISO 9660 была разработана с учетом этих отличий, К сожалению, она унаследовала ограничения файловых систем, которые были тогда. К счастью, она дает механизм расширений, которые позволяют правильно записанным дискам обходить эти ограничения и при этом продолжать работать с системами, которые не поддерживают эти расширения.

Для создания файла данных, содержащего файловую систему ISO 9660, используется программа sysutils/mkisofs. Она имеет опции, поддерживающие различные расширения, и описана ниже. Вы можете установить её из портов sysutils/mkisofs.

Какой инструмент использовать для записи CD, зависит от того, является ли ваше устройство для записи CD устройством ATAPI или каким-либо другим. С устройствами для записи стандарта ATAPI используется программа burncd, которая является частью комплекта поставки системы. С устройствами SCSI и USB нужно использовать cdrecord из порта sysutils/cdrtools.

burncd поддерживает не все устройства. Для определения того, поддерживается ли устройство, посмотрите список поддерживаемых устройств CD-R/RW.

12.5.2. mkisofs

sysutils/mkisofs создаёт файловую систему ISO 9660, которая является образом дерева каталогов в пространстве имён файловой системы Unix. В самом простом случае она используется так:

    # mkisofs -o imagefile.iso /path/to/tree

Эта команда создаст файл imagefile.iso, содержащий файловую систему ISO 9660, которая является копией дерева каталогов /path/to/tree. Во время работы она будет преобразовывать имена файлов в имена, которые удовлетворяют ограничениям файловой системы ISO 9660, и исключит файлы, которые носят имена, неподходящие для файловой системы ISO.

Для того, чтобы обойти эти ограничения, имеется несколько опций. В частности, -R включает использование расширений Rock Ridge, распространенных в Unix-системах, с -J будут применены расширения Joliet, используемые в системах от Microsoft, а -hfs может использоваться для создания файловых систем HFS, используемых в MacOS.

Для CD, которые будут использоваться только с системами FreeBSD, может использоваться опция -U, отменяюшая все ограничения на имена файлов. При использовании с опцией -R генерируется образ файловой системы, идентичный начальному дереву FreeBSD, хотя при этом стандарт ISO 9660 может нарушаться в нескольких местах.

Последней часто используемой опцией является -b. Она используется для указания загрузочного образа для использования при создании загрузочного CD в стандарте "El Torito". Этой опции указывается аргумент, который является маршрутом к загрузочному образу из корня дерева, записываемого на CD. Так что, положив, что /tmp/myboot содержит загрузочную систему FreeBSD с загрузочным образом в /tmp/myboot/boot/cdboot, вы можете создать образ файловой системы ISO 9660 в /tmp/bootable.iso следующим образом:

    # mkisofs -U -R -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot

Сделав это, и имея в ядре отконфигурированное устройство vn, вы можете смонтировать файловую систему, выполнив:

    # vnconfig -e vn0c /tmp/bootable.iso
    # mount -t cd9660 /dev/vn0c /mnt

В этот момент вы можете проверить, что /mnt и /tmp/myboot идентичны.

Имеется много других опций, которые можно использовать с программой sysutils/mkisofs для тонкой настройки её поведения. В частности: модификации в размещении ISO 9660 и создание дисков в форматах Joilet и HFS. Обратитесь к справочным страницам по mkisofs(8) для получения более подробной информации.

12.5.3. burncd

Если ваше устройство для записи CD соответствует стандарту ATAPI, то для записи ISO-образа на компакт-диск вы можете воспользоваться командой burncd. burncd входит в базовый комплект операционной системы и установлена как /usr/sbin/burncd. Использовать её очень просто, так как параметров у ней немного:

    # burncd -f cddevice data imagefile.iso fixate

По этой команде файл imagefile.iso будет скопирован на cddevice. По умолчанию используется устройство /dev/acd0c. Для получения информации о параметрах, задающих скорость записи, выброс диска после записи и запись звуковых данных, обратитесь к burncd(8).

12.5.4. cdrecord

Если ваше устройство для записи CD не соответствует стандарту ATAPI, то для записи компакт-дисков вам нужно пользоваться программой cdrecord. cdrecord не входит в комплект поставки системы; вы должны установить её из порта sysutils/cdrtools или из соответствующего пакаджа. Изменения в системе могут приводить к тому, что откомпилированные версии этой программы работать не будут, или приводить к порче дисков. Поэтому вы должны при обновлении системы либо обновить порт, либо, если вы следуете -STABLE, обновить порт при появлении его новой версии.

Хотя cdrecord имеет много опций, в основном использовать её ещё проще, чем burncd. Запись образа ISO 9660 делается такой командой:

    # cdrecord dev=device imagefile.iso

Тонким моментом при использовании cdrecord является определение правильного устройства dev. Чтобы задать параметр правильно, воспользуйтесь флагом -scanbus команды cdrecord, в результате чего может получиться примерно такой результат:

    # cdrecord -scanbus
    Cdrecord 1.9 (i386-unknown-freebsd4.2) Copyright (C) 1995-2000 Jörg Schilling
    Using libscg version 'schily-0.1'
    scsibus0:
            0,0,0     0) 'SEAGATE ' 'ST39236LW       ' '0004' Disk
            0,1,0     1) 'SEAGATE ' 'ST39173W        ' '5958' Disk
            0,2,0     2) *
            0,3,0     3) 'iomega  ' 'jaz 1GB         ' 'J.86' Removable Disk
            0,4,0     4) 'NEC     ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM
            0,5,0     5) *
            0,6,0     6) *
            0,7,0     7) *
    scsibus1:
            1,0,0   100) *
            1,1,0   101) *
            1,2,0   102) *
            1,3,0   103) *
            1,4,0   104) *
            1,5,0   105) 'YAMAHA  ' 'CRW4260         ' '1.0q' Removable CD-ROM
            1,6,0   106) 'ARTEC   ' 'AM12S           ' '1.06' Scanner
            1,7,0   107) *

Здесь приведены соответствующие значения параметров dev для имеющихся устройств. Найдите здесь ваше устройство для записи CD, а в качестве параметров для dev задавайте три числа через запятые. В нашем случае CRW-устройству соответствуют числа 1,5,0, так что правильным параметром будет dev=1,5,0. Имеется более простой способ задать эти значения; обратитесь к справочной информации о cdrecord(1) для выяснения подробностей. Там же находится информация о записи звуковых дорожек, управлении скоростью и другим вещам.

12.5.5. Копирование аудио CD

Вы можете копировать музыкальные CD, извлекая данные аудио с CD в набор файлов, а затем записывая эти файлы на чистый CD. Процесс несколько различен в случаях использования устройств ATAPI и SCSI.

Устройства SCSI

  1. Используйте cdda2wav для извлечения данных аудио.

        % cdda2wav -v255 -D2,0 -B -Owav
  2. Воспользуйтесь cdrecord для записи файлов .wav.

        % cdrecord -v dev=2,0 -dao -useinfo  *.wav

    Значение, соответствующее 2.0, должно быть устанволено правильно, как это описано в Section 12.5.4.

Устройства ATAPI

  1. Драйвер устройств ATAPI CD делает каждую дорожку доступной как /dev/acddtn, где d является номером привода, в n соответствует номеру дорожки. Таким образом, первая дорожка на первом диске будет носить имя /dev/acd0t1.

    Удостоверьтесь, что соответствующий файл имеется в каталоге /dev.

        # cd /dev
        # sh MAKEDEV acd0t99
  2. Извлеките каждую дорожку при помощи команды dd(1). При извлечении файлов вы должны также использовать специфическое значение для размера блока.

        # dd if=/dev/acd0t1 of=track1.cdr bs=2352
        # dd if=/dev/acd0t2 of=track2.cdr bs=2352
        ...
  3. Запишите извлечённые файлы на диск при помощи утилиты burncd. Вы должны указать, что это файлы с аудио, и что burncd должна зафиксировать диск по окончании работы.

        # burncd -f /dev/acd0c audio track1.cdr track2.cdr ... fixate

12.5.6. Копирование компакт-дисков с данными

Вы можете скопировать CD с данными в файл образа, который функционально эквивалентен файлу образа, созданному командой sysutils/mkisofs, и вы можете использовать его для копирования любого CD с данными. В приводимом здесь примере предполагается, что ваш привод CDROM называется acd0. Подставьте название вашего привода CDROM. Символ c должен быть добавлен в конце имени устройства для указания на то, что берётся весь раздел, а в случае CDROM, весь диск.

    # dd if=/dev/acd0c of=file.iso bs=2048

Теперь, когда вы имеете образ, вы можете записать его на CD так, как это описано выше.

12.5.7. Использование компакт-диски с данными

Теперь, после того, как вы создали стандартный CDROM с данными, вы, наверное, захотите смонтировать его и считать с него данные. По умолчанию mount(8) предполагает, что файловая система имеет тии ufs. Если вы попытаетесь выполнить что-то вроде:

    # mount /dev/cd0c /mnt

вы получите сообщение ``Incorrect super block'', и диск не смонтируется. CDROM не является файловой системой UFS, поэтому попытки смонтировать его таким образом будут терпеть неудачу. Вам просто нужно указать команде mount(8), что файловая система имеет тип ISO9660, и всё должно заработать. Сделайте это, задав параметр -t cd9660 при вызове mount(8). К примеру, если вы хотите смонтировать устройство CDROM, /dev/cd0c, в каталог /mnt, вы должны выполнить:

    # mount -t cd9660 /dev/cd0c /mnt

Заметьте, что имя вашего устройства (/dev/cd0c в этом примере) может быть другим, в зависимости от интерфейса, используемого в CDROM. Кроме того, параметр -t cd9660 всего лишь задаёт выполнение утилиты mount_cd9660(8). Пример выше может быть упрощён до:

    # mount_cd9660 /dev/cd0c /mnt

Таким способом, вообще говоря, вы можете использовать компакт-диски люого производителя. Диски с некоторыми расширениями ISO 9660 могут, однако, работать со странностями. К примеру диски Joliet хранят все имена файлов в виде последовательностей двухбайтовых символов Unicode. Ядро FreeBSD (пока ещё) не может работать с Unicode, поэтому не английские символы выводятся в виде знаков вопроса. (Если в работаете с FreeBSD 4.3 или более поздней версией, то в драйвере CD9660 имеется механизм для динамической загрузки соответствующей таблицы преобразования Unicode. Модули для некоторых распространённых кодировок могут быть получены из порта sysutils/cd9660_unicode.)

Время от времени вы можете получать сообщения ``Device not configured'' при попытке смонтировать CDROM. Это обычно означает, что привод CDROM полагает, что в нём нет диска, или что привод не виден на шине. Приводу CDROM может понадобиться несколько секунд, чтобы понять, что он был закрыт, так что будьте терпеливы.

Иногда SCSI CDROM может потеряться из-за того, что у него не было достаточно времени, чтобы ответить на сброс шины. Если у вас имеется SCSI CDROM, то, пожалуйста, добавьте следующий параметр в конфигурацию вашего ядра и перестройте его.

    options SCSI_DELAY=15000

Это укажет вашей шине SCSI выдерживать 15-секундную паузу во время загрузки, чтобы дать вашему приводу CDROM шанс ответить на сброс шины.

12.5.8. Запись необработанных данных на компакт-диски

Вы можете предпочесть запись файла непосредственно на CD без создания файловой системы ISO 9660. Некоторые поступают так при создании резервных копий. Это выполняется гораздо быстрее. чем запись стандартного компакт-диска:

    # burncd -f /dev/acd1c -s 12 data archive.tar.gz fixate

Для извлечения данных, записанных так на компакт-диск, вы должны считывать данные из файла непосредственного доступа к устройству:

    # tar xzvf /dev/acd1c

Вы не можете монтировать этот диск как обычный CDROM. Такой компакт-диск не может быть прочитан ни в какой другой операционной системе, кроме FreeBSD. Если вы хотите монтировать CD или обменяться данными с другой операционной системой, то вы должны использовать sysutils/mkisofs так, как это было описано выше.