# sys-fs/lvm2-2.02.103 broke my boot

## KShots

Hey all,

After updating to sys-fs/lvm2-2.02.103 (don't know which version I was using previous, apparently no records are kept for updates), my system no longer boots. Specifically, my system fails to produce device nodes under /dev/mapper/. Oddly enough, when I manually step through what my boot script does, the nodes _are_ created. e.g., when boot fails, my initrd automatically dumps me to a recovery shell in the initrd environment. When I execute the following:

```
vgscan --mknodes --ignorelockingfailure
```

... nodes are created successfully, which allows me to mount my separate /usr on lvm (root is on a standard device node), unmount /proc, /dev, and /sys, and execute a switch_root /newroot /sbin/init. Failing to execute the vgscan with the --mknodes parameter means that there are no nodes. vgchange -a y does not create them, and no other lvm command I am aware of will create them. What gives?

I should note that I have foolishly updated my 3 servers and my desktop with this update, and none of these systems will boot without manual intervention.

----------

## KShots

Ok, I've been able to fix my init-script (at least on one machine) with the following:

```
while [ ! -b /dev/mapper/vg-usr ] ; do

   vgscan --mknodes --ignorelockingfailure

done
```

As you can see, this is just plain stupid. It's an infinite loop to re-run the same command over and over until it works. And the sad thing is, it does. I'll probably modify the routine above for my more generic machines (look for a file under /dev/mapper that is block special and is not 'control', and if not found, re-run the command over and over). Surely there is a better way of doing this. How did other people fix their broken systems?

----------

## frostschutz

I'd love to tell you, only problem is, mine didn't break.

```

lvm> version

  LVM version:     2.02.103(2) (2013-10-04)

  Library version: 1.02.82 (2013-10-04)

  Driver version:  4.26.0

```

But I don't have separate /usr either (I got rid of it as soon as the usr problems started, not worth the hassle when the root partition is mostly empty/useless anyhow).

----------

## KShots

For now, I've fixed it by changing from a custom initramfs to using dracut. It works on my laptop, don't know if it will work on my more complex machines (I have one with lvm root on top of dm-crypt, not sure if dracut can make the cut on that one). It's significantly slower this way - dracut by definition is going to be slower given that it's an initrd rather than an initramfs - it's loaded after the kernel finishes initializing rather than early on. Another side-effect is that my uvesafb gets loaded really late this way, so if something goes wrong with the kernel I only have about 24 lines of large text to try and figure out what happened. All in all, I'm rather disappointed with being forced down this road  :Sad: .

Best I can gather, apparently lvm is now more closely tied into udev, and as I don't have udev actually running in my initramfs (I just mount /dev as devtmpfs), lvm commands are unreliable. I also took this opportunity to migrate my laptop from openrc to systemd, and apparently dracut puts systemd itself right into the initrd, making it even more closely linked to things like lvm and dm-crypt. I don't think it's possible anymore to maintain an initramfs unless you have simple block devices. I know dracut does it, but attempting to figure out _how_ it does it is not straight-forward. I did find that the init script that dracut uses is not in fact a script, but rather a compiled executable (cat /init in emergency shell comes up with unprintable garbage), so it probably has some library calls to make things happen properly rather than any actual commands being called, making a script that does similar tasks impossible.

----------

## frostschutz

 *KShots wrote:*   

> Best I can gather, apparently lvm is now more closely tied into udev, and as I don't have udev actually running in my initramfs (I just mount /dev as devtmpfs), lvm commands are unreliable.

 

Please show us what your Initramfs looks like. I use a custom Initramfs myself, without udev.

Did you update the LVM binary in Initramfs as well? (I did.)

```

#!/bin/busybox sh

rescue_shell() {

    echo "Something went wrong. Dropping you to a shell."

    busybox --install -s

    exec /bin/sh

}

# Prepare

mount -t devtmpfs none /dev

mount -t proc none /proc

mount -t sysfs none /sys

echo 0 > /proc/sys/kernel/printk

# Assemble RAID:

( sleep 2

  mdadm --assemble --scan > /dev/null

  sleep 2

) &

# Unlock Key

cryptsetup luksOpen --header /root/key.luks /root/key KEY

wait # for mdadm

# Unlock SSD

cryptsetup luksOpen --allow-discards --key-file=/dev/mapper/KEY --keyfile-offset=0 --keyfile-size=512 `findfs UUID="ae797aa3-83af-4f5d-9f87-9461044d7fd9"` luksSSD1 &

# Unlock HDD

for i in 1 2 3 4 5 6 7 8

do

    cryptsetup luksOpen --key-file=/dev/mapper/KEY --keyfile-offset=$(($i*512)) --keyfile-size=512 /dev/md"$i" luksHDD"$i" &

done

wait # for cryptsetup

# LVM

lvm lvchange -a y SSD/root

# Mount Root

mount -o ro `findfs UUID="fa15678f-7e7e-4a47-8ed2-7cea7a5d037d"` /mnt/root || rescue_shell 

# Clean up

cryptsetup luksClose KEY

echo 1 > /proc/sys/kernel/printk

umount /dev /proc /sys

# Switcheroo

exec switch_root /mnt/root /sbin/init

```

----------

## KShots

 *frostschutz wrote:*   

> Please show us what your Initramfs looks like. I use a custom Initramfs myself, without udev.

 No problem. Hopefully it will fit here, mine's pretty generic so I can use the same script across all my systems:

```
#!/bin/ash

# optional arguments: real_init= real_root= crypted_device= real_usr= verbose

INIT=

NEWROOT=/newroot

VERBOSE=no

START_SHELL=no

FORCE_FSCK=no

SLEEP=0

FSCK_ROOT_RESULT=

INIT_SYSTEMD=no

verbose() {

        [ "x${VERBOSE}" = "xyes" ] && echo " * $@"

}

do_sleep() {

        verbose "Sleeping for \"${SLEEP}\" second\(s\)"

        [ ${SLEEP} -gt 0 ] && sleep "${SLEEP}"

}

die() {

        verbose "Dying"

        [ $# -ne 0 ] && echo "$@"

        # Try to find a minimal shell

        #setsid busybox sh -c 'exec /bin/ash </dev/tty1 >/dev/tty1 2>&1'

        /bin/busybox --install -s

        exec /bin/sh

        echo "FATAL ERROR: Could not even die elegantly"

        echo "trying to reboot in ${SLEEP} seconds"

        do_sleep

        /bin/reboot -f

}

do_uuidlabel() {

        local FS_SRC=$(awk "{fs_src[x++]=\$1}END{print fs_src[$1]}" /fs_src) FS_REALSRC=

        verbose "Looking for a UID or label for ${FS_SRC} at index $1"

        local fstype=${FS_SRC%%=*}

        if [ ${fstype} = "LABEL" ] || [ ${fstype} = "UUID" ] ; then

                echo "${FS_SRC} $(findfs ${FS_SRC})" >> /fs_realsrc

                FS_REALSRC=$(awk "{fs_realsrc[\$1]=\$2}END{print fs_realsrc[\"${FS_SRC}\"]}" /fs_realsrc)

                verbose "FS at index $1 translated from ${FS_SRC} to ${FS_REALSRC}"

        else

                echo "${FS_SRC} ${FS_SRC}" >> /fs_realsrc

                verbose "FS at index $1 has no UUID or LABEL to translate from (${FS_SRC})"

        fi

}

do_parse_kernel() {

        echo " * Parsing kernel line"

        local CMD

        for CMD in `cat /proc/cmdline` ; do

                case "${CMD}" in

                        crypted_device=*)

                                CRYPTED_DEVICE="${CMD#crypted_device=}"

                                ;;

                        real_init=*)

                                INIT="${CMD#real_init=}"

                                ;;

                        fs_src=*)

                                echo ${CMD#fs_src=} >> /fs_src

                                ;;

                        fs_dst=*)

                                echo ${CMD#fs_dst=} >> /fs_dst

                                ;;

                        fs_type=*)

                                echo ${CMD#fs_type=} >> /fs_type

                                ;;

                        fs_args=*)

                                echo ${CMD#fs_args=} >> /fs_args

                                ;;

                        initramfs_verbose)

                                VERBOSE=yes

                                ;;

                        initramfs_startsh)

                                START_SHELL=yes

                                ;;

                        forcefsck)

                                FORCE_FSCK=yes

                                ;;

                        init_systemd)

                                INIT_SYSTEMD=yes

                                ;;

                        sleep=*)

                                SLEEP="${CMD#sleep=}"

                                ;;

                esac

        done

        return 0

}

do_dev() {

        verbose "Mounting devtmpfs filesystem on /dev"

        mount -t devtmpfs devtmpfs /dev || die "Failed mounting devtmpfs file system on /dev"

        [ -x /sbin/udevd ] && /sbin/udevd --daemon --resolve-names=never

        [ -x /usr/lib/systemd/systemd-udevd ] && /usr/lib/systemd/systemd-udevd --daemon --resolve-names=never

        if [ -x /sbin/udevadm ] ; then

                /sbin/udevadm trigger

                /sbin/udevadm settle

        fi

        return 0

}

do_cryptsetup() {

        if [ x"${CRYPTED_DEVICE}" != "x" ] ; then

                verbose "Opening encrypted device"

                cryptsetup luksOpen ${CRYPTED_DEVICE} vault

        else

                die "Need to define an encrypted device by passing crypted_device= kernel parameter"

        fi

        return 0

}

do_lvm() {

        verbose "Enable LVM2 support"

        while [ ! -b /dev/mapper/vg-usr ] ; do

                if [ "x${VERBOSE}" != "x" ] ; then

                        vgscan --mknodes --ignorelockingfailure || die "vgscan failed"

                        vgchange --sysinit -a y vg || die "vgchange failed"

                else

                        vgscan --mknodes --ignorelockingfailure >/dev/null 2>&1 || die "vgscan failed"

                        vgchange --sysinit -a y vg >/dev/null 2>&1 || die "vgchange failed"

                fi

        done

        verbose "Finished LVM"

        return 0

}

do_fsck() {

        # most of code coming from /etc/init.d/fsck

        local fsck_opts= check_extra= RC_UNAME=$(uname -s) result=

        if [ x"${FORCE_FSCK}" = x"yes" ] ; then

                fsck_opts="${fsck_opts} -f"

                check_extra="(check forced)"

        fi

        echo "Checking local filesystem ${check_extra} : $1"

        if [ "${RC_UNAME}" = "Linux" ] ; then

                fsck_opts="${fsck_opts} -C0 -T"

        fi

        trap : INT QUIT

        # using our own fsck, not the builtin one from busybox

        /sbin/fsck -p ${fsck_opts} $1

        result=$?

        if [ $2 -eq 1 ] ; then

                FSCK_ROOT_RESULT=${result}

        fi

        case ${result} in

                0)      return 0;;

                1)      echo "Filesystem repaired"; return 0;;

                2|3)    if [ "${RC_UNAME}" = "Linux" ] ; then

                                echo "Filesystem repaired, by reboot needed"

                                do_sleep

                                reboot -f

                        else

                                die "Filesystem still has errors; manual fsck required"

                        fi;;

                4)      if [ "${RC_UNAME}" = "Linux" ] ; then

                                die "Filesystem errors left uncorrected, aborting"

                        else

                                echo "Filesystem repaired, but reboot needed"

                                reboot

                        fi;;

                8)      echo "Operational error"; return 0;;

                12)     echo "fsck interrupted";;

                *)      echo "Filesystem couldn't be fixed";;

        esac

        die

}

do_switch() {

        verbose "Switching / to ${NEWROOT}"

        #[ ! -c "${NEWROOT}/dev/console" ] && mknod "${NEWROOT}/dev/console" c 5 1 || die "Failed to create ${NEWROOT}/dev/console"

        #[ ! -c "${NEWROOT}/dev/null" ] && mknod "${NEWROOT}/dev/null" c 1 3 || die "Failed to create ${NEWROOT}/dev/null"

        echo > /proc/sys/kernel/hotplug

        verbose "Unmounting /sys"

        umount /sys || umount -l /sys

        verbose "Unmounting /proc"

        umount /proc || umount -l /proc

        verbose "Unmounting /dev"

        umount /dev || umount -l /dev

        verbose "exec switch_root ${NEWROOT} ${INIT} ${INIT_ARGS}"

        exec /bin/switch_root ${NEWROOT} ${INIT}

}

do_fs() {

        verbose "Mountint filesystems"

        local is_root= FS_TYPE= FS_ARGS= FS_REALSRC= FS_DST= lines=

        let lines=$(wc -l /fs_src | tr -d ' /fs_rc')-1

        for m in $(seq 0 ${lines}) ; do

                verbose "Mounting filesystem number ${m}"

                let is_root=0

                FS_DST=$(awk "{fs_dst[x++]=\$1}END{print fs_dst[${m}]}" /fs_dst)

                verbose "FS_DST at index ${m} is \"${FS_DST}\""

                FS_TYPE=$(awk "{fs_type[x++]=\$1}END{print fs_type[${m}]}" /fs_type)

                verbose "FS_TYPE at index ${m} is \"${FS_TYPE}\""

                FS_ARGS=$(awk "{fs_args[x++]=\$1}END{print fs_args[${m}]}" /fs_args)

                verbose "FS_ARGS at index ${m} are \"${FS_ARGS}\""

                [ -n "${FS_ARGS}" ] && FS_ARGS="-o ${FS_ARGS}"

                [ "${FS_DST}" = "/" ] && let is_root=1

                do_uuidlabel ${m}

                FS_SRC=$(awk "{fs_src[x++]=\$1}END{print fs_src[${m}]}" /fs_src)

                verbose "FS_SRC at index ${m} is \"${FS_SRC}\""

                FS_REALSRC=$(awk "{fs_realsrc[\$1]=\$2}END{print fs_realsrc[\"${FS_SRC}\"]}" /fs_realsrc)

                verbose "FS_REALSRC at index ${m} is \"${FS_REALSRC}\""

                [ -z ${FS_REALSRC} ] && die "Could not find file system for fs_src=\"${FS_SRC}\""

                verbose "For filesystem at index ${m}, src=\"${FS_SRC}\", realsrc=\"${FS_REALSRC}\", dst=\"${FS_DST}\", type=\"${FS_TYPE}\", args=\"${FS_ARGS}"\"

                do_fsck ${FS_REALSRC} ${is_root}

                /bin/mount -t ${FS_TYPE} ${FS_ARGS} "${FS_REALSRC}" "${NEWROOT}${FS_DST}" || die "Failed to mount \"${FS_REALSRC}\" to \"${FS_DST}\" (type=\"${FS_TYPE}\") (args=\"${FS_ARGS}\")"

                if [ ${is_root} -eq 1 ] && [ ${INIT_SYSTEMD} = "yes" ] ; then

                        mount -o mode=755,nodev -t tmpfs none "${NEWROOT}"/run || die "mount /run"

                        mkdir "${NEWROOT}"/run/initramfs || die "Failed to mkdir ${NEWROOT}/run/initramfs"

                        echo ${FSCK_ROOT_RESULT} >"${NEWROOT}"/run/initramfs/root-fsck

                        for x in bin dev etc proc sbin sys tmp ; do

                                mkdir "${NEWROOT}"/run/initramfs/"${x}" || die "Failed to mkdir ${x} in initramfs shutdown"

                        done

                        for x in cryptsetup lvm ; do

                                [ -x /sbin/"${x}" ] && cp /sbin/"${x}" "${NEWROOT}"/run/initramfs/sbin/"${x}" || die "Failed to copy \"${x}\" to initramfs shutdown"

                        done

                        cp /bin/busybox "${NEWROOT}"/run/initramfs/bin/busybox || die "Failed to copy busybox to initramfs shutdown"

                        for x in ash cat cp ls mkdev mknod mount mv reboot setsid sh sleep switch_root umount uname ; do

                                ln busybox "${NEWROOT}"/run/initramfs/bin/"${x}" || die "Failed to link \"${x}\" to busybox in initramfs shutdown"

                        done

                        cp /shutdown "${NEWROOT}"/run/initramfs/shutdown || die "Failed to copy shutdown executable to initramfs shutdown"

                fi

        done

}

main() {

        [ -x /sbin/systemd-timestamp ] && export RD_TIMESTAMP=`/sbin/systemd-timestamp`

        local fs=

        echo " * kshots initramfs"

        mount -t proc proc /proc || die "mount /proc"

        umask 0077

        mount -t sysfs sysfs /sys || die "mount /sysfs"

        do_parse_kernel

        do_dev

        if [ x"${START_SHELL}" = "xyes" ] ; then

                verbose "Starting a shell"

                busybox --install -s

                exec /bin/sh

        fi

        [ -x /sbin/cryptsetup ] && do_cryptsetup

        [ -x /sbin/vgchange ] && do_lvm

        do_fs

        do_switch

}

main

die
```

 *frostschutz wrote:*   

> Did you update the LVM binary in Initramfs as well? (I did.)

 Yep - I maintain an imanifest file that pulls in LVM every time I build my kernel (and I rebuilt my kernel many times to test after lvm broke). Here is my imanifest file:

```
# initramfs makefile

# empty dirs

dir     /root   0755    0       0

dir     /proc   0755    0       0

dir     /run    0755    0       0

dir     /sys    0755    0       0

dir     /tmp    1755    0       0

# dev

dir     /dev    0755    0       0

dir     /dev/vc 0755    0       0

nod     /dev/console    0600 0 0 c 5 1

nod     /dev/mem        0600 0 0 c 1 1

nod     /dev/null       0600 0 0 c 1 3

nod     /dev/tty        0600 0 0 c 4 64

nod     /dev/tty1       0600 0 0 c 4 1

nod     /dev/zero       0600 0 0 c 1 5

slink   /dev/vc/0       ../console      0777 0 0

# init

file    /init   /root/kerninit.sh       0700    0       0

# bin

dir     /bin    0755    0       0

file    /bin/busybox    /bin/busybox    0755    0       0       bin/ash bin/awk bin/cat bin/chroot bin/cp bin/echo bin/findfs bin/ln bin/ls bin/mdev bin/mkdir bin/mount bin/mv bin/reboot bin/seq bin/sh bin/sleep bin/switch_root bin/tr bin/umount bin/uname bin/wc

# etc

dir     /etc    0755    0       0

slink   /etc/mtab       /dev/null       0777    0       0

dir     /etc/splash     0755    0       0

dir     /etc/splash/natural-gentoo      0755    0       0

dir     /etc/splash/natural-gentoo/images       0755    0       0

#dir    /etc/udev       0755    0       0

#dir    /etc/udev/rules.d       0755    0       0

file    /etc/splash/luxisri.ttf /etc/splash/luxisri.ttf 0644    0       0

file    /etc/splash/natural-gentoo/1280x800.cfg /etc/splash/natural-gentoo/1280x800.cfg 0644    0       0

file    /etc/splash/natural-gentoo/images/silent-1280x800.jpg   /etc/splash/natural-gentoo/images/silent-1280x800.jpg   0644    0       0

file    /etc/splash/natural-gentoo/images/verbose-1280x800.jpg  /etc/splash/natural-gentoo/images/verbose-1280x800.jpg  0644    0       0

#file   /etc/udev/udev.conf     /etc/udev/udev.conf     0600 0 0

#file   /etc/udev/rules.d/51-android.rules      /etc/udev/rules.d/51-android.rules      0400 0 0

#file   /etc/udev/rules.d/70-my-net.rules       /etc/udev/rules.d/70-my-net.rules       0400 0 0

#file   /etc/udev/rules.d/80-net-name-slot.rules        /etc/udev/rules.d/80-net-name-slot.rules        0400 0 0

#file   /etc/udev/rules.d/99-mouse.rules        /etc/udev/rules.d/99-mouse.rules0400 0 0

# systemd stuff

#dir    /usr                    0755 0 0

#dir    /usr/lib                0755 0 0

#dir    /usr/lib/systemd        0755 0 0

#file   /usr/lib/systemd/systemd-udevd /usr/lib/systemd/systemd-udevd   0700 0 0

# lib64

dir     /lib64  0755    0       0

dir     /lib64/splash   0755    0       0

dir     /lib64/splash/proc      0755    0       0

dir     /lib64/splash/sys       0755    0       0

file    /lib64/ld-linux-x86-64.so.2     /lib64/ld-linux-x86-64.so.2     0755 0 0

file    /lib64/libacl.so.1      /lib64/libacl.so.1      0755 0 0

file    /lib64/libattr.so.1     /lib64/libattr.so.1     0755 0 0

file    /lib64/libblkid.so.1    /lib64/libblkid.so.1    0755 0 0

file    /lib64/libc.so.6        /lib64/libc.so.6        0755 0 0

file    /lib64/libcom_err.so.2  /lib64/libcom_err.so.2  0755 0 0

file    /lib64/libdevmapper.so.1.02     /lib64/libdevmapper.so.1.02     0755 0 0

file    /lib64/libdevmapper-event.so.1.02       /lib64/libdevmapper-event.so.1.02       0755 0 0

file    /lib64/libdl.so.2       /lib64/libdl.so.2       0755 0 0

file    /lib64/libe2p.so.2      /lib64/libe2p.so.2      0755 0 0

file    /lib64/libext2fs.so.2   /lib64/libext2fs.so.2   0755 0 0

file    /lib64/libkmod.so.2     /lib64/libkmod.so.2     0755 0 0

file    /lib64/liblzma.so.5     /lib64/liblzma.so.5     0755 0 0

file    /lib64/libmount.so.1    /lib64/libmount.so.1    0755 0 0

file    /lib64/libncurses.so.5  /lib64/libncurses.so.5  0755 0 0

file    /lib64/libpthread.so.0  /lib64/libpthread.so.0  0755 0 0

file    /lib64/libreadline.so.6 /lib64/libreadline.so.6 0755 0 0

file    /lib64/librt.so.1       /lib64/librt.so.1       0755 0 0

file    /lib64/libudev.so.1     /usr/lib64/libudev.so.1 0755 0 0

file    /lib64/libuuid.so.1     /lib64/libuuid.so.1     0755 0 0

file    /lib64/libz.so.1        /lib64/libz.so.1        0755 0 0

# sbin

dir     /sbin   0755    0       0

file    /sbin/fbcondecor_helper /sbin/fbcondecor_helper 0755    0       0      sbin/splash_helper

file    /sbin/v86d      /sbin/v86d      0755    0       0

file    /sbin/lvm       /sbin/lvm       0755    0       0       sbin/vgchange sbin/vgscan

file    /sbin/fsck      /sbin/fsck      0755 0 0

file    /sbin/fsck.ext4 /sbin/fsck.ext4 0755 0 0

#file   /sbin/udevd     /sbin/udevd     0755 0 0

#file   /sbin/udevadm   /usr/bin/udevadm        0755 0 0

# newroot

dir     /newroot        0700    0       0
```

Basically, the goal of this init script was to be generic enough that all necessary partitions to mount could be passed in via grub as kernel command-line parameters. For example, to boot my laptop, I used the following kernel command line:

```
kernel /boot/kernel-3.10.17 fs_src=UUID=999e9bb0-70f1-4507-bf9c-f2566d3c9750 fs_src=/dev/mapper/vg-usr fs_type=ext4 fs_type=ext4 fs_dst=/ fs_dst=/usr fs_args=noatime fs_args=noatime initramfs_verbose video=uvesafb:1280x800-32,mtrr:2,ywrap console=tty1 splash=silent,fadein,theme:natural-gentoo real_init=/sbin/init
```

The order is important - fs_src, fs_type, fs_args, and fs_dst must all be "paired" together (the first instance of each is matched, the second instance of each is matched, and so on for however many file systems need to be mounted prior to booting). This has worked flawlessly for years until the latest lvm release.

----------

## KShots

Comparing the two, yours may be working because you are waiting (before and after calling mdadm), which is essentially what I am doing with my infinite loop checking /dev/mapper/vg-usr. I've never had to wait before, and I think there has to be a better (and more consistent) way.

----------

## frostschutz

Actually the most wait happens as I need to type a passphrase which takes a while. mdadm just waits in the background because I had one case where a disk was slow to be available.

I don't see anything obvious wrong with your Initramfs. The only other thing that's different is that I enable only the root partition, not the entire VG. The other LVs will be enabled by the regular init scripts.

----------

## KShots

Hmm... in that case, then the machine I'm most worried about might work reasonably well. I have one machine that does use dm-crypt, and it will wait for me to type in a password. It will do this before trying anything with lvm (lvm is on top of dm-crypt), so if the problem is delay-related, I should have little to nothing to worry about on that machine. All my other machines, however, are affected.

I guess I'll try dracut on the most complicated machine and see what happens. If it works, I might give up trying to maintain my own initramfs (which is a pity, it was becoming quite versatile and fast).

----------

## frostschutz

maybe stracing the lvm call that fails would be worth while. if there's a bug in lvm it should be fixed after all.

I'd rather put an old LVM into Initramfs (who cares, right?) than switch to one of the generators.

----------

## KShots

Yeah, maybe. I'd have to put strace into my initramfs on one of my machines that has a serial console (so I can record the output), but that's doable. Turns out I can't use dracut on my desktop machine. For whatever reason, the layout there is unbootable for dracut (simple LVM with /usr on lvm, root on normal partition as ext4). Got it working for my laptop with a similar setup... maybe it doesn't like that I have multiple volume groups on my desktop, and that one of those volume groups has dm-crypt on top of it? It shouldn't need to dm-crypt vg at all for booting, but I can't convince the dracut initrd to pause or log anything, so I really have no idea what's going on in there. It looks like it claims success and moves on to systemd on root, without mounting /usr, which of course causes systemd to not work properly. Therefore, the emergency shell never gets started (initrd reports success without being successful), and systemd never gives me an emergency shell either (no /usr), and from what I've read, there's no means of forcing dracut's initrd to get into a shell if it doesn't think anything failed.

I was willing to try one of the generators if I could get it to generate something that works across all my environments, and I have some pretty tough environments to get working. If I can't, then I really have to get the initramfs working. I'm also a bit worried because I'm also trying to migrate to systemd now (I have one machine where the audio simply wouldn't work until I migrated - I had given up on audio since May, and suddenly it started working on my laptop when I started systemd a couple days back. Lots of other people have the same issue with this laptop, but as far as I'm aware nobody else has the audio working - I posted what I did to get it working in the hopes it helps someone, though I wish I understood what systemd was doing differently so I could get it working under whatever system I wanted to work under). Given problems like that, I question whether there is any degree of support for non-systemd systems, or whether things will continue to be broken left and right in anything not systemd.

----------

