Index: client/bin/kernel.py |
diff --git a/client/bin/kernel.py b/client/bin/kernel.py |
index da91389b640c20df4a1b162fbcfe1876c13c0595..f3f5a38c540c3f6741e0d4489f7143c56c451947 100644 |
--- a/client/bin/kernel.py |
+++ b/client/bin/kernel.py |
@@ -59,9 +59,17 @@ def _add_kernel_to_bootloader(bootloader, base_args, tag, args, image, initrd): |
else: |
arglist.append(arg) |
- # add the kernel entry |
- bootloader.add_kernel(image, tag, initrd=initrd, args=' '.join(arglist), |
- root=root) |
+ # Add the kernel entry. it will keep all arguments from the default entry. |
+ # args='_dummy_' is used to workaround a boottool limitation of not being |
+ # able to add arguments to a kernel that does not already have any of its |
+ # own by way of its own append= section below the image= line in lilo.conf. |
+ bootloader.add_kernel(image, tag, initrd=initrd, root=root, args='_dummy_') |
+ # Now, for each argument in arglist, try to add it to the kernel that was |
+ # just added. In each step, if the arg already existed on the args string, |
+ # that particular arg will be skipped |
+ for a in arglist: |
+ bootloader.add_args(kernel=tag, args=a) |
+ bootloader.remove_args(kernel=tag, args='_dummy_') |
class BootableKernel(object): |
@@ -83,7 +91,6 @@ class BootableKernel(object): |
@param subdir: job-step qualifier in status log |
@param notes: additional comment in status log |
""" |
- |
# If we can check the kernel identity do so. |
if ident_check: |
when = int(time.time()) |
@@ -94,11 +101,7 @@ class BootableKernel(object): |
self.job.next_step_prepend(["job.end_reboot", subdir, |
expected_ident, notes]) |
- # Point bootloader to the selected tag. |
- _add_kernel_to_bootloader(self.job.bootloader, |
- self.job.config_get('boot.default_args'), |
- self.installed_as, args, self.image, |
- self.initrd) |
+ self.add_to_bootloader(args) |
# defer fsck for next reboot, to avoid reboots back to default kernel |
utils.system('touch /fastboot') # this file is removed automatically |
@@ -108,6 +111,14 @@ class BootableKernel(object): |
self.job.reboot(tag=self.installed_as) |
+ def add_to_bootloader(self, args=''): |
+ # Point bootloader to the selected tag. |
+ _add_kernel_to_bootloader(self.job.bootloader, |
+ self.job.config_get('boot.default_args'), |
+ self.installed_as, args, self.image, |
+ self.initrd) |
+ |
+ |
class kernel(BootableKernel): |
""" Class for compiling kernels. |
@@ -307,6 +318,8 @@ class kernel(BootableKernel): |
# if base_tree is a dir, assume uncompressed kernel |
if os.path.isdir(base_tree): |
print 'Symlinking existing kernel source' |
+ if os.path.islink(self.build_dir): |
+ os.remove(self.build_dir) |
os.symlink(base_tree, self.build_dir) |
# otherwise, extract tarball |
@@ -372,7 +385,7 @@ class kernel(BootableKernel): |
os.chdir(self.build_dir) |
self.set_cross_cc() |
- self.clean(logged=False) |
+ self.clean() |
build_string = "/usr/bin/time -o %s make %s -j %s vmlinux" \ |
% (timefile, make_opts, threads) |
build_string += ' > %s 2>&1' % output |
@@ -420,8 +433,28 @@ class kernel(BootableKernel): |
if not args: |
args = '' |
+ # It is important to match the version with a real directory inside |
+ # /lib/modules |
+ real_version_list = glob.glob('/lib/modules/%s*' % version) |
+ rl = len(real_version_list) |
+ if rl == 0: |
+ logging.error("No directory %s found under /lib/modules. Initramfs" |
+ "creation will most likely fail and your new kernel" |
+ "will fail to build", version) |
+ else: |
+ if rl > 1: |
+ logging.warning("Found more than one possible match for " |
+ "kernel version %s under /lib/modules", version) |
+ version = os.path.basename(real_version_list[0]) |
+ |
if vendor in ['Red Hat', 'Fedora Core']: |
- utils.system('mkinitrd %s %s %s' % (args, initrd, version)) |
+ try: |
+ cmd = os_dep.command('dracut') |
+ full_cmd = '%s -f %s %s' % (cmd, initrd, version) |
+ except ValueError: |
+ cmd = os_dep.command('mkinitrd') |
+ full_cmd = '%s %s %s %s' % (cmd, args, initrd, version) |
+ utils.system(full_cmd) |
elif vendor in ['SUSE']: |
utils.system('mkinitrd %s -k %s -i %s -M %s' % |
(args, image, initrd, system_map)) |
@@ -719,7 +752,7 @@ class rpm_kernel(BootableKernel): |
# search for initrd |
for file in files: |
- if file.startswith('/boot/initrd'): |
+ if file.startswith('/boot/init'): |
truty
2010/11/15 19:32:09
I don't know enough but this looks unnecessary.
|
self.initrd = file |
# prefer /boot/initrd-version before /boot/initrd |
if len(file) > len('/boot/initrd'): |