| 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'): | 
| self.initrd = file | 
| # prefer /boot/initrd-version before /boot/initrd | 
| if len(file) > len('/boot/initrd'): | 
|  |