diff --git a/50-dracut.install b/50-dracut.install index 5ac74f1..d05abb9 100755 --- a/50-dracut.install +++ b/50-dracut.install @@ -20,6 +20,8 @@ case "$COMMAND" in if [[ -f /etc/kernel/cmdline ]]; then readarray -t BOOT_OPTIONS < /etc/kernel/cmdline + elif [[ -f /usr/lib/kernel/cmdline ]]; then + readarray -t BOOT_OPTIONS < /usr/lib/kernel/cmdline fi if ! [[ "${BOOT_OPTIONS[@]}" ]]; then diff --git a/51-dracut-rescue.install b/51-dracut-rescue.install index 9fb0c5d..9abd9d7 100755 --- a/51-dracut-rescue.install +++ b/51-dracut-rescue.install @@ -41,6 +41,8 @@ fi if [[ -f /etc/kernel/cmdline ]]; then readarray -t BOOT_OPTIONS < /etc/kernel/cmdline +elif [[ -f /usr/lib/kernel/cmdline ]]; then + readarray -t BOOT_OPTIONS < /usr/lib/kernel/cmdline fi if ! [[ "${BOOT_OPTIONS[@]}" ]]; then read -ar BOOT_OPTIONS < /proc/cmdline diff --git a/dracut.8.asc b/dracut.8.asc index 7d11f43..9aecbfb 100644 --- a/dracut.8.asc +++ b/dracut.8.asc @@ -31,7 +31,7 @@ early userspace. For a complete list of kernel command line options see *dracut.cmdline*(7). If you are dropped to an emergency shell, while booting your initramfs, -the file _/run/initramfs/rdsosreport.txt_ is created, which can be safed to a +the file _/run/initramfs/rdsosreport.txt_ is created, which can be saved to a (to be mounted by hand) partition (usually /boot) or a USB stick. Additional debugging info can be produced by adding **rd.debug** to the kernel command line. _/run/initramfs/rdsosreport.txt_ contains all logs and the output diff --git a/dracut.cmdline.7.asc b/dracut.cmdline.7.asc index 5ff84ef..e51fd1b 100644 --- a/dracut.cmdline.7.asc +++ b/dracut.cmdline.7.asc @@ -163,7 +163,7 @@ Misc Debug ~~~~~ If you are dropped to an emergency shell, the file -_/run/initramfs/rdsosreport.txt_ is created, which can be safed to a (to be +_/run/initramfs/rdsosreport.txt_ is created, which can be saved to a (to be mounted by hand) partition (usually /boot) or a USB stick. Additional debugging info can be produced by adding **rd.debug** to the kernel command line. _/run/initramfs/rdsosreport.txt_ contains all logs and the output of some tools. @@ -834,11 +834,27 @@ Enables debug output from the live boot process. Specifies the directory within the squashfs where the ext3fs.img or rootfs.img can be found. By default, this is __LiveOS__. +**rd.live.ram=**1:: +Copy the complete image to RAM and use this for booting. This is useful +when the image resides on i.e. a DVD which needs to be ejected later on. + +**rd.live.overlay.thin=**1:: +Enables the usage of thin snapshots instead of classic dm snapshots. +The advantage of thin snapshots is, that they support discards, and will free +blocks which are not claimed by the filesystem. In this use case this means, +that memory is given back to the kernel, when the filesystem does not claim it +anymore. + **rd.writable.fsimg=**1:: Enables writable filesystem support. The system will boot with a fully writable filesystem without snapshots __(see notes above about available live boot options)__. You can use the **rootflags** option to set mount options for the live filesystem as well __(see documentation about rootflags in the **Standard** section above)__. +This implies that the whole image is copied to RAM before the boot continues. ++ +NOTE: There must be enough free RAM available to hold the complete image. ++ +This method is very suitable for diskless boots. Plymouth Boot Splash diff --git a/dracut.conf.d/fedora.conf.example b/dracut.conf.d/fedora.conf.example index b6c769c..b126b09 100644 --- a/dracut.conf.d/fedora.conf.example +++ b/dracut.conf.d/fedora.conf.example @@ -15,4 +15,5 @@ systemdsystemunitdir=/usr/lib/systemd/system systemdsystemconfdir=/etc/systemd/system udevdir=/usr/lib/udev hostonly="yes" +hostonly_cmdline="no" early_microcode="yes" diff --git a/dracut.sh b/dracut.sh index 5e2feba..17bf8f2 100755 --- a/dracut.sh +++ b/dracut.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash --norc # # Generator script for a dracut initramfs # Tries to retain some degree of compatibility with the command line diff --git a/modules.d/01fips/module-setup.sh b/modules.d/01fips/module-setup.sh index d232d58..aacbc95 100755 --- a/modules.d/01fips/module-setup.sh +++ b/modules.d/01fips/module-setup.sh @@ -14,7 +14,7 @@ depends() { installkernel() { local _fipsmodules _mod _fipsmodules="aead aes_generic aes-x86_64 ansi_cprng arc4 blowfish camellia cast6 cbc ccm " - _fipsmodules+="chainiv crc32c crct10dif_generic cryptomgr crypto_null ctr cts deflate des des3_ede dm-crypt dm-mod " + _fipsmodules+="chainiv crc32c crct10dif_generic cryptomgr crypto_null ctr cts deflate des des3_ede dm-crypt dm-mod drbg " _fipsmodules+="ecb eseqiv fcrypt gcm ghash_generic hmac khazad lzo md4 md5 michael_mic rmd128 " _fipsmodules+="rmd160 rmd256 rmd320 rot13 salsa20 seed seqiv serpent sha1 sha224 sha256 sha256_generic " _fipsmodules+="sha384 sha512 sha512_generic tcrypt tea tnepres twofish wp256 wp384 wp512 xeta xtea xts zlib" diff --git a/modules.d/90dm/dm-shutdown.sh b/modules.d/90dm/dm-shutdown.sh index dfdb48b..04c89be 100755 --- a/modules.d/90dm/dm-shutdown.sh +++ b/modules.d/90dm/dm-shutdown.sh @@ -1,11 +1,12 @@ #!/bin/sh _do_dm_shutdown() { - local ret + local ret=0 local final=$1 info "Disassembling device-mapper devices" - dmsetup -v remove_all - ret=$? + for dev in $(dmsetup info -c --noheadings -o name) ; do + dmsetup -v --noudevsync remove "$dev" || ret=$? + done if [ "x$final" != "x" ]; then info "dmsetup ls --tree" dmsetup ls --tree 2>&1 | vinfo diff --git a/modules.d/90dmsquash-live/dmsquash-live-root.sh b/modules.d/90dmsquash-live/dmsquash-live-root.sh index 9c08e94..b632f6a 100755 --- a/modules.d/90dmsquash-live/dmsquash-live-root.sh +++ b/modules.d/90dmsquash-live/dmsquash-live-root.sh @@ -30,6 +30,8 @@ getargbool 0 rd.writable.fsimg -d -y writable_fsimg && writable_fsimg="yes" overlay_size=$(getarg rd.live.overlay.size=) [ -z "$overlay_size" ] && overlay_size=512 +getargbool 0 rd.live.overlay.thin && thin_snapshot="yes" + # CD/DVD media check [ -b $livedev ] && fs=$(blkid -s TYPE -o value $livedev) if [ "$fs" = "iso9660" -o "$fs" = "udf" ]; then @@ -146,7 +148,31 @@ do_live_overlay() { base=$BASE_LOOPDEV over=$OVERLAY_LOOPDEV fi - echo 0 $sz snapshot $base $over p 8 | dmsetup create live-rw + + if [ -n "$thin_snapshot" ]; then + modprobe dm_thin_pool + mkdir /run/initramfs/thin-overlay + + # In block units (512b) + thin_data_sz=$(( $overlay_size * 1024 * 1024 / 512 )) + thin_meta_sz=$(( $thin_data_sz / 10 )) + + # It is important to have the backing file on a tmpfs + # this is needed to let the loopdevice support TRIM + dd if=/dev/null of=/run/initramfs/thin-overlay/meta bs=1b count=1 seek=$((thin_meta_sz)) 2> /dev/null + dd if=/dev/null of=/run/initramfs/thin-overlay/data bs=1b count=1 seek=$((thin_data_sz)) 2> /dev/null + + THIN_META_LOOPDEV=$( losetup --show -f /run/initramfs/thin-overlay/meta ) + THIN_DATA_LOOPDEV=$( losetup --show -f /run/initramfs/thin-overlay/data ) + + echo 0 $thin_data_sz thin-pool $THIN_META_LOOPDEV $THIN_DATA_LOOPDEV 1024 1024 | dmsetup create live-overlay-pool + dmsetup message /dev/mapper/live-overlay-pool 0 "create_thin 0" + + # Create a snapshot of the base image + echo 0 $sz thin /dev/mapper/live-overlay-pool 0 $base | dmsetup create live-rw + else + echo 0 $sz snapshot $base $over p 8 | dmsetup create live-rw + fi # Create a device that always points to a ro base image echo 0 $sz linear $base 0 | dmsetup create --readonly live-base @@ -174,29 +200,6 @@ if [ -n "$OSMINSQFS" ]; then umount -l /run/initramfs/squashfs.osmin fi -# we might have an embedded fs image to use as rootfs (uncompressed live) -if [ -e /run/initramfs/live/${live_dir}/ext3fs.img ]; then - FSIMG="/run/initramfs/live/${live_dir}/ext3fs.img" -elif [ -e /run/initramfs/live/${live_dir}/rootfs.img ]; then - FSIMG="/run/initramfs/live/${live_dir}/rootfs.img" -fi - -if [ -n "$FSIMG" ] ; then - BASE_LOOPDEV=$( losetup -f ) - - if [ -n "$writable_fsimg" ] ; then - # mount the provided fileysstem read/write - echo "Unpacking live filesystem (may take some time)" - unpack_archive $FSIMG /run/initramfs/fsimg/ - losetup $BASE_LOOPDEV /run/initramfs/fsimg/rootfs.img - echo "0 $( blockdev --getsize $BASE_LOOPDEV ) linear $BASE_LOOPDEV 0" | dmsetup create live-rw - else - # mount the filesystem read-only and add a dm snapshot for writes - losetup -r $BASE_LOOPDEV $FSIMG - do_live_from_base_loop - fi -fi - # we might have an embedded fs image on squashfs (compressed live) if [ -e /run/initramfs/live/${live_dir}/${squash_image} ]; then SQUASHED="/run/initramfs/live/${live_dir}/${squash_image}" @@ -217,18 +220,42 @@ if [ -e "$SQUASHED" ] ; then mkdir -m 0755 -p /run/initramfs/squashfs mount -n -t squashfs -o ro $SQUASHED_LOOPDEV /run/initramfs/squashfs - BASE_LOOPDEV=$( losetup -f ) - if [ -f /run/initramfs/squashfs/LiveOS/ext3fs.img ]; then - losetup -r $BASE_LOOPDEV /run/initramfs/squashfs/LiveOS/ext3fs.img - elif [ -f /run/initramfs/squashfs/LiveOS/rootfs.img ]; then - losetup -r $BASE_LOOPDEV /run/initramfs/squashfs/LiveOS/rootfs.img - fi +fi + +# we might have an embedded fs image to use as rootfs (uncompressed live) +if [ -e /run/initramfs/live/${live_dir}/ext3fs.img ]; then + FSIMG="/run/initramfs/live/${live_dir}/ext3fs.img" +elif [ -e /run/initramfs/live/${live_dir}/rootfs.img ]; then + FSIMG="/run/initramfs/live/${live_dir}/rootfs.img" +elif [ -f /run/initramfs/squashfs/LiveOS/ext3fs.img ]; then + FSIMG="/run/initramfs/squashfs/LiveOS/ext3fs.img" +elif [ -f /run/initramfs/squashfs/LiveOS/rootfs.img ]; then + FSIMG="/run/initramfs/squashfs/LiveOS/rootfs.img" +fi - umount -l /run/initramfs/squashfs +if [ -n "$FSIMG" ] ; then + BASE_LOOPDEV=$( losetup -f ) - do_live_from_base_loop + if [ -n "$writable_fsimg" ] ; then + # mount the provided fileysstem read/write + echo "Unpacking live filesystem (may take some time)" + mkdir /run/initramfs/fsimg/ + if [ -n "$SQUASHED" ]; then + cp -v $FSIMG /run/initramfs/fsimg/rootfs.img + else + unpack_archive $FSIMG /run/initramfs/fsimg/ + fi + losetup $BASE_LOOPDEV /run/initramfs/fsimg/rootfs.img + echo "0 $( blockdev --getsize $BASE_LOOPDEV ) linear $BASE_LOOPDEV 0" | dmsetup create live-rw + else + # mount the filesystem read-only and add a dm snapshot for writes + losetup -r $BASE_LOOPDEV $FSIMG + do_live_from_base_loop + fi fi +[ -e "$SQUASHED" ] && umount -l /run/initramfs/squashfs + if [ -b "$OSMIN_LOOPDEV" ]; then # set up the devicemapper snapshot device, which will merge # the normal live fs image, and the delta, into a minimzied fs image diff --git a/modules.d/90lvm/module-setup.sh b/modules.d/90lvm/module-setup.sh index c799a1c..8269078 100755 --- a/modules.d/90lvm/module-setup.sh +++ b/modules.d/90lvm/module-setup.sh @@ -67,6 +67,20 @@ install() { sed -i -e 's/\(^[[:space:]]*\)locking_type[[:space:]]*=[[:space:]]*[[:digit:]]/\1locking_type = 4/' ${initdir}/etc/lvm/lvm.conf sed -i -e 's/\(^[[:space:]]*\)use_lvmetad[[:space:]]*=[[:space:]]*[[:digit:]]/\1use_lvmetad = 0/' ${initdir}/etc/lvm/lvm.conf fi + + export LVM_SUPPRESS_FD_WARNINGS=1 + # Also install any files needed for LVM system id support. + if [ -f /etc/lvm/lvmlocal.conf ]; then + inst_simple -H /etc/lvm/lvmlocal.conf + fi + eval $(lvm dumpconfig global/system_id_source) + if [ "$system_id_source" == "file" ]; then + eval $(lvm dumpconfig global/system_id_file) + if [ -f "$system_id_file" ]; then + inst_simple -H $system_id_file + fi + fi + unset LVM_SUPPRESS_FD_WARNINGS fi if ! [[ -e ${initdir}/etc/lvm/lvm.conf ]]; then diff --git a/modules.d/98systemd/module-setup.sh b/modules.d/98systemd/module-setup.sh index 51ea288..761349f 100755 --- a/modules.d/98systemd/module-setup.sh +++ b/modules.d/98systemd/module-setup.sh @@ -176,7 +176,11 @@ install() { # install adm user/group for journald inst_multiple nologin egrep '^systemd-journal:' "$initdir/etc/passwd" 2>/dev/null >> "$initdir/etc/passwd" + egrep '^wheel:' "$initdir/etc/passwd" 2>/dev/null >> "$initdir/etc/passwd" + egrep '^adm:' "$initdir/etc/passwd" 2>/dev/null >> "$initdir/etc/passwd" egrep '^systemd-journal:' /etc/group >> "$initdir/etc/group" + egrep '^wheel:' /etc/group >> "$initdir/etc/group" + egrep '^adm:' /etc/group >> "$initdir/etc/group" ln_r $systemdutildir/systemd "/init" ln_r $systemdutildir/systemd "/sbin/init" diff --git a/modules.d/99base/dracut-lib.sh b/modules.d/99base/dracut-lib.sh index 5c1504f..079c9a2 100755 --- a/modules.d/99base/dracut-lib.sh +++ b/modules.d/99base/dracut-lib.sh @@ -1286,8 +1286,8 @@ show_memstats() remove_hostonly_files() { rm -fr /etc/cmdline /etc/cmdline.d/*.conf if [ -f /lib/dracut/hostonly-files ]; then - while read line; do - [ -e "$line" ] || continue + while read -r line; do + [ -e "$line" ] || [ -h "$line" ] || continue rm -f "$line" done < /lib/dracut/hostonly-files fi