Команда mkisofs

Команда mkisofs позволяет задействовать одноименную утилиту, предназначенную для создания файлов образов оптических дисков или ISO-файлов на основе файлов из указанных директорий. Данная утилита предназначена лишь для создания файлов образов дисков; она на позволяет записывать эти файлы на оптические диски. Она позволяет создавать файлы образов, соответствующие стандарту ISO9660 с расширениями Joliet и Rock Ridge.

Дело в том, что в соответствии со стандартом ISO9660 файловая система оптического накопителя должна содержать файлы с именами в формате 8.3 из латинских символов в верхнем регистре, цифр и символов подчеркивания (то есть, каждый из файлов должен явно идентифицироваться с помощью имени длиной не более 8 символов без пробелов, символа точки и расширения длиной не более трех символов; каждая из директорий — с помощью имени длиной не более 8 латинских символов без пробелов и точек) и иметь не более 8 уровней вложенности директорий. Исходя из этого, при создании файловой системы ISO9660 без расширений имена файлов будут урезаться до 8 символов, все символы точек кроме последнего будут заменяться на символы подчеркиваний, а в концы имен файлов будут добавляться номера версий файлов, отделенные с помощью символа точки с запятой. Эта проблема решается с помощью расширений, которые могут использоваться в любых сочетаниях. Расширение Joliet предложено компанией Microsoft, позволяет давать файлам имена длиной до 64 символов в кодировке UCS-2 и поддерживается всеми актуальными операционными системами. Расширение Rock Ridge предназначено для POSIX-совместимых операционных систем и позволяет давать файлам произвольные имена длиной до 255 символов, иметь произвольное количество уровней вложенности директорий, сохранять права доступа к файлам, идентификаторы их владельцев и групп владельцев, количество жестких ссылок и метки времени создания и последнего доступа, а также добавляет поддержку специальных типов файлов — разреженных файлов, символьных ссылок, файлов устройств, файлов сокетов и файлов именованных каналов. Данная информация сохраняется в специальных скрытых директориях, а само расширение поддерживается всеми актуальными операционными системами, в том числе, Linux.

По умолчанию утилита выводит данные в стандартный поток вывода, поэтому имя результирующего файла обычно явно указывается.

Базовый синтаксис команды выглядит следующим образом:

$ mkisofs [параметры] имя-директории-с-файлами

Команда может принимать множество параметров и имя директории с файлами для упаковки в ISO-файл. Актуальными для обычного пользователя параметрами являются параметр -o, позволяющий задать имя результирующего ISO-файла, параметр -J, позволяющий добавить расширение Joliet, параметр -R, позволяющий добавить расширение Rock Ridge, а также параметр -V, позволяющий задать метку тома.

Примеры использования

Создание ISO-файла

Перед созданием ISO-файла следует создать директорию с исходными файлами. В нашем случае эта директория будет иметь имя ISO и содержать следующие файлы изображений:

$ ls -al iso/
итого 3052
drwxrwxr-x  2 alex alex   4096 мар 30 22:18  .
drwx--x--x 39 alex alex   4096 мар 30 22:19  ..
-rw-rw-r--  1 alex alex 668474 сен 11  2016  beach.webp
-rw-rw-r--  1 alex alex  94532 сен 11  2016  childrens_park_day.webp
-rw-rw-r--  1 alex alex  75058 сен 11  2016  childrens_park_evening.webp
-rw-rw-r--  1 alex alex  69626 сен 11  2016  childrens_park_night.webp
-rw-rw-r--  1 alex alex 113740 сен 11  2016  'commercial building.webp'
-rw-rw-r--  1 alex alex 527966 сен 11  2016  'deep dark fantasy.webp'
-rw-rw-r--  1 alex alex  95250 сен 11  2016  generic_bg_park.webp
-rw-rw-r--  1 alex alex  52878 сен 11  2016  home_evening.webp
-rw-rw-r--  1 alex alex  80400 сен 11  2016  home_morning.webp
-rw-rw-r--  1 alex alex  45036 сен 11  2016  home_night.webp
-rw-rw-r--  1 alex alex 214270 сен 11  2016  lets_pretend_they_are_cherry_blossom.webp
-rw-rw-r--  1 alex alex 104706 сен 11  2016  lonely_building.webp
-rw-rw-r--  1 alex alex 103730 сен 11  2016  old_apartment_afternoon.webp
-rw-rw-r--  1 alex alex  30588 сен 11  2016  old_apartment_dawn.webp
-rw-rw-r--  1 alex alex  57768 сен 11  2016  old_apartment_evening.webp
-rw-rw-r--  1 alex alex  70978 сен 11  2016  old_apartment_morning.webp
-rw-rw-r--  1 alex alex  90430 сен 11  2016  old_apartment_noon.webp
-rw-rw-r--  1 alex alex 174706 сен 11  2016  pampublikong_kubeta.webp
-rw-rw-r--  1 alex alex 119338 сен 11  2016  park_afternoon.webp
-rw-rw-r--  1 alex alex  66286 сен 11  2016  park_day.webp
-rw-rw-r--  1 alex alex  95846 сен 11  2016  park_evening.webp
-rw-rw-r--  1 alex alex  92074 сен 11  2016  park_night0.webp
-rw-rw-r--  1 alex alex  23678 сен 11  2016  park_night.webp

