Назад | Перейти на главную страницу

Создать новый идентификатор тома в Linux

Избегая большинства деталей / причин, у меня есть ситуация, когда я клонирую диски для массового производства. Некоторые из них устанавливаются на серверах, которым нужен только один диск (в этом случае это не проблема), но некоторые устанавливаются на серверах, которые будут использовать 2 из них в RAID1.

В другом случае мы создаем инструмент, который поможет администратору заменить неисправный диск, убедившись, что новый диск достаточно большого размера, а затем скопируем MBR и таблицу разделов, а затем добавим их в RAID1. Когда это происходит, LILO жалуется на повторяющиеся идентификаторы томов (что имеет смысл).

Вот почему я хотел бы сгенерировать новые идентификаторы томов для раздела, добавляемого в массив RAID1. Имеет ли смысл использовать sfdisk для перезаписи таблицы разделов дисков, или есть более простая команда / метод для создания нового идентификатора тома для существующего тома?

Прочтите mbr с диска, измените подпись диска, которая представляет собой 4 байта @ смещение 440 в mbr, затем запишите его обратно на диск.

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

Примечание: я проверил это, сохранив вывод od -x для mbr.dat и newmbr.dat, а затем выполнив сравнение двух текстовых файлов, которое показывает, что изменяются только соответствующие 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;