* [d-kernel] Re: /sbin/installkernel vs DURING_INSTALL
2003-12-18 16:29 ` Sergey Vlasov
@ 2003-12-18 17:02 ` Alexey Tourbin
2003-12-18 18:10 ` Alexey I. Froloff
2003-12-18 20:30 ` Sergey Vlasov
0 siblings, 2 replies; 6+ messages in thread
From: Alexey Tourbin @ 2003-12-18 17:02 UTC (permalink / raw)
To: devel-kernel
[-- Attachment #1.1: Type: text/plain, Size: 1388 bytes --]
On Thu, Dec 18, 2003 at 07:29:39PM +0300, Sergey Vlasov wrote:
> On Thu, Dec 18, 2003 at 07:20:08PM +0300, Alexey Tourbin wrote:
> > Господа, сейчас имеется следующее:
> > [[ -n "$DURING_INSTALL" ]] && exit 0
> >
> > Мне кажется это неверным. В процессе установки имеется важная
> > информация об устанавливаемом ядре, а именно: %version. Поэтому после
> > окончания установки без дополнительной информации (heuristics) нормально
> > установить ядро нельзя.
>
> Зато в этот момент нет другой информации - о загрузчике и его настройках.
Хочется, чтобы %post скрипт ядра отрабатывал хотя бы на уровне
модификации конфигов /etc/lilo.conf и /boot/grub/menu.lst. Это есть
залог того, что %postun скрипт тоже отработает правильно. Иначе будут
угадывания и симлинки + проблемы "с первым ядром".
> > Вообще же кривость этого скрипта заставляет меня сомневаться в
> > необходимости того, чем этот скрипт занимается.
>
> :)
Большой и кривой.
Пока есть следующее представление: /usr/share/loader/{lilo,gurb} должны
изменять конфиги и не делать ничего больше. Это есть также некоторое
оправдание того, чтобы им быть написанным на перле.
Запуском /sbin/lilo и расставлением симлинков должен заниматься
/sbin/installkernel.
Предварительные версии /usr/share/loader/{lilo,gurb} я отдаю на
рассмотрение (в grub не доделаны параметры для kernel). Над
/sbin/installkernel надо медитировать.
[-- Attachment #1.2: lilo --]
[-- Type: text/plain, Size: 2421 bytes --]
#!/usr/bin/perl
# $Id: lilo,v 1.1.1.1 2003/11/26 19:11:38 at Exp $
#--------------------------------------------------------------------
# Copyright (C) 2000, 2001 by MandrakeSoft.
# Chmouel Boudjnah <chmouel@mandrakesoft.com>.
#
# Redistribution of this file is permitted under the terms of the GNU
# Public License (GPL)
#--------------------------------------------------------------------
# Copyright (C) 2003 by ALT Linux Team,
# Alexey Tourbin <at@altlinux.org>.
#--------------------------------------------------------------------
# description: Add/remove entry for lilo bootloader.
use strict;
use Getopt::Long qw(GetOptions);
GetOptions "n|nolaunch" => \my $nolaunch, "r|remove" => \my $remove, "m|memtest" => \my $memtest
and (my $version = shift) and (@ARGV == 0)
or die "usage: $0 [-n|--nolaunch] [-r|--remove] [-m|--memtest] version\n";
use bootloader_utils qw(getroot);
sub add_memtest {
local $_ = shift;
my $txt = "image=/boot/memtest-$version\n\tlabel=memtest86-$version";
/^image=\/boot\/memtest-\Q$version\E\b/m
or $_ .= $txt;
return $_;
}
sub remove_memtest {
local $_ = shift;
my @sections = split /^(?=image=)/m;
@sections = grep { !/^image=\/boot\/memtest-\Q$version\E\b/ } @sections;
return join "" => @sections;
}
sub kernel_label {
local $_ = shift;
s/\.//g;
s/mdk|alt//;
s/secure/sec/;
s/enterprise/ent/;
s/vanilla/vnl/;
return $_;
}
sub add_kernel {
local $_ = shift;
my $label = kernel_label($version);
my $root = getroot();
my $txt = "image=/boot/vmlinuz-$version\n\tlabel=$label\n\troot=$root\n\tread-only\n\toptional\n";
/^image=\/boot\/vmlinuz-\Q$version\E\b/
or $_ .= $txt;
return $_;
}
sub remove_kernel {
local $_ = shift;
my @sections = split /^(?=image=)/m;
@sections = grep { !/^image=\/boot\/vmlinuz-\Q$version\E\b/ } @sections;
return join "" => @sections;
}
{
# open lilo.conf for update
my $lilo_conf = $ENV{LILO_CONF} || "/etc/lilo.conf";
open my $fh, "+<", $lilo_conf
or die "Cannot open $lilo_conf\n";
local $/ = undef;
my $content = <$fh>;
# modify the content
if ($memtest && $remove) {
$content = remove_memtest($content);
} elsif ($memtest) {
$content = add_memtest($content);
} elsif ($remove) {
$content = remove_kernel($content);
} else {
$content = add_kernel($content);
}
# debug
print $content;
exit 0;
# do the update
seek $fh, 0, 0;
print $fh $content;
truncate $fh, tell $fh;
# autoclosed
}
[-- Attachment #1.3: grub --]
[-- Type: text/plain, Size: 2718 bytes --]
#!/usr/bin/perl
# $Id: grub,v 1.3 2003/12/04 12:33:15 at Exp $
#--------------------------------------------------------------------
# Copyright (C) 2000, 2001, 2002 by MandrakeSoft.
# Chmouel Boudjnah <chmouel@mandrakesoft.com>.
#
# Redistribution of this file is permitted under the terms of the GNU
# Public License (GPL)
#--------------------------------------------------------------------
# Copyright (C) 2003 by ALT Linux Team,
# Alexey Tourbin <at@altlinux.org>.
#--------------------------------------------------------------------
# description: Add/remove entry for grub bootloader.
use strict;
use bootloader_utils qw(mnt2dev getroot);
use Getopt::Long qw(GetOptions);
GetOptions "r|remove" => \my $remove, "m|memtest" => \my $memtest
and (my $version = shift) and (@ARGV == 0)
or die "usage: $0 [-r|--remove] [-m|--memtest] version\n";
sub dev2grub {
my $dev = shift;
my ($disk, $part) = $dev =~ /([^\d\s]+)(\d+)/
or return;
# Sample device.map entry:
# (hd0) /dev/hda
# Sample convertion:
# /dev/hda5 => (hd0,4)
$part--;
my $map = $ENV{GRUB_DEVICE_MAP} || "/boot/grub/device.map";
open my $fh, $map
or return;
my $grub_part;
while (<$fh>) {
if (/\((\w+d\d+)\)\s+\Q$disk\E$/) {
$grub_part = "($1,$part)";
last;
}
}
return $grub_part;
}
my $boot = mnt2dev("/boot") ? "" : "/boot";
my $grub_part = dev2grub(getroot());
die "Can't convert grub_partition\n" unless $grub_part;
sub add_memtest {
local $_ = shift;
/\/memtest-\Q$version\E\b/
or $_ .= <<EOF;
title memtest86-$version
kernel $grub_part$boot/memtest-$version.bin
EOF
return $_;
}
sub remove_memtest {
local $_ = shift;
my @sections = split /^(?=title\s)/m;
@sections = grep { !/\/memtest-\Q$version\E\b/ } @sections;
return join "" => @sections;
}
sub add_kernel {
local $_ = shift;
/\/vmlinuz-\Q$version\E\b/
or $_ .= <<EOF;
title $version
kernel $grub_part$boot/vmlinuz-$version
initrd $grub_part$boot/initrd-$version.img
EOF
return $_;
}
sub remove_kernel {
local $_ = shift;
my @sections = split /^(?=title\s)/m;
@sections = grep { !/\/vmlinuz-\Q$version\E\b/ } @sections;
return join "" => @sections;
}
{
# open menu.lst for update
my $menu_lst = $ENV{GRUB_MENU_LST} || "/boot/grub/menu.lst";
open my $fh, "+<", $menu_lst
or die "Cannot open $menu_lst\n";
local $/ = undef;
my $content = <$fh>;
# modify the content
if ($memtest && $remove) {
$content = remove_memtest($content);
} elsif ($memtest) {
$content = add_memtest($content);
} elsif ($remove) {
$content = remove_kernel($content);
} else {
$content = add_kernel($content);
}
# debug
print $content;
exit 0;
# do the update
seek $fh, 0, 0;
print $fh $content;
truncate $fh, tell $fh;
# autoclosed
}
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread