diff --git a/live/live-root/tmp/README.md b/live/live-root/tmp/README.md index 1a360605b0..6d77e5169f 100644 --- a/live/live-root/tmp/README.md +++ b/live/live-root/tmp/README.md @@ -3,11 +3,3 @@ This directory contains some helper file which are needed when building the ISO image. The files are deleted at the end of build and are not included in the final image. - -The [module.list](./module.list) file is copied from the installation-images -package. To update the file download the latest version from -https://github.com/openSUSE/installation-images/blob/master/etc/module.list. - -Hot fixes or Agama specific changes should be added into the -[module.list.extra](./module.list.extra) file to keep the original file -untouched. diff --git a/live/live-root/tmp/driver_cleanup.rb b/live/live-root/tmp/driver_cleanup.rb deleted file mode 100755 index 6377a955e1..0000000000 --- a/live/live-root/tmp/driver_cleanup.rb +++ /dev/null @@ -1,177 +0,0 @@ -#! /usr/bin/env ruby - -# 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. -# -# 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" - -# class holding the kernel driver data -class Driver - # the driver name, full file path, dependencies - attr_reader :name, :path, :deps - - def initialize(name, path, deps) - @name = name - @path = path - @deps = deps - end - - # load the kernel driver data from the given path recursively - def self.find(dir) - drivers = [] - puts "Scanning kernel modules in #{dir}..." - - return drivers unless File.directory?(dir) - - Find.find(dir) do |path| - if File.file?(path) && path.end_with?(".ko", ".ko.xz", ".ko.zst") - 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 - -# Remove lines for other architectures than the current machine architecture. The arch specific -# lines start with the <$arch> line and end with the line. -def arch_filter(lines) - # the current state for a finite-state machine with two states (inside or outside an arch tag) - skipping = false - # the current machine architecture - arch = `arch`.strip - # the architecture from the tag line - arch_tag = nil - - lines.reject! do |line| - # opening arch tag - if line.match(/^\s*<\s*(\w+)\s*>\s*$/) - arch_tag = Regexp.last_match[1] - skipping = arch_tag != arch - # always remove the arch tag - next true - end - - # closing arch tag, for simplicity let's assume it matches the previous opening tag, the tags - # cannot be nested and the input file is under our control and so we can be sure it is valid - if line.match(/^\s*<\/\s*\w+\s*>\s*$/) - skipping = false - # always remove the arch tag - next true - end - - if skipping - puts "Ignoring #{arch_tag} specific line: #{line}" - end - - skipping - end -end - -# really delete or just do a smoke test? -do_delete = ARGV[0] == "--delete" -debug = ENV["DEBUG"] == "1" - -# read the configuration files -# this file is a copy from https://github.com/openSUSE/installation-images/blob/master/etc/module.list -config = File.read(File.join(__dir__, "module.list")).split("\n") -# here are Agama specific overrides -config += File.read(File.join(__dir__, "module.list.extra")).split("\n") - -# remove comments and empty lines -config.reject!{|l| l.empty? || l.start_with?("#")} - -# process the architecture specific lines -arch_filter(config) - -# 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 - -to_keep = [] -to_delete = [] - -puts "Scanning kernel modules in #{dir}..." -Find.find(dir) do |path| - next unless File.file?(path) && path.end_with?(".ko", ".ko.xz", ".ko.zst") - - driver = Driver.from_file(path) - - kernel_path = path.delete_prefix(dir).delete_prefix("/") - - 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 - -loop do - referenced = to_delete.select do |dd| - to_keep.any?{|ad| ad.deps.include?(dd.name)} - end - - # no dependencies, the end of the dependency chain reached - break if referenced.empty? - - referenced.each do |d| - puts "Keep dependant driver #{d.path}" - end - - # 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 - -delete_drivers = to_delete.map(&:path) -puts "Found #{delete_drivers.size} drivers to delete" -puts delete_drivers if debug -File.delete(*delete_drivers) if do_delete - -# Note: The module dependencies are updated by the config.sh script -# after decompressing the drivers. diff --git a/live/live-root/tmp/fw_cleanup.rb b/live/live-root/tmp/fw_cleanup.rb deleted file mode 100755 index d82406e54a..0000000000 --- a/live/live-root/tmp/fw_cleanup.rb +++ /dev/null @@ -1,103 +0,0 @@ -#! /usr/bin/env ruby - -# This script removes unused firmware files (not referenced by any kernel -# driver) from the system. By default the script runs in safe mode and only -# lists the unused firmware file, use the "--delete" argument to delete the -# found files. - -require "find" -require "shellwords" - -# really delete or just do a smoke test? -do_delete = ARGV[0] == "--delete" - -# firmware location -fw_dir = "/lib/firmware/" - -# in the Live ISO there should be just one kernel installed -dir = Dir["/lib/modules/*"].first -puts "Scanning kernel modules in #{dir}..." - -# find all symlinks until the final file is found, if a file is passed then the -# file only is returned -# @return [Array] list of files/symlinks -def symlinks(path, fw_dir) - ret = [path] - - while File.symlink?(path) - # do not use File.realpath as it skips all intermediate symlinks and returns the final target - target = File.readlink(path) - abs_target = File.absolute_path(target, File.dirname(path)) - - # a cycle or a broken link is detected, or the link points outside of the firmware directory - break if ret.include?(abs_target) || !File.exist?(abs_target) || !abs_target.start_with?(fw_dir) - - puts "Adding symlink #{path.delete_prefix(fw_dir)} -> #{target} (#{abs_target})" - ret << abs_target - - # prepare for the next iteration round - path = abs_target - end - - ret -end - -# list of referenced firmware names from the kernel modules, includes symlinks and expanded globs, -# the paths are relative to the /lib/firmware root -fw = [] - -# traverse the kernel drivers tree and extract the needed firmware files -Find.find(dir) do |path| - if File.file?(path) && path.end_with?(".ko", ".ko.xz", ".ko.zst") - driver_fw = `/usr/sbin/modinfo -F firmware #{path.shellescape}`.split("\n") - - driver_fw.each do |fw_name| - f = fw_name.dup - # the firmware can be compressed, match also the compressed variants, if - # a wildcard is at the end then it already matches so it does not need - # to be added (compressed files would be then included twice) - f += "{,.xz,.zst}" if !f.end_with?("*") - - matching = Dir.glob(File.join(fw_dir, f)) - - if fw_name.include?("*") - puts "Pattern #{fw_name.inspect} expanded to: #{matching.join(", ")}" - end - - # find symlink targets if the file is a symlink - fw_files = matching.inject([]){|acc, file| acc += symlinks(file, fw_dir)} - - fw += fw_files.map{|m| m.delete_prefix(fw_dir)} - end - end -end - -puts "Removing unused firmware..." -# counter for total unused firmware size -unused_size = 0 - -# traverse the firmware tree and delete the files which are not referenced by any kernel module -Find.find(fw_dir) do |fw_path| - next unless File.file?(fw_path) - - fw_name = fw_path.delete_prefix(fw_dir) - - if !fw.include?(fw_name) - unused_size += File.size(fw_path) - if (do_delete) - File.delete(fw_path) - else - puts "Found unused firmware #{fw_path}" - end - end -end - -# do some cleanup at the end -if (do_delete) - puts "Removing dangling symlinks..." - system("find #{fw_dir.shellescape} -xtype l -delete") - puts "Removing empty directories..." - system("find #{fw_dir.shellescape} -type d -empty -delete") -end - -puts "Unused firmware size: #{unused_size} (#{unused_size >> 20} MiB)" diff --git a/live/live-root/tmp/module.list b/live/live-root/tmp/module.list deleted file mode 100644 index 71c7066951..0000000000 --- a/live/live-root/tmp/module.list +++ /dev/null @@ -1,328 +0,0 @@ -# modules that _might_ be useful during installation -# -# Lines starting with '-' specify modules to drop. -# The lines below are actually perl regexps, so be careful. -# -# If a module is specified both to be added and dropped, it is dropped. -# -# Arch-dependend blocks start with and end with (on separate lines). -# -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* - - -# for the source of this module list, see bsc#1213879 comment 35 --kernel/drivers/net/wireless/ --kernel/net/ieee80211/ --kernel/net/mac80211/ --kernel/net/wireless/ --kernel/net/wimax/ --kernel/drivers/gpu/ --kernel/drivers/video/ - diff --git a/live/live-root/tmp/module.list.extra b/live/live-root/tmp/module.list.extra deleted file mode 100644 index fac14402dc..0000000000 --- a/live/live-root/tmp/module.list.extra +++ /dev/null @@ -1,8 +0,0 @@ -# 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. - -# keep the nvmem drivers (https://bugzilla.suse.com/show_bug.cgi?id=1243350) -kernel/drivers/nvmem -kernel/drivers/dma/fsl-edma.ko diff --git a/live/src/agama-installer.kiwi b/live/src/agama-installer.kiwi index 9ba149a4c1..438d361e52 100644 --- a/live/src/agama-installer.kiwi +++ b/live/src/agama-installer.kiwi @@ -115,6 +115,8 @@ + + diff --git a/live/src/config.sh b/live/src/config.sh index d5c71012c7..83bd2895e1 100644 --- a/live/src/config.sh +++ b/live/src/config.sh @@ -291,15 +291,13 @@ rpm -e --nodeps alsa alsa-utils alsa-ucm-conf || true du -h -s /lib/modules /lib/firmware # remove the multimedia drivers -# set DEBUG=1 to print the deleted drivers -/tmp/driver_cleanup.rb --delete -# remove the script and data, not needed anymore -rm /tmp/driver_cleanup.rb /tmp/module.list* - -# remove the unused firmware (not referenced by kernel drivers) -/tmp/fw_cleanup.rb --delete -# remove the script, not needed anymore -rm /tmp/fw_cleanup.rb +image-janitor -v driver-cleanup --delete + +# remove the unused firmware(not referenced by kernel drivers) +image-janitor -v fw-cleanup --delete + +# remove the tool, not needed anymore +rpm -e image-janitor du -h -s /lib/modules /lib/firmware ################################################################################