SCIENTIFIC-LINUX-USERS Archives

February 2013

SCIENTIFIC-LINUX-USERS@LISTSERV.FNAL.GOV

Options: Use Monospaced Font
Show Text Part by Default
Show All Mail Headers

Message: [<< First] [< Prev] [Next >] [Last >>]
Topic: [<< First] [< Prev] [Next >] [Last >>]
Author: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
Subject:
From:
Graham Allan <[log in to unmask]>
Reply To:
Graham Allan <[log in to unmask]>
Date:
Fri, 22 Feb 2013 12:06:08 -0600
Content-Type:
text/plain
Parts/Attachments:
text/plain (201 lines)
On Wed, Feb 20, 2013 at 07:57:22AM -0600, Pat Riehecky wrote:
> On 02/19/2013 10:14 AM, Graham Allan wrote:
> >On Mon, Feb 18, 2013 at 07:33:37PM -0700, Orion Poplawski wrote:
> >>On 02/18/2013 02:01 PM, Ken Teh wrote:
> >>>During a kickstart install, how are drives mapped?  I notice that sata0
> >>>is not always sda.  This is especially true when there are very large
> >>>drives in the mix.
> >>The sd* letters are simply handed out in order of enumeration and,
> >>as you noted, is not deterministic.  If you need that, use the
> >>/dev/disk/by-{id,label,path,uuid} labels.
> >For this reason we use a script during the kickstart %pre section which
> >attempts to examine the available drives and determine which is the
> >appropriate one to install on (also waits for confirmation if an
> >unexpected partition table is found).
> >
> >G.
> 
> Any chance you can share that script?  It sounds interesting!

Well I hope I haven't oversold this - it's not a miracle cure but it
works for our environment.

Back in the SL3/4/5 days we made some basic assumptions in kickstart
%pre that if there was an hda device, that would be the OS drive,
otherwise use sda. If a workstation didn't match that model, we'd
generally beat on it until it did :-) IIRC SL6 changed so that ATA drives,
and any connected usb drives, appeared as sd* devices, and you couldn't be
certain about the ordering.

There will be lots of deeply unfashionable things in this script such as
using regular drive partitions instead of LVM, using separate /var,
etc... Also please remember it's been hacked together as edge cases were
discovered so it's not pretty, or commented as well as it might be.

It tries to examine all candidate drives (after eliminating USB devices)
and will select a drive for installation if it either contains no
partition table, or finds a /boot directory (actually that hardly seems
foolproof, there might be better choices). Otherwise if it finds an
unfamiliar partition table, it prints it and asks for confirmation.

The rest of the script is concerned with stashing away ssh keys and
suchlike, for restoration after a reinstall.

Here goes, hope vim didn't mangle it overmuch during pasting, and don't
judge it too harshly!

%pre

##################
# Figure out where to install to

#Make sure USB storage devices are GONE
modprobe -r usb_storage

mkdir /mnt/tmp

for i in `ls /dev/sd?`; do
    CANDIDATE_DISK="$i"

    echo "UMPHYS: Checking $CANDIDATE_DISK for partition table" | tee -a /tmp/ks.log >> /dev/tty3

    if parted -s "$CANDIDATE_DISK" print >/dev/null; then
        echo "parted found a partition table" | tee -a /tmp/ks.log >> /dev/tty3
        if mount "${CANDIDATE_DISK}1" /mnt/tmp; then
            if [ -d /mnt/tmp/boot ]; then
                INSTALL_DISK=$CANDIDATE_DISK
                echo "Found /boot on ${CANDIDATE_DISK}1, using $CANDIDATE_DISK as system disk" | tee -a /tmp/ks.log >> /dev/tty3
                umount /mnt/tmp
                break
            else
                echo "Couldn't find /boot on ${CANDIDATE_DISK}1, moving on to next disk..." | tee -a /tmp/ks.log >> /dev/tty3
                umount /mnt/tmp
            fi
                umount /mnt/tmp
            fi
        else
            echo "Failed to mount ${CANDIDATE_DISK}1, moving on to next disk..." | tee -a /tmp/ks.log >> /dev/tty3
        fi
    else
        echo "parted found no partition table, using $CANDIDATE_DISK as system disk" | tee -a /tmp/ks.log >> /dev/tty3
        INSTALL_DISK="$CANDIDATE_DISK"
        break
    fi
done

