有没有办法从命令行更改 .iso 文件的卷 ID?

有没有办法从命令行更改 .iso 文件的卷 ID?

.iso在 Linux 下有一个文件,一直在尝试找到一种无需重新创建文件即可更改卷 ID 的方法.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

答案1

卷 ID 始终以 32 字节 ASCII 字符串的形式存储在偏移量 0x8028 处。请就地编辑它。

#!/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

答案2

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'
$ 

答案3

总结

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,但没有成功。最后我偶然发现我可以从 genisoimage 中取出损坏的 ISO 文件,通过 xorriso 运行它来清理它并传递参数以使其保持可启动状态。

此时,“isovolid.pl /dev/sdX# LABEL”命令按预期工作。

我本想将此作为评论发布,但 serverfault 不允许我这样做。耶!我可以对我的答案发表评论

更新 因此,在进一步研究之后,我认为我误判了一切。虽然这对我有用,但它之所以有效是因为它删除了 joliet 文件系统标签。但与 @Elrohir 不同,我的 joliet 标签位于位置 0x9028。我最初检查了这一点,但我认为我像个白痴一样 grep 了错误的大小写字母。因此,如果您做到了这一点,isovolid.pl 确实可以与 joliet 扩展一起使用,但您必须找到标签位置。

相关内容