diff --git a/live/root/tmp/driver_cleanup.rb b/live/root/tmp/driver_cleanup.rb index d122a4f68d..f5cff78ba2 100755 --- a/live/root/tmp/driver_cleanup.rb +++ b/live/root/tmp/driver_cleanup.rb @@ -1,9 +1,24 @@ #! /usr/bin/env ruby -# This script removes not needed multimedia drivers (sound cards, TV cards,...). +# This script removes not needed drivers from the Live ISO. It deletes the drivers which are either +# not relevant for the installer (sound cards, TV cards, joysticks, NFC...) or the hardware is +# obsolete and very likely not used in modern systems (PCMCIA, Appletalk...). # -# By default the script runs in safe mode and only lists the drivers to delete, -# use the "--delete" argument to really delete the drivers. +# By default the script runs in safe mode and only lists the drivers to delete, use the "--delete" +# argument to really delete the drivers. +# +# The script uses the "module.list" file from the installation-images package +# (https://github.com/openSUSE/installation-images/blob/master/etc/module.list). The file should be +# updated manually from time to time. Hot fixes or Agama specific changes should be added into the +# module.list.extra file. +# +# The file lists the drivers or whole directories which should be present in the installation +# system. If the line starts with "-" then that driver or directory should be removed. It is usually +# connected with the previous line, it allows to include a whole directory with drivers but delete +# just a specific driver or subdirectory below it. +# +# The file is actually a list of Perl regexps, hopefully only the basic regexp features which work +# also in Ruby will be ever used... require "find" require "shellwords" @@ -28,66 +43,109 @@ def self.find(dir) Find.find(dir) do |path| if File.file?(path) && path.end_with?(".ko", ".ko.xz", ".ko.zst") - name = File.basename(path).sub(/\.ko(\.xz|\.zst|)\z/, "") - deps = `/usr/sbin/modinfo -F depends #{path.shellescape}`.chomp.split(",") - drivers << Driver.new(name, path, deps) + drivers << Driver.from_file(path) end end return drivers end + + # create a driver object from a kernel driver file + def self.from_file(file) + deps = `/usr/sbin/modinfo -F depends #{file.shellescape}`.chomp.split(",") + name = File.basename(file).sub(/\.ko(\.xz|\.zst|)\z/, "") + Driver.new(name, file, deps) + end end -# delete the kernel drivers in these subdirectories, but keep the drivers used by -# dependencies from other drivers -delete = [ - "kernel/sound", - "kernel/drivers/media", - "kernel/drivers/staging/media" -] +# really delete or just do a smoke test? +do_delete = ARGV[0] == "--delete" + +# read the configuration files +config = File.read(File.join(__dir__, "module.list")).split("\n") +config += File.read(File.join(__dir__, "module.list.extra")).split("\n") + +# remove comments and empty lines +config.reject!{|l| l.empty? || l.start_with?("#")} + +# split the list into keep and delete parts (starting with "-") +delete, keep = config.partition{|c| c.start_with?("-")} + +# remove the delete prefix "-" +delete.map!{|l| l.delete_prefix("-")} + +# convert to regular expressions +keep.map!{|l| Regexp.new(l)} +delete.map!{|l| Regexp.new(l)} # in the Live ISO there should be just one kernel installed dir = Dir["/lib/modules/*"].first -# drivers to delete -delete_drivers = [] +to_keep = [] +to_delete = [] -# scan the drivers in the delete subdirectories -delete.each do |d| - delete_drivers += Driver.find(File.join(dir, d)) -end +puts "Scanning kernel modules in #{dir}..." +Find.find(dir) do |path| + next unless File.file?(path) && path.end_with?(".ko", ".ko.xz", ".ko.zst") -all_drivers = Driver.find(dir) + driver = Driver.from_file(path) -# remove the possibly deleted drivers -all_drivers.reject!{|a| delete_drivers.any?{|d| d.name == a.name}} + kernel_path = path.delete_prefix(dir).delete_prefix("/") -puts "Skipping dependent drivers:" + if delete.any?{|d| d.match?(kernel_path)} + # deleted explicitly by config + to_delete << driver + elsif keep.any?{|k| k.match?(kernel_path)} + # included explicitly by config + to_keep << driver + else + # implicitly delete all unknown drivers not mentioned in the config + to_delete << driver + end +end + +puts "Checking driver dependencies..." + +# iteratively find the dependant drivers (dependencies of dependencies...), move the referenced +# drivers from the delete list to the keep list until no driver in the delete list is referenced +# from the keep list -# iteratively find the dependant drivers (dependencies of dependencies...) loop do - referenced = delete_drivers.select do |dd| - all_drivers.any?{|ad| ad.deps.include?(dd.name)} + referenced = to_delete.select do |dd| + to_keep.any?{|ad| ad.deps.include?(dd.name)} end - # no more new dependencies, end of the dependency chain reached + # no dependencies, the end of the dependency chain reached break if referenced.empty? - puts referenced.map(&:path).sort.join("\n") + referenced.each do |d| + puts "Keep dependant driver #{d.path}" + end - # move the referenced drivers from the "delete" list to the "keep" list - all_drivers += referenced - delete_drivers.reject!{|a| referenced.any?{|d| d.name == a.name}} + # move the referenced drivers from the delete list to the keep list + to_keep += referenced + to_delete.reject!{|a| referenced.any?{|d| d.path == a.path}} end -puts "Drivers to delete:" -delete = ARGV[0] == "--delete" +# total size counter +driver_size = 0 + +# process the list of the drivers to delete +to_delete.each do |d| + driver_size += File.size(d.path) -delete_drivers.each do |d| - if (delete) + if (do_delete) puts "Deleting #{d.path}" File.delete(d.path) else - puts d.path + puts "Driver to delete #{d.path}" end end + +puts "Found #{to_delete.size} drivers to delete (#{driver_size/1024/1024} MiB)" + +# at the end update the kernel driver metadata (modules.dep and others) +if (do_delete) + puts "Updating driver metadata..." + system("/sbin/depmod -a -F #{dir.shellescape}/System.map") +end diff --git a/live/root/tmp/module.list b/live/root/tmp/module.list new file mode 100644 index 0000000000..54574108bc --- /dev/null +++ b/live/root/tmp/module.list @@ -0,0 +1,313 @@ +# modules that _might_ be useful during installation +# +# Lines starting with '-' specify modules to drop. +# The lines below are actually perl regexps, so be careful. +# +kernel/drivers/base/ +kernel/drivers/block/ +-kernel/drivers/block/paride +kernel/drivers/cdrom/cdrom.ko +kernel/drivers/cdrom/viocd.ko +kernel/drivers/i2o/ +kernel/drivers/ide/ +kernel/drivers/ata/ +#-kernel/drivers/ata/pata_ +kernel/drivers/firewire/ +kernel/drivers/input/ +-kernel/drivers/input/joystick +-kernel/drivers/input/gameport +kernel/drivers/iseries/ +kernel/drivers/md/ +kernel/drivers/mmc/ +kernel/drivers/net/ +-kernel/drivers/net/aironet +-kernel/drivers/net/appletalk/ +-kernel/drivers/net/arcnet/ +-kernel/drivers/net/hamradio/ +-kernel/drivers/net/irda/ +-kernel/drivers/net/ppp/ +-kernel/drivers/net/wan/ +-kernel/drivers/net/ppp_async.ko +kernel/drivers/net/rionet.ko +kernel/drivers/dca/ +kernel/drivers/parport/ +-kernel/drivers/parport/parport_serial.ko +kernel/drivers/pnp/ +kernel/drivers/scsi/ +-kernel/drivers/scsi/ses.ko +kernel/drivers/usb/common/ +kernel/drivers/usb/storage/ +kernel/drivers/usb/host/ +kernel/drivers/usb/core/ +kernel/drivers/usb/net/ +kernel/drivers/usb/serial/ +kernel/drivers/usb/input/usbhid.ko +kernel/drivers/hid/ +-kernel/drivers/hid/hid-prodikeys.ko +kernel/drivers/char/nvram.ko +kernel/drivers/char/agp/ +kernel/drivers/message/fusion/ +kernel/drivers/message/i2o/ +kernel/drivers/ps3/ +kernel/drivers/mtd/devices/ps3vram.ko +kernel/drivers/mtd/mtd.ko +kernel/drivers/mtd/mtd_blkdevs.ko +kernel/drivers/mtd/mtdblock.ko +kernel/drivers/misc/ioc4.ko +kernel/drivers/ssb/ +kernel/drivers/leds/led-class.ko +kernel/drivers/mmc/core/ + +kernel/fs/9p/ +kernel/fs/autofs4/ +kernel/fs/binfmt_misc.ko +kernel/fs/btrfs/ +kernel/fs/cifs/ +kernel/fs/configfs/ +kernel/fs/cramfs/ +kernel/fs/dmapi/ +kernel/fs/efivarfs/ +kernel/fs/exfat/ +kernel/fs/exofs/libore.ko +kernel/fs/exportfs/ +kernel/fs/ext2/ +kernel/fs/ext3/ +kernel/fs/ext4/ +kernel/fs/fat/ +kernel/fs/fscache/ +kernel/fs/fuse/ +kernel/fs/hfs/ +kernel/fs/hfsplus/ +kernel/fs/hpfs/ +kernel/fs/isofs/ +kernel/fs/jbd/ +kernel/fs/jbd2/ +kernel/fs/jfs/ +kernel/fs/lockd/ +kernel/fs/mbcache.ko +kernel/fs/ncpfs/ +kernel/fs/nfs/ +kernel/fs/nfs_common/ +kernel/fs/nfsd/ +kernel/fs/nls/ +kernel/fs/ntfs/ +kernel/fs/overlayfs/ +kernel/fs/smb/ +kernel/fs/smbfs/ +kernel/fs/squashfs/ +kernel/fs/udf/ +kernel/fs/vboxsf/ +kernel/fs/vfat/ +kernel/fs/xfs/ + +kernel/net/9p/ +kernel/net/sunrpc/sunrpc.ko +kernel/net/sunrpc/auth_gss/auth_rpcgss.ko +kernel/net/packet/ +kernel/net/rfkill/rfkill.ko +kernel/net/iucv/ +kernel/net/ipv6/ipv6.ko +kernel/net/ipv4/gre.ko +kernel/net/ieee80211/ +kernel/net/mac80211/mac80211.ko +kernel/net/mac80211/rc80211_simple.ko +kernel/net/wireless/ +kernel/net/wimax/ +kernel/net/ceph/ +kernel/net/802/tr.ko +kernel/net/802/fddi.ko +kernel/net/phonet/phonet.ko +kernel/net/ieee802154/ieee802154.ko +kernel/net/mac802154/ +kernel/net/dsa/dsa_core.ko +kernel/net/ipv4/ip_tunnel.ko +kernel/net/dns_resolver/dns_resolver.ko +kernel/net/ipv4/inet_lro.ko +kernel/net/8021q/ +kernel/net/802/garp.ko +kernel/net/802/stp.ko +kernel/net/802/mrp.ko +kernel/net/llc/ +kernel/net/qrtr + +kernel/drivers/power/power_supply.ko +kernel/drivers/firmware/ +kernel/drivers/acpi/ +kernel/drivers/char/ipmi/ +kernel/drivers/video/backlight/ +kernel/drivers/mfd/ +kernel/drivers/cpufreq/ +kernel/arch/x86/kernel/ +kernel/drivers/platform/ +kernel/drivers/pci/hotplug/pci_hotplug.ko +kernel/sound/soundcore.ko +kernel/sound/core/snd.ko +kernel/drivers/hwmon/hwmon.ko +kernel/drivers/thermal/thermal_sys.ko + +# kernel pcmcia +# see data/initrd/initrd_base.list +/pcmcia/ +-kernel/drivers/char/pcmcia/synclink_cs.ko +-/sound/pcmcia/ + +kernel/lib/ +kernel/arch/ia64/sn/kernel +kernel/drivers/sn +extra/megaide.ko + +kernel/arch/s390/ +kernel/drivers/s390/ + +kernel/crypto/ +kernel/arch/[^/]*/crypto/ +kernel/drivers/crypto/geode-aes.ko + +kernel/drivers/video/vga16fb.ko +kernel/drivers/video/vgastate.ko +kernel/drivers/video/output.ko +kernel/drivers/video/fb_sys_fops.ko +kernel/drivers/video/sysimgblt.ko +kernel/drivers/video/sysfillrect.ko +kernel/drivers/video/syscopyarea.ko +kernel/drivers/video/fbdev/core/ + +kernel/arch/i386/kernel/msr.ko + +kernel/drivers/xen/blkfront/ +kernel/drivers/xen/netfront/ +kernel/drivers/xen/core/ +kernel/drivers/xen/xen-scsiback.ko +kernel/drivers/video/fbdev/xen-fbfront.ko + +kernel/drivers/bcma/ + +kernel/drivers/rtc/ +kernel/drivers/mfd/wm8350.ko +kernel/drivers/misc/eeprom/eeprom_93cx6.ko +kernel/drivers/mfd/mc13783-core.ko +kernel/drivers/mfd/mc13xxx-core.ko +kernel/drivers/mfd/mfd-core.ko +kernel/drivers/mfd/sm501.ko + +kernel/arch/powerpc/sysdev/bestcomm/bestcomm-fec.ko + +kernel/drivers/virtio/ + +kernel/drivers/usb/wusbcore/ +kernel/drivers/uwb/ + +kernel/drivers/misc/tifm_core.ko +kernel/drivers/usb/misc/ftdi-elan.ko + +kernel/drivers/mfd/pcf50633-core.ko + +kernel/drivers/connector/ +kernel/drivers/uio/uio.ko +kernel/drivers/uio/uio_hv_generic.ko +kernel/drivers/misc/cb710/ +kernel/drivers/mfd/ab3100-core.ko +kernel/drivers/gpu/drm/ +# kernel/drivers/gpu/drm/drm.ko +kernel/drivers/video/sis/ +kernel/drivers/video/fbdev/hyperv_fb.ko + +kernel/drivers/misc/lis3lv02d/lis3lv02d.ko +kernel/drivers/misc/cs5535-mfgpt.ko +kernel/drivers/gpio/ +kernel/drivers/ptp/ +kernel/drivers/pps/pps_core.ko +kernel/drivers/usb/class/cdc-wdm.ko + +kernel/drivers/hv/ +kernel/drivers/staging/hv/ +kernel/drivers/staging/rtl.* + +kernel/drivers/usb/misc/ezusb.ko +kernel/drivers/media/rc/rc-core.ko +kernel/sound/ac97_bus.ko +kernel/drivers/target/target_core_mod.ko + +kernel/drivers/leds/led-class.ko +kernel/drivers/rapidio/rapidio.ko +kernel/drivers/ntb/ntb.ko + +kernel/drivers/target/iscsi/iscsi_target_mod.ko +kernel/drivers/infiniband/ + +kernel/drivers/vhost/vringh.ko + +kernel/drivers/of/ +kernel/drivers/tty/serial/jsm/ +kernel/drivers/i2c/ +kernel/drivers/nvme/ +kernel/drivers/nvdimm/ +kernel/drivers/usb/dwc2/ +kernel/drivers/usb/dwc3/ +kernel/drivers/usb/core/ledtrig-usbport.ko +kernel/drivers/phy/ +kernel/drivers/regulator/ +kernel/drivers/pci/host/ +kernel/drivers/pci/controller/ +kernel/drivers/mailbox/ +kernel/drivers/pinctrl/ +kernel/drivers/watchdog/ +kernel/drivers/usb/typec/ +kernel/drivers/usb/chipidea/ +kernel/drivers/usb/phy/ +kernel/drivers/usb/isp1760/ + +kernel/drivers/dma/bcm2835-dma.ko +kernel/drivers/dma/tegra20-apb-dma.ko + +kernel/drivers/virt/vboxguest/ + +# RPi4 +kernel/drivers/reset/reset-raspberrypi.ko +kernel/drivers/clk/bcm/clk-raspberrypi.ko +kernel/drivers/cpufreq/raspberrypi-cpufreq.ko +kernel/drivers/cpufreq/cpufreq-dt.ko +kernel/drivers/mmc/host/sdhci-iproc.ko +kernel/drivers/gpio/gpio-raspberrypi-exp.ko +kernel/drivers/net/mdio/mdio-bcm-unimac.ko + +kernel/drivers/reset/reset-rzg2l-usbphy-ctrl.ko + +# Lenovo X13s (aarch64) +kernel/drivers/clk/qcom/clk-rpmh.ko +kernel/drivers/clk/qcom/dispcc-sc8280xp.ko +kernel/drivers/clk/qcom/gcc-sc8280xp.ko +kernel/drivers/clk/qcom/gpucc-sc8280xp.ko +kernel/drivers/hwspinlock/qcom_hwspinlock.ko +kernel/drivers/interconnect/qcom/qnoc-sc8280xp.ko +kernel/drivers/leds/rgb/leds-qcom-lpg.ko +kernel/drivers/nvmem/nvmem_qcom-spmi-sdam.ko +kernel/drivers/remoteproc/qcom_q6v5.ko +kernel/drivers/remoteproc/qcom_q6v5_pas.ko +kernel/drivers/soc/qcom/pmic_glink.ko +kernel/drivers/soc/qcom/pmic_glink_altmode.ko +kernel/drivers/soc/qcom/smp2p.ko +kernel/drivers/spmi/spmi-pmic-arb.ko +kernel/drivers/spmi/spmi-mtk-pmif.ko + +# Qcom rb3gen2 +kernel/drivers/interconnect/qcom/qnoc-sc7280.ko +kernel/drivers/ufs/host/ufs-qcom.ko + +kernel/drivers/soc/mediatek/mtk-pmic-wrap.ko +kernel/drivers/power/supply/mt6360_charger.ko +kernel/drivers/nvmem/nvmem_mtk-efuse.ko +kernel/drivers/clk/ + +kernel/drivers/spi/ +kernel/drivers/dma/pl330.ko + +# kmps +updates/ + +# ofed-kmp +-updates/drivers/infiniband/ +-updates/net/rds/ +-updates/net/sunrpc/ +-updates/fs/lockd/ +-updates/fs/nfs* diff --git a/live/root/tmp/module.list.extra b/live/root/tmp/module.list.extra new file mode 100644 index 0000000000..5cca6f0a10 --- /dev/null +++ b/live/root/tmp/module.list.extra @@ -0,0 +1,4 @@ +# This is an extension of the module.list file specially for Agama. It is loaded +# in addition to the module.list file to allow extra overrides or hot fixes +# without touching the original file. The original file should not be touched to +# allow easy updates from the installation-images repository. diff --git a/live/src/agama-installer.changes b/live/src/agama-installer.changes index 71d025fd50..ee0af0ebbd 100644 --- a/live/src/agama-installer.changes +++ b/live/src/agama-installer.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Mon Dec 2 14:53:12 UTC 2024 - Ladislav Slezák + +- Use the installation-images config file for removing the kernel + drivers, it deletes even more not needed drivers and it is + a reliable source (related to gh#agama-project/agama#1665) +- The ISO size decreased by ~40MB + ------------------------------------------------------------------- Thu Nov 28 08:58:21 UTC 2024 - Ladislav Slezák