if [ "${INSTALL_DISK}x" = "x" ]; then
    echo "****************************************************" >> /dev/tty1
    echo "Initial check failed to find a suitable system disk!" >> /dev/tty1
    echo "****************************************************" >> /dev/tty1
    for i in `ls /dev/sd?`; do
        CANDIDATE_DISK="$i"
        if mount "${CANDIDATE_DISK}1" /mnt/tmp; then
            if ! [ -d /mnt/tmp/boot ]; then
                echo -e "\n\nCouldn't find /boot on ${CANDIDATE_DISK}1" >> /dev/tty1
                echo -n "Partition table for ${CANDIDATE_DISK}:" >> /dev/tty1
                fdisk -l ${CANDIDATE_DISK} >> /dev/tty1
                doit="default"
                while ! echo "$doit" | grep -P "([Y|y]es|[N|n]o)" > /dev/null 2>&1; do
                    echo -n "Install linux on ${CANDIDATE_DISK}? [Yes/No] " >> /dev/tty1
                    read doit
                done
                if echo "$doit" | grep -P "[Y|y]es" > /dev/null 2>&1; then
                    INSTALL_DISK="$CANDIDATE_DISK"
                    umount /mnt/tmp
                    break
                else
                    echo "moving on to next disk..." >> /dev/tty1
                fi
                umount /mnt/tmp
            fi
        else
            echo -ne "\n\nPartition table for ${CANDIDATE_DISK}:" >> /dev/tty1
            fdisk -l ${CANDIDATE_DISK} >> /dev/tty1
            doit="default"
            while ! echo "$doit" | grep -P "([Y|y]es|[N|n]o)" > /dev/null 2>&1; do
                echo -n "Install linux on ${CANDIDATE_DISK}? [Yes/No] " >> /dev/tty1
                read doit
            done
            if echo "$doit" | grep -P "[Y|y]es" > /dev/null 2>&1; then
                INSTALL_DISK="$CANDIDATE_DISK"
                break
            else
                echo "moving on to next disk..." >> /dev/tty1
            fi
        fi
    done

    if [ "${INSTALL_DISK}x" = "x" ]; then
        echo -e "\n****************************************************" >> /dev/tty1
        echo "Failed to find a suitable system disk" >> /dev/tty1
        echo "The system will be rebooted when you press Ctrl-C or Ctrl-Alt-Delete." >> /dev/tty1
        echo "****************************************************" >> /dev/tty1
        while true; do
            sleep 1
        done
    fi
fi

echo "Installing linux to $INSTALL_DISK" | tee -a /tmp/ks.log >> /dev/tty3
echo "Installing linux to $INSTALL_DISK" >> /dev/tty1
echo "****************************************************" >> /dev/tty1
# Done figuring out where to install
###################


#Write a file out to be included below for disk config
cat << EOF > /tmp/partitions
clearpart --drives=$INSTALL_DISK --initlabel --all
zerombr yes
part swap --recommended --ondisk=$INSTALL_DISK
part /    --size=25600 --ondisk=$INSTALL_DISK
part /var --size=4096   --ondisk=$INSTALL_DISK
part /export/scratch --size=128 --grow --ondisk=$INSTALL_DISK
EOF

# Salvage files from an old installation if possible
mkdir /tmp/physkeys
echo "Attempting to salvage files..." | tee -a /tmp/ks.log >> /dev/tty3
for i in `fdisk -l $INSTALL_DISK | grep ^/dev | grep -v '\(swap\|lvm\|extended\)' | cut -b 1-9`; do
    echo "Mounting $i (label '`e2label $i`') to /mnt/tmp" | tee -a /tmp/ks.log >> /dev/tty3
    mount $i /mnt/tmp
    # SSH keys
    if [ -d /mnt/tmp/etc/ssh ]; then
        echo "Found ssh keys. Stashing"| tee -a /tmp/ks.log >> /dev/tty3
        mkdir /tmp/physkeys/ssh
        cp -p /mnt/tmp/etc/ssh/ssh_host_* /tmp/physkeys/ssh
    fi
    # X config
    if [ -f /mnt/tmp/etc/X11/xorg.conf ]; then
        echo "Found xorg.conf. Stashing"| tee -a /tmp/ks.log >> /dev/tty3
        mkdir /tmp/physkeys/X11
        cp -p /mnt/tmp/etc/X11/xorg.conf /tmp/physkeys/X11
    fi
    # Cfengine keys (sep /var partition)
    if [ -d /mnt/tmp/cfengine/ppkeys ]; then
        echo "Found cfengine ppkeys. Stashing"| tee -a /tmp/ks.log >> /dev/tty3
        mkdir /tmp/physkeys/cfengine
        cp -p /mnt/tmp/cfengine/ppkeys/* /tmp/physkeys/cfengine #*/
    fi
    # Cfengine keys (integrated /var)
    if [ -d /mnt/tmp/var/cfengine/ppkeys ]; then
        echo "Found cfengine ppkeys. Stashing"| tee -a /tmp/ks.log >> /dev/tty3
        mkdir /tmp/physkeys/cfengine
        cp -p /mnt/tmp/var/cfengine/ppkeys/* /tmp/physkeys/cfengine #*/
    fi
    # Crontabs
    if [ -d /mnt/tmp/spool/cron ]; then
        echo "Found cron. Stashing"| tee -a /tmp/ks.log >> /dev/tty3
        mkdir /tmp/physkeys/cron
        cp -p /mnt/tmp/spool/cron/* /tmp/physkeys/cron #*/
    fi
    umount /mnt/tmp
done
%end

-- 
-------------------------------------------------------------------------
Graham Allan
School of Physics and Astronomy - University of Minnesota
-------------------------------------------------------------------------

ATOM RSS1 RSS2