summaryrefslogtreecommitdiffstats
path: root/initramfs
diff options
context:
space:
mode:
authorOliver Tappe2008-02-02 23:39:34 +0100
committerOliver Tappe2008-02-02 23:39:34 +0100
commit0076eb4a3f8979de8bc99a6befab280e5d78eb4a (patch)
tree4b9a857ea70fd25e69a82cbca9dfc764d2ac905d /initramfs
parent* added support for creating only the initramfs for the systems that (diff)
downloadcore-0076eb4a3f8979de8bc99a6befab280e5d78eb4a.tar.gz
core-0076eb4a3f8979de8bc99a6befab280e5d78eb4a.tar.xz
core-0076eb4a3f8979de8bc99a6befab280e5d78eb4a.zip
* fixed bugs that stopped new-style initramfs from working
* added support to new-style initramfs generator for integrating the active plugins into the initramfs With these fixes, I have been able to boot a cloned suse-10.2 into KDM with both bootsplash- and displaymanager-theme working. git-svn-id: http://svn.openslx.org/svn/openslx/trunk@1510 95ad53e4-c205-0410-b2fa-d234c58c8868
Diffstat (limited to 'initramfs')
-rw-r--r--initramfs/OpenSLX/MakeInitRamFS/Engine.pm94
1 files changed, 58 insertions, 36 deletions
diff --git a/initramfs/OpenSLX/MakeInitRamFS/Engine.pm b/initramfs/OpenSLX/MakeInitRamFS/Engine.pm
index 925fa382..dac0e273 100644
--- a/initramfs/OpenSLX/MakeInitRamFS/Engine.pm
+++ b/initramfs/OpenSLX/MakeInitRamFS/Engine.pm
@@ -19,9 +19,11 @@ use warnings;
use File::Basename;
use File::Find;
use File::Path;
+use POSIX qw(strftime);
use OpenSLX::Basics;
use OpenSLX::LibScanner;
+use OpenSLX::OSPlugin::Roster;
use OpenSLX::Utils;
# TODO: implement support for the following (either here or as plugin):
@@ -102,6 +104,7 @@ sub _collectCMDs
$self->_addRequiredFSModsAndTools();
$self->_writeInitramfsSetup();
+ $self->_writeSlxSystemConf();
$self->_copyDistroSpecificFiles();
$self->_copyInitramfsFiles();
@@ -124,9 +127,7 @@ sub _collectCMDs
$self->_copyDebugTools();
}
-# foreach my $plugin (@{$self->{'plugin-instances'}}) {
-# $plugin->specifyInitramfsAttrs($initramfsAttrs);
-# }
+ $self->_handlePlugins();
$self->{distro}->applyChanges($self);
@@ -148,7 +149,7 @@ sub _executeCMDs
spitFile($cmd->{file}, $cmd->{content}, $flags);
}
else {
- vlog(0, "executing: $cmd");
+ vlog(3, "executing: $cmd");
if (slxsystem($cmd)) {
die _tr(
"unable to execute shell-cmd\n\t%s", $cmd
@@ -160,7 +161,7 @@ sub _executeCMDs
return;
}
-sub _addCMD
+sub addCMD
{
my $self = shift;
my $cmd = shift;
@@ -175,12 +176,13 @@ sub _setupBuildPath
my $self = shift;
my $buildPath = "$openslxConfig{'temp-path'}/slx-initramfs";
- $self->_addCMD("rm -rf $buildPath");
+ $self->addCMD("rm -rf $buildPath");
my @stdFolders = qw(
bin
dev
etc
+ etc/init-hooks
etc/sysconfig
lib
mnt
@@ -193,10 +195,10 @@ sub _setupBuildPath
var/lib/nfs/state
var/run
);
- $self->_addCMD(
+ $self->addCMD(
'mkdir -p ' . join(' ', map { "$buildPath/$_"; } @stdFolders)
);
- $self->_addCMD("ln -sfn /bin $buildPath/sbin");
+ $self->addCMD("ln -sfn /bin $buildPath/sbin");
$self->{'build-path'} = $buildPath;
@@ -216,7 +218,7 @@ sub _copyDistroSpecificFiles
my $config = slurpFile("$distroSpecsPath/$distroName/config-default");
$config .= "\n";
$config .= slurpFile("$distroSpecsPath/$distroName/config-$distroVer");
- $self->_addCMD( {
+ $self->addCMD( {
file => "$self->{'build-path'}/etc/sysconfig/config",
content => $config,
} );
@@ -226,14 +228,14 @@ sub _copyDistroSpecificFiles
$functions .= "\n";
$functions
.= slurpFile("$distroSpecsPath/$distroName/functions-$distroVer");
- $self->_addCMD( {
+ $self->addCMD( {
file => "$self->{'build-path'}/etc/distro-functions",
content => $functions,
} );
my $defaultsPath = "$distroSpecsPath/$distroName/files-default";
if (-e $defaultsPath) {
- $self->_addCMD(
+ $self->addCMD(
"cp -a $defaultsPath $self->{'build-path'}/etc/sysconfig/files"
);
}
@@ -254,14 +256,14 @@ sub _copyInitramfsFiles
my $file = $File::Find::name;
my $relName = length($file) > $len ? substr($file, $len+1) : '';
if (-d) {
- $self->_addCMD("mkdir -p $self->{'build-path'}/$relName");
+ $self->addCMD("mkdir -p $self->{'build-path'}/$relName");
} elsif (-l $file) {
my $target = readlink $file;
- $self->_addCMD(
+ $self->addCMD(
"ln -sf $target $self->{'build-path'}/$relName"
);
} elsif (qx{file $file} =~ m{ELF}) {
- $self->_addCMD(
+ $self->addCMD(
"cp -p $file $self->{'build-path'}/$relName"
);
} else {
@@ -289,10 +291,10 @@ sub _copyInitramfsFiles
}
}eogms;
- # force sh shebang over to ash
- $text =~ s{^#!\s*/bin/sh}{#!/bin/ash};
+ # force shebang with ash
+ $text =~ s{\A#!\s*/bin/.+?$}{#!/bin/ash}ms;
- $self->_addCMD( {
+ $self->addCMD( {
file => "$self->{'build-path'}/$relName",
content => $text,
mode => (-x $file ? 0755 : undef),
@@ -324,12 +326,12 @@ sub _copyBusybox
udhcpc umount uptime usleep vconfig vi wget zcat zcip
);
foreach my $applet (@busyboxApplets) {
- $self->_addCMD("ln -sf /bin/busybox $self->{'build-path'}/bin/$applet");
+ $self->addCMD("ln -sf /bin/busybox $self->{'build-path'}/bin/$applet");
}
# fake the sh link in busybox environment
- my $shFake = '#!/bin/ash\n/bin/ash $@';
- $self->_addCMD( {
+ my $shFake = "#!/bin/ash\n/bin/ash \$\@";
+ $self->addCMD( {
file => "$self->{'build-path'}/bin/sh",
content => $shFake,
mode => 0755
@@ -364,7 +366,7 @@ sub _copyDebugTools
warn _tr('debug-tool "%s" is not available', $tool);
next;
}
- $self->_addCMD("cp -p $toolPath $self->{'build-path'}/bin");
+ $self->addCMD("cp -p $toolPath $self->{'build-path'}/bin");
$self->_addRequiredLibsFor($toolPath);
}
@@ -384,7 +386,7 @@ sub _copyDhcpClient
warn _tr('tool "dhclient" is not available, using "udhcpc" instead');
return;
}
- $self->_addCMD("cp -p $toolPath $self->{'build-path'}/bin");
+ $self->addCMD("cp -p $toolPath $self->{'build-path'}/bin");
$self->_addRequiredLibsFor($toolPath);
return;
@@ -414,7 +416,7 @@ sub _copyPlatformSpecificBinary
my $binary = $self->_platformSpecificFileFor($binaryPath);
- $self->_addCMD("cp -p $binary $self->{'build-path'}$targetPath");
+ $self->addCMD("cp -p $binary $self->{'build-path'}$targetPath");
$self->_addRequiredLibsFor($binary);
return;
@@ -429,7 +431,7 @@ sub _copyRequiredFSTools
if (!$toolPath) {
die _tr('filesystem-tool "$tool" is not available, giving up!');
}
- $self->_addCMD("cp -p $toolPath $self->{'build-path'}/bin");
+ $self->addCMD("cp -p $toolPath $self->{'build-path'}/bin");
$self->_addRequiredLibsFor($toolPath);
}
@@ -452,7 +454,7 @@ sub _copyRequiredLayeredFSTools
if (!$toolPath) {
die _tr('layered-fs-tool "$tool" is not available, giving up!');
}
- $self->_addCMD("cp -p $toolPath $self->{'build-path'}/bin");
+ $self->addCMD("cp -p $toolPath $self->{'build-path'}/bin");
$self->_addRequiredLibsFor($toolPath);
}
@@ -468,13 +470,13 @@ sub _copyRequiredLibs
my @libs64 = grep { $_ =~ m{/lib64/} } keys %{$self->{'required-libs'}};
my @libs32 = grep { $_ !~ m{/lib64/} } keys %{$self->{'required-libs'}};
if (@libs64) {
- $self->_addCMD("mkdir -p $self->{'build-path'}/lib64");
+ $self->addCMD("mkdir -p $self->{'build-path'}/lib64");
foreach my $lib (@libs64) {
- $self->_addCMD("cp -p $lib $self->{'build-path'}/lib64/");
+ $self->addCMD("cp -p $lib $self->{'build-path'}/lib64/");
}
}
foreach my $lib (@libs32) {
- $self->_addCMD("cp -p $lib $self->{'build-path'}/lib/");
+ $self->addCMD("cp -p $lib $self->{'build-path'}/lib/");
}
return;
@@ -525,8 +527,8 @@ sub _copyKernelModules
my $targetPath
= "$self->{'build-path'}/lib/modules/$self->{'kernel-version'}";
- $self->_addCMD("mkdir -p $targetPath");
- $self->_addCMD("cp -p $sourcePath/modules.* $targetPath/");
+ $self->addCMD("mkdir -p $targetPath");
+ $self->addCMD("cp -p $sourcePath/modules.* $targetPath/");
# TODO: find out what's the story behing the supposedly required
# modules 'af_packet', 'unix' and 'hid' (which seem to be
@@ -567,10 +569,10 @@ sub _copyKernelModules
# copy all the modules that we think are required
foreach my $moduleToBeCopied (sort keys %modulesToBeCopied) {
my $targetDir = "$self->{'build-path'}" . dirname($moduleToBeCopied);
- $self->_addCMD("mkdir -p $targetDir");
+ $self->addCMD("mkdir -p $targetDir");
my $source = "$self->{'root-path'}$moduleToBeCopied";
my $target = "$self->{'build-path'}$moduleToBeCopied";
- $self->_addCMD("cp -p --dereference $source $target");
+ $self->addCMD("cp -p --dereference $source $target");
}
return;
@@ -588,7 +590,7 @@ sub _copyPreAndPostinitFiles
) {
my $cfgPath = "$openslxConfig{'private-path'}/config/$cfg";
next if !-f $cfgPath;
- $self->_addCMD("cp -p $cfgPath $self->{'build-path'}/bin/");
+ $self->addCMD("cp -p $cfgPath $self->{'build-path'}/bin/");
}
return;
}
@@ -639,7 +641,7 @@ sub _writeInitramfsSetup
foreach my $attr (keys %$initramfsAttrs) {
$content .= qq[$attr="$initramfsAttrs->{$attr}"\n];
}
- $self->_addCMD( {
+ $self->addCMD( {
file => "$self->{'build-path'}/etc/initramfs-setup",
content => $content
} );
@@ -664,7 +666,7 @@ sub _writeSlxSystemConf
slxconf_system_name=$self->{'system-name'}
slxconf_slxver="$self->{'slx-version'}"
End-of-Here
- $self->_addCMD( {
+ $self->addCMD( {
file => "$self->{'build-path'}/etc/sysconfig/slxsystem.conf",
content => $slxConf
} );
@@ -672,12 +674,32 @@ sub _writeSlxSystemConf
return;
}
+sub _handlePlugins
+{
+ my $self = shift;
+
+ my $pluginSrcPath = "$openslxConfig{'base-path'}/lib/plugins";
+ my $buildPath = $self->{'build-path'};
+ foreach my $pluginName (@{$self->{'plugins'}}) {
+ if (-d "$pluginSrcPath/$pluginName/init-hooks") {
+ my $hookSrcPath = "$pluginSrcPath/$pluginName/init-hooks";
+ $self->addCMD("cp -r $hookSrcPath/* $buildPath/etc/init-hooks/");
+ }
+ my $plugin = OpenSLX::OSPlugin::Roster->getPlugin($pluginName);
+ next if !$plugin;
+ $plugin->copyRequiredFilesIntoInitramfs(
+ $self->{'build-path'}, $self->{attrs}, $self
+ );
+ }
+ return;
+}
+
sub _createInitRamFS
{
my $self = shift;
my $buildPath = $self->{'build-path'};
- $self->_addCMD(
+ $self->addCMD(
"cd $buildPath "
. "&& find . | cpio -H newc --create | gzip -9 >$self->{initramfs}"
);