From 64c33263f2f13793befe537fb15b2e995e534743 Mon Sep 17 00:00:00 2001 From: Guillaume Cottenceau Date: Wed, 24 Oct 2001 22:34:01 +0000 Subject: - add a GUI to the rescue - provide guessmounts with better efficiency and output, go to console, and reboot - provide install_bootloader which runs lilo from /mnt if it seems safe - add lsparts to rescue, which prints partitions with detected types --- rescue/Makefile | 2 +- rescue/guessmounts | 30 +++++++---- rescue/install_bootloader | 47 +++++++++++++++++ rescue/lsparts | 124 +++++++++++++++++++++++++++++++++++++++++++++ rescue/make_rescue_img | 4 ++ rescue/tree/etc/issue | 3 +- rescue/tree/etc/rc.sysinit | 9 +--- 7 files changed, 201 insertions(+), 18 deletions(-) create mode 100755 rescue/install_bootloader create mode 100755 rescue/lsparts (limited to 'rescue') diff --git a/rescue/Makefile b/rescue/Makefile index 59de38f3d..d236ac579 100644 --- a/rescue/Makefile +++ b/rescue/Makefile @@ -7,7 +7,7 @@ ROOTDEST = /export install: rescue_stage2.bz2 cp -f $< $(ROOTDEST)/Mandrake/base -rescue_stage2.bz2: kernel_read_part list list.$(ARCH) drvinst guessmounts make_rescue_img +rescue_stage2.bz2: kernel_read_part list list.$(ARCH) drvinst guessmounts lsparts make_rescue_img ./make_rescue_img clean: diff --git a/rescue/guessmounts b/rescue/guessmounts index e2c9f2c55..5adb33d92 100755 --- a/rescue/guessmounts +++ b/rescue/guessmounts @@ -1,5 +1,4 @@ #!/usr/bin/perl - # # Guillaume Cottenceau (gc@mandrakesoft.com) # @@ -15,9 +14,13 @@ sub cat_ { local *F; open F, $_[0] or $_[1] ? die "cat of file $_[0] failed: $!\n" : return; my @l = ; wantarray ? @l : join '', @l } +sub chomp_ { my @l = map { my $l = $_; chomp $l; $l } @_; wantarray ? @l : $l[0] } + + +my @mounts = cat_('/proc/mounts'); +grep { (split)[1] =~ m|^/mnt$| } @mounts and print("/mnt is already mounted (according to /proc/mounts)\n"), exit 0; -#- start system('drvinst'); #- class2text seems broken, I can't detect easily only modules for SCSI storage :-( print "\nPlease wait, trying to find your root device...\n"; @@ -38,8 +41,10 @@ M: foreach (@parts) { for my $fs ('ext3', 'ext2', 'reiserfs', 'xfs', 'jfs') { my $where = $target; if (!system("mount -t $fs $dev $where 2>/dev/null")) { - if (-f "$where/etc/fstab") { - print "Found a probable root partition on $dev (type $fs)\n"; + if (-r "$where/etc/fstab" && -r "$where/etc/mandrake-release") { + print "=> found a Mandrake root partition on $dev\n=> type $fs, version `", + chomp_(cat_ "$where/etc/mandrake-release"), + "'\n"; @fstab = cat_("$where/etc/fstab"); $root = $dev; last M; @@ -52,7 +57,7 @@ M: foreach (@parts) { } if ($root) { - print "\nMounting other partition from fstab on $target...\n"; + print "\nMounting other partitions from fstab on $target...\n"; foreach (@fstab) { my ($dev, $where, $type, $opts) = split; next if (!$type || $dev eq 'none' || $opts =~ /noauto/ || @@ -63,17 +68,24 @@ if ($root) { $opts = join(',', grep { !/codepage=/ && !/iocharset/ } split(',', $opts)); #- vfat opts, we don't have the modules in rescue $where = "$target$where"; -d $where || mkdir($where) or die "couldn't create $where\n"; - print "Mounting $dev on $where type $type\n"; + print "\t$dev on $where type $type\n"; system("mount -t $type $dev $where -o $opts"); } - print "Your partitions are mounted on $target.\n". - "For example you can use 'chroot $target' to simulate your system.\n". - "(you can reinstall lilo that way if necessary).\n\n"; + print "\nYour system is ready on $target.\n\n"; +} else { + die "Could not find your root device :-(.\n"; } + #------------------------------------------------- #- $Log$ +#- Revision 1.4 2001/10/24 22:34:01 gc +#- - add a GUI to the rescue +#- - provide guessmounts with better efficiency and output, go to console, and reboot +#- - provide install_bootloader which runs lilo from /mnt if it seems safe +#- - add lsparts to rescue, which prints partitions with detected types +#- #- Revision 1.3 2001/09/07 18:22:54 gc #- ext3, xfs, jfs #- diff --git a/rescue/install_bootloader b/rescue/install_bootloader new file mode 100755 index 000000000..8bbd6886c --- /dev/null +++ b/rescue/install_bootloader @@ -0,0 +1,47 @@ +#!/usr/bin/perl +# +# Guillaume Cottenceau (gc@mandrakesoft.com) +# +# Copyright 2001 MandrakeSoft +# +# 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. +# + + +sub cat_ { local *F; open F, $_[0] or $_[1] ? die "cat of file $_[0] failed: $!\n" : return; my @l = ; wantarray ? @l : join '', @l } +sub chomp_ { my @l = map { my $l = $_; chomp $l; $l } @_; wantarray ? @l : $l[0] } + +system('guessmounts') and die; + +#- this is dangerous, try to take care +my @mounts = cat_('/proc/mounts'); +grep { (split)[1] =~ m|^/mnt$| } @mounts or die "Your root device isn't mounted on /mnt (according to /proc/mounts)\n"; +-x '/mnt/sbin/lilo' or die "/mnt/sbin/lilo isn't executable, exiting.\n"; +-r '/mnt/etc/lilo.conf' or die "/mnt/etc/lilo.conf isn't readable, exiting.\n"; +cat_('/mnt/etc/mandrake-release') =~ /Mandrake/ or die "/mnt/etc/mandrake-release doesn't contain 'Mandrake', exiting.\n"; + +print "About to re-install Boot Loader of following Mandrake distro:\n\t", + chomp_(cat_ "/mnt/etc/mandrake-release"), + "\n=> ok? "; + =~ /^n/i and exit 0; + +exec '/mnt/sbin/lilo', '-r', '/mnt'; + +die "error: couldn't exec /mnt/sbin/lilo.\n"; + + +#------------------------------------------------- +#- $Log$ +#- Revision 1.1 2001/10/24 22:34:01 gc +#- - add a GUI to the rescue +#- - provide guessmounts with better efficiency and output, go to console, and reboot +#- - provide install_bootloader which runs lilo from /mnt if it seems safe +#- - add lsparts to rescue, which prints partitions with detected types +#- +#- +#- diff --git a/rescue/lsparts b/rescue/lsparts new file mode 100755 index 000000000..c73e1ad21 --- /dev/null +++ b/rescue/lsparts @@ -0,0 +1,124 @@ +#!/usr/bin/perl +# +# Main author Pascal Rigaux (pixel@mandrakesoft.com) +# Put together by Guillaume Cottenceau (gc@mandrakesoft.com) +# +# Copyright 1999,2000,2001 MandrakeSoft +# +# 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. +# +# +# This code is extracted from DrakX, the Mandrake Linux graphical installer. +# http://www.mandrakelinux.com/drakx/ +# Open development rulz, find CVS here: +# http://www.mandrakelinux.com/cgi-bin/cvsweb.cgi/gi/ +# +# Detects partition types using signatures +# + +sub cat_ { local *F; open F, $_[0] or $_[1] ? die "cat of file $_[0] failed: $!\n" : return; my @l = ; wantarray ? @l : join '', @l } + +sub arch() { + my $t = `uname -m`; + chomp $t; + $t; +} + +# from Perl Cookbook / Pleac +# http://pleac.sourceforge.net/pleac_perl/numbers.html#AEN121 +sub commify { + my $text = reverse $_[0]; + $text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g; + return scalar reverse $text; +} + +my @partitions_signatures = ( + [ 0x8e, 0, "HM\1\0" ], + [ 0x83, 0x438, "\x53\xEF" ], + [ 0x183, 0x10034, "ReIsErFs" ], + [ 0x183, 0x10034, "ReIsEr2Fs" ], + [ 0x283, 0, 'XFSB', 0x200, 'XAGF', 0x400, 'XAGI' ], + [ 0x383, 0x8000, 'JFS1' ], + [ 0x82, 4086, "SWAP-SPACE" ], + [ 0x82, 4086, "SWAPSPACE2" ], + [ 0x7, 0x1FE, "\x55\xAA", 0x3, "NTFS" ], + [ 0xc, 0x1FE, "\x55\xAA", 0x52, "FAT32" ], +arch() !~ /^sparc/ ? ( + [ 0x6, 0x1FE, "\x55\xAA", 0x36, "FAT" ], +) : (), +); + +sub typeFromMagic { + my $f = shift; + local *F; sysopen F, $f, 0 or return; + + my $tmp; + M: foreach (@partitions_signatures) { + my ($name, @l) = @$_; + while (@l) { + my ($offset, $signature) = splice(@l, 0, 2); + sysseek(F, $offset, 0) or next M; + sysread(F, $tmp, length $signature); + $tmp eq $signature or next M; + } + return $name; + } + return -1; +} + +my %type2name = ( + 0x1 => 'DOS 12-bit FAT', + 0x4 => 'DOS 16-bit FAT (up to 32M)', + 0x5 => 'DOS 3.3+ Extended Partition', + 0x6 => 'DOS FAT16', + 0x7 => 'NTFS (or HPFS)', + 0xb => 'Win98 FAT32', + 0xc => 'Win98 FAT32, LBA-mapped', + 0xe => 'Win95: DOS 16-bit FAT, LBA-mapped', + 0xf => 'Win95: Extended partition, LBA-mapped', + 0x82 => 'Linux Swap', + 0x83 => 'Ext2', + 0x183 => 'ReiserFS', + 0x283 => 'XFS', + 0x383 => 'JFS', + 0x85 => 'Linux extended partition', + 0x87 => 'NTFS volume set', + 0x8e => 'Linux LVM', + -1 => 'unknown' + ); + + +my $params = join '', @ARGV; + +$params =~ /-h/ and die "usage: lsparts [-v]\n"; +$params =~ /-v/ and $verbose = 1; + + +my (undef, undef, @parts) = cat_('/proc/partitions'); + +P: foreach (@parts) { + my (undef, undef, $blocks, $dev) = split or next; + my %skip_conditions = ( + "Skipping <$dev> because too little blocks ($blocks)" => ($blocks <= 1), + "Skipping <$dev> because doesn't end with a number (e.g. seems to not be a partition)" => ($dev !~ /\d$/), + ); + $skip_conditions{$_} and ($verbose and print(STDERR $_, "\n")), next P foreach keys %skip_conditions; + my $type = typeFromMagic("/dev/$dev"); + $type and printf "$dev: %6s Mbytes, type <0x%x> (%s)\n", commify($blocks >> 10), $type, $type2name{$type}; +} + + +#------------------------------------------------- +#- $Log$ +#- Revision 1.1 2001/10/24 22:34:01 gc +#- - add a GUI to the rescue +#- - provide guessmounts with better efficiency and output, go to console, and reboot +#- - provide install_bootloader which runs lilo from /mnt if it seems safe +#- - add lsparts to rescue, which prints partitions with detected types +#- +# diff --git a/rescue/make_rescue_img b/rescue/make_rescue_img index e3bb4e8ed..e6c744e53 100755 --- a/rescue/make_rescue_img +++ b/rescue/make_rescue_img @@ -86,6 +86,10 @@ _ "cp ../all.modules/$main/modules.dep $tmp/modules"; installown("drvinst", "/usr/bin"); installown("guessmounts", "/usr/bin"); +installown("install_bootloader", "/usr/bin"); +installown("lsparts", "/usr/bin"); +_ "cd ../mdk-stage1 && make rescue-gui"; +installown("../mdk-stage1/rescue-gui", "/usr/bin"); __ "strip $tmp/{lib,bin,sbin}/* $tmp/usr/{bin,sbin}/* 2>/dev/null"; diff --git a/rescue/tree/etc/issue b/rescue/tree/etc/issue index 55da5cd1e..a38b2f1a3 100644 --- a/rescue/tree/etc/issue +++ b/rescue/tree/etc/issue @@ -18,9 +18,10 @@         -Mandrake Linux release 8.1 (Cooker) +Mandrake Linux release 8.2 (Cooker) Use loadkeys to change your keyboard layout (eg: loadkeys fr) Use modprobe to load modules (eg: modprobe snd-card-fm801) Use drvinst to install drivers according to detected devices +Use lsparts to list your partitions with types diff --git a/rescue/tree/etc/rc.sysinit b/rescue/tree/etc/rc.sysinit index c33983cca..444e0c064 100755 --- a/rescue/tree/etc/rc.sysinit +++ b/rescue/tree/etc/rc.sysinit @@ -41,11 +41,6 @@ grep -q oem /proc/cmdline && exec /etc/oem -f /sbin/ifconfig lo 127.0.0.1 netmask 255.0.0.0 /sbin/route add 127.0.0.1 lo -if ! grep -q noguessmounts /proc/cmdline; then - echo "I will try now to guess your mountpoints;" - echo -e "If any problems, reboot and enter \\033[1;37mrescue noguessmounts\\033[0;39m to disable this." - echo "" - guessmounts - echo "Press to continue" - read +if ! grep -q expert /proc/cmdline; then + rescue-gui fi -- cgit v1.2.1