Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
sys-fs/lvm2-2.02.103 broke my boot
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Kernel & Hardware
View previous topic :: View next topic  
Author Message
KShots
Guru
Guru


Joined: 09 Oct 2003
Posts: 443
Location: Florida

PostPosted: Mon Nov 18, 2013 11:27 pm    Post subject: sys-fs/lvm2-2.02.103 broke my boot Reply with quote

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:
Code:
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.
_________________
Life without passion is death in disguise
Back to top
View user's profile Send private message
KShots
Guru
Guru


Joined: 09 Oct 2003
Posts: 443
Location: Florida

PostPosted: Tue Nov 26, 2013 2:46 pm    Post subject: Reply with quote

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

Code:
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?
_________________
Life without passion is death in disguise
Back to top
View user's profile Send private message
frostschutz
Advocate
Advocate


Joined: 22 Feb 2005
Posts: 2585
Location: Germany

PostPosted: Tue Nov 26, 2013 11:20 pm    Post subject: Reply with quote

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

Code:

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).
Back to top
View user's profile Send private message
KShots
Guru
Guru


Joined: 09 Oct 2003
Posts: 443
Location: Florida

PostPosted: Wed Nov 27, 2013 2:10 pm    Post subject: Reply with quote

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 :(.

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.
_________________
Life without passion is death in disguise
Back to top
View user's profile Send private message
frostschutz
Advocate
Advocate


Joined: 22 Feb 2005
Posts: 2585
Location: Germany

PostPosted: Wed Nov 27, 2013 3:07 pm    Post subject: Reply with quote

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.)

Code:

#!/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
Back to top
View user's profile Send private message
KShots
Guru
Guru


Joined: 09 Oct 2003
Posts: 443
Location: Florida

PostPosted: Wed Nov 27, 2013 4:06 pm    Post subject: Reply with quote

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:
Code:
#!/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:
Code:
# 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:
Code:
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.
_________________
Life without passion is death in disguise
Back to top
View user's profile Send private message
KShots
Guru
Guru


Joined: 09 Oct 2003
Posts: 443
Location: Florida

PostPosted: Wed Nov 27, 2013 4:33 pm    Post subject: Reply with quote

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.
_________________
Life without passion is death in disguise
Back to top
View user's profile Send private message
frostschutz
Advocate
Advocate


Joined: 22 Feb 2005
Posts: 2585
Location: Germany

PostPosted: Wed Nov 27, 2013 5:38 pm    Post subject: Reply with quote

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.
Back to top
View user's profile Send private message
KShots
Guru
Guru


Joined: 09 Oct 2003
Posts: 443
Location: Florida

PostPosted: Wed Nov 27, 2013 6:11 pm    Post subject: Reply with quote

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).
_________________
Life without passion is death in disguise
Back to top
View user's profile Send private message
frostschutz
Advocate
Advocate


Joined: 22 Feb 2005
Posts: 2585
Location: Germany

PostPosted: Wed Nov 27, 2013 7:58 pm    Post subject: Reply with quote

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.
Back to top
View user's profile Send private message
KShots
Guru
Guru


Joined: 09 Oct 2003
Posts: 443
Location: Florida

PostPosted: Fri Nov 29, 2013 4:34 pm    Post subject: Reply with quote

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.
_________________
Life without passion is death in disguise
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Kernel & Hardware All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum