Re: Regarding: wmlive and empty fstab
On 06/09/2012 10:24 PM, Geert Stappers wrote:
> But it doesn't work this way. And frankly, this E-mail I writting now
> (the one you are reading now) does neither any work.
>
Yes, you are definitely right, and i sincerely hope to be pardoned for
for being so shortsighted!
> However, I volunteer to do work that could AND SHOULD have been avoided.
>
To save you the hassle, i have attached the mentioned script to this
very mail.
Hope it helps!
Best regards,
Paul
#!/bin/sh
if [ "$1" = "-d" ]
then
set -x
fi
# Copyright (C) 2011 by Paul Seelig <wmlive@rumbero.org>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Make sure to exclude running under any locale other than C:
export LC_ALL=C
if [ ! "$(/usr/bin/whoami)" = "root" ]; then
echo "Sorry, only root can do this"
exit 0
fi
DEBTARGET="/live/installer/target"
copy_missing_vardirs ()
{
# working around a debian-installer copying omission:
[ -d "$DEBTARGET" ] && for VARDIR in /var/*
do
if [ ! -d "$DEBTARGET$VARDIR" ]
then
# Copying the missing "$VARDIR" directories:
cp -a "$VARDIR" "$DEBTARGET"/var
fi
done
# Cleaning up the copied system dirs from old unrelated content:
rm -rf "$DEBTARGET"/var/mail/* "$DEBTARGET"/tmp/*
rm -f "$DEBTARGET"/var/log/*/* "$DEBTARGET"/var/log/* > /dev/null 2>&1
}
if [ -d "$DEBTARGET" ] && [ "$(mount | grep -c "on $DEBTARGET type")" = "1" ]
then
copy_missing_vardirs
echo "$0" > "$DEBTARGET"/root/.wmliverc
chroot "$DEBTARGET" /bin/bash --rcfile /root/.wmliverc -i
elif [ "$(mount | grep -c "aufs on / type aufs")" = "1" ]
then
cat << EOF
You are executing this command on the Live CD environment,
with no "$DEBTARGET" target directory being present.
Therefore we simply quit without any further action.
EOF
exit 1
fi
wmlive_installer_removal ()
{
if [ -f /usr/share/applications/debian-installer-launcher.desktop ]
then
cat << EOF
Removing unnecessary packages and updating the initramfs image...
(depending on your system's CPU speed, this will take some time)
EOF
apt-get --yes --purge remove live-config live-config-sysvinit live-boot live-boot-initramfs-tools debian-installer-launcher
fi
}
wmlive_luks_initramfs ()
{
cat << EOF
Correcting the missing LUKS configuration
Updating the initramfs image with the LUKS boot information...
(depending on your system's CPU speed, this will take some time)
EOF
update-initramfs -k all -u > /dev/null 2>&1
}
grub_success_msg ()
{
cat << EOF
Congratulations, grub-installation has successfully completed!
EOF
}
grub_failure_msg ()
{
cat << EOF
Something unpredicted has happened, and this script has failed!
Please copy the script output from the terminal window into a file,
and send it to wmlive@users.sf.net for troubleshooting assistance.
EOF
exit 1
}
fix_complete_exit ()
{
if [ ! "$(mount | grep -c "on $DEBTARGET type")" = "1" ] && [ ! "$(mount | grep -c "aufs on / type aufs")" = "1" ]
then
kill -9 $PPID > /dev/null 2>&1
fi
}
wmlive_mkfstab ()
{
cat > /etc/fstab << MKFSTABFIRST
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
$(mount | grep "on / type" | awk '{print $1, $3, $5}') defaults,noacl,noatime,nodiratime 0 1
tmpfs /tmp tmpfs size=512m 0 0
proc /proc proc defaults 0 0
MKFSTABFIRST
for mntdev in $(mount | grep ^/dev | grep -v ^/dev/sr0 | grep -v "on / type" | awk '{print $1}')
do
echo "$(mount | grep $mntdev | awk '{print $1, $3, $5}') defaults,noacl,noatime,nodiratime 0 2" >> /etc/fstab
done
cat >> /etc/fstab << MKFSTABSECOND
/dev/sr0 /media/cdrom auto ro,user,noauto 0 0
MKFSTABSECOND
chmod 644 /etc/fstab
}
if [ ! "$(mount | grep -c "aufs on / type aufs")" = "1" ]
then
if [ ! -d /var/tmp ]
then
echo ""
echo "Creating the missing /var/tmp directory"
mkdir -m 1777 /var/tmp
else
chmod 1777 /var/tmp
fi
# Cleaning /etc/apt/sources.list from live-build approx entries:
if [ ! "$(grep "deb http://192.168" /etc/apt/sources.list | grep -c ":9999")" = "0" ]
then
TMPFILE=$(mktemp --tmpdir=/tmp)
grep -v "deb http://192.168" /etc/apt/sources.list > $TMPFILE &&\
cat $TMPFILE > /etc/apt/sources.list
fi
if [ ! "$(grep "deb http://192.168" /etc/apt/sources.list.d/wmlive.list | grep -c ":9999")" = "0" ]
then
TMPFILE=$(mktemp --tmpdir=/tmp)
grep -v "deb http://192.168" /etc/apt/sources.list.d/wmlive.list > $TMPFILE &&\
cat $TMPFILE > /etc/apt/sources.list.d/wmlive.list
fi
# For a LUKS based LVM setup, create a proper initramfs configuration entry:
if [ ! "$(blkid | grep -c TYPE=\"crypto_LUKS\")" = "0" ]
then
echo ""
export LUKSCONFIG=/etc/initramfs-tools/conf.d/cryptroot
if [ ! -s $LUKSCONFIG ]
then
# The 'target=' specifier can be any name, using alphanumeric characters only.
# 'source=' specifies the disk partition UUID used as physical volume for LVM.
# 'lvm=' specifies the name of the logical volume used as the root file system.
# Adding comments to the file breaks it's function, so better don't add any.
export LUKSROOTDEV=$(basename $(mount | grep "on / type" | awk '{print $1}'))
export LUKSUUID=$(blkid | grep -m1 TYPE=\"crypto_LUKS\" | awk '{print $2}' | tr -d \")
cat > $LUKSCONFIG << EOF
target=luks,source=$LUKSUUID,key=none,lvm=$LUKSROOTDEV
EOF
fi
# The presence of /etc/crypttab only produces useless error messages,
# and it also doesn't belong to any valid package, so just remove it:
[ -f /etc/crypttab ] && rm -f /etc/crypttab
# Removing the live-boot-initramfs-tools also includes updating initramfs
# so we take advantage of this to prevent initramfs from being built twice,
# but will better leave an alternative option in case of failure as fallback:
wmlive_installer_removal || wmlive_luks_initramfs
fi
if [ ! -s /boot/grub/grub.cfg ]
then
echo ""
echo "Continuing to fix the broken grub installation now:"
echo ""
# checking whether /boot resides on its own partition:
if [ "$(mount | grep /boot | grep -c ^/dev/sd)" = "1" ] && [ ! "$(/bin/ls -1A /boot/ | wc -l)" = "0" ]
then
echo "OK, /boot resides on its own partition..."
echo ""
echo "Writing grub to the master boot record of the hard disk:"
echo ""
BOOTDEV="$(mount | grep "on /boot type" | awk '{print $1}'| tr -d [0-9])"
grub-install --no-floppy --recheck --force "$BOOTDEV" && update-grub
grub_success_msg
# check if /boot resides on the root partition:
elif [ ! "$(mount | grep -v "type aufs" | grep /boot | grep -c ^/dev/sd)" = "1" ] && [ ! "$(/bin/ls -1A /boot | wc -l)" = "0" ]
then
echo "OK, /boot has no partition of its own..."
echo ""
echo "Will write grub to the master boot record of the hard disk now:"
echo ""
BOOTDEV="$(mount | grep "on / type" | awk '{print $1}'| tr -d [0-9])"
grub-install --no-floppy --recheck --force "$BOOTDEV" && update-grub
grub_success_msg
else
grub_failure_msg
fi
fi
# silently try again, in case this has not yet been completed:
wmlive_installer_removal
# create /etc/fstab file if still missing
if [ ! -s /etc/fstab ]
then
wmlive_mkfstab
fi
fi
# Killing the PPID of this very script, in order to fully leave the chroot:
fix_complete_exit
# After having left the chroot:
if [ "$(mount | grep -c "on $DEBTARGET type")" = "1" ]
then
rm -f "$DEBTARGET"/root/.wmliverc
if [ ! "$(/bin/ls -1A "$DEBTARGET"/boot/ | wc -l)" = "0" ]
then
cat << EOF
All known installation issues have been fixed, and we
have successfully "Killed" and left the chroot session.
Now please return to the debian-installer window, and
confirm to finish the installation. The installer will
properly finish and the system boot will work as expected.
If the boot menu should still be missing some entries
for dualbooting of parallel installed operating systems,
just continue booting into Linux, and the configuration
will be automagically updated with any missing entries.
EOF
else
grub_failure_msg
fi
echo $(date -R) > /var/tmp/wmlive-install-fixed
df $DEBTARGET >> /var/tmp/wmlive-install-fixed
fi
Reply to: