Added modules and their dependencies to initrd.img
This commit is contained in:
parent
8fd23eca0b
commit
3325611694
@ -2,6 +2,9 @@
|
||||
|
||||
# create required directories
|
||||
makedir @initrd@/modules
|
||||
makedir @initrd@/firmware
|
||||
makedir @initrd@/lib/modules
|
||||
makedir @initrd@/lib/firmware
|
||||
makedir @initrd@/sbin
|
||||
makedir @initrd@/dev
|
||||
makedir @initrd@/etc
|
||||
|
@ -8,60 +8,6 @@ import logging
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
logger = logging.getLogger('pylorax')
|
||||
|
||||
|
||||
def genmodinfo(path, output):
|
||||
mods = {}
|
||||
for root, dirs, files in os.walk(path):
|
||||
for file in files:
|
||||
mods[file] = os.path.join(root, file)
|
||||
|
||||
modules = { 'scsi_hostadapter': ['block'], 'eth': ['networking'] }
|
||||
blacklist = ('floppy', 'scsi_mod', 'libiscsi')
|
||||
|
||||
list = {}
|
||||
for modtype in modules:
|
||||
list[modtype] = {}
|
||||
for file in modules[modtype]:
|
||||
try:
|
||||
filename = os.path.join(path, 'modules.%s' % file)
|
||||
f = open(filename, 'r')
|
||||
except IOError:
|
||||
logger.error('cannot open file %s', filename)
|
||||
continue
|
||||
else:
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
if line in mods:
|
||||
modname, ext = os.path.splitext(line)
|
||||
if modname in blacklist:
|
||||
logger.info('skipping %s', modname)
|
||||
continue
|
||||
|
||||
outtext = commands.getoutput('modinfo -F description %s' % mods[line])
|
||||
desc = outtext.split('\n')[0]
|
||||
desc = desc.strip()
|
||||
|
||||
# XXX why we need to do this?
|
||||
desc = desc[:65]
|
||||
|
||||
if not desc:
|
||||
desc = '%s driver' % modname
|
||||
modinfo = '%s\n\t%s\n\t"%s"\n' % (modname, modtype, desc)
|
||||
list[modtype][modname] = modinfo
|
||||
|
||||
f = open(output, 'a')
|
||||
f.write('Version 0\n')
|
||||
for type in list:
|
||||
modlist = list[type].keys()
|
||||
modlist.sort()
|
||||
for m in modlist:
|
||||
f.write('%s\n' %list[type][m])
|
||||
f.close()
|
||||
|
||||
|
||||
# XXX is the input a path to a file?
|
||||
def filtermoddeps(input):
|
||||
try:
|
||||
|
@ -5,6 +5,7 @@ import os
|
||||
import commands
|
||||
import re
|
||||
import datetime
|
||||
import fnmatch
|
||||
|
||||
import actions
|
||||
import actions.base
|
||||
@ -12,6 +13,7 @@ from config import Template
|
||||
|
||||
from utils.fileutils import cp, mv, rm, touch, edit, replace
|
||||
from utils.ldd import LDD
|
||||
from utils.genmodinfo import genmodinfo
|
||||
|
||||
|
||||
class InitRD(object):
|
||||
@ -81,6 +83,106 @@ class InitRD(object):
|
||||
for action in self.template.actions + self._actions:
|
||||
action.execute()
|
||||
|
||||
def getModules(self):
|
||||
modlist = os.path.join(self.conf.treedir, 'usr', 'lib', 'anaconda-runtime', 'modlist')
|
||||
modinfo = os.path.join(self.conf.tempdir, 'modinfo')
|
||||
genmodinfo(os.path.join(self.conf.treedir, 'lib', 'modules', self.conf.kernelver), modinfo)
|
||||
|
||||
modfiles = []
|
||||
modfiles.append(os.path.join(self.conf.confdir, 'modules', 'modules'))
|
||||
modfiles.append(os.path.join(self.conf.confdir, 'modules', self.conf.buildarch, 'modules'))
|
||||
|
||||
modules = set()
|
||||
for file in modfiles:
|
||||
if os.path.isfile(file):
|
||||
f = open(file, 'r')
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
line, sep, comment = line.partition('#')
|
||||
if line.startswith('-'):
|
||||
modules.discard(line[1:])
|
||||
elif line.startswith('='):
|
||||
cmd = '%s --modinfo-file %s %s' % (modlist, modinfo, line[1:])
|
||||
output = commands.getoutput(cmd)
|
||||
for module in output.splitlines():
|
||||
modules.add(module)
|
||||
else:
|
||||
modules.add(line)
|
||||
|
||||
# resolve deps
|
||||
depfile = os.path.join(self.conf.treedir, 'lib', 'modules', self.conf.kernelver, 'modules.dep')
|
||||
f = open(depfile, 'r')
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
changed = True
|
||||
while changed:
|
||||
for line in lines:
|
||||
changed = False
|
||||
line = line.strip()
|
||||
m = re.match(r'^.*/(?P<name>.*)\.ko:(?P<deps>.*)$', line)
|
||||
modname = m.group('name')
|
||||
if modname in modules:
|
||||
for dep in m.group('deps').split():
|
||||
m = re.match(r'^.*/(?P<name>.*)\.ko$', dep)
|
||||
if m.group('name') not in modules:
|
||||
changed = True
|
||||
print('Adding module dependency %s' % m.group('name'))
|
||||
modules.add(m.group('name'))
|
||||
|
||||
srcdir = os.path.join(self.conf.treedir, 'lib', 'modules')
|
||||
dstdir = os.path.join(self.conf.initrddir, 'lib', 'modules')
|
||||
cp(os.path.join(srcdir, '*'), dstdir)
|
||||
|
||||
for root, dirs, files in os.walk(dstdir):
|
||||
for file in files:
|
||||
name, ext = os.path.splitext(file)
|
||||
if ext == '.ko' and name not in modules:
|
||||
print('Removing %s module' % name)
|
||||
rm(os.path.join(root, file))
|
||||
|
||||
# copy firmware
|
||||
srcdir = os.path.join(self.conf.treedir, 'lib', 'firmware')
|
||||
dstdir = os.path.join(self.conf.initrddir, 'lib', 'firmware')
|
||||
|
||||
fw = ( ('ipw2100', 'ipw2100*'),
|
||||
('ipw2200', 'ipw2200*'),
|
||||
('iwl3945', 'iwlwifi-3945*'),
|
||||
('iwl4965', 'iwlwifi-4965*'),
|
||||
('atmel', 'atmel_*.bin'),
|
||||
('zd1211rw', 'zd1211'),
|
||||
('qla2xxx', 'ql*') )
|
||||
|
||||
for module, file in fw:
|
||||
if module in modules:
|
||||
print('Copying %s firmware' % module)
|
||||
cp(os.path.join(srcdir, file), dstdir)
|
||||
|
||||
# create modinfo
|
||||
dst = os.path.join(self.conf.initrddir, 'lib', 'modules', 'module-info')
|
||||
cmd = '%s --modinfo-file %s --ignore-missing --modinfo %s > %s' % \
|
||||
(modlist, modinfo, ' '.join(list(modules)), dst)
|
||||
commands.getoutput(cmd)
|
||||
|
||||
# compress modules
|
||||
cmd = 'find -H %s -type f -name *.ko -exec gzip -9 {} \\;' % \
|
||||
os.path.join(self.conf.initrddir, 'lib', 'modules')
|
||||
commands.getoutput(cmd)
|
||||
|
||||
# run depmod
|
||||
cmd = '/sbin/depmod -a -F %s -b %s %s' % \
|
||||
(os.path.join(self.conf.treedir, 'boot', 'System.map-%s' % self.conf.kernelver),
|
||||
self.conf.initrddir, self.conf.kernelver)
|
||||
commands.getoutput(cmd)
|
||||
|
||||
# remove leftovers
|
||||
rm(os.path.join(self.conf.initrddir, 'lib', 'modules', self.conf.kernelver, 'modules.*map'))
|
||||
rm(os.path.join(self.conf.initrddir, 'lib', 'modules', self.conf.kernelver, 'source'))
|
||||
rm(os.path.join(self.conf.initrddir, 'lib', 'modules', self.conf.kernelver, 'build'))
|
||||
|
||||
def create(self, dst):
|
||||
# create the productfile
|
||||
text = '%s\n' % self.conf.imageuuid
|
||||
@ -89,6 +191,9 @@ class InitRD(object):
|
||||
text = text + '%s\n' % self.conf.bugurl
|
||||
edit(os.path.join(self.conf.initrddir, '.buildstamp'), text)
|
||||
|
||||
# get modules
|
||||
self.getModules()
|
||||
|
||||
# create the initrd
|
||||
err, output = commands.getstatusoutput('find %s | cpio --quiet -c -o | gzip -9 > %s' %
|
||||
(self.conf.initrddir, dst))
|
||||
@ -142,7 +247,7 @@ class Images(object):
|
||||
|
||||
def installPackages(self):
|
||||
# required packages
|
||||
self.yum.addPackages(['anaconda', 'anaconda-runtime', 'kernel', 'syslinux'])
|
||||
self.yum.addPackages(['anaconda', 'anaconda-runtime', 'kernel', '*firmware*', 'syslinux'])
|
||||
|
||||
# optional packages from confdir
|
||||
packages_files = []
|
||||
@ -231,6 +336,15 @@ class Images(object):
|
||||
# copy the grub.conf
|
||||
cp(os.path.join(bootdiskdir, 'grub.conf'), self.isodir)
|
||||
|
||||
# copy the vmlinuz
|
||||
self.conf.addAttr('kernelver')
|
||||
for file in os.listdir(os.path.join(self.conf.treedir, 'boot')):
|
||||
if fnmatch.fnmatch(file, 'vmlinuz-*'):
|
||||
vmlinuz = os.path.join(self.conf.treedir, 'boot', file)
|
||||
m = re.match(r'.*vmlinuz-(?P<ver>.*)', vmlinuz)
|
||||
self.conf.set(kernelver=m.group('ver'))
|
||||
cp(vmlinuz, os.path.join(self.isodir, 'vmlinuz'))
|
||||
|
||||
# XXX do we want this here?
|
||||
# create the initrd.img
|
||||
print('Creating the initrd.img')
|
||||
@ -239,10 +353,6 @@ class Images(object):
|
||||
self.initrd.create(os.path.join(self.isodir, 'initrd.img'))
|
||||
#self.initrd.cleanUp()
|
||||
|
||||
# copy the vmlinuz
|
||||
vmlinuz = os.path.join(self.conf.treedir, 'boot', 'vmlinuz-*')
|
||||
cp(vmlinuz, os.path.join(self.isodir, 'vmlinuz'))
|
||||
|
||||
# copy the splash files
|
||||
vesasplash = os.path.join(anacondadir, 'syslinux-vesa-splash.jpg')
|
||||
if os.path.isfile(vesasplash):
|
||||
|
@ -33,14 +33,15 @@ def mv(src, dst, mode=None, verbose=False):
|
||||
return errors
|
||||
|
||||
def rm(target, verbose=False):
|
||||
if os.path.isdir(target):
|
||||
if verbose:
|
||||
print('removing directory "%s"' % target)
|
||||
shutil.rmtree(target, ignore_errors=True)
|
||||
else:
|
||||
if verbose:
|
||||
print('removing file "%s"' % target)
|
||||
os.unlink(target)
|
||||
for name in glob.iglob(target):
|
||||
if os.path.isdir(name):
|
||||
if verbose:
|
||||
print('removing directory "%s"' % name)
|
||||
shutil.rmtree(name, ignore_errors=True)
|
||||
else:
|
||||
if verbose:
|
||||
print('removing file "%s"' % name)
|
||||
os.unlink(name)
|
||||
|
||||
return True
|
||||
|
||||
|
60
src/pylorax/utils/genmodinfo.py
Normal file
60
src/pylorax/utils/genmodinfo.py
Normal file
@ -0,0 +1,60 @@
|
||||
import sys
|
||||
import os
|
||||
import commands
|
||||
|
||||
import logging
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
logger = logging.getLogger('pylorax')
|
||||
|
||||
|
||||
def genmodinfo(path, output):
|
||||
mods = {}
|
||||
for root, dirs, files in os.walk(path):
|
||||
for file in files:
|
||||
mods[file] = os.path.join(root, file)
|
||||
|
||||
modules = { 'scsi_hostadapter': ['block'], 'eth': ['networking'] }
|
||||
blacklist = ('floppy', 'scsi_mod', 'libiscsi')
|
||||
|
||||
list = {}
|
||||
for modtype in modules:
|
||||
list[modtype] = {}
|
||||
for file in modules[modtype]:
|
||||
try:
|
||||
filename = os.path.join(path, 'modules.%s' % file)
|
||||
f = open(filename, 'r')
|
||||
except IOError:
|
||||
logger.error('cannot open file %s', filename)
|
||||
continue
|
||||
else:
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
if line in mods:
|
||||
modname, ext = os.path.splitext(line)
|
||||
if modname in blacklist:
|
||||
logger.info('skipping %s', modname)
|
||||
continue
|
||||
|
||||
outtext = commands.getoutput('modinfo -F description %s' % mods[line])
|
||||
desc = outtext.split('\n')[0]
|
||||
desc = desc.strip()
|
||||
|
||||
# XXX why we need to do this?
|
||||
desc = desc[:65]
|
||||
|
||||
if not desc:
|
||||
desc = '%s driver' % modname
|
||||
modinfo = '%s\n\t%s\n\t"%s"\n' % (modname, modtype, desc)
|
||||
list[modtype][modname] = modinfo
|
||||
|
||||
f = open(output, 'a')
|
||||
f.write('Version 0\n')
|
||||
for type in list:
|
||||
modlist = list[type].keys()
|
||||
modlist.sort()
|
||||
for m in modlist:
|
||||
f.write('%s\n' %list[type][m])
|
||||
f.close()
|
Loading…
Reference in New Issue
Block a user