![在Linux中生成新的卷ID](https://linux22.com/image/528572/%E5%9C%A8Linux%E4%B8%AD%E7%94%9F%E6%88%90%E6%96%B0%E7%9A%84%E5%8D%B7ID.png)
抛开大多数细节/原因不谈,我遇到过一种情况,即我为了批量生产而克隆驱动器。其中一些驱动器安装在只需要一个磁盘的服务器上(在这种情况下这不是问题),但有些驱动器安装在将在 RAID1 中使用 2 个驱动器的服务器上。
在另一种情况下,我们正在构建一个工具来帮助管理员更换故障磁盘,方法是确保新磁盘足够大,然后复制 MBR 和分区表,然后将其添加到 RAID1。当这种情况发生时,LILO 会抱怨卷 ID 重复(这是有道理的)。
这就是我想要为添加到 RAID1 阵列的分区生成新卷 ID 的原因。使用 sfdisk 重写磁盘分区表是否有意义,或者是否有更直接的命令/技术来为现有卷创建新的卷 ID?
答案1
从磁盘读取 mbr,更改磁盘签名(mbr 中偏移量 440 的 4 个字节),然后将其写回磁盘。
dd if=/dev/sda of=mbr.dat bs=512 count=1
sigchange.pl # see script below
dd if=newmbr.dat of=/dev/sda bs=512 count=1
注意:我通过保存 mbr.dat 和 newmbr.dat 的 od -x 输出,然后对这两个文本文件运行 diff 来测试这一点,结果显示只有相关的 4 个字节发生了变化。
#!/usr/bin/perl
#sigchange.pl
open FILE,"<mbr.dat" or die $!;
binmode FILE, ":raw";
my ($data,$n);
if ( ( $n=read FILE,$data,512 ) !=512 ) {
print "Error - Only managed to read $n bytes from file";
exit 2;
}
close FILE;
my @mbr=unpack("c*", $data);
$mbr[440] = int(rand(255));
$mbr[441] = int(rand(255));
$mbr[442] = int(rand(255));
$mbr[443] = int(rand(255));
$data=pack("c*",@mbr);
open FILE,">newmbr.dat" or die $!;
binmode FILE;
print FILE $data;
close FILE;
exit 0;