Есть ли способ изменить идентификатор тома .iso файла с помощью командной строки?

Вопрос или проблема

У меня есть файл .iso в Linux, и я пытаюсь найти способ изменить идентификатор тома без необходимости создавать файл .iso заново. Большинство инструментов, таких как mkisofs, предоставляют возможность установки тома через переключатель (-V), например. Однако я не могу понять, как изменить его в уже существующем файле .iso.

Для ясности, я пытаюсь изменить эту строку Volume id:. Вот пример дампа команды isoinfo.

% isoinfo -d -i /usr/share/virtualbox/VBoxGuestAdditions.iso 
CD-ROM is in ISO 9660 format
System id: Win32
Volume id: VBOXADDITIONS_4.1.8_75467
Volume set id: 
Publisher id: 
Data preparer id: 
Application id: MKISOFS ISO 9660/HFS FILESYSTEM BUILDER & CDRECORD CD-R/DVD CREATOR (C) 1993 E.YOUNGDALE (C) 1997 J.PEARSON/J.SCHILLING
Copyright File id: 
Abstract File id: 
Bibliographic File id: 
Volume set size is: 1
Volume set sequence number is: 1
Logical block size is: 2048
Volume size is: 22203
Joliet with UCS level 3 found
Rock Ridge signatures version 1 found

Идентификатор тома всегда хранится на смещении 0x8028 как 32-байтовая строка ASCII. Отредактируйте её на месте.

#!/usr/bin/perl
use strict;
use warnings;

die "Use: $0 <iso_file> <new volume id>\n" unless @ARGV == 2;
open my $file, "+<", $ARGV[0] or die "Cannot open: $!";
seek $file, 0x8028,0;
printf $file "%-32.32s", uc($ARGV[1]);

Тест – (isovolid.pl – это имя приведенного выше скрипта):

$ genisoimage -V A123456798012345678901234567890X -o aaa.iso *
$ isoinfo -d -i aaa.iso | grep 'Volume id:'
Volume id: A123456798012345678901234567890X
$ ./isovolid.pl aaa.iso NEWVOLUMEID
$ isoinfo -d -i aaa.iso | grep 'Volume id:'
Volume id: NEWVOLUMEID

xorriso может это сделать:

$ xorriso -dev ./VBoxGuestAdditions.iso -volid 'YourLable' -commit
xorriso 1.4.6 : RockRidge filesystem manipulator, libburnia project.

xorriso : NOTE : Loading ISO image tree from LBA 0
xorriso : UPDATE : 32 nodes read in 1 seconds
Drive current: -dev './VBoxGuestAdditions.iso'
Media current: stdio file, overwriteable
Media status : is written , is appendable
Media summary: 1 session, 29111 data blocks, 56.9m data, 20.3g free
Volume id    : 'VBOXADDITIONS_5.1.34_121010'
xorriso : WARNING : -volid text does not comply to ISO 9660 / ECMA 119 rules
ISO image produced: 27 sectors
Written to medium : 192 sectors at LBA 29120
Writing to './VBoxGuestAdditions.iso' completed successfully.

xorriso : NOTE : Re-assessing -outdev './VBoxGuestAdditions.iso'
xorriso : NOTE : Loading ISO image tree from LBA 0
xorriso : UPDATE : 32 nodes read in 1 seconds
Drive current: -dev './VBoxGuestAdditions.iso'
Media current: stdio file, overwriteable
Media status : is written , is appendable
Media summary: 1 session, 29147 data blocks, 56.9m data, 20.3g free
Volume id    : 'YourLable'
$ 

TL;DR

xorriso -dev [isofile] -boot_image isolinux keep -boot_image grub keep -volid 'NEWVOL' -commit

У меня не было успеха, используя только скрипт, предоставленный @kupson, и команда от @illiterate сделала мой файл ISO не загружаемым. Я должен отметить, что записываю файл ISO в раздел, и метка раздела, сообщаемая blkid/lsblk, не изменяется (перезагрузка и partprobe не повлияли).

Однако команда isoinfo -d отмечает изменения. Я думаю, что главная причина моей проблемы может быть в том, что я всё еще вынужден использовать genisoimage, который по сути устарел. Похоже, он создает файлы ISO, которые не хотят менять метку, или, по крайней мере, так, как я его использую (RHEL8, до использования xorriso).

Я пробовал перейти непосредственно на xorriso, но ничего не вышло. В итоге я наткнулся на то, что могу взять испорченный файл ISO из genisoimage, пропустить его через xorriso, чтобы очистить и передать параметры для поддержания загрузочности.

На этом этапе команда “isovolid.pl /dev/sdX# LABEL” работала как ожидалось.

Я бы оставил это как комментарий, но serverfault не позволяет мне это сделать. ура! Я могу прокомментировать свой собственный ответ