Для создания ISO-файла достаточно использовать утилиту mkisofs, задав имя результирующего файла с помощью параметра -o:

$ mkisofs -o sample.iso iso/
I: -input-charset not specified, using utf-8 (detected in locale settings)
Using PARK_000.WEB;1 for /park_night0.webp (park_night.webp)
Using OLD_A000.WEB;1 for /old_apartment_noon.webp (old_apartment_morning.webp)
Using OLD_A001.WEB;1 for /old_apartment_morning.webp (old_apartment_evening.webp)
Using OLD_A002.WEB;1 for /old_apartment_evening.webp (old_apartment_dawn.webp)
Using OLD_A003.WEB;1 for /old_apartment_dawn.webp (old_apartment_afternoon.webp)
Using CHILD000.WEB;1 for /childrens_park_night.webp (childrens_park_evening.webp)
Using CHILD001.WEB;1 for /childrens_park_evening.webp (childrens_park_day.webp)
Total translation table size: 0
Total rockridge attributes bytes: 0
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
1682 extents written (3 MB)

Утилита выводит информацию об изменении имен файлов и параметрах созданного ISO-файла. Для проверки корректности создания файла следует смонтировать его:

$ mkdir isomount
# mount -o loop sample.iso isomount
mount: /home/alex/isomount: WARNING: source write-protected, mounted read-only.
$ ls -al isomount/
итого 3008
dr-xr-xr-x  1 root root   2048 мар 30 22:18 .
drwx--x--x 39 alex alex   4096 мар 30 22:19 ..
-r-xr-xr-x  1 root root 668474 сен 11  2016 beach.web
-r-xr-xr-x  1 root root  69626 сен 11  2016 child000.web
-r-xr-xr-x  1 root root  75058 сен 11  2016 child001.web
-r-xr-xr-x  1 root root  94532 сен 11  2016 children.web
-r-xr-xr-x  1 root root 113740 сен 11  2016 commerci.web
-r-xr-xr-x  1 root root 527966 сен 11  2016 deep_dar.web
-r-xr-xr-x  1 root root  95250 сен 11  2016 generic_.web
-r-xr-xr-x  1 root root  52878 сен 11  2016 home_eve.web
-r-xr-xr-x  1 root root  80400 сен 11  2016 home_mor.web
-r-xr-xr-x  1 root root  45036 сен 11  2016 home_nig.web
-r-xr-xr-x  1 root root 214270 сен 11  2016 lets_pre.web
-r-xr-xr-x  1 root root 104706 сен 11  2016 lonely_b.web
-r-xr-xr-x  1 root root  90430 сен 11  2016 old_a000.web
-r-xr-xr-x  1 root root  70978 сен 11  2016 old_a001.web
-r-xr-xr-x  1 root root  57768 сен 11  2016 old_a002.web
-r-xr-xr-x  1 root root  30588 сен 11  2016 old_a003.web
-r-xr-xr-x  1 root root 103730 сен 11  2016 old_apar.web
-r-xr-xr-x  1 root root 174706 сен 11  2016 pampubli.web
-r-xr-xr-x  1 root root  92074 сен 11  2016 park_000.web
-r-xr-xr-x  1 root root 119338 сен 11  2016 park_aft.web
-r-xr-xr-x  1 root root  66286 сен 11  2016 park_day.web
-r-xr-xr-x  1 root root  95846 сен 11  2016 park_eve.web
-r-xr-xr-x  1 root root  23678 сен 11  2016 park_nig.web

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

