Вопрос или проблема
У меня есть файл .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. Приведенные ниже примеры показывают использование обоих подходов.
-
Скрипт на 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
и форматированных строк позволяет записать новые данные точно так, как это необходимо. -
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
используется для точной замены байт в нужной позиции. -
Использование
xorriso
:Если вы предпочитаете использовать сторонние утилиты,
xorriso
предлагается как инструмент для пересохранения ISO с новым Volume ID:xorriso -dev ./VBoxGuestAdditions.iso -volid 'YourLabel' -commit
Программа
xorriso
позволяет не только модифицировать объемный идентификатор, но и пересохраняет ISO, что может быть полезно для очистки и исправления ошибок в исходном файле.
Применение
Эти инструменты особенно актуальны, когда нужно внести изменения в множество файлов ISO или сделать изменения в файле, который должен оставаться неизменным за исключением метаинформации. Например, это может быть полезно при работе с виртуальными дисками, дистрибутивами ПО или резервными копиями системы.
С практической точки зрения, перед применением любого из скриптов важно сделать резервную копию ISO-файла. Модификация бинарного файла без восстановления может привести к необратимым изменениям, особенно если вы случайно перезаписали неверный диапазон байтов.
Кроме того, важно учитывать, что изменения Volume ID могут повлиять на совместимость некоторых систем с файлом ISO. Подобные изменения могут не отразиться на содержимом, но некоторые системы или приложения могут полагаться на конкретные Volume ID. Поэтому необходимо проводить тестирование измененного образа в вашем рабочем окружении для предотвращения сбоев.
Основное преимущество предложенных решений заключается в том, что они минимальны по воздействию, не занимают дополнительного пространства на диске и значительно ускоряют процесс, позволяя программистам и системным администраторам сосредоточиться на главных задачах.