diff options
author | damien <damien@mandriva.com> | 2000-11-28 16:56:52 +0000 |
---|---|---|
committer | damien <damien@mandriva.com> | 2000-11-28 16:56:52 +0000 |
commit | 0880c7ba8ce88e87fa600aeb367a8f88a3ae71e7 (patch) | |
tree | 33f7ac905998f9ad6d85090f777ee4c0d0c67032 /perl-install/raid.pm | |
parent | d5c526273db473a7d87a26000585900fc10dda7d (diff) | |
download | drakx-topic/unlabeled-1.1.1.tar drakx-topic/unlabeled-1.1.1.tar.gz drakx-topic/unlabeled-1.1.1.tar.bz2 drakx-topic/unlabeled-1.1.1.tar.xz drakx-topic/unlabeled-1.1.1.zip |
branch to build the firewall install.topic/unlabeled-1.1.1
Diffstat (limited to 'perl-install/raid.pm')
-rw-r--r-- | perl-install/raid.pm | 85 |
1 files changed, 66 insertions, 19 deletions
diff --git a/perl-install/raid.pm b/perl-install/raid.pm index 7cc2eb7d6..ddc2034ac 100644 --- a/perl-install/raid.pm +++ b/perl-install/raid.pm @@ -1,4 +1,4 @@ -package raid; +package raid; # $Id$ use diagnostics; use strict; @@ -7,8 +7,10 @@ use strict; #- misc imports #-###################################################################################### use common qw(:common :functional); +use partition_table qw(:types); use run_program; use devices; +use commands; use fs; sub nb($) { @@ -16,22 +18,20 @@ sub nb($) { first((ref $nb ? $nb->{device} : $nb) =~ /(\d+)/); } -sub is($) { - my ($part) = @_; - $part->{device} =~ /^md/; -} - sub new($$) { my ($raid, $part) = @_; my $nb = @$raid; $raid->[$nb] = { 'chunk-size' => "64k", type => 0x83, disks => [ $part ], device => "md$nb", notFormatted => 1 }; $part->{raid} = $nb; + delete $part->{mntpoint}; + $nb; } sub add($$$) { - my ($raid, $part, $nb) = @_; + my ($raid, $part, $nb) = @_; $nb = nb($nb); $raid->[$nb]{isMounted} and die _("Can't add a partition to _formatted_ RAID md%d", $nb); $part->{raid} = $nb; + delete $part->{mntpoint}; push @{$raid->[$nb]{disks}}, $part; } @@ -40,12 +40,23 @@ sub delete($$) { $nb = nb($nb); delete $_->{raid} foreach @{$raid->[$nb]{disks}}; - $raid->[$nb] = undef; + undef $raid->[$nb]; +} + +sub changeNb($$$) { + my ($raid, $oldnb, $newnb) = @_; + if ($oldnb != $newnb) { + ($raid->[$newnb], $raid->[$oldnb]) = ($raid->[$oldnb], undef); + $raid->[$newnb]{device} = "md$newnb"; + $_->{raid} = $newnb foreach @{$raid->[$newnb]{disks}}; + } + $newnb; } sub removeDisk($$) { my ($raid, $part) = @_; my $nb = nb($part->{raid}); + run_program::run("raidstop", devices::make($part->{device})); delete $part->{raid}; @{$raid->[$nb]{disks}} = grep { $_ != $part } @{$raid->[$nb]{disks}}; update($raid->[$nb]); @@ -63,23 +74,34 @@ sub updateSize($) { }; } +sub module($) { + my ($part) = @_; + my $mod = $part->{level}; + + $mod = 5 if $mod eq "4"; + $mod = "raid$mod" if $mod =~ /^\d+$/; + $mod; +} + sub updateIsFormatted($) { my ($part) = @_; $part->{isFormatted} = and_ map { $_->{isFormatted} } @{$part->{disks}}; $part->{notFormatted} = and_ map { $_->{notFormatted} } @{$part->{disks}}; } -sub update($) { - &updateSize; - &updateIsFormatted; +sub update { + foreach (@_) { + updateSize($_); + updateIsFormatted($_); + } } sub write($) { my ($raid, $file) = @_; local *F; local $\ = "\n"; + open F, ">$file" or die _("Can't write file $file"); foreach (grep {$_} @$raid) { - open F, ">$file" or die _("Can't write file $file"); print F <<"EOF"; raiddev /dev/$_->{device} raid-level $_->{level} @@ -87,26 +109,51 @@ chunk-size $_->{'chunk-size'} persistent-superblock 1 EOF print F "nr-raid-disks ", int @{$_->{disks}}; - map_index { - print F " device /dev/$_->{device}"; + map_index { + print F " device ", devices::make($_->{device}); print F " raid-disk $::i"; } @{$_->{disks}}; } } -sub make($$) { +sub make { my ($raid, $part) = @_; + isMDRAID($_) and make($raid, $_) foreach @{$part->{disks}}; my $dev = devices::make($part->{device}); + eval { commands::modprobe(module($part)) }; run_program::run("raidstop", $dev); &write($raid, "/etc/raidtab"); - run_program::run("mkraid", "--really-force", $dev); - run_program::run("raidstart", $dev); + run_program::run("mkraid", "--really-force", $dev) or die + $::isStandalone ? _("mkraid failed (maybe raidtools are missing?)") : _("mkraid failed"); } sub format_part($$) { my ($raid, $part) = @_; - make($raid->{raid}, $part) if is($part); - fs::format_part($part); + $part->{isFormatted} and return; + + make($raid->{raid}, $part); + fs::real_format_part($part); + $_->{isFormatted} = 1 foreach @{$part->{disks}}; +} + +sub verify($) { + my ($raid) = @_; + $raid && $raid->{raid} or return; + foreach (grep {$_} @{$raid->{raid}}) { + @{$_->{disks}} >= ($_->{level} =~ /4|5/ ? 3 : 2) or die _("Not enough partitions for RAID level %d\n", $_->{level}); + } } +sub prepare_prefixed($$) { + my ($raid, $prefix) = @_; + $raid && $raid->{raid} or return; + + eval { commands::cp("-f", "/etc/raidtab", "$prefix/etc/raidtab") }; + foreach (@{$raid->{raid}}) { + devices::make("$prefix/dev/$_->{device}") foreach @{$_->{disks}}; + } +} + +sub stopAll() { run_program::run("raidstop", devices::make("md$_")) foreach 0..7 } + 1; |