Для отмонтирования ISO-файла следует использовать команду umount:

# umount isomount

Теперь попробуем использовать расширения Joliet и Rock Ridge (они могут использоваться и по отдельности, но утилита выводит сообщение о том, что для достижения максимальной совместимости рекомендуется использовать их совместно):

$ mkisofs -J -R -o sample.iso iso/
I: -input-charset not specified, using utf-8 (detected in locale settings)
Using PARK_000.WEB;1 for /park_night0.webp (park_night.webp)
Using OLD_A000.WEB;1 for /old_apartment_noon.webp (old_apartment_morning.webp)
Using OLD_A001.WEB;1 for /old_apartment_morning.webp (old_apartment_evening.webp)
Using OLD_A002.WEB;1 for /old_apartment_evening.webp (old_apartment_dawn.webp)
Using OLD_A003.WEB;1 for /old_apartment_dawn.webp (old_apartment_afternoon.webp)
Using CHILD000.WEB;1 for /childrens_park_night.webp (childrens_park_evening.webp)
Using CHILD001.WEB;1 for /childrens_park_evening.webp (childrens_park_day.webp)
Total translation table size: 0
Total rockridge attributes bytes: 2316
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
1690 extents written (3 MB)
# mount -o loop sample.iso isomount
mount: /home/alex/isomount: WARNING: source write-protected, mounted read-only.
$ ls -al isomount/
итого 3010
drwxrwxr-x  2 alex alex   4096 мар 30 22:18  .
drwx--x--x 39 alex alex   4096 мар 30 22:19  ..
-rw-rw-r--  1 alex alex 668474 сен 11  2016  beach.webp
-rw-rw-r--  1 alex alex  94532 сен 11  2016  childrens_park_day.webp
-rw-rw-r--  1 alex alex  75058 сен 11  2016  childrens_park_evening.webp
-rw-rw-r--  1 alex alex  69626 сен 11  2016  childrens_park_night.webp
-rw-rw-r--  1 alex alex 113740 сен 11  2016 'commercial building.webp'
-rw-rw-r--  1 alex alex 527966 сен 11  2016 'deep dark fantasy.webp'
-rw-rw-r--  1 alex alex  95250 сен 11  2016  generic_bg_park.webp
-rw-rw-r--  1 alex alex  52878 сен 11  2016  home_evening.webp
-rw-rw-r--  1 alex alex  80400 сен 11  2016  home_morning.webp
-rw-rw-r--  1 alex alex  45036 сен 11  2016  home_night.webp
-rw-rw-r--  1 alex alex 214270 сен 11  2016  lets_pretend_they_are_cherry_blossom.webp
-rw-rw-r--  1 alex alex 104706 сен 11  2016  lonely_building.webp
-rw-rw-r--  1 alex alex 103730 сен 11  2016  old_apartment_afternoon.webp
-rw-rw-r--  1 alex alex  30588 сен 11  2016  old_apartment_dawn.webp
-rw-rw-r--  1 alex alex  57768 сен 11  2016  old_apartment_evening.webp
-rw-rw-r--  1 alex alex  70978 сен 11  2016  old_apartment_morning.webp
-rw-rw-r--  1 alex alex  90430 сен 11  2016  old_apartment_noon.webp
-rw-rw-r--  1 alex alex 174706 сен 11  2016  pampublikong_kubeta.webp
-rw-rw-r--  1 alex alex 119338 сен 11  2016  park_afternoon.webp
-rw-rw-r--  1 alex alex  66286 сен 11  2016  park_day.webp
-rw-rw-r--  1 alex alex  95846 сен 11  2016  park_evening.webp
-rw-rw-r--  1 alex alex  92074 сен 11  2016  park_night0.webp
-rw-rw-r--  1 alex alex  23678 сен 11  2016  park_night.webp

Очевидно, что помимо корректных имен файлов была сохранена информация о владельце и правах доступа.

Отмонтирование ISO-файла осуществляется аналогичным образом:

# umount isomount

Исходя из вышесказанного, следует использовать расширения при любых обстоятельствах, в том числе, при подготовке диска, который будет читаться на машинах с ОС Windows.