You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1927 lines
50 KiB

#!/usr/bin/env bash
version="refractainstaller 9.6.7 (20230607)"
TEXTDOMAIN=refractainstaller-base
export TEXTDOMAIN
TEXTDOMAINDIR=/usr/share/locale
export TEXTDOMAINDIR
# Copyright 2011-2021 fsmithred@gmail.com
# Portions may be copyright Dean Linkous and/or David Hare and/or others.
# Based on refractainstaller-8.0.3 by Dean Linkous
# Licence: GPL-3
# This is free software with no warrantees. Use at your own risk.
# This script will install a refracta live-cd to a hard drive. It gives
# you the option to install the entire system to one partition or to
# install with /home on a separate partition.
# NOTE: If you try to tee this to an install log, you won't see it
# when cryptsetup asks you to confirm with YES.
# If you want to change any defaults, change them in the configfile.
# Default is /etc/refractainstaller.conf
# If you want to use a different config file for testing, change this
# variable. Normally, users should not edit anything in this script.
configfile="/etc/refractainstaller.conf"
show_help () {
programname="$0"
echo $"
Usage: $programname [option]
Run with no options to install a live-CD/DVD/USB to hard drive.
If you want to use the graphical version, run refractainstaller-gui
from a terminal or run Refracta Installer from the System menu.
valid options:
-h, --help show this help text
-v, --version display the version information
-d. --debug debug mode
"
}
while [[ $1 == -* ]]; do
option="$1"
case "$option" in
-h|--help)
show_help
exit 0 ;;
-v|--version)
printf "\n$version\n\n"
exit 0 ;;
-d|--debug)
DEBUG="yes"
break ;;
*) echo $"
invalid option: $option \n\n
Try: $programname -h for full help. \n\n"
exit 1 ;;
esac
done
# Check that user is root.
if [[ $(id -u) -ne 0 ]] ; then
echo $" You need to be root!"
exit 1
fi
# Fix root's path (for Buster/Beowulf and later)
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Check for config file.
if [[ -f $configfile ]]; then
source $configfile
else
echo $"
Config file $configfile is missing
Exiting...
"
exit 1
fi
# Record errors in a logfile.
exec 2>"$error_log"
if [[ $DEBUG = "yes" ]] ; then
set -x
fi
# Check to be sure we're running a live session; give warning if not.
if [[ ! -d /lib/live/mount/medium ]] && [[ ! -d /lib/live/mount/findiso ]] && [[ ! -d /lib/live/mount/fromiso ]] && [[ ! -d /lib/live/mount/persistence ]] && [[ ! -d /run/live/medium ]] ; then
echo $"
### WARNING: Not running from live-CD or live-USB ###
### or unsupported configuration. Be sure you know ###
### what you are doing. This may not work. ###
Press ENTER to proceed or ctrl-c to exit. " ; read -p " "
fi
# Run pre-install scripts if enabled in config file.
if [[ $run_preinstall = "yes" ]] ; then
for file in /usr/lib/refractainstaller/pre-install/* ; do
if [[ -x $file ]] ; then
bash $file
fi
done
fi
# function to exit the script if there are errors
check_exit () {
exit_code="$?"
if [[ $exit_code -ne 0 ]] ; then
echo $"
Exit due to error: $exit_code
See $error_log for details.
"
exit 1
fi
}
# Check that rsync excludes file exists, or create one.
if ! [[ -f $rsync_excludes ]] ; then
echo $"
There is no rsync excludes file, or its name does not match what
this script expects. You should let the script create one, or if
you have a custom excludes file, and you know what you're doing,
you can exit the script and edit the rsync_excludes variable in
the config file to match the name and path of your custom file.
Press ENTER to proceed or hit ctrl-c to exit. "
read -p ""
rsync_excludes="$(pwd)/installer_exclude.list"
echo $"
Creating rsync excludes file, $rsync_excludes
"
sleep 2
cat > "$rsync_excludes" <<EOF
# It is safe to delete this file after installation.
- /dev/*
- /cdrom/*
- /media/*
- /target
- /swapfile
- /mnt/*
- /sys/*
- /proc/*
- /tmp/*
- /live
- /boot/grub/grub.cfg
- /boot/grub/menu.lst
- /boot/grub/device.map
- /etc/udev/rules.d/70-persistent-cd.rules
- /etc/udev/rules.d/70-persistent-net.rules
- /etc/fstab
- /etc/mtab
- /home/snapshot
- /home/*/.gvfs
- /var/lib/dbus/machine-id
- /etc/popularity-contest.conf
# Added for newer version of live-config/live-boot
# in sid (to become Jessie)
- /lib/live/overlay
- /lib/live/image
- /lib/live/rootfs
- /lib/live/mount
- /run/*
# Added for symlink /lib
- /usr/lib/live/overlay
- /usr/lib/live/image
- /usr/lib/live/rootfs
- /usr/lib/live/mount
EOF
check_exit
chmod 666 "$rsync_excludes"
fi
### UEFI TESTS
# Test for efi boot
# Test for esp partition, test for gpt partition table
# Test for grub version
show_installer_help () {
zless "$installer_help"
while true ; do
echo $"
Now that you know what you're doing...
1) Continue
2) Abort the installation
"
read ans
case "$ans" in
1) break ;;
2) exit 0 ;;
esac
done
}
grubversion=$(dpkg -l | egrep "ii|hi" | grep -v bin | grep -v doc | awk '$2 ~ "grub-[eglp]" { print $2}')
gpt_list=$(env LC_ALL=C fdisk -l | awk '/Disklabel type/ { print $3 }' | grep gpt)
bios_grub_dev=$(env LC_ALL=C fdisk -l | awk '/BIOS boot/ { print $1 }')
# Check for UEFI boot and EFI partition
if [[ -d /sys/firmware/efi ]]; then
uefi_boot="yes"
esp_count=$(env LC_ALL=C fdisk -l | awk '/EFI System/ { print $0 }' | wc -l)
if [ -z "$gpt_list" ] ; then
gpt_message=$"There is no disk with a gpt partition table.
You should exit this script and run gdisk to create one for uefi boot."
fi
if [ "$esp_count" -eq 1 ] ; then
esp_dev=$(env LC_ALL=C fdisk -l | awk '/EFI System/ { print $1 }')
esp_dev_message=$"EFI partition found at ${esp_dev}
If this is not on the first hard disk, something may be wrong,
and you should investigate the situation."
if ! blkid -c /dev/null -s TYPE "$esp_dev" | grep -q "vfat" ; then
must_choose_esp="yes"
esp_dev_message=$"EFI partition found at ${esp_dev}
will need to be formatted FAT32"
fi
else
must_choose_esp="yes"
if [ "$esp_count" -eq 0 ] ; then
esp_dev_message=$" There is no EFI partition. You will need to create one."
elif [ "$esp_count" -gt 1 ] ; then
esp_dev_message=$"More than one EFI partition was detected.
You will need to select one. Normally, it's on the first hard disk."
fi
fi
if ! [[ "$grubversion" =~ grub-efi ]] ; then # grub-efi-${grub_arch}*.deb to include grub-efi-ia32
grub_package="grub-efi*.deb" # make sep vars for grub-x and grub-x-bin. Maybe sep. messages. Or sep. dirs?
grub_debs=$(ls "$grub_package_dir"/${grub_package}) # don't quote $grub_package here.
if [[ -n "$grub_debs" ]] ; then
grub_package_message=$"grub package(s) found in $grub_package_dir"
fi
grub_efi_warning=$" ### WARNING ###
grub-efi is not installed.
If you have the deb packages, you will be given a chance to install
them into the new system.
${grub_package_message}
${grub_debs}"
fi
while true ; do
echo $"
${esp_dev_message}
${gpt_message}
DO NOT FORMAT A PRE-EXISTING EFI PARTITION!!!
1) Help
2) Continue
3) Abort the installation
"
read ans
case "$ans" in
1) show_installer_help ; break ;;
2) break ;;
3) exit 0 ;;
esac
done
else
# not uefi, do bios install.
esp_list=$(env LC_ALL=C fdisk -l | awk '/EFI System/ { print $0 }')
if [[ -n "$esp_list" ]] ; then
esp_dev_message=$"EFI partition(s) found. Do not format any EFI
partitions if you plan to use them for uefi booting.
${esp_list}"
fi
if [ -n "$gpt_list" ] && [ -z "$bios_grub_dev" ] ; then
gpt_message=$"To boot a gpt disk in legacy bios you must create a
small (>1M) unformatted partition with bios_grub flag in parted/gparted
or EF02 in gdisk. Or boot from a disk that has dos partition table.
More info: http://www.rodsbooks.com/gdisk/bios.html"
fi
###### grub-pc and grub-pc-bin get installed out of order
###### Need to make $grub_package and $grub_bin_package
###### and install them in correct order.
if [[ "$grubversion" =~ grub-efi ]] || [[ -z "$grubversion" ]] ; then
grub_package="grub-pc*.deb"
grub_debs=$(ls "$grub_package_dir"/${grub_package}) # don't quote $grub_package here.
if [[ -n "$grub_debs" ]] ; then
grub_package_message=$"grub package(s) found. The installer will ask you later if you want to copy files and install the bootloader."
else grub_package_message="grub-pc is missing. You can proceed without a bootloader or abort the installation and correct the situation. Suggestion: apt install grub-pc"
fi
grub_efi_warning=$"
${grub_package_message}
${grub_debs}"
while true ; do
echo $"
${grub_efi_warning}
${esp_dev_message}
${gpt_message}
1) Help
2) Continue
3) Abort the installation
"
read ans
case "$ans" in
1) show_installer_help ; break ;;
2) break ;;
3) exit 0 ;;
esac
done
fi
fi
# Partition a disk
list_disks () {
clear
echo
env LC_ALL=C fdisk -l | egrep "^Disk|^/dev"
sleep 5
}
partition_disk () {
if [ -n "$gpt_list" ] || [ "$uefi_boot" = yes ] ; then
cli_partition_tool="gdisk"
else
cli_partition_tool="cfdisk"
fi
while true; do
echo $"
You need to have a partition ready for the installation. If you
haven't already done that, you can run the partition editor now.
If you want a separate /home partition, you should create it at
this time, this script will ask you later if you've done that.
Choices (enter number):
1. GParted
2. $cli_partition_tool
3. No thanks, I already have a partition prepared. Continue.
4. I'd like to exit the script now.
"
read ans
case $ans in
1) if ! [[ -f /usr/sbin/gparted ]]; then
while true; do
echo $"
GParted is not installed. Would you like to use $cli_partition_tool instead?
1) Yes (use $cli_partition_tool)
2) No (exit the script)
"
read ans
case $ans in
[1Yy]*) "$cli_partition_tool"
echo $"Running partprobe..."
partprobe
ask_partition
break ;;
[2Nn]*) exit 0 ;;
esac
done
elif ! [[ $DISPLAY ]]; then
while true; do
echo $"
GParted requires a graphical environment.
Would you like to use $cli_partition_tool instead?
1) Yes (use ${cli_partition_tool})
2) No (exit the script)
"
read ans
case $ans in
[1Yy]*) "$cli_partition_tool"
echo $"Running partprobe..."
partprobe
ask_partition ; break ;;
[2Nn]*) exit 0 ;;
esac
done
else
gparted
echo $"Running partprobe..."
partprobe
ask_partition
fi
break ;;
2) "$cli_partition_tool"
echo $"Running partprobe..."
partprobe
ask_partition ; break ;;
3) break ;;
4) exit 0 ;;
esac
done
}
ask_partition () {
while true ; do
echo $"
Press 1 to return to partioning a disk
or press ENTER to proceed."
read ans
case $ans in
[1Yy]) list_disks ; partition_disk ; break ;;
*) break ;;
esac
done
}
list_disks
partition_disk
ask_format_efi () {
while true ; do
echo $"
WARNING: The selected partition does not contain a FAT32 filesystem.
If you just created a new efi partition (ef00), you need to format it.
1) Yes, create a fat32 filesystem on $esp_dev
2) No, proceed without a bootloader.
3) Abort the install to investigate the situation.
"
read ans
case "$ans" in
[1Yy]*) mkfs.vfat -F 32 "$esp_dev" ; break ;;
[2Nn]*) break ;;
[3Xx]*) exit 0 ;;
esac
done
}
choose_esp () {
esp_info=$(env LC_ALL=C fdisk -l | awk '/EFI System/ { print $0 }')
esp_dev_list=$(env LC_ALL=C fdisk -l | awk '/EFI System/ { print $1 }')
esp_count=$(env LC_ALL=C fdisk -l | awk '/EFI System/ { print $0 }' | wc -l)
if [ "$esp_count" -eq 0 ] ; then
esp_dev_message=$"There is no EFI partition. You will need to create one
or proceed without a bootloader."
echo "$esp_dev_message"
ask_partition
else
echo $"
******************************************************
Enter the device name for the EFI partition to use.
(example: /dev/sda1)
$esp_info
enter device:"
read esp_dev
if ! echo "$esp_dev_list" | grep -q "$esp_dev"; then
echo $"Not a valid EFI partition.
Press ctrl-c to exit, or press ENTER to proceed without a bootloader.
DO NOT SELECT AN EFI PARITION FOR ANOTHER PURPOSE."
esp_dev=""
fi
if [ -n "$esp_dev" ] ; then
if ! blkid -c /dev/null -s TYPE "$esp_dev" | grep -q "vfat" ; then
ask_format_efi
fi
fi
fi
}
# Re-check EFI partition count after partitioning.
if [ "$esp_count" -eq 1 ] ; then
esp_count=$(env LC_ALL=C fdisk -l | awk '/EFI System/ { print $0 }' | wc -l)
fi
if [ "$esp_count" -gt 1 ] ; then
must_choose_esp="yes"
fi
if [[ $must_choose_esp = "yes" ]] ; then # do if [[ $uefi_boot = "yes" ]]
choose_esp
fi
# Select location for bootloader.
# If location is entered but does not exist, then exit with error.
select_grub_dev () {
echo $"
Where would you like the GRUB bootloader to be installed?
(probably a drive, like /dev/sda)
If you don't want to install the bootloader, leave this blank.
"
read grub_dev
if [[ -n $grub_dev ]] ; then
if ! [[ -b $grub_dev ]] ; then
echo $" $grub_dev is not a block device."
exit 1
fi
fi
# If you enter a partition instead of a drive for grub_dev... ##### NOT FOR NVME DISKS (or >9 partitions)
if [[ ${grub_dev: -1} = [1-9] ]] ; then #### (This way should work for nvme)
grub_partition="$grub_dev"
else
partition_table=$(env LC_ALL=C fdisk -l "$grub_dev" | awk '/Disklabel type/ { print $3 }')
fi
if [ "$partition_table" = gpt ] && [ -z "$bios_grub_dev" ] ; then
bios_boot_warning="bootloader will fail without BIOS boot partition."
grub_dev=""
echo $"
WARNING: There is no BIOS boot partition.
Press ENTER to proceed without bootloader or ctrl-c to quit.
"
read -p ""
fi
}
if [[ $uefi_boot = "yes" ]] ;then
grub_dev="efi"
if [[ -z "$esp_dev" ]] ; then
grub_dev=""
fi
elif [[ -z "$grub_package" ]] ; then # grub_package is null if correct grub is installed.
select_grub_dev
fi
# Enter device for /boot partition or skip. If one is entered, test it.
echo $"
If you created a separate partition for /boot, enter it here.
To skip this, just hit the ENTER key.
(give the full device name, like /dev/sda1): "
read boot_dev
echo "$boot_dev"
if [[ -n $boot_dev ]] ; then
if ! [[ -b $boot_dev ]] ; then
echo $"
$boot_dev is not a block device.
You may continue and install without a separate boot partition,
or you can hit ctrl-c to exit, then re-run the script, and
be sure to create a partition for /boot.
"
boot_dev=
echo $"Press ENTER to continue or ctrl-c to exit."
read -p " "
fi
if ! [[ ${boot_dev: -1} = [0-9] ]] ; then
echo $"
$boot_dev does not end in a digit.
Be sure it's a partition, not a whole drive.
Maybe it's a logical partition?
"
echo $"Press ENTER to continue or ctrl-c to exit."
read -p " "
fi
if [[ $boot_dev = $esp_dev ]] ; then
echo $" EFI partition and /boot partition cannot be the same.
You may continue and install without a separate boot partition,
or you can hit ctrl-c to exit,"
boot_dev=
echo $"Press ENTER when you're ready to continue"
read -p " "
fi
fi
# Choose filesystem type for /boot if it exists.
choose_fs_boot () {
while true; do
echo $"
What type of filesystem would you like on $boot_dev?
Choices (enter number):
2) ext2 (recommended for /boot)
3) ext3
4) ext4
"
read ans
case $ans in
2) fs_type_boot="ext2" ; break ;;
3) fs_type_boot="ext3" ; break ;;
4) fs_type_boot="ext4" ; break ;;
esac
done
}
if [[ -n $boot_dev ]]; then
if [[ $no_format = "yes" ]]; then
fs_type_boot=$(blkid -s TYPE "$boot_dev" | awk -F"\"" '{ print $2 }')
else
choose_fs_boot
fi
fi
# Choose partition for root filesystem
echo $"
Which partition would you like to use for the installation
of the operating system?
(give the full device name, like /dev/sda1): "
read install_dev
if ! [[ -b $install_dev ]] ; then
echo $" $install_dev is not a block device! "
exit 1
fi
if ! [[ ${install_dev: -1} = [0-9] ]] ; then
echo $"
$install_dev does not end in a digit.
Be sure it's a partition, not a whole drive.
Maybe it's a logical partition?
"
echo $"Press ENTER to continue or ctrl-c to exit."
read -p " "
fi
# Choose filesystem type for OS.
choose_fs_os () {
while true; do
echo $"
What type of filesystem would you like on $install_dev?
Choices (enter number):
2) ext2
3) ext3
4) ext4
"
read ans
case $ans in
2) fs_type_os="ext2" ; break ;;
3) fs_type_os="ext3" ; break ;;
4) fs_type_os="ext4" ; break ;;
esac
done
# Decide if OS should be encrypted
while true; do
echo $"
Do you want the operating system on an encrypted partition?
1) yes
2) no
"
read ans
case $ans in
[1Yy]*) encrypt_os="yes"
# test for cryptsetup
if ! [[ -f /sbin/cryptsetup ]]; then
while true; do
echo $" Cryptsetup is not installed. You need to
install it and run the command, 'sudo modprobe dm-mod'
before you can use encryption.Do you want to proceed
without encrypting the partition?
1) Yes, proceed without encrypting the partition
2) No. Exit
"
read ans
case $ans in
[1Yy]*) encrypt_os="no" ; break 2 ;;
[2Nn]*) exit 1 ;;
esac
done
fi
# end test for cryptsetup
# test to see if there's a separate /boot partition
if [[ -z $boot_dev ]] ; then
while true; do
echo $"
Your /boot directory will be part of the encrypted filesystem.
luks1 format will be used for this partition.
You can proceed, go back to partitioning, or you can exit and start over.
1) Continue
2) Return to partitioning
3) Exit
"
read ans
case $ans in
[1Yy]*) encrypt_boot="yes" ; break ;;
[2]) partition_disk ;;
[3Nn]*) exit 1 ;;
esac
done
fi
# end test for separate /boot partition
break ;;
[2Nn]*) encrypt_os="no" ; break ;;
esac
done
}
if [[ $no_format = "yes" ]]; then
fs_type_os=$(blkid -s TYPE "$install_dev" | awk -F"\"" '{ print $2 }')
else
choose_fs_os
fi
# Enter device for /home partition or skip. If one is entered, test it.
echo $"
If you created a separate partition for /home,
enter the full device name. However, if you're
installing everything to one partition, you should
leave this blank.
/home partition (if one exists): "
read home_dev
if [[ -n $home_dev ]] ; then
if ! [[ -b $home_dev ]] ; then
echo $"
$home_dev is not a block device.
You may continue and install without a separate home partition,
or you can hit ctrl-c to exit, then re-run the script, and
be sure to create a partition for /home.
"
home_dev=
echo $"Press ENTER to continue or ctrl-c to exit."
read -p " "
fi
if ! [[ ${home_dev: -1} = [0-9] ]] ; then
echo $"
$home_dev does not end in a digit.
Be sure it's a partition, not a whole drive.
Maybe it's a logical partition?
"
echo $"Press ENTER to continue or ctrl-c to exit."
read -p " "
fi
if [[ $home_dev = $esp_dev ]] ; then
echo $" EFI partition and /home partition cannot be the same.
You may continue and install without a separate home partition,
or you can hit ctrl-c to exit,"
home_dev=
echo $"Press ENTER when you're ready to continue"
read -p " "
fi
fi
# Choose filesystem type for /home if needed
choose_fs_home () {
while true; do
echo $"
What type of filesystem would you like on $home_dev?
Choices (enter number):
2) ext2
3) ext3
4) ext4
"
read ans
case $ans in
2) fs_type_home="ext2" ; break ;;
3) fs_type_home="ext3" ; break ;;
4) fs_type_home="ext4" ; break ;;
esac
done
# Decide if /home should be encrypted
while true; do
echo $"
Do you want /home on an encrypted partition?
1) Yes
2) No
"
read ans
case $ans in
[1Yy]*) encrypt_home="yes"
# test for cryptsetup
if ! [[ -f /sbin/cryptsetup ]]; then
while true; do
echo $" Cryptsetup is not installed. You need to
install it and run the command, 'sudo modprobe dm-mod'
before you can use encryption. Do you want to proceed
without encrypting the partition?
1) Yes, proceed without encrypting the partition.
2) No. Exit
"
read ans
case $ans in
[1Yy]*) encrypt_home="no" ; break 2 ;;
[2Nn]*) exit 1 ;;
esac
done
fi
# end test for cryptsetup
break ;;
[2Nn]*) encrypt_home="no" ; break ;;
esac
done
}
if [[ -n $home_dev ]]; then
if [[ $no_format = "yes" ]]; then
fs_type_home=$(blkid -s TYPE "$home_dev" | awk -F"\"" '{ print $2 }')
else
choose_fs_home
fi
fi
# Show available swap partitions and choose one.
choose_swap () {
echo $"
List of swap partitions available
$swap_info
Enter the swap device to use. If you don't enter a device name,
a swapfile will be used instead.
"
read swap_dev
if ! [ -b "$swap_dev" ] ; then
use_existing_swap="no"
fi
}
swap_info=$(/sbin/blkid | awk '/TYPE="swap"/ {print "\n" $0 }')
swap_device_list=$(/sbin/blkid -s TYPE | awk -F: '/swap/ {print "\n" $1 }')
if [[ -n "$swap_device_list" ]] ; then
use_existing_swap="yes"
choose_swap
fi
# Use UUID in fstab? (and test for encrypted OS or home)
while true; do
echo $"
Would you like fstab to use the UUID to identify filesystems?
This is useful if your drive order changes between reboots.
Press ENTER for YES.
Press 2 for no.
"
read ans
case $ans in
[2Nn]*) break ;;
*) use_uuid="yes"
if [[ $encrypt_os = "yes" ]] || [[ $encrypt_home = "yes" ]]; then
uuid_message=$"--> UUIDs will be used in crypttab
/dev/mapper/<name> will be used in fstab."
fi
break ;;
esac
done
# Enter new hostname (or use the old hostname as the new one)
# Test to make sure it's a legal hostname, and let user fix it
# if it's not.
fix_hostname () {
while true; do
echo $"
Illegal hostname. Try again.
You can use alphanumeric characters anywhere in the hostname, and
you can use the minus sign (-) as long as it's not at the beginning
or end.
New hostname: "
read new_hostname
break
done
test_hostname
}
test_hostname () {
if [[ -z $new_hostname ]]; then
new_hostname="$HOSTNAME"
fi
if [[ ! "$new_hostname" =~ (^[a-zA-Z0-9]([a-zA-Z0-9]|-)+[a-zA-Z0-9]$) ]]; then
fix_hostname
fi
hostname_len=${#new_hostname}
if [[ $hostname_len -gt 63 ]]; then
fix_hostname
fi
}
select_hostname () {
while true; do
echo $"
The current hostname is ${HOSTNAME}. To change that, enter the new
hostname here. To leave it unchanged, just press ENTER.
New hostname: "
read new_hostname
break
done
test_hostname
}
# Change hostname if desired
select_hostname
# In case null was entered above as hostname, then set it to $HOSTNAME
new_hostname=${new_hostname:="$HOSTNAME"}
# Show a summary of what will be done
if [[ $grub_dev = "efi" ]] || [[ -n "$grub_package" ]] ; then
grub_dev_message=$"--> You will be asked about a bootloader later."
elif [[ -n $grub_dev ]] ; then
grub_dev_message=$"--> Bootloader will be installed in $grub_dev"
elif [[ -n $grub_partition ]] ; then
grub_dev_message=$"--> Bootloader will be installed in $grub_partition"
else
grub_dev_message=$"--> Bootloader will not be installed."
fi
if [[ $encrypt_os = yes ]] ; then
os_enc_message=$", and will be encrypted."
fi
if [[ -z $home_dev ]] ; then
home_dev_message=$"--> /home will not be on a separate partition."
elif [[ $no_format = "yes" ]] ; then
home_dev_message=$"--> /home will be installed on $home_dev without formatting it."
else
home_dev_message=$"--> /home will be installed on $home_dev and formatted as $fs_type_home"
fi
if [[ -n $home_dev ]] && [[ $encrypt_home = yes ]] ; then
home_enc_message=$", and will be encrypted."
fi
if [[ -n $boot_dev ]] ; then
if [[ $no_format != "yes" ]]; then
boot_dev_message=$"--> /boot will be installed on $boot_dev and formatted as $fs_type_boot."
else
boot_dev_message=$"--> /boot will be installed on $boot_dev"
fi
fi
if [[ $no_format = "yes" ]]; then
install_dev_message=$"--> Operating system will be installed on $install_dev without formatting it."
else
install_dev_message=$"--> Operating system will be installed on $install_dev and formatted as $fs_type_os"
fi
while true; do
echo $"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
SUMMARY OF WHAT WILL BE DONE
$grub_dev_message
$install_dev_message$os_enc_message
$home_dev_message$home_enc_message
$boot_dev_message
$uuid_message
Hostname: $new_hostname
WARNING: This is your last chance to exit before any changes are made.
Proceed with the installation?
1) Yes
2) No, abort the installation.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
"
read ans
case $ans in
[1Yy]*) break ;;
[2Nn]*) exit 0 ;;
esac
done
# Actual installation begins here
# Unmount or close anything that might need unmounting or closing
cleanup () {
echo -e $"\n Cleaning up...\n"
if $(df | grep -q /target/proc/) ; then
umount /target/proc/
fi
if $(df | grep -q /target/dev/) ; then
umount /target/dev/
fi
if $(df | grep -q /target/sys/) ; then
umount /target/sys/
fi
if $(df | grep -q /target_boot/efi) ; then
umount -l /target_boot/efi
fi
if $(df | grep -q /target_boot) ; then
umount -l /target_boot/
fi
if $(df | grep -q /target_home) ; then
umount -l /target_home/
fi
if $(df | grep -q /target) ; then
umount -l /target/
fi
if $(df | grep -q $install_dev) ; then
umount $install_dev
fi
if $(df | grep "\/dev\/mapper\/root_fs") ; then
umount /dev/mapper/root_fs
fi
if [[ -h /dev/mapper/root_fs ]] ; then
cryptsetup luksClose /dev/mapper/root_fs
fi
if $(df | grep -q $home_dev) ; then
umount $home_dev
fi
if $(df | grep -q "\/dev\/mapper\/home_fs") ; then
umount /dev/mapper/home_fs
fi
if [[ -h /dev/mapper/home_fs ]] ; then
cryptsetup luksClose home_fs
fi
if $(df | grep -q $boot_dev) ; then
umount -l $boot_dev
fi
# These next ones might be unnecessary
if [[ -d /target ]] ; then
rm -rf /target
fi
if [[ -d /target_home ]] ; then
rm -rf /target_home
fi
if [[ -d /target_boot ]] ; then
rm -rf /target_boot
fi
}
cleanup
# make mount point, format, adjust reserve and mount
# install_dev must maintain the device name for cryptsetup
# install_part will be either device name or /dev/mapper name as needed.
echo -e $"\n Preparing $install_dev...\n"
mkdir /target ; check_exit
if [[ $encrypt_os = yes ]] ; then
echo $" You will need to create a passphrase."
if [[ $encrypt_boot = "yes" ]] ; then
cryptsetup luksFormat --type luks1 "$install_dev" ; check_exit
else
cryptsetup luksFormat "$install_dev" ; check_exit
fi
echo $"Encrypted partition created. Opening it..."
cryptsetup luksOpen "$install_dev" root_fs ; check_exit
install_part="/dev/mapper/root_fs"
else
install_part="$install_dev"
fi
if [[ $no_format != "yes" ]]; then
mke2fs -t $fs_type_os "$install_part" # ; check_exit
# tune2fs -r 10000 "$install_part" ; check_exit
fi
mount "$install_part" /target ; check_exit
# make mount point for separate home if needed
# and add /home/* to the excludes list if it's not already there
if [[ -n $home_dev ]] ; then
echo $"
Preparing $home_dev...
"
mkdir /target_home ; check_exit
if [[ $encrypt_home = yes ]]; then
echo $"
You will need to create a passphrase.
"
cryptsetup luksFormat "$home_dev"
check_exit
echo $"Encrypted partition created. Opening it..."
cryptsetup luksOpen "$home_dev" home_fs
check_exit
home_part="/dev/mapper/home_fs"
else
home_part=$home_dev
fi
if [[ $no_format != "yes" ]]; then
mke2fs -t $fs_type_home "$home_part" # ; check_exit
# tune2fs -r 10000 "$home_part" ; check_exit
fi
mount "$home_part" /target_home ; check_exit
sep_home_opt="--exclude=/home/*"
fi
# make mount point for separate /boot if needed
# and add /boot/* to the excludes list if it's not already there
# allow default for reserved blocks (don't need tune2fs here)
if [[ -n $boot_dev ]] ; then
mkdir /target_boot ; check_exit
if [[ $no_format != "yes" ]]; then
mke2fs -t $fs_type_boot $boot_dev # ; check_exit
fi
mount $boot_dev /target_boot
sep_boot_opt="--exclude=/boot/*"
fi
# copy everything over except the things listed in the exclude list
echo -e $"\n Copying system to new partition...\n"
rsync -avX / /target/ --filter='P lost+found' --filter='H lost+found' --exclude-from="$rsync_excludes" ${sep_home_opt} ${sep_boot_opt}
# copy separate /home if needed
if [[ -n $home_part ]] ; then
echo -e $"\n Copying home folders to new partition...\n"
rsync -avX /home/ /target_home/ --filter='P lost+found' --filter='H lost+found' --exclude-from="$home_boot_excludes"
fi
# copy separate /boot if needed
if [[ -n $boot_dev ]] ; then
echo -e $"\n Copying files to boot partitions...\n"
rsync -avX /boot/ /target_boot/ --filter='P lost+found' --filter='H lost+found' --exclude-from="$home_boot_excludes"
fi
#*************************************************************
# make some basic entries in /dev so the system can boot properly before udev starts
mknod -m 622 /target/dev/console c 5 1
mknod -m 666 /target/dev/null c 1 3
mknod -m 666 /target/dev/zero c 1 5
mknod -m 666 /target/dev/ptmx c 5 2
mknod -m 666 /target/dev/tty c 5 0
mknod -m 444 /target/dev/random c 1 8
mknod -m 444 /target/dev/urandom c 1 9
chown -v root:tty /target/dev/{console,ptmx,tty}
ln -sv /proc/self/fd /target/dev/fd
ln -sv /proc/self/fd/0 /target/dev/stdin
ln -sv /proc/self/fd/1 /target/dev/stdout
ln -sv /proc/self/fd/2 /target/dev/stderr
ln -sv /proc/kcore /target/dev/core
ln -sv /run/shm /target/dev/shm
mkdir -v /target/dev/pts
#*************************************************************
# create swap
if ! [[ $use_existing_swap = "yes" ]] ; then
echo -e $"\n Making a swap file...\n"
dd if=/dev/zero of=/target/swapfile bs="$swapfile_blocksize" count="$swapfile_count" ; check_exit
mkswap /target/swapfile ; check_exit
chmod 600 /target/swapfile
fi
# Disallow mounting of all fixed drives with pmount
if [[ -f /target/etc/pmount.allow ]] ; then
if [[ $pmount_fixed = "no" ]] ; then
sed -i 's:/dev/sd\[a-z\]:#/dev/sd\[a-z\]:' /target/etc/pmount.allow
fi
fi
# Re-enable updatedb if it was disabled by an older version of refractasnapshot
if [[ -e /target/usr/bin/updatedb.mlocate ]] ; then
if ! [[ -x /target/usr/bin/updatedb.mlocate ]] ; then
chmod +x /target/usr/bin/updatedb.mlocate
fi
fi
# Disable auto-login
while true; do
echo -e $" \n\nDisable auto-login?
Press ENTER for YES.
Press 2 for no.
"
read ans
case $ans in
[2Nn]*) break ;;
*)
disable_auto_desktop="yes"
break ;;
esac
done
# Disable autologin
set_noautologin_desktop () {
#gdm
if [[ -f /target/etc/gdm/gdm.conf ]]; then
sed -i 's/^AutomaticLogin/#AutomaticLogin/' /target/etc/gdm/gdm.conf
fi
#gdm3
if [[ -f /target/etc/gdm3/daemon.conf ]]; then
sed -i 's/^AutomaticLogin/#AutomaticLogin/' /target/etc/gdm3/daemon.conf
fi
#lightdm
if [[ -f /target/etc/lightdm/lightdm.conf ]]; then
sed -i 's/^autologin/#autologin/g' /target/etc/lightdm/lightdm.conf
fi
#kdm
if [ -f /target/etc/default/kdm.d/live-autologin ]; then
rm -f /target/etc/default/kdm.d/live-autologin
fi
if [ -f /target/etc/kde3/kdm/kdmrc ]; then
sed -i -e 's/^AutoLogin/#AutoLogin/g' /target/etc/kde3/kdm/kdmrc \
-e 's/^AutoReLogin/#AutoReLogin/g' /target/etc/kde3/kdm/kdmrc
fi
if [ -f /target/etc/kde4/kdm/kdmrc ]; then
sed -i -e 's/^AutoLogin/#AutoLogin/g' /target/etc/kde4/kdm/kdmrc \
-e 's/^AutoReLogin/#AutoReLogin/g' /target/etc/kde4/kdm/kdmrc
fi
# trinity desktop
# v3.5.13
if [[ -f /target/etc/default/kdm-trinity.d/live-autologin ]]; then
rm -f /target/etc/default/kdm-trinity.d/live-autologin
fi
if [ -f /target/etc/trinity/kdm/kdmrc ]; then
sed -i -e 's/^AutoLogin/#AutoLogin/g' /target/etc/trinity/kdm/kdmrc \
-e 's/^AutoReLogin/#AutoReLogin/g' /target/etc/trinity/kdm/kdmrc
fi
# v3.5.14
if [[ -f /target/etc/default/tdm-trinity.d/live-autologin ]]; then
rm -f /target/etc/default/tdm-trinity.d/live-autologin
fi
if [ -f /target/etc/trinity/tdm/tdmrc ]; then
sed -i -e 's/^AutoLogin/#AutoLogin/g' /target/etc/trinity/tdm/tdmrc \
-e 's/^AutoReLogin/#AutoReLogin/g' /target/etc/trinity/tdm/tdmrc
fi
#slim
if [[ -f /target/etc/slim.conf ]] ; then
sed -i -e 's/^[ ]*default_user/#default_user/' \
-e 's/^[ ]*auto_login.*$/#auto_login no/' /target/etc/slim.conf
fi
# lxdm
if [[ -f /target/etc/lxdm/lxdm.conf ]] ; then
sed -i -e 's/^autologin=/#autologin=/' /target/etc/lxdm/lxdm.conf
fi
# No display manager
if [ -f /target/etc/profile.d/zz-live-config_xinit.sh ]; then
rm -f /target/etc/profile.d/zz-live-config_xinit.sh
fi
}
# Keep autologin and update username in the display manager config.
set_autologin_desktop () {
#gdm
if [[ -f /target/etc/gdm/gdm.conf ]]; then
sed -i "/AutomaticLogin/s/$oldusername/$newusername/" /target/etc/gdm/gdm.conf
fi
#gdm3
if [[ -f /target/etc/gdm3/daemon.conf ]]; then
sed -i "/AutomaticLogin/s/$oldusername/$newusername/" /target/etc/gdm3/daemon.conf
fi
#lightdm
if [[ -f /target/etc/lightdm/lightdm.conf ]]; then
sed -i "/autologin/s/=$oldusername/=$newusername/" /target/etc/lightdm/lightdm.conf
fi
#kdm
if [ -f /target/etc/default/kdm.d/live-autologin ]; then
# This one might not be right.
sed -i "s/$oldusername/$newusername/g" /target/etc/default/kdm.d/live-autologin
fi
if [ -f /target/etc/kde3/kdm/kdmrc ]; then
sed -i -e "/AutoLogin/s/$oldusername/$newusername/" /target/etc/kde3/kdm/kdmrc \
-e "/AutoReLogin/s/$oldusername/$newusername/" /target/etc/kde3/kdm/kdmrc
fi
if [ -f /target/etc/kde4/kdm/kdmrc ]; then
sed -i -e "/AutoLogin/s/$oldusername/$newusername/" /target/etc/kde4/kdm/kdmrc \
-e "/AutoReLogin/s/$oldusername/$newusername/" /target/etc/kde4/kdm/kdmrc
fi
# trinity desktop
# v3.5.13
if [[ -f /target/etc/default/kdm-trinity.d/live-autologin ]]; then
# This one might not be right.
sed -i "s/$oldusername/$newusername/g" /target/etc/default/kdm-trinity.d/live-autologin
fi
if [ -f /target/etc/trinity/kdm/kdmrc ]; then
sed -i -e "/AutoLogin/s/$oldusername/$newusername/" /target/etc/trinity/kdm/kdmrc \
-e "/AutoReLogin/s/$oldusername/$newusername/" /target/etc/trinity/kdm/kdmrc
fi
# v3.5.14
if [[ -f /target/etc/default/tdm-trinity.d/live-autologin ]]; then
# This one might not be right.
sed -i "s/$oldusername/$newusername/g" /target/etc/default/tdm-trinity.d/live-autologin
fi
if [ -f /target/etc/trinity/tdm/tdmrc ]; then
sed -i -e "/AutoLogin/s/$oldusername/$newusername/" /target/etc/trinity/tdm/tdmrc \
-e "/AutoReLogin/s/$oldusername/$newusername/" /target/etc/trinity/tdm/tdmrc
fi
#slim
if [[ -f /target/etc/slim.conf ]] ; then
sed -i -e "/default_user/s/\s\+$oldusername/ $newusername/" /target/etc/slim.conf
fi
# lxdm
if [[ -f /target/etc/lxdm/lxdm.conf ]] ; then
sed -i -e "/^autologin=/s/$oldusername/$newusername/" /target/etc/lxdm/lxdm.conf
fi
# No display manager
# (Nothing to do here.)
}
# Change hostname
if ! [[ $new_hostname = "$HOSTNAME" ]]; then
sed -i "s/$HOSTNAME/$new_hostname/" /target/etc/hostname
sed -i "s/$HOSTNAME/$new_hostname/g" /target/etc/hosts
fi
# setup fstab ### TEST FOR UUID AND ENCRYPTION HAPPENS ABOVE THIS!!!
# add entry for root filesystem
if [[ $encrypt_os != "yes" ]]; then
if [[ $use_uuid = yes ]]; then
install_part="$(blkid -s UUID $install_dev | awk '{ print $2 }' | sed 's/\"//g')"
fi
fi
echo -e $"\n Creating /etc/fstab...\n"
echo -e "$install_part\t/\t$fs_type_os\tdefaults,noatime\t0\t1" >> /target/etc/fstab
check_exit
# add entry for /home to fstab if needed
if [[ -n $home_part ]] ; then
if [[ $encrypt_home != "yes" ]]; then
if [[ $use_uuid = yes ]]; then
home_part="$(blkid -s UUID $home_dev | awk '{ print $2 }' | sed 's/\"//g')"
fi
fi
echo -e $"\n Adding /home entry to fstab...\n"
echo -e "$home_part\t/home\t$fs_type_home\tdefaults,noatime\t0\t2" >> /target/etc/fstab
check_exit
fi
# add entry for /boot to fstab if needed
if [[ -n $boot_dev ]] ; then
if [[ $use_uuid = yes ]]; then
boot_part="$(blkid -s UUID $boot_dev | awk '{ print $2 }' | sed 's/\"//g')"
else
boot_part="$boot_dev"
fi
echo -e $"\n Adding /boot entry to fstab...\n"
echo -e "$boot_part\t/boot\t$fs_type_boot\tdefaults,noatime\t0\t1" >> /target/etc/fstab
check_exit
fi
# add entry for swap to fstab if needed
if [[ $use_existing_swap = "yes" ]] ; then
if [[ $use_uuid = yes ]]; then
swap_part="$(/sbin/blkid -s UUID $swap_dev | awk '{ print $2 }' | sed 's/\"//g')"
else
swap_part="$swap_dev"
fi
echo -e $"\n Adding swap entry to fstab...\n"
echo -e "$swap_part\tnone\tswap\tsw\t0\t0" >> /target/etc/fstab
else
echo -e "/swapfile\tnone\tswap\tsw\t0\t0" >> /target/etc/fstab
fi
# Add entry for root filesystem to crypttab if needed
if [[ $encrypt_os = yes ]] ; then
echo -e $"\n Adding $install_part entry to crypttab...\n"
if [[ $use_uuid = yes ]]; then
install_crypt="$(blkid -s UUID $install_dev | awk '{ print $2 }' | sed 's/\"//g')"
echo -e "root_fs\t\t$install_crypt\t\tnone\t\tluks" >> /target/etc/crypttab
else
echo -e "root_fs\t\t$install_dev\t\tnone\t\tluks" >> /target/etc/crypttab
fi
fi
# Add entry for /home to crypttab if needed
if [[ $encrypt_home = yes ]] ; then
echo -e $"\n Adding $home_part entry to crypttab...\n"
if [[ $use_uuid = yes ]]; then
home_crypt="$(blkid -s UUID $home_dev | awk '{ print $2 }' | sed 's/\"//g')"
echo -e "home_fs\t\t$home_crypt\t\tnone\t\tluks" >> /target/etc/crypttab
else
echo -e "home_fs\t\t$home_dev\t\tnone\t\tluks" >> /target/etc/crypttab
fi
fi
##### May need to check for /etc/default/grub and warn if absent ##########
# Tell grub to use encrypted /boot directory.
if [[ $encrypt_boot = yes ]] ; then
if ! [[ $(grep ^GRUB_ENABLE_CRYPTODISK /target/etc/default/grub) ]] ; then
echo -e "\nGRUB_ENABLE_CRYPTODISK=y\n" >> /target/etc/default/grub
fi
if ! [[ $(grep 'UMASK=0077' /etc/initramfs-tools/conf.d/initramfs-permissions) ]] ; then
echo -e '\nUMASK=0077\n' > /etc/initramfs-tools/conf.d/initramfs-permissions
fi
fi
# Allow users to login to ssh with passwords if desired.
# Allow root login only with auth keys.
# or do nothing.
if [[ $ssh_pass = "yes" ]] ; then
sed -i~ 's/PasswordAuthentication no/PasswordAuthentication yes/' /target/etc/ssh/sshd_config
sed -i 's/PermitRootLogin yes/PermitRootLogin prohibit-password/' /target/etc/ssh/sshd_config
elif [[ $ssh_pass = "no" ]] ; then
sed -i~ 's/.*PasswordAuthentication yes/PasswordAuthentication no/' /target/etc/ssh/sshd_config
sed -i 's/PermitRootLogin yes/PermitRootLogin prohibit-password/' /target/etc/ssh/sshd_config
elif [[ -n "$ssh_pass" ]] ; then
echo $"WARNING: ssh_pass value not recognized. No changes were made to /etc/ssh/sshd_config"
fi
# mount stuff so grub will behave (so chroot will work)
echo -e $"\n Mounting tmpfs and proc...\n"
mount --bind /dev/ /target/dev/ ; check_exit
mount --bind /proc/ /target/proc/ ; check_exit
mount --bind /sys/ /target/sys/ ; check_exit
# If /boot is separate partition, need to mount it in chroot for grub and for efi
if [[ -n $boot_dev ]] ; then
chroot /target mount $boot_dev /boot
fi
# This test is not complete and should probably be done earlier. grub_dev="efi" above
if [[ -n "$esp_dev" ]] ; then
uefi_ready="yes"
fi
# add entry for esp_dev to fstab if needed
if [[ $uefi_ready = "yes" ]] && [[ $uefi_boot = "yes" ]] ; then
if [[ $use_uuid = "yes" ]]; then
esp_part="$(/sbin/blkid -s UUID $esp_dev | awk '{ print $2 }' | sed 's/\"//g')"
else
esp_part="$esp_dev"
fi
echo -e $"\n Adding esp entry to fstab...\n"
echo -e "$esp_part\t/boot/efi\tvfat\tumask=0077\t0\t1" >> /target/etc/fstab
mkdir /target/boot/efi
mount "$esp_dev" /target/boot/efi/
fi
install_grub () {
# Setup GRUB
echo -e $"\n Setting up grub bootloader.. Please wait..\n"
#grubversion=$(dpkg -l | egrep "ii|hi" | grep -v bin | grep -v doc | awk '$2 ~ "grub-[eglp]" { print $2}')
# If grub is installed to a partition, we need to know if it's grub-pc
# or grub-legacy/grub-gfx to handle it properly.
if [[ -n $grub_partition ]] ; then
if [[ $grubversion != "grub-pc" ]] ; then
# isolate the device (sdx) letter then use tr like this to translate to the right number for grub
GRUBDEVICENUM=$(echo $grub_partition |sed 's:/dev/sd::' |sed 's:[0-9]::'g |tr '[a-j]' '[0-9]')
# isolate the partition number
INSTALLPARTNUM=$(echo $grub_partition |sed 's:/dev/sd::'|sed 's:[a-z]::')
# and reduce it by 1 for grub
GRUBPARTNUM=$(expr $INSTALLPARTNUM - 1)
# finally get the finished grub root syntax
GRUBROOT="(hd$GRUBDEVICENUM,$GRUBPARTNUM)"
chroot /target grub-install $grub_partition
grub --batch <<EOF
root $GRUBROOT
setup $GRUBROOT
quit
EOF
else
chroot /target grub-install --recheck --no-floppy --force $grub_partition >> "$error_log" ; check_exit
fi
elif [[ $grub_dev = "efi" ]] ; then
chroot /target grub-install ${efi_name_opt} ${media_opt} >> "$error_log"; check_exit
elif [[ -n $grub_dev ]]; then
echo -e $"\n Installing the boot loader...\n"
chroot /target grub-install $grub_dev >> "$error_log"; check_exit
fi
chroot /target update-grub ; check_exit
error_message=""
}
copy_grub_packages () {
find "$grub_package_dir" -maxdepth 1 -name "$grub_package" -exec cp {} /target \;
# chroot /target find . -name $grub_package -maxdepth 1 -exec dpkg -i {} \; # this works, but grub-pc/grub-pc-bin installed out of order.
if [[ -n "$grub_package" ]] ; then
chroot /target /bin/bash -c "dpkg -i $grub_package" # This works. They installed in right order.
fi
if [[ "$grub_package" =~ grub-pc ]] ; then
grubversion="grub-pc"
select_grub_dev
fi
if [[ "$grub_package" =~ grub-efi ]] ; then
grubversion="grub-efi"
grub_dev="efi"
fi
}
###### INSERT PAUSE TO ALLOW MANUAL WORK BEFORE GRUB (e.g. uefi)
# $grub_package is null if installed grub matches boot type (uefi or bios)
if [[ -n "$grub_package" ]] ; then
grub_opt=$"1) Copy grub packages to /target and install bootloader"
else
grub_opt=$"2) Install bootloader and finish the installation"
fi
while true ; do
echo $" ****************************************************************
The installed system is ready for chroot. (proc, sys, dev are mounted)
If you want, you may work in another virtual terminal.
Make a selection when you are ready to proceed.
${bios_boot_warning}
Choices (enter number)
${grub_opt}
3) Continue without a bootloader.
4) Abort the installation and exit.
"
read ans
case "$ans" in
1) copy_grub_packages
if [[ -z "$bios_boot_warning" ]] ; then
install_grub
fi
break ;;
2) if [[ -z "$bios_boot_warning" ]] ; then
install_grub
fi
break ;;
3) break ;;
4) cleanup ; exit 0 ;;
esac
done
# Run update-initramfs to include dm-mod if using encryption
if [[ $encrypt_os = yes ]] || [[ $encrypt_home = yes ]] ; then
if [[ -f /usr/sbin/update-initramfs.orig.initramfs-tools ]] ; then
chroot /target /usr/sbin/update-initramfs.orig.initramfs-tools -u -k all >> "$error_log"
else
chroot /target /usr/sbin/update-initramfs -u -k all >> "$error_log"
fi
fi
##### This should not run if grub_dev=efi and choose 3 above (no bootloader)
#if [[ -n $grub_dev ]] || [[ -n $grub_partition ]] ; then
# chroot /target update-grub ; check_exit
#fi
if [ -f /target/boot/grub/setup_left_core_image_in_filesystem ]; then
rm -f /target/boot/grub/setup_left_core_image_in_filesystem
fi
# INSTALLATION FINISHED - BEGIN CONFIGURE USERNAME, HOSTNAME, PASSWORDS, SUDO
# Need to mount the target home partition under the target root partition
# so the commands can find it (for changing user configs gksu)
if [[ -n $home_part ]] ; then
mount $home_part /target/home
fi
# it might not be on in some live builds
chroot /target /bin/bash -c "shadowconfig on"
# Change username, user's real name and password.
oldname=$(awk -F: '/1000:1000/ { print $1 }' /target/etc/passwd)
old_realname=$(cat /target/etc/passwd |grep "^$oldname"|sed "s/,,,//"|awk -F ":" '{print $5}')
echo $"
The current primary user's name is $oldname. If you want to change it,
enter the new user name now. To proceed without changing the name, just
press ENTER.
"
read newname
if [ -n "$newname" ]; then
echo $"
Enter the new user's real name.
"
read new_realname
fi
if [ -z "$newname" ]; then
newname=$oldname
fi
if [ "$oldname" != "$newname" ]; then
chroot /target usermod -l $newname $oldname ; check_exit
chroot /target groupmod -n $newname $oldname ; check_exit
chroot /target usermod -d /home/$newname -m $newname ; check_exit
for i in $(grep -r "/home/$oldname" /target/home/$newname/.config | awk -F":" '{ print $1 }'); do
sed -i "s/\/home\/$oldname/\/home\/$newname/g" "$i"
done
for i in $(grep -r "/home/$oldname" /target/home/$newname/.local | awk -F":" '{ print $1 }'); do
sed -i "s/\/home\/$oldname/\/home\/$newname/g" "$i"
done
while true; do
echo $"
Change the new user's password?
Press ENTER for YES.
Press 2 for no.
"
read ans
case $ans in
[2Nn]*) break ;;
*) # Redirect stderr from the error log to the screen,
# so we can see the prompts from passwd
exec 2>&1
echo $"Change user's password"
chroot /target passwd "$newname"
# Resume logging errors in file
exec 2>>"$error_log"
break ;;
esac
done
fi
#sed -i~ "s/$old_realname,,,/$new_realname,,,/" /target/etc/passwd
chroot /target /bin/bash -c "chfn -f '$new_realname' $newname"
## sort sudo ##
while true; do
echo $"
Most live images use 'sudo' for root access. No password is required.
It is recommended to disable sudo in an installation and use 'su'
with a root password. Optionally you may permit sudo for the new
user or you may use sudo as default for the new user, with no root
account.
Select one (Enter number):
1) Disable sudo (recommended)
2) Permit sudo for new user (and keep root account.)
3) Use sudo as default for new user (and disable root account.)
4) Use sudo only for shutdown (and keep root account.)
"
read ans
case $ans in
[1Aa]) break ;;
[2Bb]) sudoconfig="TRUE" ; break ;;
[3Cc]) sudo_is_default="TRUE" ; break ;;
[4Dd]) sudo_shutdown="TRUE" ; break ;;
esac
done
# =>wheezy live-config now uses /etc/sudoers.d
if [ -e /target/etc/sudoers.d/live ]; then
rm -f /target/etc/sudoers.d/live
fi
oldusername=$(awk -F: '/1000:1000/ { print $1 }' /etc/passwd)
newusername=$(awk -F: '/1000:1000/ { print $1 }' /target/etc/passwd)
# squeeze (or other distro) might have used /etc/sudoers
if grep -qs $oldusername /target/etc/sudoers ; then
sed -i "/$oldusername/d" /target/etc/sudoers
fi
if [ "$sudoconfig" = "TRUE" ] || [ "$sudo_is_default" = "TRUE" ]; then
# $newusername is permitted to use sudo so add him to sudo group
chroot /target usermod -a -G sudo $newusername
# it shoud be already there in =>wheezy.. in case it's not:
if ! grep -qs "^%sudo" /target/etc/sudoers ; then
echo "%sudo ALL=(ALL:ALL) ALL" >> /etc/sudoers
fi
fi
if [ "$sudo_is_default" = "TRUE" ]; then
# disable root account
echo $"disabling root account.. "
chroot /target passwd -l root
else
# files that may have been written by live-config to force live sudo mode
# should they just be deleted?
# rm -f /target/home/*/.gconf/apps/gksu/%gconf.xml
# rm -f /target/home/*/.*/share/config/*desurc
# fix gksu in user's home ($newusername will not use sudo by default)
if [ -f /target/home/"$newusername"/.gconf/apps/gksu/%gconf.xml ]; then
sed -i '/sudo-mode/s/true/false/' /target/home/"$newusername"/.gconf/apps/gksu/%gconf.xml
fi
sed -i 's/SU_TO_ROOT_SU=sudo/SU_TO_ROOT_SU=su/' /target/home/$newusername/.su-to-rootrc
# detects .kde/ .kde4/ .trinity/ (kdesurc or tdesurc)
for file in /target/home/$newusername/.*/share/config/*desurc ; do
sed -i 's/super-user-command=sudo/super-user-command=su/' $file
done
fi
if [ "$sudo_shutdown" = "TRUE" ]; then
### Maybe move this up so it's available to option "a" (disable sudo) ########
sudo_include_file="/target/etc/sudoers.d/user_shutdown"
if [ -f "$sudo_include_file" ]; then
mv "$sudo_include_file" "${sudo_include_file}.old"
fi
echo "$newusername ALL= NOPASSWD: /usr/sbin/pm-suspend, /usr/sbin/pm-hibernate, /sbin/halt, /sbin/reboot" > "$sudo_include_file"
fi
if [ "$sudo_is_default" != "TRUE" ]; then
# Make sure user gets removed from sudo group. In 2021/2022 sudo group is carried into installed system. Not sure why.
if [ "$sudoconfig" != "TRUE" ] ; then
chroot /target deluser "$newusername" sudo
fi
while true; do
echo $"
Change root password?
Press ENTER for YES.
Press 2 for no.
"
read ans
case $ans in
[2Nn]*) break ;;
*)
# Redirect stderr from the error log to the screen,
# so we can see the prompts from passwd
exec 2>&1
echo $"Change root password"
chroot /target passwd
# Resume logging errors in file
exec 2>>"$error_log"
break ;;
esac
done
fi
if [[ $disable_auto_desktop = "yes" ]]; then
set_noautologin_desktop
disable_auto_console="yes"
else
set_autologin_desktop
fi
# Disable console autologin
if [[ $disable_auto_console = "yes" ]]; then
if grep -q "respawn:/bin/login -f" /target/etc/inittab ; then
mv /target/etc/inittab /target/etc/inittab.$(date +%Y%m%d_%H%M)
cp /usr/lib/refractainstaller/inittab.debian /target/etc/inittab
fi
if grep -q "$oldusername" /target/etc/sv/getty-tty*/run ; then
sed -i 's/^\(.*\)getty\(.*\)-a\(.*\)'$oldusername'\(.*\)38400/\1getty 38400/' /target/etc/sv/getty-tty*/run
fi
else
sed -i "/respawn:/s/$oldusername/$newusername/g" /target/etc/inittab
if [ -e /target/etc/sv/getty-tty*/run ] ; then
sed -i "/38400/s/$oldusername/$newusername/" /target/etc/sv/getty-tty*/run
fi
fi
# Remove diversion of anacron
if [ -e /target/usr/sbin/anacron.orig.anacron ] ; then
rm -f /target/usr/sbin/anacron
chroot /target dpkg-divert --rename --remove /usr/sbin/anacron
fi
if [[ $additional_partitions = "yes" ]] ; then
if ! [[ -h /usr/lib/refractainstaller/post-install/move-dir-mount-gui.sh ]] ; then
ln -s /usr/lib/refractainstaller/move-dir-mount-gui.sh /usr/lib/refractainstaller/post-install/move-dir-mount-gui.sh
fi
else
if [[ -h /usr/lib/refractainstaller/post-install/move-dir-mount.sh ]] ; then
rm /usr/lib/refractainstaller/post-install/move-dir-mount.sh
fi
fi
# Run any post-install scripts
if [[ $run_postinstall = "yes" ]] ; then
for file in /usr/lib/refractainstaller/post-install/* ; do
if [[ -x "$file" ]] ; then
bash "$file"
fi
done
fi
# copy error log to installation before calling cleanup function
cp "$error_log" /target/home/"$newusername"/
chown 1000:1000 /target/home/"$newusername"/"${error_log##*/}"
cleanup
echo $"
Done! You may now reboot into the new system.
If you want to change the user name, then run
change-username after reboot.
"
exit 0