Add removekmod template command (#1230356)

removekmod GLOB [GLOB...] --allbut KEEPGLOB [KEEPGLOB...]

This can be used to remove kernel modules from under
/lib/modules/*/kernel/ while keeping specific items. This should be
easier than constructing find arguments to select the right things to
save.

(cherry picked from commit 11c9e0e8ee)

Resolves: rhbz#1230356
This commit is contained in:
Brian C. Lane 2015-03-04 11:33:40 -08:00
parent b79ad68a50
commit a37a59b3eb
2 changed files with 69 additions and 28 deletions

View File

@ -74,36 +74,21 @@ remove /var/lib/rpm/* /var/lib/yum
remove /usr/share/icons/*/icon-theme.cache remove /usr/share/icons/*/icon-theme.cache
## clean up kernel modules ## clean up kernel modules
<% removekmod sound drivers/media drivers/hwmon drivers/video \
removekmods = """ net/atm net/bluetooth net/sched net/sctp \
sound drivers/media drivers/hwmon drivers/video net/rds net/l2tp net/decnet net/netfilter net/ipv4 net/ipv6 \
net/atm net/bluetooth net/sched net/sctp drivers/watchdog drivers/target drivers/rtc drivers/input/joystick \
net/rds net/l2tp net/decnet net/netfilter net/ipv4 net/ipv6 drivers/bluetooth drivers/hid drivers/edac \
drivers/watchdog drivers/target drivers/rtc drivers/input/joystick drivers/usb/serial drivers/usb/host drivers/usb/misc \
drivers/bluetooth drivers/hid drivers/edac fs/ocfs2 fs/ceph fs/nfsd fs/ubifs fs/nilfs2 \
drivers/usb/serial drivers/usb/host drivers/usb/misc arch/x86/kvm
fs/ocfs2 fs/ceph fs/nfsd fs/ubifs fs/nilfs2
arch/x86/kvm
"""
%>
%for kmodpath in removekmods.split():
remove lib/modules/*/kernel/${kmodpath}
%endfor
remove lib/modules/*/{build,source,*.map}
## Need to keep virtio_console.ko and ipmi stuff in drivers/char ## Need to keep virtio_console.ko and ipmi stuff in drivers/char
## Also keep virtio-rng so that the installer can get sufficient randomness for ## Also keep virtio-rng so that the installer can get sufficient randomness for
## LUKS setup. ## LUKS setup.
runcmd chroot ${root} find /lib/modules \ removekmod drivers/char --allbut virtio_console hw_random \
-regex ".*/kernel/drivers/char/.*" \ virtio-rng ipmi
\! -name virtio_console.ko\* \ removekmod drivers/staging --allbut zram
\! -name hw_random \ remove lib/modules/*/{build,source,*.map}
\! -name virtio-rng.ko\* \
\! -name ipmi\* \
-delete
runcmd chroot ${root} find /lib/modules \
-regex ".*/kernel/drivers/staging/.*" \
\! -name zram\* \
-delete
## NOTE: depmod gets re-run after cleanup finishes ## NOTE: depmod gets re-run after cleanup finishes
## remove unused themes, theme engines, icons, etc. ## remove unused themes, theme engines, icons, etc.

View File

@ -533,7 +533,63 @@ class LoraxTemplateRunner(object):
self._getsize(*remove)/1024, self._getsize(*filelist)/1024) self._getsize(*remove)/1024, self._getsize(*filelist)/1024)
self.remove(*remove) self.remove(*remove)
else: else:
logger.debug("%s: no files to remove!", cmd) logger.debug("removefrom %s: no files to remove!", cmd)
def removekmod(self, *globs):
'''
removekmod GLOB [GLOB...] [--allbut] KEEPGLOB [KEEPGLOB...]
Remove all files and directories matching the given file globs from the kernel
modules directory.
If '--allbut' is used, all the files from the modules will be removed *except*
the ones which match the file globs. There must be at least one initial GLOB
to search and one KEEPGLOB to keep. The KEEPGLOB is expanded to be *KEEPGLOB*
so that it will match anywhere in the path.
This only removes files from under /lib/modules/*/kernel/
Examples:
removekmod sound drivers/media drivers/hwmon drivers/video
removekmod drivers/char --allbut virtio_console hw_random
'''
cmd = " ".join(globs)
if "--allbut" in globs:
idx = globs.index("--allbut")
if idx == 0:
raise ValueError("removekmod needs at least one GLOB before --allbut")
# Apply keepglobs anywhere they appear in the path
keepglobs = globs[idx+1:]
if len(keepglobs) == 0:
raise ValueError("removekmod needs at least one GLOB after --allbut")
globs = globs[:idx]
else:
# Nothing to keep
keepglobs = []
filelist = set()
for g in globs:
for top_dir in rglob(self._out("/lib/modules/*/kernel/"+g)):
for root, _dirs, files in os.walk(top_dir):
filelist.update(root+"/"+f for f in files)
# Remove anything matching keepglobs from the list
matches = set()
for g in keepglobs:
globs_re = re.compile(fnmatch.translate("*"+g+"*"))
m = filter(globs_re.match, filelist)
if m:
matches.update(m)
else:
logger.debug("removekmod %s: no files matched!", g)
remove_files = filelist.difference(matches)
if remove_files:
logger.debug("removekmod: removing %d files", len(remove_files))
map(remove, remove_files)
else:
logger.debug("removekmod %s: no files to remove!", cmd)
def createaddrsize(self, addr, src, dest): def createaddrsize(self, addr, src, dest):
''' '''