Обновление
После более тщательного рассмотрения, я думаю, что неправильно диагностировал всё. Хотя это сработало для меня, это произошло потому, что удалялась метка файловой системы joliet. Но в отличие от @Elrohir, моя метка joliet была на позиции 0x9028. Я первоначально проверил это, но полагаю, что искал неверную букву, как дурак. Так что, если вы добрались до этого места, скрипт isovolid.pl действительно работает с расширениями joliet, но вы должны найти местоположение метки.

Как предложено @kupson, вы можете изменить 32 байта, начиная с позиции 32808 в файле. Он показал, как это сделать в perl, вы также можете использовать bash и dd:

isovolid()
{

  local iso newid oldid id offset=32808 length=32

    iso=${1?$'\e[10D'Укажите файл iso}
  newid=${2?$'\e[10D'Укажите новый идентификатор тома}
  oldid=$(dd if=$iso skip=$offset bs=1 count=$length 2>&-)

  : "${newid:0:$length}"
  printf %-${length}s "${_^^}" | dd of=$iso seek=$offset bs=1 conv=notrunc 2>&-

  id=$(dd if=$iso skip=$offset bs=1 count=$length 2>&-)
  printf "Старый [$oldid]\nНовый [$id]\n"

}

Тестирование:

$ isovolid memtest86.iso 'abcdefghijklmnopqrstuvwxyz  123456'
Старый [MT86PLUS_64                     ]
Новый [ABCDEFGHIJKLMNOPQRSTUVWXYZ  1234]

$ isoinfo -d -i memtest86.iso | grep Volume.id
Volume id: ABCDEFGHIJKLMNOPQRSTUVWXYZ  1234

.

Ответ или решение

Изменение идентификатора тома (Volume ID) в файле .iso без его пересоздания может стать полезной задачей в ряде профессиональных ИТ-сценариев. Однако традиционные инструменты для создания таких файлов, такие как mkisofs, обычно позволяют установить Volume ID только во время создания .iso, а не после. Но как нам изменить Volume ID в уже существующем файле .iso? Рассмотрим подходы, которые помогут добиться этой цели, используя возможности команды Linux.

Теория

Как правило, Volume ID — это текстовая метка, ассоциированная с ISO-файлом, которая часто используется для идентификации содержания носителя при его монтировании. Традиционно она задается при создании ISO-образа, но можно изменить Volume ID и в существующем файле, если знать его расположение и формат.

В ISO 9660 идентификатор тома сохранен в определенном месте, обычно на смещении 0x8028, как строка ASCII длиной 32 байта. Поэтому перезапись этой области файла позволяет изменить Volume ID без необходимости пересоздавать весь ISO-файл. Этот подход существенно сокращает время и ресурсы, затрачиваемые на редактирование ISO-образа, позволяя сосредоточиться на правках только необходимой части.

Пример

Давайте рассмотрим конкретные примеры, как это сделать. В качестве скриптовых инструментов можно использовать как Perl, так и bash вместе с dd. Приведенные ниже примеры показывают использование обоих подходов.

  1. Скрипт на Perl:

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    die "Use: $0 <iso_file> <new volume id>\n" unless @ARGV == 2;
    open my $file, "+<", $ARGV[0] or die "Cannot open: $!";
    seek $file, 0x8028, 0;
    printf $file "%-32.32s", uc($ARGV[1]);

    Этот скрипт принимает два аргумента: путь к ISO-файлу и новый Volume ID, который вы хотите установить. Использование команды seek и форматированных строк позволяет записать новые данные точно так, как это необходимо.

  2. Bash-скрипт с использованием dd:

    isovolid() {
      local iso newid oldid id offset=32808 length=32
      iso=${1?Specify the iso file}
      newid=${2?Specify the new volume id}
      oldid=$(dd if=$iso skip=$offset bs=1 count=$length 2>/dev/null)
      : "${newid:0:$length}"
      printf %-${length}s "${_^^}" | dd of=$iso seek=$offset bs=1 conv=notrunc 2>/dev/null
      id=$(dd if=$iso skip=$offset bs=1 count=$length 2>/dev/null)
      printf "Old [$oldid]\nNew [$id]\n"
    }

    В этом скрипте также модифицируется строго определенный диапазон байтов в ISO-файле, что и позволяет изменить Volume ID. dd используется для точной замены байт в нужной позиции.

  3. Использование xorriso:

    Если вы предпочитаете использовать сторонние утилиты, xorriso предлагается как инструмент для пересохранения ISO с новым Volume ID:

    xorriso -dev ./VBoxGuestAdditions.iso -volid 'YourLabel' -commit

    Программа xorriso позволяет не только модифицировать объемный идентификатор, но и пересохраняет ISO, что может быть полезно для очистки и исправления ошибок в исходном файле.

Применение

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

С практической точки зрения, перед применением любого из скриптов важно сделать резервную копию ISO-файла. Модификация бинарного файла без восстановления может привести к необратимым изменениям, особенно если вы случайно перезаписали неверный диапазон байтов.

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

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

Оцените материал
Добавить комментарий

Капча загружается...