#!/usr/bin/perl # # Guillaume Cottenceau # # Copyright 2001-2005 Mandriva # # This software may be freely redistributed under the terms of the GNU # public license. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # use lib qw(/usr/lib/libDrakX); use common; use fs; use fs::proc_partitions; use fs::type; my @proc_mounts = fs::read_fstab('', '/proc/mounts'); my $target = '/mnt'; if (fs::get::mntpoint2part($target, \@proc_mounts)) { print STDERR "$target is already mounted (according to /proc/mounts)\n"; exit 0; } system('drvinst', 'STORAGE'); print STDERR "\nPlease wait, trying to find your root device...\n"; mkdir_p($target); my @parts = map { $_->{device} = delete $_->{dev}; put_in_hash($_, fs::type::type_subpart_from_magic($_)); } fs::proc_partitions::read_raw(); my ($raid_parts, $normal_parts) = partition { isRawRAID($_) } @parts; if (@$raid_parts) { require raid; raid::detect_during_install_once(@$raid_parts); my $raids = raid::get_existing(@$raid_parts); push @$normal_parts, @$raids; } my @fstab; my $root; foreach (@$normal_parts) { my $dev = devices::make($_->{device}); my $fs = find { system("mount -t $_ $dev $target 2>/dev/null") == 0; } fs::type::true_local_fs_types() or next; if (my $release_file = common::release_file($target)) { print STDERR "=> found a Mandriva Linux root partition on $dev\n=> type $fs, version `", chomp_(cat_("$target$release_file")), "'\n"; @fstab = fs::read_fstab($target, '/etc/fstab'); $root = $dev; last; } else { system('umount', $target) == 0 or die "error unmounting $target\n"; } } if ($root) { print STDERR "\nMounting other partitions from fstab on $target...\n"; foreach (@fstab) { my ($valued_options, $options) = fs::mount_options::unpack($_); next if !$_->{fs_type} || $_->{device} eq 'none' || $valued_options->{noauto} || $_->{mntpoint} eq '/' || member($_->{fs_type}, 'swap', 'nfs', 'ntfs', 'ntfs-3g'); delete $valued_options->{'iocharset='}; delete $valued_options->{'codepage='}; fs::mount_options::pack($_, $valued_options, $options); #- vfat opts, we don't have the modules in rescue my $where = "$target$_->{mntpoint}"; mkdir_p($where); print STDERR "\t$_->{device} on $where type $_->{fs_type} options $_->{options}\n"; system("mount -t $_->{fs_type} /dev/$_->{device} $where -o $_->{options}"); system("cp -f /etc/mtab $target/etc/mtab"); #- to allow a nice chrooted "mount" or "df" } print STDERR "\nYour system is ready on $target.\n\n"; } else { die "Could not find your root device :-(.\n"; }