On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru




Загрузка...




 

Linux и UDF

Любой владелец привода CD-ROM - это счастливый владелец, подтвердит любой, у кого этот привод ломался, и кто почувствовал всю прелесть существования в современном компьютерном мире без этого привода =) Но это может и сказать владелец пишущего CD устройства. Особенно, если он никогда не записывал диск под UNIX/Linux. Тому, кто работал с GUI в Windows, очень сложно привыкнуть к 'спартанской' обстановке в мире *NIX. Да и сама процедура записи на компакт-диск, пришедшая к нам из стародавних времен, больше походит на пляску шамана у костра. Ее главный недостаток (многими расценивается как достоинство) - неудобство создания записей и длительность их создания. Приход CD-RW (перезаписываемого компакт-диска), не ознаменовал ничего нового для пользователя в смысле удобства записи: по-прежнему приходилось создавать сессию, а до этого еще долго форматировать болванку. В минусе была и низкая скорость записи (Из-за длительного процесса форматирования).

Все начало меняться с приходом DVD. Для него была создана своя файловая система UDF (Universal Disk Format), учитывающая его большую емкость и скорость. Ведь стандарт iso9660 был создан еще в 1987 году, и совершенно не годился для нового носителя информации из-за ограничений на объем и размещение данных (точнее, он позволял это делать, но не так хорошо, как нужно :). Изначально UDF обеспечивала лишь непрерывность видеопотока и совместимость со старой файловой системой от ISO (т.н. Bridged UDF, в которой видеопотоки записывались в двух видах). В последующих версиях системы добавилась поддержка записи на CD-R и CD-RW диски. Именно с этой редакции UDF (v1.50), началась популяризация этой ФС среди пользователей. Появился реальный конкурент ZIP дискам и магнитооптике. Перечислю новые возможности, появившиеся в UDF 1.50:

  • низкая стоимость носителей и устройства записи (уже сейчас 4x CD-RW noname болванка стоит << 1$)
  • возможность перезаписи/удаления 'на лету'
  • удобство записи, сравнимое с пользованием дискеты или любого другого сменного носителя информации
  • более эффективное использование дискового пространства
  • более быстрый доступ к информации (по сравнению с iso9660)
  • надежность сохранности данных, как у обычных CD-R дисков
  • самое главное - возможность чтения таких дисков на обычном CD-ROM приводе (правда он должен быть выпущен не раньше 1998 года).

К сожалению, как и любая файловая система, UDF не лишена недостатков, самый главный из которых - довольно маленький обьем для записи (550-590Мб). Но, согласитесь, это не так уж и мало ;-)

Если после такого лирического отступления, вы все-таки захотели записывать/читать udf диски в OS Linux, то вам следует обратить внимание на следущее: нормально реализовано только чтение дисков, файловая система UDF официально входит в ядро, начиная с версии 2.3.7 и доступна для предыдущих версии как дополнительный модуль. Большинство дистрибутивов имеют поддержку UDF в ядрах 2.2. (это не касается 2.4, куда udf версии 0.9.x входит официально). util-linux 'свежих' версий также знают эту файловую систему. Если у вас нет этого модуля (udf.o), то его исходный код можно скачать с сайта http://linux-udf.sourceforge.net/ или www.csc.calpoly.edu/~bfennema/udf.html (это страница Ben'а Fennema, одного из разработчиков UDF для Linux) в виде архива, а затем собрать самостоятельно (см. Чтение и запись udf дисков под Linux). В текущей версии драйвера - 0.9.5, есть опция iocharset, наконец-то позволяющая видеть каталоги в кодировке, отличной от iso8859-1. Как уже говорилось выше, с помощью этого модуля можно успешно читать UDF диски, соответствующие стандарту UDF 2.01 или 1.50 - это DirectCD и InCD.

К сожалению, запись udf дисков 'на лету', пока находится в альфа состоянии, но все равно, оптимизм автора (Jens Axboe) патча для поддержки пакетной записи очень вдохновляет: уже сейчас можно свободно записывать на CD-RW, скоро планируется поддержка CD-R, полностью реализована запись на DVD-RAM, интегрированная в ядро 2.4 официально. И это при том, что версия еще 0.0.2o! Конечно, не все так безоблачно - еще не решен вопрос с записью больших файлов, не до конца отработан алгоритм восстановления после сбоя. Но как говорится, 'it sucks, but it works'. Патчи для поддержки пакетной записи под ядро 2.4.7 можно скачать с kernel.org или через SourceForge, но по результатам тестирования, работоспособны они только в ядре 2.4.6. В настоящее время, Jens немного 'запустил' свои разработки, т.к занят более важными делами в ветке 2.5 (он пообещал, что в 2.5 реализовать поддержку cd-r будет намного легче), поэтому если вам нужна поддержка udf под современными ядрами (2.4.7-2.5.3), то посмотрите на сайте, где силами Peter'а Osterlund'а осуществляется синхронизация с ветками 2.4 и 2.5. Т.к все это поставляется в виде патчей к ядру, для сборки вам понадобится и само ядро. Его можно скачать с ftp://ftp.kernel.org/pub/linux/kernel/v2.4 или любых общедоступных зеркал (Chg, например).

