diff options
Diffstat (limited to 'scripts/install-system')
-rwxr-xr-x | scripts/install-system | 1637 |
1 files changed, 0 insertions, 1637 deletions
diff --git a/scripts/install-system b/scripts/install-system deleted file mode 100755 index e8464951..00000000 --- a/scripts/install-system +++ /dev/null @@ -1,1637 +0,0 @@ -#!/bin/bash -# -# Module: install-system -# -# **** License **** -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as -# published by the Free Software Foundation. -# -# 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. -# -# This code was originally developed by Vyatta, Inc. -# Portions created by Vyatta are Copyright (C) 2006, 2007 Vyatta, Inc. -# All Rights Reserved. -# -# Author: Robert Bays -# Date: 2006 -# Description: -# -# **** End License **** -# -# Vyatta system installer script. -# - -if [ `whoami` != 'root' ] ; then - echo "This script must be run with root privileges." - exit 1 -fi - -# If you set VYATTA_AUTO_INSTALL I will try to do an automated install for you - -if [ -e /etc/default/vyatta ] ; then - . /etc/default/vyatta -fi - -# get system manufactuer, Xen needs special treatment -MANUF=`/usr/sbin/dmidecode -s system-manufacturer` - -: ${vyatta_prefix:=/opt/vyatta} -: ${vyatta_exec_prefix:=$vyatta_prefix} -: ${vyatta_bindir:=${vyatta_exec_prefix}/bin} -: ${vyatta_sbindir:=${vyatta_exec_prefix}/sbin} -: ${vyatta_sysconfdir:=${vyatta_prefix}/etc} - -ofrconfdir=${vyatta_sysconfdir}/config -rootfsdir=/mnt/rootfs - -# By default this is not a union install -# UNION=false - -# install log file name -INSTALL_LOG=/tmp/install-$$.log -# Absolute minimum root partition size in MB. Below this, we won't let -# you install. -ROOT_MIN=1000 - -# the base install drive e.g. sda -if [ -n "$INSTALL_DRIVE" ]; then - INSTALL_DRIVE="" -fi -# the install partition e.g. sda1 -if [ -n "$ROOT_PARTITION" ]; then - ROOT_PARTITION="" -fi -# the config partition e.g. sda2 -if [ -n "$CONFIG_PARTITION" ]; then - CONFIG_PARTITION="" -fi -# the size of the root partition -if [ -n "$ROOT_PARTITION_SIZE" ]; then - ROOT_PARTITION_SIZE="" -fi -# global holding variable used in the select_partition sub -PARTITION='' - -# default file system type -if [ "$MANUF" = "Xen" ]; then - ROOT_FSTYPE="ext3" -else - ROOT_FSTYPE="ext4" -fi - -# start of root partition (64 sectors == 32K bytes) -ROOT_OFFSET="64S" - -# Process ID of this script for the lame marketing spinner -SPID=$$ - -# Grub options -GRUB_OPTIONS="quiet" - -# Enable Vesa framebuffer mode (comment out to disable) -VGA_LOGO="vga=0x314" # 800 x 600 (16bit colors) - -# trap signals so we can kill runaway progress indicators -trap 'progress_indicator stop; exit 1' 1 -trap 'progress_indicator stop; exit 1' 2 - -# turn off any mounted swap partitions -turnoffswap () { - if [ -f "/proc/swaps" ]; then - myresponse=$(cat /proc/swaps) - if [ -n "$myresponse" ]; then - echo "turning off swaps..." >> $INSTALL_LOG - swapoff -a - fi - fi -} - -tolower () { - echo "$*" | tr '[:upper:]' '[:lower:]' -} - -# Validates a user response. Returns the response if valid. -# Returns the default is the user just hits enter. -# Returns nothing if not valid. Default parameter is $1. -# Options are in $2. If options are defined return must be a member -# of the enum. -get_response () { - local ldefault=$(tolower "$1") - local loptions=$(tolower "$2") - - # get the response from the user - read myresponse - myresponse=$(tolower "$myresponse") - - # Check to see if the user accepts the default - if [ -z "$myresponse" ]; then - echo -n $ldefault - # if we are passing in options to check, make sure response is a valid option - elif [ -n "$loptions" ]; then - for token in $loptions - do - if [ "$token" == "$myresponse" ]; then - echo -n "$myresponse" - return 0 - fi - done - return 1 - else - echo -n "$myresponse" - fi - - return 0 -} - -# Return the size of the drive in MB -get_drive_size () { - local ldrive=$1 - - # Get size of disk in 1k blocks - local blocks=$(sfdisk -s /dev/$ldrive) - - # Translate to Megabytes (SI units) - local bytes=$(($blocks * 1024)) - local lsize=$(($bytes / 1000000)) - - echo $lsize -} - -# Probe hardrives not shown in /proc/partitions by default -probe_drives () { - # Find drives that may not be in /proc/partitions since not mounted - drive=$(ls /sys/block | grep '[hsv]d.') - - # now exclude all drives that are read-only - for drive in $drive - do - if [ $(cat /sys/block/$drive/ro) -ne 0 ] - then - output=$(mount | grep $drive) - if [ -z "$output" ]; then - output=$(parted -s /dev/$drive p) - fi - fi - done -} - - -warn_of_dire_consequences () { - # Give the user a requisite warning that we are about to nuke their drive - response='' - while [ -z "$response" ] - do - echo "This will destroy all data on /dev/$INSTALL_DRIVE." - echo -n "Continue? (Yes/No) [No]: " - response=$(get_response "No" "Yes No Y N") - - if [ "$response" == "no" ] || [ "$response" == "n" ]; then - echo "Ok then. Exiting..." - exit 1 - fi - done -} - - - -check_for_old_raid () { - # First, trigger construction of previously configured RAID groups - echo -n "Looking for pre-existing RAID groups..." - raid_config=`mdadm --examine --scan` - if [ -z "$raid_config" ]; then - echo "none found." - return - fi - - echo "found some." - echo "Trying to configure pre-existing RAID groups..." - mdadm --assemble --scan --auto=yes --symlink=no - - # Identify physical drives - raid_drives=$(cat /proc/partitions | awk '{ if ($4!="name") { print $4 } }' | grep "md" | egrep -v "^$") - - if [ -z "$raid_drives" ]; then - echo "Unable to configure any RAID groups." - return - fi - - numraids=`echo $raid_drives | wc -w` - - if [ $numraids -eq 1 ]; then - echo "The following RAID group is now configured:" - else - echo "The following RAID groups are now configured:" - fi - - for drive in $raid_drives - do - cat /proc/mdstat | grep --after-context 2 ^$drive | sed -e 's/^/\t/' - done - - if [ $numraids -eq 1 ]; then - echo -n "Would you like to use this one? (Yes/No) [Yes]:" - else - echo -n "Would you like to use one of these? (Yes/No) [Yes]:" - fi - - response=$(get_response "Yes" "Yes No Y N") - if [ "$response" == "no" ] || [ "$response" == "n" ]; then - echo - echo "Ok. Not using existing RAID groups." - echo - - # pick the first RAID group to be broken - raid_drive=$(echo $raid_drives | /usr/bin/awk '{ print $1 }') - - echo "Would you like to break RAID group $raid_drive so that its" - echo "members can be re-used for a new installation, understanding" - echo -n "that doing so will destroy all data on it? (Yes/No) [No]:" - destroy_raid=$(get_response "No" "Yes No Y N") - echo - - if [ "${destroy_raid:0:1}" = "y" ]; then - echo "OK. Breaking the RAID group $raid_drive." - - members=`ls /sys/block/$raid_drive/slaves` - - echo "First, stopping all existing RAID groups:" - mdadm --stop --scan - - for member in $members ; do - drive=${member:0:3} - part=${member:3:1} - echo "Re-setting partition ID for RAID group $raid_drive member /dev/${member}:" - sfdisk --change-id /dev/$drive $part 0x83 - echo "Clearing RAID superblock from RAID group $raid_drive member /dev/${member}." - mdadm --zero-superblock /dev/$member - done - else - echo "OK. Stopping, but not breaking, existing RAID groups:" - mdadm --stop --scan - fi - - echo - return - fi - - if [ $numraids -eq 1 ]; then - INSTALL_DRIVE=$raid_drives - else - # take the first drive as the default - INSTALL_DRIVE=$(echo $raid_drives | /usr/bin/awk '{ print $1 }') - echo -n "Which one would you like to use? ($raid_drives) [$INSTALL_DRIVE]: " - INSTALL_DRIVE=$(get_response "$INSTALL_DRIVE" "$drives") - fi - - echo "Using RAID partition $INSTALL_DRIVE" - - raid_degraded=`cat /sys/block/$INSTALL_DRIVE/md/degraded` - raid_sync_action=`cat /sys/block/$INSTALL_DRIVE/md/sync_action` - - if [ "$raid_degraded" = "1" ]; then - echo - if [ "$raid_sync_action" = "recover" ]; then - echo "Error: This RAID set is degraded and is in the process of" - echo "rebuilding. It is not safe to install onto it while the" - echo "rebuild is in progress. Please wait for the rebuild to" - echo "complete and then re-start the installation. You may" - echo "monitor the progress of the RAID rebuild with the" - echo "command:" - echo - echo " show raid $INSTALL_DRIVE" - echo - exit 1 - fi - echo "Warning: This RAID set is degraded, but is not in the" - echo "process of rebuilding. It is safe to perform the installation" - echo "onto a degraded RAID set that is not in the process of" - echo "rebuilding. You may stop the installation now and rebuild the" - echo "RAID set, or continue installing onto it. If you continue" - echo "installing, do not attempt to rebuild the RAID set until the" - echo "installation has completed and you have rebooted the system." - echo - fi - - warn_of_dire_consequences - - ROOT_PARTITION=$INSTALL_DRIVE - - # make sure we aren't working on a mounted part - unmount "$INSTALL_DRIVE" - - # check for an old config on the partition - check_config_partition "$ROOT_PARTITION" - - # create the filesystem on the part - make_filesystem "$ROOT_PARTITION" - - INSTALL_METHOD=RAID -} - -check_for_new_raid () { - # Identify physical drives - drives=$(cat /proc/partitions | awk '{ if ($4!="name") { print $4 } }' | egrep -v "[0-9]$" | egrep -v "^$") - - numdrives=`echo $drives | wc -w` - - # Need at least two drives for RAID-1. We don't yet have the code - # to handle selection of two from a set of 3 or more, so for now, we - # only support two drives. - # - if [ $numdrives -ne 2 ]; then - return - fi - - drive1=`echo $drives | awk '{ print $1 }'` - drive2=`echo $drives | awk '{ print $2 }'` - - drivesize1=$(get_drive_size $drive1) - drivesize2=$(get_drive_size $drive2) - - # Both drives must have enough space to hold our minimum root filesystem - # - if [ $drivesize1 -lt $ROOT_MIN -o $drivesize2 -lt $ROOT_MIN ]; then - return - fi - - - echo "You have two disk drives:" - echo -e "\t$drive1 \t$drivesize1 MB" - echo -e "\t$drive2 \t$drivesize2 MB" - - echo -n "Would you like to configure RAID-1 mirroring on them? (Yes/No) [Yes]:" - response=$(get_response "Yes" "Yes No Y N") - if [ "$response" == "no" ] || [ "$response" == "n" ]; then - echo "Ok. Not configuring RAID-1." - return - fi - - if [ $drivesize1 -ne $drivesize2 ]; then - echo "Since the disks are not the same size, we will use the smaller" - echo "of the two sizes in configuring the RAID-1 set. This will" - echo "waste some space on the larger drive." - echo "" - fi - - # Configure RAID-1 - echo "This process will erase all data on both drives." - echo -n "Are you sure you want to do this? (Yes/No) [No]: " - response=$(get_response "Yes" "Yes No Y N") - if [ "$response" == "no" ] || [ "$response" == "n" ]; then - echo "Ok. Not configuring RAID-1." - return - fi - - for drive in $drives - do - echo "Deleting old partitions on drive $drive" - # remove any existing partitions on that drive - delete_partitions "$drive" - done - - # Need to leave space on both disks between the MBR and the start - # of the first partition for grub. Grub needs to embed a large - # boot image there when booting off RAID devices. - # - # Partition creation variables are in units of megabytes. - part_start_offset=2 - data_dev=1 - - if [ $drivesize1 -lt $drivesize2 ]; then - root_size=$drivesize1 - else - root_size=$drivesize2 - fi - - let root_size-=$part_start_offset - - for drive in $drives - do - echo "Creating data partition: /dev/${drive}${data_dev}" - create_partitions "$drive" $root_size $part_start_offset "no" - sfdisk --change-id /dev/$drive $data_dev 0xfd - # mark data partition as bootable - echo "Marking /dev/$drive partition $data_dev bootable" >> $INSTALL_LOG - parted -s /dev/$drive set $data_dev boot on >> $INSTALL_LOG 2>&1 - done - - # Must give partition device time to settle - sleep 5 - echo - - for drive in $drives - do - echo "Erasing any previous RAID metadata that may exist on /dev/${drive}${data_dev}" - mdadm --zero-superblock /dev/${drive}${data_dev} - done - - echo "Creating RAID-1 group on partitions: /dev/${drive1}${data_dev} /dev/${drive2}${data_dev}" - - raid_dev=md0 - mdadm --create /dev/$raid_dev --level=1 --raid-disks=2 --metadata=0.90 /dev/${drive1}${data_dev} /dev/${drive2}${data_dev} - - if [ $? = 0 -a -e /dev/$raid_dev ]; then - echo "RAID-1 group created successfully:" - cat /proc/mdstat | grep --after-context 2 ^$raid_dev | sed -e 's/^/\t/' - else - echo "Unable to create RAID-1 group!" - return - fi - - INSTALL_DRIVE=$raid_dev - ROOT_PARTITION=$INSTALL_DRIVE - - # Give device time to settle... - sleep 5 - - # create the filesystem on the part - make_filesystem "$ROOT_PARTITION" - - INSTALL_METHOD=RAID -} - - -# Takes an argument to display text before choice -# Sets INSTALL_DRIVE. Note that select_drive should be wrapped -# in the verification loop, not the included get_response. -select_drive () { - # list the drives in /proc/partitions. Remove partitions and empty lines. - # the first grep pattern looks for devices named c0d0, hda, and sda. - drives=$(cat /proc/partitions | \ - awk '{ if ($4!="name") { print $4 } }' | \ - egrep "c[0-9]d[0-9]$|[hsv]d[a-z]$" | \ - egrep -v "^$") - - # take the first drive as the default - INSTALL_DRIVE=$(echo $drives | /usr/bin/awk '{ print $1 }') - - # Add the drive sizes to the display to help the user decide - display='' - for drive in $drives - do - size=$(get_drive_size $drive) - display="$display $drive\t$size"MB"\n" - done - - while true - do - # Display the drives and ask the user which one to install to - echo -e "$display" - echo - echo -n "$1 [$INSTALL_DRIVE]:" - response=$(get_response "$INSTALL_DRIVE" "$drives") && break - done - INSTALL_DRIVE="$response" - - echo -} - -# Allow the user to select a partition to work with -# sets the global PARTITION -# $1 is the text to display before prompt -select_partition () { - minsize=$1 - text=$2 - exclude=$3 - - echo -n "Looking for appropriate partitions: " - progress_indicator start - - # initialize out global var. using globals in this way is bad form. I know. - PARTITION='' - - # list only the partitions in /proc/partitions. - parts=$(cat /proc/partitions | awk '{ if ($4!="name") { print $4 " "} }' | egrep "[0-9]" | egrep -v "loop" | tr -d '\n') - - # remove any partitions we have already previously used - if [ -n "$exclude" ]; then - for part in $parts; - do - temp=$(echo $part | egrep -v $exclude) - parts_temp="$parts_temp $temp" - done - parts=$parts_temp - fi - - # Get the partition sizes for display - # only show linux partitions that have sizes, i.e. remove loops - display='' - myparts='' - for part in $parts - do - if [ ${part:0:2} = "md" ]; then - parttype="RAID" - else - rootdev=$(echo $part | sed 's/[0-9]//g') - parttype=$(fdisk -l /dev/$rootdev | grep $part | grep Linux) - fi - if [ -n "$parttype" ]; then - lsize=$(get_drive_size $part) - if [ "$lsize" -a $lsize -ge $minsize ]; then - display="$display $part\t\t$lsize"MB"\n" - myparts="$myparts $part" - fi - fi - done - - progress_indicator stop - echo "OK" - - if [ -n "$myparts" ]; then - lpartition='' - while [ -z "$lpartition" ] - do - # take the first partition as the default - lpartition=$(echo $myparts | /usr/bin/awk '{ print $1 }') - - echo "I found the following partitions suitable for the Vyatta image:" - echo -e "Partition\tSize" - echo -e "$display" - echo - echo -n "$text [$lpartition]: " - - lpartition=$(get_response "$lpartition" "$myparts") - echo - done - else - echo "No suitable partition sizes found. Exiting..." | tee $INSTALL_LOG - exit 1 - fi - PARTITION=$lpartition -} - -rename_old_config() { - files=$(find /mnt/config -mindepth 1 -type f | grep -v pre-glendale) - for f in $files; do - if grep -q '/\*XORP Configuration File, v1.0\*/' $f >&/dev/null; then - CURTIME=$(date +%F-%H%M%S) - mv $f $f.pre-glendale.$CURTIME - fi - done -} - -# copy old config file from /mnt/tmp -save_old_config() { - local response='' - while [ -z "$response" ] - do - echo "/dev/$lpart has an old configuration directory!" - echo -ne "Would you like me to save the data on it\nbefore I delete it? (Yes/No) [Yes]: " - response=$(get_response "Yes" "Yes No Y N") - done - - if [ "$response" == "yes" ] || [ "$response" == "y" ]; then - mkdir -p /mnt/config - if [ -d /mnt/tmp/opt/vyatta/etc/config ]; then - output=$(cp -pR /mnt/tmp/opt/vyatta/etc/config/* /mnt/config) - else - output=$(cp -pR /mnt/tmp/* /mnt/config) - fi - if [ -n "$output" ]; then - echo -e "Warning: error in copying the old config partition.\nSee $INSTALL_LOG for more details." - echo -e "Warning: error in copying the old config partition.\ncp -pR /mnt/tmp/* /mnt/config\n$output\n" >> $INSTALL_LOG - fi - rename_old_config - fi -} - -save_old_keys() { - local response='' - - while [ -z "$response" ] - do - echo "/dev/$lpart has SSH host keys" - echo -ne "Would you like me to keep SSH keys on new install? (Yes/No) [Yes]: " - response=$(get_response "Yes" "Yes No Y N") - done - - if [ "$response" == "yes" ] || [ "$response" == "y" ]; then - mkdir -p /mnt/ssh - output=$(cp -p /mnt/tmp/etc/ssh/ssh_host_* /mnt/ssh) - - if [ -n "$output" ]; then - echo -e "Warning: error in copying the old ssh keys." - echo -e "See $INSTALL_LOG for more details." - echo "Warning: error in copying the old ssh keys." >> $INSTALL_LOG - echo "cp -pR /mnt/tmp/etc/ssh/ssh_host_* /mnt/ssh" >> $INSTALL_LOG - echo "$output\n">> $INSTALL_LOG - fi - fi -} - -save_image_config() { - image_name=$1 - - # Cleanup from possible partial last run - rm -fr /mnt/config - mkdir /mnt/config - - output=$(cp -pR /mnt/tmp/boot/$image_name/live-rw/config/* /mnt/config) - - if [ -n "$output" ]; then - echo -e "Warning: error in copying the old config partition.\nSee $INSTALL_LOG for more details." - echo "Warning: error in copying the old config partition.\ncp -pR /mnt/tmp/* /mnt/config\n$output\n" - fi - rename_old_config -} - -save_image_keys() { - image_name=$1 - - if [ ! -d /mnt/tmp/boot/$image_name/live-rw/etc/ssh ]; then - echo "No SSH keys found on $image_name, so none can be saved." - return; - fi - - echo -n "Would you like to save SSH keys from $image_name too? (Yes/No) [Yes] " - - response=$(get_response "Yes" "Yes No Y N") - if [ "$response" != "yes" ] && [ "$response" != "y" ]; then - echo "OK. SSH keys not saved." - return - fi - - mkdir -p /mnt/ssh - output=$(cp -p /mnt/tmp/boot/$image_name/live-rw/etc/ssh/ssh_host_* /mnt/ssh) - - if [ -n "$output" ]; then - echo -e "Warning: error in copying the old ssh keys." - echo -e "See $INSTALL_LOG for more details." - echo "Warning: error in copying the old ssh keys." >> $INSTALL_LOG - echo "cp -pR /mnt/tmp/etc/ssh/ssh_host_* /mnt/ssh" >> $INSTALL_LOG - echo "$output\n">> $INSTALL_LOG - return - fi - - # reset modes on keys (should already be set) - chmod 600 /mnt/ssh/*_key 2>&1 - chmod 644 /mnt/ssh/*.pub 2>&1 - - echo "SSH keys have been saved." -} - - - -## check_config_partition -# look to see if this partition contains a config file -# and back it up -check_config_partition() { - lpart=$1 - copied=0 - - # Cleanup from possible partial last run - rm -fr /mnt/config - - # Look to see if this is a config partition - mkdir -p /mnt/tmp - output=$(mount -r /dev/$lpart /mnt/tmp 2>&1) - if [ $? != 0 ]; then - echo -e "Cannot mount /dev/$lpart"."\nmount /dev/$ldrive$part /mnt/tmp\nExiting..." >> $INSTALL_LOG - echo "$output" >> $INSTALL_LOG - return - fi - - # Look to see if there is a config partition there - if [ -f /mnt/tmp/opt/vyatta/etc/config/.vyatta_config ] || - [ -f /mnt/tmp/.vyatta_config ]; then - save_old_config - copied=1 - fi - - # Look to see if there are SSH host keys - if [ -d /mnt/tmp/etc/ssh ]; then - save_old_keys - copied=1 - fi - - if [ $copied -eq 0 ]; then - # Check for images - images=() - image_dirs=/mnt/tmp/boot/* - - for dir in $image_dirs; do - if [ -f $dir/live-rw/config/.vyatta_config ]; then - item=${dir##/mnt/tmp/boot/} - images=($item ${images[@]}) - fi - done - - num_images=${#images[@]} - - if [ $num_images -gt 0 ]; then - echo "I found the following installed system image(s) with config files on $part:" - for (( i = 0; i < $num_images; i++ )); do - echo " $((i + 1)): ${images[$i]}" - done - - if [ $num_images -eq 1 ]; then - echo -n "Would you like to save config information from it? (Yes/No) [Yes] " - else - echo -n "Would you like to save config information from one? (Yes/No) [Yes] " - fi - - response=$(get_response "Yes" "Yes No Y N") - if [ "$response" != "yes" ] && [ "$response" != "y" ]; then - echo "OK. Config information not saved." - umount /mnt/tmp - return - fi - - if [ $num_images -gt 1 ]; then - image_index=-1 - while [ $image_index -lt 0 -o $image_index -ge $num_images ]; do - echo -n "Which image would you like to use? (1 .. $num_images): " - read num - image_index=$((num - 1)) - done - else - image_index=0 - fi - - image_name=${images[$image_index]} - echo "Saving config information from image $image_name." - save_image_config $image_name - echo "Done." - save_image_keys $image_name - fi - fi - umount /mnt/tmp -} - -# Delete all existing partitions for an automated install -# $1 is the drive to delete partitions from -delete_partitions () { - ldrive=$1 - - # get the partitions on the drive - # in the first grep below we add the optional [p] in order to accomdate cciss drives - partitions=$(cat /proc/partitions | grep $ldrive[p]*[0-9] | awk '{ print $4 }' | sed 's/\(.*\)\([0-9]$\)/\2/g' | grep -v "^$") - - # now for each part, blow it away - for part in $partitions - do - # Look to see if this is a config partition - check_config_partition "$ldrive$part" - - echo "Removing partition $part on /dev/$ldrive" >> $INSTALL_LOG - output=$(parted -s /dev/$ldrive rm $part) - status=$? - if [ "$status" != 0 ]; then - echo -e "Warning: cannot delete partition $part on $ldrive.\nPlease see $INSTALL_LOG for more details." - echo -e "Warning: cannot delete partition $part on $ldrive.\nparted /dev/$ldrive rm $part\n$output" >> $INSTALL_LOG - fi - - # We add a bogus sleep here because the loop needs to wait for udev - sleep 5 - done -} - -# make a filesystem on the drive -# $1 is the drive to format -make_filesystem () { - ldrive=$1 - - echo -n "Creating filesystem on /dev/$ldrive: " - echo "Creating filesystem on /dev/$ldrive..." >> $INSTALL_LOG - - progress_indicator start - output=$(mkfs -t $ROOT_FSTYPE /dev/$ldrive 2>&1) - status=$? - if [ "$status" != 0 ]; then - echo -e "Error: couldn't create the root filesystem.\nSee $INSTALL_LOG for further details.\nExiting..." - echo -e "Error: couldn't create the root filesystem.\n/sbin/mke2fs -j /dev/$ldrive\n$output" - exit 1 - fi - progress_indicator stop - echo "OK" -} - -# create the root partition -# $1 is the install drive e.g. sda -# $2 is the partition size e.g. 512 -# This will set the global ROOT_PARTITION -create_partitions() { - ldrive=$1 - root_part_size=$2 - start_offset=$3 - initialize_fs=$4 - - # Make sure there is enough space on drive - size=$(get_drive_size "$ldrive") - if [ "$root_part_size" -gt "$size" ]; then - echo "Error: $ldrive is only $size"MB" large. Desired root is $root_part_size" - exit 1 - fi - - # Make sure you can print disk info using parted - parted --script /dev/$ldrive p >/dev/null 2>&1 - - # If unable to read disk, it's likely it needs a disklabel - if [ "$?" != "0" ]; then - echo "Creating a new disklabel on $ldrive" - echo "parted /dev/$ldrive mklabel msdos" - output=$(parted -s /dev/$ldrive mklabel msdos) - - parted --script /dev/$ldrive p >/dev/null 2>&1 - if [ "$?" != "0" ]; then - echo "Unable to read disk label. Exiting." - exit 1 - fi - fi - - echo "Creating root partition on /dev/$ldrive" >> $INSTALL_LOG - - # make the root partition - # align at optimal block boundary - output=$(parted -s /dev/$ldrive mkpart primary $start_offset $root_part_size) - status=$? - if [ "$status" != 0 ]; then - echo -e "Error creating primary partition on $ldrive.\nPlease see $INSTALL_LOG for more details.\nExiting..." - echo -e "Error creating primary partition on $ldrive.\nparted /dev/$ldrive mkpart primary $start_offset $root_part_size\n$output" >> $INSTALL_LOG - exit 1 - fi - - # set the partition number on the device. - if [ -n "$( echo $ldrive | grep -E "cciss|ida" )" ]; then - # if this is a cciss - ROOT_PARTITION=$ldrive"p1" - else - # else... the rest of the world - ROOT_PARTITION=$ldrive"1" - fi - # udev takes time to re-add the device file, so wait for it - while [ ! -b "/dev/$ROOT_PARTITION" ] - do - sleep 1 - done - - if [ "$initialize_fs" = "yes" ]; then - # make the root and config file systems. - make_filesystem "$ROOT_PARTITION" - fi -} - -# Copy directory with pretty progress bar -copy_filesystem() { - cp -r -v --preserve=all "$@" | awk '{ - ++files - if ((files % 100) == 0) { - percent = files / total_files * 100 - printf "%3d%% [", percent - for (i=0;i<percent; i+=2) - printf "=" - printf ">" - for (;i<100;i+=2) - printf " " - printf "]\r" - fflush() - } - }' total_files=$(find "$@" | wc -l) -} - -# Install the root filesystem -# $1 is the partition to install on -install_root_filesystem () { - ldrive=$1 - version=`dpkg-query --showformat='${Version}' --show vyatta-version` - - dpkg="/usr/bin/dpkg --force-all --root=$rootfsdir" - echo "Mounting /dev/$ldrive " - echo "Mounting /dev/$ldrive..." >> $INSTALL_LOG - - # make the mount point - output=$(/bin/mkdir -p $rootfsdir) - - # mount the partition - output=$(mount /dev/$ldrive $rootfsdir) - status=$? - - if [ "$status" != 0 ]; then - echo -e "Error trying to mount the new root partition.\nPlease see $INSTALL_LOG for details.\nExiting..." - echo -e "Error trying to mount the new root partition.\nmount /dev/$ldrive $rootfsdir\n$output" >> $INSTALL_LOG - exit 1 - fi - - if [ -z "$UNION" ]; then - echo "Copying system files to /dev/$ROOT_PARTITION: " - # Mount the squashfs for copying - output=$(mkdir -p /mnt/squashfs) - if [ -f /live/image/live/filesystem.squashfs ]; then - output=$(mount /live/image/live/filesystem.squashfs /mnt/squashfs -t squashfs -o loop) - status=$? - elif [ -f /live/image/boot/$version/$version.squashfs ]; then - output=$(mount /live/image/boot/$version/$version.squashfs /mnt/squashfs -t squashfs -o loop) - status=$? - else - echo -e "Error: Unable to find a squash image. To install natively\nthe install media must be a livecd or a union install.\nExiting...\n\n" - echo -e "Error: Unable to find a squash image. To install natively\nthe install media must be a livecd or a union install.\nExiting...\n\n" >> $INSTALL_LOG - exit 1 - fi - - if [ "$status" != 0 ]; then - echo -e "Error trying to mount the squashfs.\nPlease see install log for more details.\nExiting..." - echo -e "Error trying to mount the squashfs.\nmount /live/image/live/filesystem.squashfs /mnt/squashfs -t squashfs -o loop\n$output" >> $INSTALL_LOG - exit 1 - fi - - echo "Copying /mnt/squashfs/* to $rootfsddir" >>$INSTALL_LOG - copy_filesystem /mnt/squashfs/* $rootfsdir 2>>$INSTALL_LOG - status=$? - echo - - if [ "$status" != 0 ]; then - echo -e "Error trying to copy the rootfs.\nPlease see install log for more details.\nExiting..." - exit 1 - fi - - # unmount the squashfs. No big deal if it fails. - output=$(umount /mnt/squashfs) - - # create the fstab - local rootdev="/dev/$ROOT_PARTITION"; - uuid=$(dumpe2fs -h $rootdev 2>/dev/null | awk '/^Filesystem UUID/ {print $3}') - if [ -z "$uuid" ] - then - echo "Unable to read filesystem UUID. Exiting." - exit 1 - else - if [ "$MANUF" = "Xen" ]; then - #disable barriers explicitly (just incase) - echo -e "UUID=$uuid\t/\t$ROOT_FSTYPE\tnoatime,nobarrier\t0 1" >> $rootfsdir/etc/fstab - else - echo -e "UUID=$uuid\t/\t$ROOT_FSTYPE\tnoatime\t0 1" >> $rootfsdir/etc/fstab - fi - fi - - #setup the hostname file - cp /etc/hostname $rootfsdir/etc/ - cp /etc/hosts $rootfsdir/etc/ - - progress_indicator stop - echo "OK" - else - # UNION install - mkdir -p $rootfsdir/boot/$version - ## make dir for backing store - mkdir -p $rootfsdir/boot/$version/live-rw - if [ -f /live/image/live/filesystem.squashfs ]; then - echo Copying squashfs image... - cp /live/image/live/filesystem.squashfs $rootfsdir/boot/$version/$version.squashfs - echo Copying kernel and initrd images... - cp -a /boot/* $rootfsdir/boot/$version/ - else - echo Copying image files... - cp -ar /live/image/boot/$version $rootfsdir/boot/ - fi - fi -} - -# copy the configuration to the config partition -# $1 is the config partition device -copy_config () { - config_partition=$1 - lerror='' - config_default=$vyatta_sysconfdir/config.boot.default - tmp_config_default=/tmp/${vyatta_sysconfdir//\//__} - - # create the config directory on the union file system - mkdir -p $rootfsdir$ofrconfdir - - # create the proper perms on the new config partition - chgrp vyattacfg $rootfsdir$ofrconfdir - chmod 775 $rootfsdir$ofrconfdir - - # create our config partition marker - touch $rootfsdir$ofrconfdir/.vyatta_config - - if [ -d /mnt/config ]; then - echo "Copying old configurations to config partition." - cp -pR /mnt/config/* $rootfsdir$ofrconfdir - else - # Find the config files and give the user the option to copy config files - # TODO: this needs cleaned up - if [ -f $ofrconfdir/config.boot ]; then - config=$ofrconfdir/config.boot - fi - - if [ -n "$config" ]; then - echo "I found the following configuration files" - for file in $config - do - echo $file - done - - default=$(echo -e $config | awk '{ print $1 }') - - while [ -z "$configfile" ] - do - echo -n "Which one should I copy to $INSTALL_DRIVE? [$default]: " - configfile=$(get_response "$default" "$config") - done - - echo - output=$(cp $configfile $rootfsdir$ofrconfdir) - if [ -n "$output" ]; then - echo "Error copying file $configfile to config directory. Exiting..." >> $INSTALL_LOG - exit 1 - fi - fi - fi - - # set the permissions on the new config file - if [ -f $rootfsdir$ofrconfdir/config.boot ]; then - chgrp vyattacfg $rootfsdir$ofrconfdir/config.boot - chmod 775 $rootfsdir$ofrconfdir/config.boot - fi -} - -# copy the saved ssh host key to the new install -copy_sshkeys() { - if [ -d /mnt/ssh ]; then - echo "Copying SSH keys." - cp -p /mnt/ssh/* $rootfsdir/etc/ssh - fi -} - -set_encrypted_password() { - sed -i \ - -e "/ user $1 {/,/}/s/encrypted-password.*\$/encrypted-password \"$2\"/" $3 -} - -change_password() { - local user=$1 - local pwd1="1" - local pwd2="2" - - until [[ "$pwd1" == "$pwd2" ]] - do - read -p "Enter password for user '$user': " -r -s pwd1 <>/dev/tty 2>&0 - echo - if [[ "$pwd1" == "" ]]; then - echo "'' is not a valid password" - continue - fi - read -p "Retype password for user '$user':" -r -s pwd2 <>/dev/tty 2>&0 - echo - - if [ "$pwd1" != "$pwd2" ] - then - echo "Passwords do not match" - fi - done - - # escape any slashes in resulting password - local epwd=$(mkpasswd -H md5 "$pwd1" | sed 's:/:\\/:g') - set_encrypted_password $user $epwd $rootfsdir$ofrconfdir/config.boot -} - -# setup grub on the boot sector of a user queried drive -install_grub () { - # we now use INSTALL_DRIVE to reference the grub boot drive. - # that way I can re-use select_drive. I'm lazy that way. - - if [ ${INSTALL_DRIVE:0:2} != "md" ]; then - INSTALL_DRIVE='' - fi - - mkdir -p $rootfsdir/boot/grub - # Let the user choose the boot sector - - while [ -z "$INSTALL_DRIVE" ] - do - echo "I need to install the GRUB boot loader." - echo "I found the following drives on your system:" - select_drive "Which drive should GRUB modify the boot partition on?" - done - - echo -n "Setting up grub: " - echo "Setting up grub..." >> $INSTALL_LOG - - # Install grub in the boot sector of the primary drive - progress_indicator start - grub-install --no-floppy --recheck --root-directory=$rootfsdir /dev/$INSTALL_DRIVE >>$INSTALL_LOG 2>&1 - progress_indicator stop - - # Check if using aufs - if grep -q aufs /proc/filesystems - then - if [ -z "$grub_options" ] - then - grub_options="union=aufs" - else - grub_options="$grub_options union=aufs" - fi - fi - - version=`dpkg-query --showformat='${Version}' --show vyatta-version` - - # if union install tell vyatta-grub-setup - if [ -n "$UNION" ]; then - grub_args="-u $version" - else - grub_args="-v $version" - fi - - if /opt/vyatta/sbin/vyatta-grub-setup $grub_args "$ROOT_PARTITION" "$grub_options" /mnt/rootfs >>$INSTALL_LOG - then - echo "OK" - else - echo Grub failed to install! - exit 1 - fi -} - -# ask for user input on the parted and skip setup methods -# $1 is whether or not to run parted -# sets globals INSTALL_DRIVE, ROOT_PARTITION, CONFIG_PARTITION -setup_method_manual() { - parted=$1 - - echo "The VyOS install needs a minimum ${ROOT_MIN}MB root" - echo "with partiton type 83 (Linux)." - echo -e "\n\n" - - # if this is parted, let the user create the partitions - if [ "$INSTALL_METHOD" == "parted" ] || [ "$INSTALL_METHOD" == "p" ]; then - while [ -z "$INSTALL_DRIVE" ] - do - # TODO: right now we only run parted on a single drive - echo -e "\nI found the following drives on your system:" - select_drive "Which drive would you like to run parted on?" - - done - - # Unmount the install drive if it is mounted - unmount "$INSTALL_DRIVE" - - # Run parted and let the user configure - parted /dev/$INSTALL_DRIVE - fi - - # Ask for the root partition and make sure it's valid - while [ -z "$ROOT_PARTITION" ] - do - select_partition 500 "Which partition should I install the root on?" - # Note that PARTITION is defined in select partition - ROOT_PARTITION=$PARTITION - unmount "$ROOT_PARTITION" - vd=$(grep $ROOT_PARTITION /proc/partitions | awk '{ print $4 }') - - if [ -z "$vd" ]; then - echo - echo "$ROOT_PARTITION is an invalid partition. Please try again." - ROOT_PARTITION="" - fi - done - - # check for an old config on the partition - check_config_partition "$ROOT_PARTITION" - - # create the filesystem on the part - make_filesystem "$ROOT_PARTITION" - - # We need to set the INSTALL_DRIVE if it wasn't set when the user ran parted - # We assume that we will use the boot sector of the same drive that the - # partition is on. - # TODO: Allow different drives to function as the boot device - if [ -z "$INSTALL_DRIVE" ]; then - if [ ${ROOT_PARTITION:0:2} = "md" ]; then - INSTALL_DRIVE=$ROOT_PARTITION - else - INSTALL_DRIVE=$(echo $ROOT_PARTITION | sed 's/[0-9]//g') - fi - fi -} - -# Walk the user through the auto setup method -# sets globals INSTALL_DRIVE, ROOT_PARTITION, CONFIG_PARTITION -setup_method_auto() { - while [ -z "$INSTALL_DRIVE" ] - do - echo "I found the following drives on your system:" - select_drive "Install the image on?" - - # check to make sure the drive is large enough to hold the image - if [ -n "$INSTALL_DRIVE" ]; then - lsize=$(get_drive_size "$INSTALL_DRIVE") - total=$ROOT_MIN - if [ "$total" -gt "$lsize" ]; then - echo "Unfortunately, VyOS requires a total of at least $total"MB" to properly install." - echo "$INSTALL_DRIVE is below the minimum required capacity and therefore, cannot be used to" - echo -e "complete the installation.\n" - echo "If other drives are present" - echo -e "Please select another drive...\n" - - INSTALL_DRIVE='' - fi - fi - done - - warn_of_dire_consequences - - echo - - # make sure we aren't working on a mounted part - unmount "$INSTALL_DRIVE" - - # remove any existing partitions on that drive - delete_partitions "$INSTALL_DRIVE" - - # Enforce minimum partion size requirement. - ROOT_PARTITION_SIZE=0 - while [ $ROOT_MIN -gt $ROOT_PARTITION_SIZE ]; do - # Get the size of the drive - size=$(get_drive_size $INSTALL_DRIVE) - - # If drive is big, leave more space 512K bytes (1024 sectors) - # this is better for SSD - if (( $size > 10000 )); then - ROOT_OFFSET="1024S" - fi - - echo -n "How big of a root partition should I create? ($ROOT_MIN"MB" - $size"MB") [$size]MB: " - response=$(get_response "$size") - # TODO: need to have better error checking on this value - ROOT_PARTITION_SIZE=$(echo "$response" | sed 's/[^0-9]//g') - if [ $ROOT_PARTITION_SIZE -lt $ROOT_MIN ] || [ $ROOT_PARTITION_SIZE -gt $size ]; then - echo "Root partion must be between $ROOT_MIN"MB" and $size"MB"" - echo - ROOT_PARTITION_SIZE=0 - fi - done - - echo - - # now take the data and create the partitions - create_partitions "$INSTALL_DRIVE" "$ROOT_PARTITION_SIZE" "$ROOT_OFFSET" "yes" - # mark data partition as bootable - echo "Marking /dev/$INSTALL_DRIVE partition 1 as bootable" >> $INSTALL_LOG - parted -s /dev/$INSTALL_DRIVE set 1 boot on >> $INSTALL_LOG 2>&1 - # Must give partition device time to settle - sleep 5 -} - -# walk the user through a union setup -# sets globals INSTALL_DRIVE, ROOT_PARTITION, CONFIG_PARTITION -setup_method_union() { - UNION=1 - - echo "A union install requires an image partition of at least 250mbs." - echo "If you want to accomodate more than one image on the partition," - echo "it should be larger. Each image is roughly 200mbs. This " - echo "partition will be the bootable partition for this machine." - echo - - # Ask for the image partition and make sure it's valid - while [ -z "$ROOT_PARTITION" ] - do - select_partition 250 "Which partition should I install the images on?" - # Note that PARTITION is defined in select partition - ROOT_PARTITION=$PARTITION - unmount "$ROOT_PARTITION" - vd=$(grep $ROOT_PARTITION /proc/partitions | awk '{ print $4 }') - - if [ -z "$vd" ]; then - echo - echo "$ROOT_PARTITION is an invalid partition. Please try again." - ROOT_PARTITION="" - fi - done - - echo Creating filesystem on $ROOT_PARTITION - make_filesystem $ROOT_PARTITION - - echo - echo "An optional writable persistent root partition may also" - echo "be created. This partition will allow you to store " - echo "files between reboots and upgrade packages." - echo - echo -n "Would you like to create a persistent root partition? (Yes/No) [Yes]: " - response=$(get_response "Yes" "Yes No Y N") - if [ "$response" == "yes" ] || [ "$response" == "y" ]; then - echo "The persistent root partition should be a minimum of 50mbs" - echo "for log files. If you plan on adding any other software or" - echo "upgrading it, the root partition should be large enough to" - echo "accomodate those packages" - - # Ask for the union partition and make sure it's valid - while [ -z "$UNION_PARTITION" ] - do - select_partition 50 "Which partition should I install the binary images on?" "$ROOT_PARTITION" - # Note that PARTITION is defined in select partition - UNION_PARTITION=$PARTITION - unmount "$UNION_PARTITION" - vd=$(grep $UNION_PARTITION /proc/partitions | awk '{ print $4 }') - - if [ -z "$vd" ]; then - echo - echo "$UNION_PARTITION is an invalid partition. Please try again." - UNION_PARTITION="" - fi - done - - echo Creating filesystems on $ROOT_PARTITION - make_filesystem $UNION_PARTITION - - echo Labeling $UNION_PARTITION - e2label /dev/$UNION_PARTITION live-rw - fi -} - -unmount () { - # grab the list of mounted drives - # make sure to reverse sort so as to unmount up the tree - mounted=$(mount | grep "$1" | cut -f3 -d' ' | sort -r) - if [ -n "$mounted" ]; then - echo "I need to unmount: " - echo "$mounted" - - response='' - while [ -z "$response" ] - do - echo -n "Continue (Yes/No) [No]: " - response=$(get_response "No" "Yes No Y N") - if [ "$response" == "no" ] || [ "$response" == "n" ]; then - echo -e "Ok then. Need to unmount to continue.\nExiting..." - exit 1 - fi - done - - for parts in "$mounted" - do - echo "umount $parts" >> $INSTALL_LOG - output=$(umount $parts) - status=$? - if [ "$status" != 0 ]; then - echo -e "Exiting: error unmounting $parts.\nPlease see $INSTALL_LOG for more details." - echo -e "Exiting: error unmounting $parts.\numount $parts\n$output" >> $INSTALL_LOG - exit 1 - fi - done - fi -} - -setup_xen_partition_images () { - if [ -d "$rootfsdir/var/xen/" ]; then - echo Setting up Xen virtual machine images - compressed_images=$(ls $rootfsdir/var/xen/*.img.gz 2> /dev/null) - if [ -n "$compressed_images" ]; then - for cmp_img in $compressed_images; do - # uncompress the image - uncmp_img=$(echo $cmp_img | sed s'/.gz$//') - if [ ! -f "$uncmp_img" ]; then - echo decompressing $cmp_img - gzip -dc $cmp_img > $uncmp_img - fi - done - fi - echo - fi -} - -setup_xen_extras () { - echo "Setting up config files for Xen..." - # Set up /boot/grub/menu.lst for use by pygrub - grubfile=$rootfsdir/boot/grub/menu.lst - echo "timeout 5" >> $grubfile - echo "" >> $grubfile - echo "title vyos-virt" >> $grubfile - echo "root (hd0,0)" >> $grubfile - echo "kernel /boot/vmlinuz root=/dev/xvda1 ro console=hvc0" >> $grubfile - echo "initrd /boot/initrd.img" >> $grubfile - - # Add /proc/xen entry to fstab - echo "xenfs /proc/xen xenfs defaults 0 0" >> $rootfsdir/etc/fstab - - # Comment out serial port entry and add Xen console entry to inittab. - inittab=$rootfsdir/etc/inittab - sed -i -e 's/^T0/#T0/' $inittab - echo "" >> $inittab - echo "h0:12345:respawn:/sbin/getty 38400 hvc0" >> $inittab -} - -check_for_xen_extras () { - prod=`/usr/sbin/dmidecode -s system-product-name` - if [ "$MANUF" = "Xen" -a "$prod" = "HVM domU" ]; then - echo "You are installing to a $MANUF $prod virtual machine." - echo "Would you like to set up config files to prepare for the" - echo -n "conversion to PV domU? [No]: " - response=$(get_response "No" "Yes No Y N") - if [ "$response" == "yes" ] || [ "$response" == "y" ]; then - setup_xen_extras - fi - fi -} - -progress_indicator () { - case "$1" in - start) $vyatta_bindir/progress-indicator $SPID & - ;; - *) - if ! rm /tmp/pi.$SPID 2>/dev/null - then - sleep 1 - rm /tmp/pi.$SPID 2>/dev/null - fi - - sleep 1 - echo -n -e "\b" - ;; - esac -} - -##### Main -## -# turn off any mounted swap files -turnoffswap - -# Print welcome and instructions. -echo "Welcome to the VyOS install program. This script" -echo "will walk you through the process of installing the" -echo "VyOS image to a local hard drive." -echo - -response='' -while [ -z "$response" ] -do - echo -n "Would you like to continue? (Yes/No) [Yes]: " - response=$(get_response "Yes" "Yes No Y N") - if [ "$response" == "no" ] || [ "$response" == "n" ]; then - echo "Ok then. Exiting..." - exit 1 - fi -done - -# some drives don't show up in /proc/partitions so we need to bootstrap them -echo -n "Probing drives: " -progress_indicator start -probe_drives -progress_indicator stop -echo "OK" - -INSTALL_METHOD='' -check_for_old_raid -if [ -z "$INSTALL_METHOD" ]; then - check_for_new_raid -fi - -if [ -z "$INSTALL_METHOD" ]; then - echo "The VyOS image will require a minimum ${ROOT_MIN}MB root." - echo "Would you like me to try to partition a drive automatically" - echo "or would you rather partition it manually with parted? If" - echo "you have already setup your partitions, you may skip this step." - echo - - while [ -z "$INSTALL_METHOD" ] - do - echo -n "Partition (Auto/Union/Parted/Skip) [Auto]: " - INSTALL_METHOD=$(get_response "Auto" "Auto Parted Skip Union A P S U") - done - - echo -fi - -# Unless doing union install, must be from live cd -if [ $INSTALL_METHOD != "union" -a $INSTALL_METHOD != "u" ] && - [ -w /live/image -o ! -d /live/image ] -then - echo "install-system can only be run from livecd" - echo "(except if doing union install)" - exit 1 -fi - -# TODO: Note installs assume an LBA BIOS. So no boot partition currently. -# also note that we are not creating a swap partition right now. -if [ "$INSTALL_METHOD" == "parted" ] || [ "$INSTALL_METHOD" == "p" ]; then - setup_method_manual "parted" -elif [ "$INSTALL_METHOD" == "skip" ] || [ "$INSTALL_METHOD" == "s" ]; then - setup_method_manual "skip" -elif [ "$INSTALL_METHOD" == "auto" ] || [ "$INSTALL_METHOD" == "a" ]; then - setup_method_auto -elif [ "$INSTALL_METHOD" == "union" ] || [ "$INSTALL_METHOD" == "u" ]; then - echo "A union install requires an image partition of at least 250mbs." - echo "If you want to accomodate more than one image on the partition," - echo "it should be larger. Each image is roughly 200mbs. This " - echo "partition will be the bootable partition for this machine." - echo - - UNION=1 - setup_method_auto -elif [ "$INSTALL_METHOD" == "vyatta" ]; then - echo "Automated install..." - echo "unmounting $INSTALL_DRIVE" - unmount "$INSTALL_DRIVE" - echo "deleting partitions on $INSTALL_DRIVE" - delete_partitions "$INSTALL_DRIVE" - echo "creating config partition" - create_partitions "$INSTALL_DRIVE" "$ROOT_PARTITION_SIZE" "$ROOT_OFFSET" "yes" - # mark data partition as bootable - echo "Marking /dev/$INSTALL_DRIVE partition 1 as bootable" >> $INSTALL_LOG - parted -s /dev/$INSTALL_DRIVE set 1 boot on >> $INSTALL_LOG 2>&1 - # Must give partition device time to settle - sleep 5 -fi - -# Install the root filesystem -install_root_filesystem "$ROOT_PARTITION" - -# Copy the config files -copy_config "$CONFIG_PARTITION" - -# Modify config to match system -# Assume user wants to keep password from old config -if [ ! -d /mnt/config ]; then - # Disable root login - set_encrypted_password root "*" $rootfsdir$ofrconfdir/config.boot - - echo "Enter password for administrator account" - change_password vyos -fi - -# restore ssh host keys -copy_sshkeys - -# check for xen part images in /var/xen -setup_xen_partition_images - -# Install grub -install_grub - -check_for_xen_extras - -if [ -z "$UNION" ]; then - # Fix up PAM configuration for login so that invalid users are prompted - # for password - sed -i 's/requisite[ \t][ \t]*pam_securetty.so/required pam_securetty.so/' $rootfsdir/etc/pam.d/login -fi - -# -# Only start the mdadm daemon if we have the root filesystem running -# on a RAID set. Since this script is the only way that the root filesystem -# ever gets set up, we can do this configuration here. -# -MDADM_CONFIG_FILE=$rootfsdir/etc/default/mdadm -if [ -e $MDADM_CONFIG_FILE ]; then - if [ ${INSTALL_DRIVE:0:2} = "md" ]; then - sed -i -e 's/^START_DAEMON.*$/START_DAEMON=true/' \ - -e 's/^AUTOSTART=.*$/AUTOSTART=true/' $MDADM_CONFIG_FILE - else - sed -i -e 's/^START_DAEMON.*$/START_DAEMON=false/' \ - -e 's/^AUTOSTART=.*$/AUTOSTART=false/' $MDADM_CONFIG_FILE - fi -fi - -postinst_root=$rootfsdir -writable_root='' -if [ -n "$UNION" ]; then - # set up root for postinst - postinst_root=/mnt/postinst_root - writable_root=$rootfsdir - version=`dpkg-query --showformat='${Version}' --show vyatta-version` - rw_dir=$rootfsdir/boot/$version/live-rw - - mkdir -p $postinst_root /mnt/squashfs - mount -o loop,ro -t squashfs \ - $rootfsdir/boot/$version/$version.squashfs /mnt/squashfs - mount -t unionfs -o noatime,dirs=$rw_dir=rw:/mnt/squashfs=ro unionfs \ - $postinst_root - - # handle start-up config file - mkdir -p $postinst_root/$ofrconfdir - if [ -f $rootfsdir/$ofrconfdir/config.boot ]; then - cp -p $rootfsdir/$ofrconfdir/* $postinst_root/$ofrconfdir/ - fi - - # set up /var/run - pi_fstab=$postinst_root/etc/fstab - if ! grep -q 'tmpfs /var/run ' $pi_fstab >&/dev/null; then - # replace the fstab. the default one has header that will cause - # it to be wiped out on live boot. - echo 'tmpfs /var/run tmpfs nosuid,nodev 0 0' >$pi_fstab - fi -fi - -# postinst hook -if [ -e /opt/vyatta/etc/install-system/postinst ]; then - echo "running post-install script" - /opt/vyatta/etc/install-system/postinst $postinst_root $writable_root \ - >>$INSTALL_LOG -fi - -if [ -n "$UNION" ]; then - umount $postinst_root - umount /mnt/squashfs -fi - -cp $INSTALL_LOG $rootfsdir/install.log - -umount $rootfsdir - -echo "Done!" -echo "Done!" >> $INSTALL_LOG - -exit 0 |