|
|
|
@ -48,6 +48,7 @@ class DataVarsBuilder(DataVars):
|
|
|
|
|
|
|
|
|
|
class cl_kernel(color_print):
|
|
|
|
|
"""Primary class for kernel manipulation"""
|
|
|
|
|
kernelCurPath = '/usr/src/linux'
|
|
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
self.clVars = None
|
|
|
|
@ -74,12 +75,13 @@ class cl_kernel(color_print):
|
|
|
|
|
self.clVars.flIniFile()
|
|
|
|
|
|
|
|
|
|
def makeKernel(self,quiet=True,showMenuConfig=False,noClean=False,
|
|
|
|
|
lvmOpt=False,dmraidOpt=False,mdadmOpt=False):
|
|
|
|
|
lvmOpt=False,dmraidOpt=False,mdadmOpt=False,
|
|
|
|
|
mrproper=False):
|
|
|
|
|
"""Run kernel compilation"""
|
|
|
|
|
clVars = self.clVars
|
|
|
|
|
standardParams = [ "--splash=tty1", "--unionfs",
|
|
|
|
|
"--all-ramdisk-modules","--disklabel",
|
|
|
|
|
"--slowusb", "--no-save-config"]
|
|
|
|
|
standardParams = ["--splash=tty1", "--unionfs",
|
|
|
|
|
"--all-ramdisk-modules","--disklabel",
|
|
|
|
|
"--slowusb", "--no-save-config"]
|
|
|
|
|
kernelDir = ["--kerneldir=%s"%clVars.Get('cl_kernel_src_path')]
|
|
|
|
|
kernelDestination = clVars.Get('cl_kernel_install_path')
|
|
|
|
|
modulePrefix = ["--module-prefix=%s"%kernelDestination]
|
|
|
|
@ -103,15 +105,19 @@ class cl_kernel(color_print):
|
|
|
|
|
lvmOpt = ["--lvm"] if lvmOpt else []
|
|
|
|
|
dmraidOpt = ["--dmraid"] if dmraidOpt else []
|
|
|
|
|
mdadmOpt = ["--mdadm"] if mdadmOpt else []
|
|
|
|
|
mrproperOpt = ["--mrproper"] if mrproper else []
|
|
|
|
|
kernelName = ["--kernname=%s"%clVars.Get('os_linux_system')]
|
|
|
|
|
cachedir = ["--cachedir=%s"%clVars.Get('cl_kernel_cache_path')]
|
|
|
|
|
tempdir = ["--tempdir=%s"%clVars.Get('cl_kernel_temp_path')]
|
|
|
|
|
|
|
|
|
|
params = ["genkernel"]+standardParams+kernelDir+modulePrefix+\
|
|
|
|
|
params = ["genkernel"]+cachedir+tempdir+\
|
|
|
|
|
standardParams+kernelDir+modulePrefix+\
|
|
|
|
|
logLevel+makeOpts+menuConfig+noClean+kernelConfig+\
|
|
|
|
|
bootDir+lvmOpt+dmraidOpt+mdadmOpt+["all"]
|
|
|
|
|
bootDir+lvmOpt+dmraidOpt+mdadmOpt+mrproperOpt+["all"]
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
genkernelProcess = process(*params,stdout=None,stderr=STDOUT,
|
|
|
|
|
stdin=None)
|
|
|
|
|
stdin=None,envdict=os.environ)
|
|
|
|
|
return genkernelProcess.success()
|
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
|
self.printERROR("Keyboard interrupt")
|
|
|
|
@ -122,8 +128,7 @@ class cl_kernel(color_print):
|
|
|
|
|
clVars = self.clVars
|
|
|
|
|
bootDir = clVars.Get('cl_kernel_boot_path')
|
|
|
|
|
if not os.access(bootDir,os.W_OK):
|
|
|
|
|
self.printERROR("No permissions to write to '%s'"%
|
|
|
|
|
bootDir)
|
|
|
|
|
self.printERROR(_("No permissions to write to '%s'")% bootDir)
|
|
|
|
|
return False
|
|
|
|
|
march = clVars.Get('os_arch_machine')
|
|
|
|
|
if re.match("^i.86$",march):
|
|
|
|
@ -225,9 +230,9 @@ class cl_kernel(color_print):
|
|
|
|
|
newConfigName = path.join(bootDir,"config-%s"%newSuffixName)
|
|
|
|
|
|
|
|
|
|
kernelUid = clVars.Get('cl_kernel_uid')
|
|
|
|
|
symlinkInitrdName = path.join(bootDir,"initramfs-%s"%kernelUid)
|
|
|
|
|
symlinkInitrdName = path.join(bootDir,"initrd-%s"%kernelUid)
|
|
|
|
|
symlinkInitrdNameInstall = path.join(bootDir,
|
|
|
|
|
"initramfs-%s-install"%kernelUid)
|
|
|
|
|
"initrd-%s-install"%kernelUid)
|
|
|
|
|
symlinkKernelName = path.join(bootDir,"vmlinuz-%s"%kernelUid)
|
|
|
|
|
symlinkSystemMap = path.join(bootDir,"System.map-%s"%kernelUid)
|
|
|
|
|
try:
|
|
|
|
@ -237,18 +242,86 @@ class cl_kernel(color_print):
|
|
|
|
|
self._installFile(systemMap,newSystemMap)
|
|
|
|
|
self._installFile(configName,newConfigName)
|
|
|
|
|
|
|
|
|
|
self._installFile(newInitrdName,symlinkInitrdName, symlink=True)
|
|
|
|
|
self._installFile(newInitrdNameInstall,symlinkInitrdNameInstall,
|
|
|
|
|
symlink=True)
|
|
|
|
|
self._installFile(newKernelName,symlinkKernelName, symlink=True)
|
|
|
|
|
self._installFile(newSystemMap, symlinkSystemMap, symlink=True)
|
|
|
|
|
if not self.skipByChrootAndShortname():
|
|
|
|
|
self._installFile(newInitrdName,symlinkInitrdName, symlink=True)
|
|
|
|
|
self._installFile(newInitrdNameInstall,symlinkInitrdNameInstall,
|
|
|
|
|
symlink=True)
|
|
|
|
|
self._installFile(newKernelName,symlinkKernelName, symlink=True)
|
|
|
|
|
self._installFile(newSystemMap, symlinkSystemMap, symlink=True)
|
|
|
|
|
except (OSError,IOError),e:
|
|
|
|
|
self.printERROR(_("Can not install kernel files: %s")%e.strerror)
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def skipByChrootAndShortname(self):
|
|
|
|
|
"""Return true if run from chroot or system not Calculate"""
|
|
|
|
|
clVars = self.clVars
|
|
|
|
|
return clVars.Get('cl_chroot_status') == 'on' or \
|
|
|
|
|
clVars.Get('os_linux_shortname') in ('Gentoo','Linux')
|
|
|
|
|
|
|
|
|
|
def versionMigrate(self):
|
|
|
|
|
clVars = self.clVars
|
|
|
|
|
if self.skipByChrootAndShortname():
|
|
|
|
|
return True
|
|
|
|
|
calculate2env = clVars.Get('cl_env_path')[0]
|
|
|
|
|
if not path.exists(calculate2env) or \
|
|
|
|
|
not filter(lambda x:x.startswith('cl_kernel_uid'),
|
|
|
|
|
open(calculate2env,'r')):
|
|
|
|
|
return self.performVersionMigrate()
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def performVersionMigrate(self):
|
|
|
|
|
"""Generate cl_kernel_uid, write to calculate2.env, fix grub.conf"""
|
|
|
|
|
clVars = self.clVars
|
|
|
|
|
clKernelUid = clVars.Get('cl_kernel_uid')
|
|
|
|
|
clVars.Write('cl_kernel_uid',clKernelUid,force=True)
|
|
|
|
|
reChangeKernel = \
|
|
|
|
|
re.compile("(/boot/(?:vmlinuz))(?:-\S+?)?((?:-install)?) ")
|
|
|
|
|
reChangeInitrd = \
|
|
|
|
|
re.compile("(/boot/)(?:initrd|initramfs)(?:-\S+?)?((?:-install)?)$")
|
|
|
|
|
grubconf = '/boot/grub/grub.conf'
|
|
|
|
|
rootdev = clVars.Get('os_root_dev')
|
|
|
|
|
def grubreduce(x,y):
|
|
|
|
|
if y.startswith('title'):
|
|
|
|
|
x[0] = False
|
|
|
|
|
elif y.startswith('kernel') and "root=%s"%rootdev in y:
|
|
|
|
|
x[0] = True
|
|
|
|
|
if x[0]:
|
|
|
|
|
y = reChangeKernel.sub("\\1-%s\\2 "%clKernelUid,y)
|
|
|
|
|
y = reChangeInitrd.sub("\\1initrd-%s\\2"%clKernelUid,y)
|
|
|
|
|
return [x[0],x[1] + [y]]
|
|
|
|
|
|
|
|
|
|
if not os.access(grubconf,os.W_OK):
|
|
|
|
|
self.printERROR(_("No permissions to write to '%s'")%grubconf)
|
|
|
|
|
return False
|
|
|
|
|
newGrub = reduce(grubreduce,open(grubconf,'r'),[False,[]])[1]
|
|
|
|
|
open(grubconf,'w').writelines(newGrub)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def setKernelForCurrent(self):
|
|
|
|
|
"""Set compiled kernel to current"""
|
|
|
|
|
clVars = self.clVars
|
|
|
|
|
if self.skipByChrootAndShortname():
|
|
|
|
|
return True
|
|
|
|
|
# compiling kernel not current.
|
|
|
|
|
clKernelPath = clVars.Get('cl_kernel_src_path')
|
|
|
|
|
if not clKernelPath in (self.kernelCurPath,
|
|
|
|
|
path.realpath(self.kernelCurPath)) and \
|
|
|
|
|
path.islink(self.kernelCurPath):
|
|
|
|
|
os.unlink(self.kernelCurPath)
|
|
|
|
|
kernelName = path.basename(path.normpath(clKernelPath))
|
|
|
|
|
try:
|
|
|
|
|
os.symlink(kernelName,self.kernelCurPath)
|
|
|
|
|
except (IOError,OSError),e:
|
|
|
|
|
self.printERROR(str(e))
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def cleanInitrd(self):
|
|
|
|
|
"""Discard from initrd non-critical modules"""
|
|
|
|
|
clVars = self.clVars
|
|
|
|
|
if self.skipByChrootAndShortname():
|
|
|
|
|
return True
|
|
|
|
|
bootDir = clVars.Get('cl_kernel_boot_path')
|
|
|
|
|
clKernelUid = clVars.Get('cl_kernel_uid')
|
|
|
|
|
initrdName = path.join(bootDir,"initramfs-%s-install"%clKernelUid)
|
|
|
|
|