Я не советую использовать ядра из всевозможных дистрибутивов (RedHat, Mandrake или других) - во-первых, их состав и организация довольно сильно отличается от того, что доступно на kernel.org. Во-вторых, всевозможные добавления могут конфликтовать с патчами. В-третьих, вам просто не удасться правильно 'наложить' патч. Это относится и к версиям от Alan Cox и других kernel maintainers. Используйте только ядро от Linus'а Torvals'a, если вам не не нужна лишняя головная боль! Если вы не испугались, можете попробовать добавить поддержку packet-writing в ядро из своего любимого дистрибутива и написать мне о результатах 8-) На сегодняшний день официально packet-writing поддерживает только SuSe Linux, в остальных пока неизвестно. По-крайней мере, ядро 2.4.18-alt0.2.pre4-up из ALTLinux Sisyphus, пишет на cd-rw достаточно стабильно.

Уфф!! Я уже достаточно вас напугал 8-) Итак, начнем...

Чтение и запись udf дисков под Linux

Внимание! Модуль udf.o предназначен только для чтения udf CD-RW/CD-R дисков! Он не читает DVD-video диски. Если вы хотите читать именно такие диски, воспользуйтесь специализированными программами (например, с сайта go.to/doom9). Тем более, с помощью этого модуля вы не сможете смотреть DVD (лучше попробуйте xine - очень красивый, быстрый и бесплатный dvd/vcd проигрыватель или MPlayer - самый быстрый и 'всеядный' мультимедиа проигрыватель)

Внимание! Во время подготовки вашей системы Linux к чтению/записи udf, вам придется столкнуться с самостоятельными изменениями исходного кода ядра системы и пользоваться различными средствами разработки (gcc, patch, make etc). Если вы не знаете что это такое и не умеете этим пользоваться, то лучше и не пытайтесь ;-)

На сегодняшний день в ядрах почти всех дистрибутивов есть поддержка чтения udf дисков (пожалуйста, сообщите мне название дистрибутива, в котором нет поддержки udf, и я обязательно включу его в следующую версию этого документа). Мною были проверены:

- Blackcat 6.2/7.0b (kernel 2.2.16)
- Redhat 7.0/7.1
- Mandrake 7.2/8.0/8.1
- ALTLinux 2001 Spring
- ALTLinux Junior 1.0/1.1
- ALTLinux Sisyphus
- ASPLinux RC3/RCF/7.1

Как правило, если дистрибутив основан на ядре 2.2, то поддержка udf включена факультативно с помощью патча с сайта проекта linux-udf. Если в вашем дистрибутиве нет такой поддержки, то вы можете добавить ее самостоятельно:

1. Скачать с сайта проекта linux-udf все необходимые файлы (последние версии доступны на SourceForge). На сегодняшний день последняя версия - 0.9.5, которая регулярно синхронизируется с ядрами 2.4 и 2.5, так что для чтения udf, вам достаточно включить поддержку UDF в разделе Filesystems, и там же - возможность записи, если вы планируете запись на DVD-RAM. Если у вас ядро 2.2, то вам придется самостоятельно собрать модуль ядра (смотрите ниже).

2. Распакуйте файлы с linux-udf и зайдите в полученный каталог. Теперь можно набрать ./Configure; make udf.o; su; make install и если вы все правильно указали, модуль udf.o будет скомпилирован и установлен. В случае неудачи, проверьте корректность установки компилятора и/или необходимых средств для сборки (make, glibc headers, binutils). Проверить работоспособность собранного модуля просто - попробуйте смонтировать какой-нибудь UDF диск:

# Загружаем модуль
$ modprobe udf

# Монтируем CD-ROM с указанными параметрами
$ mount -t udf -o ro,iocharset=koi8-r /dev/cdrom /mnt/cdrom

Далее с таким диском можно обращаться и как с обычным CD-ROM'ом.

Подготовка к записи udf диска под Linux

1. Удостоверьтесь, что у вас есть исходный код ядра (и что оно скачано с официального сайта kernel.org), и что его версия 2.4.6 или выше.

2. Скачайте и распакуйте исходный код ядра.

# mkdir -p ~/linux/linux-2.4.7-pkt; cd ~/linux/linux-2.4.7-pkt
# gzip -d < linux-2.4.7.tar.gz | tar -xpf -

