archboot/usr/share/archboot/installer/setup

5529 lines
228 KiB
Text
Raw Normal View History

2009-12-22 22:06:33 +01:00
#!/bin/bash
# we rely on some output which is parsed in english!
2010-08-12 20:55:08 +02:00
unset LANG
2008-10-20 22:39:25 +02:00
ANSWER="/tmp/.setup"
TITLE="Arch Linux Installation"
# use the first VT not dedicated to a running console
LOG="/dev/tty7"
# where the Archboot media (ISO/CD/USB) should be mounted
_MEDIA="/src"
2008-10-20 22:39:25 +02:00
# don't use /mnt because it's intended to mount other things there!
DESTDIR="/install"
2010-06-27 11:18:21 +02:00
EDITOR=""
2012-04-23 15:17:42 +02:00
_BLKID="blkid -c /dev/null"
2008-10-20 22:39:25 +02:00
2009-12-22 22:11:50 +01:00
# name of kernel package
KERNELPKG="linux"
2012-01-13 15:52:11 +01:00
[[ "$(cat /proc/cmdline | grep -w BOOT_IMAGE=.*lts)" ]] && KERNELPKG="linux-lts"
# name of the kernel image
VMLINUZ="vmlinuz-${KERNELPKG}"
# name of the initramfs filesystem
2012-01-13 15:52:11 +01:00
INITRAMFS="initramfs-${KERNELPKG}"
2008-10-20 22:39:25 +02:00
2012-06-01 16:42:14 +02:00
# detect systemd running
[[ "$(cat /proc/cmdline | grep -w init=/bin/systemd)" ]] && SYSTEMD="1"
2008-10-20 22:39:25 +02:00
# abstract the common pacman args
2011-02-04 14:34:11 +01:00
PACMAN="pacman --root ${DESTDIR} --config /tmp/pacman.conf --noconfirm --noprogressbar"
2008-10-20 22:39:25 +02:00
# downloader
DLPROG="wget"
# sources
2010-06-27 11:18:21 +02:00
SYNC_URL=""
FILE_URL="file:///packages/core-$(uname -m)/pkg"
2008-10-20 22:39:25 +02:00
MIRRORLIST="/etc/pacman.d/mirrorlist"
2010-06-27 11:18:21 +02:00
PACKAGES=""
2009-02-11 22:31:52 +01:00
2009-03-29 10:27:53 +02:00
# destination of blockdevices in /sys
2012-01-09 13:54:09 +01:00
block="/sys/block"
2009-03-29 10:27:53 +02:00
2008-10-20 22:39:25 +02:00
# partitions
2010-06-27 11:18:21 +02:00
PART_ROOT=""
2008-12-29 20:19:31 +01:00
ROOTFS=""
2008-10-20 22:39:25 +02:00
2010-05-20 21:09:09 +02:00
# Mylex DAC960 PCI RAID controller, Compaq Next Generation Drive Array,
# Compaq Intelligent Drive Array
EXTRA_CONTROLLER="rd cciss ida"
2008-10-20 22:39:25 +02:00
# install stages
S_SRC=0 # choose install medium
S_NET=0 # network configuration
S_CLOCK=0 # clock and timezone
S_PART=0 # partitioning
S_MKFS=0 # formatting
2009-07-12 19:13:12 +02:00
S_MKFSAUTO=0 # auto fs part/formatting
2008-10-20 22:39:25 +02:00
S_SELECT=0 # package selection
S_INSTALL=0 # package installation
S_CONFIG=0 # configuration editing
2009-07-12 19:13:12 +02:00
S_GRUB=0 # using grub
2010-02-21 17:10:58 +01:00
S_GRUB2=0 # using grub2
2008-10-20 22:39:25 +02:00
# menu item tracker- autoselect the next item
NEXTITEM=""
# DIALOG()
# an el-cheapo dialog wrapper
#
# parameters: see dialog(1)
# returns: whatever dialog did
DIALOG() {
2011-02-04 14:34:11 +01:00
dialog --backtitle "${TITLE}" --aspect 15 "$@"
return $?
2008-10-20 22:39:25 +02:00
}
# DIALOG() taken from aif installer
# an el-cheapo dialog wrapper
#
# parameters: see dialog(1)
# returns: whatever dialog did
_checklist_dialog()
{
2011-06-14 18:36:37 +02:00
dialog --backtitle "$TITLE" --aspect 15 "$@" 3>&1 1>&2 2>&3 3>&-
}
# generate menu for package selection
# slightly modified from aif installer
_package_checklist ()
{
2011-06-14 18:36:37 +02:00
str=$1
elaborate=$2
shift 2
list=()
while [[ -n "$1" ]]; do
list+=("$1" "$2" $3)
[[ $elaborate -gt 0 ]] && list+=("$4") # this can be an empty string, that's ok.
shift 3
[[ $elaborate -gt 0 ]] && shift
done
# i wish dialog would accept something like: --output-separator $'\0'
# but it doesn't. there really is no good way to separate items currently
# let's assume there are no newlines in the item tags
ANSWER_CHECKLIST=()
elab=''
[[ $elaborate -gt 0 ]] && elab='--item-help'
while read -r line; do
ANSWER_CHECKLIST+=("$line")
done < <(_checklist_dialog --separate-output $elab --checklist "$str" 19 60 12 "${list[@]}")
local ret=$?
return $ret
}
# get package description
pkgdesc () {
PKGDESC=$(LANG=C $PACMAN -Si "$@" | awk '/^Name/{ printf("%s ",$3) } /^Version/{ printf("%s:",$3) }/^Description/{ for(i=3;i<=NF;++i) printf(" %s",$i); printf ("\n")}')
}
# chroot_mount()
# prepares target system as a chroot
#
chroot_mount()
{
2011-02-04 14:34:11 +01:00
[[ -e "${DESTDIR}/sys" ]] || mkdir "${DESTDIR}/sys"
[[ -e "${DESTDIR}/proc" ]] || mkdir "${DESTDIR}/proc"
[[ -e "${DESTDIR}/dev" ]] || mkdir "${DESTDIR}/dev"
mount -t sysfs sysfs "${DESTDIR}/sys"
mount -t proc proc "${DESTDIR}/proc"
mount -o bind /dev "${DESTDIR}/dev"
}
# chroot_umount()
# tears down chroot in target system
#
chroot_umount()
{
2012-01-09 13:54:09 +01:00
umount "${DESTDIR}/proc"
umount "${DESTDIR}/sys"
umount "${DESTDIR}/dev"
}
getfstype()
{
2012-04-23 15:17:42 +02:00
echo "$(${_BLKID} -p -i -s TYPE -o value ${1})"
}
# getfsuuid()
# converts /dev devices to FSUUIDs
2009-03-28 13:36:54 +01:00
#
# parameters: device file
# outputs: FSUUID on success
2009-03-28 13:36:54 +01:00
# nothing on failure
# returns: nothing
getfsuuid()
2009-03-28 13:36:54 +01:00
{
2012-04-23 15:17:42 +02:00
echo "$(${_BLKID} -p -i -s UUID -o value ${1})"
2009-03-28 13:36:54 +01:00
}
2010-05-24 15:05:20 +02:00
# parameters: device file
# outputs: LABEL on success
# nothing on failure
# returns: nothing
getfslabel()
2010-05-24 15:05:20 +02:00
{
2012-04-23 15:17:42 +02:00
echo "$(${_BLKID} -p -i -s LABEL -o value ${1})"
}
getpartuuid()
{
2012-04-23 15:17:42 +02:00
echo "$(${_BLKID} -p -i -s PART_ENTRY_UUID -o value ${1})"
}
getpartlabel()
{
2012-04-23 15:17:42 +02:00
echo "$(${_BLKID} -p -i -s PART_ENTRY_NAME -o value ${1})"
2010-05-24 15:05:20 +02:00
}
# list eth devices with mac adress
net_interfaces() {
for i in $(ls /sys/class/net | grep eth); do
echo "$i $(cat /sys/class/net/$i/address)"
done
}
# activate_dmraid()
# activate dmraid devices
activate_dmraid()
{
2011-02-03 21:54:43 +01:00
if [[ -e /sbin/dmraid ]]; then
DIALOG --infobox "Activating dmraid arrays..." 0 0
/sbin/dmraid -ay -I -Z >/dev/null 2>&1
fi
}
# activate_lvm2
# activate lvm2 devices
activate_lvm2()
{
2010-05-28 16:45:28 +02:00
ACTIVATE_LVM2=""
2011-02-03 21:54:43 +01:00
if [[ -e /sbin/lvm ]]; then
2011-02-04 14:34:11 +01:00
OLD_LVM2_GROUPS=${LVM2_GROUPS}
OLD_LVM2_VOLUMES=${LVM2_VOLUMES}
DIALOG --infobox "Scanning logical volumes..." 0 0
/sbin/lvm vgscan --ignorelockingfailure >/dev/null 2>&1
DIALOG --infobox "Activating logical volumes..." 0 0
/sbin/lvm vgchange --ignorelockingfailure --ignoremonitoring -ay >/dev/null 2>&1
2010-05-28 18:00:25 +02:00
LVM2_GROUPS="$(vgs -o vg_name --noheading 2>/dev/null)"
LVM2_VOLUMES="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)"
2011-02-04 14:34:11 +01:00
[[ "${OLD_LVM2_GROUPS}" = "${LVM2_GROUPS}" && "${OLD_LVM2_GROUPS}" = "${LVM2_GROUPS}" ]] && ACTIVATE_LVM2="no"
fi
}
# activate_raid
# activate md devices
activate_raid()
{
2010-05-28 16:45:28 +02:00
ACTIVATE_RAID=""
2011-02-03 21:54:43 +01:00
if [[ -e /sbin/mdadm ]]; then
DIALOG --infobox "Activating RAID arrays..." 0 0
2010-05-28 16:45:28 +02:00
/sbin/mdadm --assemble --scan >/dev/null 2>&1 || ACTIVATE_RAID="no"
fi
}
# activate_luks
# activate luks devices
activate_luks()
{
2010-05-28 16:45:28 +02:00
ACTIVATE_LUKS=""
2011-02-03 21:54:43 +01:00
if [[ -e /sbin/cryptsetup ]]; then
DIALOG --infobox "Scanning for luks encrypted devices..." 0 0
if [[ "$(${_BLKID} | grep "TYPE=\"crypto_LUKS\"")" ]]; then
for PART in $(${_BLKID} | grep "TYPE=\"crypto_LUKS\"" | sed -e 's#:.*##g'); do
2010-06-03 22:38:56 +02:00
# skip already encrypted devices, device mapper!
OPEN_LUKS=""
for devpath in $(ls /dev/mapper 2>/dev/null | grep -v control); do
2011-02-04 14:34:11 +01:00
[[ "$(cryptsetup status ${devpath} | grep ${PART})" ]] && OPEN_LUKS="no"
2010-06-03 22:38:56 +02:00
done
2011-02-04 14:34:11 +01:00
if ! [[ "${OPEN_LUKS}" = "no" ]]; then
2010-05-28 17:49:07 +02:00
RUN_LUKS=""
2011-02-04 14:34:11 +01:00
DIALOG --yesno "Setup detected luks encrypted device, do you want to activate ${PART} ?" 0 0 && RUN_LUKS="1"
[[ "${RUN_LUKS}" = "1" ]] && _enter_luks_name && _enter_luks_passphrase && _opening_luks
[[ "${RUN_LUKS}" = "" ]] && ACTIVATE_LUKS="no"
2010-06-03 22:38:56 +02:00
else
ACTIVATE_LUKS="no"
fi
done
else
ACTIVATE_LUKS="no"
fi
fi
}
# activate_special_devices()
# activate special devices:
# activate dmraid, lvm2 and raid devices, if not already activated during bootup!
# run it more times if needed, it can be hidden by each other!
activate_special_devices()
{
2010-05-28 16:45:28 +02:00
ACTIVATE_RAID=""
ACTIVATE_LUKS=""
ACTIVATE_LVM2=""
activate_dmraid
2011-02-04 14:34:11 +01:00
while ! [[ "${ACTIVATE_LVM2}" = "no" && "${ACTIVATE_RAID}" = "no" && "${ACTIVATE_LUKS}" = "no" ]]; do
activate_raid
activate_lvm2
activate_luks
done
}
_mount_packages_squashfs_images() {
2012-01-21 14:16:05 +01:00
umount "/packages/core-$(uname -m)" >/dev/null 2>&1
umount "/packages/core-any" >/dev/null 2>&1
rm -rf "/packages/core-$(uname -m)"
rm -rf "/packages/core-any"
mkdir -p "/packages/core-$(uname -m)"
mkdir -p "/packages/core-any"
modprobe -q loop
modprobe -q squashfs
mount -o ro,loop -t squashfs "${_MEDIA}/packages/archboot_packages_$(uname -m).squashfs" "/packages/core-$(uname -m)"
mount -o ro,loop -t squashfs "${_MEDIA}/packages/archboot_packages_any.squashfs" "/packages/core-any"
# mkdir -p /tmp/TMP_ARCHBOOT_ROOT
# tar -C /tmp/TMP_ARCHBOOT_ROOT -xf "/packages/core-$(uname -m)/pkg"/libarchive-*-$(uname -m).pkg.tar.xz
}
# Check media on install packages
check_media() {
if [[ ! "${dev}" == "" ]]; then
! [[ "$(cat /proc/self/mounts | grep /dev/${dev})" ]] && mount "/dev/${dev}" "${_MEDIA}" >/dev/null 2>&1
fi
if [[ -e "${_MEDIA}/packages/archboot_packages_$(uname -m).squashfs" && -e "${_MEDIA}/packages/archboot_packages_any.squashfs" ]]; then
_mount_packages_squashfs_images
SET_MEDIA="1"
[[ "${AUTOMOUNT}" == "1" ]] && break
else
umount "${_MEDIA}" >/dev/null 2>&1
SET_MEDIA="0"
fi
}
# Get cdroms and removable devices
get_media() {
# _MEDIA="/src"
SET_MEDIA="0"
AUTOMOUNT="0"
## Check whether ${_MEDIA} is a mountpoint, if so check whether it contains the archboot packages squashfs files.
## This might be the case if the user manually mounted the media before launching this script
if [[ "$(mountpoint -q "${_MEDIA}")" ]]; then
check_media
fi
AUTOMOUNT="1"
# ide devices
if [[ "${SET_MEDIA}" == "0" ]]; then
2011-02-04 14:34:11 +01:00
for dev in $(ls ${block} | egrep '^hd'); do
if [[ "$(cat ${block}/${dev}/device/media)" = "cdrom" ]]; then
check_media
fi
done
fi
if [[ "${SET_MEDIA}" == "0" ]]; then
# scsi/sata and other devices
2011-02-04 14:34:11 +01:00
for dev in $(ls ${block} | egrep '^[sv]d|^sr|^scd|^sg'); do
if [[ "$(cat ${block}/${dev}/device/type)" = "5" ]]; then
check_media
fi
2010-04-16 10:00:17 +02:00
#check virtio devices
if ! [[ -e "${block}/${dev}/device/type" ]]; then
2010-04-16 10:00:17 +02:00
check_media
fi
done
fi
if [[ "${SET_MEDIA}" == "0" ]]; then
# usb devices with raw partition
2011-02-04 14:34:11 +01:00
for dev in $(ls ${block} | egrep '^sd'); do
if [[ "$(cat ${block}/${dev}/device/type)" == "0" && "$(cat ${block}/${dev}/removable)" == "1" && ! "$(cat ${block}/${dev}/size)" == "0" ]]; then
check_media
fi
done
fi
if [[ "${SET_MEDIA}" == "0" ]]; then
2010-05-16 11:35:35 +02:00
# MMC devices with raw partitions
for dev in $(ls /dev/mmcblk* 2>/dev/null | egrep -v 'p'); do
check_media
done
fi
}
#check on manual mounted source
manual_media() {
if [[ "${SET_MEDIA}" == "0" ]]; then
DIALOG --msgbox "No source media was autodetected, please switch to another Virtual Terminal and manually mount the source media under ${_MEDIA} . If you manually mount to ${_MEDIA} , make sure the packages squashfs files ${_MEDIA}/packages/archboot_packages_$(uname -m).squashfs and ${_MEDIA}/packages/archboot_packages_any.squashfs are available.\n\n" 15 55
fi
if [[ ! -e "${_MEDIA}/packages/archboot_packages_$(uname -m).squashfs" ]]; then
DIALOG --msgbox "$(uname -m) packages squashfs image ${_MEDIA}/packages/archboot_packages_$(uname -m).squashfs is missing!" 0 0
return 1
fi
if [[ ! -e "${_MEDIA}/packages/archboot_packages_any.squashfs" ]]; then
DIALOG --msgbox "'any' packages squashfs image ${_MEDIA}/packages/archboot_packages_any.squashfs is missing!" 0 0
2010-05-16 11:35:35 +02:00
return 1
fi
}
2010-03-16 07:32:39 +01:00
# destdir_mounts()
2011-02-04 14:34:11 +01:00
# check if PART_ROOT is set and if something is mounted on ${DESTDIR}
2010-03-16 07:32:39 +01:00
destdir_mounts(){
# Don't ask for filesystem and create new filesystems
ASK_MOUNTPOINTS=""
PART_ROOT=""
2011-02-04 14:34:11 +01:00
# check if something is mounted on ${DESTDIR}
PART_ROOT="$(mount | grep "${DESTDIR} " | cut -d' ' -f 1)"
# Run mountpoints, if nothing is mounted on ${DESTDIR}
if [[ "${PART_ROOT}" = "" ]]; then
DIALOG --msgbox "Setup couldn't detect mounted partition(s) in ${DESTDIR}, please set mountpoints first." 0 0
mountpoints || return 1
fi
}
# lists default linux blockdevices
default_blockdevices() {
# ide devices
2011-02-04 14:34:11 +01:00
for dev in $(ls ${block} 2>/dev/null | egrep '^hd'); do
if [[ "$(cat ${block}/${dev}/device/media)" = "disk" ]]; then
if ! [[ "$(cat ${block}/${dev}/size)" = "0" ]]; then
if ! [[ "$(cat /proc/mdstat 2>/dev/null | grep "${dev}\[")" || "$(dmraid -rc | grep /dev/${dev})" ]]; then
echo "/dev/${dev}"
[[ "${1}" ]] && echo ${1}
2009-06-27 11:44:13 +02:00
fi
2009-02-14 18:51:13 +01:00
fi
fi
done
2010-03-11 22:58:10 +01:00
#scsi/sata devices, and virtio blockdevices (/dev/vd*)
2011-02-04 14:34:11 +01:00
for dev in $(ls ${block} 2>/dev/null | egrep '^[sv]d'); do
2010-04-16 10:00:17 +02:00
# virtio device doesn't have type file!
2011-02-04 14:34:11 +01:00
blktype="$(cat ${block}/${dev}/device/type 2>/dev/null)"
if ! [[ "${blktype}" = "5" ]]; then
if ! [[ "$(cat ${block}/${dev}/size)" = "0" ]]; then
if ! [[ "$(cat /proc/mdstat 2>/dev/null | grep "${dev}\[")" || "$(dmraid -rc | grep /dev/${dev})" ]]; then
echo "/dev/${dev}"
[[ "${1}" ]] && echo ${1}
2009-06-27 11:44:13 +02:00
fi
2009-02-14 18:51:13 +01:00
fi
2008-10-20 22:39:25 +02:00
fi
done
2010-05-19 20:10:52 +02:00
}
# lists additional linux blockdevices
additional_blockdevices() {
# Include additional controllers:
# Mylex DAC960 PCI RAID controller, Compaq Next Generation Drive Array,
# Compaq Intelligent Drive Array
2011-02-04 14:34:11 +01:00
for i in ${EXTRA_CONTROLLER}; do
for dev in $(ls ${block} 2>/dev/null | egrep "^${i}"); do
for k in $(ls ${block}/${dev} 2>/dev/null | egrep "${dev}*p"); do
if [[ -d "${block}/${dev}/${k}" ]]; then
echo "/dev/${i}/$(echo ${dev} | sed -e 's#.*\!##g')"
[[ "${1}" ]] && echo ${1}
2010-05-19 18:10:35 +02:00
break
fi
done
done
done
# Include MMC devices
2011-02-04 14:34:11 +01:00
for dev in $(ls ${block} 2>/dev/null | egrep '^mmcblk'); do
for i in $(ls ${block}/${dev} 2>/dev/null | egrep ${dev}p); do
if [[ -d "${block}/${dev}/${i}" ]]; then
echo "/dev/${dev}"
[[ "${1}" ]] && echo ${1}
2010-05-19 16:32:12 +02:00
break
fi
done
done
2008-10-20 22:39:25 +02:00
}
2010-05-19 20:10:52 +02:00
# lists additional linux blockdevices partitions
additional_blockdevices_partitions() {
# Mylex DAC960 PCI RAID controller, Compaq Next Generation Drive Array,
# Compaq Intelligent Drive Array
2011-02-04 14:34:11 +01:00
for k in ${EXTRA_CONTROLLER}; do
for dev in $(ls ${block} 2>/dev/null | egrep "^${k}"); do
for i in $(ls ${block}/${dev} 2>/dev/null | egrep "${dev}*p"); do
if [[ -d "${block}/${dev}/${i}" ]]; then
disk="${k}/$(echo ${dev} | sed -e 's#.*\!##g')"
part="${k}/$(echo ${i} | sed -e 's#.*\!##g')"
# exclude checks:
#- part of raid device
2011-02-04 14:34:11 +01:00
# $(cat /proc/mdstat 2>/dev/null | grep ${part})
#- part of lvm2 device
2012-04-23 15:17:42 +02:00
# $(${_BLKID} -p -i -o value -s TYPE /dev/${part} | grep "LVM2_member")
#- part of luks device
2012-04-23 15:17:42 +02:00
# $(${_BLKID} -p -i -o value -s TYPE /dev/${part} | grep "crypto_LUKS")
#- extended partition on device
2011-02-04 14:34:11 +01:00
# $(sfdisk -c /dev/${disk} $(echo ${part} | sed -e "s#${disk}\p##g" 2>/dev/null | grep "5")
#- bios_grub partitions
2011-02-04 14:34:11 +01:00
# $(echo ${part} | grep "[a-z]$(parted /dev/${disk} print | grep bios_grub | cut -d " " -f 2)$")
2012-04-23 15:17:42 +02:00
if ! [[ "$(cat /proc/mdstat 2>/dev/null | grep ${part})" || "$(${_BLKID} -p -i -o value -s TYPE /dev/${part} | grep "LVM2_member")" || "$(${_BLKID} -p -i -o value -s TYPE /dev/${part} | grep "crypto_LUKS")" || "$(sfdisk -c /dev/${disk} $(echo ${part} | sed -e "s#${disk}\p##g") 2>/dev/null | grep "5")" || "$(echo ${part} | grep "[a-z]$(parted /dev/${disk} print | grep bios_grub | cut -d " " -f 2)$")" ]]; then
2011-02-04 14:34:11 +01:00
echo "/dev/${part}"
[[ "${1}" ]] && echo ${1}
fi
2010-05-19 20:10:52 +02:00
fi
done
done
done
# Include MMC devices
2011-02-04 14:34:11 +01:00
for dev in $(ls ${block} 2>/dev/null | egrep '^mmcblk'); do
for i in $(ls ${block}/${dev} 2>/dev/null | egrep ${dev}p); do
if [[ -d "${block}/${dev}/${i}" ]]; then
# exclude checks:
#- part of raid device
2011-02-04 14:34:11 +01:00
# $(cat /proc/mdstat 2>/dev/null | grep ${i})
#- part of lvm2 device
2012-04-23 15:17:42 +02:00
# $(${_BLKID} -p -i -o value -s TYPE /dev/${i} | grep "LVM2_member")
#- part of luks device
2012-04-23 15:17:42 +02:00
# $(${_BLKID} -p -i -o value -s TYPE /dev/${i} | grep "crypto_LUKS")
#- extended partition on device
2011-02-04 14:34:11 +01:00
# $(sfdisk -c /dev/${dev} $(echo ${i} | sed -e "s#${dev}\p##g" 2>/dev/null | grep "5")
#- bios_grub partitions
2011-02-04 14:34:11 +01:00
# $(echo ${i} | grep "[a-z]$(parted /dev/${dev} print | grep bios_grub | cut -d " " -f 2)$")
2012-04-23 15:17:42 +02:00
if ! [[ "$(cat /proc/mdstat 2>/dev/null | grep ${i})" || "$(${_BLKID} -p -i -o value -s TYPE /dev/${i} | grep "LVM2_member")" || $(${_BLKID} -p -i -o value -s TYPE /dev/${i} | grep "crypto_LUKS") || "$(sfdisk -c /dev/${dev} $(echo ${i} | sed -e "s#${dev}\p##g") 2>/dev/null | grep "5")" || "$(echo ${i} | grep "[a-z]$(parted /dev/${dev} print | grep bios_grub | cut -d " " -f 2)$")" ]]; then
2011-02-04 14:34:11 +01:00
echo "/dev/${i}"
[[ "${1}" ]] && echo ${1}
fi
2010-05-19 20:10:52 +02:00
fi
done
done
}
# list none partitionable raid md devices
raid_devices() {
2011-02-04 14:34:11 +01:00
for devpath in $(ls ${block} 2>/dev/null | egrep '^md'); do
if ! [[ "$(ls ${block}/${devpath} 2>/dev/null | egrep ${devpath}p)" ]]; then
2010-05-19 20:10:52 +02:00
# exlude md partitions which are part of lvm or luks
2012-04-23 15:17:42 +02:00
if ! [[ "$(${_BLKID} -p -i /dev/${devpath} | grep "TYPE=\"LVM2_member\"")" || "$(${_BLKID} -p -i /dev/${devpath} | grep "TYPE=\"crypto_LUKS\"")" ]]; then
2011-02-04 14:34:11 +01:00
echo "/dev/${devpath}"
[[ "${1}" ]] && echo ${1}
2010-05-19 20:10:52 +02:00
fi
fi
done
}
# lists default linux partitionable raid devices
partitionable_raid_devices() {
2011-02-04 14:34:11 +01:00
for dev in $(ls ${block} 2>/dev/null | egrep '^md'); do
for i in $(ls ${block}/${dev} 2>/dev/null | egrep "${dev}\!*p"); do
if [[ -d "${block}/${dev}/${i}" ]]; then
echo "/dev/${dev}"
[[ "${1}" ]] && echo ${1}
2010-05-19 07:43:36 +02:00
break
fi
done
done
}
# lists default linux partitionable raid devices
partitionable_raid_devices_partitions() {
2011-02-04 14:34:11 +01:00
for dev in $(ls ${block} 2>/dev/null | egrep '^md'); do
for i in $(ls ${block}/${dev} 2>/dev/null | egrep ${dev}p); do
if [[ -d "${block}/${dev}/${i}" ]]; then
# exlude md partitions which are part of lvm or luks
2012-04-23 15:17:42 +02:00
if ! [[ "$(${_BLKID} -p -i /dev/${i} | grep "TYPE=\"LVM2_member\"")" || ! "$(${_BLKID} -p -i /dev/${i} | grep "TYPE=\"crypto_LUKS\"")" ]]; then
2011-02-04 14:34:11 +01:00
echo "/dev/${i}"
[[ "${1}" ]] && echo ${1}
fi
2010-05-18 23:52:30 +02:00
fi
done
done
}
# lists default linux dmraid devices
dmraid_devices() {
2012-01-09 13:54:09 +01:00
if [[ -d /dev/mapper ]]; then
for fakeraid in $(dmraid -s -c); do
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${fakeraid} | grep '_')" ]]; then
echo "/dev/mapper/${fakeraid}"
[[ "${1}" ]] && echo ${1}
fi
done
fi
}
# check_dm_devices
2010-05-19 20:10:52 +02:00
# - remove part of encrypted devices
# - remove part of lvm
# - remove part ot raid
check_dm_devices() {
2010-05-19 20:10:52 +02:00
for devpath in $(ls /dev/mapper 2>/dev/null | grep -v control); do
2012-04-23 15:17:42 +02:00
k="$(${_BLKID} -p -i /dev/mapper/${devpath} 2>/dev/null | grep "TYPE=\"crypto_LUKS\"" | sed -e 's#:.*##g')"
2011-02-04 14:34:11 +01:00
partofcrypt="${partofcrypt} ${k}"
done
2010-05-19 20:10:52 +02:00
for devpath in $(ls /dev/mapper 2>/dev/null | grep -v control); do
2012-04-23 15:17:42 +02:00
k="$(${_BLKID} -p -i /dev/mapper/${devpath} 2>/dev/null | grep "TYPE=\"LVM2_member\"" | sed -e 's#:.*##g')"
2011-02-04 14:34:11 +01:00
partoflvm="${partoflvm} ${k}"
2010-05-19 20:10:52 +02:00
done
for devpath in $(ls /dev/mapper 2>/dev/null | grep -v control); do
2012-04-23 15:17:42 +02:00
k="$(${_BLKID} -p -i /dev/mapper/${devpath} 2>/dev/null | grep "TYPE=\"linux_raid_member\"" | sed -e 's#:.*##g')"
2011-02-04 14:34:11 +01:00
partofraid="${partofraid} ${k}"
2010-05-19 20:10:52 +02:00
done
}
# dm_devices
# - show device mapper devices
dm_devices() {
check_dm_devices
for i in $(dmraid -s -c); do
EXCLUDE_DMRAID=""
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${i} | grep '_')" ]]; then
EXCLUDE_DMRAID="${EXCLUDE_DMRAID} -e ${i} "
fi
done
2012-01-09 13:54:09 +01:00
if [[ -d /dev/mapper ]]; then
2011-02-04 14:34:11 +01:00
for devpath in $(ls /dev/mapper 2>/dev/null | grep -v -e control ${EXCLUDE_DMRAID}); do
if ! [[ "$(ls ${partofcrypt} 2>/dev/null | grep /dev/mapper/${devpath}$)" || "$(ls ${partoflvm} 2>/dev/null | grep /dev/mapper/${devpath}$)" || "$(ls ${partofraid} 2>/dev/null | grep /dev/mapper/${devpath}$)" ]]; then
echo "/dev/mapper/${devpath}"
[[ "${1}" ]] && echo ${1}
fi
done
fi
}
# dmraid_partitions
# - show dmraid partitions
dmraid_partitions() {
check_dm_devices
2012-01-09 13:54:09 +01:00
if [[ -d /dev/mapper ]]; then
for fakeraid in $(dmraid -s -c); do
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${fakeraid} | grep '_')" ]]; then
for k in $(ls /dev/mapper/${fakeraid}*); do
devpath=$(basename ${k})
if ! [[ "$(dmraid -s -c | grep ${devpath}$)" || "$(ls ${partofcrypt} 2>/dev/null | grep /dev/mapper/${devpath}$)" || "$(ls ${partoflvm} 2>/dev/null | grep /dev/mapper/${devpath}$)" || "$(ls ${partofraid} 2>/dev/null | grep /dev/mapper/${devpath}$)" ]]; then
echo "/dev/mapper/${devpath}"
[[ "${1}" ]] && echo ${1}
fi
done
fi
done
fi
2008-10-20 22:39:25 +02:00
}
2011-02-04 14:34:11 +01:00
# do sanity checks on partitions, argument comes ${devpath} loop
default_partition_check() {
2011-02-04 14:34:11 +01:00
disk=$(basename ${devpath})
for part in $(ls ${block}/${disk} 2>/dev/null | egrep -v ^${disk}p | egrep ^${disk}); do
2009-03-29 10:27:53 +02:00
# exclude checks:
#- part of raid device
2011-02-04 14:34:11 +01:00
# $(cat /proc/mdstat 2>/dev/null | grep ${part})
2009-03-29 10:27:53 +02:00
#- part of lvm2 device
2012-04-23 15:17:42 +02:00
# $(${_BLKID} -p -i -o value -s TYPE /dev/${part} | grep "LVM2_member")
2009-06-22 10:53:42 +02:00
#- part of luks device
2012-04-23 15:17:42 +02:00
# $(${_BLKID} -p -i -o value -s TYPE /dev/${part} | grep "crypto_LUKS")
2009-03-29 10:27:53 +02:00
#- extended partition
2011-02-04 14:34:11 +01:00
# $(sfdisk -c /dev/${disk} $(echo ${part} | sed -e "s#${disk}##g") 2>/dev/null | grep "5")
2010-05-16 11:51:58 +02:00
#- extended partition on raid partition device and mmc device
2011-02-04 14:34:11 +01:00
# $(sfdisk -c /dev/${disk} $(echo ${part} | sed -e "s#${disk}\p##g" 2>/dev/null | grep "5")
#- bios_grub partitions
2011-02-04 14:34:11 +01:00
# $(echo ${part} | grep "[a-z]$(parted /dev/${disk} print | grep bios_grub | cut -d " " -f 2)$")
2012-04-23 15:17:42 +02:00
if ! [[ "$(cat /proc/mdstat 2>/dev/null | grep ${part})" || "$(${_BLKID} -p -i -o value -s TYPE /dev/${part} | grep "LVM2_member")" || "$(${_BLKID} -p -i -o value -s TYPE /dev/${part} | grep "crypto_LUKS")" || "$(sfdisk -c /dev/${disk} $(echo ${part} | sed -e "s#${disk}##g") 2>/dev/null | grep "5")" || "$(sfdisk -c /dev/${disk} $(echo ${part} | sed -e "s#${disk}\p##g") 2>/dev/null | grep "5")" || "$(echo ${part} | grep "[a-z]$(parted /dev/${disk} print | grep bios_grub | cut -d " " -f 2)$")" ]]; then
2011-02-04 14:34:11 +01:00
if [[ -d ${block}/${disk}/${part} ]]; then
echo "/dev/${part}"
[[ "${1}" ]] && echo ${1}
fi
fi
done
}
finddisks() {
2011-02-04 14:34:11 +01:00
default_blockdevices ${1}
additional_blockdevices ${1}
dmraid_devices ${1}
partitionable_raid_devices ${1}
}
findpartitions() {
for devpath in $(finddisks); do
2011-02-04 14:34:11 +01:00
default_partition_check ${1}
2009-02-14 18:51:13 +01:00
done
2011-02-04 14:34:11 +01:00
additional_blockdevices_partitions ${1}
dm_devices ${1}
dmraid_partitions ${1}
raid_devices ${1}
partitionable_raid_devices_partitions ${1}
2008-10-20 22:39:25 +02:00
}
2009-06-28 22:40:06 +02:00
# don't check on raid devices!
findbootloaderdisks() {
2011-02-04 14:34:11 +01:00
if ! [[ "${USE_DMRAID}" = "1" ]]; then
default_blockdevices ${1}
additional_blockdevices ${1}
2009-06-28 22:40:06 +02:00
else
2011-02-04 14:34:11 +01:00
dmraid_devices ${1}
fi
2009-06-28 22:40:06 +02:00
}
# don't list raid devices, lvm2 and devicemapper!
findbootloaderpartitions() {
2011-02-04 14:34:11 +01:00
if ! [[ "${USE_DMRAID}" = "1" ]]; then
2009-06-28 22:40:06 +02:00
for devpath in $(findbootloaderdisks); do
2011-02-04 14:34:11 +01:00
default_partition_check ${1}
done
2011-02-04 14:34:11 +01:00
additional_blockdevices_partitions ${1}
2009-06-28 22:40:06 +02:00
else
2011-02-04 14:34:11 +01:00
dmraid_partitions ${1}
2009-06-22 09:19:44 +02:00
fi
2009-01-28 22:43:20 +01:00
}
2010-03-14 17:03:56 +01:00
# freeze and unfreeze xfs, as hack for grub/grub2 installing
freeze_xfs() {
sync
2011-02-03 21:54:43 +01:00
if [[ -x /usr/sbin/xfs_freeze ]]; then
2011-02-04 14:34:11 +01:00
if [[ "$(cat /proc/mounts | grep "${DESTDIR}/boot " | grep " xfs ")" ]]; then
/usr/sbin/xfs_freeze -f ${DESTDIR}/boot >/dev/null 2>&1
/usr/sbin/xfs_freeze -u ${DESTDIR}/boot >/dev/null 2>&1
fi
2011-02-04 14:34:11 +01:00
if [[ "$(cat /proc/mounts | grep "${DESTDIR} " | grep " xfs ")" ]]; then
/usr/sbin/xfs_freeze -f ${DESTDIR} >/dev/null 2>&1
/usr/sbin/xfs_freeze -u ${DESTDIR} >/dev/null 2>&1
2010-03-14 17:03:56 +01:00
fi
fi
2010-03-14 17:03:56 +01:00
}
2008-10-20 22:39:25 +02:00
get_grub_map() {
rm /tmp/dev.map
DIALOG --infobox "Generating GRUB device map...\nThis could take a while.\n\n Please be patient." 0 0
2011-02-04 14:34:11 +01:00
${DESTDIR}/sbin/grub --no-floppy --device-map /tmp/dev.map >/tmp/grub.log 2>&1 <<EOF
2008-10-20 22:39:25 +02:00
quit
EOF
}
2010-04-16 17:22:07 +02:00
# dmraid needs manual mapping
2009-06-28 22:40:06 +02:00
get_grub_dmraid_map() {
USE_DMRAID="1"
rm /tmp/dev.map
majorhd=0
2009-06-28 22:40:06 +02:00
for i in $(dmraid -s -c); do
2011-02-04 14:34:11 +01:00
echo "(hd${majorhd}) /dev/mapper/${i}" >> /tmp/dev.map
majorhd="$((${majorhd}+1))"
2009-06-28 22:40:06 +02:00
done
}
2010-04-16 17:22:07 +02:00
# virtio devices need manual mapping
get_grub_virtio_map() {
rm /tmp/dev.map
majorhd=0
#add virtio devices
2011-02-04 14:34:11 +01:00
for i in $(ls -d ${block}/vd[a-z]); do
echo "(hd${majorhd}) /dev/$(basename ${i})" >> /tmp/dev.map
majorhd="$((${majorhd}+1))"
2010-04-16 17:22:07 +02:00
done
}
2010-05-20 21:09:09 +02:00
# virtio devices need manual mapping
get_grub_mmcblk_map() {
rm /tmp/dev.map
majorhd=0
#add virtio devices
2011-02-04 14:34:11 +01:00
for i in $(ls -d ${block}/mmcblk*); do
echo "(hd${majorhd}) /dev/$(basename ${i})" >> /tmp/dev.map
majorhd="$((${majorhd}+1))"
2010-05-20 21:09:09 +02:00
done
}
# extra devices need manual mapping
get_grub_extra_devices_map() {
rm /tmp/dev.map
majorhd=0
#add extra devices
2011-02-04 14:34:11 +01:00
for k in ${EXTRA_CONTROLLER}; do
for i in $(ls -d ${block}/${k}*); do
echo "(hd${majorhd}) /dev/${k}/$(echo $(basename ${i}) | sed -e 's#\!##g')" >> /tmp/dev.map
majorhd="$((${majorhd}+1))"
2010-05-20 21:09:09 +02:00
done
done
}
2009-06-28 22:40:06 +02:00
#get geometry of device for grub installation
get_chs() {
realdev=""
checkdev=""
# we need the real device for geometry check!
2011-02-04 14:34:11 +01:00
realdev="$(echo ${bootdev} | sed -e 's#,.*)#)#g')"
checkdev="$(grep ${realdev} /tmp/dev.map | sed -e 's#.*\ ##g')"
CYLINDERS="$(sfdisk -G ${checkdev} | cut -d " " -f2)"
HEADS="$(sfdisk -G ${checkdev} | cut -d " " -f4)"
SECTORS="$(sfdisk -G ${checkdev} | cut -d " " -f6)"
2009-06-28 22:40:06 +02:00
}
# we need symlinks for grub installation!
grub_dmraid_hack() {
for i in $(dmraid_partitions); do
if ! [[ "${i}" = "" ]]; then
rm -f $(echo ${i} | sed -n -e "s/\(.*\)p/\1/p")
ln -s ${i} $(echo ${i} | sed -n -e "s/\(.*\)p/\1/p")
fi
2009-06-28 22:40:06 +02:00
done
}
# remove created symlinks
remove_grub_dmraid_hack(){
for i in $(dmraid_partitions); do
if ! [[ "${i}" = "" ]]; then
rm -f $(echo ${i} | sed -n -e "s/\(.*\)p/\1/p")
fi
2009-06-28 22:40:06 +02:00
done
}
2008-10-20 22:39:25 +02:00
mapdev() {
partition_flag=0
device_found=0
2012-01-09 13:54:09 +01:00
[[ "${GRUB_LEGACY}" == "1" ]] && devs=$(cat /tmp/dev.map | grep -v /dev/fd | sed 's/ *\t/ /' | sed ':a;$!N;$!ba;s/\n/ /g')
2010-04-16 12:43:20 +02:00
# check if we use hd sd or vd device
2011-02-04 14:34:11 +01:00
if ! [[ "$(echo ${1} | grep /dev/sd)" || "$(echo ${1} | grep /dev/hd)" || "$(echo ${1} | grep /dev/vd)" ]]; then
linuxdevice=$(echo ${1} | sed -e 's#p[0-9].*$##')
2009-06-28 22:40:06 +02:00
else
2011-02-04 14:34:11 +01:00
linuxdevice=$(echo ${1} | sed -e 's#[0-9].*$##g')
2009-06-28 22:40:06 +02:00
fi
2011-02-04 14:34:11 +01:00
if ! [[ "$(echo ${1} | grep /dev/sd)" || "$(echo ${1} | grep /dev/hd)" || "$(echo ${1} | grep /dev/vd)" ]]; then
if [[ "$(echo ${1} | egrep 'p[0-9].*$')" ]]; then
pnum=$(echo ${1} | sed -e 's#.*p##g')
[[ "${GRUB_LEGACY}" = "1" ]] && pnum=$((${pnum}-1))
2009-06-28 22:40:06 +02:00
partition_flag=1
fi
else
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${1} | egrep '[0-9]$')" ]]; then
2009-06-28 22:40:06 +02:00
# /dev/hdXY
2011-02-04 14:34:11 +01:00
pnum=$(echo ${1} | cut -b9-)
[[ "${GRUB_LEGACY}" = "1" ]] && pnum=$((${pnum}-1))
2009-06-28 22:40:06 +02:00
partition_flag=1
fi
fi
2011-02-04 14:34:11 +01:00
for dev in ${devs}; do
if [[ "(" = $(echo ${dev} | cut -b1) ]]; then
grubdevice="${dev}"
else
2011-02-04 14:34:11 +01:00
if [[ "${dev}" = "${linuxdevice}" ]]; then
2009-06-28 22:40:06 +02:00
device_found=1
break
fi
fi
2009-02-11 12:03:41 +01:00
done
2011-02-04 14:34:11 +01:00
if [[ "${device_found}" = "1" ]]; then
if [[ "${partition_flag}" = "0" ]]; then
echo "${grubdevice}"
else
grubdevice_stringlen=${#grubdevice}
2011-02-04 14:34:11 +01:00
grubdevice_stringlen=$((${grubdevice_stringlen} - 1))
grubdevice=$(echo ${grubdevice} | cut -b1-${grubdevice_stringlen})
echo "${grubdevice},${pnum})"
fi
else
echo "DEVICE NOT FOUND"
fi
2008-10-20 22:39:25 +02:00
}
printk()
{
2011-02-04 14:34:11 +01:00
case ${1} in
"on") echo 4 >/proc/sys/kernel/printk ;;
"off") echo 0 >/proc/sys/kernel/printk ;;
esac
2008-10-20 22:39:25 +02:00
}
getdest() {
2011-02-04 14:34:11 +01:00
[[ "${DESTDIR}" ]] && return 0
2012-05-30 17:35:46 +02:00
DIALOG --inputbox "Enter the destination directory where your target system is mounted" 8 65 "/install" 2>${ANSWER} || return 1
2011-02-04 14:34:11 +01:00
DESTDIR=$(cat ${ANSWER})
2008-10-20 22:39:25 +02:00
}
# geteditor()
# prompts the user to choose an editor
# sets EDITOR global variable
#
2008-10-20 22:39:25 +02:00
geteditor() {
2011-02-04 14:34:11 +01:00
if ! [[ "${EDITOR}" ]]; then
DIALOG --menu "Select a Text Editor to Use" 10 35 3 \
"1" "nano (easier)" \
2011-02-04 14:34:11 +01:00
"2" "vi" 2>${ANSWER} || return 1
case $(cat ${ANSWER}) in
"1") EDITOR="nano" ;;
"2") EDITOR="vi" ;;
esac
fi
2008-10-20 22:39:25 +02:00
}
2010-05-24 15:39:55 +02:00
# set device name scheme
set_device_name_scheme() {
NAME_SCHEME_PARAMETER=""
NAME_SCHEME_LEVELS="FSUUID /dev/disk/by-uuid/<uuid> FSLABEL /dev/disk/by-label/<label> KERNEL /dev/<kernelname>"
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select the device name scheme you want to use in config files (recommended is UUID)." 11 50 5 ${NAME_SCHEME_LEVELS} 2>${ANSWER} || return 1
NAME_SCHEME_PARAMETER=$(cat ${ANSWER})
2010-05-24 15:39:55 +02:00
NAME_SCHEME_PARAMETER_RUN="1"
2010-03-14 22:51:57 +01:00
}
2010-03-15 07:14:28 +01:00
# set GUID (gpt) usage
2010-08-27 21:48:37 +02:00
set_guid() {
2012-04-22 20:38:54 +02:00
## Lenono BIOS-GPT issues - Arch Forum - https://bbs.archlinux.org/viewtopic.php?id=131149 , https://bbs.archlinux.org/viewtopic.php?id=133330 , https://bbs.archlinux.org/viewtopic.php?id=138958
## Lenono BIOS-GPT issues - in Fedora - https://bugzilla.redhat.com/show_bug.cgi?id=735733, https://bugzilla.redhat.com/show_bug.cgi?id=749325 , http://git.fedorahosted.org/git/?p=anaconda.git;a=commit;h=ae74cebff312327ce2d9b5ac3be5dbe22e791f09
2010-03-15 07:14:28 +01:00
GUIDPARAMETER=""
DIALOG --defaultno --yesno "Do you want to use GUID Partition Table (GPT)?\n\nIt is a standard for the layout of the partition table on a physical hard disk. Although it forms a part of the Unified Extensible Firmware Interface (UEFI) standard (replacement for the PC BIOS firmware), it is also used on some BIOS systems because of the limitations of MBR aka msdos partition tables, which restrict maximum disk size to 2 TiB.\n\nWindows XP and earlier Windows systems cannot (without hacks) read or write to drives formatted with a GUID partition table, however, Vista and Windows 7 and later versions include the capability to use GPT for non-boot aka data disks (only UEFI systems can boot Windows from GPT disks).\n\nAttention:\n- Please check if your other operating systems have GPT support!\n- Use this option for a GRUB2 setup, which should support LVM, RAID etc.,\n which doesn't fit into the usual 30k MS-DOS post-MBR gap.\n- BIOS-GPT boot may not work in some Lenovo systems (irrespective of the\n
bootloader used). " 0 0 && GUIDPARAMETER="yes"
2010-03-15 07:14:28 +01:00
}
# Get a list of available disks for use in the "Available disks" dialogs. This
# will print the mountpoints as follows, getting size info from /sys:
# /dev/sda: 64000 MB
# /dev/sdb: 64000 MB
_getavaildisks()
{
for i in $(finddisks); do
2011-02-04 14:34:11 +01:00
if [[ "$(echo "${i}" | grep '/dev/mapper')" ]]; then
# device mapper is always 512 aligned!
# only dmraid device can be here
2011-02-04 14:34:11 +01:00
echo -n "${i} : "; echo $(($(expr 512 '*' $(dmsetup status ${i} | cut -f2 -d " "))/1000000)) MB; echo "\n"
2010-05-19 20:05:11 +02:00
# special block devices
2011-02-04 14:34:11 +01:00
elif [[ "$(echo "${i}" | grep "/dev/rd")" ]]; then
echo -n "${i}: "; echo $(($(expr $(cat ${block}/rd\!$(basename ${i} | sed -e 's#p.*##g')/queue/logical_block_size) '*' $(cat ${block}/rd\!$(basename ${i} | sed -e 's#p.*##g')/size))/1000000)) MB; echo "\n"
elif [[ "$(echo "${i}" | grep "/dev/cciss")" ]]; then
echo -n "${i}: "; echo $(($(expr $(cat ${block}/cciss\!$(basename ${i} | sed -e 's#p.*##g')/queue/logical_block_size) '*' $(cat ${block}/cciss\!$(basename ${i} | sed -e 's#p.*##g')/size))/1000000)) MB; echo "\n"
elif [[ "$(echo "${i}" | grep "/dev/ida")" ]]; then
echo -n "${i}: "; echo $(($(expr $(cat ${block}/ida\!$(basename ${i} | sed -e 's#p.*##g')/queue/logical_block_size) '*' $(cat ${block}/ida\!$(basename ${i} | sed -e 's#p.*##g')/size))/1000000)) MB; echo "\n"
else
2011-02-04 14:34:11 +01:00
echo -n "${i} : "; echo $(($(expr $(cat ${block}/$(basename ${i})/queue/logical_block_size) '*' $(cat ${block}/$(basename ${i})/size))/1000000)) MB; echo "\n"
fi
done
2009-02-01 23:01:19 +01:00
}
# Get a list of available partitions for use in the "Available Mountpoints" dialogs. This
# will print the mountpoints as follows, getting size info from /sys:
# /dev/sda1: 640 MB
# /dev/sdb2: 640 MB
2009-02-01 23:01:19 +01:00
_getavailpartitions()
{
for i in $(findpartitions); do
2010-05-16 11:35:35 +02:00
# mmc and raid partitions
2011-02-04 14:34:11 +01:00
if [[ "$(echo "${i}" | grep '/dev/md_d[0-9]')" || "$(echo "${i}" | grep '/dev/md[0-9]p')" || "$(echo "${i}" | grep '/dev/mmcblk')" ]]; then
echo -n "${i}: "; echo $(($(expr $(cat ${block}/$(basename ${i} | sed -e 's#p.*##g')/queue/logical_block_size) '*' $(cat ${block}/$(basename ${i} | sed -e 's#p.*##g')/$(basename ${i})/size))/1000000)) MB; echo "\n"
2010-05-19 19:59:16 +02:00
# special block devices
2011-02-04 14:34:11 +01:00
elif [[ "$(echo "${i}" | grep "/dev/rd")" ]]; then
echo -n "${i}: "; echo $(($(expr $(cat ${block}/rd\!$(basename ${i} | sed -e 's#p.*##g')/queue/logical_block_size) '*' $(cat ${block}/rd\!$(basename ${i} | sed -e 's#p.*##g')/rd\!$(basename ${i})/size))/1000000)) MB; echo "\n"
elif [[ "$(echo "${i}" | grep "/dev/cciss")" ]]; then
echo -n "${i}: "; echo $(($(expr $(cat ${block}/cciss\!$(basename ${i} | sed -e 's#p.*##g')/queue/logical_block_size) '*' $(cat ${block}/cciss\!$(basename ${i} | sed -e 's#p.*##g')/cciss\!$(basename ${i})/size))/1000000)) MB; echo "\n"
elif [[ "$(echo "${i}" | grep "/dev/ida")" ]]; then
echo -n "${i}: "; echo $(($(expr $(cat ${block}/ida\!$(basename ${i} | sed -e 's#p.*##g')/queue/logical_block_size) '*' $(cat ${block}/ida\!$(basename ${i} | sed -e 's#p.*##g')/ida\!$(basename ${i})/size))/1000000)) MB; echo "\n"
2010-05-16 11:35:35 +02:00
# raid device
2011-02-04 14:34:11 +01:00
elif [[ "$(echo "${i}" | grep -v 'p' |grep '/dev/md')" ]]; then
echo -n "${i}: "; echo $(($(expr $(cat ${block}/$(basename ${i})/queue/logical_block_size) '*' $(cat ${block}/$(basename ${i})/size))/1000000)) MB; echo "\n"
2010-05-16 11:35:35 +02:00
# mapper devices
2011-02-04 14:34:11 +01:00
elif [[ "$(echo "${i}" | grep '/dev/mapper')" ]]; then
# mapper devices are always 512 aligned
# crypt device
2011-02-04 14:34:11 +01:00
if [[ "$(cryptsetup status ${i} 2>/dev/null)" ]]; then
echo -n "${i}: "; echo $(($(expr 512 '*' $(cryptsetup status $(basename ${i}) | grep " size:" | sed -e 's#sectors##g' -e 's#size:##g'))/1000000)) MB; echo "\n"
# dmraid device
2011-02-04 14:34:11 +01:00
elif [[ "$(dmsetup info ${i} | grep 'DMRAID')" ]]; then
[[ "$(echo ${i} | grep 'p*[0-9]$')" ]] && echo -n "${i}: "; echo $(($(expr 512 '*' $(dmsetup status ${i} | cut -f2 -d " "))/1000000)) MB; echo "\n"
# mapper device
else
2011-02-04 14:34:11 +01:00
echo -n "${i}: "; echo $(lvs -o lv_size --noheading --units m ${i} | sed -e 's#m##g') MB; echo "\n"
fi
else
2011-02-04 14:34:11 +01:00
echo -n "${i}: "; echo $(($(expr $(cat ${block}/$(basename ${i} | sed -e 's#[0-9].*##g')/queue/logical_block_size) '*' $(cat ${block}/$(basename ${i} | sed -e 's#[0-9].*##g')/$(basename ${i})/size))/1000000)) MB; echo "\n"
fi
done
}
# Disable swap and all mounted partitions for the destination system. Unmount
# the destination root partition last!
_umountall()
{
DIALOG --infobox "Disabling swapspace, unmounting already mounted disk devices..." 0 0
swapoff -a >/dev/null 2>&1
2011-02-04 14:34:11 +01:00
umount $(mount | grep -v "${DESTDIR} " | grep "${DESTDIR}" | sed 's|\ .*||g') >/dev/null 2>&1
umount $(mount | grep "${DESTDIR} " | sed 's|\ .*||g') >/dev/null 2>&1
}
# Disable all software raid devices
2009-02-01 23:01:19 +01:00
_stopmd()
{
2011-02-03 21:54:43 +01:00
if [[ "$(cat /proc/mdstat 2>/dev/null | grep ^md)" ]]; then
2009-03-28 13:36:54 +01:00
DISABLEMD=""
DIALOG --defaultno --yesno "Setup detected already running raid devices, do you want to disable them completely?" 0 0 && DISABLEMD="1"
2011-02-04 14:34:11 +01:00
if [[ "${DISABLEMD}" = "1" ]]; then
2009-03-28 13:36:54 +01:00
DIALOG --infobox "Disabling all software raid devices..." 0 0
2009-03-28 16:06:28 +01:00
for i in $(cat /proc/mdstat 2>/dev/null | grep ^md | sed -e 's# :.*##g'); do
2011-02-04 14:34:11 +01:00
mdadm --manage --stop /dev/${i} > ${LOG}
2009-03-28 13:36:54 +01:00
done
2009-07-02 22:29:46 +02:00
DIALOG --infobox "Cleaning superblocks of all software raid devices..." 0 0
for i in $(${_BLKID} | grep "TYPE=\"linux_raid_member\"" | sed -e 's#:.*##g'); do
2011-02-04 14:34:11 +01:00
mdadm --zero-superblock ${i} > ${LOG}
2009-07-02 22:29:46 +02:00
done
2009-03-28 13:36:54 +01:00
fi
fi
DISABLEMDSB=""
if [[ "$(${_BLKID} | grep "TYPE=\"linux_raid_member\"")" ]]; then
DIALOG --defaultno --yesno "Setup detected superblock of raid devices, do you want to clean the superblock of them?" 0 0 && DISABLEMDSB="1"
2011-02-04 14:34:11 +01:00
if [[ "${DISABLEMDSB}" = "1" ]]; then
DIALOG --infobox "Cleaning superblocks of all software raid devices..." 0 0
for i in $(${_BLKID} | grep "TYPE=\"linux_raid_member\"" | sed -e 's#:.*##g'); do
2011-02-04 14:34:11 +01:00
mdadm --zero-superblock ${i} > ${LOG}
done
fi
fi
}
# Disable all lvm devices
_stoplvm()
{
DISABLELVM=""
DETECTED_LVM=""
2010-08-27 21:48:37 +02:00
LV_VOLUMES="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)"
LV_GROUPS="$(vgs -o vg_name --noheading 2>/dev/null)"
LV_PHYSICAL="$(pvs -o pv_name --noheading 2>/dev/null)"
2011-02-04 14:34:11 +01:00
! [[ "${LV_VOLUMES}" = "" ]] && DETECTED_LVM=1
! [[ "${LV_GROUPS}" = "" ]] && DETECTED_LVM=1
! [[ "${LV_PHYSICAL}" = "" ]] && DETECTED_LVM=1
if [[ "${DETECTED_LVM}" = "1" ]]; then
DIALOG --defaultno --yesno "Setup detected lvm volumes, volume groups or physical devices, do you want to remove them completely?" 0 0 && DISABLELVM="1"
fi
2011-02-04 14:34:11 +01:00
if [[ "${DISABLELVM}" = "1" ]]; then
DIALOG --infobox "Removing logical volumes ..." 0 0
2011-02-04 14:34:11 +01:00
for i in ${LV_VOLUMES}; do
lvremove -f /dev/mapper/${i} 2>/dev/null> ${LOG}
done
DIALOG --infobox "Removing logical groups ..." 0 0
2011-02-04 14:34:11 +01:00
for i in ${LV_GROUPS}; do
vgremove -f ${i} 2>/dev/null > ${LOG}
done
DIALOG --infobox "Removing physical volumes ..." 0 0
2011-02-04 14:34:11 +01:00
for i in ${LV_PHYSICAL}; do
pvremove -f ${i} 2>/dev/null > ${LOG}
done
fi
}
2009-04-17 22:29:31 +02:00
# Disable all luks encrypted devices
_stopluks()
{
DISABLELUKS=""
DETECTED_LUKS=""
LUKSDEVICE=""
2011-02-06 20:14:39 +01:00
# detect already running luks devices
2009-04-17 22:29:31 +02:00
LUKS_DEVICES="$(ls /dev/mapper/ | grep -v control)"
2011-02-04 14:34:11 +01:00
for i in ${LUKS_DEVICES}; do
cryptsetup status ${i} 2>/dev/null && LUKSDEVICE="${LUKSDEVICE} ${i}"
2009-04-17 22:29:31 +02:00
done
2011-02-04 14:34:11 +01:00
! [[ "${LUKSDEVICE}" = "" ]] && DETECTED_LUKS=1
if [[ "${DETECTED_LUKS}" = "1" ]]; then
2011-02-06 20:14:39 +01:00
DIALOG --defaultno --yesno "Setup detected running luks encrypted devices, do you want to remove them completely?" 0 0 && DISABLELUKS="1"
2009-04-17 22:29:31 +02:00
fi
2011-02-04 14:34:11 +01:00
if [[ "${DISABLELUKS}" = "1" ]]; then
2009-04-17 22:29:31 +02:00
DIALOG --infobox "Removing luks encrypted devices ..." 0 0
2011-02-04 14:34:11 +01:00
for i in ${LUKSDEVICE}; do
LUKS_REAL_DEVICE="$(echo $(cryptsetup status ${i} | grep device: | sed -e 's#device:##g'))"
cryptsetup remove ${i} > ${LOG}
2009-04-17 22:29:31 +02:00
# delete header from device
2011-02-06 20:14:39 +01:00
dd if=/dev/zero of=${LUKS_REAL_DEVICE} bs=512 count=2048 >/dev/null 2>&1
done
fi
DISABLELUKS=""
DETECTED_LUKS=""
# detect not running luks devices
[[ "$(${_BLKID} | grep "TYPE=\"crypto_LUKS\"")" ]] && DETECTED_LUKS=1
2011-02-06 20:14:39 +01:00
if [[ "${DETECTED_LUKS}" = "1" ]]; then
DIALOG --defaultno --yesno "Setup detected not running luks encrypted devices, do you want to remove them completely?" 0 0 && DISABLELUKS="1"
fi
if [[ "${DISABLELUKS}" = "1" ]]; then
DIALOG --infobox "Removing not running luks encrypted devices ..." 0 0
for i in $(${_BLKID} | grep "TYPE=\"crypto_LUKS\"" | sed -e 's#:.*##g'); do
2011-02-06 20:14:39 +01:00
# delete header from device
dd if=/dev/zero of=${i} bs=512 count=2048 >/dev/null 2>&1
2009-04-17 22:29:31 +02:00
done
fi
2011-02-03 21:54:43 +01:00
[[ -e /tmp/.crypttab ]] && rm /tmp/.crypttab
2009-04-17 22:29:31 +02:00
}
2009-06-26 10:33:54 +02:00
#_dmraid_update
_dmraid_update()
{
DIALOG --infobox "Deactivating dmraid devices ..." 0 0
2009-07-12 19:15:34 +02:00
dmraid -an >/dev/null 2>&1
2011-02-04 14:34:11 +01:00
if [[ "${DETECTED_LVM}" = "1" || "${DETECTED_LUKS}" = "1" ]]; then
DIALOG --defaultno --yesno "Setup detected running dmraid devices and/or running lvm2, luks encrypted devices. If you reduced/deleted partitions on your dmraid device a complete reset of devicemapper devices is needed. This will reset also your created lvm2 or encrypted devices. Are you sure you want to do this?" 0 0 && RESETDM="1"
2011-02-04 14:34:11 +01:00
if [[ "${RESETDM}" = "1" ]]; then
2009-06-26 10:33:54 +02:00
DIALOG --infobox "Resetting devicemapper devices ..." 0 0
dmsetup remove_all >/dev/null 2>&1
fi
2009-06-26 10:33:54 +02:00
else
DIALOG --infobox "Resetting devicemapper devices ..." 0 0
dmsetup remove_all >/dev/null 2>&1
2009-06-26 10:33:54 +02:00
fi
DIALOG --infobox "Reactivating dmraid devices ..." 0 0
2009-07-12 19:15:34 +02:00
dmraid -ay -Z >/dev/null 2>&1
2009-06-26 10:33:54 +02:00
}
#helpbox for raid
_helpraid()
{
2009-02-13 19:01:00 +01:00
DIALOG --msgbox "LINUX SOFTWARE RAID SUMMARY:\n
2009-02-14 18:51:13 +01:00
-----------------------------\n\n
2009-02-13 19:01:00 +01:00
Linear mode:\n
You have two or more partitions which are not necessarily the same size\n
(but of course can be), which you want to append to each other.\n
Spare-disks are not supported here. If a disk dies, the array dies with\n
it.\n\n
RAID-0:\n
You have two or more devices, of approximately the same size, and you want\n
to combine their storage capacity and also combine their performance by\n
accessing them in parallel. Like in Linear mode, spare disks are not\n
supported here either. RAID-0 has no redundancy, so when a disk dies, the\n
array goes with it.\n\n
RAID-1:\n
You have two devices of approximately same size, and you want the two to\n
be mirrors of each other. Eventually you have more devices, which you\n
want to keep as stand-by spare-disks, that will automatically become a\n
part of the mirror if one of the active devices break.\n\n
2010-03-14 10:15:47 +01:00
RAID-4:\n
You have three or more devices of roughly the same size and you want\n
a way that protects data against loss of any one disk.\n
Fault tolerance is achieved by adding an extra disk to the array, which\n
is dedicated to storing parity information. The overall capacity of the\n
array is reduced by one disk.\n
The storage efficiency is 66 percent. With six drives, the storage\n
efficiency is 87 percent. The main disadvantage is poor performance for\n
multiple,\ simultaneous, and independent read/write operations.\n
Thus, if any disk fails, all data stay intact. But if two disks fail,\n
all data is lost.\n\n
2009-02-13 19:01:00 +01:00
RAID-5:\n
You have three or more devices of roughly the same size, you want to\n
combine them into a larger device, but still to maintain a degree of\n
redundancy fordata safety. Eventually you have a number of devices to use\n
as spare-disks, that will not take part in the array before another device\n
fails. If you use N devices where the smallest has size S, the size of the\n
entire array will be (N-1)*S. This \"missing\" space is used for parity\n
(redundancy) information. Thus, if any disk fails, all data stay intact.\n
But if two disks fail, all data is lost.\n\n
2010-03-14 10:15:47 +01:00
RAID-6:\n
You have four or more devices of roughly the same size and you want\n
a way that protects data against loss of any two disks.\n
Fault tolerance is achieved by adding an two extra disk to the array,\n
which is dedicated to storing parity information. The overall capacity\n
of the array is reduced by 2 disks.\n
2010-03-14 10:15:47 +01:00
Thus, if any two disks fail, all data stay intact. But if 3 disks fail,\n
all data is lost.\n\n
2009-02-13 19:01:00 +01:00
RAID-10:\n
Shorthand for RAID1+0, a mirrored striped array and needs a minimum of\n
two disks. It provides superior data security and can survive multiple\n
disk failures. The main disadvantage is cost, because 50% of your\n
storage is duplication." 0 0
}
# Create raid or raid_partition
_raid()
{
MDFINISH=""
2011-02-04 14:34:11 +01:00
while [[ "${MDFINISH}" != "DONE" ]]; do
2010-05-18 23:52:30 +02:00
activate_special_devices
: >/tmp/.raid
: >/tmp/.raid-spare
# check for devices
2009-07-01 21:07:37 +02:00
PARTS="$(findpartitions _)"
ALREADYINUSE=""
#hell yeah, this is complicated! kill software raid devices already in use.
2009-03-28 16:06:28 +01:00
ALREADYINUSE=$(cat /proc/mdstat 2>/dev/null | grep ^md | sed -e 's# :.*linear##g' -e 's# :.*raid[0-9][0-9]##g' -e 's# :.*raid[0-9]##g' -e 's#\[[0-9]\]##g')
2011-02-04 14:34:11 +01:00
for i in ${ALREADYINUSE}; do
PARTS=$(echo ${PARTS} | sed -e "s#/dev/${i}\ _##g" -e "s#/dev/${i}\p[0-9]\ _##g")
k=$(echo /dev/${i} | sed -e 's#[0-9]##g')
if ! [[ "$(echo ${k} | grep ^md)" ]]; then
PARTS=$(echo ${PARTS} | sed -e "s#${k}\ _##g")
2009-03-28 13:36:54 +01:00
fi
done
2009-07-12 19:10:20 +02:00
# skip encrypted mapper devices which contain raid devices
2009-07-02 22:29:46 +02:00
ALREADYINUSE=""
for i in $(ls /dev/mapper/* 2>/dev/null | grep -v control); do
2011-02-04 14:34:11 +01:00
cryptsetup status ${i} 2>/dev/null | grep -q "device:.*/dev/md" && ALREADYINUSE="${ALREADYINUSE} ${i}"
2009-07-12 19:10:20 +02:00
done
# skip lvm with raid devices
for devpath in $(pvs -o pv_name --noheading); do
# skip simple lvm device with raid device
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${devpath} | grep /dev/md)" ]]; then
killvolumegroup="$(echo $(pvs -o vg_name --noheading ${devpath}))"
ALREADYINUSE="${ALREADYINUSE} $(ls /dev/mapper/${killvolumegroup}-*)"
2009-07-12 19:10:20 +02:00
fi
# skip encrypted raid device
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${devpath} | grep dm-)" ]]; then
if [[ "$(cryptsetup status $(basename ${devpath}) | grep "device:.*/dev/md")" ]]; then
killvolumegroup="$(echo $(pvs -o vg_name --noheading ${devpath}))"
ALREADYINUSE="${ALREADYINUSE} $(ls /dev/mapper/${killvolumegroup}-*)"
2009-07-12 19:10:20 +02:00
fi
fi
done
# skip already encrypted volume devices with raid device
for devpath in $(ls /dev/mapper/ 2>/dev/null | grep -v control); do
2011-02-04 14:34:11 +01:00
realdevice="$(cryptsetup status ${devpath} 2>/dev/null | grep "device:.*/dev/mapper/" | sed -e 's#.*\ ##g')"
if [[ "$(lvs ${realdevice} 2>/dev/null)" ]]; then
vg="$(echo $(lvs -o vg_name --noheading ${realdevice}))"
if [[ "$(pvs -o pv_name,vg_name --noheading | grep "${vg}$" | grep "/dev/md")" ]]; then
ALREADYINUSE="${ALREADYINUSE} /dev/mapper/${devpath}"
2009-07-12 19:10:20 +02:00
fi
fi
2009-07-02 22:29:46 +02:00
done
2011-02-04 14:34:11 +01:00
for i in ${ALREADYINUSE}; do
PARTS=$(echo ${PARTS} | sed -e "s#${i}\ _##g")
2009-07-02 22:29:46 +02:00
done
2009-02-14 18:51:13 +01:00
# break if all devices are in use
2011-02-04 14:34:11 +01:00
if [[ "${PARTS}" = "" ]]; then
2009-02-14 18:51:13 +01:00
DIALOG --msgbox "All devices in use. No more devices left for new creation." 0 0
return 1
fi
# enter raid device name
RAIDDEVICE=""
2011-02-04 14:34:11 +01:00
while [[ "${RAIDDEVICE}" = "" ]]; do
if [[ "${RAID_PARTITION}" = "" ]]; then
DIALOG --inputbox "Enter the node name for the raiddevice:\n/dev/md[number]\n/dev/md0\n/dev/md1\n\n" 15 65 "/dev/md0" 2>${ANSWER} || return 1
2010-03-18 22:46:21 +01:00
fi
2011-02-04 14:34:11 +01:00
if [[ "${RAID_PARTITION}" = "1" ]]; then
DIALOG --inputbox "Enter the node name for partitionable raiddevice:\n/dev/md_d[number]\n/dev/md_d0\n/dev/md_d1" 15 65 "/dev/md_d0" 2>${ANSWER} || return 1
2010-03-18 22:46:21 +01:00
fi
2011-02-04 14:34:11 +01:00
RAIDDEVICE=$(cat ${ANSWER})
if [[ "$(cat /proc/mdstat 2>/dev/null | grep "^$(echo ${RAIDDEVICE} | sed -e 's#/dev/##g')")" ]]; then
DIALOG --msgbox "ERROR: You have defined 2 identical node names! Please enter another name." 8 65
RAIDDEVICE=""
fi
done
2010-03-14 10:15:47 +01:00
RAIDLEVELS="linear - raid0 - raid1 - raid4 - raid5 - raid6 - raid10 -"
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select the raid level you want to use" 21 50 11 ${RAIDLEVELS} 2>${ANSWER} || return 1
LEVEL=$(cat ${ANSWER})
# raid5 and raid10 support parity parameter
PARITY=""
2011-02-04 14:34:11 +01:00
if [[ "${LEVEL}" = "raid5" || "${LEVEL}" = "raid6" || "${LEVEL}" = "raid10" ]]; then
PARITYLEVELS="left-asymmetric - left-symmetric - right-asymmetric - right-symmetric -"
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select the parity layout you want to use (default is left-symmetric)" 21 50 13 ${PARITYLEVELS} 2>${ANSWER} || return 1
PARTIY=$(cat ${ANSWER})
fi
# show all devices with sizes
DIALOG --msgbox "DISKS:\n$(_getavaildisks)\n\nPARTITIONS:\n$(_getavailpartitions)" 0 0
# select the first device to use, no missing option available!
RAIDNUMBER=1
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select device ${RAIDNUMBER}" 21 50 13 ${PARTS} 2>${ANSWER} || return 1
PART=$(cat ${ANSWER})
echo "${PART}" >>/tmp/.raid
while [[ "${PART}" != "DONE" ]]; do
RAIDNUMBER=$((${RAIDNUMBER} + 1))
# clean loop from used partition and options
2011-02-04 14:34:11 +01:00
PARTS="$(echo ${PARTS} | sed -e "s#${PART}\ _##g" -e 's#MISSING\ _##g' -e 's#SPARE\ _##g')"
# raid0 doesn't support missing devices
2011-02-04 14:34:11 +01:00
! [[ "${LEVEL}" = "raid0" || "${LEVEL}" = "linear" ]] && MDEXTRA="MISSING _"
# add more devices
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select additional device ${RAIDNUMBER}" 21 50 13 ${PARTS} ${MDEXTRA} DONE _ 2>${ANSWER} || return 1
PART=$(cat ${ANSWER})
SPARE=""
2011-02-04 14:34:11 +01:00
! [[ "${LEVEL}" = "raid0" || "${LEVEL}" = "linear" ]] && DIALOG --yesno --defaultno "Would you like to use ${PART} as spare device?" 0 0 && SPARE="1"
[[ "${PART}" = "DONE" ]] && break
if [[ "${PART}" = "MISSING" ]]; then
DIALOG --yesno "Would you like to create a degraded raid on ${RAIDDEVICE}?" 0 0 && DEGRADED="missing"
echo "${DEGRADED}" >>/tmp/.raid
else
2011-02-04 14:34:11 +01:00
if [[ "${SPARE}" = "1" ]]; then
echo "${PART}" >>/tmp/.raid-spare
else
2011-02-04 14:34:11 +01:00
echo "${PART}" >>/tmp/.raid
fi
fi
done
# final step ask if everything is ok?
2012-04-22 19:29:38 +02:00
DIALOG --yesno "Would you like to create ${RAIDDEVICE} like this?\n\nLEVEL:\n${LEVEL}\n\nDEVICES:\n$(for i in $(cat /tmp/.raid); do echo "${i}\n";done)\nSPARES:\n$(for i in $(cat /tmp/.raid-spare); do echo "${i}\n";done)" 0 0 && MDFINISH="DONE"
done
_createraid
}
# create raid device
_createraid()
{
2009-02-13 19:01:00 +01:00
DEVICES="$(echo -n $(cat /tmp/.raid))"
SPARES="$(echo -n $(cat /tmp/.raid-spare))"
# combine both if spares are available, spares at the end!
2011-02-04 14:34:11 +01:00
[[ -n ${SPARES} ]] && DEVICES="${DEVICES} ${SPARES}"
2009-02-13 19:01:00 +01:00
# get number of devices
RAID_DEVICES="$(cat /tmp/.raid | wc -l)"
SPARE_DEVICES="$(cat /tmp/.raid-spare | wc -l)"
2009-02-13 19:01:00 +01:00
# generate options for mdadm
2012-04-22 19:30:41 +02:00
RAIDOPTIONS="--force --run --level=${LEVEL}"
2011-02-04 14:34:11 +01:00
[[ "$(echo ${RAIDDEVICE} | grep /md_d[0-9])" ]] && RAIDOPTIONS="${RAIDOPTIONS} -a mdp"
! [[ "${RAID_DEVICES}" = "0" ]] && RAIDOPTIONS="${RAIDOPTIONS} --raid-devices=${RAID_DEVICES}"
! [[ "${SPARE_DEVICES}" = "0" ]] && RAIDOPTIONS="${RAIDOPTIONS} --spare-devices=${SPARE_DEVICES}"
! [[ "${PARITY}" = "" ]] && RAIDOPTIONS="${RAIDOPTIONS} --layout=${PARITY}"
DIALOG --infobox "Creating ${RAIDDEVICE}..." 0 0
mdadm --create ${RAIDDEVICE} ${RAIDOPTIONS} ${DEVICES} >${LOG} 2>&1
2011-02-03 21:54:43 +01:00
if [[ $? -gt 0 ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Error creating ${RAIDDEVICE} (see ${LOG} for details)." 0 0
2009-02-13 19:01:00 +01:00
return 1
fi
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${RAIDDEVICE} | grep /md_d[0-9])" ]]; then
2010-03-18 22:46:21 +01:00
# switch for mbr usage
set_guid
2011-02-04 14:34:11 +01:00
if [[ "${GUIDPARAMETER}" = "" ]]; then
DIALOG --msgbox "Now you'll be put into the parted program where you can partition your raiddevice to your needs." 18 70
clear
2011-02-04 14:34:11 +01:00
parted ${RAIDDEVICE} print
parted ${RAIDDEVICE}
2010-03-18 22:46:21 +01:00
else
2011-02-04 14:34:11 +01:00
DISC=${RAIDDEVICE}
2011-10-07 15:41:32 +02:00
RUN_CGDISK="1"
2012-04-24 18:50:27 +02:00
CHECK_BIOS_BOOT_GRUB2=""
CHECK_UEFISYS_PART=""
2011-09-12 21:38:58 +02:00
check_gpt
2010-03-18 22:46:21 +01:00
fi
2009-02-14 18:51:13 +01:00
fi
}
# help for lvm
_helplvm()
{
DIALOG --msgbox "LOGICAL VOLUME SUMMARY:\n
-----------------------------\n\n
LVM is a Logical Volume Manager for the Linux kernel. With LVM you can\n
abstract your storage space and have \"virtual partitions\" which are easier\n
2009-04-17 22:29:31 +02:00
to modify.\n\nThe basic building block of LVM are:\n
- Physical volume (PV):\n
Partition on hard disk (or even hard disk itself or loopback file) on\n
which you can have virtual groups. It has a special header and is\n
divided into physical extents. Think of physical volumes as big building\n
blocks which can be used to build your hard drive.\n
- Volume group (VG):\n
Group of physical volumes that are used as storage volume (as one disk).\n
They contain logical volumes. Think of volume groups as hard drives.\n
- Logical volume(LV):\n
A \"virtual/logical partition\" that resides in a volume group and is\n
composed of physical extents. Think of logical volumes as normal\n
partitions." 0 0
}
# Creates physical volume
_createpv()
{
PVFINISH=""
2011-02-04 14:34:11 +01:00
while [[ "${PVFINISH}" != "DONE" ]]; do
2010-05-18 23:52:30 +02:00
activate_special_devices
: >/tmp/.pvs-create
PVDEVICE=""
2009-07-01 21:07:37 +02:00
PARTS="$(findpartitions _)"
2009-04-17 22:29:31 +02:00
ALREADYINUSE=""
2009-07-01 21:07:37 +02:00
# skip volume devices
for i in $(ls /dev/mapper/* | grep -v control); do
2011-02-04 14:34:11 +01:00
[[ "$(lvs ${i} 2>/dev/null)" ]] && ALREADYINUSE="${ALREADYINUSE} ${i}"
2009-07-01 21:07:37 +02:00
done
# skip already encrypted volume devices
for devpath in $(ls /dev/mapper/ 2>/dev/null | grep -v control); do
2011-02-04 14:34:11 +01:00
realdevice="$(cryptsetup status ${devpath} 2>/dev/null | grep "device:.*/dev/mapper/" | sed -e 's#.*\ ##g')"
if ! [[ "${realdevice}" = "" ]]; then
[[ "$(lvs ${realdevice} 2>/dev/null)" ]] && ALREADYINUSE="${ALREADYINUSE} /dev/mapper/${devpath}"
2009-07-30 20:57:00 +02:00
fi
2009-07-10 07:54:47 +02:00
done
# skip md devices, which already have lvm devices!
2011-02-04 14:34:11 +01:00
for i in ${PARTS}; do
mdcheck="$(echo ${i} | sed -e 's#/dev/##g')"
if ! [[ "$(find ${block}/${mdcheck}/slaves/ -name 'dm*' 2>/dev/null)" = "" ]]; then
for k in $(find ${block}/${mdcheck}/slaves/ -name 'dm*' 2>/dev/null); do
2009-07-10 07:54:47 +02:00
# check encrypted volume
2011-02-04 14:34:11 +01:00
realdevice="$(cryptsetup status $(cat ${k}/dm/name) 2>/dev/null | grep "device:.*/dev/mapper/" | sed -e 's#.*\ ##g')"
[[ "$(lvs ${realdevice} 2>/dev/null)" ]] && ALREADYINUSE="${ALREADYINUSE} ${i}"
2009-07-10 07:54:47 +02:00
# check on normal lvs
2011-02-04 14:34:11 +01:00
[[ "$(lvs /dev/mapper/$(cat ${k}/dm/name) 2>/dev/null)" ]] && ALREADYINUSE="${ALREADYINUSE} ${i}"
2009-07-10 07:54:47 +02:00
done
fi
2009-06-26 12:39:55 +02:00
done
2009-07-10 12:38:15 +02:00
# skip md partition devices, which already have lvm devices!
2011-02-04 14:34:11 +01:00
for i in ${PARTS}; do
mdcheck="$(echo ${i} | grep /dev/md*p | sed -e 's#p.*##g' -e 's#/dev/##g')"
if [[ "$(find ${block}/${mdcheck}/slaves/ -name 'dm*' 2>/dev/null)" != "" && "${mdcheck}" != "" ]]; then
for k in $(find ${block}/${mdcheck}/slaves/ -name 'dm*' 2>/dev/null); do
2009-07-10 12:38:15 +02:00
# check encrypted volume
2011-02-04 14:34:11 +01:00
realdevice="$(cryptsetup status $(cat ${k}/dm/name) 2>/dev/null | grep "device:.*/dev/mapper/" | sed -e 's#.*\ ##g')"
[[ "$(lvs ${realdevice} 2>/dev/null)" ]] && ALREADYINUSE="${ALREADYINUSE} ${i}"
2009-07-10 12:38:15 +02:00
# check on normal lvs
2011-02-04 14:34:11 +01:00
[[ "$(lvs /dev/mapper/$(cat ${k}/dm/name) 2>/dev/null)" ]] && ALREADYINUSE="${ALREADYINUSE} ${i}"
2009-07-10 12:38:15 +02:00
done
fi
done
2011-02-04 14:34:11 +01:00
for i in ${ALREADYINUSE}; do
PARTS=$(echo ${PARTS} | sed -e "s#${i}\ _##g")
done
# break if all devices are in use
2011-02-04 14:34:11 +01:00
if [[ "${PARTS}" = "" ]]; then
DIALOG --msgbox "No devices left for physical volume creation." 0 0
return 1
fi
# show all devices with sizes
2009-04-11 19:01:22 +02:00
DIALOG --msgbox "DISKS:\n$(_getavaildisks)\n\nPARTITIONS:\n$(_getavailpartitions)\n\n" 0 0
# select the first device to use
DEVNUMBER=1
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select device number ${DEVNUMBER} for physical volume" 21 50 13 ${PARTS} 2>${ANSWER} || return 1
PART=$(cat ${ANSWER})
echo "${PART}" >>/tmp/.pvs-create
while [[ "${PART}" != "DONE" ]]; do
DEVNUMBER=$((${DEVNUMBER} + 1))
# clean loop from used partition and options
2011-02-04 14:34:11 +01:00
PARTS="$(echo ${PARTS} | sed -e "s#${PART}\ _##g")"
# add more devices
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select additional device number ${DEVNUMBER} for physical volume" 21 50 13 ${PARTS} DONE _ 2>${ANSWER} || return 1
PART=$(cat ${ANSWER})
[[ "${PART}" = "DONE" ]] && break
echo "${PART}" >>/tmp/.pvs-create
done
# final step ask if everything is ok?
DIALOG --yesno "Would you like to create physical volume on devices below?\n$(cat /tmp/.pvs-create | sed -e 's#$#\\n#g')" 0 0 && PVFINISH="DONE"
done
2011-02-04 14:34:11 +01:00
DIALOG --infobox "Creating physical volume on ${PART}..." 0 0
PART="$(echo -n $(cat /tmp/.pvs-create))"
2011-02-04 14:34:11 +01:00
pvcreate ${PART} >${LOG} 2>&1
2011-02-03 21:54:43 +01:00
if [[ $? -gt 0 ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Error creating physical volume on ${PART} (see ${LOG} for details)." 0 0
return 1
fi
}
2009-04-11 19:01:22 +02:00
#find physical volumes that are not in use
findpv()
{
2010-05-30 10:29:26 +02:00
for i in $(pvs -o pv_name --noheading);do
2011-02-04 14:34:11 +01:00
if [[ "$(pvs -o vg_name --noheading ${i})" = " " ]]; then
if [[ "$(echo ${i} | grep /dev/dm-)" ]]; then
2010-05-30 10:29:26 +02:00
for k in $(ls /dev/mapper | grep -v control); do
2011-02-04 14:34:11 +01:00
if [[ -h /dev/mapper/${k} ]]; then
pv="$(basename ${i})"
if [[ "$(readlink /dev/mapper/${k} | grep ${pv}$)" ]]; then
echo "${i}" | sed -e "s#/dev/dm-.*#/dev/mapper/${k}#g"
[[ "${1}" ]] && echo ${1}
2010-05-30 10:29:26 +02:00
fi
fi
done
else
2011-02-04 14:34:11 +01:00
echo "${i}"
[[ "${1}" ]] && echo ${1}
2010-05-30 10:29:26 +02:00
fi
2009-04-11 19:01:22 +02:00
fi
done
2009-04-11 19:01:22 +02:00
}
getavailablepv()
{
for i in "$(pvs -o pv_name,pv_size --noheading --units m)"; do
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${i} | grep /dev/dm-)" ]]; then
2010-05-28 18:59:54 +02:00
for k in $(ls /dev/mapper | grep -v control); do
2011-02-04 14:34:11 +01:00
if [[ -h /dev/mapper/${k} ]]; then
pv="$(basename ${i})"
if [[ "$(readlink /dev/mapper/${k} | grep ${pv}$)" ]]; then
echo "${i}" | sed -e "s#/dev/dm-.* #/dev/mapper/${k} #g" | sed -e 's#$#\\n#'
2010-05-28 18:59:54 +02:00
fi
fi
done
else
2011-02-04 14:34:11 +01:00
echo "${i}" | sed -e 's#$#\\n#'
2010-05-28 18:59:54 +02:00
fi
done
2009-04-11 19:01:22 +02:00
}
#find volume groups that are not already full in use
findvg()
{
for dev in $(vgs -o vg_name --noheading);do
2011-02-04 14:34:11 +01:00
if ! [[ "$(vgs -o vg_free --noheading --units m ${dev} | grep " 0m$")" ]]; then
echo "${dev}"
[[ "${1}" ]] && echo ${1}
fi
done
}
getavailablevg()
{
for i in $(vgs -o vg_name,vg_free --noheading --units m); do
2011-02-04 14:34:11 +01:00
if ! [[ "$(echo ${i} | grep " 0m$")" ]]; then
echo ${i} | sed -e 's#$#\\n#'
2009-07-01 21:07:37 +02:00
fi
done
}
# Creates volume group
_createvg()
{
2009-04-10 23:21:08 +02:00
VGFINISH=""
2011-02-04 14:34:11 +01:00
while [[ "${VGFINISH}" != "DONE" ]]; do
2009-04-11 19:01:22 +02:00
: >/tmp/.pvs
2009-04-10 23:21:08 +02:00
VGDEVICE=""
2009-04-11 19:01:22 +02:00
PVS=$(findpv _)
2009-04-10 23:21:08 +02:00
# break if all devices are in use
2011-02-04 14:34:11 +01:00
if [[ "${PVS}" = "" ]]; then
DIALOG --msgbox "No devices left for Volume Group creation." 0 0
2009-04-10 23:21:08 +02:00
return 1
fi
2009-04-11 19:01:22 +02:00
# enter volume group name
VGDEVICE=""
2011-02-04 14:34:11 +01:00
while [[ "${VGDEVICE}" = "" ]]; do
DIALOG --inputbox "Enter the Volume Group name:\nfoogroup\n<yourvolumegroupname>\n\n" 15 65 "foogroup" 2>${ANSWER} || return 1
VGDEVICE=$(cat ${ANSWER})
if [[ "$(vgs -o vg_name --noheading 2>/dev/null | grep "^ $(echo ${VGDEVICE})")" ]]; then
2009-04-11 19:01:22 +02:00
DIALOG --msgbox "ERROR: You have defined 2 identical Volume Group names! Please enter another name." 8 65
VGDEVICE=""
fi
done
2009-04-10 23:21:08 +02:00
# show all devices with sizes
2009-04-11 19:01:22 +02:00
DIALOG --msgbox "Physical Volumes:\n$(getavailablepv)\n\nPhysical Volumes that are not shown in next dialog, are already in use!" 0 0
# select the first device to use, no missing option available!
PVNUMBER=1
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select Physical Volume ${PVNUMBER} for ${VGDEVICE}" 21 50 13 ${PVS} 2>${ANSWER} || return 1
PV=$(cat ${ANSWER})
echo "${PV}" >>/tmp/.pvs
while [[ "${PVS}" != "DONE" ]]; do
PVNUMBER=$((${PVNUMBER} + 1))
2009-04-11 19:01:22 +02:00
# clean loop from used partition and options
2011-02-04 14:34:11 +01:00
PVS="$(echo ${PVS} | sed -e "s#${PV}\ _##g")"
2009-04-11 19:01:22 +02:00
# add more devices
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select additional Physical Volume ${PVNUMBER} for ${VGDEVICE}" 21 50 13 ${PVS} DONE _ 2>${ANSWER} || return 1
PV=$(cat ${ANSWER})
[[ "${PV}" = "DONE" ]] && break
echo "${PV}" >>/tmp/.pvs
2009-04-11 19:01:22 +02:00
done
2009-04-10 23:21:08 +02:00
# final step ask if everything is ok?
2011-02-04 14:34:11 +01:00
DIALOG --yesno "Would you like to create Volume Group like this?\n\n${VGDEVICE}\n\nPhysical Volumes:\n$(cat /tmp/.pvs | sed -e 's#$#\\n#g')" 0 0 && VGFINISH="DONE"
2009-04-10 23:21:08 +02:00
done
2011-02-04 14:34:11 +01:00
DIALOG --infobox "Creating Volume Group ${VGDEVICE}..." 0 0
2009-04-11 19:01:22 +02:00
PV="$(echo -n $(cat /tmp/.pvs))"
2011-02-04 14:34:11 +01:00
vgcreate ${VGDEVICE} ${PV} >${LOG} 2>&1
2011-02-03 21:54:43 +01:00
if [[ $? -gt 0 ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Error creating Volume Group ${VGDEVICE} (see ${LOG} for details)." 0 0
2009-04-10 23:21:08 +02:00
return 1
fi
}
# Creates logical volume
_createlv()
{
LVFINISH=""
2011-02-04 14:34:11 +01:00
while [[ "${LVFINISH}" != "DONE" ]]; do
LVDEVICE=""
LV_SIZE_SET=""
LVS=$(findvg _)
# break if all devices are in use
2011-02-04 14:34:11 +01:00
if [[ "${LVS}" = "" ]]; then
DIALOG --msgbox "No Volume Groups with free space available for Logical Volume creation." 0 0
return 1
fi
2009-07-01 21:07:37 +02:00
# show all devices with sizes
DIALOG --msgbox "Volume Groups:\n$(getavailablevg)\n\nVolume Groups that are not shown, are already 100% in use!" 0 0
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select Volume Group" 21 50 13 ${LVS} 2>${ANSWER} || return 1
LV=$(cat ${ANSWER})
# enter logical volume name
LVDEVICE=""
2011-02-04 14:34:11 +01:00
while [[ "${LVDEVICE}" = "" ]]; do
DIALOG --inputbox "Enter the Logical Volume name:\nfooname\n<yourvolumename>\n\n" 15 65 "fooname" 2>${ANSWER} || return 1
LVDEVICE=$(cat ${ANSWER})
if [[ "$(lvs -o lv_name,vg_name --noheading 2>/dev/null | grep " $(echo ${LVDEVICE}) $(echo ${LV})"$)" ]]; then
DIALOG --msgbox "ERROR: You have defined 2 identical Logical Volume names! Please enter another name." 8 65
LVDEVICE=""
fi
done
2011-02-04 14:34:11 +01:00
while [[ "${LV_SIZE_SET}" = "" ]]; do
LV_ALL=""
DIALOG --inputbox "Enter the size (MB) of your Logical Volume,\nMinimum value is > 0.\n\nVolume space left: $(vgs -o vg_free --noheading --units m ${LV})B\n\nIf you enter no value, all free space left will be used." 10 65 "" 2>${ANSWER} || return 1
2011-02-04 14:34:11 +01:00
LV_SIZE=$(cat ${ANSWER})
if [[ "${LV_SIZE}" = "" ]]; then
2012-05-12 16:07:20 +02:00
DIALOG --yesno "Would you like to create Logical Volume with no free space left?" 0 0 && LV_ALL="1"
if ! [[ "${LV_ALL}" = "1" ]]; then
LV_SIZE=0
fi
fi
2011-02-04 14:34:11 +01:00
if [[ "${LV_SIZE}" = "0" ]]; then
DIALOG --msgbox "ERROR: You have entered a invalid size, please enter again." 0 0
else
2011-02-04 14:34:11 +01:00
if [[ "${LV_SIZE}" -ge "$(vgs -o vg_free --noheading --units m | sed -e 's#m##g')" ]]; then
DIALOG --msgbox "ERROR: You have entered a too large size, please enter again." 0 0
else
LV_SIZE_SET=1
fi
fi
done
#Contiguous doesn't work with +100%FREE
LV_CONTIGUOUS=""
2011-02-04 14:34:11 +01:00
[[ "${LV_ALL}" = "" ]] && DIALOG --defaultno --yesno "Would you like to create Logical Volume as a contiguous partition, that means that your space doesn't get partitioned over one or more disks nor over non-contiguous physical extents.\n(usefull for swap space etc.)?" 0 0 && LV_CONTIGUOUS="1"
if [[ "${LV_CONTIGUOUS}" = "1" ]]; then
CONTIGUOUS=yes
LV_EXTRA="-C y"
else
CONTIGUOUS=no
LV_EXTRA=""
fi
2011-02-04 14:34:11 +01:00
[[ "${LV_SIZE}" = "" ]] && LV_SIZE="All free space left"
# final step ask if everything is ok?
2011-02-04 14:34:11 +01:00
DIALOG --yesno "Would you like to create Logical Volume ${LVDEVICE} like this?\nVolume Group:\n${LV}\nVolume Size:\n${LV_SIZE}\nContiguous Volume:\n${CONTIGUOUS}" 0 0 && LVFINISH="DONE"
done
2011-02-04 14:34:11 +01:00
DIALOG --infobox "Creating Logical Volume ${LVDEVICE}..." 0 0
if [[ "${LV_ALL}" = "1" ]]; then
lvcreate ${LV_EXTRA} -l +100%FREE ${LV} -n ${LVDEVICE} >${LOG} 2>&1
else
2011-02-04 14:34:11 +01:00
lvcreate ${LV_EXTRA} -L ${LV_SIZE} ${LV} -n ${LVDEVICE} >${LOG} 2>&1
fi
2011-02-03 21:54:43 +01:00
if [[ $? -gt 0 ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Error creating Logical Volume ${LVDEVICE} (see ${LOG} for details)." 0 0
return 1
fi
}
# enter luks name
_enter_luks_name() {
LUKSDEVICE=""
2011-02-04 14:34:11 +01:00
while [[ "${LUKSDEVICE}" = "" ]]; do
DIALOG --inputbox "Enter the name for luks encrypted device ${PART}:\nfooname\n<yourname>\n\n" 15 65 "fooname" 2>${ANSWER} || return 1
LUKSDEVICE=$(cat ${ANSWER})
if ! [[ "$(cryptsetup status ${LUKSDEVICE} | grep inactive)" ]]; then
DIALOG --msgbox "ERROR: You have defined 2 identical luks encryption device names! Please enter another name." 8 65
LUKSDEVICE=""
fi
done
}
# enter luks passphrase
_enter_luks_passphrase () {
LUKSPASSPHRASE=""
2011-02-04 14:34:11 +01:00
while [[ "${LUKSPASSPHRASE}" = "" ]]; do
DIALOG --insecure --passwordbox "Enter passphrase for luks encrypted device ${PART}:" 0 0 2>${ANSWER} || return 1
LUKSPASS=$(cat ${ANSWER})
2011-02-08 16:25:16 +01:00
DIALOG --insecure --passwordbox "Retype passphrase for luks encrypted device ${PART}:" 0 0 2>${ANSWER} || return 1
2011-02-04 14:34:11 +01:00
LUKSPASS2=$(cat ${ANSWER})
if [[ "${LUKSPASS}" = "${LUKSPASS2}" ]]; then
LUKSPASSPHRASE=${LUKSPASS}
echo ${LUKSPASSPHRASE} > /tmp/.passphrase
LUKSPASSPHRASE=/tmp/.passphrase
else
DIALOG --msgbox "Passphrases didn't match, please enter again." 0 0
fi
done
}
# opening luks
_opening_luks() {
2011-02-04 14:34:11 +01:00
DIALOG --infobox "Opening encrypted ${PART}..." 0 0
2011-02-08 16:25:16 +01:00
luksOpen_success="0"
while [[ "${luksOpen_success}" = "0" ]]; do
cryptsetup luksOpen ${PART} ${LUKSDEVICE} >${LOG} <${LUKSPASSPHRASE} && luksOpen_success=1
if [[ "${luksOpen_success}" = "0" ]]; then
DIALOG --msgbox "Error: Passphrases didn't match, please enter again." 0 0
_enter_luks_passphrase || return 1
fi
done
2011-02-04 14:34:11 +01:00
LUKSPASSPHRASE="$(cat ${LUKSPASSPHRASE})"
2012-05-12 15:53:04 +02:00
DIALOG --yesno "Would you like to save the passphrase of luks device in /etc/crypttab?\nName:${LUKSDEVICE}" 0 0 || LUKSPASSPHRASE="ASK"
2011-02-04 14:34:11 +01:00
echo ${LUKSDEVICE} ${PART} ${LUKSPASSPHRASE} >> /tmp/.crypttab
2011-02-03 21:54:43 +01:00
[[ -e /tmp/.passphrase ]] && rm /tmp/.passphrase
}
2009-04-19 17:19:37 +02:00
# help for luks
_helpluks()
{
DIALOG --msgbox "LUKS ENCRYPTION SUMMARY:\n
-----------------------------\n\n
Encryption is useful for two (related) reasons.\n
Firstly, it prevents anyone with physical access to your computer,\n
and your hard drive in particular, from getting the data from it\n
(unless they have your passphrase/key).\n
Secondly, it allows you to wipe the data on your hard drive with\n
far more confidence in the event of you selling or discarding\n
your drive.\n
Basically, it supplements the access control mechanisms of the operating\n
system (like file permissions) by making it harder to bypass the operating\n
system by inserting a boot CD, for example. Encrypting the root partition\n
prevents anyone from using this method to insert viruses or trojans onto\n
your computer.\n\n
ATTENTION:\n
Having encrypted partitions does not protect you from all possible\n
attacks. The encryption is only as good as your key management, and there\n
are other ways to break into computers, while they are running." 0 0
}
# create luks device
2009-04-17 22:29:31 +02:00
_luks()
{
2011-02-06 22:12:44 +01:00
NAME_SCHEME_PARAMETER_RUN=""
2009-04-17 22:29:31 +02:00
LUKSFINISH=""
2011-02-04 14:34:11 +01:00
while [[ "${LUKSFINISH}" != "DONE" ]]; do
2010-05-18 23:52:30 +02:00
activate_special_devices
2009-07-01 21:07:37 +02:00
PARTS="$(findpartitions _)"
ALREADYINUSE=""
2009-07-01 21:07:37 +02:00
# skip already encrypted devices, device mapper!
for devpath in $(ls /dev/mapper 2>/dev/null | grep -v control); do
2011-02-04 14:34:11 +01:00
[[ "$(cryptsetup status ${devpath})" ]] && ALREADYINUSE="${ALREADYINUSE} /dev/mapper/${devpath}"
2009-06-26 12:39:55 +02:00
done
2009-07-01 21:07:37 +02:00
# skip already encrypted devices, device mapper with encrypted parts!
for devpath in $(pvs -o pv_name --noheading); do
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${devpath} | grep dm-)" ]]; then
if [[ "$(cryptsetup status $(basename ${devpath}))" ]]; then
killvolumegroup="$(echo $(pvs -o vg_name --noheading ${devpath}))"
ALREADYINUSE="${ALREADYINUSE} $(ls /dev/mapper/${killvolumegroup}-*)"
2009-07-01 21:07:37 +02:00
fi
fi
2009-07-10 11:06:14 +02:00
# remove hidden crypt by md device
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${devpath} | grep /dev/md)" ]]; then
mdcheck="$(echo ${devpath} | sed -e 's#/dev/##g')"
if ! [[ "$(find ${block}/${mdcheck}/slaves/ -name 'dm*' 2>/dev/null)" = "" ]]; then
for k in $(find ${block}/${mdcheck}/slaves/ -name 'dm*'); do
if [[ "$(cryptsetup status $(cat ${k}/dm/name))" ]]; then
killvolumegroup="$(echo $(pvs -o vg_name --noheading ${devpath}))"
ALREADYINUSE="${ALREADYINUSE} $(ls /dev/mapper/${killvolumegroup}-*)"
2009-07-10 11:06:14 +02:00
fi
done
fi
fi
2009-07-10 07:54:47 +02:00
done
# skip md devices, which already has encrypted devices!
2011-02-04 14:34:11 +01:00
for i in ${PARTS}; do
mdcheck="$(echo ${i} | sed -e 's#/dev/##g')"
if ! [[ "$(find ${block}/${mdcheck}/slaves/ -name 'dm*' 2>/dev/null)" = "" ]]; then
for k in $(find ${block}/${mdcheck}/slaves/ -name 'dm*' 2>/dev/null); do
[[ "$(cryptsetup status $(cat ${k}/dm/name))" ]] && ALREADYINUSE="${ALREADYINUSE} ${i}"
2009-07-10 12:38:15 +02:00
# check lvm devices if encryption was used!
2011-02-04 14:34:11 +01:00
if [[ "$(lvs /dev/mapper/$(cat ${k}/dm/name) 2>/dev/null)" ]]; then
for devpath in ${ALREADYINUSE}; do
[[ "$(echo ${devpath} | grep "/dev/mapper/$(cat ${k}/dm/name)"$)" ]] && ALREADYINUSE="${ALREADYINUSE} ${i}"
2009-07-10 12:38:15 +02:00
done
fi
done
fi
done
# skip md partition devices, which already has encrypted devices!
2011-02-04 14:34:11 +01:00
for i in ${PARTS}; do
mdcheck="$(echo ${i} | grep /dev/md*p | sed -e 's#p.*##g' -e 's#/dev/##g')"
if [[ "$(find ${block}/${mdcheck}/slaves/ -name 'dm*' 2>/dev/null)" != "" && "${mdcheck}" != "" ]]; then
for k in $(find ${block}/${mdcheck}/slaves/ -name 'dm*' 2>/dev/null); do
[[ "$(cryptsetup status $(cat ${k}/dm/name))" ]] && ALREADYINUSE="${ALREADYINUSE} ${i}"
2009-07-10 11:06:14 +02:00
# check lvm devices if encryption was used!
2011-02-04 14:34:11 +01:00
if [[ "$(lvs /dev/mapper/$(cat ${k}/dm/name) 2>/dev/null)" ]]; then
for devpath in ${ALREADYINUSE}; do
[[ "$(echo ${devpath} | grep "/dev/mapper/$(cat ${k}/dm/name)"$)" ]] && ALREADYINUSE="${ALREADYINUSE} ${i}"
2009-07-10 11:06:14 +02:00
done
fi
2009-07-10 07:54:47 +02:00
done
fi
done
2011-02-04 14:34:11 +01:00
for i in ${ALREADYINUSE}; do
PARTS=$(echo ${PARTS} | sed -e "s#${i}\ _##g")
done
# break if all devices are in use
2011-02-04 14:34:11 +01:00
if [[ "${PARTS}" = "" ]]; then
2009-04-17 22:29:31 +02:00
DIALOG --msgbox "No devices left for luks encryption." 0 0
return 1
fi
2009-07-01 21:07:37 +02:00
# show all devices with sizes
DIALOG --msgbox "DISKS:\n$(_getavaildisks)\n\nPARTITIONS:\n$(_getavailpartitions)\n\n" 0 0
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select device for luks encryption" 21 50 13 ${PARTS} 2>${ANSWER} || return 1
PART=$(cat ${ANSWER})
2009-07-01 21:07:37 +02:00
# enter luks name
_enter_luks_name
2011-02-06 22:12:44 +01:00
### TODO: offer more options for encrypt!
# final step ask if everything is ok?
2011-02-04 14:34:11 +01:00
DIALOG --yesno "Would you like to encrypt luks device below?\nName:${LUKSDEVICE}\nDevice:${PART}\n" 0 0 && LUKSFINISH="DONE"
done
_enter_luks_passphrase
2011-02-04 14:34:11 +01:00
DIALOG --infobox "Encrypting ${PART}..." 0 0
cryptsetup -c aes-cbc-essiv:sha256 -s 128 luksFormat ${PART} >${LOG} <${LUKSPASSPHRASE}
_opening_luks
2009-02-01 23:01:19 +01:00
}
autoprepare() {
2009-04-17 22:29:31 +02:00
# check on encrypted devices, else weird things can happen!
_stopluks
2009-03-28 13:36:54 +01:00
# check on raid devices, else weird things can happen during partitioning!
_stopmd
# check on lvm devices, else weird things can happen during partitioning!
_stoplvm
2010-05-24 15:39:55 +02:00
NAME_SCHEME_PARAMETER_RUN=""
2010-03-15 07:14:28 +01:00
# switch for mbr usage
set_guid
DISCS=$(default_blockdevices)
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${DISCS} | wc -w)" -gt 1 ]]; then
DIALOG --msgbox "Available Disks:\n\n$(_getavaildisks)\n" 0 0
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select the hard drive to use" 14 55 7 $(default_blockdevices _) 2>${ANSWER} || return 1
DISC=$(cat ${ANSWER})
else
2011-02-04 14:34:11 +01:00
DISC=${DISCS}
fi
2010-03-11 12:07:35 +01:00
DEFAULTFS=""
BOOT_PART_SET=""
SWAP_PART_SET=""
ROOT_PART_SET=""
CHOSEN_FS=""
# get just the disk size in 1000*1000 MB
2011-02-04 14:34:11 +01:00
if [[ "$(cat ${block}/$(basename ${DISC} 2>/dev/null)/size 2>/dev/null)" ]]; then
DISC_SIZE="$(($(expr $(cat ${block}/$(basename ${DISC})/queue/logical_block_size) '*' $(cat ${block}/$(basename ${DISC})/size))/1000000))"
2010-08-27 21:48:37 +02:00
else
DIALOG --msgbox "ERROR: Setup cannot detect size of your device, please use normal installation routine for partitioning and mounting devices." 0 0
return 1
fi
2011-02-04 14:34:11 +01:00
while [[ "${DEFAULTFS}" = "" ]]; do
FSOPTS=""
2011-02-04 14:34:11 +01:00
[[ "$(which mkfs.ext2 2>/dev/null)" ]] && FSOPTS="${FSOPTS} ext2 Ext2"
[[ "$(which mkfs.ext3 2>/dev/null)" ]] && FSOPTS="${FSOPTS} ext3 Ext3"
[[ "$(which mkfs.ext4 2>/dev/null)" ]] && FSOPTS="${FSOPTS} ext4 Ext4"
2012-01-18 17:23:50 +01:00
[[ "$(which mkfs.btrfs 2>/dev/null)" ]] && FSOPTS="${FSOPTS} btrfs Btrfs-(Experimental)"
2011-02-04 18:04:59 +01:00
[[ "$(which mkfs.nilfs2 2>/dev/null)" ]] && FSOPTS="${FSOPTS} nilfs2 Nilfs2-(Experimental)"
2011-02-04 14:34:11 +01:00
[[ "$(which mkreiserfs 2>/dev/null)" ]] && FSOPTS="${FSOPTS} reiserfs Reiser3"
[[ "$(which mkfs.xfs 2>/dev/null)" ]] && FSOPTS="${FSOPTS} xfs XFS"
[[ "$(which mkfs.jfs 2>/dev/null)" ]] && FSOPTS="${FSOPTS} jfs JFS"
# create 1 MB bios_grub partition for grub2-bios GPT support
2011-02-04 14:34:11 +01:00
if [[ "${GUIDPARAMETER}" = "yes" ]]; then
GUID_PART_SIZE="2"
GPT_BIOS_GRUB2_PART_SIZE="${GUID_PART_SIZE}"
UEFISYS_PART_SIZE="512"
2010-03-11 12:07:35 +01:00
else
GUID_PART_SIZE="0"
2011-09-12 21:38:58 +02:00
UEFISYS_PART_SIZE="0"
2010-03-11 12:07:35 +01:00
fi
2011-09-12 21:38:58 +02:00
DISC_SIZE=$((${DISC_SIZE}-${GUID_PART_SIZE}-${UEFISYS_PART_SIZE}))
2011-02-04 14:34:11 +01:00
while [[ "${BOOT_PART_SET}" = "" ]]; do
2012-06-02 17:23:55 +02:00
DIALOG --inputbox "Enter the size (MB) of your /boot partition,\nMinimum value is 16.\n\nDisk space left: ${DISC_SIZE} MB" 10 65 "512" 2>${ANSWER} || return 1
2011-02-04 14:34:11 +01:00
BOOT_PART_SIZE="$(cat ${ANSWER})"
if [[ "${BOOT_PART_SIZE}" = "" ]]; then
DIALOG --msgbox "ERROR: You have entered a invalid size, please enter again." 0 0
else
2011-02-04 14:34:11 +01:00
if [[ "${BOOT_PART_SIZE}" -ge "${DISC_SIZE}" || "${BOOT_PART_SIZE}" -lt "16" || "${SBOOT_PART_SIZE}" = "${DISC_SIZE}" ]]; then
2010-03-11 12:07:35 +01:00
DIALOG --msgbox "ERROR: You have entered an invalid size, please enter again." 0 0
else
BOOT_PART_SET=1
fi
fi
done
2011-02-04 14:34:11 +01:00
DISC_SIZE=$((${DISC_SIZE}-${BOOT_PART_SIZE}))
2010-04-16 07:31:29 +02:00
SWAP_SIZE="256"
2011-02-04 14:34:11 +01:00
[[ "${DISC_SIZE}" -lt "256" ]] && SWAP_SIZE="${DISC_SIZE}"
while [[ "${SWAP_PART_SET}" = "" ]]; do
DIALOG --inputbox "Enter the size (MB) of your swap partition,\nMinimum value is > 0.\n\nDisk space left: ${DISC_SIZE} MB" 10 65 "${SWAP_SIZE}" 2>${ANSWER} || return 1
2011-02-04 14:34:11 +01:00
SWAP_PART_SIZE=$(cat ${ANSWER})
if [[ "${SWAP_PART_SIZE}" = "" || "${SWAP_PART_SIZE}" = "0" ]]; then
2010-03-11 12:07:35 +01:00
DIALOG --msgbox "ERROR: You have entered an invalid size, please enter again." 0 0
else
2011-02-04 14:34:11 +01:00
if [[ "${SWAP_PART_SIZE}" -ge "${DISC_SIZE}" ]]; then
DIALOG --msgbox "ERROR: You have entered a too large size, please enter again." 0 0
else
SWAP_PART_SET=1
fi
fi
done
2011-02-04 14:34:11 +01:00
DISC_SIZE=$((${DISC_SIZE}-${SWAP_PART_SIZE}))
2010-04-16 07:31:29 +02:00
ROOT_SIZE="7500"
2011-02-04 14:34:11 +01:00
[[ "${DISC_SIZE}" -lt "7500" ]] && ROOT_SIZE="${DISC_SIZE}"
while [[ "${ROOT_PART_SET}" = "" ]]; do
DIALOG --inputbox "Enter the size (MB) of your / partition,\nthe /home partition will use the remaining space.\n\nDisk space left: ${DISC_SIZE} MB" 10 65 "${ROOT_SIZE}" 2>${ANSWER} || return 1
2011-02-04 14:34:11 +01:00
ROOT_PART_SIZE=$(cat ${ANSWER})
if [[ "${ROOT_PART_SIZE}" = "" || "${ROOT_PART_SIZE}" = "0" ]]; then
2010-03-11 12:07:35 +01:00
DIALOG --msgbox "ERROR: You have entered an invalid size, please enter again." 0 0
else
2011-02-04 14:34:11 +01:00
if [[ "${ROOT_PART_SIZE}" -ge "${DISC_SIZE}" ]]; then
DIALOG --msgbox "ERROR: You have entered a too large size, please enter again." 0 0
else
DIALOG --yesno "$((${DISC_SIZE}-${ROOT_PART_SIZE})) MB will be used for your /home partition. Is this OK?" 0 0 && ROOT_PART_SET=1
fi
fi
done
2011-02-04 14:34:11 +01:00
while [[ "${CHOSEN_FS}" = "" ]]; do
DIALOG --menu "Select a filesystem for / and /home:" 16 45 8 ${FSOPTS} 2>${ANSWER} || return 1
FSTYPE=$(cat ${ANSWER})
DIALOG --yesno "${FSTYPE} will be used for / and /home. Is this OK?" 0 0 && CHOSEN_FS=1
done
2010-03-11 12:07:35 +01:00
DEFAULTFS=1
done
2011-02-04 14:34:11 +01:00
DIALOG --defaultno --yesno "${DISC} will be COMPLETELY ERASED! Are you absolutely sure?" 0 0 \
|| return 1
2011-02-04 14:34:11 +01:00
DEVICE=${DISC}
# validate DEVICE
2011-02-04 14:34:11 +01:00
if [[ ! -b "${DEVICE}" ]]; then
DIALOG --msgbox "Device '${DEVICE}' is not valid" 0 0
return 1
fi
# validate DEST
2011-02-04 14:34:11 +01:00
if [[ ! -d "${DESTDIR}" ]]; then
DIALOG --msgbox "Destination directory '${DESTDIR}' is not valid" 0 0
return 1
fi
2011-02-03 21:54:43 +01:00
[[ -e /tmp/.fstab ]] && rm -f /tmp/.fstab
# disable swap and all mounted partitions, umount / last!
_umountall
2012-01-09 13:54:09 +01:00
if [[ "${NAME_SCHEME_PARAMETER_RUN}" == "" ]]; then
set_device_name_scheme || return 1
fi
2010-03-11 12:07:35 +01:00
# we assume a /dev/hdX format (or /dev/sdX)
2012-01-09 13:54:09 +01:00
if [[ "${GUIDPARAMETER}" == "yes" ]]; then
2011-09-12 21:38:58 +02:00
PART_ROOT="${DEVICE}5"
# GPT (GUID) is supported only by 'parted' or 'sgdisk'
2010-03-11 12:07:35 +01:00
printk off
2011-02-04 14:34:11 +01:00
DIALOG --infobox "Partitioning ${DEVICE}" 0 0
# clean partition table to avoid issues!
sgdisk --zap ${DEVICE} &>/dev/null
2012-04-24 18:50:27 +02:00
# clear all magic strings/signatures - mdadm, lvm, partition tables etc.
dd if=/dev/zero of=${DEVICE} bs=512 count=2048 &>/dev/null
wipefs -a ${DEVICE} &>/dev/null
# create fresh GPT
sgdisk --clear ${DEVICE} &>/dev/null
2012-04-24 18:50:27 +02:00
# create actual partitions
sgdisk --set-alignment="2048" --new=1:1M:+${GPT_BIOS_GRUB2_PART_SIZE}M --typecode=1:EF02 --change-name=1:BIOS_GRUB2 ${DEVICE} > ${LOG}
sgdisk --set-alignment="2048" --new=2:0:+${UEFISYS_PART_SIZE}M --typecode=2:EF00 --change-name=2:UEFI_SYSTEM ${DEVICE} > ${LOG}
sgdisk --set-alignment="2048" --new=3:0:+${BOOT_PART_SIZE}M --typecode=3:8300 --attributes=3:set:2 --change-name=3:ARCHLINUX_BOOT ${DEVICE} > ${LOG}
sgdisk --set-alignment="2048" --new=4:0:+${SWAP_PART_SIZE}M --typecode=4:8200 --change-name=4:ARCHLINUX_SWAP ${DEVICE} > ${LOG}
sgdisk --set-alignment="2048" --new=5:0:+${ROOT_PART_SIZE}M --typecode=5:8300 --change-name=5:ARCHLINUX_ROOT ${DEVICE} > ${LOG}
sgdisk --set-alignment="2048" --new=6:0:0 --typecode=6:8300 --change-name=6:ARCHLINUX_HOME ${DEVICE} > ${LOG}
sgdisk --print ${DEVICE} > ${LOG}
2010-03-11 12:07:35 +01:00
else
PART_ROOT="${DEVICE}3"
# start at sector 1 for 4k drive compatibility and correct alignment
2010-03-11 12:07:35 +01:00
printk off
2011-02-04 14:34:11 +01:00
DIALOG --infobox "Partitioning ${DEVICE}" 0 0
2010-03-11 12:07:35 +01:00
# clean partitiontable to avoid issues!
2011-02-04 14:34:11 +01:00
dd if=/dev/zero of=${DEVICE} bs=512 count=2048 >/dev/null 2>&1
wipefs -a ${DEVICE} &>/dev/null
2010-03-11 12:07:35 +01:00
# create DOS MBR with parted
2011-09-12 21:38:58 +02:00
parted -a optimal -s ${DEVICE} mktable msdos >/dev/null 2>&1
parted -a optimal -s ${DEVICE} mkpart primary 1 $((${GUID_PART_SIZE}+${BOOT_PART_SIZE})) >${LOG}
2011-09-12 21:38:58 +02:00
parted -a optimal -s ${DEVICE} set 1 boot on >${LOG}
parted -a optimal -s ${DEVICE} mkpart primary $((${GUID_PART_SIZE}+${BOOT_PART_SIZE})) $((${GUID_PART_SIZE}+${BOOT_PART_SIZE}+${SWAP_PART_SIZE})) >${LOG}
parted -a optimal -s ${DEVICE} mkpart primary $((${GUID_PART_SIZE}+${BOOT_PART_SIZE}+${SWAP_PART_SIZE})) $((${GUID_PART_SIZE}+${BOOT_PART_SIZE}+${SWAP_PART_SIZE}+${ROOT_PART_SIZE})) >${LOG}
parted -a optimal -s ${DEVICE} mkpart primary $((${GUID_PART_SIZE}+${BOOT_PART_SIZE}+${SWAP_PART_SIZE}+${ROOT_PART_SIZE})) 100% >${LOG}
2010-03-11 12:07:35 +01:00
fi
2011-02-03 21:54:43 +01:00
if [[ $? -gt 0 ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Error partitioning ${DEVICE} (see ${LOG} for details)" 0 0
printk on
return 1
fi
printk on
## wait until /dev initialized correct devices
2010-03-11 12:07:35 +01:00
udevadm settle
## FSSPECS - default filesystem specs (the + is bootable flag)
## <partnum>:<mountpoint>:<partsize>:<fstype>[:<fsoptions>][:+]:labelname
## The partitions in FSSPECS list should be listed in the "mountpoint" order.
## Make sure the "root" partition is defined first in the FSSPECS list
FSSPECS="3:/:${ROOT_PART_SIZE}:${FSTYPE}:::ROOT_ARCH 1:/boot:${BOOT_PART_SIZE}:ext2::+:BOOT_ARCH 4:/home:*:${FSTYPE}:::HOME_ARCH 2:swap:${SWAP_PART_SIZE}:swap:::SWAP_ARCH"
if [[ "${GUIDPARAMETER}" == "yes" ]]; then
FSSPECS="5:/:${ROOT_PART_SIZE}:${FSTYPE}:::ROOT_ARCH 3:/boot:${BOOT_PART_SIZE}:ext2::+:BOOT_ARCH 2:/boot/efi:512:vfat:-F32::ESP 6:/home:*:${FSTYPE}:::HOME_ARCH 4:swap:${SWAP_PART_SIZE}:swap:::SWAP_ARCH"
fi
## make and mount filesystems
2011-02-04 14:34:11 +01:00
for fsspec in ${FSSPECS}; do
part="$(echo ${fsspec} | tr -d ' ' | cut -f1 -d:)"
mountpoint="$(echo ${fsspec} | tr -d ' ' | cut -f2 -d:)"
fstype="$(echo ${fsspec} | tr -d ' ' | cut -f4 -d:)"
fsoptions="$(echo ${fsspec} | tr -d ' ' | cut -f5 -d:)"
[[ "${fsoptions}" == "" ]] && fsoptions="NONE"
labelname="$(echo ${fsspec} | tr -d ' ' | cut -f7 -d:)"
2011-02-04 14:34:11 +01:00
btrfsdevices="${DEVICE}${part}"
btrfsssd="NONE"
btrfscompress="NONE"
btrfssubvolume="NONE"
btrfslevel="NONE"
dosubvolume="no"
# if echo "${mountpoint}" | tr -d ' ' | grep '^/$' 2>&1 >/dev/null; then
# if [[ "$(echo ${mountpoint} | tr -d ' ' | grep '^/$' | wc -l)" -eq 0 ]]; then
DIALOG --infobox "Creating ${fstype} on ${DEVICE}${part} with FSLABEL ${labelname} . Mountpoint is ${mountpoint} ." 0 0
_mkfs yes "${DEVICE}${part}" "${fstype}" "${DESTDIR}" "${mountpoint}" "${labelname}" "${fsoptions}" "${btrfsdevices}" "${btrfssubvolume}" "${btrfslevel}" "${dosubvolume}" "${btrfssd}" "${btrfscompress}" || return 1
# fi
done
DIALOG --msgbox "Auto-prepare was successful" 0 0
S_MKFSAUTO=1
2008-10-20 22:39:25 +02:00
}
2011-09-12 21:38:58 +02:00
check_gpt() {
2011-10-07 09:38:59 +02:00
GUID_DETECTED=""
2012-04-23 15:17:42 +02:00
[[ "$(${_BLKID} -p -i -o value -s PTTYPE ${DISC})" == "gpt" ]] && GUID_DETECTED="1"
2011-10-27 09:51:17 +02:00
if [[ "${GUID_DETECTED}" == "" ]]; then
DIALOG --defaultno --yesno "Setup detected no GUID (gpt) partition table on ${DISC}.\n\nDo you want to convert the existing MBR table in ${DISC} to a GUID (gpt) partition table?\n\nNOTE:\nBIOS-GPT boot may not work in some Lenovo systems (irrespective of the bootloader used). " 0 0 || return 1
sgdisk --mbrtogpt ${DISC} > ${LOG} && GUID_DETECTED="1"
fi
2011-10-27 09:51:17 +02:00
if [[ "${GUID_DETECTED}" == "1" ]]; then
if [[ "${CHECK_UEFISYS_PART}" == "1" ]]; then
2012-01-09 13:54:09 +01:00
check_uefisyspart
2011-09-12 21:38:58 +02:00
fi
2011-10-27 09:51:17 +02:00
if [[ "${CHECK_BIOS_BOOT_GRUB2}" == "1" ]]; then
2011-09-12 21:38:58 +02:00
if ! [[ "$(sgdisk -p ${DISC} | grep 'EF02')" ]]; then
2011-10-07 15:41:32 +02:00
DIALOG --msgbox "Setup detected no BIOS BOOT PARTITION in ${DISC}. Please create a >=1 MB BIOS Boot partition for grub2-bios GPT support." 0 0
RUN_CGDISK="1"
fi
fi
fi
2011-10-27 09:51:17 +02:00
if [[ "${RUN_CGDISK}" == "1" ]]; then
2011-10-07 15:41:32 +02:00
DIALOG --msgbox "Now you'll be put into cgdisk where you can partition your hard drive.\nYou should make a swap partition and as many data partitions as you will need." 18 70
2011-10-27 09:51:17 +02:00
clear && cgdisk ${DISC}
2011-10-07 15:41:32 +02:00
fi
2010-03-18 22:46:21 +01:00
}
2012-01-09 13:54:09 +01:00
## check and mount UEFI SYSTEM PARTITION at /boot/efi
check_uefisyspart() {
if [[ "$(${_BLKID} -p -i -o value -s PTTYPE ${DISC})" != "gpt" ]]; then
DIALOG --msgbox "Setup detected no GUID (gpt) partition table on ${DISC}.\nUEFI boot requires ${DISC} to be partitioned as GPT.\nSetup will now try to non-destructively convert ${DISC} to GPT using sgdisk." 0 0
sgdisk --mbrtogpt "${DISC}" > "${LOG}" && GUID_DETECTED="1"
fi
2012-04-24 18:50:27 +02:00
if [[ ! "$(sgdisk -p ${DISC} | grep 'EF00')" ]]; then
DIALOG --msgbox "Setup detected no UEFI SYSTEM PARTITION in ${DISC}. You will now be put into cgdisk. Please create a >=512 MiB partition with gdisk type code EF00 .\nWhen prompted (later) to format as FAT32, say Yes.\nIf you already have a >=512 MiB FAT32 UEFI SYSTEM Partition, check whether that partition has EF00 gdisk type code." 0 0
clear && cgdisk "${DISC}"
2012-04-24 18:50:27 +02:00
RUN_CGDISK=""
fi
if [[ "$(sgdisk -p ${DISC} | grep 'EF00')" ]]; then
UEFISYS_PART_NUM="$(sgdisk -p ${DISC} | grep 'EF00' | tail -n +1 | awk '{print $1}')"
UEFISYS_PART="${DISC}${UEFISYS_PART_NUM}"
2012-01-09 13:54:09 +01:00
2012-04-24 18:50:27 +02:00
if [[ "$(${_BLKID} -p -i -o value -s TYPE ${UEFISYS_PART})" == "vfat" ]]; then
if [[ "$(${_BLKID} -p -i -o value -s VERSION ${UEFISYS_PART})" != "FAT32" ]]; then
## Check whether UEFISYS is FAT32 (specifically), otherwise warn the user (but do not exit).
DIALOG --defaultno --yesno "UEFI SYSTEM PARTIION ${UEFISYS_PART} is not FAT32 formatted. Some UEFI firmwares may not work properly with a FAT16 or FAT12 filesystem in the UEFISYS partition.\nDo you want to format ${UEFISYS_PART} as FAT32?" 0 0 && _FORMAT_UEFISYS_FAT32="1"
2012-04-24 18:50:27 +02:00
fi
else
## Check whether UEFISYS is FAT, otherwise inform the user and offer to format the partition as FAT32.
DIALOG --defaultno --yesno "UEFI Specification requires UEFI SYSTEM PARTIION to be formatted as FAT32.\nDo you want to format ${UEFISYS_PART} as FAT32?" 0 0 && _FORMAT_UEFISYS_FAT32="1"
2012-04-24 18:50:27 +02:00
fi
umount "${DESTDIR}/boot/efi" &> /dev/null
umount "${UEFISYS_PART}" &> /dev/null
rm -rf "${DESTDIR}/boot/efi"
2012-04-24 18:50:27 +02:00
if [[ "${_FORMAT_UEFISYS_FAT32}" == "1" ]]; then
mkfs.vfat -F32 -n "ESP" "${UEFISYS_PART}"
2012-01-09 13:54:09 +01:00
fi
mkdir -p "${DESTDIR}/boot/efi"
if [[ "$(${_BLKID} -p -i -o value -s TYPE ${UEFISYS_PART})" == "vfat" ]]; then
mount -o rw,flush -t vfat "${UEFISYS_PART}" "${DESTDIR}/boot/efi"
else
DIALOG --msgbox "${UEFISYS_PART} is not formatted using FAT filesystem. Setup will go ahead but there might be issues using non-FAT FS for UEFISYS partition." 0 0
mount -o rw "${UEFISYS_PART}" "${DESTDIR}/boot/efi"
fi
## Fix (possible) case-sensitivity issues
if [[ -d "${DESTDIR}/boot/efi/efi" ]]; then
mv "${DESTDIR}/boot/efi/efi" "${DESTDIR}/boot/efi/EFI_"
mv "${DESTDIR}/boot/efi/EFI_" "${DESTDIR}/boot/efi/EFI"
2012-01-09 13:54:09 +01:00
fi
[[ ! -d "${DESTDIR}/boot/efi/EFI" ]] && mkdir -p "${DESTDIR}/boot/efi/EFI"
else
DIALOG --msgbox "Setup did not find any UEFI SYSTEM PARTITION in ${DISC}. Please create a >=512MiB FAT32 partition with gdisk type code EFOO and try again." 0 0
return 1
2012-01-09 13:54:09 +01:00
fi
}
2008-10-20 22:39:25 +02:00
partition() {
# disable swap and all mounted partitions, umount / last!
_umountall
2009-04-17 22:29:31 +02:00
# check on encrypted devices, else weird things can happen!
_stopluks
2009-03-28 13:36:54 +01:00
# check on raid devices, else weird things can happen during partitioning!
_stopmd
# check on lvm devices, else weird things can happen during partitioning!
_stoplvm
2009-06-26 10:33:54 +02:00
# update dmraid
_dmraid_update
2010-03-15 07:14:28 +01:00
# switch for mbr usage
set_guid
# Select disk to partition
DISCS=$(finddisks _)
2011-02-04 14:34:11 +01:00
DISCS="${DISCS} OTHER _ DONE +"
DIALOG --msgbox "Available Disks:\n\n$(_getavaildisks)\n" 0 0
DISC=""
while true; do
# Prompt the user with a list of known disks
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select the disk you want to partition\n(select DONE when finished)" 14 55 7 ${DISCS} 2>${ANSWER} || return 1
DISC=$(cat ${ANSWER})
2012-01-09 13:54:09 +01:00
if [[ "${DISC}" == "OTHER" ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --inputbox "Enter the full path to the device you wish to partition" 8 65 "/dev/sda" 2>${ANSWER} || DISC=""
DISC=$(cat ${ANSWER})
fi
# Leave our loop if the user is done partitioning
2012-01-09 13:54:09 +01:00
[[ "${DISC}" == "DONE" ]] && break
MSDOS_DETECTED=""
2012-01-09 13:54:09 +01:00
if ! [[ "${DISC}" == "" ]]; then
if [[ "${GUIDPARAMETER}" == "yes" ]]; then
2012-04-24 18:50:27 +02:00
CHECK_BIOS_BOOT_GRUB2=""
CHECK_UEFISYS_PART=""
2011-10-07 15:41:32 +02:00
RUN_CGDISK="1"
2011-09-12 21:38:58 +02:00
check_gpt
else
2012-04-23 15:17:42 +02:00
[[ "$(${_BLKID} -p -i -o value -s PTTYPE ${DISC})" == "dos" ]] && MSDOS_DETECTED="1"
2012-01-09 13:54:09 +01:00
if [[ "${MSDOS_DETECTED}" == "" ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --defaultno --yesno "Setup detected no MS-DOS partition table on ${DISC}.\nDo you want to create a MS-DOS partition table now on ${DISC}?\n\n${DISC} will be COMPLETELY ERASED! Are you absolutely sure?" 0 0 || return 1
# clean partitiontable to avoid issues!
2011-02-04 14:34:11 +01:00
dd if=/dev/zero of=${DEVICE} bs=512 count=2048 >/dev/null 2>&1
wipefs -a ${DEVICE} /dev/null 2>&1
2011-09-12 21:38:58 +02:00
parted -a optimal -s ${DISC} mktable msdos >${LOG}
fi
# Partition disc
DIALOG --msgbox "Now you'll be put into the parted shell where you can partition your hard drive. You should make a swap partition and as many data partitions as you will need.\n\nShort command list:\n- 'help' to get help text\n- 'print' to show partition table\n- 'mkpart' for new partition\n- 'rm' for deleting a partition\n- 'quit' to leave parted\n\nNOTE: parted may tell you to reboot after creating partitions. If you need to reboot, just re-enter this install program, skip this step and go on." 18 70
clear
## Use parted for correct alignment, cfdisk does not align correct!
2011-02-04 14:34:11 +01:00
parted ${DISC} print
parted ${DISC}
fi
fi
done
2009-06-26 10:33:54 +02:00
# update dmraid
_dmraid_update
NEXTITEM="3"
S_PART=1
2008-10-20 22:39:25 +02:00
}
2010-06-27 11:33:33 +02:00
# scan and update btrfs devices
btrfs_scan() {
btrfs device scan >/dev/null 2>&1
}
2010-06-26 21:41:17 +02:00
# mount btrfs for checks
mount_btrfs() {
btrfs_scan
BTRFSMP="$(mktemp -d /tmp/brtfsmp.XXXX)"
2011-02-04 14:34:11 +01:00
mount ${PART} ${BTRFSMP}
2010-06-26 21:41:17 +02:00
}
# unmount btrfs after checks done
umount_btrfs() {
2011-02-04 14:34:11 +01:00
umount ${BTRFSMP}
rm -r ${BTRFSMP}
2010-06-26 21:41:17 +02:00
}
# Set BTRFS_DEVICES on detected btrfs devices
find_btrfs_raid_devices() {
btrfs_scan
2011-02-04 14:34:11 +01:00
if [[ "${DETECT_CREATE_FILESYSTEM}" = "no" && "${FSTYPE}" = "btrfs" ]]; then
for i in $(btrfs filesystem show ${PART} | cut -d " " -f 11); do
BTRFS_DEVICES="${BTRFS_DEVICES}#${i}"
done
fi
}
2010-07-15 21:24:55 +02:00
find_btrfs_raid_bootloader_devices() {
btrfs_scan
BTRFS_COUNT=1
2012-04-23 15:17:42 +02:00
if [[ "$(${_BLKID} -p -i ${bootdev} -o value -s TYPE)" = "btrfs" ]]; then
2010-07-15 21:24:55 +02:00
BTRFS_DEVICES=""
2011-02-04 14:34:11 +01:00
for i in $(btrfs filesystem show ${bootdev} | cut -d " " -f 11); do
BTRFS_DEVICES="${BTRFS_DEVICES}#${i}"
BTRFS_COUNT=$((${BTRFS_COUNT}+1))
2010-07-15 21:24:55 +02:00
done
fi
}
# find btrfs subvolume
find_btrfs_subvolume() {
2011-02-04 14:34:11 +01:00
if [[ "${DETECT_CREATE_FILESYSTEM}" = "no" ]]; then
# existing btrfs subvolumes
mount_btrfs
2011-02-04 14:34:11 +01:00
for i in $(btrfs subvolume list ${BTRFSMP} | cut -d " " -f 7); do
echo ${i}
[[ "${1}" ]] && echo ${1}
done
umount_btrfs
fi
}
find_btrfs_bootloader_subvolume() {
BTRFS_SUBVOLUME_COUNT=1
2012-04-23 15:17:42 +02:00
if [[ "$(${_BLKID} -p -i ${bootdev} -o value -s TYPE)" = "btrfs" ]]; then
BTRFS_SUBVOLUMES=""
2011-02-04 14:34:11 +01:00
PART="${bootdev}"
mount_btrfs
2011-02-04 14:34:11 +01:00
for i in $(btrfs subvolume list ${BTRFSMP} | cut -d " " -f 7); do
BTRFS_SUBVOLUMES="${BTRFS_SUBVOLUMES}#${i}"
BTRFS_SUBVOLUME_COUNT=$((${BTRFS_COUNT}+1))
done
umount_btrfs
fi
}
# subvolumes already in use
subvolumes_in_use() {
SUBVOLUME_IN_USE=""
2011-02-04 14:34:11 +01:00
for i in $(grep ${PART}[:#] /tmp/.parts); do
if [[ "$(echo ${i} | grep ":btrfs:")" ]]; then
SUBVOLUME_IN_USE="${SUBVOLUME_IN_USE} $(echo ${i} | cut -d: -f 9)"
fi
done
}
# ask for btrfs compress option
btrfs_compress() {
BTRFS_COMPRESS="NONE"
2012-01-18 18:13:01 +01:00
BTRFS_COMPRESSLEVELS="lzo - zlib -"
2011-02-04 14:34:11 +01:00
if [[ "${BTRFS_SUBVOLUME}" = "NONE" ]]; then
DIALOG --defaultno --yesno "Would you like to compress the data on ${PART}?" 0 0 && BTRFS_COMPRESS="compress"
else
2011-02-04 14:34:11 +01:00
DIALOG --defaultno --yesno "Would you like to compress the data on ${PART} subvolume=${BTRFS_SUBVOLUME}?" 0 0 && BTRFS_COMPRESS="compress"
fi
2012-01-18 18:13:01 +01:00
if [[ "${BTRFS_COMPRESS}" = "compress" ]]; then
DIALOG --menu "Select the compression method you want to use" 21 50 9 ${BTRFS_COMPRESSLEVELS} 2>${ANSWER} || return 1
BTRFS_COMPRESS="compress=$(cat ${ANSWER})"
fi
}
# ask for btrfs ssd option
btrfs_ssd() {
BTRFS_SSD="NONE"
2011-02-04 14:34:11 +01:00
if [[ "${BTRFS_SUBVOLUME}" = "NONE" ]]; then
DIALOG --defaultno --yesno "Would you like to optimize the data for ssd disk usage on ${PART}?" 0 0 && BTRFS_SSD="ssd"
else
2011-02-04 14:34:11 +01:00
DIALOG --defaultno --yesno "Would you like to optimize the data for ssd disk usage on ${PART} subvolume=${BTRFS_SUBVOLUME}?" 0 0 && BTRFS_SSD="ssd"
fi
}
# values that are only needed for btrfs creation
clear_btrfs_values() {
: >/tmp/.btrfs-devices
LABEL_NAME=""
FS_OPTIONS=""
BTRFS_DEVICES=""
BTRFS_LEVEL=""
}
# do not ask for btrfs filesystem creation, if already prepared for creation!
check_btrfs_filesystem_creation() {
DETECT_CREATE_FILESYSTEM="no"
SKIP_FILESYSTEM="no"
SKIP_ASK_SUBVOLUME="no"
2011-02-04 14:34:11 +01:00
for i in $(grep ${PART}[:#] /tmp/.parts); do
if [[ "$(echo ${i} | grep ":btrfs:")" ]]; then
FSTYPE="btrfs"
SKIP_FILESYSTEM="yes"
# check on filesystem creation, skip subvolume asking then!
2011-02-04 14:34:11 +01:00
[[ "$(echo ${i} | cut -d: -f 4 | grep yes)" ]] && DETECT_CREATE_FILESYSTEM="yes"
[[ "${DETECT_CREATE_FILESYSTEM}" = "yes" ]] && SKIP_ASK_SUBVOLUME="yes"
fi
done
}
# remove devices with no subvolume from list and generate raid device list
2010-06-29 07:44:46 +02:00
btrfs_parts() {
2011-02-03 21:54:43 +01:00
if [[ -s /tmp/.btrfs-devices ]]; then
BTRFS_DEVICES=""
2010-06-29 07:44:46 +02:00
for i in $(cat /tmp/.btrfs-devices); do
2011-02-04 14:34:11 +01:00
BTRFS_DEVICES="${BTRFS_DEVICES}#${i}"
2010-07-01 22:22:54 +02:00
# remove device if no subvolume is used!
2011-02-04 14:34:11 +01:00
[[ "${BTRFS_SUBVOLUME}" = "NONE" ]] && PARTS="$(echo ${PARTS} | sed -e "s#${i}\ _##g")"
2010-06-29 07:44:46 +02:00
done
else
2011-02-04 14:34:11 +01:00
[[ "${BTRFS_SUBVOLUME}" = "NONE" ]] && PARTS="$(echo ${PARTS} | sed -e "s#${PART}\ _##g")"
2010-06-29 07:44:46 +02:00
fi
}
# choose raid level to use on btrfs device
2010-06-13 16:17:05 +02:00
btrfs_raid_level() {
2010-06-20 19:00:41 +02:00
BTRFS_RAIDLEVELS="NONE - raid0 - raid1 - raid10 - single -"
2010-06-13 16:17:05 +02:00
BTRFS_RAID_FINISH=""
BTRFS_LEVEL=""
2011-02-04 14:34:11 +01:00
BTRFS_DEVICE="${PART}"
2010-06-13 16:17:05 +02:00
: >/tmp/.btrfs-devices
2010-06-20 19:00:41 +02:00
DIALOG --msgbox "BTRFS RAID OPTIONS:\n\nBTRFS has options to control the raid configuration for data and metadata.\nValid choices are raid0, raid1, raid10 and single.\nsingle means that no duplication of metadata is done, which may be desired when using hardware raid. raid10 requires at least 4 devices.\n\nIf you don't need this feature select NONE." 0 0
2011-02-04 14:34:11 +01:00
while [[ "${BTRFS_RAID_FINISH}" != "DONE" ]]; do
DIALOG --menu "Select the raid level you want to use" 21 50 9 ${BTRFS_RAIDLEVELS} 2>${ANSWER} || return 1
BTRFS_LEVEL=$(cat ${ANSWER})
if [[ "${BTRFS_LEVEL}" = "NONE" ]]; then
echo "${BTRFS_DEVICE}" >>/tmp/.btrfs-devices
2010-06-13 16:17:05 +02:00
break
else
# take selected device as 1st device, add additional devices in part below.
select_btrfs_raid_devices
fi
done
}
# select btrfs raid devices
2010-06-12 18:30:33 +02:00
select_btrfs_raid_devices () {
# show all devices with sizes
# DIALOG --msgbox "DISKS:\n$(_getavaildisks)\n\nPARTITIONS:\n$(_getavailpartitions)" 0 0
# select the second device to use, no missing option available!
2010-07-02 07:30:29 +02:00
: >/tmp/.btrfs-devices
2011-02-04 14:34:11 +01:00
BTRFS_PART="${BTRFS_DEVICE}"
BTRFS_PARTS="${PARTS}"
echo "${BTRFS_PART}" >>/tmp/.btrfs-devices
BTRFS_PARTS="$(echo ${BTRFS_PARTS} | sed -e "s#${BTRFS_PART}\ _##g")"
2010-06-12 18:30:33 +02:00
RAIDNUMBER=2
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select device ${RAIDNUMBER}" 21 50 13 ${BTRFS_PARTS} 2>${ANSWER} || return 1
BTRFS_PART=$(cat ${ANSWER})
echo "${BTRFS_PART}" >>/tmp/.btrfs-devices
while [[ "${BTRFS_PART}" != "DONE" ]]; do
2010-06-12 18:30:33 +02:00
BTRFS_DONE=""
2011-02-04 14:34:11 +01:00
RAIDNUMBER=$((${RAIDNUMBER} + 1))
2010-06-12 18:30:33 +02:00
# RAID10 need 4 devices!
2011-02-04 14:34:11 +01:00
[[ "${RAIDNUMBER}" -ge 3 && ! "${BTRFS_LEVEL}" = "raid10" ]] && BTRFS_DONE="DONE _"
[[ "${RAIDNUMBER}" -ge 5 && "${BTRFS_LEVEL}" = "raid10" ]] && BTRFS_DONE="DONE _"
2010-06-12 18:30:33 +02:00
# clean loop from used partition and options
2011-02-04 14:34:11 +01:00
BTRFS_PARTS="$(echo ${BTRFS_PARTS} | sed -e "s#${BTRFS_PART}\ _##g")"
2010-06-12 18:30:33 +02:00
# add more devices
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select device ${RAIDNUMBER}" 21 50 13 ${BTRFS_PARTS} ${BTRFS_DONE} 2>${ANSWER} || return 1
BTRFS_PART=$(cat ${ANSWER})
[[ "${BTRFS_PART}" = "DONE" ]] && break
echo "${BTRFS_PART}" >>/tmp/.btrfs-devices
2010-06-12 18:30:33 +02:00
done
# final step ask if everything is ok?
2011-02-04 14:34:11 +01:00
DIALOG --yesno "Would you like to create btrfs raid like this?\n\nLEVEL:\n${BTRFS_LEVEL}\n\nDEVICES:\n$(for i in $(cat /tmp/.btrfs-devices); do echo "${i}\n"; done)" 0 0 && BTRFS_RAID_FINISH="DONE"
2010-06-12 18:30:33 +02:00
}
# prepare new btrfs device
prepare_btrfs() {
2010-07-04 17:35:42 +02:00
btrfs_raid_level || return 1
prepare_btrfs_subvolume || return 1
2010-06-20 22:18:53 +02:00
}
# prepare btrfs subvolume
2010-06-21 22:30:50 +02:00
prepare_btrfs_subvolume() {
2010-06-28 20:49:46 +02:00
DOSUBVOLUME="no"
2010-07-15 07:47:14 +02:00
BTRFS_SUBVOLUME="NONE"
2011-02-04 14:34:11 +01:00
if [[ "${SKIP_ASK_SUBVOLUME}" = "no" ]]; then
DIALOG --defaultno --yesno "Would you like to create a new subvolume on ${PART}?" 0 0 && DOSUBVOLUME="yes"
2010-07-01 11:09:06 +02:00
else
DOSUBVOLUME="yes"
fi
2011-02-04 14:34:11 +01:00
if [[ "${DOSUBVOLUME}" = "yes" ]]; then
2010-07-15 19:04:22 +02:00
BTRFS_SUBVOLUME="NONE"
2011-02-04 14:34:11 +01:00
while [[ "${BTRFS_SUBVOLUME}" = "NONE" ]]; do
DIALOG --inputbox "Enter the SUBVOLUME name for the device, keep it short\nand use no spaces or special\ncharacters." 10 65 2>${ANSWER} || return 1
BTRFS_SUBVOLUME=$(cat ${ANSWER})
2010-06-20 22:18:53 +02:00
check_btrfs_subvolume
done
else
BTRFS_SUBVOLUME="NONE"
fi
2010-06-20 19:00:41 +02:00
}
# check btrfs subvolume
check_btrfs_subvolume(){
2011-02-04 14:34:11 +01:00
[[ "${DOMKFS}" = "yes" && "${FSTYPE}" = "btrfs" ]] && DETECT_CREATE_FILESYSTEM="yes"
if [[ "${DETECT_CREATE_FILESYSTEM}" = "no" ]]; then
mount_btrfs
2011-02-04 14:34:11 +01:00
for i in $(btrfs subvolume list ${BTRFSMP} | cut -d " " -f 7); do
if [[ "$(echo ${i} | grep "${BTRFS_SUBVOLUME}"$)" ]]; then
DIALOG --msgbox "ERROR: You have defined 2 identical SUBVOLUME names or an empty name! Please enter another name." 8 65
2010-07-15 07:47:14 +02:00
BTRFS_SUBVOLUME="NONE"
fi
done
umount_btrfs
else
subvolumes_in_use
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${SUBVOLUME_IN_USE} | egrep "${BTRFS_SUBVOLUME}")" ]]; then
DIALOG --msgbox "ERROR: You have defined 2 identical SUBVOLUME names or an empty name! Please enter another name." 8 65
2010-07-15 07:47:14 +02:00
BTRFS_SUBVOLUME="NONE"
fi
fi
2010-06-25 22:21:17 +02:00
}
# create btrfs subvolume
2010-06-21 22:30:50 +02:00
create_btrfs_subvolume() {
2010-06-26 21:41:17 +02:00
mount_btrfs
2011-02-04 14:34:11 +01:00
btrfs subvolume create ${BTRFSMP}/${_btrfssubvolume} >${LOG}
2010-07-04 21:35:10 +02:00
# change permission from 700 to 755
# to avoid warnings during package installation
2011-02-04 14:34:11 +01:00
chmod 755 ${BTRFSMP}/${_btrfssubvolume}
2010-06-26 21:41:17 +02:00
umount_btrfs
2010-06-21 22:30:50 +02:00
}
# choose btrfs subvolume from list
2010-06-12 18:30:33 +02:00
choose_btrfs_subvolume () {
2010-06-27 23:04:56 +02:00
BTRFS_SUBVOLUME="NONE"
SUBVOLUMES_DETECTED="no"
2010-06-25 22:21:17 +02:00
SUBVOLUMES=$(find_btrfs_subvolume _)
# check if subvolumes are present
2011-02-04 14:34:11 +01:00
[[ -n "${SUBVOLUMES}" ]] && SUBVOLUMES_DETECTED="yes"
2010-07-01 12:09:25 +02:00
subvolumes_in_use
2011-02-04 14:34:11 +01:00
for i in ${SUBVOLUME_IN_USE}; do
SUBVOLUMES=$(echo ${SUBVOLUMES} | sed -e "s#${i}\ _##g")
2010-07-01 12:09:25 +02:00
done
2012-01-09 13:54:09 +01:00
if [[ -n "${SUBVOLUMES}" ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select the subvolume to mount" 21 50 13 ${SUBVOLUMES} 2>${ANSWER} || return 1
BTRFS_SUBVOLUME=$(cat ${ANSWER})
else
2011-02-04 14:34:11 +01:00
if [[ "${SUBVOLUMES_DETECTED}" = "yes" ]]; then
DIALOG --msgbox "ERROR: All subvolumes of the device are already in use. Switching to create a new one now." 8 65
SKIP_ASK_SUBVOLUME=yes
prepare_btrfs_subvolume || return 1
fi
2010-06-27 23:04:56 +02:00
fi
2010-06-12 18:30:33 +02:00
}
2010-07-15 07:47:14 +02:00
# boot on btrfs subvolume is not supported
check_btrfs_boot_subvolume() {
2012-01-09 13:54:09 +01:00
if [[ "${MP}" = "/boot" && "${FSTYPE}" = "btrfs" && ! "${BTRFS_SUBVOLUME}" = "NONE" ]]; then
2010-07-15 21:24:55 +02:00
DIALOG --msgbox "ERROR: \n/boot on a btrfs subvolume is not supported by any bootloader yet!" 8 65
2010-07-15 19:04:22 +02:00
FILESYSTEM_FINISH="no"
fi
2010-07-15 07:47:14 +02:00
}
# btrfs subvolume menu
btrfs_subvolume() {
FILESYSTEM_FINISH=""
2011-02-04 14:34:11 +01:00
if [[ "${FSTYPE}" = "btrfs" && "${DOMKFS}" = "no" ]]; then
if [[ "${ASK_MOUNTPOINTS}" = "1" ]]; then
# create subvolume if requested
# choose btrfs subvolume if present
prepare_btrfs_subvolume || return 1
2011-02-04 14:34:11 +01:00
if [[ "${BTRFS_SUBVOLUME}" = "NONE" ]]; then
choose_btrfs_subvolume || return 1
fi
else
# use device if no subvolume is present
choose_btrfs_subvolume || return 1
fi
btrfs_compress
btrfs_ssd
fi
FILESYSTEM_FINISH="yes"
}
select_filesystem() {
2010-06-27 23:04:56 +02:00
FILESYSTEM_FINISH=""
2010-08-19 09:01:41 +02:00
# don't allow vfat as / filesystem, it will not work!
# don't allow ntfs as / filesystem, this is stupid!
FSOPTS=""
2011-02-04 14:34:11 +01:00
[[ "$(which mkfs.ext2 2>/dev/null)" ]] && FSOPTS="${FSOPTS} ext2 Ext2"
[[ "$(which mkfs.ext3 2>/dev/null)" ]] && FSOPTS="${FSOPTS} ext3 Ext3"
[[ "$(which mkfs.ext4 2>/dev/null)" ]] && FSOPTS="${FSOPTS} ext4 Ext4"
2012-01-13 16:09:25 +01:00
[[ "$(which mkfs.btrfs 2>/dev/null)" ]] && FSOPTS="${FSOPTS} btrfs Btrfs-(Experimental)"
2011-02-04 18:04:59 +01:00
[[ "$(which mkfs.nilfs2 2>/dev/null)" ]] && FSOPTS="${FSOPTS} nilfs2 Nilfs2-(Experimental)"
2011-02-04 14:34:11 +01:00
[[ "$(which mkreiserfs 2>/dev/null)" ]] && FSOPTS="${FSOPTS} reiserfs Reiser3"
[[ "$(which mkfs.xfs 2>/dev/null)" ]] && FSOPTS="${FSOPTS} xfs XFS"
[[ "$(which mkfs.jfs 2>/dev/null)" ]] && FSOPTS="${FSOPTS} jfs JFS"
[[ "$(which mkfs.ntfs 2>/dev/null)" && "${DO_ROOT}" = "DONE" ]] && FSOPTS="${FSOPTS} ntfs-3g NTFS"
[[ "$(which mkfs.vfat 2>/dev/null)" && "${DO_ROOT}" = "DONE" ]] && FSOPTS="${FSOPTS} vfat VFAT"
DIALOG --menu "Select a filesystem for ${PART}" 21 50 13 ${FSOPTS} 2>${ANSWER} || return 1
FSTYPE=$(cat ${ANSWER})
}
enter_mountpoint() {
2010-06-27 23:04:56 +02:00
FILESYSTEM_FINISH=""
MP=""
2011-02-04 14:34:11 +01:00
while [[ "${MP}" = "" ]]; do
DIALOG --inputbox "Enter the mountpoint for ${PART}" 8 65 "/boot" 2>${ANSWER} || return 1
MP=$(cat ${ANSWER})
if grep ":${MP}:" /tmp/.parts; then
DIALOG --msgbox "ERROR: You have defined 2 identical mountpoints! Please select another mountpoint." 8 65
MP=""
fi
done
}
# set sane values for paramaters, if not already set
2010-06-27 11:33:33 +02:00
check_mkfs_values() {
# Set values, to not confuse mkfs call!
2011-02-04 14:34:11 +01:00
[[ "${FS_OPTIONS}" = "" ]] && FS_OPTIONS="NONE"
[[ "${BTRFS_DEVICES}" = "" ]] && BTRFS_DEVICES="NONE"
[[ "${BTRFS_LEVEL}" = "" ]] && BTRFS_LEVEL="NONE"
[[ "${BTRFS_SUBVOLUME}" = "" ]] && BTRFS_SUBVOLUME="NONE"
[[ "${DOSUBVOLUME}" = "" ]] && DOSUBVOLUME="no"
2012-04-23 15:17:42 +02:00
[[ "${LABEL_NAME}" = "" && -n "$(${_BLKID} -p -i -o value -s LABEL ${PART})" ]] && LABEL_NAME="$(${_BLKID} -p -i -o value -s LABEL ${PART})"
2011-02-04 14:34:11 +01:00
[[ "${LABEL_NAME}" = "" ]] && LABEL_NAME="NONE"
2010-06-27 11:33:33 +02:00
}
2010-06-12 18:30:33 +02:00
create_filesystem() {
2010-06-28 20:49:46 +02:00
FILESYSTEM_FINISH=""
2010-06-12 18:30:33 +02:00
LABEL_NAME=""
2010-06-25 22:21:17 +02:00
FS_OPTIONS=""
BTRFS_DEVICES=""
BTRFS_LEVEL=""
2011-02-04 14:34:11 +01:00
DIALOG --yesno "Would you like to create a filesystem on ${PART}?\n\n(This will overwrite existing data!)" 0 0 && DOMKFS="yes"
if [[ "${DOMKFS}" = "yes" ]]; then
while [[ "${LABEL_NAME}" = "" ]]; do
2010-06-12 18:30:33 +02:00
DIALOG --inputbox "Enter the LABEL name for the device, keep it short\n(not more than 12 characters) and use no spaces or special\ncharacters." 10 65 \
2012-04-23 15:17:42 +02:00
"$(${_BLKID} -p -i -o value -s LABEL ${PART})" 2>${ANSWER} || return 1
2011-02-04 14:34:11 +01:00
LABEL_NAME=$(cat ${ANSWER})
if grep ":${LABEL_NAME}$" /tmp/.parts; then
2010-06-12 18:30:33 +02:00
DIALOG --msgbox "ERROR: You have defined 2 identical LABEL names! Please enter another name." 8 65
LABEL_NAME=""
fi
done
2011-02-04 14:34:11 +01:00
if [[ "${FSTYPE}" = "btrfs" ]]; then
2010-06-13 16:17:05 +02:00
prepare_btrfs || return 1
btrfs_compress
btrfs_ssd
2010-06-12 18:30:33 +02:00
fi
2011-02-04 14:34:11 +01:00
DIALOG --inputbox "Enter additional options to the filesystem creation utility.\nUse this field only, if the defaults are not matching your needs,\nelse just leave it empty." 10 70 2>${ANSWER} || return 1
FS_OPTIONS=$(cat ${ANSWER})
2010-06-25 22:21:17 +02:00
fi
2010-06-28 20:49:46 +02:00
FILESYSTEM_FINISH="yes"
2010-06-12 18:30:33 +02:00
}
2008-10-20 22:39:25 +02:00
mountpoints() {
2010-05-24 15:39:55 +02:00
NAME_SCHEME_PARAMETER_RUN=""
2011-02-04 14:34:11 +01:00
while [[ "${PARTFINISH}" != "DONE" ]]; do
2010-05-18 23:52:30 +02:00
activate_special_devices
: >/tmp/.device-names
: >/tmp/.fstab
: >/tmp/.parts
#
# Select mountpoints
#
DIALOG --msgbox "Available partitions:\n\n$(_getavailpartitions)\n" 0 0
PARTS=$(findpartitions _)
2010-05-25 16:33:02 +02:00
DO_SWAP=""
2011-02-04 14:34:11 +01:00
while [[ "${DO_SWAP}" != "DONE" ]]; do
2010-06-28 22:40:35 +02:00
FSTYPE="swap"
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select the partition to use as swap" 21 50 13 NONE - ${PARTS} 2>${ANSWER} || return 1
PART=$(cat ${ANSWER})
if [[ "${PART}" != "NONE" ]]; then
2010-05-25 16:33:02 +02:00
DOMKFS="no"
2011-02-04 14:34:11 +01:00
if [[ "${ASK_MOUNTPOINTS}" = "1" ]]; then
create_filesystem
else
2010-06-27 23:04:56 +02:00
FILESYSTEM_FINISH="yes"
fi
else
2010-06-27 23:04:56 +02:00
FILESYSTEM_FINISH="yes"
2010-05-25 16:33:02 +02:00
fi
2011-02-04 14:34:11 +01:00
[[ "${FILESYSTEM_FINISH}" = "yes" ]] && DO_SWAP=DONE
2010-05-25 16:33:02 +02:00
done
2010-06-28 20:49:46 +02:00
check_mkfs_values
2011-02-04 14:34:11 +01:00
if [[ "${PART}" != "NONE" ]]; then
PARTS="$(echo ${PARTS} | sed -e "s#${PART}\ _##g")"
echo "${PART}:swap:swap:${DOMKFS}:${LABEL_NAME}:${FS_OPTIONS}:${BTRFS_DEVICES}:${BTRFS_LEVEL}:${BTRFS_SUBVOLUME}:${DOSUBVOLUME}:${BTRFS_COMPRESS}:${BTRFS_SSD}" >>/tmp/.parts
fi
2010-05-25 16:33:02 +02:00
DO_ROOT=""
2011-02-04 14:34:11 +01:00
while [[ "${DO_ROOT}" != "DONE" ]]; do
DIALOG --menu "Select the partition to mount as /" 21 50 13 ${PARTS} 2>${ANSWER} || return 1
PART=$(cat ${ANSWER})
PART_ROOT=${PART}
2010-05-25 16:33:02 +02:00
# Select root filesystem type
2012-04-23 15:17:42 +02:00
FSTYPE="$(${_BLKID} -p -i -o value -s TYPE ${PART})"
DOMKFS="no"
# clear values first!
clear_btrfs_values
check_btrfs_filesystem_creation
2011-02-04 14:34:11 +01:00
if [[ "${ASK_MOUNTPOINTS}" = "1" && "${SKIP_FILESYSTEM}" = "no" ]]; then
2010-06-27 23:04:56 +02:00
select_filesystem && create_filesystem && btrfs_subvolume
else
2010-06-27 11:33:33 +02:00
btrfs_subvolume
2010-05-25 16:33:02 +02:00
fi
2011-02-04 14:34:11 +01:00
[[ "${FILESYSTEM_FINISH}" = "yes" ]] && DO_ROOT=DONE
2010-05-25 16:33:02 +02:00
done
find_btrfs_raid_devices
2010-06-30 23:06:36 +02:00
btrfs_parts
check_mkfs_values
2011-02-04 14:34:11 +01:00
echo "${PART}:${FSTYPE}:/:${DOMKFS}:${LABEL_NAME}:${FS_OPTIONS}:${BTRFS_DEVICES}:${BTRFS_LEVEL}:${BTRFS_SUBVOLUME}:${DOSUBVOLUME}:${BTRFS_COMPRESS}:${BTRFS_SSD}" >>/tmp/.parts
! [[ "${FSTYPE}" = "btrfs" ]] && PARTS="$(echo ${PARTS} | sed -e "s#${PART}\ _##g")"
#
# Additional partitions
#
2011-02-04 14:34:11 +01:00
while [[ "${PART}" != "DONE" ]]; do
DO_ADDITIONAL=""
2011-02-04 14:34:11 +01:00
while [[ "${DO_ADDITIONAL}" != "DONE" ]]; do
DIALOG --menu "Select any additional partitions to mount under your new root (select DONE when finished)" 21 52 13 ${PARTS} DONE _ 2>${ANSWER} || return 1
PART=$(cat ${ANSWER})
if [[ "${PART}" != "DONE" ]]; then
2012-04-23 15:17:42 +02:00
FSTYPE="$(${_BLKID} -p -i -o value -s TYPE ${PART})"
DOMKFS="no"
# clear values first!
clear_btrfs_values
check_btrfs_filesystem_creation
# Select a filesystem type
2011-02-04 14:34:11 +01:00
if [[ "${ASK_MOUNTPOINTS}" = "1" && "${SKIP_FILESYSTEM}" = "no" ]]; then
2010-06-27 23:04:56 +02:00
enter_mountpoint && select_filesystem && create_filesystem && btrfs_subvolume
else
enter_mountpoint
btrfs_subvolume
fi
2010-07-15 07:47:14 +02:00
check_btrfs_boot_subvolume
else
2010-06-27 23:04:56 +02:00
FILESYSTEM_FINISH="yes"
fi
2011-02-04 14:34:11 +01:00
[[ "${FILESYSTEM_FINISH}" = "yes" ]] && DO_ADDITIONAL="DONE"
done
2011-02-04 14:34:11 +01:00
if [[ "${PART}" != "DONE" ]]; then
find_btrfs_raid_devices
2010-06-30 23:06:36 +02:00
btrfs_parts
check_mkfs_values
2011-02-04 14:34:11 +01:00
echo "${PART}:${FSTYPE}:${MP}:${DOMKFS}:${LABEL_NAME}:${FS_OPTIONS}:${BTRFS_DEVICES}:${BTRFS_LEVEL}:${BTRFS_SUBVOLUME}:${DOSUBVOLUME}:${BTRFS_COMPRESS}:${BTRFS_SSD}" >>/tmp/.parts
! [[ "${FSTYPE}" = "btrfs" ]] && PARTS="$(echo ${PARTS} | sed -e "s#${PART}\ _##g")"
fi
done
2011-02-04 14:34:11 +01:00
DIALOG --yesno "Would you like to create and mount the filesytems like this?\n\nSyntax\n------\nDEVICE:TYPE:MOUNTPOINT:FORMAT:LABEL:FSOPTIONS:BTRFS_DETAILS\n\n$(for i in $(cat /tmp/.parts | sed -e 's, ,#,g'); do echo "${i}\n";done)" 0 0 && PARTFINISH="DONE"
done
# disable swap and all mounted partitions
_umountall
2011-02-04 14:34:11 +01:00
if [[ "${NAME_SCHEME_PARAMETER_RUN}" = "" ]]; then
set_device_name_scheme || return 1
fi
for line in $(cat /tmp/.parts); do
2011-02-04 14:34:11 +01:00
PART=$(echo ${line} | cut -d: -f 1)
FSTYPE=$(echo ${line} | cut -d: -f 2)
MP=$(echo ${line} | cut -d: -f 3)
DOMKFS=$(echo ${line} | cut -d: -f 4)
LABEL_NAME=$(echo ${line} | cut -d: -f 5)
FS_OPTIONS=$(echo ${line} | cut -d: -f 6)
BTRFS_DEVICES=$(echo ${line} | cut -d: -f 7)
BTRFS_LEVEL=$(echo ${line} | cut -d: -f 8)
BTRFS_SUBVOLUME=$(echo ${line} | cut -d: -f 9)
DOSUBVOLUME=$(echo ${line} | cut -d: -f 10)
BTRFS_COMPRESS=$(echo ${line} | cut -d: -f 11)
BTRFS_SSD=$(echo ${line} | cut -d: -f 12)
if [[ "${DOMKFS}" = "yes" ]]; then
if [[ "${FSTYPE}" = "swap" ]]; then
DIALOG --infobox "Creating and activating swapspace on ${PART}" 0 0
else
2011-02-04 14:34:11 +01:00
DIALOG --infobox "Creating ${FSTYPE} on ${PART}, mounting to ${DESTDIR}${MP}" 0 0
fi
2011-02-04 14:34:11 +01:00
_mkfs yes ${PART} ${FSTYPE} ${DESTDIR} ${MP} ${LABEL_NAME} ${FS_OPTIONS} ${BTRFS_DEVICES} ${BTRFS_LEVEL} ${BTRFS_SUBVOLUME} ${DOSUBVOLUME} ${BTRFS_COMPRESS} ${BTRFS_SSD} || return 1
else
2011-02-04 14:34:11 +01:00
if [[ "${FSTYPE}" = "swap" ]]; then
DIALOG --infobox "Activating swapspace on ${PART}" 0 0
else
2011-02-04 14:34:11 +01:00
DIALOG --infobox "Mounting ${FSTYPE} on ${PART} to ${DESTDIR}${MP}" 0 0
fi
2011-02-04 14:34:11 +01:00
_mkfs no ${PART} ${FSTYPE} ${DESTDIR} ${MP} ${LABEL_NAME} ${FS_OPTIONS} ${BTRFS_DEVICES} ${BTRFS_LEVEL} ${BTRFS_SUBVOLUME} ${DOSUBVOLUME} ${BTRFS_COMPRESS} ${BTRFS_SSD} || return 1
fi
sleep 1
done
DIALOG --msgbox "Partitions were successfully mounted." 0 0
NEXTITEM="5"
S_MKFS=1
2008-10-20 22:39:25 +02:00
}
2010-06-13 16:17:05 +02:00
# _mkfs()
# Create and mount filesystems in our destination system directory.
#
# args:
# domk: Whether to make the filesystem or use what is already there
# device: Device filesystem is on
# fstype: type of filesystem located at the device (or what to create)
# dest: Mounting location for the destination system
# mountpoint: Mount point inside the destination system, e.g. '/boot'
# returns: 1 on failure
_mkfs() {
2011-02-04 14:34:11 +01:00
local _domk=${1}
local _device=${2}
local _fstype=${3}
local _dest=${4}
local _mountpoint=${5}
local _labelname=${6}
local _fsoptions=${7}
local _btrfsdevices="$(echo ${8} | sed -e 's|#| |g')"
local _btrfslevel=${9}
2011-02-10 17:25:27 +01:00
local _btrfssubvolume=${10}
2010-06-28 20:49:46 +02:00
local _dosubvolume=${11}
local _btrfscompress=${12}
local _btrfsssd=${13}
2010-06-20 19:00:41 +02:00
# correct empty entries
2011-02-04 14:34:11 +01:00
[[ "${_fsoptions}" = "NONE" ]] && _fsoptions=""
[[ "${_btrfsssd}" = "NONE" ]] && _btrfsssd=""
[[ "${_btrfscompress}" = "NONE" ]] && _btrfscompress=""
[[ "${_btrfssubvolume}" = "NONE" ]] && _btrfssubvolume=""
2010-06-20 19:00:41 +02:00
# add btrfs raid level, if needed
2011-02-04 14:34:11 +01:00
[[ ! "${_btrfslevel}" = "NONE" && "${_fstype}" = "btrfs" ]] && _fsoptions="${_fsoptions} -d ${_btrfslevel}"
2010-06-13 16:17:05 +02:00
# we have two main cases: "swap" and everything else.
2011-02-04 14:34:11 +01:00
if [[ "${_fstype}" = "swap" ]]; then
swapoff ${_device} >/dev/null 2>&1
if [[ "${_domk}" = "yes" ]]; then
mkswap -L ${_labelname} ${_device} >${LOG} 2>&1
2011-02-03 21:54:43 +01:00
if [[ $? != 0 ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Error creating swap: mkswap ${_device}" 0 0
2010-06-13 16:17:05 +02:00
return 1
fi
fi
2011-02-04 14:34:11 +01:00
swapon ${_device} >${LOG} 2>&1
2011-02-03 21:54:43 +01:00
if [[ $? != 0 ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Error activating swap: swapon ${_device}" 0 0
2010-06-13 16:17:05 +02:00
return 1
fi
else
# make sure the fstype is one we can handle
local knownfs=0
2010-08-02 16:41:54 +02:00
for fs in xfs jfs reiserfs ext2 ext3 ext4 btrfs nilfs2 ntfs-3g vfat; do
2011-02-04 14:34:11 +01:00
[[ "${_fstype}" = "${fs}" ]] && knownfs=1 && break
2010-06-13 16:17:05 +02:00
done
2011-02-04 14:34:11 +01:00
if [[ ${knownfs} -eq 0 ]]; then
DIALOG --msgbox "unknown fstype ${_fstype} for ${_device}" 0 0
2010-06-13 16:17:05 +02:00
return 1
fi
# if we were tasked to create the filesystem, do so
2011-02-04 14:34:11 +01:00
if [[ "${_domk}" = "yes" ]]; then
2010-06-13 16:17:05 +02:00
local ret
2011-02-04 14:34:11 +01:00
case ${_fstype} in
xfs) mkfs.xfs ${_fsoptions} -L ${_labelname} -f ${_device} >${LOG} 2>&1; ret=$? ;;
jfs) yes | mkfs.jfs ${_fsoptions} -L ${_labelname} ${_device} >${LOG} 2>&1; ret=$? ;;
reiserfs) yes | mkreiserfs ${_fsoptions} -l ${_labelname} ${_device} >${LOG} 2>&1; ret=$? ;;
ext2) mkfs.ext2 -L ${_fsoptions} ${_labelname} ${_device} >${LOG} 2>&1; ret=$? ;;
ext3) mke2fs ${_fsoptions} -L ${_labelname} -t ext3 ${_device} >${LOG} 2>&1; ret=$? ;;
ext4) mke2fs ${_fsoptions} -L ${_labelname} -t ext4 ${_device} >${LOG} 2>&1; ret=$? ;;
btrfs) mkfs.btrfs ${_fsoptions} -L ${_labelname} ${_btrfsdevices} >${LOG} 2>&1; ret=$? ;;
nilfs2) mkfs.nilfs2 ${_fsoptions} -L ${_labelname} ${_device} >${LOG} 2>&1; ret=$? ;;
ntfs-3g) mkfs.ntfs ${_fsoptions} -L ${_labelname} ${_device} >${LOG} 2>&1; ret=$? ;;
vfat) mkfs.vfat ${_fsoptions} -n ${_labelname} ${_device} >${LOG} 2>&1; ret=$? ;;
2010-06-13 16:17:05 +02:00
# don't handle anything else here, we will error later
esac
2011-02-04 14:34:11 +01:00
if [[ ${ret} != 0 ]]; then
DIALOG --msgbox "Error creating filesystem ${_fstype} on ${_device}" 0 0
2010-06-13 16:17:05 +02:00
return 1
fi
sleep 2
fi
2011-02-04 14:34:11 +01:00
if [[ "${_fstype}" = "btrfs" && -n "${_btrfssubvolume}" && "${_dosubvolume}" = "yes" ]]; then
2010-06-28 20:49:46 +02:00
create_btrfs_subvolume
fi
btrfs_scan
2010-06-29 07:39:07 +02:00
sleep 2
2010-06-13 16:17:05 +02:00
# create our mount directory
2011-02-04 14:34:11 +01:00
mkdir -p ${_dest}${_mountpoint}
2010-06-25 22:21:17 +02:00
# prepare btrfs mount options
_btrfsmountoptions=""
2011-02-04 14:34:11 +01:00
[[ -n "${_btrfssubvolume}" ]] && _btrfsmountoptions="subvol=${_btrfssubvolume}"
[[ -n "${_btrfscompress}" ]] && _btrfsmountoptions="${_btrfsmountoptions} ${_btrfscompress}"
[[ -n "${_btrfsssd}" ]] && _btrfsmountoptions="${_btrfsmountoptions} ${_btrfsssd}"
_btrfsmountoptions="$(echo ${_btrfsmountoptions} | sed -e 's#^ ##g' | sed -e 's# #,#g')"
2010-06-13 16:17:05 +02:00
# mount the bad boy
2011-02-04 14:34:11 +01:00
if [[ "${_fstype}" = "btrfs" && -n "${_btrfsmountoptions}" ]]; then
mount -t ${_fstype} -o ${_btrfsmountoptions} ${_device} ${_dest}${_mountpoint} >${LOG} 2>&1
2010-06-21 22:30:50 +02:00
else
2011-02-04 14:34:11 +01:00
mount -t ${_fstype} ${_device} ${_dest}${_mountpoint} >${LOG} 2>&1
2010-06-21 22:30:50 +02:00
fi
2011-02-03 21:54:43 +01:00
if [[ $? != 0 ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Error mounting ${_dest}${_mountpoint}" 0 0
2010-06-13 16:17:05 +02:00
return 1
fi
# change permission of base directories to correct permission
# to avoid btrfs issues
2011-02-04 14:34:11 +01:00
if [[ "${_mountpoint}" = "/tmp" ]]; then
chmod 1777 ${_dest}${_mountpoint}
elif [[ "${_mountpoint}" = "/root" ]]; then
chmod 750 ${_dest}${_mountpoint}
else
2011-02-04 14:34:11 +01:00
chmod 755 ${_dest}${_mountpoint}
fi
2010-06-13 16:17:05 +02:00
fi
2011-02-08 09:45:49 +01:00
# add to .device-names for config files
2012-04-20 15:40:38 +02:00
local _fsuuid="$(getfsuuid ${_device})"
local _fslabel="$(getfslabel ${_device})"
echo "# DEVICE DETAILS: ${_device} UUID=${_fsuuid} LABEL=${_fslabel}" >> /tmp/.device-names
2010-06-13 16:17:05 +02:00
# add to temp fstab
if [[ "${NAME_SCHEME_PARAMETER}" == "FSUUID" ]]; then
if [[ -n "${_fsuuid}" ]]; then
_device="UUID=${_fsuuid}"
2010-06-13 16:17:05 +02:00
fi
elif [[ "${NAME_SCHEME_PARAMETER}" == "FSLABEL" ]]; then
if [[ -n "${_fslabel}" ]]; then
_device="LABEL=${_fslabel}"
2010-06-13 16:17:05 +02:00
fi
fi
2011-02-04 14:34:11 +01:00
if [[ "${_fstype}" = "btrfs" && -n "${_btrfsmountoptions}" ]]; then
echo -n "${_device} ${_mountpoint} ${_fstype} defaults,${_btrfsmountoptions} 0 " >>/tmp/.fstab
2010-06-25 22:21:17 +02:00
else
2011-02-04 14:34:11 +01:00
echo -n "${_device} ${_mountpoint} ${_fstype} defaults 0 " >>/tmp/.fstab
2010-06-25 22:21:17 +02:00
fi
2011-02-04 14:34:11 +01:00
if [[ "${_fstype}" = "swap" ]]; then
2010-06-13 16:17:05 +02:00
echo "0" >>/tmp/.fstab
else
echo "1" >>/tmp/.fstab
fi
}
2010-03-06 10:13:54 +01:00
# source_set()
# check if installation source is set, if not run select_source!
source_set(){
2011-02-04 14:34:11 +01:00
while ! [[ "${S_SRC}" = "1" ]]; do
if ! [[ "${S_SRC}" = "1" ]]; then
2010-08-11 12:17:29 +02:00
DIALOG --msgbox "Error:\nYou have to select Source first." 0 0
select_source || break
2010-08-11 12:17:29 +02:00
fi
done
2011-02-04 14:34:11 +01:00
if [[ "${S_SRC}" = "0" ]]; then
return 1
fi
2010-03-06 10:13:54 +01:00
}
2008-10-20 22:39:25 +02:00
getsource() {
S_SRC=0
2011-02-04 14:34:11 +01:00
if [[ "${MODE}" = "media" ]]; then
get_media
#last fallback, if autodetection fails!
2010-08-11 12:17:29 +02:00
manual_media || return 1
fi
2011-02-04 14:34:11 +01:00
if [[ "${MODE}" = "ftp" ]]; then
#in order to cache packages from media check on it first!
get_media
2010-08-11 12:17:29 +02:00
select_mirror || return 1
NEXTITEM="2"
fi
S_SRC=1
2008-10-20 22:39:25 +02:00
}
# select_mirror()
2011-02-04 14:34:11 +01:00
# Prompt user for preferred mirror and set ${SYNC_URL}
2008-10-20 22:39:25 +02:00
#
# args: none
# returns: nothing
select_mirror() {
DIALOG --msgbox "Keep in mind ftp.archlinux.org is throttled.\nPlease select another mirror to get full download speed." 8 65
# FIXME: this regex doesn't honor commenting
2011-02-04 14:34:11 +01:00
MIRRORS=$(egrep -o '((ftp)|(http))://[^/]*' "${MIRRORLIST}" | sed 's|$| _|g')
DIALOG --menu "Select an FTP/HTTP mirror" 14 55 7 \
2011-02-04 14:34:11 +01:00
${MIRRORS} \
"Custom" "_" 2>${ANSWER} || return 1
local _server=$(cat ${ANSWER})
if [[ "${_server}" = "Custom" ]]; then
DIALOG --inputbox "Enter the full URL to core repo." 8 65 \
2011-02-04 14:34:11 +01:00
"ftp://ftp.archlinux.org/core/os/$(uname -m)" 2>${ANSWER} || return 1
SYNC_URL=$(cat ${ANSWER})
else
# Form the full URL for our mirror by grepping for the server name in
# our mirrorlist and pulling the full URL out. Substitute 'core' in
# for the repository name, and ensure that if it was listed twice we
# only return one line for the mirror.
2011-02-04 14:34:11 +01:00
SYNC_URL=$(egrep -o "${_server}.*" "${MIRRORLIST}" | head -n1)
fi
2011-02-04 14:34:11 +01:00
echo "Using mirror: ${SYNC_URL}" >${LOG}
2008-10-20 22:39:25 +02:00
}
# pacman_conf()
# creates temporary pacman.conf file
pacman_conf() {
2011-02-04 14:34:11 +01:00
if [[ "${MODE}" = "media" ]]; then
local serverurl="${FILE_URL}"
elif [[ "${MODE}" = "ftp" ]]; then
local serverurl="${SYNC_URL}"
fi
# Setup a pacman.conf in /tmp
cat << EOF > /tmp/pacman.conf
2008-10-20 22:39:25 +02:00
[options]
Architecture = auto
2012-06-04 15:37:13 +02:00
SigLevel = PackageRequired
2011-02-04 14:34:11 +01:00
CacheDir = ${DESTDIR}/var/cache/pacman/pkg
CacheDir = /packages/core-$(uname -m)/pkg
CacheDir = /packages/core-any/pkg
2008-10-20 22:39:25 +02:00
[core]
2011-02-04 14:34:11 +01:00
Server = ${serverurl}
2008-10-20 22:39:25 +02:00
2010-04-16 17:22:07 +02:00
[extra]
2011-02-04 14:34:11 +01:00
Server = ${serverurl}
2010-04-16 17:22:07 +02:00
EOF
2008-10-20 22:39:25 +02:00
}
2012-06-04 15:37:13 +02:00
# pacman needs a masterkey before checking signed packages
prepare_pacman_keychain() {
# Generate initial keychain, use haveged then no user interaction is required
if [[ -f /var/run/haveged.pid ]]; then
kill $(cat /var/run/haveged.pid)
2012-06-04 15:37:13 +02:00
fi
haveged
pacman-key --init >/dev/null 2>&1
### HACK: fix accept of master keys!
sed -i -e 's#"${GPG_PACMAN\[\@\]}" --quiet --lsign-key "${key_id}"#"${GPG_PACMAN\[\@\]}" --batch --yes --quiet --lsign-key "${key_id}"#g' \
/usr/bin/pacman-key
pacman-key --populate archlinux >/dev/null 2>&1
sed -i -e 's#"${GPG_PACMAN\[\@\]}" --batch --yes --quiet --lsign-key "${key_id}"#"${GPG_PACMAN\[\@\]}" --quiet --lsign-key "${key_id}"#g' \
/usr/bin/pacman-key
kill $(cat /var/run/haveged.pid)
2012-06-04 15:37:13 +02:00
}
2010-02-22 07:40:53 +01:00
# configures pacman and syncs db on destination system
# params: none
# returns: 1 on error
prepare_pacman() {
# Set up the necessary directories for pacman use
2011-02-04 14:34:11 +01:00
[[ ! -d "${DESTDIR}/var/cache/pacman/pkg" ]] && mkdir -m 755 -p "${DESTDIR}/var/cache/pacman/pkg"
[[ ! -d "${DESTDIR}/var/lib/pacman" ]] && mkdir -m 755 -p "${DESTDIR}/var/lib/pacman"
2012-06-04 15:37:13 +02:00
prepare_pacman_keychain
DIALOG --infobox "Refreshing package database..." 6 45
2011-02-04 14:34:11 +01:00
${PACMAN} -Sy >${LOG} 2>&1 || return 1
2011-02-03 21:54:43 +01:00
if [[ $? -ne 0 ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Pacman preparation failed! Check ${LOG} for errors." 6 60
2010-03-06 10:13:54 +01:00
return 1
fi
return 0
}
# Set PACKAGES parameter before running to install wanted packages
run_pacman(){
# create chroot environment on target system
# code straight from mkarchroot
chroot_mount
# execute pacman in a subshell so we can follow its progress
# pacman output goes /tmp/pacman.log
# /tmp/setup-pacman-running acts as a lockfile
( \
echo "Installing Packages..." >/tmp/pacman.log ; \
echo >>/tmp/pacman.log ; \
touch /tmp/setup-pacman-running ; \
2011-02-04 14:34:11 +01:00
${PACMAN} -S ${PACKAGES} 2>&1 >> /tmp/pacman.log ; \
echo $? > /tmp/.pacman-retcode ; \
2011-02-03 21:54:43 +01:00
if [[ $(cat /tmp/.pacman-retcode) -ne 0 ]]; then
echo -e "\nPackage Installation FAILED." >>/tmp/pacman.log
else
echo -e "\nPackage Installation Complete." >>/tmp/pacman.log
fi
rm /tmp/setup-pacman-running
) &
# display pacman output while it's running
sleep 2
2011-02-04 14:34:11 +01:00
dialog --backtitle "${TITLE}" --title " Installing... Please Wait " \
--no-kill --tailboxbg "/tmp/pacman.log" 18 70 2>${ANSWER}
2011-02-03 21:54:43 +01:00
while [[ -f /tmp/setup-pacman-running ]]; do
/bin/true
done
2011-02-04 14:34:11 +01:00
kill $(cat ${ANSWER})
# pacman finished, display scrollable output
local _result=''
2011-02-03 21:54:43 +01:00
if [[ $(cat /tmp/.pacman-retcode) -ne 0 ]]; then
_result="Installation Failed (see errors below)"
else
_result="Installation Complete"
fi
rm /tmp/.pacman-retcode
2011-02-04 14:34:11 +01:00
DIALOG --title "${_result}" --exit-label "Continue" \
--textbox "/tmp/pacman.log" 18 70 || return 1
# ensure the disk is synced
sync
2010-02-21 22:42:23 +01:00
chroot_umount
}
# select_packages()
# prompts the user to select packages to install
#
# params: none
# returns: 1 on error
select_packages() {
source_set || return 1
pacman_conf
prepare_pacman
# Archboot setup media Mode uses packages.txt!
2011-02-04 14:34:11 +01:00
if [[ "${MODE}" = "media" ]]; then
DIALOG --msgbox "Package selection is split into two stages. First you will select package categories that contain packages you may be interested in. Then you will be presented with a full list of packages in your selected categories, allowing you to fine-tune your selection.\n\nNOTE: It is recommended that you install the BASE category from this setup, SUPPORT contains additional useful packages for networking and filesystems, DEVEL contains software building tools." 18 70
PKGS="/packages/core-$(uname -m)/pkg/packages.txt"
2011-02-03 21:54:43 +01:00
if ! [[ -s /tmp/.pkgcategory ]]; then
CHKLIST="base ^ ON"
2011-06-16 09:31:56 +02:00
for category in $(cat ${PKGS} | sed 's|/.*$||g' | uniq | grep -v base ); do
2011-02-04 14:34:11 +01:00
CHKLIST="${CHKLIST} ${category} - OFF"
done
else
CHKLIST=
for i in $(cat /tmp/.pkgcategory | sed 's|\"||g'); do
2011-02-04 14:34:11 +01:00
CHKLIST="${CHKLIST} ${i} ^ ON"
done
2011-06-16 09:31:56 +02:00
for category in $(cat ${PKGS} | sed 's|/.*$||g' | uniq ); do
2011-02-04 14:34:11 +01:00
grep ${category} /tmp/.pkgcategory >/dev/null 2>&1 || CHKLIST="${CHKLIST} ${category} - OFF"
done
fi
2011-02-04 14:34:11 +01:00
DIALOG --checklist "Select Package Categories" 19 55 12 ${CHKLIST} 2>/tmp/.pkgcategory || return 1
SELECTALL="no"
DIALOG --yesno "Select all packages by default?" 0 0 && SELECTALL="yes"
CHKLIST=()
for category in $(cat /tmp/.pkgcategory | sed 's|"||g'); do
tag="OFF"
2011-02-04 14:34:11 +01:00
if [[ "${SELECTALL}" = "yes" ]]; then
tag="ON"
fi
for i in $(grep "${category}/" ${PKGS} | sed -e 's|^[a-z0-9-]*/||g' -e "s|.pkg.tar.*$||g" -e 's/-i686//g' -e 's/-x86_64//g' -e 's/-any//g'); do
pkgname=${i%-*-*}
pkgdesc $pkgname
CHKLIST+=("${pkgname}" "(${category})" ${tag} "${PKGDESC}")
done
tag="OFF"
done
_package_checklist "Select Packages to install. Use SPACE to select." 1 "${CHKLIST[@]}" || return 1
PACKAGES="${ANSWER_CHECKLIST[@]}"
2011-06-16 09:31:56 +02:00
# ftp install routine
else
# if selection has been done before, warn about loss of input
# and let the user exit gracefully
2011-02-04 14:34:11 +01:00
if [[ ${S_SELECT} -ne 0 ]]; then
DIALOG --yesno "WARNING: Running this stage again will result in the loss of previous package selections.\n\nDo you wish to continue?" 10 50 || return 1
fi
DIALOG --msgbox "Package selection is split into two stages. First you will select package categories that contain packages you may be interested in. Then you will be presented with a full list of packages for each category, allowing you to fine-tune.\n\n" 10 70
2011-06-16 09:31:56 +02:00
DO_EXTRA=""
DIALOG --yesno "Would you like to activate the [extra] repository for package installation to get the complete package list?" 0 0 && DO_EXTRA="yes"
local _catlist="base ^ ON"
2012-01-09 13:54:09 +01:00
if [[ "${DO_EXTRA}" = "yes" ]]; then
2011-06-16 09:31:56 +02:00
# show group listing for group selection
# only show xorg and DEs
for i in $(${PACMAN} -Sg | sed "s/^base$/ /g" | grep -v -e "^kde[a-z]" -e "^kde-meta" -e "^bmp"\
-e "^gimp" -e "^fprint" -e "-l10n" -e "^ladspa"\
-e "qtcurve" -e "^telepathy" -e "^texlive" -e "^gstreamer"\
-e "i18n" -e "^koffice" -e "^vim" -e "^libreoffice"\
-e "^pulseaudio" -e "^calligra" -e "^kde-telepathy" -e "^haskell" | sort); do
2011-06-16 09:31:56 +02:00
_catlist="${_catlist} ${i} - OFF"
done
local _pkgtmp="$(${PACMAN} -Sl core extra | awk '{print $2}')"
else
# show group listing for group selection
# only show xorg and DEs
for i in $(${PACMAN} -Sg | sed "s/^base$/ /g" | grep ^base | sort); do
_catlist="${_catlist} ${i} - OFF"
done
local _pkgtmp="$(${PACMAN} -Sl core | awk '{print $2}')"
fi
2011-02-04 14:34:11 +01:00
DIALOG --checklist "Select Package Categories\nDO NOT deselect BASE unless you know what you're doing!" 20 60 12 ${_catlist} 2>${ANSWER} || return 1
_catlist="$(cat ${ANSWER})"
# assemble a list of packages with groups, marking pre-selected ones
# <package> <group> <selected>
local _pkglist=()
2011-06-16 09:31:56 +02:00
: >/tmp/package-process.log
# display pkglist output while it's running
dialog --backtitle "${TITLE}" --title "Generating list with packages, this might take some time ..." \
--no-kill --tailboxbg "/tmp/package-process.log" 18 70 2>${ANSWER}
# packages in groups
while read pkgname pkgcat; do
pkgdesc $pkgname
echo "Processing "${pkgname}" ..." 2>&1 >> /tmp/package-process.log
# check if this package is in a selected group
# slightly ugly but sorting later requires newlines in the variable
2011-02-04 14:34:11 +01:00
if [[ "${_catlist/"\"${pkgcat}\""/XXXX}" != "${_catlist}" ]]; then
_pkglist+=("${pkgname}" "(${pkgcat})" ON "${PKGDESC}")
else
_pkglist+=("${pkgname}" "(${pkgcat})" OFF "${PKGDESC}")
fi
2011-06-16 09:31:56 +02:00
done < <(${PACMAN} -Si ${_pkgtmp} | \
awk '/^Name/{ printf("%s ",$3) } /^Group/{ print $3 }' | grep -v 'None' | sort -f -k 2)
# packages without groups
while read pkgname pkgcat; do
pkgdesc $pkgname
echo "Processing "${pkgname} ..." " 2>&1 >> /tmp/package-process.log
# check if this package is in a selected group
# slightly ugly but sorting later requires newlines in the variable
2011-02-04 14:34:11 +01:00
if [[ "${_catlist/"\"${pkgcat}\""/XXXX}" != "${_catlist}" ]]; then
_pkglist+=("${pkgname}" "(${pkgcat})" ON "${PKGDESC}")
else
_pkglist+=("${pkgname}" "(${pkgcat})" OFF "${PKGDESC}")
fi
2011-06-16 09:31:56 +02:00
done < <(${PACMAN} -Si ${_pkgtmp} | \
awk '/^Name/{ printf("%s ",$3) } /^Group/{ print $3 }' | grep 'None' | sort -f -k 2)
kill $(cat ${ANSWER})
_package_checklist "Select Packages to install. Use SPACE to select." 1 "${_pkglist[@]}" || return 1
PACKAGES="${ANSWER_CHECKLIST[@]}"
fi
# Add packages which are not in core repository
2011-02-03 21:54:43 +01:00
if [[ "$(grep -w uvesafb /proc/cmdline)" ]]; then
2011-02-04 14:34:11 +01:00
! [[ "$(echo ${PACKAGES} | grep -w v86d)" ]] && PACKAGES="${PACKAGES} v86d"
fi
if [[ -e /var/state/dhcp/dhclient.leases ]]; then
! [[ "$(echo ${PACKAGES} | grep -w dhclient)" ]] && PACKAGES="${PACKAGES} dhclient"
fi
# Add filesystem packages
if [[ "$(${_BLKID} -o value -s TYPE | grep ntfs)" ]]; then
2011-02-04 14:34:11 +01:00
! [[ "$(echo ${PACKAGES} | grep -w ntfs-3g)" ]] && PACKAGES="${PACKAGES} ntfs-3g"
fi
if [[ "$(${_BLKID} -o value -s TYPE | grep btrfs)" ]]; then
2012-01-20 18:24:16 +01:00
! [[ "$(echo ${PACKAGES} | grep -w btrfs-progs)" ]] && PACKAGES="${PACKAGES} btrfs-progs"
2010-06-06 17:22:25 +02:00
fi
if [[ "$(${_BLKID} -o value -s TYPE | grep nilfs2)" ]]; then
2011-02-04 14:34:11 +01:00
! [[ "$(echo ${PACKAGES} | grep -w nilfs-utils)" ]] && PACKAGES="${PACKAGES} nilfs-utils"
2010-08-02 21:34:30 +02:00
fi
if [[ "$(${_BLKID} -o value -s TYPE | grep ext)" ]]; then
! [[ "$(echo ${PACKAGES} | grep -w e2fsprogs)" ]] && PACKAGES="${PACKAGES} e2fsprogs"
fi
if [[ "$(${_BLKID} -o value -s TYPE | grep reiserfs)" ]]; then
! [[ "$(echo ${PACKAGES} | grep -w reiserfsprogs)" ]] && PACKAGES="${PACKAGES} reiserfsprogs"
fi
if [[ "$(${_BLKID} -o value -s TYPE | grep xfs)" ]]; then
! [[ "$(echo ${PACKAGES} | grep -w xfsprogs)" ]] && PACKAGES="${PACKAGES} xfsprogs"
fi
if [[ "$(${_BLKID} -o value -s TYPE | grep jfs)" ]]; then
! [[ "$(echo ${PACKAGES} | grep -w jfsutils)" ]] && PACKAGES="${PACKAGES} jfsutils"
fi
if [[ "$(${_BLKID} -o value -s TYPE | grep vfat)" ]]; then
! [[ "$(echo ${PACKAGES} | grep -w dosfstools)" ]] && PACKAGES="${PACKAGES} dosfstools"
fi
if ! [[ "$(dmraid_devices)" = "" ]]; then
! [[ "$(echo ${PACKAGES} | grep -w dmraid)" ]] && PACKAGES="${PACKAGES} dmraid"
fi
# Only install the booted kernel image!
### TODO: This misses packages which pull in the kernel itself, like binary modules selected for the kernel!
PACKAGES="$(echo ${PACKAGES} | sed -e "s#\ linux\ # #g" -e "s#\ linux-lts\ # #g")"
2011-02-04 14:34:11 +01:00
PACKAGES="${KERNELPKG} ${PACKAGES}"
2012-06-01 16:42:14 +02:00
# remove not needed initscripts and sysvinit package with systemd and add compat package
2012-06-01 18:51:20 +02:00
if [[ "${SYSTEMD}" = "1" ]]; then
2012-06-02 15:07:19 +02:00
PACKAGES="$(echo ${PACKAGES} | sed -e "s#\ initscripts\ # #g" -e "s#\ sysvinit\ # #g" -e "s#\ systemd\ # #g")"
PACKAGES="${PACKAGES} systemd systemd-sysvcompat"
2012-06-04 15:37:13 +02:00
else
PACKAGES="$(echo ${PACKAGES} | sed -e "s#\ systemd-sysvcompat\ # #g")"
2012-06-01 16:42:14 +02:00
fi
NEXTITEM="5"
S_SELECT=1
2008-10-20 22:39:25 +02:00
}
2010-02-22 07:40:53 +01:00
# install_packages()
# performs package installation to the target system
#
2010-02-22 07:40:53 +01:00
install_packages() {
source_set || return 1
2010-03-16 07:32:39 +01:00
destdir_mounts || return 1
2011-02-04 14:34:11 +01:00
if [[ "${MODE}" = "media" ]]; then
2011-06-19 21:23:56 +02:00
if [[ "${PACKAGES}" = "" || "${S_SELECT}" != "1" ]]; then
DIALOG --msgbox "Error:\nYou have to select packages first." 0 0
select_packages || return 1
fi
else
2011-02-04 14:34:11 +01:00
if [[ "${S_SELECT}" != "1" ]]; then
DIALOG --msgbox "Error:\nYou have to select packages first." 0 0
select_packages || return 1
fi
fi
2011-02-04 14:34:11 +01:00
if [[ "${S_MKFS}" != "1" && "${S_MKFSAUTO}" != "1" ]]; then
getdest
fi
DIALOG --msgbox "Package installation will begin now. You can watch the output in the progress window. Please be patient." 0 0
run_pacman
S_INSTALL=1
NEXTITEM="6"
2010-02-21 22:42:23 +01:00
chroot_mount
# automagic time!
# any automatic configuration should go here
DIALOG --infobox "Writing base configuration..." 6 40
auto_addons
auto_fstab
auto_mdadm
2009-04-19 17:19:37 +02:00
auto_luks
# tear down the chroot environment
chroot_umount
}
# add archboot addons if activated
2009-02-11 12:03:41 +01:00
auto_addons()
{
2011-02-03 21:54:43 +01:00
if [[ -d /tmp/packages ]]; then
DO_ADDON=""
DIALOG --yesno "Would you like to install your addons packages to installed system?" 0 0 && DO_ADDON="yes"
2012-01-09 13:54:09 +01:00
if [[ "${DO_ADDON}" = "yes" ]]; then
DIALOG --infobox "Installing the addons packages..." 0 0
2011-02-04 14:34:11 +01:00
${PACMAN} -U /tmp/packages/* 2>&1 >> /tmp/pacman.log
fi
fi
}
# auto_fstab()
# preprocess fstab file
# comments out old fields and inserts new ones
# according to partitioning/formatting stage
#
auto_fstab(){
# Modify fstab
2011-02-04 14:34:11 +01:00
if [[ "${S_MKFS}" = "1" || "${S_MKFSAUTO}" = "1" ]]; then
2011-02-03 21:54:43 +01:00
if [[ -f /tmp/.device-names ]]; then
2011-02-04 14:34:11 +01:00
sort /tmp/.device-names >>${DESTDIR}/etc/fstab
fi
2011-02-03 21:54:43 +01:00
if [[ -f /tmp/.fstab ]]; then
# clean fstab first from /dev entries
2011-02-04 14:34:11 +01:00
sed -i -e '/^\/dev/d' ${DESTDIR}/etc/fstab
sort /tmp/.fstab >>${DESTDIR}/etc/fstab
fi
fi
2008-10-20 22:39:25 +02:00
}
# auto_mdadm()
# add mdadm setup to existing /etc/mdadm.conf
auto_mdadm()
{
2011-02-04 14:34:11 +01:00
if [[ -e ${DESTDIR}/etc/mdadm.conf ]];then
2011-02-03 21:54:43 +01:00
if [[ "$(cat /proc/mdstat | grep ^md)" ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --infobox "Adding raid setup to ${DESTDIR}/etc/mdadm.conf ..." 4 40
mdadm -Ds >> ${DESTDIR}/etc/mdadm.conf
fi
fi
}
# auto_network()
# configures network on host system according to installer
# settings if user wishes to do so
#
auto_network()
{
# exit if network wasn't configured in installer
2011-02-04 14:34:11 +01:00
if [[ ${S_NET} -eq 0 ]]; then
return 1
fi
DIALOG --yesno "Do you want to use the previous network settings in rc.conf and resolv.conf?\nIf you used Proxy settings, they will be written to /etc/profile.d/proxy.sh" 0 0 || return 1
sed -i -e "s#^interface=.*#interface=${INTERFACE}#g" ${DESTDIR}/etc/rc.conf
2011-02-04 14:34:11 +01:00
if [[ "${S_DHCP}" != "1" ]]; then
sed -i -e "s#^address=.*#address=${IPADDR}#g" ${DESTDIR}/etc/rc.conf
sed -i -e "s#^netmask=.*#netmask=${SUBNET}#g" ${DESTDIR}/etc/rc.conf
sed -i -e "s#^broadcast=.*#broadcast=${BROADCAST}#g" ${DESTDIR}/etc/rc.conf
sed -i -e "s#^gateway=.*#gateway=${GW}#g" ${DESTDIR}/etc/rc.conf
2011-02-04 14:34:11 +01:00
echo "nameserver ${DNS}" >> ${DESTDIR}/etc/resolv.conf
2009-02-11 12:03:41 +01:00
else
sed -i -e "s#^address=.*#address=#g" ${DESTDIR}/etc/rc.conf
sed -i -e "s#^netmask=.*#netmask=#g" ${DESTDIR}/etc/rc.conf
sed -i -e "s#^broadcast=.*#broadcast=#g" ${DESTDIR}/etc/rc.conf
sed -i -e "s#^gateway=.*#gateway=#g" ${DESTDIR}/etc/rc.conf
fi
2011-02-04 14:34:11 +01:00
if [[ "${PROXY_HTTP}" != "" ]]; then
echo "export http_proxy=${PROXY_HTTP}" >> ${DESTDIR}/etc/profile.d/proxy.sh;
chmod a+x ${DESTDIR}/etc/profile.d/proxy.sh
fi
2011-02-04 14:34:11 +01:00
if [[ "${PROXY_FTP}" != "" ]]; then
echo "export ftp_proxy=${PROXY_FTP}" >> ${DESTDIR}/etc/profile.d/proxy.sh;
chmod a+x ${DESTDIR}/etc/profile.d/proxy.sh
fi
}
# donetwork()
# Hand-hold through setting up networking
#
# args: none
# returns: 1 on failure
2008-10-20 22:39:25 +02:00
donetwork() {
INTERFACE=
S_DHCP=
ifaces=$(net_interfaces)
2011-02-04 14:34:11 +01:00
if [[ "${ifaces}" = "" ]]; then
DIALOG --yesno "Cannot find any ethernet interfaces. You probably haven't loaded\nyour network module yet. You have two options:\n\n 1) Probe for not detectable module now. (very old hardware)\n 2) Switch to another VC (ALT-F2) and load your module\n with the modprobe command, then switch back here (ALT-F1)\n and continue.\n\nIf you know which module you need, you should do Step 2 and\nselect NO below. If you don't know which module you need,\nchoose Step 1 by selecting YES below.\n\nProbe for network module?" 18 70
2011-02-03 21:54:43 +01:00
if [[ $? -eq 0 ]]; then
net_notdetectable
fi
ifaces=$(net_interfaces)
2011-02-04 14:34:11 +01:00
if [[ "${ifaces}" = "" ]]; then
DIALOG --msgbox "No network interfaces available." 0 0
return 1
fi
fi
2011-02-04 14:34:11 +01:00
while [[ "${INTERFACE}" = "" ]]; do
DIALOG --msgbox "Available Ethernet Interfaces:\n$(net_interfaces)\n\nIf your ethernet interface is not listed,\n1) Probe for the correct module now.\n2) Switch to another VC (ALT-F2) and load your module with\n the modprobe command, then switch back here (ALT-F1)\n" 0 0
ifaces=$(net_interfaces)
2011-02-04 14:34:11 +01:00
DIALOG --extra-button --extra-label "Probe" --ok-label "Select" --menu "Select a network interface" 14 55 7 ${ifaces} 2>${ANSWER}
case $? in
1) return 1 ;;
2011-02-04 14:34:11 +01:00
0) INTERFACE=$(cat ${ANSWER}) ;;
*) net_notdetectable ;;
esac
done
# bring down everything, which could grab and affect the interface!
if [[ -f /var/run/dhcpcd-${INTERFACE}.pid ]]; then
dhcpcd -k ${INTERFACE} >${LOG} 2>&1
sleep 1
fi
if [[ -f /var/run/dhclient.pid ]]; then
dhclient -x
[[ -f /var/run/dhclient.pid ]] && rm /var/run/dhclient.pid
sleep 1
fi
ip route del default >${LOG} 2>&1
ip addr flush dev ${INTERFACE} >${LOG} 2>&1
2011-06-10 17:00:51 +02:00
ip link set dev ${INTERFACE} down >${LOG} 2>&1
2011-02-04 14:34:11 +01:00
[[ -e /etc/resolv.conf ]] && rm /etc/resolv.conf >${LOG} 2>&1
DIALOG --yesno "Do you want to use DHCP?" 0 0
2011-02-03 21:54:43 +01:00
if [[ $? -eq 0 ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --infobox "Please wait. Polling for DHCP server on ${INTERFACE}..." 10 65
dhcpcd ${INTERFACE} >${LOG} 2>&1
2011-02-03 21:54:43 +01:00
if [[ $? -ne 0 ]]; then
DIALOG --infobox "Failed to run dhcpcd. See ${LOG} for details. dhclient as fallback will be called in 5 seconds." 0 0
sleep 5
DIALOG --infobox "Please wait. Polling for DHCP server on ${INTERFACE} with dhclient..." 0 0
dhclient ${INTERFACE} >${LOG} 2>&1
fi
if [[ ! $(ip addr show ${INTERFACE} | grep 'inet') ]]; then
DIALOG --msgbox "DHCP request failed." 0 0 || return 1
fi
S_DHCP=1
else
NETPARAMETERS=""
2011-02-04 14:34:11 +01:00
while [[ "${NETPARAMETERS}" = "" ]]; do
DIALOG --inputbox "Enter your IP address" 8 65 "192.168.0.2" 2>${ANSWER} || return 1
IPADDR=$(cat ${ANSWER})
DIALOG --inputbox "Enter your netmask" 8 65 "255.255.255.0" 2>${ANSWER} || return 1
SUBNET=$(cat ${ANSWER})
DIALOG --inputbox "Enter your broadcast" 8 65 "192.168.0.255" 2>${ANSWER} || return 1
BROADCAST=$(cat ${ANSWER})
DIALOG --inputbox "Enter your gateway (optional)" 8 65 "192.168.0.1" 2>${ANSWER} || return 1
GW=$(cat ${ANSWER})
DIALOG --inputbox "Enter your DNS server IP" 8 65 "192.168.0.1" 2>${ANSWER} || return 1
DNS=$(cat ${ANSWER})
DIALOG --inputbox "Enter your HTTP proxy server, for example:\nhttp://name:port\nhttp://ip:port\nhttp://username:password@ip:port\n\n Leave the field empty if no proxy is needed to install." 16 65 "" 2>${ANSWER} || return 1
PROXY_HTTP=$(cat ${ANSWER})
DIALOG --inputbox "Enter your FTP proxy server, for example:\nhttp://name:port\nhttp://ip:port\nhttp://username:password@ip:port\n\n Leave the field empty if no proxy is needed to install." 16 65 "" 2>${ANSWER} || return 1
PROXY_FTP=$(cat ${ANSWER})
DIALOG --yesno "Are these settings correct?\n\nIP address: ${IPADDR}\nNetmask: ${SUBNET}\nGateway (optional): ${GW}\nDNS server: ${DNS}\nHTTP proxy server: ${PROXY_HTTP}\nFTP proxy server: ${PROXY_FTP}" 0 0
case $? in
1) ;;
0) NETPARAMETERS="1" ;;
esac
done
ip link set dev ${INTERFACE} up
echo "running: ip addr add ${IPADDR}/${SUBNET} broadcast ${BROADCAST:-+} dev ${INTERFACE}" >${LOG}
ip addr add ${IPADDR}/${SUBNET} broadcast ${BROADCAST:-+} dev ${INTERFACE} >${LOG} 2>&1 || DIALOG --msgbox "Failed to setup ${INTERFACE} interface." 0 0 || return 1
2011-02-04 14:34:11 +01:00
if [[ "${GW}" != "" ]]; then
ip route add default via ${GW} >${LOG} 2>&1 || DIALOG --msgbox "Failed to setup your gateway." 0 0 || return 1
fi
2011-02-04 14:34:11 +01:00
if [[ "${PROXY_HTTP}" = "" ]]; then
unset http_proxy
else
2011-02-04 14:34:11 +01:00
export http_proxy=${PROXY_HTTP}
fi
2011-02-04 14:34:11 +01:00
if [[ "${PROXY_FTP}" = "" ]]; then
unset ftp_proxy
else
2011-02-04 14:34:11 +01:00
export ftp_proxy=${PROXY_FTP}
fi
2011-02-04 14:34:11 +01:00
echo "nameserver ${DNS}" >/etc/resolv.conf
fi
### Missing Proxy Configuration
DIALOG --msgbox "The network is configured." 8 30
NEXTITEM="1"
S_NET=1
2008-10-20 22:39:25 +02:00
}
net_notdetectable() {
# modules with no modalias exported! status kernel 2.6.18
NOTDETECTABLE="hp ne de4x5 wd cs89x0 eepro smc9194 seeq8005 ni52 ni65 ac3200 smc-ultra at1700 hp-plus depca eexpress 82596 de600 eth16i de620 lance ewrk3 e2100 lp486e 3c501 3c503 3c505 3c507 3c509 3c515 myri10ge"
2011-02-04 14:34:11 +01:00
for mod in ${NOTDETECTABLE}; do
modprobe ${mod} >/dev/null 2>&1
done
2008-10-20 22:39:25 +02:00
}
getrootfstype() {
ROOTFS="$(getfstype ${PART_ROOT})"
2008-12-29 20:19:31 +01:00
}
getrootflags() {
# remove rw for all filesystems and gcpid for nilfs2
ROOTFLAGS=""
ROOTFLAGS="$(findmnt -m -n -o options -T ${DESTDIR} | sed -e 's/^rw//g' -e 's/,gcpid=.*[0-9]//g')"
[[ -n "${ROOTFLAGS}" ]] && ROOTFLAGS="rootflags=${ROOTFLAGS}"
}
2009-01-31 22:31:37 +01:00
getraidarrays() {
2009-04-19 17:19:37 +02:00
RAIDARRAYS=""
2011-02-04 14:34:11 +01:00
if ! [[ "$(grep ^ARRAY ${DESTDIR}/etc/mdadm.conf)" ]]; then
RAIDARRAYS="$(echo -n $(cat /proc/mdstat 2>/dev/null | grep ^md | sed -e 's#\[[0-9]\]##g' -e 's# :.* raid[0-9]##g' -e 's#md#md=#g' -e 's# #,/dev/#g' -e 's#_##g'))"
fi
2009-01-31 22:31:37 +01:00
}
2009-04-19 17:19:37 +02:00
getcryptsetup() {
CRYPTSETUP=""
2011-02-04 14:34:11 +01:00
if ! [[ "$(cryptsetup status $(basename ${PART_ROOT}) | grep inactive)" ]]; then
2009-06-28 22:40:06 +02:00
#avoid clash with dmraid here
2011-02-04 14:34:11 +01:00
if [[ "$(cryptsetup status $(basename ${PART_ROOT}))" ]]; then
if [[ "${NAME_SCHEME_PARAMETER}" == "FSUUID" ]]; then
2012-04-23 15:17:42 +02:00
CRYPTDEVICE="/dev/disk/by-uuid/$(echo $(${_BLKID} -p -i -s UUID -o value $(cryptsetup status $(basename ${PART_ROOT}) | grep device: | sed -e 's#device:##g')))"
elif [[ "${NAME_SCHEME_PARAMETER}" == "FSLABEL" ]]; then
2012-04-23 15:17:42 +02:00
CRYPTDEVICE="/dev/disk/by-label/$(echo $(${_BLKID} -p -i -s LABEL -o value $(cryptsetup status $(basename ${PART_ROOT}) | grep device: | sed -e 's#device:##g')))"
else
2011-02-04 14:34:11 +01:00
CRYPTDEVICE="$(echo $(cryptsetup status $(basename ${PART_ROOT}) | grep device: | sed -e 's#device:##g'))"
fi
2011-02-04 14:34:11 +01:00
CRYPTNAME="$(basename ${PART_ROOT})"
CRYPTSETUP="cryptdevice=${CRYPTDEVICE}:${CRYPTNAME}"
2009-06-28 22:40:06 +02:00
fi
2009-04-19 17:19:37 +02:00
fi
}
getrootfsuuid() {
2011-02-04 14:34:11 +01:00
_rootpart="${PART_ROOT}"
_fsuuid="$(getfsuuid ${PART_ROOT})"
if [[ -n "${_fsuuid}" ]]; then
_rootpart="/dev/disk/by-uuid/${_fsuuid}"
2010-03-06 20:55:55 +01:00
fi
}
getrootfslabel() {
2011-02-04 14:34:11 +01:00
_rootpart="${PART_ROOT}"
_fslabel="$(getfslabel ${PART_ROOT})"
if [[ -n "${_fslabel}" ]]; then
_rootpart="/dev/disk/by-label/${_fslabel}"
2010-05-24 15:39:55 +02:00
fi
}
2010-06-10 19:54:23 +02:00
# basic checks needed for all bootloaders
common_bootloader_checks() {
activate_special_devices
getrootfstype
2010-06-10 19:54:23 +02:00
getraidarrays
getcryptsetup
getrootflags
[[ "${NAME_SCHEME_PARAMETER}" == "FSUUID" ]] && getrootfsuuid
[[ "${NAME_SCHEME_PARAMETER}" == "FSLABEL" ]] && getrootfslabel
2010-06-10 19:54:23 +02:00
}
2010-06-04 15:49:31 +02:00
# look for a separately-mounted /boot partition
2010-07-15 21:24:55 +02:00
check_bootpart() {
2010-06-04 15:49:31 +02:00
subdir=""
2012-01-09 13:54:09 +01:00
bootdev="$(mount | grep "${DESTDIR}/boot " | cut -d' ' -f 1)"
if [[ "${bootdev}" == "" ]]; then
subdir="/boot"
bootdev="${PART_ROOT}"
2010-06-04 15:49:31 +02:00
fi
}
2010-06-10 19:54:23 +02:00
# check for btrfs bootpart and abort if detected
abort_btrfs_bootpart() {
2012-04-23 15:17:42 +02:00
FSTYPE="$(${_BLKID} -p -i ${bootdev} -o value -s TYPE)"
2011-02-04 14:34:11 +01:00
if [[ "${FSTYPE}" = "btrfs" ]]; then
2010-06-10 19:54:23 +02:00
DIALOG --msgbox "Error:\nYour selected bootloader cannot boot from btrfs partition with /boot on it." 0 0
return 1
fi
2010-06-06 22:15:27 +02:00
}
2010-08-02 21:34:30 +02:00
# check for nilfs2 bootpart and abort if detected
abort_nilfs_bootpart() {
2012-04-23 15:17:42 +02:00
FSTYPE="$(${_BLKID} -p -i ${bootdev} -o value -s TYPE)"
2011-02-04 14:34:11 +01:00
if [[ "${FSTYPE}" = "nilfs2" ]]; then
2010-08-02 21:34:30 +02:00
DIALOG --msgbox "Error:\nYour selected bootloader cannot boot from nilfs2 partition with /boot on it." 0 0
return 1
fi
}
do_uefi_common() {
DISC="$(df -T "${DESTDIR}/boot" | tail -n +2 | awk '{print $1}' | sed 's/\(.\{8\}\).*/\1/')"
if [[ "${DISC}" != "" ]]; then
CHECK_UEFISYS_PART="1"
CHECK_BIOS_BOOT_GRUB2=""
RUN_CGDISK=""
# check_gpt
check_uefisyspart
fi
PACKAGES="dosfstools efibootmgr"
run_pacman
PACKAGES=""
}
do_uefi_x86_64() {
export UEFI_ARCH="x86_64"
export SPEC_UEFI_ARCH="x64"
do_uefi_common
}
do_uefi_i386() {
export UEFI_ARCH="i386"
export SPEC_UEFI_ARCH="ia32"
do_uefi_common
}
do_uefi_efibootmgr() {
modprobe -q efivars
if [[ "$(lsmod | grep ^efivars)" ]]; then
chroot_mount
if [[ -d "${DESTDIR}/sys/firmware/efi/vars" ]]; then
cat << EFIBEOF > "${DESTDIR}/efibootmgr_run.sh"
#!/usr/bin/env bash
for _bootnum in \$(efibootmgr | grep '^Boot[0-9]' | fgrep -i '${_EFIBOOTMGR_LABEL}' | cut -b5-8) ; do
efibootmgr --bootnum "\${_bootnum}" --delete-bootnum
done
echo
efibootmgr --verbose --create --gpt --disk "${_EFIBOOTMGR_DISC}" --part "${_EFIBOOTMGR_PART_NUM}" --write-signature --label '${_EFIBOOTMGR_LABEL}' --loader '\\EFI\\${_EFIBOOTMGR_LOADER_DIR}\\${_EFIBOOTMGR_LOADER_FILE}'
echo
EFIBEOF
chmod a+x "${DESTDIR}/efibootmgr_run.sh"
chroot "${DESTDIR}" "/bin/bash" "/efibootmgr_run.sh" &>"/tmp/efibootmgr_run.log"
mv "${DESTDIR}/efibootmgr_run.sh" "/tmp/efibootmgr_run.sh"
else
DIALOG --msgbox "${DESTDIR}/sys/firmware/efi/vars/ directory not found. Check whether you have booted in UEFI boot mode, manually load efivars kernel module and create a boot entry for ${_EFIBOOTMGR_LABEL} in the UEFI Boot Manager." 0 0
fi
chroot_umount
else
DIALOG --msgbox "efivars kernel module was not loaded properly. Manually load it and create a boot entry for DISC ${_EFIBOOTMGR_DISC} , PART ${_EFIBOOTMGR_PART_NUM} and LOADER \\EFI\\${_EFIBOOTMGR_LOADER_DIR}\\${_EFIBOOTMGR_LOADER_FILE} , in UEFI Boot Manager using efibootmgr." 0 0
fi
unset _EFIBOOTMGR_LABEL
unset _EFIBOOTMGR_DISC
unset _EFIBOOTMGR_PART_NUM
unset _EFIBOOTMGR_LOADER_DIR
unset _EFIBOOTMGR_LOADER_FILE
}
do_apple_efi_hfs_bless() {
modprobe -q -r efivars || true
## Grub upstream bzr mactel branch => http://bzr.savannah.gnu.org/lh/grub/branches/mactel/changes
## Fedora's mactel-boot => https://bugzilla.redhat.com/show_bug.cgi?id=755093
DIALOG --msgbox "TODO: Apple Mac EFI Bootloader Setup" 0 0
}
do_uefi_bootmgr_setup() {
_uefisysdev="$(df -T "${DESTDIR}/boot/efi" | tail -n +2 | awk '{print $1}')"
_DISC="$(echo "${_uefisysdev}" | sed 's/\(.\{8\}\).*/\1/')"
UEFISYS_PART_NUM="$(${_BLKID} -p -i -s PART_ENTRY_NUMBER -o value "${_uefisysdev}")"
_BOOTMGR_DISC="${_DISC}"
_BOOTMGR_PART_NUM="${UEFISYS_PART_NUM}"
if [[ "$(cat "/sys/class/dmi/id/sys_vendor")" == 'Apple Inc.' ]] || [[ "$(cat "/sys/class/dmi/id/sys_vendor")" == 'Apple Computer, Inc.' ]]; then
do_apple_efi_hfs_bless
else
## For all the non-Mac UEFI systems
_EFIBOOTMGR_LABEL="${_BOOTMGR_LABEL}"
_EFIBOOTMGR_DISC="${_BOOTMGR_DISC}"
_EFIBOOTMGR_PART_NUM="${_BOOTMGR_PART_NUM}"
_EFIBOOTMGR_LOADER_DIR="${_BOOTMGR_LOADER_DIR}"
_EFIBOOTMGR_LOADER_FILE="${_BOOTMGR_LOADER_FILE}"
do_uefi_efibootmgr
fi
unset _BOOTMGR_LABEL
unset _BOOTMGR_DISC
unset _BOOTMGR_PART_NUM
unset _BOOTMGR_LOADER_DIR
unset _BOOTMGR_LOADER_FILE
}
doefistub_uefi_common() {
[[ "$(uname -m)" == "x86_64" ]] && __CARCH="x86_64"
[[ "$(uname -m)" == "i686" ]] && __CARCH="i386"
if [[ "${__CARCH}" != "${UEFI_ARCH}" ]]; then
DIALOG --msgbox "EFISTUB requires Kernel and UEFI arch to match, and requires CONFIG_EFI_STUB enabled kernel. Please install matching ARCH Kernel and try again." 0 0
elif [[ "${KERNELPKG}" == "linux-lts" ]]; then
DIALOG --msgbox "LTS kernel does not support EFISTUB. Please install CONFIG_EFI_STUB enabled kernel and try again." 0 0
else
bootdev=""
grubdev=""
complexuuid=""
FAIL_COMPLEX=""
GRUB_LEGACY=""
USE_DMRAID=""
RAID_ON_LVM=""
common_bootloader_checks
_bootdev="$(df -T "${DESTDIR}/boot" | tail -n +2 | awk '{print $1}')"
_rootdev="$(df -T "${DESTDIR}/" | tail -n +2 | awk '{print $1}')"
_uefisysdev="$(df -T "${DESTDIR}/boot/efi" | tail -n +2 | awk '{print $1}')"
ROOT_PART_FS_UUID="$(getfsuuid "${_rootdev}")"
ROOT_PART_FS_LABEL="$(getfslabel "${_rootdev}")"
ROOT_PART_GPT_GUID="$(getpartuuid "${_rootdev}")"
ROOT_PART_GPT_LABEL="$(getpartlabel "${_rootdev}")"
getrootfstype
UEFISYS_PART_FS_UUID="$(getfsuuid "${_uefisysdev}")"
UEFISYS_PART_FS_LABEL="$(getfslabel "${_uefisysdev}")"
UEFISYS_PART_GPT_GUID="$(getpartuuid "${_uefisysdev}")"
UEFISYS_PART_GPT_LABEL="$(getpartlabel "${_uefisysdev}")"
[[ "${NAME_SCHEME_PARAMETER}" == "FSUUID" ]] && _rootpart="UUID=${ROOT_PART_FS_UUID}"
[[ "${NAME_SCHEME_PARAMETER}" == "PARTUUID" ]] && _rootpart="/dev/disk/by-partuuid/${ROOT_PART_GPT_GUID}"
[[ "${NAME_SCHEME_PARAMETER}" == "FSLABEL" ]] && _rootpart="LABEL=${ROOT_PART_FS_LABEL}"
[[ "${NAME_SCHEME_PARAMETER}" == "PARTLABEL" ]] && _rootpart="/dev/disk/by-partlabel/${ROOT_PART_GPT_LABEL}"
2012-04-22 20:35:28 +02:00
[[ "${_rootpart}" == "" ]] && _rootpart="${_rootdev}"
## TODO: All complex stuff like dmraid, cyptsetup etc. for kernel parameters - common_bootloader_checks ?
_PARAMETERS_UNMOD="root=${_rootpart} ${ROOTFLAGS} rootfstype=${ROOTFS} ${RAIDARRAYS} ${CRYPTSETUP} ro initrd=\\EFI\\arch\\${INITRAMFS}.img"
_PARAMETERS_MOD=$(echo "${_PARAMETERS_UNMOD}" | sed -e 's# # #g' | sed -e 's# # #g')
mkdir -p "${DESTDIR}/boot/efi/EFI/arch"
cat << CONFEOF > "${DESTDIR}/boot/efi/EFI/arch/linux.conf"
${_PARAMETERS_MOD}
CONFEOF
cat << REFINDEOF > "${DESTDIR}/boot/efi/EFI/arch/refind_linux.conf"
"Boot with Defaults" "${_PARAMETERS_MOD}"
REFINDEOF
rm -f "${DESTDIR}/boot/efi/EFI/arch/${VMLINUZ}.efi"
rm -f "${DESTDIR}/boot/efi/EFI/arch/${INITRAMFS}.img"
cp -f "${DESTDIR}/boot/${VMLINUZ}" "${DESTDIR}/boot/efi/EFI/arch/${VMLINUZ}.efi"
cp -f "${DESTDIR}/boot/${INITRAMFS}.img" "${DESTDIR}/boot/efi/EFI/arch/${INITRAMFS}.img"
if [[ -e "${DESTDIR}/boot/efi/EFI/arch/${VMLINUZ}.efi" ]] && [[ -e "${DESTDIR}/boot/efi/EFI/arch/${INITRAMFS}.img" ]]; then
# _BOOTMGR_LABEL="Arch Linux (EFISTUB)"
# _BOOTMGR_LOADER_DIR="arch"
# _BOOTMGR_LOADER_FILE="${VMLINUZ}.efi"
# do_uefi_bootmgr_setup
DIALOG --msgbox "The EFISTUB Kernel and initramfs have been copied to /boot/efi/EFI/arch/${VMLINUZ}.efi and /boot/efi/EFI/arch/${INITRAMFS}.img respectively. Make sure to update those files everytime /boot/${VMLINUZ} and /boot/${INITRAMFS}.img are updated during the Kernel package update(s)." 0 0
DIALOG --msgbox "You will now be put into the editor to edit linux.conf and refind_linux.conf . After you save your changes, exit the editor." 0 0
geteditor || return 1
"${EDITOR}" "${DESTDIR}/boot/efi/EFI/arch/linux.conf"
"${EDITOR}" "${DESTDIR}/boot/efi/EFI/arch/refind_linux.conf"
# DIALOG --defaultno --yesno "Do you want to copy /boot/efi/EFI/arch/${VMLINUZ}.efi to /boot/efi/EFI/boot/boot${SPEC_UEFI_ARCH}.efi .\n\nThis might be needed in some systems where efibootmgr may not work due to firmware issues." 0 0 && _UEFISYS_EFI_BOOT_DIR="1"
# if [[ "${_UEFISYS_EFI_BOOT_DIR}" == "1" ]]; then
# mkdir -p "${DESTDIR}/boot/efi/EFI/boot"
# rm -f "${DESTDIR}/boot/efi/EFI/boot/boot${SPEC_UEFI_ARCH}.efi"
# rm -f "${DESTDIR}/boot/efi/EFI/boot/linux.conf"
# cp -f "${DESTDIR}/boot/efi/EFI/arch/${VMLINUZ}.efi" "${DESTDIR}/boot/efi/EFI/boot/boot${SPEC_UEFI_ARCH}.efi"
# cp -f "${DESTDIR}/boot/efi/EFI/boot/linux.conf" "${DESTDIR}/boot/efi/EFI/boot/linux.conf"
# fi
else
DIALOG --msgbox "Error setting up EFISTUB kernel and initramfs in /boot/efi." 0 0
fi
fi
}
do_efistub_uefi_x86_64() {
do_uefi_x86_64
doefistub_uefi_common
}
do_efistub_uefi_i686() {
do_uefi_i386
doefistub_uefi_common
}
dorefind_uefi_common() {
DIALOG --msgbox "Setting up rEFInd-${UEFI_ARCH} now ..." 0 0
# if [[ "${UEFI_ARCH}" == "x86_64" ]]; then
# PACKAGES="rEFInd-${UEFI_ARCH}"
# run_pacman
# PACKAGES=""
# fi
if [[ -e "${DESTDIR}/boot/efi/EFI/arch/refind/refind${SPEC_UEFI_ARCH}.efi" ]]; then
_REFIND_SUBDIR="arch/refind"
_REFIND_SUBDIR_UEFI="arch\\refind"
else
rm -rf "/tmp"/refind-bin-* || true
rm -f "/tmp"/refind-bin-*.zip || true
if [[ -e "/tmp/refind-bin.zip" ]]; then
_REFIND_ZIP="/tmp/refind-bin.zip"
elif [[ -e "${_MEDIA}/packages/refind-bin.zip" ]]; then
_REFIND_ZIP="${_MEDIA}/packages/refind-bin.zip"
else
DIALOG --msgbox "refind-bin.zip file not found. Setup needs to download that file to setup rEFInd-${UEFI_ARCH}. You will now be asked to configure the network." 0 0
donetwork
curl -L "http://sourceforge.net/projects/refind/files/latest/download" -o "/tmp/refind-bin.zip"
if [[ -e "/tmp/refind-bin.zip" ]]; then
_REFIND_ZIP="/tmp/refind-bin.zip"
else
DIALOG --msgbox "Couldn't download refind-bin.zip . Cannot setup rEFInd-${UEFI_ARCH}. Any issues with net connectivity?" 0 0 && return 1
fi
fi
if [[ -e "/usr/bin/bsdtar" ]]; then
bsdtar -C "/tmp" -xf "${_REFIND_ZIP}"
else
PACKAGES="libarchive"
run_pacman
PACKAGES=""
LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/bin/bsdtar" -C "/tmp" -xf "${_REFIND_ZIP}"
fi
mv "/tmp"/refind-bin-* "/tmp/refind-bin-dir"
_REFIND_SUBDIR="arch_refind"
_REFIND_SUBDIR_UEFI="arch_refind"
mkdir -p "${DESTDIR}/boot/efi/EFI/${_REFIND_SUBDIR}"
cp -f "/tmp/refind-bin-dir/refind/refind_${SPEC_UEFI_ARCH}.efi" "${DESTDIR}/boot/efi/EFI/${_REFIND_SUBDIR}/refind${SPEC_UEFI_ARCH}.efi"
cp -f "/tmp/refind-bin-dir/refind/refind.conf-sample" "${DESTDIR}/boot/efi/EFI/${_REFIND_SUBDIR}/refind.conf"
cp -rf "/tmp/refind-bin-dir/refind/icons" "${DESTDIR}/boot/efi/EFI/${_REFIND_SUBDIR}/icons"
cp -rf "/tmp/refind-bin-dir/docs" "${DESTDIR}/boot/efi/EFI/${_REFIND_SUBDIR}/docs"
cp -f "/tmp/refind-bin-dir"/*.txt "${DESTDIR}/boot/efi/EFI/${_REFIND_SUBDIR}/docs"/
fi
_REFIND_CONFIG="${DESTDIR}/boot/efi/EFI/${_REFIND_SUBDIR}/refind.conf"
sed 's|^timeout 20|timeout 0|g' -i "${_REFIND_CONFIG}"
sed 's|^#resolution 1024 768|resolution 1024 768|g' -i "${_REFIND_CONFIG}"
sed 's|^#showtools shell, about, reboot|showtools shell,about,exit,shutdown,reboot|g' -i "${_REFIND_CONFIG}"
sed 's|^#scan_driver_dirs EFI/tools/drivers,drivers|scan_driver_dirs EFI/tools/drivers|g' -i "${_REFIND_CONFIG}"
sed 's|^#scanfor internal,external,optical|scanfor internal,external,optical,manual|g' -i "${_REFIND_CONFIG}"
sed 's|^#max_tags 0|max_tags 0|g' -i "${_REFIND_CONFIG}"
if [[ -e "${DESTDIR}/boot/efi/EFI/${_REFIND_SUBDIR}/refind${SPEC_UEFI_ARCH}.efi" ]]; then
_BOOTMGR_LABEL="Arch Linux (rEFInd)"
_BOOTMGR_LOADER_DIR="${_REFIND_SUBDIR_UEFI}"
_BOOTMGR_LOADER_FILE="refind${SPEC_UEFI_ARCH}.efi"
do_uefi_bootmgr_setup
DIALOG --msgbox "rEFInd-${UEFI_ARCH} setup successfully." 0 0
DIALOG --msgbox "You will now be put into the editor to edit refind.conf . After you save your changes, exit the editor." 0 0
geteditor || return 1
"${EDITOR}" "${_REFIND_CONFIG}"
DIALOG --defaultno --yesno "Do you want to copy /boot/efi/EFI/${_REFIND_SUBDIR}/refind${SPEC_UEFI_ARCH}.efi to /boot/efi/EFI/boot/boot${SPEC_UEFI_ARCH}.efi .\n\nThis might be needed in some systems where efibootmgr may not work due to firmware issues." 0 0 && _UEFISYS_EFI_BOOT_DIR="1"
if [[ "${_UEFISYS_EFI_BOOT_DIR}" == "1" ]]; then
mkdir -p "${DESTDIR}/boot/efi/EFI/boot"
rm -f "${DESTDIR}/boot/efi/EFI/boot/boot${SPEC_UEFI_ARCH}.efi"
rm -f "${DESTDIR}/boot/efi/EFI/boot/refind.conf"
rm -rf "${DESTDIR}/boot/efi/EFI/boot/icons"
cp -f "${DESTDIR}/boot/efi/EFI/${_REFIND_SUBDIR}/refind${SPEC_UEFI_ARCH}.efi" "${DESTDIR}/boot/efi/EFI/boot/boot${SPEC_UEFI_ARCH}.efi"
cp -f "${_REFIND_CONFIG}" "${DESTDIR}/boot/efi/EFI/boot/refind.conf"
cp -rf "${DESTDIR}/boot/efi/EFI/${_REFIND_SUBDIR}/icons" "${DESTDIR}/boot/efi/EFI/boot/icons"
fi
else
DIALOG --msgbox "Error setting up rEFInd-${UEFI_ARCH}." 0 0
fi
}
dorefind_uefi_x86_64() {
do_efistub_uefi_x86_64
dorefind_uefi_common
}
dorefind_uefi_i386() {
do_efistub_uefi_i686
dorefind_uefi_common
}
2010-06-04 15:49:31 +02:00
# install syslinux and run preparation
2012-01-09 13:54:09 +01:00
prepare_syslinux() {
if ! [[ -e "${DESTDIR}/usr/sbin/extlinux" || -e "${DESTDIR}/usr/bin/mcopy" ]]; then
DIALOG --msgbox "Couldn't find bootloader binary or helper program, installing syslinux now ..." 0 0
2011-02-04 14:34:11 +01:00
PACKAGES="${SYSLINUX_PACKAGES}"
2010-06-03 19:20:49 +02:00
run_pacman
# reset PACKAGES after installing
PACKAGES=""
fi
USE_DMRAID=""
2010-06-06 22:15:27 +02:00
common_bootloader_checks
2010-06-04 15:49:31 +02:00
}
# common syslinux funtion
2012-01-09 13:54:09 +01:00
common_syslinux() {
2010-06-03 19:20:49 +02:00
DEVS="$(findbootloaderdisks _)"
2011-02-04 14:34:11 +01:00
DEVS="${DEVS} $(findbootloaderpartitions _)"
2011-02-04 13:42:15 +01:00
2012-01-09 13:54:09 +01:00
if [[ "${DEVS}" == "" ]]; then
2010-06-03 19:20:49 +02:00
DIALOG --msgbox "No hard drives were found" 0 0
return 1
fi
2011-02-04 13:42:15 +01:00
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select the boot device where the ${SYSLINUX} bootloader will be installed (usually the MBR)" 14 55 7 ${DEVS} 2>${ANSWER} || return 1
ROOTDEV=$(cat ${ANSWER})
2011-02-04 13:42:15 +01:00
2010-06-04 15:49:31 +02:00
# generate config file
2010-06-03 19:20:49 +02:00
TEMPDIR=/tmp
2011-02-04 13:42:15 +01:00
# check if GPT/GUID is used
2012-01-09 13:54:09 +01:00
GUID_DETECTED=""
2012-04-24 12:53:47 +02:00
[[ "$(${_BLKID} -p -i -o value -s PTTYPE ${ROOTDEV})" == "gpt" ]] && GUID_DETECTED="1"
2011-02-04 13:42:15 +01:00
2011-02-04 14:34:11 +01:00
PARTITION_NUMBER=$(echo ${bootdev} | sed -e 's#.*[a-z]##g')
2012-01-09 13:54:09 +01:00
if [[ "${GUID_DETECTED}" == '1' ]]; then
2011-02-04 13:42:15 +01:00
# Set Legacy BIOS Bootable GPT Partition Attribute using sgdisk
2011-02-04 14:34:11 +01:00
if ! [[ "$(sgdisk -i ${PARTITION_NUMBER} ${ROOTDEV} | grep '^Attribute' | grep '4$')" ]]; then
sgdisk ${ROOTDEV} --attributes=${PARTITION_NUMBER}:set:2
2011-02-04 13:42:15 +01:00
fi
else
# mark the partition with /boot as active in MBR
2011-02-04 14:34:11 +01:00
parted -s ${ROOTDEV} set ${PARTITION_NUMBER} boot on >${LOG}
2011-02-04 13:42:15 +01:00
fi
2012-01-09 13:54:09 +01:00
[[ -e "${TEMPDIR}/${SYSLINUX_CONF}" ]] && rm -f "${TEMPDIR}/${SYSLINUX_CONF}"
2011-02-04 13:42:15 +01:00
2012-01-09 13:54:09 +01:00
cat << EOF > "${TEMPDIR}/${SYSLINUX_CONF}"
2010-06-03 19:20:49 +02:00
DEFAULT vesamenu.c32
PROMPT 0
MENU TITLE Arch Linux
2011-02-04 14:34:11 +01:00
MENU BACKGROUND ${subdir}/${SYSLINUX_DIR}/splash.png
2010-06-03 19:20:49 +02:00
TIMEOUT 300
MENU WIDTH 78
MENU MARGIN 4
MENU ROWS 10
MENU VSHIFT 10
MENU TIMEOUTROW 15
MENU TABMSGROW 13
MENU CMDLINEROW 11
MENU HELPMSGROW 17
MENU HELPMSGENDROW 29
# Refer to http://syslinux.zytor.com/wiki/index.php/Doc/menu
MENU COLOR border 30;44 #40ffffff #a0000000 std
MENU COLOR title 1;36;44 #9033ccff #a0000000 std
MENU COLOR sel 7;37;40 #e0ffffff #20ffffff all
MENU COLOR unsel 37;44 #50ffffff #a0000000 std
MENU COLOR help 37;40 #c0ffffff #a0000000 std
MENU COLOR timeout_msg 37;40 #80ffffff #00000000 std
MENU COLOR timeout 1;37;40 #c0ffffff #00000000 std
MENU COLOR msg07 37;40 #90ffffff #a0000000 std
MENU COLOR tabmsg 31;40 #30ffffff #00000000 std
ONTIMEOUT arch
EOF
2012-01-09 13:54:09 +01:00
sort /tmp/.device-names >> "${TEMPDIR}/${SYSLINUX_CONF}"
echo "label arch" >> "${TEMPDIR}/${SYSLINUX_CONF}"
echo "TEXT HELP" >> "${TEMPDIR}/${SYSLINUX_CONF}"
echo "Boot Arch Linux" >> "${TEMPDIR}/${SYSLINUX_CONF}"
echo "ENDTEXT" >> "${TEMPDIR}/${SYSLINUX_CONF}"
echo "MENU LABEL Arch Linux" >> "${TEMPDIR}/${SYSLINUX_CONF}"
echo "LINUX ${subdir}/${VMLINUZ}" >> "${TEMPDIR}/${SYSLINUX_CONF}"
if [[ "${NAME_SCHEME_PARAMETER}" == "FSUUID" || "${NAME_SCHEME_PARAMETER}" == "FSLABEL" ]]; then
2012-01-09 13:54:09 +01:00
echo "append initrd=${subdir}/${INITRAMFS}.img root=${_rootpart} ${ROOTFLAGS} rootfstype=${ROOTFS} ${RAIDARRAYS} ${CRYPTSETUP} ro" | sed -e 's# # #g' >> "${TEMPDIR}/${SYSLINUX_CONF}"
2010-06-03 19:20:49 +02:00
else
2012-01-09 13:54:09 +01:00
echo "append initrd=${subdir}/${INITRAMFS}.img root=${PART_ROOT} ${ROOTFLAGS} rootfstype=${ROOTFS} ${RAIDARRAYS} ${CRYPTSETUP} ro" | sed -e 's# # #g' >> "${TEMPDIR}/${SYSLINUX_CONF}"
fi
echo "label fallback" >> "${TEMPDIR}/${SYSLINUX_CONF}"
echo "TEXT HELP" >> "${TEMPDIR}/${SYSLINUX_CONF}"
echo "Boot Arch Linux Fallback" >> "${TEMPDIR}/${SYSLINUX_CONF}"
echo "ENDTEXT" >> "${TEMPDIR}/${SYSLINUX_CONF}"
echo "MENU LABEL Arch Linux Fallback" >> "${TEMPDIR}/${SYSLINUX_CONF}"
echo "LINUX ${subdir}/${VMLINUZ}" >> "${TEMPDIR}/${SYSLINUX_CONF}"
if [[ "${NAME_SCHEME_PARAMETER}" == "FSUUID" || "${NAME_SCHEME_PARAMETER}" == "FSLABEL" ]]; then
2012-01-09 13:54:09 +01:00
echo "append initrd=${subdir}/${INITRAMFS}-fallback.img root=${_rootpart} ${ROOTFLAGS} rootfstype=${ROOTFS} ${RAIDARRAYS} ${CRYPTSETUP}" | sed -e 's# # #g' >> "${TEMPDIR}/${SYSLINUX_CONF}"
2010-06-03 19:20:49 +02:00
else
2012-01-09 13:54:09 +01:00
echo "append initrd=${subdir}/${INITRAMFS}-fallback.img root=${PART_ROOT} ${ROOTFLAGS} rootfstype=${ROOTFS} ${RAIDARRAYS} ${CRYPTSETUP}" | sed -e 's# # #g' >> "${TEMPDIR}/${SYSLINUX_CONF}"
2010-06-03 19:20:49 +02:00
fi
2011-02-04 13:42:15 +01:00
2010-06-04 15:49:31 +02:00
# edit config file
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Before installing ${SYSLINUX}, you must review the configuration file. You will now be put into the editor. After you save your changes and exit the editor, ${SYSLINUX} will be installed." 0 0
geteditor || return 1
2012-01-09 13:54:09 +01:00
"${EDITOR}" "${TEMPDIR}/${SYSLINUX_CONF}"
2011-02-04 13:42:15 +01:00
2010-06-03 19:20:49 +02:00
# install syslinux
2011-02-04 14:34:11 +01:00
DIALOG --infobox "Installing the ${SYSLINUX} bootloader..." 0 0
2012-01-09 13:54:09 +01:00
! [[ -d "${DESTDIR}/boot/${SYSLINUX_DIR}" ]] && mkdir -p "${DESTDIR}/boot/${SYSLINUX_DIR}"
cp -f "${TEMPDIR}/${SYSLINUX_CONF}" "${DESTDIR}/boot/${SYSLINUX_DIR}/${SYSLINUX_CONF}"
cp -f "${DESTDIR}/usr/lib/syslinux"/*.c32 "${DESTDIR}/boot/${SYSLINUX_DIR}"
2010-06-04 15:49:31 +02:00
}
2010-06-04 15:49:31 +02:00
# finish_syslinux
finish_syslinux () {
2012-01-09 13:54:09 +01:00
MBR="${DESTDIR}/usr/lib/syslinux/mbr.bin"
GPTMBR="${DESTDIR}/usr/lib/syslinux/gptmbr.bin"
2011-02-04 13:42:15 +01:00
2012-05-26 10:14:32 +02:00
CHECKDEV=$(echo ${ROOTDEV} | sed 's|/dev/||g')
2011-02-04 13:42:15 +01:00
2012-05-26 10:14:32 +02:00
## Install MBR boot code only if the selected ROOTDEV is a DISC and not a partition
if [[ -e "${block}/${CHECKDEV}" ]]; then
## check if GPT/GUID is used
GUID_DETECTED=""
[[ "$(${_BLKID} -p -i -o value -s PTTYPE ${ROOTDEV})" == "gpt" ]] && GUID_DETECTED="1"
if [[ "${GUID_DETECTED}" == '1' ]]; then
cat "${GPTMBR}" > "${ROOTDEV}"
else
cat "${MBR}" > "${ROOTDEV}"
fi
2010-06-03 19:20:49 +02:00
fi
2011-02-04 13:42:15 +01:00
[[ -f "${_MEDIA}/boot/syslinux/splash.png" ]] && cp -f "${_MEDIA}/boot/syslinux/splash.png" "${DESTDIR}/boot/${SYSLINUX_DIR}"
2010-06-04 11:42:35 +02:00
chroot_umount
2012-05-26 10:14:32 +02:00
if [[ -e "${DESTDIR}/boot/${SYSLINUX_DIR}/ldlinux.sys" ]]; then
DIALOG --msgbox "${SYSLINUX} was successfully installed." 0 0
else
DIALOG --msgbox "Error installing ${SYSLINUX}. (see ${LOG} for output)" 0 0
chroot_umount
return 1
fi
2010-06-03 19:20:49 +02:00
}
2010-06-04 15:49:31 +02:00
# install extlinux bootloader
dosyslinux_bios () {
2010-06-04 13:39:31 +02:00
bootdev=""
2010-06-04 16:28:43 +02:00
SYSLINUX_PACKAGES="syslinux"
2010-06-04 15:49:31 +02:00
SYSLINUX=EXTLINUX
SYSLINUX_PROGRAM=extlinux
2011-02-04 13:42:15 +01:00
SYSLINUX_DIR=syslinux
SYSLINUX_CONF=syslinux.cfg
SYSLINUX_OPTS=""
2012-01-09 13:54:09 +01:00
2010-06-04 15:49:31 +02:00
prepare_syslinux
check_bootpart
2010-08-02 21:34:30 +02:00
abort_nilfs_bootpart || return 1
2012-01-09 13:54:09 +01:00
2010-06-04 15:49:31 +02:00
# extlinux only can boot from ext2/3/4 and btrfs partitions!
2012-04-23 15:17:42 +02:00
FSTYPE="$(${_BLKID} -p -i -o value -s TYPE ${bootdev})"
2012-01-09 13:54:09 +01:00
if ! [[ "${FSTYPE}" == "ext2" || "${FSTYPE}" == "ext3" || "${FSTYPE}" == "ext4" || "${FSTYPE}" == "btrfs" || "${FSTYPE}" == "vfat" ]]; then
2011-02-04 13:42:15 +01:00
DIALOG --msgbox "Error:\nCouldn't find ext2/3/4 , btrfs or vfat partition with /boot on it." 0 0
2010-06-04 15:49:31 +02:00
return 1
2009-04-26 11:11:31 +02:00
fi
2012-01-09 13:54:09 +01:00
2010-06-04 15:49:31 +02:00
# extlinux cannot boot from any raid partition, encrypted and dmraid device
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${bootdev} | grep /dev/md*p)" || "$(echo ${bootdev} | grep /dev/mapper)" ]]; then
DIALOG --msgbox "Error:\n${SYSLINUX} cannot boot from any raid partition, encrypted or dmraid device." 0 0
2010-06-04 15:49:31 +02:00
return 1
fi
2012-01-09 13:54:09 +01:00
2010-06-04 15:49:31 +02:00
# check if raid1 device is used, else fail.
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${bootdev} | grep /dev/md)" ]]; then
if ! [[ "$(mdadm --detail ${bootdev} | grep Level | sed -e 's#.*:\ ##g')" = "raid1" ]]; then
DIALOG --msgbox "Error:\n${SYSLINUX} cannot boot from non raid1 devices." 0 0
2010-06-04 15:49:31 +02:00
return 1
else
SYSLINUX_OPTS="--raid"
2010-06-04 15:49:31 +02:00
fi
fi
2012-01-09 13:54:09 +01:00
2010-07-15 19:04:22 +02:00
# extlinux cannot boot from btrfs raid
2010-07-15 21:24:55 +02:00
find_btrfs_raid_bootloader_devices
2011-02-04 14:34:11 +01:00
if [[ ${BTRFS_COUNT} -ge 3 ]]; then
DIALOG --msgbox "Error:\n${SYSLINUX} cannot boot from any btrfs raid." 0 0
2010-07-15 21:24:55 +02:00
return 1
fi
2012-01-09 13:54:09 +01:00
# extlinux cannot boot from btrfs subvolume
find_btrfs_bootloader_subvolume
2011-02-04 14:34:11 +01:00
if [[ ${BTRFS_SUBVOLUME_COUNT} -ge 3 ]]; then
DIALOG --msgbox "Error:\n${SYSLINUX} cannot boot from btrfs subvolume." 0 0
return 1
fi
2012-01-09 13:54:09 +01:00
common_syslinux
2010-06-04 15:49:31 +02:00
chroot_mount
2011-02-04 14:34:11 +01:00
chroot ${DESTDIR} ${SYSLINUX_PROGRAM} ${SYSLINUX_OPTS} --install /boot/${SYSLINUX_DIR} >${LOG} 2>&1
2010-06-04 15:49:31 +02:00
finish_syslinux
}
dolilo_bios() {
2011-02-04 14:34:11 +01:00
if [[ ! -f ${DESTDIR}/etc/lilo.conf ]]; then
DIALOG --msgbox "Couldn't find ${DESTDIR}/etc/lilo.conf, installing lilo now ..." 0 0
PACKAGES="lilo"
run_pacman
# reset PACKAGES after installing
PACKAGES=""
fi
2012-01-09 13:54:09 +01:00
2010-03-14 22:51:57 +01:00
USE_DMRAID=""
2010-06-06 22:15:27 +02:00
common_bootloader_checks
2012-01-09 13:54:09 +01:00
check_bootpart
2010-03-14 14:53:30 +01:00
# check on GUID (gpt)
2012-04-23 15:17:42 +02:00
if [[ "$(${_BLKID} -p -i -o value -s PART_ENTRY_SCHEME ${bootdev})" == "gpt" ]]; then
2012-01-09 13:54:09 +01:00
DIALOG --defaultno --yesno "Warning:\nSetup detected GUID (gpt) partition table.\n\nLilo doesn't support booting from GUID (gpt) partition table.\n\nDo you want to install lilo to an other device, which contains a msdos partition table?" 0 0 || return 1
2010-03-14 14:53:30 +01:00
fi
2012-01-09 13:54:09 +01:00
2010-07-15 21:24:55 +02:00
abort_btrfs_bootpart || return 1
2010-08-02 21:34:30 +02:00
abort_nilfs_bootpart || return 1
2012-01-09 13:54:09 +01:00
# Try to auto-configure LILO...
2011-02-04 14:34:11 +01:00
if ! [[ "${PART_ROOT}" = "" ]]; then
if [[ "${NAME_SCHEME_PARAMETER}" == "FSUUID" || "${NAME_SCHEME_PARAMETER}" == "FSLABEL" ]]; then
sed -i "s|.*root=.*$|append=\"root=${_rootpart} ${ROOTFLAGS} rootfstype=${ROOTFS} ${RAIDARRAYS} ${CRYPTSETUP} ro\"|g" ${DESTDIR}/etc/lilo.conf
else
sed -i "s|.*root=.*$|append=\"root=${PART_ROOT} ${ROOTFLAGS} rootfstype=${ROOTFS} ${RAIDARRAYS} ${CRYPTSETUP} ro\"|g" ${DESTDIR}/etc/lilo.conf
fi
2012-01-13 16:39:59 +01:00
sed -i "s|image=/boot/vmlinuz-.*|image=/boot/${VMLINUZ}|g" ${DESTDIR}/etc/lilo.conf
sed -i "s|initrd=.*linux.*fallback.img$|initrd=/boot/${INITRAMFS}-fallback.img|g" ${DESTDIR}/etc/lilo.conf
sed -i "s|initrd=.*linux.img$|initrd=/boot/${INITRAMFS}.img|g" ${DESTDIR}/etc/lilo.conf
2012-01-13 16:39:59 +01:00
sed -i "s|initrd=.*linux-lts.img$|initrd=/boot/${INITRAMFS}.img|g" ${DESTDIR}/etc/lilo.conf
fi
2012-01-09 13:54:09 +01:00
2011-02-04 14:34:11 +01:00
sed -i -e '/DEVICE DETAILS/d' ${DESTDIR}/etc/lilo.conf
sort /tmp/.device-names >> ${DESTDIR}/etc/lilo.conf
2009-03-29 18:15:40 +02:00
DEVS="$(findbootloaderdisks _)"
2011-02-04 14:34:11 +01:00
DEVS="${DEVS} $(findbootloaderpartitions _)"
2012-01-09 13:54:09 +01:00
2011-02-04 14:34:11 +01:00
if [[ "${DEVS}" = "" ]]; then
DIALOG --msgbox "No hard drives were found" 0 0
return 1
fi
2012-01-09 13:54:09 +01:00
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select the boot device where the LILO bootloader will be installed (usually the MBR)" 14 55 7 ${DEVS} 2>${ANSWER} || return 1
ROOTDEV=$(cat ${ANSWER})
sed -i "s|boot=.*$|boot=${ROOTDEV}|g" ${DESTDIR}/etc/lilo.conf
2012-01-09 13:54:09 +01:00
2010-04-16 17:22:07 +02:00
# HACK: if virtio device is used
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${ROOTDEV} | grep /dev/vd)" ]]; then
sed -i "s|.*disk=.*$|disk=${ROOTDEV} bios=0x80 max-partitions=7|g" ${DESTDIR}/etc/lilo.conf
2010-04-16 17:22:07 +02:00
else
2011-02-04 14:34:11 +01:00
sed -i "s|^disk=.*$|# disk=${ROOTDEV} bios=0x80|g" ${DESTDIR}/etc/lilo.conf
2010-04-16 17:22:07 +02:00
fi
2012-01-09 13:54:09 +01:00
DIALOG --msgbox "Before installing LILO, you must review the configuration file. You will now be put into the editor. After you save your changes and exit the editor, LILO will be installed." 0 0
geteditor || return 1
2011-02-04 14:34:11 +01:00
${EDITOR} ${DESTDIR}/etc/lilo.conf
DIALOG --infobox "Installing the LILO bootloader..." 0 0
chroot_mount
2011-02-04 14:34:11 +01:00
chroot ${DESTDIR} /sbin/lilo >${LOG} 2>&1
2012-01-09 13:54:09 +01:00
2011-02-03 21:54:43 +01:00
if [[ $? -gt 0 ]]; then
chroot_umount
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Error installing LILO. (see ${LOG} for output)" 0 0
return 1
fi
chroot_umount
DIALOG --msgbox "LILO was successfully installed." 0 0
2008-10-20 22:39:25 +02:00
}
dogrub_legacy_bios() {
2012-01-09 13:54:09 +01:00
if [[ -f "${DESTDIR}/usr/lib/grub/i386-pc/kernel.img" ]]; then
DIALOG --msgbox "Found ${DESTDIR}/usr/lib/grub/i386-pc/kernel.img, deinstalling grub2 now ..." 0 0
2011-02-10 17:16:23 +01:00
${PACMAN} -R grub2-bios grub2-common > ${LOG}
2010-07-11 21:50:50 +02:00
fi
2012-01-09 13:54:09 +01:00
if [[ ! -f "${DESTDIR}/boot/grub/menu.lst" ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Couldn't find ${DESTDIR}/boot/grub/menu.lst, installing grub now ..." 0 0
PACKAGES="grub"
run_pacman
# reset PACKAGES after installing
PACKAGES=""
fi
grubdev=""
_grubdev=""
bootdev=""
grubdev=""
redundant=""
2010-06-06 22:15:27 +02:00
common_bootloader_checks
get_grub_map
FAIL_RAID=""
FAIL_DM=""
GRUB_LEGACY="1"
2010-03-12 23:35:44 +01:00
USE_DMRAID=""
#checks for custom dev.map filesystem
2011-02-03 21:54:43 +01:00
if ! [[ "$(dmraid -r | grep ^no )" ]]; then
2010-03-12 23:35:44 +01:00
DIALOG --yesno "Setup detected dmraid device.\nDo you want to install grub on this device?" 0 0 && get_grub_dmraid_map
fi
2011-02-04 14:34:11 +01:00
if [[ "$(ls ${block}/vd[a-z] 2>/dev/null)" ]]; then
2010-04-16 17:22:07 +02:00
DIALOG --yesno "Setup detected virtio devices.\nDo you want to install grub on this device?" 0 0 && get_grub_virtio_map
fi
2011-02-04 14:34:11 +01:00
if [[ "$(ls ${block}/mmcblk* 2>/dev/null)" ]]; then
2010-05-20 21:09:09 +02:00
DIALOG --yesno "Setup detected mmcblk devices.\nDo you want to install grub on this device?" 0 0 && get_grub_mmcblk_map
fi
2011-02-04 14:34:11 +01:00
for i in ${EXTRA_CONTROLLER}; do
if [[ "$(ls ${block}/${i}* 2>/dev/null)" ]]; then
DIALOG --yesno "Setup detected ${i} devices.\nDo you want to install grub on this device?" 0 0 && get_grub_extra_devices_map
2010-05-20 21:09:09 +02:00
fi
done
2012-01-09 13:54:09 +01:00
2011-02-04 14:34:11 +01:00
if [[ "${PART_ROOT}" = "" ]]; then
DIALOG --inputbox "Enter the full path to your root device" 8 65 "/dev/sda3" 2>${ANSWER} || return 1
PART_ROOT=$(cat ${ANSWER})
2010-03-14 17:03:56 +01:00
fi
# try to auto-configure GRUB...
2011-02-04 14:34:11 +01:00
if [[ "${PART_ROOT}" != "" ]]; then
2010-06-04 15:49:31 +02:00
check_bootpart
2012-01-09 13:54:09 +01:00
# check on GUID (gpt)
2012-04-23 15:17:42 +02:00
if [[ "$(${_BLKID} -p -i -o value -s PART_ENTRY_SCHEME ${bootdev})" == "gpt" ]]; then
2012-01-09 13:54:09 +01:00
DIALOG --defaultno --yesno "Warning:\nSetup detected GUID (gpt) partition table.\n\nGrub doesn't support booting from GUID (gpt) partition table.\n\nDo you want to install grub to an other device, which contains a msdos partition table?" 0 0 || return 1
fi
2010-07-15 21:24:55 +02:00
abort_btrfs_bootpart || return 1
2010-08-02 21:34:30 +02:00
abort_nilfs_bootpart || return 1
2009-06-28 22:40:06 +02:00
# check if raid device, devicemapper or dmraid is used on /boot partition
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${bootdev} | grep /dev/md)" ]]; then
if [[ "$(mdadm --detail ${bootdev} | grep Level | sed -e 's#.*:\ ##g')" = "raid1" ]]; then
2009-03-28 17:17:15 +01:00
# get redundant devices
2011-02-04 14:34:11 +01:00
for i in $(mdadm --detail ${bootdev} | grep "\ /dev/" | sed -e 's#.* /#/#g'); do
_grubdev="${_grubdev} $(mapdev ${i})"
done
redundant="1"
else
2009-03-28 18:16:46 +01:00
# none raid1 devices are not bootable with grub, let it fail!
FAIL_RAID="1"
fi
2011-02-04 14:34:11 +01:00
if [[ "$(echo ${bootdev} | grep /dev/md*p)" ]]; then
2010-03-14 17:03:56 +01:00
# partitionable raid is not supported by grub!
FAIL_RAID="1"
fi
2011-02-04 14:34:11 +01:00
elif [[ "$(echo ${bootdev} | grep /dev/mapper)" ]]; then
if ! [[ "$(dmsetup info ${bootdev} | grep 'DMRAID')" ]]; then
2009-07-27 21:26:16 +02:00
FAIL_DM="1"
2009-06-28 22:40:06 +02:00
else
2009-07-27 21:26:16 +02:00
FAIL_DM=""
2011-02-04 14:34:11 +01:00
_grubdev=$(mapdev ${bootdev})
2009-06-28 22:40:06 +02:00
fi
else
# use normal device
2011-02-04 14:34:11 +01:00
_grubdev=$(mapdev ${bootdev})
fi
2011-02-04 14:34:11 +01:00
if [[ "${FAIL_RAID}" = "1" ]]; then
2009-03-29 17:51:42 +02:00
DIALOG --msgbox "Error: Grub cannot boot from none raid1 devices or partitionable raid devices!" 0 0
2009-03-28 18:16:46 +01:00
return 1
fi
2011-02-04 14:34:11 +01:00
if [[ "${FAIL_DM}" = "1" ]]; then
2009-07-27 21:26:16 +02:00
DIALOG --msgbox "Error: Grub cannot boot from your created device mapper devices!" 0 0
return 1
fi
2011-02-04 14:34:11 +01:00
if [[ "${_grubdev}" != "" ]]; then
cp ${DESTDIR}/boot/grub/menu.lst /tmp/.menu.lst
# remove the default entries by truncating the file at our little tag (#-*)
2011-02-04 14:34:11 +01:00
head -n $(cat /tmp/.menu.lst | grep -n '#-\*' | cut -d: -f 1) /tmp/.menu.lst >${DESTDIR}/boot/grub/menu.lst
rm -f /tmp/.menu.lst
# keep the file from being completely bogus
2011-02-04 14:34:11 +01:00
if [[ "${_grubdev}" = "DEVICE NOT FOUND" ]]; then
DIALOG --msgbox "Your root boot device could not be autodetected by setup. Ensure you adjust the 'root (hd0,0)' line in your GRUB config accordingly." 0 0
_grubdev="(hd0,0)"
fi
NUMBER=0
# create default grub entries
2012-01-09 13:54:09 +01:00
sort /tmp/.device-names >> "${DESTDIR}/boot/grub/menu.lst"
2011-02-04 14:34:11 +01:00
for grubdev in ${_grubdev}; do
2012-01-09 13:54:09 +01:00
echo "" >> "${DESTDIR}/boot/grub/menu.lst"
echo "# (${NUMBER}) Arch Linux" >> "${DESTDIR}/boot/grub/menu.lst"
echo "title Arch Linux" >> "${DESTDIR}/boot/grub/menu.lst"
echo "root ${grubdev}" >> "${DESTDIR}/boot/grub/menu.lst"
if [[ "${NAME_SCHEME_PARAMETER}" == "FSUUID" || "${NAME_SCHEME_PARAMETER}" == "FSLABEL" ]]; then
2012-01-09 13:54:09 +01:00
echo "kernel ${subdir}/${VMLINUZ} root=${_rootpart} ${ROOTFLAGS} rootfstype=${ROOTFS} ${RAIDARRAYS} ${CRYPTSETUP} ro" | sed -e 's# # #g' | sed -e 's# # #g' >> "${DESTDIR}/boot/grub/menu.lst"
else
2012-01-09 13:54:09 +01:00
echo "kernel ${subdir}/${VMLINUZ} root=${PART_ROOT} ${ROOTFLAGS} rootfstype=${ROOTFS} ${RAIDARRAYS} ${CRYPTSETUP} ro" | sed -e 's# # #g' | sed -e 's# # #g' >> "${DESTDIR}/boot/grub/menu.lst"
fi
2012-01-09 13:54:09 +01:00
echo "initrd ${subdir}/${INITRAMFS}.img" >> "${DESTDIR}/boot/grub/menu.lst"
echo "" >> "${DESTDIR}/boot/grub/menu.lst"
# adding fallback/full image
2011-02-04 14:34:11 +01:00
NUMBER=$((${NUMBER}+1))
2012-01-09 13:54:09 +01:00
echo "# (${NUMBER}) Arch Linux" >> "${DESTDIR}/boot/grub/menu.lst"
echo "title Arch Linux Fallback" >> "${DESTDIR}/boot/grub/menu.lst"
echo "root ${grubdev}" >> "${DESTDIR}/boot/grub/menu.lst"
if [[ "${NAME_SCHEME_PARAMETER}" == "FSUUID" || "${NAME_SCHEME_PARAMETER}" == "FSLABEL" ]]; then
2012-01-09 13:54:09 +01:00
echo "kernel ${subdir}/${VMLINUZ} root=${_rootpart} ${ROOTFLAGS} rootfstype=${ROOTFS} ${RAIDARRAYS} ${CRYPTSETUP} ro" | sed -e 's# # #g' | sed -e 's# # #g' >> "${DESTDIR}/boot/grub/menu.lst"
else
2012-01-09 13:54:09 +01:00
echo "kernel ${subdir}/${VMLINUZ} root=${PART_ROOT} ${ROOTFLAGS} rootfstype=${ROOTFS} ${RAIDARRAYS} ${CRYPTSETUP} ro" | sed -e 's# # #g' | sed -e 's# # #g' >> "${DESTDIR}/boot/grub/menu.lst"
fi
2012-01-09 13:54:09 +01:00
echo "initrd ${subdir}/${INITRAMFS}-fallback.img" >> "${DESTDIR}/boot/grub/menu.lst"
2011-02-04 14:34:11 +01:00
NUMBER=$((${NUMBER}+1))
done
2010-03-14 17:03:56 +01:00
### TODO:
# Is it possible to detect a windows installation?
2012-01-09 13:54:09 +01:00
echo "" >> "${DESTDIR}/boot/grub/menu.lst"
echo "# (${NUMBER}) Windows" >> "${DESTDIR}/boot/grub/menu.lst"
echo "#title Windows" >> "${DESTDIR}/boot/grub/menu.lst"
echo "#rootnoverify (hd0,0)" >> "${DESTDIR}/boot/grub/menu.lst"
echo "#makeactive" >> "${DESTDIR}/boot/grub/menu.lst"
echo "#chainloader +1" >> "${DESTDIR}/boot/grub/menu.lst"
fi
fi
DIALOG --msgbox "Before installing GRUB, you must review the configuration file. You will now be put into the editor. After you save your changes and exit the editor, you can install GRUB." 0 0
geteditor || return 1
2012-01-09 13:54:09 +01:00
"${EDITOR}" "${DESTDIR}/boot/grub/menu.lst"
2009-03-28 13:36:54 +01:00
DEVS="$(findbootloaderdisks _)"
2011-02-04 14:34:11 +01:00
DEVS="${DEVS} $(findbootloaderpartitions _)"
if [[ "${DEVS}" = "" ]]; then
DIALOG --msgbox "No hard drives were found" 0 0
return 1
fi
S_GRUB=""
2011-02-04 14:34:11 +01:00
while [[ "${S_GRUB}" = "" ]]; do
DIALOG --menu "Select the boot device where the GRUB bootloader will be installed (usually the MBR and not a partition)." 14 55 7 ${DEVS} 2>${ANSWER} || return 1
ROOTDEV=$(cat ${ANSWER})
DIALOG --infobox "Installing the GRUB bootloader..." 0 0
2011-02-04 14:34:11 +01:00
cp -a ${DESTDIR}/usr/lib/grub/i386-pc/* ${DESTDIR}/boot/grub/
# freeze xfs filesystems to enable grub installation on xfs filesystems
2010-03-14 17:03:56 +01:00
freeze_xfs
2011-02-04 14:34:11 +01:00
bootpart=${bootdev}
if [[ "$(echo ${bootpart} | grep /dev/md)" ]]; then
bootpart=$(mdadm --detail ${bootpart} | grep ${ROOTDEV} | sed -e 's#.* /#/#g')
fi
2011-02-04 14:34:11 +01:00
bootpart=$(mapdev ${bootpart})
bootdev=$(mapdev ${ROOTDEV})
if [[ "${bootpart}" = "" ]]; then
DIALOG --msgbox "Error: Missing/Invalid root device: ${bootpart}" 0 0
return 1
fi
2011-02-04 14:34:11 +01:00
if [[ "${bootpart}" = "DEVICE NOT FOUND" || "${bootdev}" = "DEVICE NOT FOUND" ]]; then
DIALOG --msgbox "GRUB root and setup devices could not be auto-located. You will need to manually run the GRUB shell to install a bootloader." 0 0
return 1
fi
get_chs
2009-06-28 22:40:06 +02:00
### HACK:we need a dmraid hack here! http://bugs.gentoo.org/show_bug.cgi?id=275566
grub_dmraid_hack
2011-02-04 14:34:11 +01:00
${DESTDIR}/sbin/grub --device-map=/tmp/dev.map --no-floppy --batch >>/tmp/grub.log 2>&1 <<EOF
geometry ${realdev} ${CYLINDERS} ${HEADS} ${SECTORS}
root ${bootpart}
setup ${bootdev}
2008-10-20 22:39:25 +02:00
quit
EOF
2009-06-28 22:40:06 +02:00
### HACK:remove symlinks again! http://bugs.gentoo.org/show_bug.cgi?id=275566
remove_grub_dmraid_hack
2011-02-04 14:34:11 +01:00
cat /tmp/grub.log >${LOG}
if grep "Error [0-9]*: " /tmp/grub.log >/dev/null; then
2011-02-04 14:34:11 +01:00
DIALOG --msgbox "Error installing GRUB. (see ${LOG} for output)" 0 0
return 1
fi
2009-06-28 22:40:06 +02:00
# copy device map file
2011-02-04 14:34:11 +01:00
cp -f /tmp/dev.map ${DESTDIR}/boot/grub/device.map
DIALOG --msgbox "GRUB was successfully installed." 0 0
S_GRUB=1
if [[ "$(${_BLKID} | grep TYPE=\"linux_raid_member\")" ]]; then
2011-02-04 14:34:11 +01:00
if [[ "${redundant}" = "1" ]]; then
2009-03-28 13:36:54 +01:00
DIALOG --defaultno --yesno "Setup detected a redundant software raid device.\nDo you want to install grub additionally to an other hard disk?" 0 0 && S_GRUB=""
fi
fi
done
2008-10-20 22:39:25 +02:00
}
dogrub2_common_before() {
##### Check whether the below limitations still continue with ver 2.00~beta4
### Grub2 restrictions:
2012-04-22 20:06:54 +02:00
# - Encryption is not recommended for grub2 /boot!
if [[ -f "${DESTDIR}/boot/grub/menu.lst" ]]; then
DIALOG --msgbox "Found ${DESTDIR}/boot/grub/menu.lst, uninstalling grub now ..." 0 0
2011-02-04 14:34:11 +01:00
${PACMAN} -R grub > ${LOG}
fi
2012-01-09 13:54:09 +01:00
bootdev=""
grubdev=""
complexuuid=""
FAIL_COMPLEX=""
GRUB_LEGACY=""
USE_DMRAID=""
RAID_ON_LVM=""
common_bootloader_checks
2012-01-09 13:54:09 +01:00
2011-02-13 17:39:53 +01:00
if ! [[ "$(dmraid -r | grep ^no )" ]]; then
DIALOG --yesno "Setup detected dmraid device.\nDo you want to install grub on this device?" 0 0 && USE_DMRAID="1"
fi
}
dogrub2_config() {
2011-02-08 23:35:02 +01:00
########
2011-02-07 17:07:41 +01:00
BOOT_PART_FS_UUID="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs_uuid" "${DESTDIR}/boot" 2>/dev/null)"
BOOT_PART_FS="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs" "${DESTDIR}/boot" 2>/dev/null)"
2011-02-07 17:07:41 +01:00
BOOT_PART_FS_LABEL="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs_label" "${DESTDIR}/boot" 2>/dev/null)"
BOOT_PART_DRIVE="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="drive" "${DESTDIR}/boot" 2>/dev/null)"
2011-02-07 17:07:41 +01:00
BOOT_PART_HINTS_STRING="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="hints_string" "${DESTDIR}/boot" 2>/dev/null)"
########
ROOT_PART_FS_UUID="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs_uuid" "${DESTDIR}/" 2>/dev/null)"
ROOT_PART_FS="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs" "${DESTDIR}/" 2>/dev/null)"
ROOT_PART_FS_LABEL="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs_label" "${DESTDIR}/" 2>/dev/null)"
ROOT_PART_DEVICE="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="device" "${DESTDIR}/" 2>/dev/null)"
ROOT_PART_HINTS_STRING="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="hints_string" "${DESTDIR}/" 2>/dev/null)"
########
USR_PART_FS_UUID="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs_uuid" "${DESTDIR}/usr" 2>/dev/null)"
USR_PART_FS="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs" "${DESTDIR}/usr" 2>/dev/null)"
USR_PART_FS_LABEL="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs_label" "${DESTDIR}/usr" 2>/dev/null)"
USR_PART_HINTS_STRING="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="hints_string" "${DESTDIR}/usr" 2>/dev/null)"
########
2011-06-16 17:49:18 +02:00
if [[ "${GRUB2_UEFI}" == "1" ]]; then
UEFISYS_PART_FS_UUID="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs_uuid" "${DESTDIR}/boot/efi" 2>/dev/null)"
UEFISYS_PART_FS_LABEL="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs_label" "${DESTDIR}/boot/efi" 2>/dev/null)"
UEFISYS_PART_DRIVE="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="drive" "${DESTDIR}/boot/efi" 2>/dev/null)"
UEFISYS_PART_HINTS_STRING="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="hints_string" "${DESTDIR}/boot/efi" 2>/dev/null)"
fi
########
## udev 180 onwards
2012-04-23 15:17:42 +02:00
if [[ "$(${_BLKID} -p -i -o value -s PART_ENTRY_SCHEME ${ROOT_PART_DEVICE})" == 'gpt' ]]; then
ROOT_PART_GPT_GUID="$(${_BLKID} -p -i -o value -s PART_ENTRY_UUID ${ROOT_PART_DEVICE})"
ROOT_PART_GPT_LABEL="$(${_BLKID} -p -i -o value -s PART_ENTRY_NAME ${ROOT_PART_DEVICE})"
2012-01-09 13:54:09 +01:00
fi
2011-06-16 17:49:18 +02:00
########
2011-10-27 09:51:17 +02:00
if [[ "${ROOT_PART_FS_UUID}" == "${BOOT_PART_FS_UUID}" ]]; then
subdir="/boot"
2012-04-19 17:23:56 +02:00
else
subdir=""
fi
########
2011-02-07 17:07:41 +01:00
cp -f "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg" "/tmp/.grub.cfg"
# remove the default entries by truncating the file at our little tag (set default)
head -n $(cat /tmp/.grub.cfg | grep -n 'set default' | cut -d: -f 1) "/tmp/.grub.cfg" > "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
2012-01-17 18:00:39 +01:00
rm -f "/tmp/.grub.cfg"
2011-02-07 17:07:41 +01:00
2011-10-27 09:51:17 +02:00
NUMBER="0"
2011-02-07 17:07:41 +01:00
## Ignore if the insmod entries are repeated - there are possibilities of having /boot in one disk and root-fs in altogether different disk
## with totally different configuration.
cat << EOF >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
if [ "\${grub_platform}" == "efi" ]; then
set _UEFI_ARCH="\${grub_cpu}"
if [ "\${grub_cpu}" == "x86_64" ]; then
set _SPEC_UEFI_ARCH="x64"
fi
if [ "\${grub_cpu}" == "i386" ]; then
set _SPEC_UEFI_ARCH="ia32"
fi
fi
EOF
cat << EOF >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
insmod part_gpt
insmod part_msdos
2011-02-07 17:07:41 +01:00
# Include fat fs module - required for uefi systems.
insmod fat
2011-02-07 17:07:41 +01:00
insmod ${BOOT_PART_FS}
insmod ${ROOT_PART_FS}
insmod ${USR_PART_FS}
2011-02-07 17:07:41 +01:00
insmod search_fs_file
2011-02-07 17:07:41 +01:00
insmod search_fs_uuid
insmod search_label
2011-02-07 17:07:41 +01:00
insmod linux
insmod chain
set pager="1"
# set debug="all"
set locale_dir="\${prefix}/locale"
EOF
2011-02-07 17:07:41 +01:00
2011-10-27 09:51:17 +02:00
[[ "${USE_RAID}" == "1" ]] && echo "insmod raid" >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
! [[ "${RAID_ON_LVM}" == "" ]] && echo "insmod lvm" >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
2011-02-07 17:07:41 +01:00
cat << EOF >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
2012-03-03 08:25:46 +01:00
if [ -e "\${prefix}/\${grub_cpu}-\${grub_platform}/all_video.mod" ]; then
insmod all_video
else
if [ "\${grub_platform}" == "efi" ]; then
insmod efi_gop
insmod efi_uga
fi
if [ "\${grub_platform}" == "pc" ]; then
insmod vbe
insmod vga
fi
insmod video_bochs
insmod video_cirrus
fi
insmod font
search --fs-uuid --no-floppy --set=usr_part ${USR_PART_HINTS_STRING} ${USR_PART_FS_UUID}
search --fs-uuid --no-floppy --set=root_part ${ROOT_PART_HINTS_STRING} ${ROOT_PART_FS_UUID}
if [ -e "(\${usr_part})/share/grub/unicode.pf2" ]; then
set _fontfile="(\${usr_part})/share/grub/unicode.pf2"
else
if [ -e "(\${root_part})/usr/share/grub/unicode.pf2" ]; then
set _fontfile="(\${root_part})/usr/share/grub/unicode.pf2"
else
if [ -e "\${prefix}/fonts/unicode.pf2" ]; then
2012-03-03 08:25:46 +01:00
set _fontfile="\${prefix}/fonts/unicode.pf2"
fi
fi
fi
if loadfont "\${_fontfile}" ; then
insmod gfxterm
2011-10-27 09:51:17 +02:00
set gfxmode="auto"
terminal_input console
terminal_output gfxterm
fi
EOF
2011-02-07 17:07:41 +01:00
echo "" >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
sort "/tmp/.device-names" >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
echo "" >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
2011-02-07 17:07:41 +01:00
if [[ "${NAME_SCHEME_PARAMETER}" == "FSUUID" ]]; then
GRUB_ROOT_DRIVE="search --fs-uuid --no-floppy --set=root ${BOOT_PART_HINTS_STRING} ${BOOT_PART_FS_UUID}"
_rootpart="UUID=${ROOT_PART_FS_UUID}"
2011-02-07 17:07:41 +01:00
2011-10-27 09:51:17 +02:00
elif [[ "${NAME_SCHEME_PARAMETER}" == "PARTUUID" ]]; then
GRUB_ROOT_DRIVE="search --fs-uuid --no-floppy --set=root ${BOOT_PART_HINTS_STRING} ${BOOT_PART_FS_UUID}" # GRUB2 does not yet support PARTUUID
_rootpart="/dev/disk/by-partuuid/${ROOT_PART_GPT_GUID}"
2011-06-16 17:49:18 +02:00
elif [[ "${NAME_SCHEME_PARAMETER}" == "FSLABEL" ]]; then
GRUB_ROOT_DRIVE="search --label --no-floppy --set=root ${BOOT_PART_HINTS_STRING} ${BOOT_PART_FS_LABEL}"
_rootpart="LABEL=${ROOT_PART_FS_LABEL}"
2011-02-07 17:07:41 +01:00
2011-10-27 09:51:17 +02:00
elif [[ "${NAME_SCHEME_PARAMETER}" == "PARTLABEL" ]]; then
GRUB_ROOT_DRIVE="search --label --no-floppy --set=root ${BOOT_PART_HINTS_STRING} ${BOOT_PART_FS_LABEL}" # GRUB2 does not yet support PARTLABEL
_rootpart="/dev/disk/by-partlabel/${ROOT_PART_GPT_LABEL}"
2011-06-16 17:49:18 +02:00
else
GRUB_ROOT_DRIVE="set root="${BOOT_PART_DRIVE}""
_rootpart="${ROOT_PART_DEVICE}"
2011-02-07 17:07:41 +01:00
fi
2011-06-16 17:49:18 +02:00
2011-02-08 23:35:02 +01:00
# fallback to device if no label or uuid can be detected, eg. luks device
2012-04-22 20:35:28 +02:00
if [[ -z "${ROOT_PART_FS_UUID}" ]] && [[ -z "${ROOT_PART_FS_LABEL}" ]]; then
_rootpart="${ROOT_PART_DEVICE}"
fi
2012-04-19 18:07:40 +02:00
LINUX_UNMOD_COMMAND="linux ${subdir}/${VMLINUZ} root=${_rootpart} ${ROOTFLAGS} rootfstype=${ROOTFS} ${RAIDARRAYS} ${CRYPTSETUP} ro"
2011-02-07 17:07:41 +01:00
LINUX_MOD_COMMAND=$(echo "${LINUX_UNMOD_COMMAND}" | sed -e 's# # #g' | sed -e 's# # #g')
## create default kernel entry
cat << EOF >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
2011-02-07 17:07:41 +01:00
# (${NUMBER}) Arch Linux
menuentry "Arch Linux" {
set gfxpayload="keep"
2011-02-07 17:07:41 +01:00
${GRUB_ROOT_DRIVE}
${LINUX_MOD_COMMAND}
initrd ${subdir}/${INITRAMFS}.img
2011-02-07 17:07:41 +01:00
}
EOF
NUMBER=$((${NUMBER}+1))
## create kernel fallback entry
cat << EOF >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
2011-02-07 17:07:41 +01:00
2011-02-08 23:38:06 +01:00
# (${NUMBER}) Arch Linux Fallback
menuentry "Arch Linux Fallback" {
set gfxpayload="keep"
2011-02-07 17:07:41 +01:00
${GRUB_ROOT_DRIVE}
${LINUX_MOD_COMMAND}
initrd ${subdir}/${INITRAMFS}-fallback.img
2011-02-07 17:07:41 +01:00
}
EOF
2011-02-04 14:34:11 +01:00
NUMBER=$((${NUMBER}+1))
2011-02-07 17:07:41 +01:00
cat << EOF >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
2011-02-07 17:07:41 +01:00
if [ "\${grub_platform}" == "efi" ]; then
## UEFI Shell 2.0
## Will work only in grub2 uefi
#menuentry "UEFI \${_UEFI_ARCH} Shell 2.0 - For Spec. Ver. >=2.3 systems" {
# search --fs-uuid --no-floppy --set=root ${UEFISYS_PART_HINTS_STRING} ${UEFISYS_PART_FS_UUID}
# chainloader /efi/tools/shell\${_SPEC_UEFI_ARCH}.efi
#}
## UEFI Shell 1.0
## Will work only in grub2 uefi
#menuentry "UEFI \${_UEFI_ARCH} Shell 1.0 - For Spec. Ver. <2.3 systems" {
# search --fs-uuid --no-floppy --set=root ${UEFISYS_PART_HINTS_STRING} ${UEFISYS_PART_FS_UUID}
# chainloader /efi/tools/shell\${_SPEC_UEFI_ARCH}_old.efi
#}
fi
2011-02-07 17:07:41 +01:00
EOF
NUMBER=$((${NUMBER}+1))
cat << EOF >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
if [ "\${grub_platform}" == "efi" ]; then
## Windows x86_64 UEFI
## Will work only in grub2 uefi x86_64
#menuentry \"Microsoft Windows x86_64 UEFI-GPT\" {
# insmod part_gpt
# insmod fat
# insmod search_fs_uuid
# insmod chain
# search --fs-uuid --no-floppy --set=root ${UEFISYS_PART_HINTS_STRING} ${UEFISYS_PART_FS_UUID}
# chainloader /efi/Microsoft/Boot/bootmgfw.efi
#}
fi
EOF
NUMBER=$((${NUMBER}+1))
## TODO: Detect actual Windows installation if any
## create example file for windows
cat << EOF >> "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
if [ "\${grub_platform}" == "pc" ]; then
## Windows BIOS
## Will work only in grub2 bios
#menuentry \"Microsoft Windows 7 BIOS-MBR\" {
# insmod part_msdos
# insmod ntfs
# insmod search_fs_uuid
# insmod ntldr
# search --fs-uuid --no-floppy --set=root 69B235F6749E84CE
# ntldr /bootmgr
#}
fi
2011-02-07 17:07:41 +01:00
EOF
## copy unicode.pf2 font file
cp -f "${DESTDIR}/usr/share/grub/unicode.pf2" "${DESTDIR}/${GRUB2_PREFIX_DIR}/fonts/unicode.pf2"
## Edit grub.cfg config file
DIALOG --msgbox "You must now review the grub2 configuration file.\n\nYou will now be put into the editor. After you save your changes, exit the editor." 0 0
geteditor || return 1
"${EDITOR}" "${DESTDIR}/${GRUB2_PREFIX_DIR}/grub.cfg"
unset BOOT_PART_FS_UUID
unset BOOT_PART_FS
unset BOOT_PART_FS_LABEL
unset BOOT_PART_DRIVE
2011-02-07 17:07:41 +01:00
unset ROOT_PART_FS_UUID
unset ROOT_PART_FS
unset ROOT_PART_FS_LABEL
unset ROOT_PART_DEVICE
2011-02-07 17:07:41 +01:00
unset GRUB_ROOT_DRIVE
unset LINUX_UNMOD_COMMAND
unset LINUX_MOD_COMMAND
}
dogrub2_bios() {
dogrub2_common_before
2012-01-09 13:54:09 +01:00
if [[ ! -f "${DESTDIR}/usr/lib/grub/i386-pc/kernel.img" ]]; then
DIALOG --msgbox "Couldn't find ${DESTDIR}/usr/lib/grub/i386-pc/kernel.img , installing grub2-bios now ..." 0 0
PACKAGES="grub2-bios grub2-common"
run_pacman
# reset PACKAGES after installing
PACKAGES=""
fi
2012-01-09 13:54:09 +01:00
# try to auto-configure GRUB2...
2011-02-04 14:34:11 +01:00
if [[ "${PART_ROOT}" != "" ]]; then
check_bootpart
2012-01-09 13:54:09 +01:00
# check if raid, raid partition, dmraid or device devicemapper is used
2011-10-27 09:51:17 +02:00
if [[ "$(echo ${bootdev} | grep /dev/md)" ]] || [[ "$(echo ${bootdev} | grep /dev/mapper)" ]]; then
2012-04-22 20:06:54 +02:00
# boot from lvm, raid, partitioned raid and dmraid devices is supported
FAIL_COMPLEX="0"
2012-01-09 13:54:09 +01:00
2012-04-22 20:06:54 +02:00
if [[ "$(cryptsetup status ${bootdev})" ]]; then
# encryption devices are not supported
FAIL_COMPLEX="1"
fi
fi
2012-01-09 13:54:09 +01:00
2011-10-27 09:51:17 +02:00
if [[ "${FAIL_COMPLEX}" == "0" ]]; then
2011-02-04 14:34:11 +01:00
grubdev=$(basename ${bootdev})
complexuuid=$(getfsuuid ${bootdev})
# check if mapper is used
if [[ "$(echo ${bootdev} | grep /dev/mapper)" ]]; then
RAID_ON_LVM="0"
#check if mapper contains a md device!
for devpath in $(pvs -o pv_name --noheading); do
if [[ "$(echo ${devpath} | grep -v /dev/md*p | grep /dev/md)" ]]; then
detectedvolumegroup="$(echo $(pvs -o vg_name --noheading ${devpath}))"
if [[ "$(echo /dev/mapper/${detectedvolumegroup}-* | grep ${bootdev})" ]]; then
# change bootdev to md device!
bootdev=$(pvs -o pv_name --noheading ${devpath})
RAID_ON_LVM="1"
break
fi
fi
done
fi
#check if raid is used
USE_RAID=""
if [[ "$(echo ${bootdev} | grep /dev/md)" ]]; then
USE_RAID="1"
fi
else
# use normal device
2011-02-04 14:34:11 +01:00
grubdev=$(mapdev ${bootdev})
fi
fi
2011-02-04 14:34:11 +01:00
# A switch is needed if complex ${bootdev} is used!
2012-04-22 20:06:54 +02:00
# - LVM and RAID ${bootdev} needs the MBR of a device and cannot be used itself as ${bootdev}
2011-10-27 09:51:17 +02:00
if [[ "${FAIL_COMPLEX}" == "0" ]]; then
2012-04-22 20:06:54 +02:00
DEVS="$(findbootloaderdisks _)"
2012-01-09 13:54:09 +01:00
2012-04-22 20:06:54 +02:00
if [[ "${DEVS}" == "" ]]; then
DIALOG --msgbox "No hard drives were found" 0 0
return 1
fi
2012-04-22 20:06:54 +02:00
DIALOG --menu "Select the boot device where the GRUB2 bootloader will be installed." 14 55 7 ${DEVS} 2>${ANSWER} || return 1
bootdev=$(cat ${ANSWER})
else
DEVS="$(findbootloaderdisks _)"
2012-05-26 10:14:32 +02:00
## grub2-bios install to partition is not supported
# DEVS="${DEVS} $(findbootloaderpartitions _)"
2012-01-09 13:54:09 +01:00
2011-10-27 09:51:17 +02:00
if [[ "${DEVS}" == "" ]]; then
DIALOG --msgbox "No hard drives were found" 0 0
return 1
fi
2012-01-09 13:54:09 +01:00
2011-02-04 14:34:11 +01:00
DIALOG --menu "Select the boot device where the GRUB2 bootloader will be installed (usually the MBR and not a partition)." 14 55 7 ${DEVS} 2>${ANSWER} || return 1
bootdev=$(cat ${ANSWER})
fi
2012-04-23 15:17:42 +02:00
if [[ "$(${_BLKID} -p -i -o value -s PTTYPE ${bootdev})" == "gpt" ]]; then
2011-09-12 21:38:58 +02:00
CHECK_BIOS_BOOT_GRUB2="1"
CHECK_UEFISYS_PART=""
2011-10-07 15:41:32 +02:00
RUN_CGDISK=""
2011-11-16 20:09:05 +01:00
DISC="${bootdev}"
2011-09-12 21:38:58 +02:00
check_gpt
else
2011-10-27 09:51:17 +02:00
if [[ "${FAIL_COMPLEX}" == "0" ]]; then
DIALOG --defaultno --yesno "Warning:\nSetup detected no GUID (gpt) partition table.\n\nGrub2 has only space for approx. 30k core.img file. Depending on your setup, it might not fit into this gap and fail.\n\nDo you really want to install grub2 to a msdos partition table?" 0 0 || return 1
fi
fi
2011-10-27 09:51:17 +02:00
if [[ "${FAIL_COMPLEX}" == "1" ]]; then
2012-04-22 20:06:54 +02:00
DIALOG --msgbox "Error:\nGrub2 cannot boot from ${bootdev}, which contains /boot!\n\nPossible error sources:\n- encrypted devices are not supported" 0 0
return 1
fi
DIALOG --infobox "Installing the GRUB2 BIOS bootloader..." 0 0
# freeze and unfreeze xfs filesystems to enable grub2 installation on xfs filesystems
freeze_xfs
chroot_mount
2012-03-03 08:25:46 +01:00
chroot "${DESTDIR}" "/usr/sbin/grub-install" \
--directory="/usr/lib/grub/i386-pc" \
--target="i386-pc" \
--boot-directory="/boot" \
--recheck \
2012-03-26 09:25:29 +02:00
--debug \
"${bootdev}" &>"/tmp/grub2_bios_install.log"
2012-03-03 08:25:46 +01:00
chroot_umount
2012-01-09 13:54:09 +01:00
if [[ -e "${DESTDIR}/boot/grub/i386-pc/core.img" ]]; then
DIALOG --msgbox "GRUB2 BIOS has been successfully installed." 0 0
GRUB2_PREFIX_DIR="/boot/grub/"
GRUB2_BIOS="1"
dogrub2_config
GRUB2_BIOS=""
else
DIALOG --msgbox "Error installing GRUB2 BIOS.\nCheck /tmp/grub2_bios_install.log for more info.\n\nYou probably need to install it manually by chrooting into ${DESTDIR}.\nDon't forget to bind /dev and /proc into ${DESTDIR} before chrooting." 0 0
return 1
fi
2012-01-09 13:54:09 +01:00
}
2011-09-12 21:38:58 +02:00
dogrub2_uefi_common() {
dogrub2_common_before
DIALOG --msgbox "Installing grub2-efi-${UEFI_ARCH} now ..." 0 0
PACKAGES="grub2-efi-${UEFI_ARCH} grub2-common"
2012-01-09 13:54:09 +01:00
run_pacman
# reset PACKAGES after installing
PACKAGES=""
2011-09-12 21:38:58 +02:00
2012-01-09 13:54:09 +01:00
chroot_mount
2012-03-03 08:25:46 +01:00
chroot "${DESTDIR}" "/usr/sbin/grub-install" \
--directory="/usr/lib/grub/${UEFI_ARCH}-efi" \
--target="${UEFI_ARCH}-efi" \
2012-04-23 14:24:14 +02:00
--efi-directory="/boot/efi" \
--bootloader-id="arch_grub" \
--boot-directory="/boot" \
2012-03-26 09:25:29 +02:00
--recheck \
--debug &>"/tmp/grub2_uefi_${UEFI_ARCH}_install.log"
2012-01-09 13:54:09 +01:00
chroot_umount
mkdir -p "${DESTDIR}/boot/grub"
BOOT_PART_FS_UUID="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs_uuid" "${DESTDIR}/boot" 2>/dev/null)"
BOOT_PART_FS="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="fs" "${DESTDIR}/boot" 2>/dev/null)"
BOOT_PART_HINTS_STRING="$(LD_LIBRARY_PATH="${DESTDIR}/usr/lib:${DESTDIR}/lib" "${DESTDIR}/usr/sbin/grub-probe" --target="hints_string" "${DESTDIR}/boot" 2>/dev/null)"
2012-01-09 13:54:09 +01:00
[[ -e "${DESTDIR}/boot/grub/grub.cfg" ]] && mv "${DESTDIR}/boot/grub/grub.cfg" "${DESTDIR}/boot/grub/grub.cfg.save"
2012-01-09 13:54:09 +01:00
cat << EOF > "${DESTDIR}/boot/grub/grub.cfg"
2012-01-09 13:54:09 +01:00
insmod usbms
insmod usb_keyboard
insmod part_gpt
insmod part_msdos
insmod fat
insmod iso9660
insmod udf
insmod ${BOOT_PART_FS}
2012-01-09 13:54:09 +01:00
insmod ext2
insmod reiserfs
insmod ntfs
insmod hfsplus
2012-01-22 08:13:32 +01:00
insmod linux
insmod chain
search --fs-uuid --no-floppy --set=root ${BOOT_PART_HINTS_STRING} ${BOOT_PART_FS_UUID}
2012-01-09 13:54:09 +01:00
if [ -f "(\${root})/grub/grub.cfg" ]; then
set prefix="(\${root})/grub"
source "(\${root})/grub/grub.cfg"
else
if [ -f "(\${root})/boot/grub/grub.cfg" ]; then
set prefix="(\${root})/boot/grub"
source "(\${root})/boot/grub/grub.cfg"
fi
fi
2012-01-09 13:54:09 +01:00
EOF
cp -f "${DESTDIR}/boot/grub/grub.cfg" "${DESTDIR}/boot/efi/EFI/arch_grub/grub${SPEC_UEFI_ARCH}_standalone.cfg"
2012-01-09 13:54:09 +01:00
__WD="${PWD}/"
2012-01-09 13:54:09 +01:00
cd "${DESTDIR}/"
chroot_mount
2012-01-17 18:00:39 +01:00
chroot "${DESTDIR}" "/usr/bin/grub-mkstandalone" \
--directory="/usr/lib/grub/${UEFI_ARCH}-efi" \
--format="${UEFI_ARCH}-efi" \
--compression="xz" \
--output="/boot/efi/EFI/arch_grub/grub${SPEC_UEFI_ARCH}_standalone.efi" \
"boot/grub/grub.cfg" &>"/tmp/grub2_${UEFI_ARCH}_uefi_mkstandalone.log"
chroot_umount
2012-01-09 13:54:09 +01:00
cd "${__WD}/"
[[ -e "${DESTDIR}/boot/grub/grub.cfg.save" ]] && mv "${DESTDIR}/boot/grub/grub.cfg.save" "${DESTDIR}/boot/grub/grub.cfg"
2012-03-26 09:25:29 +02:00
cat "/tmp/grub2_uefi_${UEFI_ARCH}_install.log" >> "${LOG}"
2012-01-09 13:54:09 +01:00
if [[ -e "${DESTDIR}/boot/efi/EFI/arch_grub/grub${SPEC_UEFI_ARCH}.efi" ]] && [[ -e "${DESTDIR}/boot/grub/${UEFI_ARCH}-efi/core.efi" ]]; then
_BOOTMGR_LABEL="Arch Linux (GRUB2)"
_BOOTMGR_LOADER_DIR="arch_grub"
_BOOTMGR_LOADER_FILE="grub${SPEC_UEFI_ARCH}.efi"
do_uefi_bootmgr_setup
DIALOG --msgbox "GRUB2 UEFI ${UEFI_ARCH} has been successfully installed." 0 0
GRUB2_PREFIX_DIR="/boot/grub/"
GRUB2_UEFI="1"
dogrub2_config
GRUB2_UEFI=""
DIALOG --defaultno --yesno "Do you want to copy /boot/efi/EFI/arch_grub/grub${SPEC_UEFI_ARCH}.efi to /boot/efi/EFI/boot/boot${SPEC_UEFI_ARCH}.efi .\n\nThis might be needed in some systems where efibootmgr may not work due to firmware issues." 0 0 && _UEFISYS_EFI_BOOT_DIR="1"
if [[ "${_UEFISYS_EFI_BOOT_DIR}" == "1" ]]; then
mkdir -p "${DESTDIR}/boot/efi/EFI/boot"
rm -f "${DESTDIR}/boot/efi/EFI/boot/boot${SPEC_UEFI_ARCH}.efi"
cp -f "${DESTDIR}/boot/efi/EFI/arch_grub/grub${SPEC_UEFI_ARCH}.efi" "${DESTDIR}/boot/efi/EFI/boot/boot${SPEC_UEFI_ARCH}.efi"
fi
else
DIALOG --msgbox "Error installing GRUB2 UEFI ${UEFI_ARCH}.\nCheck /tmp/grub2_uefi_${UEFI_ARCH}_install.log for more info.\n\nYou probably need to install it manually by chrooting into ${DESTDIR}.\nDon't forget to bind /dev, /sys and /proc into ${DESTDIR} before chrooting." 0 0
return 1
fi
}
dogrub2_uefi_x86_64() {
do_uefi_x86_64
2011-09-12 21:38:58 +02:00
dogrub2_uefi_common
}
dogrub2_uefi_i386() {
do_uefi_i386
2011-09-12 21:38:58 +02:00
dogrub2_uefi_common
2010-02-21 17:10:58 +01:00
}
2012-01-09 13:54:09 +01:00
select_source() {
NEXTITEM="3"
2011-02-04 14:34:11 +01:00
if ! [[ "$(which ${DLPROG})" ]]; then
DIALOG --menu "Please select an installation source" 10 45 3 \
2011-02-04 14:34:11 +01:00
"1" "CD-ROM, USBSTICK or OTHER SOURCE" 2>${ANSWER} || return 1
else
DIALOG --menu "Please select an installation source" 10 45 3 \
"1" "CD-ROM, USBSTICK or OTHER SOURCE" \
2011-02-04 14:34:11 +01:00
"2" "FTP/HTTP" 2>${ANSWER} || return 1
fi
2011-02-04 14:34:11 +01:00
case $(cat ${ANSWER}) in
"1")
MODE="media"
;;
"2")
MODE="ftp"
;;
2009-02-11 12:03:41 +01:00
esac
2011-02-04 14:34:11 +01:00
if [[ "${MODE}" = "media" ]]; then
TITLE="Arch Linux CDROM, USBSTICK or OTHER SOURCE Installation"
2010-08-11 12:17:29 +02:00
getsource || return 1
else
DEFAULT=
TITLE="Arch Linux FTP/HTTP Installation"
while true; do
2011-02-04 14:34:11 +01:00
if [[ -n "${NEXTITEM}" ]]; then
DEFAULT="--default-item ${NEXTITEM}"
else
DEFAULT=""
fi
CANCEL=""
2011-02-04 14:34:11 +01:00
DIALOG ${DEFAULT} --menu "FTP Installation" 10 35 3 \
2010-09-27 20:05:27 +02:00
"0" "Set up Network" \
"1" "Choose Mirror" \
2011-02-04 14:34:11 +01:00
"2" "Return to Main Menu" 2>${ANSWER} || CANCEL="1"
2011-02-04 14:34:11 +01:00
case "$(cat ${ANSWER})" in
"0")
donetwork ;;
"1")
2010-08-11 12:17:29 +02:00
getsource || return 1
;;
*)
break ;;
esac
done
fi
2011-02-04 14:34:11 +01:00
if [[ "${CANCEL}" = "1" ]]; then
NEXTITEM="3"
else
NEXTITEM="4"
fi
2008-10-20 22:39:25 +02:00
}
2012-01-09 13:54:09 +01:00
set_clock() {
2011-02-03 21:54:43 +01:00
if [[ -e /usr/bin/tz ]]; then
tz --setup && NEXTITEM="2"
else
DIALOG --msgbox "Error:\ntz script not found, aborting clock setting" 0 0
fi
2008-10-20 22:39:25 +02:00
}
2012-01-09 13:54:09 +01:00
set_keyboard() {
2011-02-03 21:54:43 +01:00
if [[ -e /usr/bin/km ]]; then
km --setup && NEXTITEM="1"
else
DIALOG --msgbox "Error:\nkm script not found, aborting keyboard and console setting" 0 0
fi
2008-10-20 22:39:25 +02:00
}
# run_mkinitcpio()
# runs mkinitcpio on the target system, displays output
#
2012-01-09 13:54:09 +01:00
run_mkinitcpio() {
chroot_mount
# all mkinitcpio output goes to /tmp/mkinitcpio.log, which we tail into a dialog
( \
touch /tmp/setup-mkinitcpio-running
echo "Initramfs progress ..." > /tmp/initramfs.log; echo >> /tmp/mkinitcpio.log
2012-04-19 18:18:32 +02:00
chroot ${DESTDIR} /usr/bin/mkinitcpio -p ${KERNELPKG} >>/tmp/mkinitcpio.log 2>&1
echo >> /tmp/mkinitcpio.log
2009-02-11 12:03:41 +01:00
rm -f /tmp/setup-mkinitcpio-running
) &
2009-02-11 12:03:41 +01:00
sleep 2
2011-02-04 14:34:11 +01:00
dialog --backtitle "${TITLE}" --title "Rebuilding initramfs images ..." --no-kill --tailboxbg "/tmp/mkinitcpio.log" 18 70
2011-02-03 21:54:43 +01:00
while [[ -f /tmp/setup-mkinitcpio-running ]]; do
/bin/true
done
chroot_umount
}
2012-01-09 13:54:09 +01:00
prepare_harddrive() {
S_MKFSAUTO=0
S_MKFS=0
DONE=0
NEXTITEM=""
2011-02-04 14:34:11 +01:00
while [[ "${DONE}" = "0" ]]; do
if [[ -n "${NEXTITEM}" ]]; then
DEFAULT="--default-item ${NEXTITEM}"
else
DEFAULT=""
fi
CANCEL=""
2011-02-04 14:34:11 +01:00
dialog ${DEFAULT} --backtitle "${TITLE}" --menu "Prepare Hard Drive" 12 60 5 \
"1" "Auto-Prepare (erases the ENTIRE hard drive)" \
"2" "Partition Hard Drives" \
2009-04-17 22:29:31 +02:00
"3" "Create Software Raid, Lvm2 and Luks encryption" \
"4" "Set Filesystem Mountpoints" \
2011-02-04 14:34:11 +01:00
"5" "Return to Main Menu" 2>${ANSWER} || CANCEL="1"
NEXTITEM="$(cat ${ANSWER})"
[[ "${S_MKFSAUTO}" = "1" ]] && DONE=1
case $(cat ${ANSWER}) in
"1")
2009-02-11 12:03:41 +01:00
autoprepare
2011-02-04 14:34:11 +01:00
[[ "${S_MKFSAUTO}" = "1" ]] && DONE=1
;;
"2")
partition ;;
"3")
create_special ;;
"4")
2009-02-11 22:31:52 +01:00
PARTFINISH=""
ASK_MOUNTPOINTS="1"
mountpoints ;;
*)
DONE=1 ;;
esac
done
2011-02-04 14:34:11 +01:00
if [[ "${CANCEL}" = "1" ]]; then
NEXTITEM="2"
else
NEXTITEM="3"
fi
}
# menu for raid, lvm and encrypt
2012-01-09 13:54:09 +01:00
create_special() {
NEXTITEM=""
2009-02-14 18:51:13 +01:00
SPECIALDONE=0
2011-02-04 14:34:11 +01:00
while [[ "${SPECIALDONE}" = "0" ]]; do
if [[ -n "${NEXTITEM}" ]]; then
DEFAULT="--default-item ${NEXTITEM}"
else
DEFAULT=""
fi
CANCEL=""
2011-02-04 14:34:11 +01:00
dialog ${DEFAULT} --backtitle "${TITLE}" --menu "Create Software Raid, LVM2 and Luks encryption" 14 60 5 \
"1" "Create Software Raid" \
2009-04-17 22:29:31 +02:00
"2" "Create LVM2" \
"3" "Create Luks encryption" \
2011-02-04 14:34:11 +01:00
"4" "Return to Previous Menu" 2>${ANSWER} || CANCEL="1"
NEXTITEM="$(cat ${ANSWER})"
case $(cat ${ANSWER}) in
"1")
2009-02-11 22:31:52 +01:00
_createmd ;;
"2")
2009-02-11 22:31:52 +01:00
_createlvm ;;
"3")
2009-04-17 22:29:31 +02:00
_createluks ;;
*)
2009-02-14 18:51:13 +01:00
SPECIALDONE=1 ;;
esac
done
2011-02-04 14:34:11 +01:00
if [[ "${CANCEL}" = "1" ]]; then
NEXTITEM="3"
else
NEXTITEM="4"
fi
2008-10-20 22:39:25 +02:00
}
2009-04-17 22:29:31 +02:00
# menu for md creation
2012-01-09 13:54:09 +01:00
_createmd() {
2009-04-17 22:29:31 +02:00
NEXTITEM=""
MDDONE=0
2011-02-04 14:34:11 +01:00
while [[ "${MDDONE}" = "0" ]]; do
if [[ -n "${NEXTITEM}" ]]; then
DEFAULT="--default-item ${NEXTITEM}"
2009-04-17 22:29:31 +02:00
else
DEFAULT=""
fi
CANCEL=""
2011-02-04 14:34:11 +01:00
dialog ${DEFAULT} --backtitle "${TITLE}" --menu "Create Software Raid" 12 60 5 \
2009-04-17 22:29:31 +02:00
"1" "Raid Help" \
"2" "Reset Software Raid completely" \
"3" "Create Software Raid" \
"4" "Create Partitionable Software Raid" \
2011-02-04 14:34:11 +01:00
"5" "Return to Previous Menu" 2>${ANSWER} || CANCEL="1"
NEXTITEM="$(cat ${ANSWER})"
case $(cat ${ANSWER}) in
2009-04-17 22:29:31 +02:00
"1")
_helpraid ;;
"2")
_stopmd ;;
"3")
RAID_PARTITION=""
2009-04-17 22:29:31 +02:00
_raid ;;
"4")
RAID_PARTITION="1"
_raid ;;
2009-04-17 22:29:31 +02:00
*)
MDDONE=1 ;;
esac
done
2011-02-04 14:34:11 +01:00
if [[ "${CANCEL}" = "1" ]]; then
2009-04-17 22:29:31 +02:00
NEXTITEM="1"
else
NEXTITEM="4"
fi
}
# menu for lvm creation
2012-01-09 13:54:09 +01:00
_createlvm() {
NEXTITEM=""
LVMDONE=0
2011-02-04 14:34:11 +01:00
while [[ "${LVMDONE}" = "0" ]]; do
if [[ -n "${NEXTITEM}" ]]; then
DEFAULT="--default-item ${NEXTITEM}"
else
DEFAULT=""
fi
CANCEL=""
2011-02-04 14:34:11 +01:00
dialog ${DEFAULT} --backtitle "${TITLE}" --menu "Create physical volume, volume group or logical volume" 13 60 7 \
"1" "LVM Help" \
"2" "Reset Logical Volume completely" \
"3" "Create Physical Volume" \
"4" "Create Volume Group" \
"5" "Create Logical Volume" \
2011-02-04 14:34:11 +01:00
"6" "Return to Previous Menu" 2>${ANSWER} || CANCEL="1"
NEXTITEM="$(cat ${ANSWER})"
case $(cat ${ANSWER}) in
"1")
_helplvm ;;
"2")
_stoplvm ;;
"3")
_createpv ;;
"4")
_createvg ;;
"5")
_createlv ;;
*)
LVMDONE=1 ;;
esac
done
2011-02-04 14:34:11 +01:00
if [[ "${CANCEL}" = "1" ]]; then
NEXTITEM="2"
else
NEXTITEM="4"
fi
}
2009-04-17 22:29:31 +02:00
# menu for luks creation
2012-01-09 13:54:09 +01:00
_createluks() {
NEXTITEM=""
2009-04-17 22:29:31 +02:00
LUKSDONE=0
2011-02-04 14:34:11 +01:00
while [[ "${LUKSDONE}" = "0" ]]; do
if [[ -n "${NEXTITEM}" ]]; then
DEFAULT="--default-item ${NEXTITEM}"
else
DEFAULT=""
fi
CANCEL=""
2011-02-04 14:34:11 +01:00
dialog ${DEFAULT} --backtitle "${TITLE}" --menu "Create Luks Encryption" 12 60 5 \
2009-04-17 22:29:31 +02:00
"1" "Luks Help" \
"2" "Reset Luks Encryption completely" \
"3" "Create Luks" \
2011-02-04 14:34:11 +01:00
"4" "Return to Previous Menu" 2>${ANSWER} || CANCEL="1"
NEXTITEM="$(cat ${ANSWER})"
case $(cat ${ANSWER}) in
"1")
2009-04-17 22:29:31 +02:00
_helpluks ;;
"2")
2009-04-17 22:29:31 +02:00
_stopluks ;;
"3")
2009-04-17 22:29:31 +02:00
_luks ;;
*)
2009-04-17 22:29:31 +02:00
LUKSDONE=1 ;;
esac
done
2011-02-04 14:34:11 +01:00
if [[ "${CANCEL}" = "1" ]]; then
2009-04-17 22:29:31 +02:00
NEXTITEM="3"
else
NEXTITEM="4"
fi
}
2012-01-09 13:54:09 +01:00
auto_hwdetect() {
HWDETECT=""
FBPARAMETER=""
HWPARAMETER=""
HWDETECTMODULES=""
HWDETECTHOOKS=""
HWDETECTFILES=""
HWKVER==
DIALOG --yesno "PRECONFIGURATION?\n-----------------\n\nDo you want to use 'hwdetect' for:\n'/etc/mkinitcpio.conf'?\n\nThis ensures consistent ordering of your hard disk / usb controllers, network and sound devices.\n\nIt is recommended to say 'YES' here." 18 70 && HWDETECT="yes"
2011-02-04 14:34:11 +01:00
if [[ "${HWDETECT}" = "yes" ]]; then
# check on ide-legacy boot parameter
2011-02-04 14:34:11 +01:00
[[ "$(grep -w ide-legacy /proc/cmdline)" ]] && HWPARAMETER="${HWPARAMETER} --ide-legacy"
# check on used keymap
2011-02-04 14:34:11 +01:00
! [[ "$(grep '^KEYMAP="us"' ${DESTDIR}/etc/rc.conf)" ]] && HWPARAMETER="${HWPARAMETER} --keymap"
# check on usb input
2012-01-09 13:54:09 +01:00
[[ "$(lsmod | grep ^hid)" ]] && HWPARAMETER="${HWPARAMETER} --usbinput"
# check on framebuffer modules and kms
2011-02-04 14:34:11 +01:00
if [[ -e ${DESTDIR}/lib/initcpio/hooks/v86d && "$(grep -w uvesafb /proc/cmdline)" ]]; then
FBPARAMETER="--uvesafb"
HWDETECTFILES="/etc/modprobe.d/uvesafb.conf"
fi
[[ "$(grep "radeon" /etc/modprobe.d/modprobe.conf)" ]] && (FBPARAMETER="--ati-kms";HWDETECTFILES="/etc/modprobe.d/modprobe.conf")
[[ "$(grep "i915" /etc/modprobe.d/modprobe.conf)" ]] && (FBPARAMETER="--intel-kms";HWDETECTFILES="/etc/modprobe.d/modprobe.conf")
[[ "$(grep "nouveau" /etc/modprobe.d/modprobe.conf)" ]] && (FBPARAMETER="--nvidia-kms";HWDETECTFILES="/etc/modprobe.d/modprobe.conf")
2011-02-03 21:54:43 +01:00
[[ "$(grep -w fbmodule /proc/cmdline)" ]] && FBPARAMETER="--fbmodule"
2012-01-09 13:54:09 +01:00
if [[ "$(lsmod | grep ^usb_storage)" ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --defaultno --yesno "Setup detected usb storage driver...\nDo you need support for booting from usb devices?" 0 0 && HWPARAMETER="${HWPARAMETER} --usb"
fi
2012-01-09 13:54:09 +01:00
if [[ "$(lsmod | grep ^sbp2)" ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --defaultno --yesno "Setup detected firewire storage driver...\nDo you need support for booting from firewire devices?" 0 0 && HWPARAMETER="${HWPARAMETER} --fw"
fi
2012-01-09 13:54:09 +01:00
if [[ "$(lsmod | grep ^pcmcia)" ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --defaultno --yesno "Setup detected pcmcia hardware...\nDo you need support for booting from pcmcia devices?" 0 0 && HWPARAMETER="${HWPARAMETER} --pcmcia"
fi
2012-01-09 13:54:09 +01:00
if [[ "$(lsmod | grep ^nfs)" ]]; then
2011-02-04 14:34:11 +01:00
DIALOG --defaultno --yesno "Setup detected nfs driver...\nDo you need support for booting from nfs shares?" 0 0 && HWPARAMETER="${HWPARAMETER} --nfs"
fi
2011-02-04 14:34:11 +01:00
if [[ -e ${DESTDIR}/lib/initcpio/hooks/dmraid ]]; then
2011-02-03 21:54:43 +01:00
if ! [[ "$(dmraid -r | grep ^no )" ]]; then
2011-02-04 14:34:11 +01:00
HWPARAMETER="${HWPARAMETER} --dmraid"
fi
fi
# check for separate /usr partition
[[ $(mount | grep "${DESTDIR}/usr ") ]] && HWPARAMETER="${HWPARAMETER} --shutdown"
2011-08-07 23:32:01 +02:00
# add persistent net and sound options
HWPARAMETER="${HWPARAMETER} --net --sound"
2012-04-23 15:17:42 +02:00
[[ "$(${_BLKID} -p -i -o value -s TYPE ${PART_ROOT})" = "btrfs" ]] && HWPARAMETER="${HWPARAMETER} --btrfs"
read _ HWKVER < <(file -Lb "${DESTDIR}/boot/${VMLINUZ}" | grep -o 'version [^ ]\+')
HWDETECTMODULES="$(echo $(hwdetect --kernel_directory=${DESTDIR} --kernel_version=${HWKVER} ${FBPARAMETER} --hostcontroller --filesystem ${HWPARAMETER}) | sed -e 's#.*\" ##g')"
HWDETECTHOOKS="$(hwdetect --kernel_directory=${DESTDIR} --kernel_version=${HWKVER} --rootdevice=${PART_ROOT} --hooks-dir=${DESTDIR}/usr/lib/initcpio/install ${FBPARAMETER} ${HWPARAMETER} --hooks)"
2011-02-04 14:34:11 +01:00
[[ -n "${HWDETECTMODULES}" ]] && sed -i -e "s/^MODULES=.*/${HWDETECTMODULES}/g" ${DESTDIR}/etc/mkinitcpio.conf
[[ -n "${HWDETECTHOOKS}" ]] && sed -i -e "s/^HOOKS=.*/${HWDETECTHOOKS}/g" ${DESTDIR}/etc/mkinitcpio.conf
[[ -n "${HWDETECTFILES}" ]] && sed -i -e "s#^FILES=.*#FILES=\"${HWDETECTFILES}\"#g" ${DESTDIR}/etc/mkinitcpio.conf
2011-08-04 09:26:03 +02:00
# add persistent files
[[ -e "${DESTDIR}/etc/udev/rules.d/network_persistent.rules" ]] && rm ${DESTDIR}/etc/udev/rules.d/network_persistent.rules
[[ -s "/tmp/network_persistent.rules" ]] && cp /tmp/network_persistent.rules ${DESTDIR}/etc/udev/rules.d/network_persistent.rules
2011-08-07 23:32:01 +02:00
[[ -e "${DESTDIR}/etc/modprobe.d/sound_persistent.conf" ]] && rm ${DESTDIR}/etc/modprobe.d/sound_persistent.conf
[[ -s "/tmp/sound_persistent.conf" ]] && cp /tmp/sound_persistent.conf ${DESTDIR}/etc/modprobe.d/sound_persistent.conf
fi
2008-12-14 11:20:01 +01:00
}
2012-01-09 13:54:09 +01:00
auto_fb() {
UVESAFB=""
# clean modprobe.conf file from options first
sed -i -e '/options/d' ${DESTDIR}/etc/modprobe.d/modprobe.conf
grep ^[a-z] /etc/modprobe.d/modprobe.conf >> ${DESTDIR}/etc/modprobe.d/modprobe.conf
2011-02-04 14:34:11 +01:00
if [[ -e ${DESTDIR}/lib/initcpio/hooks/v86d && "$(grep -w uvesafb /proc/cmdline)" ]]; then
UVESAFB="$(grep ^[a-z] /etc/modprobe.d/uvesafb.conf)"
2011-02-04 14:34:11 +01:00
sed -i -e "s#options.*#${UVESAFB}#g" ${DESTDIR}/etc/modprobe.d/uvesafb.conf
fi
}
2012-01-09 13:54:09 +01:00
auto_parameters() {
2012-06-01 18:51:20 +02:00
if [[ "${SYSTEMD}" = "1" ]]; then
if [[ ! -f ${DESTDIR}/etc/timezone ]]; then
: >${DESTDIR}/etc/timezone
if [[ -s /tmp/.timezone ]]; then
DIALOG --infobox "Setting the timezone: $(cat /tmp/.timezone | sed -e 's/\..*//g') in timezone ..." 0 0
echo $(cat /tmp/.timezone | sed -e 's/\..*//g') > ${DESTDIR}/etc/timezone
fi
fi
2012-06-02 14:58:38 +02:00
if [[ ! -f ${DESTDIR}/etc/vconsole.conf ]]; then
: >${DESTDIR}/etc/vconsole.conf
2012-06-01 18:51:20 +02:00
if [[ -s /tmp/.keymap ]]; then
2012-06-02 14:58:38 +02:00
DIALOG --infobox "Setting the keymap: $(cat /tmp/.keymap | sed -e 's/\..*//g') in vconsole.conf ..." 0 0
2012-06-02 16:05:18 +02:00
echo KEYMAP=$(cat /tmp/.keymap | sed -e 's/\..*//g') >> ${DESTDIR}/etc/vconsole.conf
2012-06-01 18:51:20 +02:00
fi
if [[ -s /tmp/.font ]]; then
2012-06-02 14:58:38 +02:00
DIALOG --infobox "Setting the consolefont: $(cat /tmp/.font | sed -e 's/\..*//g') in vconsole.conf ..." 0 0
echo FONT=$(cat /tmp/.font | sed -e 's/\..*//g') >> ${DESTDIR}/etc/vconsole.conf
2012-06-01 18:51:20 +02:00
fi
fi
else
2012-06-01 21:10:24 +02:00
if [[ -s /tmp/.keymap ]]; then/ ]]; then
2012-06-01 18:51:20 +02:00
DIALOG --infobox "Setting the keymap: $(cat /tmp/.keymap | sed -e 's/\..*//g') in rc.conf ..." 0 0
sed -i -e "s/^KEYMAP=.*/KEYMAP=\"$(cat /tmp/.keymap | sed -e 's/\..*//g')\"/g" ${DESTDIR}/etc/rc.conf
fi
if [[ -s /tmp/.font ]]; then
DIALOG --infobox "Setting the consolefont: $(cat /tmp/.font | sed -e 's/\..*//g') in rc.conf ..." 0 0
sed -i -e "s/^CONSOLEFONT=.*/CONSOLEFONT=\"$(cat /tmp/.font | sed -e 's/\..*//g')\"/g" ${DESTDIR}/etc/rc.conf
fi
if [[ -s /tmp/.hardwareclock ]]; then
DIALOG --infobox "Setting the hardwareclock: $(cat /tmp/.hardwareclock | sed -e 's/\..*//g') in rc.conf ..." 0 0
sed -i -e "s/^HARDWARECLOCK=.*/HARDWARECLOCK=\"$(cat /tmp/.hardwareclock | sed -e 's/\..*//g')\"/g" ${DESTDIR}/etc/rc.conf
fi
if [[ -s /tmp/.timezone ]]; then
DIALOG --infobox "Setting the timezone: $(cat /tmp/.timezone | sed -e 's/\..*//g') in rc.conf ..." 0 0
sed -i -e "s#^TIMEZONE=.*#TIMEZONE=\"$(cat /tmp/.timezone | sed -e 's/\..*//g')\"#g" ${DESTDIR}/etc/rc.conf
fi
fi
2008-12-14 11:20:01 +01:00
}
2012-01-09 13:54:09 +01:00
auto_luks() {
2011-02-06 22:12:44 +01:00
# remove root device from crypttab
2011-02-04 14:34:11 +01:00
if [[ -e /tmp/.crypttab && "$(grep -v '^#' ${DESTDIR}/etc/crypttab)" = "" ]]; then
2011-02-06 22:12:44 +01:00
# add to temp crypttab
2011-02-08 17:06:48 +01:00
sed -i -e "/^$(basename ${PART_ROOT}) /d" /tmp/.crypttab
2011-02-04 14:34:11 +01:00
cat /tmp/.crypttab >> ${DESTDIR}/etc/crypttab
2009-04-19 17:19:37 +02:00
fi
}
2012-01-09 13:54:09 +01:00
auto_timesetting() {
TIMEZONE=""
2012-06-01 18:51:20 +02:00
if [[ "${SYSTEMD}" = "1" ]]; then
TIMEZONE="$(cat ${DESTDIR}/etc/timezone)"
else
eval $(grep "^TIMEZONE" ${DESTDIR}/etc/rc.conf)
fi
2011-02-04 14:34:11 +01:00
if [[ "${TIMEZONE}" != "" && -e ${DESTDIR}/usr/share/zoneinfo/${TIMEZONE} ]]; then
cp ${DESTDIR}/usr/share/zoneinfo/${TIMEZONE} ${DESTDIR}/etc/localtime
cp ${DESTDIR}/usr/share/zoneinfo/${TIMEZONE} /etc/localtime
fi
2011-02-04 14:34:11 +01:00
if [[ ! -f ${DESTDIR}/var/lib/hwclock/adjtime ]]; then
echo "0.0 0 0.0" > ${DESTDIR}/var/lib/hwclock/adjtime
fi
2008-12-15 21:25:05 +01:00
}
2012-01-09 13:54:09 +01:00
auto_ftpmirror() {
# /etc/pacman.d/mirrorlist
# add installer-selected mirror to the top of the mirrorlist
2011-02-04 14:34:11 +01:00
if [[ "${MODE}" = "ftp" && "${SYNC_URL}" != "" ]]; then
SYNC_URL="${SYNC_URL}"
awk "BEGIN { printf(\"# Mirror used during installation\nServer = "${SYNC_URL}"\n\n\") } 1 " "${DESTDIR}/etc/pacman.d/mirrorlist" > /tmp/inst-mirrorlist
mv /tmp/inst-mirrorlist "${DESTDIR}/etc/pacman.d/mirrorlist"
fi
}
2012-06-01 21:07:27 +02:00
auto_systemd () {
if [[ "${SYSTEMD}" = "1" ]]; then
if [[ ! -f ${DESTDIR}/etc/hostname ]]; then
echo "myhostname" > ${DESTDIR}/etc/hostname
fi
if [[ ! -f ${DESTDIR}/etc/locale.conf ]]; then
2012-06-02 15:09:33 +02:00
echo "LANG=en_US.UTF-8" > ${DESTDIR}/etc/locale.conf
2012-06-01 21:07:27 +02:00
echo "LC_COLLATE=C" >> ${DESTDIR}/etc/locale.conf
fi
2012-06-01 21:10:24 +02:00
fi
2012-06-01 21:07:27 +02:00
}
2012-01-09 13:54:09 +01:00
configure_system() {
2011-06-10 16:57:49 +02:00
destdir_mounts || return 1
## PREPROCESSING ##
# only done on first invocation of configure_system and redone on canceled configure system
2011-02-04 14:34:11 +01:00
if [[ ${S_CONFIG} -eq 0 ]]; then
auto_ftpmirror
auto_network
auto_parameters
auto_fb
2012-06-01 21:07:27 +02:00
auto_systemd
auto_hwdetect
fi
## END PREPROCESS ##
geteditor || return 1
FILE=""
# main menu loop
while true; do
S_CONFIG=0
2011-02-04 14:34:11 +01:00
if [[ -n "${FILE}" ]]; then
DEFAULT="--default-item ${FILE}"
else
DEFAULT=""
fi
2012-06-01 18:51:20 +02:00
if [[ "${SYSTEMD}" = "1" ]]; then
DIALOG ${DEFAULT} --menu "Configuration" 23 80 18 \
"/etc/hostname" "System Hostname" \
"/etc/vconsole.conf" "Virtual Console" \
2012-06-01 21:07:27 +02:00
"/etc/locale.conf" "Locale Setting" \
2012-06-01 18:51:20 +02:00
"/etc/timezone" "Timezone Setting" \
"/etc/fstab" "Filesystem Mountpoints" \
"/etc/mkinitcpio.conf" "Initramfs Config" \
"/etc/modprobe.d/modprobe.conf" "Kernel Modules" \
"/etc/resolv.conf" "DNS Servers" \
"/etc/hosts" "Network Hosts" \
"/etc/locale.gen" "Glibc Locales" \
"/etc/pacman.d/mirrorlist" "Pacman Mirror List" \
"/etc/pacman.conf" "Pacman Config File" \
"Root-Password" "Set the root password" \
"Return" "Return to Main Menu" 2>${ANSWER} || break
else
DIALOG ${DEFAULT} --menu "Configuration" 20 80 15 \
"/etc/rc.conf" "System Config" \
"/etc/fstab" "Filesystem Mountpoints" \
"/etc/mkinitcpio.conf" "Initramfs Config" \
"/etc/modprobe.d/modprobe.conf" "Kernel Modules" \
"/etc/resolv.conf" "DNS Servers" \
"/etc/hosts" "Network Hosts" \
"/etc/locale.gen" "Glibc Locales" \
"/etc/pacman.d/mirrorlist" "Pacman Mirror List" \
"/etc/pacman.conf" "Pacman Config File" \
"Root-Password" "Set the root password" \
"Return" "Return to Main Menu" 2>${ANSWER} || break
fi
2011-02-04 14:34:11 +01:00
FILE="$(cat ${ANSWER})"
if [[ "${FILE}" = "Return" || -z "${FILE}" ]]; then # exit
S_CONFIG=1
break
2012-06-02 08:49:50 +02:00
elif [[ "${FILE}" = "/etc/rc.conf" || "${FILE}" = "/etc/hostname" ]]; then # non-file
# if user edited /etc/rc.conf, add the hostname to /etc/hosts if it's not already there.
# note that if the user edits rc.conf several times to change the hostname more then once,
# we will add them all to /etc/hosts. this is not perfect, but to avoid this, too much code would be required
# (feel free to prove me wrong :))
# we could maybe do this just once after the user is really done here, but then he doesn't get
# to see the updated file while being in this menu...
2012-06-02 08:49:50 +02:00
${EDITOR} ${DESTDIR}${FILE}
if [[ "${SYSTEMD}" = "1" ]]; then
HOSTNAME=$(cat ${DESTDIR}${FILE})
else
HOSTNAME=$(sed -n '/^HOSTNAME/s/HOSTNAME=//p' ${DESTDIR}${FILE} | sed 's/"//g')
fi
2011-02-04 14:34:11 +01:00
if ! [[ "$(grep '127\.0\.0\.1' ${DESTDIR}/etc/hosts | grep -q "${HOSTNAME}")" ]]; then
sed -i "s/127\.0\.0\.1.*/& ${HOSTNAME}/" ${DESTDIR}/etc/hosts
2012-06-02 08:49:50 +02:00
fi
2011-02-04 14:34:11 +01:00
elif [[ "${FILE}" = "/etc/mkinitcpio.conf" ]]; then # non-file
DIALOG --msgbox "The mkinitcpio.conf file controls which modules will be placed into the initramfs for your system's kernel.\n\n- Non US keymap users should add 'keymap' to HOOKS= array\n- USB keyboard users should add 'usbinput' to HOOKS= array\n- If you install under VMWARE add 'BusLogic' to MODULES= array\n- raid, lvm2, encrypt are not enabled by default\n- 2 or more disk controllers, please specify the correct module\n loading order in MODULES= array \n\nMost of you will not need to change anything in this file." 18 70
HOOK_ERROR=""
2011-02-04 14:34:11 +01:00
${EDITOR} ${DESTDIR}${FILE}
for i in $(cat ${DESTDIR}/etc/mkinitcpio.conf | grep ^HOOKS | sed -e 's/"//g' -e 's/HOOKS=//g'); do
2012-04-20 15:36:41 +02:00
[[ -e ${DESTDIR}/usr/lib/initcpio/install/${i} ]] || HOOK_ERROR=1
done
2011-02-04 14:34:11 +01:00
if [[ "${HOOK_ERROR}" = "1" ]]; then
DIALOG --msgbox "ERROR: Detected error in 'HOOKS=' line, please correct HOOKS= in /etc/mkinitcpio.conf!" 18 70
fi
2011-02-04 14:34:11 +01:00
elif [[ "${FILE}" = "/etc/locale.gen" ]]; then # non-file
if [[ "${SYSTEMD}" = "1" ]]; then
# enable glibc locales from locale.conf
2012-06-02 16:12:59 +02:00
for i in $(grep "^LANG" ${DESTDIR}/etc/locale.conf | sed -e 's/.*=//g' -e's/\..*//g'); do
sed -i -e "s/^#${i}/${i}/g" ${DESTDIR}/etc/locale.gen
done
else
# enable glibc locales from rc.conf
for i in $(grep "^LOCALE" ${DESTDIR}/etc/rc.conf | sed -e 's/.*="//g' -e's/\..*//g'); do
sed -i -e "s/^#${i}/${i}/g" ${DESTDIR}/etc/locale.gen
done
fi
2011-02-04 14:34:11 +01:00
${EDITOR} ${DESTDIR}${FILE}
elif [[ "${FILE}" = "Root-Password" ]]; then # non-file
2009-04-19 00:02:34 +02:00
PASSWORD=""
2011-02-04 14:34:11 +01:00
while [[ "${PASSWORD}" = "" ]]; do
DIALOG --insecure --passwordbox "Enter root password:" 0 0 2>${ANSWER} || return 1
PASS=$(cat ${ANSWER})
DIALOG --insecure --passwordbox "Retype root password:" 0 0 2>${ANSWER} || return 1
PASS2=$(cat ${ANSWER})
if [[ "${PASS}" = "${PASS2}" ]]; then
PASSWORD=${PASS}
echo ${PASSWORD} > /tmp/.password
echo ${PASSWORD} >> /tmp/.password
2009-04-19 00:02:34 +02:00
PASSWORD=/tmp/.password
else
DIALOG --msgbox "Password didn't match, please enter again." 0 0
fi
done
2011-02-04 14:34:11 +01:00
chroot ${DESTDIR} passwd root < /tmp/.password
2009-04-19 00:02:34 +02:00
rm /tmp/.password
else #regular file
2011-02-04 14:34:11 +01:00
${EDITOR} ${DESTDIR}${FILE}
2009-02-11 12:03:41 +01:00
fi
done
2011-02-04 14:34:11 +01:00
if [[ ${S_CONFIG} -eq 1 ]]; then
# only done on normal exit of configure menu
## POSTPROCESSING ##
# adjust time
auto_timesetting
# /etc/initcpio.conf
run_mkinitcpio
# /etc/locale.gen
2011-02-04 14:34:11 +01:00
chroot ${DESTDIR} locale-gen >/dev/null 2>&1
## END POSTPROCESSING ##
NEXTITEM="7"
fi
2008-10-20 22:39:25 +02:00
}
install_bootloader_uefi_x86_64() {
DIALOG --menu "Which x86_64 UEFI bootloader would you like to use?" 13 55 2 \
2012-04-24 18:50:27 +02:00
"rEFInd_UEFI_x86_64" "rEFInd x86_64 (supports only x86_64 EFISTUB kernels)" \
"GRUB2_UEFI_x86_64" "GRUB2 x86_64 UEFI" 2>${ANSWER} || CANCEL=1
case $(cat ${ANSWER}) in
2012-04-24 18:50:27 +02:00
"rEFInd_UEFI_x86_64") dorefind_uefi_x86_64 ;;
"GRUB2_UEFI_x86_64") dogrub2_uefi_x86_64 ;;
esac
}
install_bootloader_uefi_i386() {
2012-04-24 18:50:27 +02:00
DIALOG --menu "Which i386 UEFI bootloader would you like to use?" 13 55 2 \
"rEFInd_UEFI_i386" "rEFInd i386 (supports only ix86 EFISTUB kernels)" \
"GRUB2_UEFI_i386" "GRUB2 i386 UEFI" 2>${ANSWER} || CANCEL=1
case $(cat ${ANSWER}) in
2012-04-24 18:50:27 +02:00
"rEFInd_UEFI_i386") dorefind_uefi_i386 ;;
"GRUB2_UEFI_i386") dogrub2_uefi_i386 ;;
esac
}
install_bootloader_bios() {
2012-04-20 16:07:05 +02:00
DIALOG --menu "Which BIOS bootloader would you like to use?" 11 50 4 \
2012-04-24 18:50:27 +02:00
"SYSLINUX_BIOS" "SYSLINUX/EXTLINUX" \
"GRUB2_BIOS" "GRUB2 BIOS" \
2012-04-24 18:50:27 +02:00
"GRUB_LEGACY_BIOS" "GRUB LEGACY" \
"LILO_BIOS" "LILO" 2>${ANSWER} || CANCEL=1
case $(cat ${ANSWER}) in
2012-04-24 18:50:27 +02:00
"SYSLINUX_BIOS") dosyslinux_bios ;;
"GRUB2_BIOS") dogrub2_bios ;;
2012-04-24 18:50:27 +02:00
"GRUB_LEGACY_BIOS") dogrub_legacy_bios ;;
"LILO_BIOS") dolilo_bios ;;
esac
}
2012-01-09 13:54:09 +01:00
install_bootloader() {
destdir_mounts || return 1
2012-01-21 09:43:36 +01:00
if [[ "${NAME_SCHEME_PARAMETER_RUN}" == "" ]]; then
set_device_name_scheme || return 1
fi
source_set || return 1
pacman_conf
prepare_pacman
CANCEL=""
2012-01-21 09:43:36 +01:00
[[ "$(grep UEFI_ARCH_x86_64 /proc/cmdline)" ]] && UEFI_x86_64="1"
[[ "${UEFI_x86_64}" == "1" ]] && DIALOG --yesno "Setup has detected that you are using x86_64 (64-bit) UEFI ...\nDo you like to install a x86_64 UEFI bootloader?" 0 0 && install_bootloader_uefi_x86_64
2012-04-20 16:07:05 +02:00
DIALOG --menu "What is your boot system type?" 10 40 3 \
"BIOS" "BIOS" \
"UEFI_x86_64" "x86_64 UEFI" \
2012-04-20 16:07:05 +02:00
"UEFI_i386" "i386 UEFI" 2>${ANSWER} || CANCEL=1
2011-02-04 14:34:11 +01:00
case $(cat ${ANSWER}) in
2012-04-20 16:07:05 +02:00
"BIOS") install_bootloader_bios ;;
"UEFI_x86_64") install_bootloader_uefi_x86_64 ;;
"UEFI_i386") install_bootloader_uefi_i386 ;;
esac
2011-02-04 14:34:11 +01:00
if [[ "${CANCEL}" = "1" ]]; then
NEXTITEM="7"
else
NEXTITEM="8"
fi
2008-10-20 22:39:25 +02:00
}
mainmenu() {
2011-02-04 14:34:11 +01:00
if [[ -n "${NEXTITEM}" ]]; then
DEFAULT="--default-item ${NEXTITEM}"
else
DEFAULT=""
fi
2011-02-04 14:34:11 +01:00
dialog ${DEFAULT} --backtitle "${TITLE}" --title " MAIN MENU " \
--menu "Use the UP and DOWN arrows to navigate menus.\nUse TAB to switch between buttons and ENTER to select." 17 58 13 \
"0" "Set Keyboard And Console Font" \
2010-09-28 11:27:06 +02:00
"1" "Set Time And Date" \
"2" "Prepare Hard Drive" \
"3" "Select Source" \
"4" "Select Packages" \
"5" "Install Packages" \
"6" "Configure System" \
"7" "Install Bootloader" \
2011-02-04 14:34:11 +01:00
"8" "Exit Install" 2>${ANSWER}
NEXTITEM="$(cat ${ANSWER})"
case $(cat ${ANSWER}) in
"0")
set_keyboard ;;
"1")
set_clock ;;
"2")
prepare_harddrive ;;
"3")
select_source ;;
"4")
select_packages ;;
"5")
2010-02-22 07:40:53 +01:00
install_packages ;;
"6")
configure_system ;;
"7")
install_bootloader ;;
"8")
2011-02-04 14:34:11 +01:00
if [[ "${S_SRC}" = "1" && "${MODE}" = "media" ]]; then
umount "${_MEDIA}" >/dev/null 2>&1
fi
2011-02-03 21:54:43 +01:00
[[ -e /tmp/.setup-running ]] && rm /tmp/.setup-running
clear
echo ""
echo "If the install finished successfully, you can now type 'reboot'"
echo "to restart the system."
echo ""
exit 0 ;;
*)
2011-02-03 21:54:43 +01:00
DIALOG --yesno "Abort Installation?" 6 40 && [[ -e /tmp/.setup-running ]] && rm /tmp/.setup-running && clear && exit 0
;;
esac
2008-10-20 22:39:25 +02:00
}
#####################
## begin execution ##
2011-02-03 21:54:43 +01:00
if [[ -e /tmp/.setup-running ]]; then
echo "HINT:"
echo "setup already runs on a different console!"
echo "Please remove /tmp/.setup-running first to launch setup!"
exit 1
2009-02-11 12:03:41 +01:00
fi
2008-10-20 22:39:25 +02:00
: >/tmp/.setup-running
: >/tmp/.setup
DIALOG --msgbox "Welcome to the Arch Linux Installation program.\n\nThe install process is fairly straightforward, and you should run through the options in the order they are presented.\n\nIf you are unfamiliar with partitioning/making filesystems, you may want to consult some documentation before continuing.\n\nYou can view all output from commands by viewing your VC7 console (ALT-F7). ALT-F1 will bring you back here." 14 65
2008-10-20 22:39:25 +02:00
while true; do
mainmenu
2008-10-20 22:39:25 +02:00
done
clear
exit 0
2009-07-30 18:42:45 +02:00
# vim: set ts=4 sw=4 et: