diff --git a/Config.in b/Config.in index 2aff75d..e0b3f1c 100644 --- a/Config.in +++ b/Config.in @@ -1,3 +1,7 @@ +# filesystem utilities + +source "$BR2_EXTERNAL_MynaPlayer_PATH/fs/Config.in" + # packages source "$BR2_EXTERNAL_MynaPlayer_PATH/packages/Config.in" diff --git a/fs/Config.in b/fs/Config.in new file mode 100644 index 0000000..147c735 --- /dev/null +++ b/fs/Config.in @@ -0,0 +1,5 @@ +menu "Filesystem utilities" + +source "$BR2_EXTERNAL_MynaPlayer_PATH/fs/dracut/Config.in" + +endmenu \ No newline at end of file diff --git a/fs/dracut/Config.in b/fs/dracut/Config.in new file mode 100644 index 0000000..d5e2e89 --- /dev/null +++ b/fs/dracut/Config.in @@ -0,0 +1,150 @@ +config BR2_TARGET_ROOTFS_DRACUT + bool "dracut initramfs" + depends on BR2_USE_MMU # dracut -> fork() + depends on !BR2_STATIC_LIBS # dracut -> kmod + depends on BR2_PACKAGE_SYSTEMD + select BR2_PACKAGE_DRACUT + help + Build a initramfs using dracut + + https://github.com/dracutdevs/dracut + +if BR2_TARGET_ROOTFS_DRACUT + +config BR2_TARGET_ROOTFS_DRACUT_HOST_ONLY + bool "Host only build" + help + Host-Only mode: Install only what is needed for booting the + local host instead of a generic host and generate + host-specific configuration. This can greatly reduce the size + of the image, but won't work on as many systems out of the + box. + + Select this option if you are building for a specific hardware + platform and not a generic PC. + +if BR2_TARGET_ROOTFS_DRACUT_HOST_ONLY + +choice + prompt "host-only mode" + default BR2_TARGET_ROOTFS_DRACUT_HOST_ONLY_SLOPPY + help + Select the host-only mode + +config BR2_TARGET_ROOTFS_DRACUT_HOST_ONLY_SLOPPY + bool "sloppy" + help + Extra drivers and modules will be installed, so minor hardware + change won't make the image unbootable (eg. changed keyboard), + and the image is still portable among similar hosts. + +config BR2_TARGET_ROOTFS_DRACUT_HOST_ONLY_STRICT + bool "strict" + help + Anything not necessary for booting the local host in its + current state will not be included, and modules may do + some extra job to save more space. Minor change of + hardware or environment could make the image unbootable. + +endchoice + +config BR2_TARGET_ROOTFS_DRACUT_KERNEL_MODULES + string "Additional kernel modules to include" + help + An optional space seperated list of additional kernel modules + of which to include in the initramfs image. + +endif # BR2_TARGET_ROOTFS_DRACUT_HOST_ONLY + +config BR2_PACKAGE_ROOTFS_CONF_PATH + string "conf file path" + help + An optional path to a dracut conf file + +config BR2_TARGET_ROOTFS_DRACUT_MODULES + string "Additional dracut modules" + help + Space seperated list of additional dracut modules of which to + install. A full list of modules can be found in the modules.d + directory of the dracut source code. + +config BR2_TARGET_ROOTFS_DRACUT_CUSTOM_KERNEL_CMDLINE + string "custom kernel command line arguments" + help + Specify custom kernel command line argumets. Leave blank to + use the kernel defaults. + +config BR2_TARGET_ROOTFS_DRACUT_MOD_SIG + bool "Module signing support" + select BR2_PACKAGE_KEYUTILS + help + Select this if your kernel modules are signed. + +choice + prompt "Compression method" + default BR2_TARGET_ROOTFS_DRACUT_NO_COMPRESSION + depends on BR2_TARGET_ROOTFS_DRACUT + help + Select compressor for tar archive of the root filesystem + +config BR2_TARGET_ROOTFS_DRACUT_NO_COMPRESSION + bool "no compression" + help + Do not compress the dracut image. + +config BR2_TARGET_ROOTFS_DRACUT_GZIP_COMPRESSION + bool "gzip" + help + Do compress the dracut image with gzip. + +config BR2_TARGET_ROOTFS_DRACUT_BZIP2_COMPRESSION + bool "bzip2" + help + Do compress the dracut image with bzip2. + +config BR2_TARGET_ROOTFS_DRACUT_LZ4_COMPRESSION + bool "lz4" + help + Do compress the dracut image with lz4. + +config BR2_TARGET_ROOTFS_DRACUT_LZMA_COMPRESSION + bool "lzma" + help + Do compress the dracut image with lzma. + +config BR2_TARGET_ROOTFS_DRACUT_LZO_COMPRESSION + bool "lzo" + help + Do compress the dracut image with lzop. + +config BR2_TARGET_ROOTFS_DRACUT_XZ_COMPRESSION + bool "xz" + help + Do compress the dracut image with xz. + +config BR2_TARGET_ROOTFS_DRACUT_ZSTD_COMPRESSION + bool "zstd" + help + Do compress the dracut image with zstd. + +endchoice + +config BR2_TARGET_ROOTFS_DRACUT_COMPRESSION_METHOD + string + default "no-compress" if BR2_TARGET_ROOTFS_DRACUT_NO_COMPRESSION + default "gzip" if BR2_TARGET_ROOTFS_DRACUT_GZIP_COMPRESSION + default "bzip2" if BR2_TARGET_ROOTFS_DRACUT_BZIP2_COMPRESSION + default "lz4" if BR2_TARGET_ROOTFS_DRACUT_LZ4_COMPRESSION + default "lzma" if BR2_TARGET_ROOTFS_DRACUT_LZMA_COMPRESSION + default "lzo" if BR2_TARGET_ROOTFS_DRACUT_LZO_COMPRESSION + default "xz" if BR2_TARGET_ROOTFS_DRACUT_XZ_COMPRESSION + default "zstd" if BR2_TARGET_ROOTFS_DRACUT_ZSTD_COMPRESSION + +endif + +comment "dracut needs systemd" + depends on !BR2_PACKAGE_SYSTEMD + +comment "dracut needs a toolchain w/ dynamic library" + depends on BR2_USE_MMU + depends on BR2_STATIC_LIBS diff --git a/fs/dracut/dracut.mk b/fs/dracut/dracut.mk new file mode 100644 index 0000000..7433f5d --- /dev/null +++ b/fs/dracut/dracut.mk @@ -0,0 +1,234 @@ +################################################################################ +# +# Build the dracut initramfs image +# +################################################################################ + +# Dracut requires realpath from coreutils +ROOTFS_DRACUT_DEPENDENCIES += \ + host-dracut \ + dracut + +ROOTFS_DRACUT_MODULES_INCLUDE = \ + base \ + dbus \ + rootfs-block \ + systemd \ + systemd-initrd \ + dracut-systemd \ + udev-rules +ROOTFS_DRACUT_MODULES_OMIT = dbus-broker + +# Environment variables used to execute dracut +# We have to unset "prefix" as dracut uses it to move files around. +# Dracut doesn't support decimal points for the systemd version. +ROOTFS_DRACUT_SYSTEMD_VERSION_SANATIZED=`echo $(SYSTEMD_VERSION) |cut -d . -f 1` +ROOTFS_DRACUT_TARGET_DIR="$(ROOTFS_DRACUT_DIR)/target +ROOTFS_DRACUT_FS_ENV = \ + prefix="" \ + DESTROOTDIR="$(ROOTFS_DRACUT_TARGET_DIR)" \ + DRACUT_ARCH=$(BR2_ARCH) \ + DRACUT_COMPRESS_BZIP2="$(HOST_DIR)/bin/bzip2" \ + DRACUT_COMPRESS_GZIP="$(HOST_DIR)/bin/gzip" \ + DRACUT_COMPRESS_LZMA="$(HOST_DIR)/bin/lzma" \ + DRACUT_COMPRESS_XZ="$(HOST_DIR)/bin/xz" \ + DRACUT_FIRMWARE_PATH="$(ROOTFS_DRACUT_TARGET_DIR)/usr/lib/firmware" \ + DRACUT_INSTALL="$(HOST_DIR)/bin/dracut-install" \ + DRACUT_INSTALL_PATH="$(ROOTFS_DRACUT_TARGET_DIR)/usr/bin:$(ROOTFS_DRACUT_TARGET_DIR)/usr/sbin:$(ROOTFS_DRACUT_TARGET_DIR)/usr/lib" \ + DRACUT_LDCONFIG=/bin/true \ + DRACUT_LDD="$(HOST_DIR)/sbin/prelink-rtld --root=$(ROOTFS_DRACUT_TARGET_DIR)/" \ + DRACUT_PATH="/bin /sbin" \ + STRIP_CMD="$(TARGET_CROSS)strip" \ + SYSTEMCTL="$(HOST_DIR)/bin/systemctl" \ + systemctlpath="$(HOST_DIR)/bin/systemctl" \ + systemdsystemconfdir="$(ROOTFS_DRACUT_TARGET_DIR)/etc/systemd/system" \ + systemdsystemunitdir="$(ROOTFS_DRACUT_TARGET_DIR)/lib/systemd/system" \ + systemdutildir="$(ROOTFS_DRACUT_TARGET_DIR)/lib/systemd/" \ + SYSTEMD_VERSION=$(ROOTFS_DRACUT_SYSTEMD_VERSION_SANATIZED) \ + udevdir="$(ROOTFS_DRACUT_TARGET_DIR)/usr/lib/udev" \ + UDEVVERSION=$(ROOTFS_DRACUT_SYSTEMD_VERSION_SANATIZED) + +ROOTFS_DRACUT_MKFS_CONF_OPTS = \ + --force \ + --fstab \ + --noprefix \ + --sysroot=$(ROOTFS_DRACUT_TARGET_DIR) \ + --tmpdir=$(ROOTFS_DRACUT_DIR)/rootfs.dracut.tmp \ + --verbose + +ifeq ($(BR2_ROOTFS_DEVICE_TABLE_SUPPORTS_EXTENDED_ATTRIBUTES),y) +ROOTFS_DRACUT_FS_ENV += DRACUT_NO_XATTR=true +else +ROOTFS_DRACUT_FS_ENV += DRACUT_NO_XATTR=false +endif + +ifeq ($(BR2_PACKAGE_BASH),y) +ROOTFS_DRACUT_MODULES_INCLUDE += bash +else +ROOTFS_DRACUT_MODULES_OMIT += bash +endif + +# Dracut typically executes busybox --list to get a list of installed busybox +# applets. Without a qemu wrapper, executing the busybox binary won't work in a +# cross-compiled environment. To avoid using a qemu-wrapper, we manually pass +# the list to Dracut using the busybox.links file that busybox creates when +# compiling. +ifeq ($(BR2_PACKAGE_BUSYBOX)$(BR2_PACKAGE_BUSYBOX_INDIVIDUAL_BINARIES),y) +ROOTFS_DRACUT_FS_ENV += \ + BUSYBOX_LIST=`sed -r -e s%.*/%% $(BUSYBOX_DIR)/busybox.links;` +ROOTFS_DRACUT_MODULES_INCLUDE += busybox +else +ROOTFS_DRACUT_MODULES_OMIT += busybox +endif + +ifeq ($(BR2_PACKAGE_MKSH),y) +ROOTFS_DRACUT_MODULES_INCLUDE += mksh +else +ROOTFS_DRACUT_MODULES_OMIT += mksh +endif + +ifeq ($(BR2_PACKAGE_BTRFS_PROGS),y) +ROOTFS_DRACUT_MODULES_INCLUDE += btrfs +else +ROOTFS_DRACUT_MODULES_OMIT += btrfs +endif + +ifeq ($(BR2_PACKAGE_DASH),y) +ROOTFS_DRACUT_MODULES_INCLUDE += dash +else +ROOTFS_DRACUT_MODULES_OMIT += dash +endif + +ifeq ($(BR2_PACKAGE_PERL_I18N)$(BR2_PACKAGE_KBD),yy) +ROOTFS_DRACUT_MODULES_INCLUDE += i18n +else +ROOTFS_DRACUT_MODULES_OMIT += i18n +endif + +ifeq ($(BR2_PACKAGE_RNG_TOOLS),y) +ROOTFS_DRACUT_MODULES_INCLUDE += rngd +else +ROOTFS_DRACUT_MODULES_OMIT += rngd +endif + +ifeq ($(BR2_PACKAGE_LIBSELINUX),y) +ROOTFS_DRACUT_MODULES_INCLUDE += securityfs selinux +else +ROOTFS_DRACUT_MODULES_OMIT += securityfs selinux +endif + +ifeq ($(BR2_PACKAGE_SYSTEMD_REPART),y) +ROOTFS_DRACUT_MODULES_INCLUDE += systemd-repart +else +ROOTFS_DRACUT_MODULES_OMIT += systemd-repart +endif + +ifeq ($(BR2_PACKAGE_SYSTEMD_SYSUSERS),y) +ROOTFS_DRACUT_MODULES_INCLUDE += systemd-sysusers +else +ROOTFS_DRACUT_MODULES_OMIT += systemd-sysusers +endif + +ifeq ($(BR2_PACKAGE_SYSTEMD_NETWORKD),y) +ROOTFS_DRACUT_MODULES_INCLUDE += systemd-networkd +else +ROOTFS_DRACUT_MODULES_OMIT += systemd-networkd +endif + +ifeq ($(BR2_PACKAGE_UTIL_LINUX_HWCLOCK),y) +ROOTFS_DRACUT_MODULES_INCLUDE += warpclock +else +ROOTFS_DRACUT_MODULES_OMIT += warpclock +endif + +ifeq ($(BR2_PACKAGE_PLYMOUTH),y) +ROOTFS_DRACUT_DEPENDENCIES += plymouth +ROOTFS_DRACUT_MODULES_INCLUDE += plymouth +ROOTFS_DRACUT_FS_ENV += \ + PLYMOUTH_SYSROOT=$(ROOTFS_DRACUT_TARGET_DIR) \ + PLYMOUTH_CONFDIR=/etc/plymouth \ + PLYMOUTH_DATADIR=/usr/share \ + PLYMOUTH_POLICYDIR=/usr/share/plymouth/ \ + PLYMOUTH_LOGO_FILE=/etc/plymouth/bizcom.png \ + PLYMOUTH_LIBEXECDIR=/usr/libexec \ + PLYMOUTH_LDD="$(HOST_DIR)/sbin/prelink-rtld --root=$(ROOTFS_DRACUT_TARGET_DIR)/" \ + PLYMOUTH_LDD_PATH=/bin/true \ + PLYMOUTH_PLUGIN_PATH=/usr/lib/plymouth \ + PLYMOUTH_THEME_NAME="spinner" \ + PLYMOUTH_THEME="spinner" +else +ROOTFS_DRACUT_MODULES_OMIT += plymouth +endif + +ifeq ($(BR2_TARGET_ROOTFS_DRACUT_MOD_SIG),y) +ROOTFS_DRACUT_DEPENDENCIES += keyutils +ROOTFS_DRACUT_MODULES_INCLUDE += modsign +else +ROOTFS_DRACUT_MODULES_OMIT += modsign +endif + +ROOTFS_DRACUT_KERNEL_MODULES = $(call qstrip,$(BR2_TARGET_ROOTFS_DRACUT_KERNEL_MODULES)) +ROOTFS_DRACUT_MODULES_INCLUDE += $(call qstrip,$(BR2_TARGET_ROOTFS_DRACUT_MODULES)) +ROOTFS_DRACUT_CUSTOM_KERNEL_CMDLINE = $(call qstrip,$(BR2_TARGET_ROOTFS_DRACUT_CUSTOM_KERNEL_CMDLINE)) +ROOTFS_DRACUT_COMPRESSION_METHOD = $(call qstrip,$(BR2_TARGET_ROOTFS_DRACUT_COMPRESSION_METHOD)) +ROOTFS_DRACUT_CONF_PATH = $(call qstrip,$(BR2_TARGET_ROOTFS_DRACUT_CONF_PATH)) +ROOTFS_DRACUT_MKFS_CONF_OPTS += \ + --modules="$(ROOTFS_DRACUT_MODULES_INCLUDE)" \ + --omit="$(ROOTFS_DRACUT_MODULES_OMIT)" \ + --drivers=$(ROOTFS_DRACUT_KERNEL_MODULES) \ + --$(ROOTFS_DRACUT_COMPRESSION_METHOD) + +ifneq ($(ROOTFS_DRACUT_CONF_PATH),) +ROOTFS_DRACUT_MKFS_CONF_OPTS += --conf=$(ROOTFS_DRACUT_CONF_PATH) +endif + +ifneq ($(ROOTFS_DRACUT_CUSTOM_KERNEL_CMDLINE),) +ROOTFS_DRACUT_MKFS_CONF_OPTS += --kernel-cmdline=$(ROOTFS_DRACUT_CUSTOM_KERNEL_CMDLINE) +endif + +ifeq ($(BR2_LINUX_KERNEL),y) +ROOTFS_DRACUT_KERNEL_IMAGE_PATH=$(BINARIES_DIR)/$(LINUX_TARGET_NAME) +ROOTFS_DRACUT_KERNEL_VERSION=$(LINUX_VERSION_PROBED) + +ROOTFS_DRACUT_MKFS_CONF_OPTS += \ + --kver=$(ROOTFS_DRACUT_KERNEL_VERSION) \ + --kernel-image=$(ROOTFS_DRACUT_KERNEL_IMAGE_PATH) \ + --kmoddir="$(ROOTFS_DRACUT_TARGET_DIR)/lib/modules/$(ROOTFS_DRACUT_KERNEL_VERSION)" + +ROOTFS_DRACUT_FS_ENV += KERNEL_VERSION=$(ROOTFS_DRACUT_KERNEL_VERSION) +ROOTFS_DRACUT_MODULES_INCLUDE += kernel-modules +endif + +ifeq ($(BR2_TARGET_ROOTFS_DRACUT_HOST_ONLY),y) +ROOTFS_DRACUT_MKFS_CONF_OPTS += --hostonly +ROOTFS_DRACUT_MKFS_CONF_OPTS += --no-hostonly-cmdline +ifeq ($(BR2_TARGET_ROOTFS_DRACUT_HOST_ONLY_SLOPPY),y) +ROOTFS_DRACUT_MKFS_CONF_OPTS += --hostonly-mode=sloppy +else +ROOTFS_DRACUT_MKFS_CONF_OPTS += --hostonly-mode=strict +endif +else +ROOTFS_DRACUT_MKFS_CONF_OPTS += --no-hostonly +endif + +ifeq ($(BR2_STRIP_strip),y) +ROOTFS_DRACUT_MKFS_CONF_OPTS += --strip +else +ROOTFS_DRACUT_MKFS_CONF_OPTS += --nostrip +endif + +ifeq ($(BR2_REPRODUCIBLE),y) +ROOTFS_DRACUT_MKFS_CONF_OPTS += --reproducible +else +ROOTFS_DRACUT_MKFS_CONF_OPTS += --no-reproducible +endif + +define ROOTFS_DRACUT_CMD + (mkdir -p $(ROOTFS_DRACUT_DIR)/rootfs.dracut.tmp && \ + $(ROOTFS_DRACUT_FS_ENV) \ + $(HOST_DIR)/bin/dracut \ + $(ROOTFS_DRACUT_MKFS_CONF_OPTS) \ + $(BINARIES_DIR)/rootfs.cpio) +endef + +$(eval $(rootfs)) diff --git a/packages/Config.in b/packages/Config.in index 2165ae6..cf74dff 100644 --- a/packages/Config.in +++ b/packages/Config.in @@ -1,6 +1,7 @@ menu "Target packages" source "$BR2_EXTERNAL_MynaPlayer_PATH/packages/disabled-services/Config.in" +source "$BR2_EXTERNAL_MynaPlayer_PATH/packages/dracut/Config.in" source "$BR2_EXTERNAL_MynaPlayer_PATH/packages/duktape-pc/Config.in" source "$BR2_EXTERNAL_MynaPlayer_PATH/packages/lifepo4wered-pi/Config.in" source "$BR2_EXTERNAL_MynaPlayer_PATH/packages/openssh-systemd/Config.in" diff --git a/packages/dracut/0001-dracut.sh-add-library-path-option.patch b/packages/dracut/0001-dracut.sh-add-library-path-option.patch new file mode 100644 index 0000000..23c33ba --- /dev/null +++ b/packages/dracut/0001-dracut.sh-add-library-path-option.patch @@ -0,0 +1,58 @@ +From b9545a912b233eb7576649921c3795ee9fcdd893 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Sat, 20 Feb 2021 15:35:55 -0800 +Subject: [PATCH] dracut.sh: add library-path option + +Dracut.sh calls out to dracut-install which will use the default system +library paths. This causes issues if the host system doesn't have libkmod +installed. + +Add the new option --library-path, which if set, exports LD_LIBRARY_PATH before +calling dracut-install + +Signed-off-by: Adam Duskett +--- + dracut.sh | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/dracut.sh b/dracut.sh +index df72d9c..885c921 100755 +--- a/dracut.sh ++++ b/dracut.sh +@@ -119,6 +119,7 @@ Creates initial ramdisk images for preloading modules + --noprefix Do not prefix initramfs files + --mdadmconf Include local /etc/mdadm.conf + --nomdadmconf Do not include local /etc/mdadm.conf ++ --library-path Specify a library path of which to use + --lvmconf Include local /etc/lvm/lvm.conf + --nolvmconf Do not include local /etc/lvm/lvm.conf + --fscks [LIST] Add a space-separated list of fsck helpers. +@@ -359,6 +360,7 @@ rearrange_params() + --long libdirs: \ + --long fscks: \ + --long add-fstab: \ ++ --long library-path: \ + --long mount: \ + --long device: \ + --long add-device: \ +@@ -538,6 +540,7 @@ while :; do + --libdirs) libdirs_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;; + --fscks) fscks_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;; + --add-fstab) add_fstab_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;; ++ --library-path) library_path="$2"; shift;; + --mount) fstab_lines+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;; + --add-device|--device) add_device_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;; + --kernel-cmdline) kernel_cmdline_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;; +@@ -1056,6 +1059,9 @@ fi + + if ! [[ $print_cmdline ]]; then + inst "$DRACUT_TESTBIN" ++ if [ -n "${library_path}" ]; then ++ export LD_LIBRARY_PATH="${library_path}" ++ fi + if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${dracutsysrootdir:+-r "$dracutsysrootdir"} -R "$DRACUT_TESTBIN" &>/dev/null; then + unset DRACUT_RESOLVE_LAZY + export DRACUT_RESOLVE_DEPS=1 +-- +2.25.1 + diff --git a/packages/dracut/0002-force-symlink-making.patch b/packages/dracut/0002-force-symlink-making.patch new file mode 100644 index 0000000..22c42db --- /dev/null +++ b/packages/dracut/0002-force-symlink-making.patch @@ -0,0 +1,37 @@ +From 1e47223f7a1f112dc5672cc943a8b3c7fb001f45 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Sat, 20 Feb 2021 15:41:20 -0800 +Subject: [PATCH] force symlink making + +This prevents subsequent rebuilds from failing if the symlinks already exist + +Signed-off-by: Adam Duskett +--- + Makefile | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/Makefile b/Makefile +index 637e65b..01bd14c 100644 +--- a/Makefile ++++ b/Makefile +@@ -155,7 +155,7 @@ endif + mkdir -p $(DESTDIR)$(systemdsystemunitdir); \ + ln -srf $(DESTDIR)$(pkglibdir)/modules.d/98dracut-systemd/dracut-shutdown.service $(DESTDIR)$(systemdsystemunitdir)/dracut-shutdown.service; \ + mkdir -p $(DESTDIR)$(systemdsystemunitdir)/sysinit.target.wants; \ +- ln -s ../dracut-shutdown.service \ ++ ln -sf ../dracut-shutdown.service \ + $(DESTDIR)$(systemdsystemunitdir)/sysinit.target.wants/dracut-shutdown.service; \ + mkdir -p $(DESTDIR)$(systemdsystemunitdir)/initrd.target.wants; \ + for i in \ +@@ -168,7 +168,7 @@ endif + dracut-pre-udev.service \ + ; do \ + ln -srf $(DESTDIR)$(pkglibdir)/modules.d/98dracut-systemd/$$i $(DESTDIR)$(systemdsystemunitdir); \ +- ln -s ../$$i \ ++ ln -sf ../$$i \ + $(DESTDIR)$(systemdsystemunitdir)/initrd.target.wants/$$i; \ + done \ + fi +-- +2.25.1 + diff --git a/packages/dracut/0003-busybox-module-add-BUSYBOX_LIST-variable.patch b/packages/dracut/0003-busybox-module-add-BUSYBOX_LIST-variable.patch new file mode 100644 index 0000000..0967473 --- /dev/null +++ b/packages/dracut/0003-busybox-module-add-BUSYBOX_LIST-variable.patch @@ -0,0 +1,35 @@ +From 665bdc0c91f6d4f33bfd6cd4254c8bb31150eb78 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Sun, 21 Feb 2021 14:35:45 -0800 +Subject: [PATCH] busybox module: add BUSYBOX_LIST variable + +When installing the Busybox module, Dracut attempts to execute busybox --list +to get a list of all installed busybox modules. + +Executing a cross-compiled busybox won't work when the binary is a different +architecture from the host. To fix this issue, allow a user to specify a list +of Busybox files via the "BUSYBOX_LIST" variable and execute busybox --list +if the list is empty. + +Signed-off-by: Adam Duskett +--- + modules.d/05busybox/module-setup.sh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/modules.d/05busybox/module-setup.sh b/modules.d/05busybox/module-setup.sh +index 20b36c1..4f0660e 100755 +--- a/modules.d/05busybox/module-setup.sh ++++ b/modules.d/05busybox/module-setup.sh +@@ -18,7 +18,8 @@ install() { + local _progs=() + _busybox=$(find_binary busybox) + inst $_busybox /usr/bin/busybox +- for _i in $($_busybox --list); do ++ [ -z "$BUSYBOX_LIST" ] && BUSYBOX_LIST=$($_busybox --list) ++ for _i in ${BUSYBOX_LIST}; do + [[ ${_i} == busybox ]] && continue + _progs+=("${_i}") + done +-- +2.25.1 + diff --git a/packages/dracut/0004-fakeroot-fixes.patch b/packages/dracut/0004-fakeroot-fixes.patch new file mode 100644 index 0000000..b0432a5 --- /dev/null +++ b/packages/dracut/0004-fakeroot-fixes.patch @@ -0,0 +1,29 @@ +From 4e5776c4cb230d926bd0e72c86a56a1471919cd9 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Wed, 24 Feb 2021 14:11:21 -0800 +Subject: [PATCH] fakeroot fixes + +Dracut unsets LD_PRELOAD and LD_LIBRARY_PATH, both of which are used by +fakeroot. If these are not set, fakeroot doesn't work and mknod fails. + +Signed-off-by: Adam Duskett +--- + dracut.sh | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/dracut.sh b/dracut.sh +index 800a676..515bd1b 100755 +--- a/dracut.sh ++++ b/dracut.sh +@@ -698,8 +698,6 @@ export LC_ALL=C + export LANG=C + unset LC_MESSAGES + unset LC_CTYPE +-unset LD_LIBRARY_PATH +-unset LD_PRELOAD + unset GREP_OPTIONS + + export DRACUT_LOG_LEVEL=warning +-- +2.29.2 + diff --git a/packages/dracut/0005-allow-custom-strip-command.patch b/packages/dracut/0005-allow-custom-strip-command.patch new file mode 100644 index 0000000..f992157 --- /dev/null +++ b/packages/dracut/0005-allow-custom-strip-command.patch @@ -0,0 +1,35 @@ +From 9b696e31c9843e96c1a7b0b6562a7c2b01cfd098 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Sun, 21 Feb 2021 17:32:49 -0800 +Subject: [PATCH] allow custom strip command + +For cross-compiled environments, the normal strip command does not work due to +the difference between architectures. + +Add the STRIP_CMD environment variable that can be passed to dracut. + +Signed-off-by: Adam Duskett +--- + dracut.sh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/dracut.sh b/dracut.sh +index 3882e8f..6a5aa06 100755 +--- a/dracut.sh ++++ b/dracut.sh +@@ -1921,8 +1921,11 @@ if [[ $do_strip = yes ]] ; then + # Prefer strip from elfutils for package size + declare strip_cmd + strip_cmd=$(command -v eu-strip) +- [ -z "$strip_cmd" ] && strip_cmd="strip" + ++ [ -z "$strip_cmd" ] && strip_cmd="strip" ++ if [ -n "$STRIP_CMD" ]; then ++ strip_cmd="${STRIP_CMD}" ++ fi + for p in $strip_cmd xargs find; do + if ! type -P $p >/dev/null; then + dinfo "Could not find '$p'. Not stripping the initramfs." +-- +2.25.1 + diff --git a/packages/dracut/Config.in b/packages/dracut/Config.in new file mode 100644 index 0000000..76d4e74 --- /dev/null +++ b/packages/dracut/Config.in @@ -0,0 +1,25 @@ +config BR2_PACKAGE_DRACUT + bool "dracut" + depends on BR2_USE_MMU # fork() + depends on !BR2_STATIC_LIBS # kmod + depends on BR2_PACKAGE_SYSTEMD + select BR2_PACKAGE_KMOD + select BR2_PACKAGE_PKGCONF + select BR2_PACKAGE_BASH_COMPLETION if BR2_PACKAGE_BASH + select BR2_PACKAGE_SYSTEMD_INITRD # runtime + select BR2_PACKAGE_UTIL_LINUX # runtime + select BR2_PACKAGE_UTIL_LINUX_SULOGIN # runtime + help + dracut (the tool) is used to create an initramfs image by + copying tools and files from an installed system and combining + it with the dracut framework, usually found in + /usr/lib/dracut/modules.d. + + https://github.com/dracutdevs/dracut + +comment "dracut needs systemd" + depends on !BR2_PACKAGE_SYSTEMD + +comment "dracut needs a toolchain w/ dynamic library" + depends on BR2_USE_MMU + depends on BR2_STATIC_LIBS diff --git a/packages/dracut/dracut-install.in b/packages/dracut/dracut-install.in new file mode 100755 index 0000000..a7877e1 --- /dev/null +++ b/packages/dracut/dracut-install.in @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -e + +LD_LIBRARY_PATH="$(dirname "$0")/../lib:$(dirname "$0")/../lib/systemd" $(dirname "$0")/../lib/dracut/dracut-install "${@}" diff --git a/packages/dracut/dracut.hash b/packages/dracut/dracut.hash new file mode 100644 index 0000000..574bd23 --- /dev/null +++ b/packages/dracut/dracut.hash @@ -0,0 +1,3 @@ +# Locally computed +sha256 12708a23745cf6e1c1cc3df5674534679f14db0410d854db01172c01fe00b508 dracut-053.tar.gz +sha256 8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643 COPYING diff --git a/packages/dracut/dracut.mk b/packages/dracut/dracut.mk new file mode 100644 index 0000000..02e3032 --- /dev/null +++ b/packages/dracut/dracut.mk @@ -0,0 +1,84 @@ +################################################################################ +# +# dracut +# +################################################################################ + +DRACUT_VERSION = 053 +DRACUT_SITE = $(call github,dracutdevs,dracut,$(DRACUT_VERSION)) +DRACUT_LICENSE = GPL-2.0 +DRACUT_LICENSE_FILES = COPYING +DRACUT_INSTALL_STAGING = YES + +# Dracut requires realpath from coreutils +# prelink-cross is used to determin which libraries to copy. +HOST_DRACUT_DEPENDENCIES += \ + host-pkgconf \ + host-kmod \ + host-coreutils \ + host-cpio \ + host-gzip \ + host-util-linux \ + host-prelink-cross + +DRACUT_DEPENDENCIES += \ + host-dracut \ + kmod \ + pkgconf \ + systemd \ + util-linux + +DRACUT_MAKE_ENV += \ + CC="$(TARGET_CC)" \ + PKG_CONFIG="$(HOST_PKG_CONFIG_PATH)" \ + SYSTEMCTL=$(HOST_DIR)/usr/bin/systemctl \ + dracutsysrootdir=$(TARGET_DIR) + +DRACUT_CONF_OPTS = \ + --disable-documentation \ + --systemdsystemunitdir=/usr/lib/systemd/system + +HOST_DRACUT_MAKE_ENV += \ + PKG_CONFIG="$(HOST_PKG_CONFIG_PATH)" + +HOST_DRACUT_CONF_OPTS = \ + --disable-documentation \ + --libdir=$(HOST_DIR)/lib \ + --libexecdir=$(HOST_DIR)/lib \ + --bindir=$(HOST_DIR)/bin \ + --sbindir=$(HOST_DIR)/sbin + +ifeq ($(BR2_PACKAGE_BASH),y) +DRACUT_DEPENDENCIES += \ + bash \ + bash-completion +endif + +# gensplash is gentoo specific +define DRACUT_REMOVE_UNEEDED_MODULES + $(RM) -r $(TARGET_DIR)/usr/lib/dracut/modules.d/50gensplash +endef +DRACUT_TARGET_FINALIZE_HOOKS += DRACUT_REMOVE_UNEEDED_MODULES + +define DRACUT_LINUX_CONFIG_FIXUPS + $(call KCONFIG_ENABLE_OPT,CONFIG_BLK_DEV_INITRD) + $(call KCONFIG_ENABLE_OPT,CONFIG_DEVTMPFS) +endef + +define DRACUT_REMOVE_SYSTEMD_FILES + # Do not start dracut services normally. Dracut will enable the dracut + # services during image creation. + find $(TARGET_DIR)/etc/systemd/system -name "*dracut*.service" -delete +endef +DRACUT_TARGET_FINALIZE_HOOKS += DRACUT_REMOVE_SYSTEMD_FILES + +# Install the dracut-install wrapper which exports the proper LD_LIBRARY_PATH +# when called. +define HOST_DRACUT_INSTALL_WRAPPER + $(INSTALL) -D -m 755 $(DRACUT_PKGDIR)/dracut-install.in \ + $(HOST_DIR)/bin/dracut-install +endef +HOST_DRACUT_POST_INSTALL_HOOKS += HOST_DRACUT_INSTALL_WRAPPER + +$(eval $(autotools-package)) +$(eval $(host-autotools-package))