3. Установите патч к ядру:

# bunzip packet-0.0.2o-pre1.tar.bz2
# cd ~/linux/linux-2.4.6-pkt
# patch <packet-0.0.2o-pre1 -p0

4. Сконфигурируйте ядро

# make menuconfig

или make xconfig или просто make config, если у вас проснулась ностальгия ;-)

5. В меню конфигурации ядра, в секции Block devices выберите Packet writing on CD/DVD media (не забудьте включить поддержку записи UDF в секции Filesystems). Попробуйте еще задействовать Enable write caching, но это работает не для всех CD-RW приводов. Далее, в разделе Filesystems, включите поддержку udf, и возможность записи на udf.

6. Соберите и установите новое ядро, перезагрузите систему.

# su
# make dep install modules modules_install

7. Соберите cdrwtool, pktsetup и mkudffs (из udftools):

# cd ~/src/udftools
# ./configure
# make
# su
# make install prefix=

После того, как вы установили и собрали ядро с поддержкой пакетной записи, самое время подумать, как и чем записывать CD-RW диски =) К сожаление стандартные программы записи дисков под Linux (cdrecord и mkisofs) здесь бессильны - поддержка udf в них только планируется, так что приходится пользоваться средствами, которые предлагают разработчики проекта linux-udf. В пакете для этого предусмотрены 3 программы (сейчас они объединены в пакет udftools, который также можно скачать на сайте linux-udf):

  • pktsetup, служит для установки связи с packet device (т.е CD-RW приводом),
  • cdrwtool, нужна для начальной разметки/форматирования диска CD-RW.
  • mkudffs, служит для создания udf-образов (поддерживаются dvd, dvdram, cd-r и другие).

8. Берем чистый CD-RW и форматируем его (считая, что CD-RW - это sr0):

 # mknod /dev/sr0 b 11 0

 # cdrwtool -d /dev/sr0 -q

ниже приведен вывод программы (здесь и далее - данные из заметки Glenn'а Mullikin'а):

 using device /dev/scd0
 cdrom: This disc doesn't have any tracks I recognize!
 1536KB internal buffer
 setting write speed to 12x
 Settings for /dev/scd0:
 Fixed packets, size 32
 Mode-2 disc

 Initiating quick disc blank
 Disc capacity is 294048 blocks (588096KB/574MB)
 Formatting track
 Writing UDF structures to disc
 -14400 (EDT)/240
 Quick setup complete!

Если после быстрой очистки диска форматирование закончилось неудачно (получили сообщение вида ILLEGAL REQUEST), можете воспользоваться следующим патчем (автор Ben Fennema)

По-крайней мере, для 700Мб дисков Verbatim проблема была решена.

Текущая версия udftools обладает еще одним недостатком - диски, записанные под Linux, не читаются под M$ Windows, т.к по мнению программ чтения (типа DirectCD), имеют неправильный заголовок. Но и это решаемо :) Ben придумал еще один патч

Затем создавать диск следующей командой:

 # mkudffs -r0x0150 /dev/pktcdvd0 <# blocks>
где <blocks> - кол-во блоков на диске (обычно 294048)
или сразу при форматировании:
 # cdrwtool -d /dev/sr0 -q -r0x0150

9. Создаем /dev/pktcdvd0, если его не существует:

# mknod /dev/pktcdvd0 b 97 0

10. Устанавливаем ваш cd-rw рекордер:

 # pktsetup /dev/pktcdvd0 /dev/sr0

 pktcdvd: writer sr0 sucessfully registered

11. Теперь, можете смонтировать /dev/pktcdvd0 и копировать на него файлы!

# mount /dev/pktcdvd0 /mnt/cdrom -t udf -o rw,noatime

pktcdvd: inserted media is CD-RW
pktcdvd: Fixed packets, 32 blocks, Mode-2 disc
pktcdvd: speed (R/W) 12/8
pktcdvd: 588096kB available on disc
UDF-fs INFO UDF 0.9.4.1-rw (2001/06/13) Mounting volume '', timestamp
 2001/08/1 5 21:02 (1f10)

# mount

/dev/hda1 on / type ext2 (rw,errors=remount-ro,errors=remount-ro)
proc on /proc type proc (rw)
/dev/hdc1 on /mnt/hdc type reiserfs (rw)
/dev/hda3 on /usr type ext2 (rw)
/dev/pktcdvd0 on /mnt/udf type udf (rw,noatime)

Теперь вы готовы к записи!

Хочу сразу заметить, что ни я, как автор статьи, ни Jens Axboe, как автор драйвера пакетной записи, не несут ответственности за любой вред, причиненный вашей системе (сбой, потеря данный etc), приводу CD-RW или диску. Это только тестовая версия и готовьтесь к худшему!



Литература по Linux