Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
executable file 4964 lines (4298 sloc) 196 KB
#!/usr/bin/bash
INSTALLER_VERSION=2.0
CNCHI_VERSION=0.6.11
TEXTDOMAIN=cli_installer
# we rely on some output which is parsed in english!
#unset LANG
source /etc/antergos/functions
ANSWER="/tmp/.setup"
TITLE=$"Antergos Installation - v$INSTALLER_VERSION"
# use the first VT not dedicated to a running console
LOG="/dev/tty6"
# don't use /mnt because it's intended to mount other things there!
mkdir /install
DESTDIR="/install"
EDITOR=""
_BLKID="blkid -c /dev/null"
# name of kernel package
KERNELPKG="linux"
# name of the kernel image
VMLINUZ="vmlinuz-${KERNELPKG}"
# name of the initramfs filesystem
INITRAMFS="initramfs-${KERNELPKG}"
# detect systemd running
[[ "$(cat /proc/cmdline | grep -w init=/usr/bin/systemd)" ]] && SYSTEMD="0"
# abstract the common pacman args
PACMAN="powerpill --root ${DESTDIR} --config /tmp/pacman.conf --noconfirm --noprogressbar"
# downloader
DLPROG="wget"
PACKAGES=""
dialog --backtitle "${TITLE}" --aspect 15 --infobox $"Checking your connection..." 4 35
NETWORK_ALIVE=`ping -c1 google.com 2>&1 | grep unknown`
# destination of blockdevices in /sys
block="/sys/block"
# partitions
PART_ROOT=""
ROOTFS=""
# Localization parameters
LOCALE=$(get_country)
KEYMAP=$(get_keyboard)
KBLAYOUT=$(get_layout)
# Mylex DAC960 PCI RAID controller, Compaq Next Generation Drive Array,
# Compaq Intelligent Drive Array
EXTRA_CONTROLLER="rd cciss ida"
# 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
S_MKFSAUTO=0 # auto fs part/formatting
S_SELECT=0 # package selection
S_INSTALL=0 # package installation
S_CONFIG=0 # configuration editing
S_GRUB=0 # using grub(2)
# menu item tracker- autoselect the next item
NEXTITEM=""
# DIALOG()
# an el-cheapo dialog wrapper
#
# parameters: see dialog(1)
# returns: whatever dialog did
DIALOG() {
dialog --backtitle "${TITLE}" --aspect 15 "$@"
return $?
}
# DIALOG() taken from aif installer
# an el-cheapo dialog wrapper
#
# parameters: see dialog(1)
# returns: whatever dialog did
_checklist_dialog()
{
dialog --backtitle "$TITLE" --aspect 15 "$@" 3>&1 1>&2 2>&3 3>&-
}
# chroot_mount()
# prepares target system as a chroot
#
chroot_mount()
{
[[ -e "${DESTDIR}/sys" ]] || mkdir -m 555 "${DESTDIR}/sys"
[[ -e "${DESTDIR}/proc" ]] || mkdir -m 555 "${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"
chmod 555 "${DESTDIR}/sys"
chmod 555 "${DESTDIR}/proc"
}
# chroot_umount()
# tears down chroot in target system
#
chroot_umount()
{
umount "${DESTDIR}/proc"
umount "${DESTDIR}/sys"
umount "${DESTDIR}/dev"
}
getfstype()
{
echo "$(${_BLKID} -p -i -s TYPE -o value ${1})"
}
# getfsuuid()
# converts /dev devices to FSUUIDs
#
# parameters: device file
# outputs: FSUUID on success
# nothing on failure
# returns: nothing
getfsuuid()
{
echo "$(${_BLKID} -p -i -s UUID -o value ${1})"
}
# parameters: device file
# outputs: LABEL on success
# nothing on failure
# returns: nothing
getfslabel()
{
echo "$(${_BLKID} -p -i -s LABEL -o value ${1})"
}
getpartuuid()
{
echo "$(${_BLKID} -p -i -s PART_ENTRY_UUID -o value ${1})"
}
getpartlabel()
{
echo "$(${_BLKID} -p -i -s PART_ENTRY_NAME -o value ${1})"
}
# 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()
{
if [[ -e /usr/bin/dmraid ]]; then
DIALOG --infobox $"Activating dmraid arrays..." 0 0
/usr/bin/dmraid -ay -I -Z >/dev/null 2>&1
fi
}
# activate_lvm2
# activate lvm2 devices
activate_lvm2()
{
ACTIVATE_LVM2=""
if [[ -e /usr/bin/lvm ]]; then
OLD_LVM2_GROUPS=${LVM2_GROUPS}
OLD_LVM2_VOLUMES=${LVM2_VOLUMES}
DIALOG --infobox $"Scanning logical volumes..." 0 0
/usr/bin/lvm vgscan --ignorelockingfailure >/dev/null 2>&1
DIALOG --infobox $"Activating logical volumes..." 0 0
/usr/bin/lvm vgchange --ignorelockingfailure --ignoremonitoring -ay >/dev/null 2>&1
LVM2_GROUPS="$(vgs -o vg_name --noheading 2>/dev/null)"
LVM2_VOLUMES="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)"
[[ "${OLD_LVM2_GROUPS}" = "${LVM2_GROUPS}" && "${OLD_LVM2_GROUPS}" = "${LVM2_GROUPS}" ]] && ACTIVATE_LVM2="no"
fi
}
# activate_raid
# activate md devices
activate_raid()
{
ACTIVATE_RAID=""
if [[ -e /usr/bin/mdadm ]]; then
DIALOG --infobox $"Activating RAID arrays..." 0 0
/usr/bin/mdadm --assemble --scan >/dev/null 2>&1 || ACTIVATE_RAID="no"
fi
}
# activate_luks
# activate luks devices
activate_luks()
{
ACTIVATE_LUKS=""
if [[ -e /usr/bin/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
# skip already encrypted devices, device mapper!
OPEN_LUKS=""
for devpath in $(ls /dev/mapper 2>/dev/null | grep -v control); do
[[ "$(cryptsetup status ${devpath} | grep ${PART})" ]] && OPEN_LUKS="no"
done
if ! [[ "${OPEN_LUKS}" = "no" ]]; then
RUN_LUKS=""
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"
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()
{
ACTIVATE_RAID=""
ACTIVATE_LUKS=""
ACTIVATE_LVM2=""
activate_dmraid
while ! [[ "${ACTIVATE_LVM2}" = "no" && "${ACTIVATE_RAID}" = "no" && "${ACTIVATE_LUKS}" = "no" ]]; do
activate_raid
activate_lvm2
activate_luks
done
}
# destdir_mounts()
# check if PART_ROOT is set and if something is mounted on ${DESTDIR}
destdir_mounts(){
# Don't ask for filesystem and create new filesystems
ASK_MOUNTPOINTS=""
PART_ROOT=""
# 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
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}
fi
fi
fi
done
#scsi/sata devices, and virtio blockdevices (/dev/vd*)
for dev in $(ls ${block} 2>/dev/null | egrep '^[sv]d'); do
# virtio device doesn't have type file!
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}
fi
fi
fi
done
}
# lists additional linux blockdevices
additional_blockdevices() {
# Include additional controllers:
# Mylex DAC960 PCI RAID controller, Compaq Next Generation Drive Array,
# Compaq Intelligent Drive Array
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}
break
fi
done
done
done
# Include MMC devices
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}
break
fi
done
done
}
# lists additional linux blockdevices partitions
additional_blockdevices_partitions() {
# Mylex DAC960 PCI RAID controller, Compaq Next Generation Drive Array,
# Compaq Intelligent Drive Array
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
# $(cat /proc/mdstat 2>/dev/null | grep ${part})
#- part of lvm2 device
# $(${_BLKID} -p -i -o value -s TYPE /dev/${part} | grep "LVM2_member")
#- part of luks device
# $(${_BLKID} -p -i -o value -s TYPE /dev/${part} | grep "crypto_LUKS")
#- extended partition on device
# $(sfdisk -c /dev/${disk} $(echo ${part} | sed -e "s#${disk}\p##g" 2>/dev/null | grep "5")
#- bios_grub partitions
# $(echo ${part} | grep "[a-z]$(parted /dev/${disk} print | grep bios_grub | cut -d " " -f 2)$")
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
echo "/dev/${part}"
[[ "${1}" ]] && echo ${1}
fi
fi
done
done
done
# Include MMC devices
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
# $(cat /proc/mdstat 2>/dev/null | grep ${i})
#- part of lvm2 device
# $(${_BLKID} -p -i -o value -s TYPE /dev/${i} | grep "LVM2_member")
#- part of luks device
# $(${_BLKID} -p -i -o value -s TYPE /dev/${i} | grep "crypto_LUKS")
#- extended partition on device
# $(sfdisk -c /dev/${dev} $(echo ${i} | sed -e "s#${dev}\p##g" 2>/dev/null | grep "5")
#- bios_grub partitions
# $(echo ${i} | grep "[a-z]$(parted /dev/${dev} print | grep bios_grub | cut -d " " -f 2)$")
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
echo "/dev/${i}"
[[ "${1}" ]] && echo ${1}
fi
fi
done
done
}
# list none partitionable raid md devices
raid_devices() {
for devpath in $(ls ${block} 2>/dev/null | egrep '^md'); do
if ! [[ "$(ls ${block}/${devpath} 2>/dev/null | egrep ${devpath}p)" ]]; then
# exlude md partitions which are part of lvm or luks
if ! [[ "$(${_BLKID} -p -i /dev/${devpath} | grep "TYPE=\"LVM2_member\"")" || "$(${_BLKID} -p -i /dev/${devpath} | grep "TYPE=\"crypto_LUKS\"")" ]]; then
echo "/dev/${devpath}"
[[ "${1}" ]] && echo ${1}
fi
fi
done
}
# lists default linux partitionable raid devices
partitionable_raid_devices() {
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}
break
fi
done
done
}
# lists default linux partitionable raid devices
partitionable_raid_devices_partitions() {
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
if ! [[ "$(${_BLKID} -p -i /dev/${i} | grep "TYPE=\"LVM2_member\"")" || ! "$(${_BLKID} -p -i /dev/${i} | grep "TYPE=\"crypto_LUKS\"")" ]]; then
echo "/dev/${i}"
[[ "${1}" ]] && echo ${1}
fi
fi
done
done
}
# lists default linux dmraid devices
dmraid_devices() {
if [[ -d /dev/mapper ]]; then
for fakeraid in $(dmraid -s -c); do
if [[ "$(echo ${fakeraid} | grep '_')" ]]; then
echo "/dev/mapper/${fakeraid}"
[[ "${1}" ]] && echo ${1}
fi
done
fi
}
# check_dm_devices
# - remove part of encrypted devices
# - remove part of lvm
# - remove part ot raid
check_dm_devices() {
for devpath in $(ls /dev/mapper 2>/dev/null | grep -v control); do
k="$(${_BLKID} -p -i /dev/mapper/${devpath} 2>/dev/null | grep "TYPE=\"crypto_LUKS\"" | sed -e 's#:.*##g')"
partofcrypt="${partofcrypt} ${k}"
done
for devpath in $(ls /dev/mapper 2>/dev/null | grep -v control); do
k="$(${_BLKID} -p -i /dev/mapper/${devpath} 2>/dev/null | grep "TYPE=\"LVM2_member\"" | sed -e 's#:.*##g')"
partoflvm="${partoflvm} ${k}"
done
for devpath in $(ls /dev/mapper 2>/dev/null | grep -v control); do
k="$(${_BLKID} -p -i /dev/mapper/${devpath} 2>/dev/null | grep "TYPE=\"linux_raid_member\"" | sed -e 's#:.*##g')"
partofraid="${partofraid} ${k}"
done
}
# dm_devices
# - show device mapper devices
dm_devices() {
check_dm_devices
for i in $(dmraid -s -c); do
EXCLUDE_DMRAID=""
if [[ "$(echo ${i} | grep '_')" ]]; then
EXCLUDE_DMRAID="${EXCLUDE_DMRAID} -e ${i} "
fi
done
if [[ -d /dev/mapper ]]; then
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
if [[ -d /dev/mapper ]]; then
for fakeraid in $(dmraid -s -c); do
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
}
# do sanity checks on partitions, argument comes ${devpath} loop
default_partition_check() {
disk=$(basename ${devpath})
for part in $(ls ${block}/${disk} 2>/dev/null | egrep -v ^${disk}p | egrep ^${disk}); do
# exclude checks:
#- part of raid device
# $(cat /proc/mdstat 2>/dev/null | grep ${part})
#- part of lvm2 device
# $(${_BLKID} -p -i -o value -s TYPE /dev/${part} | grep "LVM2_member")
#- part of luks device
# $(${_BLKID} -p -i -o value -s TYPE /dev/${part} | grep "crypto_LUKS")
#- extended partition
# $(sfdisk -c /dev/${disk} $(echo ${part} | sed -e "s#${disk}##g") 2>/dev/null | grep "5")
#- extended partition on raid partition device and mmc device
# $(sfdisk -c /dev/${disk} $(echo ${part} | sed -e "s#${disk}\p##g" 2>/dev/null | grep "5")
#- bios_grub partitions
# $(echo ${part} | grep "[a-z]$(parted /dev/${disk} print | grep bios_grub | cut -d " " -f 2)$")
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
if [[ -d ${block}/${disk}/${part} ]]; then
echo "/dev/${part}"
[[ "${1}" ]] && echo ${1}
fi
fi
done
}
finddisks() {
default_blockdevices ${1}
additional_blockdevices ${1}
dmraid_devices ${1}
partitionable_raid_devices ${1}
}
findpartitions() {
for devpath in $(finddisks); do
default_partition_check ${1}
done
additional_blockdevices_partitions ${1}
dm_devices ${1}
dmraid_partitions ${1}
raid_devices ${1}
partitionable_raid_devices_partitions ${1}
}
# don't check on raid devices!
findbootloaderdisks() {
if ! [[ "${USE_DMRAID}" = "1" ]]; then
default_blockdevices ${1}
additional_blockdevices ${1}
else
dmraid_devices ${1}
fi
}
# don't list raid devices, lvm2 and devicemapper!
findbootloaderpartitions() {
if ! [[ "${USE_DMRAID}" = "1" ]]; then
for devpath in $(findbootloaderdisks); do
default_partition_check ${1}
done
additional_blockdevices_partitions ${1}
else
dmraid_partitions ${1}
fi
}
# freeze and unfreeze xfs, as hack for grub(2) installing
freeze_xfs() {
sync
if [[ -x /usr/bin/xfs_freeze ]]; then
if [[ "$(cat /proc/mounts | grep "${DESTDIR}/boot " | grep " xfs ")" ]]; then
/usr/bin/xfs_freeze -f ${DESTDIR}/boot >/dev/null 2>&1
/usr/bin/xfs_freeze -u ${DESTDIR}/boot >/dev/null 2>&1
fi
if [[ "$(cat /proc/mounts | grep "${DESTDIR} " | grep " xfs ")" ]]; then
/usr/bin/xfs_freeze -f ${DESTDIR} >/dev/null 2>&1
/usr/bin/xfs_freeze -u ${DESTDIR} >/dev/null 2>&1
fi
fi
}
mapdev() {
partition_flag=0
device_found=0
# check if we use hd sd or vd device
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].*$##')
else
linuxdevice=$(echo ${1} | sed -e 's#[0-9].*$##g')
fi
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')
partition_flag=1
fi
else
if [[ "$(echo ${1} | egrep '[0-9]$')" ]]; then
# /dev/hdXY
pnum=$(echo ${1} | cut -b9-)
partition_flag=1
fi
fi
for dev in ${devs}; do
if [[ "(" = $(echo ${dev} | cut -b1) ]]; then
grubdevice="${dev}"
else
if [[ "${dev}" = "${linuxdevice}" ]]; then
device_found=1
break
fi
fi
done
if [[ "${device_found}" = "1" ]]; then
if [[ "${partition_flag}" = "0" ]]; then
echo "${grubdevice}"
else
grubdevice_stringlen=${#grubdevice}
grubdevice_stringlen=$((${grubdevice_stringlen} - 1))
grubdevice=$(echo ${grubdevice} | cut -b1-${grubdevice_stringlen})
echo "${grubdevice},${pnum})"
fi
else
echo "DEVICE NOT FOUND"
fi
}
printk()
{
case ${1} in
"on") echo 4 >/proc/sys/kernel/printk ;;
"off") echo 0 >/proc/sys/kernel/printk ;;
esac
}
getdest() {
[[ "${DESTDIR}" ]] && return 0
DIALOG --inputbox "Enter the destination directory where your target system is mounted" 8 65 "/install" 2>${ANSWER} || return 1
DESTDIR=$(cat ${ANSWER})
}
# geteditor()
# prompts the user to choose an editor
# sets EDITOR global variable
#
geteditor() {
if ! [[ "${EDITOR}" ]]; then
DIALOG --menu $"Select a Text Editor to Use" 10 35 3 \
"1" "nano (easier)" \
"2" "vi" 2>${ANSWER} || return 1
case $(cat ${ANSWER}) in
"1") EDITOR="nano" ;;
"2") EDITOR="vi" ;;
esac
fi
}
# 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>"
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})
NAME_SCHEME_PARAMETER_RUN="1"
}
# set GUID (gpt) usage
set_guid() {
## 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
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 GRUB(2) 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"
}
# 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
if [[ "$(echo "${i}" | grep '/dev/mapper')" ]]; then
# device mapper is always 512 aligned!
# only dmraid device can be here
echo -n "${i} : "; echo $(($(expr 512 '*' $(dmsetup status ${i} | cut -f2 -d " "))/1000000)) MB; echo "\n"
# special block devices
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
echo -n "${i} : "; echo $(($(expr $(cat ${block}/$(basename ${i})/queue/logical_block_size) '*' $(cat ${block}/$(basename ${i})/size))/1000000)) MB; echo "\n"
fi
done
}
# 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
_getavailpartitions()
{
for i in $(findpartitions); do
# mmc and raid partitions
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"
# special block devices
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"
# raid device
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"
# mapper devices
elif [[ "$(echo "${i}" | grep '/dev/mapper')" ]]; then
# mapper devices are always 512 aligned
# crypt device
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
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
echo -n "${i}: "; echo $(lvs -o lv_size --noheading --units m ${i} | sed -e 's#m##g') MB; echo "\n"
fi
else
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
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
_stopmd()
{
if [[ "$(cat /proc/mdstat 2>/dev/null | grep ^md)" ]]; then
DISABLEMD=""
DIALOG --defaultno --yesno $"Setup detected already running raid devices, do you want to disable them completely?" 0 0 && DISABLEMD="1"
if [[ "${DISABLEMD}" = "1" ]]; then
DIALOG --infobox $"Disabling all software raid devices..." 0 0
for i in $(cat /proc/mdstat 2>/dev/null | grep ^md | sed -e 's# :.*##g'); do
mdadm --manage --stop /dev/${i} > ${LOG}
done
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
mdadm --zero-superblock ${i} > ${LOG}
done
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"
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
mdadm --zero-superblock ${i} > ${LOG}
done
fi
fi
}
# Disable all lvm devices
_stoplvm()
{
DISABLELVM=""
DETECTED_LVM=""
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)"
! [[ "${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
if [[ "${DISABLELVM}" = "1" ]]; then
DIALOG --infobox $"Removing logical volumes ..." 0 0
for i in ${LV_VOLUMES}; do
lvremove -f /dev/mapper/${i} 2>/dev/null> ${LOG}
done
DIALOG --infobox $"Removing logical groups ..." 0 0
for i in ${LV_GROUPS}; do
vgremove -f ${i} 2>/dev/null > ${LOG}
done
DIALOG --infobox $"Removing physical volumes ..." 0 0
for i in ${LV_PHYSICAL}; do
pvremove -f ${i} 2>/dev/null > ${LOG}
done
fi
}
# Disable all luks encrypted devices
_stopluks()
{
DISABLELUKS=""
DETECTED_LUKS=""
LUKSDEVICE=""
# detect already running luks devices
LUKS_DEVICES="$(ls /dev/mapper/ | grep -v control)"
for i in ${LUKS_DEVICES}; do
cryptsetup status ${i} 2>/dev/null && LUKSDEVICE="${LUKSDEVICE} ${i}"
done
! [[ "${LUKSDEVICE}" = "" ]] && DETECTED_LUKS=1
if [[ "${DETECTED_LUKS}" = "1" ]]; then
DIALOG --defaultno --yesno $"Setup detected running luks encrypted devices, do you want to remove them completely?" 0 0 && DISABLELUKS="1"
fi
if [[ "${DISABLELUKS}" = "1" ]]; then
DIALOG --infobox $"Removing luks encrypted devices ..." 0 0
for i in ${LUKSDEVICE}; do
LUKS_REAL_DEVICE="$(echo $(cryptsetup status ${i} | grep device: | sed -e 's#device:##g'))"
cryptsetup remove ${i} > ${LOG}
# delete header from device
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
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
# delete header from device
dd if=/dev/zero of=${i} bs=512 count=2048 >/dev/null 2>&1
done
fi
[[ -e /tmp/.crypttab ]] && rm /tmp/.crypttab
}
#_dmraid_update
_dmraid_update()
{
DIALOG --infobox $"Deactivating dmraid devices ..." 0 0
dmraid -an >/dev/null 2>&1
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"
if [[ "${RESETDM}" = "1" ]]; then
DIALOG --infobox $"Resetting devicemapper devices ..." 0 0
dmsetup remove_all >/dev/null 2>&1
fi
else
DIALOG --infobox $"Resetting devicemapper devices ..." 0 0
dmsetup remove_all >/dev/null 2>&1
fi
DIALOG --infobox $"Reactivating dmraid devices ..." 0 0
dmraid -ay -Z >/dev/null 2>&1
}
#helpbox for raid
_helpraid()
{
DIALOG --msgbox $"LINUX SOFTWARE RAID SUMMARY:\n
-----------------------------\n\n
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
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
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
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
Thus, if any two disks fail, all data stay intact. But if 3 disks fail,\n
all data is lost.\n\n
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=""
while [[ "${MDFINISH}" != "DONE" ]]; do
activate_special_devices
: >/tmp/.raid
: >/tmp/.raid-spare
# check for devices
PARTS="$(findpartitions _)"
ALREADYINUSE=""
#hell yeah, this is complicated! kill software raid devices already in use.
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')
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")
fi
done
# skip encrypted mapper devices which contain raid devices
ALREADYINUSE=""
for i in $(ls /dev/mapper/* 2>/dev/null | grep -v control); do
cryptsetup status ${i} 2>/dev/null | grep -q "device:.*/dev/md" && ALREADYINUSE="${ALREADYINUSE} ${i}"
done
# skip lvm with raid devices
for devpath in $(pvs -o pv_name --noheading); do
# skip simple lvm device with raid device
if [[ "$(echo ${devpath} | grep /dev/md)" ]]; then
killvolumegroup="$(echo $(pvs -o vg_name --noheading ${devpath}))"
ALREADYINUSE="${ALREADYINUSE} $(ls /dev/mapper/${killvolumegroup}-*)"
fi
# skip encrypted raid device
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}-*)"
fi
fi
done
# skip already encrypted volume devices with raid device
for devpath in $(ls /dev/mapper/ 2>/dev/null | grep -v control); do
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}"
fi
fi
done
for i in ${ALREADYINUSE}; do
PARTS=$(echo ${PARTS} | sed -e "s#${i}\ _##g")
done
# break if all devices are in use
if [[ "${PARTS}" = "" ]]; then
DIALOG --msgbox $"All devices in use. No more devices left for new creation." 0 0
return 1
fi
# enter raid device name
RAIDDEVICE=""
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
fi
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
fi
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
RAIDLEVELS="linear - raid0 - raid1 - raid4 - raid5 - raid6 - raid10 -"
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=""
if [[ "${LEVEL}" = "raid5" || "${LEVEL}" = "raid6" || "${LEVEL}" = "raid10" ]]; then
PARITYLEVELS="left-asymmetric - left-symmetric - right-asymmetric - right-symmetric -"
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
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
PARTS="$(echo ${PARTS} | sed -e "s#${PART}\ _##g" -e 's#MISSING\ _##g' -e 's#SPARE\ _##g')"
# raid0 doesn't support missing devices
! [[ "${LEVEL}" = "raid0" || "${LEVEL}" = "linear" ]] && MDEXTRA="MISSING _"
# add more devices
DIALOG --menu $"Select additional device ${RAIDNUMBER}" 21 50 13 ${PARTS} ${MDEXTRA} DONE _ 2>${ANSWER} || return 1
PART=$(cat ${ANSWER})
SPARE=""
! [[ "${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
if [[ "${SPARE}" = "1" ]]; then
echo "${PART}" >>/tmp/.raid-spare
else
echo "${PART}" >>/tmp/.raid
fi
fi
done
# final step ask if everything is ok?
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()
{
DEVICES="$(echo -n $(cat /tmp/.raid))"
SPARES="$(echo -n $(cat /tmp/.raid-spare))"
# combine both if spares are available, spares at the end!
[[ -n ${SPARES} ]] && DEVICES="${DEVICES} ${SPARES}"
# get number of devices
RAID_DEVICES="$(cat /tmp/.raid | wc -l)"
SPARE_DEVICES="$(cat /tmp/.raid-spare | wc -l)"
# generate options for mdadm
RAIDOPTIONS="--force --run --level=${LEVEL}"
[[ "$(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
if [[ $? -gt 0 ]]; then
DIALOG --msgbox $"Error creating ${RAIDDEVICE} (see ${LOG} for details)." 0 0
return 1
fi
if [[ "$(echo ${RAIDDEVICE} | grep /md_d[0-9])" ]]; then
# switch for mbr usage
set_guid
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
parted ${RAIDDEVICE} print
parted ${RAIDDEVICE}
else
DISC=${RAIDDEVICE}
RUN_CGDISK="1"
CHECK_BIOS_BOOT_GRUB=""
CHECK_UEFISYS_PART=""
check_gpt
fi
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
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=""
while [[ "${PVFINISH}" != "DONE" ]]; do
activate_special_devices
: >/tmp/.pvs-create
PVDEVICE=""
PARTS="$(findpartitions _)"
ALREADYINUSE=""
# skip volume devices
for i in $(ls /dev/mapper/* | grep -v control); do
[[ "$(lvs ${i} 2>/dev/null)" ]] && ALREADYINUSE="${ALREADYINUSE} ${i}"
done
# skip already encrypted volume devices
for devpath in $(ls /dev/mapper/ 2>/dev/null | grep -v control); do
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}"
fi
done
# skip md devices, which already have lvm devices!
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
# check encrypted volume
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}"
# check on normal lvs
[[ "$(lvs /dev/mapper/$(cat ${k}/dm/name) 2>/dev/null)" ]] && ALREADYINUSE="${ALREADYINUSE} ${i}"
done
fi
done
# skip md partition devices, which already have lvm devices!
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
# check encrypted volume
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}"
# check on normal lvs
[[ "$(lvs /dev/mapper/$(cat ${k}/dm/name) 2>/dev/null)" ]] && ALREADYINUSE="${ALREADYINUSE} ${i}"
done
fi
done
for i in ${ALREADYINUSE}; do
PARTS=$(echo ${PARTS} | sed -e "s#${i}\ _##g")
done
# break if all devices are in use
if [[ "${PARTS}" = "" ]]; then
DIALOG --msgbox $"No devices left for physical volume creation." 0 0
return 1
fi
# show all devices with sizes
DIALOG --msgbox $"DISKS:\n$(_getavaildisks)\n\nPARTITIONS:\n$(_getavailpartitions)\n\n" 0 0
# select the first device to use
DEVNUMBER=1
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
PARTS="$(echo ${PARTS} | sed -e "s#${PART}\ _##g")"
# add more devices
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
DIALOG --infobox $"Creating physical volume on ${PART}..." 0 0
PART="$(echo -n $(cat /tmp/.pvs-create))"
pvcreate ${PART} >${LOG} 2>&1
if [[ $? -gt 0 ]]; then
DIALOG --msgbox $"Error creating physical volume on ${PART} (see ${LOG} for details)." 0 0
return 1
fi
}
#find physical volumes that are not in use
findpv()
{
for i in $(pvs -o pv_name --noheading);do
if [[ "$(pvs -o vg_name --noheading ${i})" = " " ]]; then
if [[ "$(echo ${i} | grep /dev/dm-)" ]]; then
for k in $(ls /dev/mapper | grep -v control); do
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}
fi
fi
done
else
echo "${i}"
[[ "${1}" ]] && echo ${1}
fi
fi
done
}
getavailablepv()
{
for i in "$(pvs -o pv_name,pv_size --noheading --units m)"; do
if [[ "$(echo ${i} | grep /dev/dm-)" ]]; then
for k in $(ls /dev/mapper | grep -v control); do
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#'
fi
fi
done
else
echo "${i}" | sed -e 's#$#\\n#'
fi
done
}
#find volume groups that are not already full in use
findvg()
{
for dev in $(vgs -o vg_name --noheading);do
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
if ! [[ "$(echo ${i} | grep " 0m$")" ]]; then
echo ${i} | sed -e 's#$#\\n#'
fi
done
}
# Creates volume group
_createvg()
{
VGFINISH=""
while [[ "${VGFINISH}" != "DONE" ]]; do
: >/tmp/.pvs
VGDEVICE=""
PVS=$(findpv _)
# break if all devices are in use
if [[ "${PVS}" = "" ]]; then
DIALOG --msgbox $"No devices left for Volume Group creation." 0 0
return 1
fi
# enter volume group name
VGDEVICE=""
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
DIALOG --msgbox $"ERROR: You have defined 2 identical Volume Group names! Please enter another name." 8 65
VGDEVICE=""
fi
done
# show all devices with sizes
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
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))
# clean loop from used partition and options
PVS="$(echo ${PVS} | sed -e "s#${PV}\ _##g")"
# add more devices
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
done
# final step ask if everything is ok?
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"
done
DIALOG --infobox $"Creating Volume Group ${VGDEVICE}..." 0 0
PV="$(echo -n $(cat /tmp/.pvs))"
vgcreate ${VGDEVICE} ${PV} >${LOG} 2>&1
if [[ $? -gt 0 ]]; then
DIALOG --msgbox $"Error creating Volume Group ${VGDEVICE} (see ${LOG} for details)." 0 0
return 1
fi
}
# Creates logical volume
_createlv()
{
LVFINISH=""
while [[ "${LVFINISH}" != "DONE" ]]; do
LVDEVICE=""
LV_SIZE_SET=""
LVS=$(findvg _)
# break if all devices are in use
if [[ "${LVS}" = "" ]]; then
DIALOG --msgbox $"No Volume Groups with free space available for Logical Volume creation." 0 0
return 1
fi
# 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
DIALOG --menu $"Select Volume Group" 21 50 13 ${LVS} 2>${ANSWER} || return 1
LV=$(cat ${ANSWER})
# enter logical volume name
LVDEVICE=""
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
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." 16 65 "" 2>${ANSWER} || return 1
LV_SIZE=$(cat ${ANSWER})
if [[ "${LV_SIZE}" = "" ]]; then
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
if [[ "${LV_SIZE}" = "0" ]]; then
DIALOG --msgbox $"ERROR: You have entered a invalid size, please enter again." 0 0
else
if [[ "${LV_SIZE}" -ge "$(vgs -o vg_free --noheading --units m | sed -e 's#m##g'| sed -e 's/\,/./g' | tr -d ' ')" ]]; 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=""
[[ "${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
[[ "${LV_SIZE}" = "" ]] && LV_SIZE="All free space left"
# final step ask if everything is ok?
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
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
lvcreate ${LV_EXTRA} -L ${LV_SIZE} ${LV} -n ${LVDEVICE} >${LOG} 2>&1
fi
if [[ $? -gt 0 ]]; then
DIALOG --msgbox $"Error creating Logical Volume ${LVDEVICE} (see ${LOG} for details)." 0 0
return 1
fi
}
# enter luks name
_enter_luks_name() {
LUKSDEVICE=""
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=""
while [[ "${LUKSPASSPHRASE}" = "" ]]; do
DIALOG --insecure --passwordbox $"Enter passphrase for luks encrypted device ${PART}:" 0 0 2>${ANSWER} || return 1
LUKSPASS=$(cat ${ANSWER})
DIALOG --insecure --passwordbox $"Retype passphrase for luks encrypted device ${PART}:" 0 0 2>${ANSWER} || return 1
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() {
DIALOG --infobox $"Opening encrypted ${PART}..." 0 0
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
LUKSPASSPHRASE="$(cat ${LUKSPASSPHRASE})"
DIALOG --yesno $"Would you like to save the passphrase of luks device in /etc/crypttab?\nName:${LUKSDEVICE}" 0 0 || LUKSPASSPHRASE="ASK"
echo ${LUKSDEVICE} ${PART} ${LUKSPASSPHRASE} >> /tmp/.crypttab
[[ -e /tmp/.passphrase ]] && rm /tmp/.passphrase
}
# 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
_luks()
{
NAME_SCHEME_PARAMETER_RUN=""
LUKSFINISH=""
while [[ "${LUKSFINISH}" != "DONE" ]]; do
activate_special_devices
PARTS="$(findpartitions _)"
ALREADYINUSE=""
# skip already encrypted devices, device mapper!
for devpath in $(ls /dev/mapper 2>/dev/null | grep -v control); do
[[ "$(cryptsetup status ${devpath})" ]] && ALREADYINUSE="${ALREADYINUSE} /dev/mapper/${devpath}"
done
# skip already encrypted devices, device mapper with encrypted parts!
for devpath in $(pvs -o pv_name --noheading); do
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}-*)"
fi
fi
# remove hidden crypt by md device
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}-*)"
fi
done
fi
fi
done
# skip md devices, which already has encrypted devices!
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}"
# check lvm devices if encryption was used!
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}"
done
fi
done
fi
done
# skip md partition devices, which already has encrypted devices!
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}"
# check lvm devices if encryption was used!
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}"
done
fi
done
fi
done
for i in ${ALREADYINUSE}; do
PARTS=$(echo ${PARTS} | sed -e "s#${i}\ _##g")
done
# break if all devices are in use
if [[ "${PARTS}" = "" ]]; then
DIALOG --msgbox $"No devices left for luks encryption." 0 0
return 1
fi
# show all devices with sizes
DIALOG --msgbox $"DISKS:\n$(_getavaildisks)\n\nPARTITIONS:\n$(_getavailpartitions)\n\n" 0 0
DIALOG --menu $"Select device for luks encryption" 21 50 13 ${PARTS} 2>${ANSWER} || return 1
PART=$(cat ${ANSWER})
# enter luks name
_enter_luks_name
### TODO: offer more options for encrypt!
# final step ask if everything is ok?
DIALOG --yesno $"Would you like to encrypt luks device below?\nName:${LUKSDEVICE}\nDevice:${PART}\n" 0 0 && LUKSFINISH="DONE"
done
_enter_luks_passphrase
DIALOG --infobox $"Encrypting ${PART}..." 0 0
cryptsetup -c aes-cbc-essiv:sha256 -s 128 luksFormat ${PART} >${LOG} <${LUKSPASSPHRASE}
_opening_luks
}
autoprepare() {
# check on encrypted devices, else weird things can happen!
_stopluks
# check on raid devices, else weird things can happen during partitioning!
_stopmd
# check on lvm devices, else weird things can happen during partitioning!
_stoplvm
NAME_SCHEME_PARAMETER_RUN=""
# switch for mbr usage
set_guid
DISCS=$(default_blockdevices)
if [[ "$(echo ${DISCS} | wc -w)" -gt 1 ]]; then
DIALOG --msgbox $"Available Disks:\n\n$(_getavaildisks)\n" 0 0
DIALOG --menu $"Select the hard drive to use" 14 55 7 $(default_blockdevices _) 2>${ANSWER} || return 1
DISC=$(cat ${ANSWER})
else
DISC=${DISCS}
fi
DEFAULTFS=""
BOOT_PART_SET=""
SWAP_PART_SET=""
ROOT_PART_SET=""
CHOSEN_FS=""
# get just the disk size in 1000*1000 MB
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))"
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
while [[ "${DEFAULTFS}" = "" ]]; do
FSOPTS=""
[[ "$(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"
[[ "$(which mkfs.btrfs 2>/dev/null)" ]] && FSOPTS="${FSOPTS} btrfs Btrfs-(Experimental)"
[[ "$(which mkfs.nilfs2 2>/dev/null)" ]] && FSOPTS="${FSOPTS} nilfs2 Nilfs2-(Experimental)"
[[ "$(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 grub-bios GPT support
if [[ "${GUIDPARAMETER}" = "yes" ]]; then
GUID_PART_SIZE="2"
GPT_BIOS_GRUB_PART_SIZE="${GUID_PART_SIZE}"
UEFISYS_PART_SIZE="512"
else
GUID_PART_SIZE="0"
UEFISYS_PART_SIZE="0"
fi
DISC_SIZE=$((${DISC_SIZE}-${GUID_PART_SIZE}-${UEFISYS_PART_SIZE}))
while [[ "${BOOT_PART_SET}" = "" ]]; do
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
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
if [[ "${BOOT_PART_SIZE}" -ge "${DISC_SIZE}" || "${BOOT_PART_SIZE}" -lt "16" || "${SBOOT_PART_SIZE}" = "${DISC_SIZE}" ]]; then
DIALOG --msgbox $"ERROR: You have entered an invalid size, please enter again." 0 0
else
BOOT_PART_SET=1
fi
fi
done
DISC_SIZE=$((${DISC_SIZE}-${BOOT_PART_SIZE}))
SWAP_SIZE="256"
[[ "${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
SWAP_PART_SIZE=$(cat ${ANSWER})
if [[ "${SWAP_PART_SIZE}" = "" || "${SWAP_PART_SIZE}" = "0" ]]; then
DIALOG --msgbox $"ERROR: You have entered an invalid size, please enter again." 0 0
else
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
DISC_SIZE=$((${DISC_SIZE}-${SWAP_PART_SIZE}))
ROOT_SIZE="7500"
[[ "${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
ROOT_PART_SIZE=$(cat ${ANSWER})
if [[ "${ROOT_PART_SIZE}" = "" || "${ROOT_PART_SIZE}" = "0" ]]; then
DIALOG --msgbox $"ERROR: You have entered an invalid size, please enter again." 0 0
else
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
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
DEFAULTFS=1
done
DIALOG --defaultno --yesno $"${DISC} will be COMPLETELY ERASED! Are you absolutely sure?" 0 0 \
|| return 1
DEVICE=${DISC}
# validate DEVICE
if [[ ! -b "${DEVICE}" ]]; then
DIALOG --msgbox $"Device '${DEVICE}' is not valid" 0 0
return 1
fi
# validate DEST
if [[ ! -d "${DESTDIR}" ]]; then
DIALOG --msgbox $"Destination directory '${DESTDIR}' is not valid" 0 0
return 1
fi
[[ -e /tmp/.fstab ]] && rm -f /tmp/.fstab
# disable swap and all mounted partitions, umount / last!
_umountall
if [[ "${NAME_SCHEME_PARAMETER_RUN}" == "" ]]; then
set_device_name_scheme || return 1
fi
# we assume a /dev/hdX format (or /dev/sdX)
if [[ "${GUIDPARAMETER}" == "yes" ]]; then
PART_ROOT="${DEVICE}5"
# GPT (GUID) is supported only by 'parted' or 'sgdisk'
printk off
DIALOG --infobox $"Partitioning ${DEVICE}" 0 0
# clean partition table to avoid issues!
sgdisk --zap ${DEVICE} &>/dev/null
# 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
# create actual partitions
sgdisk --set-alignment="2048" --new=1:1M:+${GPT_BIOS_GRUB_PART_SIZE}M --typecode=1:EF02 --change-name=1:BIOS_GRUB ${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:ANTERGOS_BOOT ${DEVICE} > ${LOG}
sgdisk --set-alignment="2048" --new=4:0:+${SWAP_PART_SIZE}M --typecode=4:8200 --change-name=4:ANTERGOS_SWAP ${DEVICE} > ${LOG}
sgdisk --set-alignment="2048" --new=5:0:+${ROOT_PART_SIZE}M --typecode=5:8300 --change-name=5:ANTERGOS_ROOT ${DEVICE} > ${LOG}
sgdisk --set-alignment="2048" --new=6:0:0 --typecode=6:8300 --change-name=6:ANTERGOS_HOME ${DEVICE} > ${LOG}
sgdisk --print ${DEVICE} > ${LOG}
else
PART_ROOT="${DEVICE}3"
# start at sector 1 for 4k drive compatibility and correct alignment
printk off
DIALOG --infobox $"Partitioning ${DEVICE}" 0 0
# clean partitiontable to avoid issues!
dd if=/dev/zero of=${DEVICE} bs=512 count=2048 >/dev/null 2>&1
wipefs -a ${DEVICE} &>/dev/null
# create DOS MBR with parted
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}
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}
fi
if [[ $? -gt 0 ]]; then
DIALOG --msgbox $"Error partitioning ${DEVICE} (see ${LOG} for details)" 0 0
printk on
return 1
fi
printk on
## wait until /dev initialized correct devices
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_ANTERGOS 1:/boot:${BOOT_PART_SIZE}:ext2::+:BOOT_ANTERGOS 4:/home:*:${FSTYPE}:::HOME_ANTERGOS 2:swap:${SWAP_PART_SIZE}:swap:::SWAP_ANTERGOS"
if [[ "${GUIDPARAMETER}" == "yes" ]]; then
FSSPECS="5:/:${ROOT_PART_SIZE}:${FSTYPE}:::ROOT_ANTERGOS 3:/boot:${BOOT_PART_SIZE}:ext2::+:BOOT_ANTERGOS 2:/boot/efi:512:vfat:-F32::ESP 6:/home:*:${FSTYPE}:::HOME_ANTERGOS 4:swap:${SWAP_PART_SIZE}:swap:::SWAP_ANTERGOS"
fi
## make and mount filesystems
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:)"
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}\nwith FSLABEL ${labelname} .\nMountpoint 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
}
check_gpt() {
GUID_DETECTED=""
[[ "$(${_BLKID} -p -i -o value -s PTTYPE ${DISC})" == "gpt" ]] && GUID_DETECTED="1"
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
if [[ "${GUID_DETECTED}" == "1" ]]; then
if [[ "${CHECK_UEFISYS_PART}" == "1" ]]; then
check_uefisyspart
fi
if [[ "${CHECK_BIOS_BOOT_GRUB}" == "1" ]]; then
if ! [[ "$(sgdisk -p ${DISC} | grep 'EF02')" ]]; then
DIALOG --msgbox $"Setup detected no BIOS BOOT PARTITION in ${DISC}. Please create a >=1 MB BIOS Boot partition for grub-bios GPT support." 0 0
RUN_CGDISK="1"
fi
fi
fi
if [[ "${RUN_CGDISK}" == "1" ]]; then
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
clear && cgdisk ${DISC}
fi
}
## 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
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}"
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}"
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"
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"
fi
umount "${DESTDIR}/boot/efi" &> /dev/null
umount "${UEFISYS_PART}" &> /dev/null
rm -rf "${DESTDIR}/boot/efi"
if [[ "${_FORMAT_UEFISYS_FAT32}" == "1" ]]; then
mkfs.vfat -F32 -n "ESP" "${UEFISYS_PART}"
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"
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
fi
}
partition() {
# disable swap and all mounted partitions, umount / last!
_umountall
# check on encrypted devices, else weird things can happen!
_stopluks
# check on raid devices, else weird things can happen during partitioning!
_stopmd
# check on lvm devices, else weird things can happen during partitioning!
_stoplvm
# update dmraid
_dmraid_update
# switch for mbr usage
set_guid
# Select disk to partition
DISCS=$(finddisks _)
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
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})
if [[ "${DISC}" == "OTHER" ]]; then
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
[[ "${DISC}" == "DONE" ]] && break
MSDOS_DETECTED=""
if ! [[ "${DISC}" == "" ]]; then
if [[ "${GUIDPARAMETER}" == "yes" ]]; then
CHECK_BIOS_BOOT_GRUB=""
CHECK_UEFISYS_PART=""
RUN_CGDISK="1"
check_gpt
else
[[ "$(${_BLKID} -p -i -o value -s PTTYPE ${DISC})" == "dos" ]] && MSDOS_DETECTED="1"
if [[ "${MSDOS_DETECTED}" == "" ]]; then
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!
dd if=/dev/zero of=${DEVICE} bs=512 count=2048 >/dev/null 2>&1
wipefs -a ${DEVICE} /dev/null 2>&1
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!
parted ${DISC} print
parted ${DISC}
fi
fi
done
# update dmraid
_dmraid_update
NEXTITEM="3"
S_PART=1
}
# scan and update btrfs devices
btrfs_scan() {
btrfs device scan >/dev/null 2>&1
}
# mount btrfs for checks
mount_btrfs() {
btrfs_scan
BTRFSMP="$(mktemp -d /tmp/brtfsmp.XXXX)"
mount ${PART} ${BTRFSMP}
}
# unmount btrfs after checks done
umount_btrfs() {
umount ${BTRFSMP}
rm -r ${BTRFSMP}
}
# Set BTRFS_DEVICES on detected btrfs devices
find_btrfs_raid_devices() {
btrfs_scan
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
}
find_btrfs_raid_bootloader_devices() {
btrfs_scan
BTRFS_COUNT=1
if [[ "$(${_BLKID} -p -i ${bootdev} -o value -s TYPE)" = "btrfs" ]]; then
BTRFS_DEVICES=""
for i in $(btrfs filesystem show ${bootdev} | cut -d " " -f 11); do
BTRFS_DEVICES="${BTRFS_DEVICES}#${i}"
BTRFS_COUNT=$((${BTRFS_COUNT}+1))
done
fi
}
# find btrfs subvolume
find_btrfs_subvolume() {
if [[ "${DETECT_CREATE_FILESYSTEM}" = "no" ]]; then
# existing btrfs subvolumes
mount_btrfs
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
if [[ "$(${_BLKID} -p -i ${bootdev} -o value -s TYPE)" = "btrfs" ]]; then
BTRFS_SUBVOLUMES=""
PART="${bootdev}"
mount_btrfs
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=""
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"
BTRFS_COMPRESSLEVELS="lzo - zlib -"
if [[ "${BTRFS_SUBVOLUME}" = "NONE" ]]; then
DIALOG --defaultno --yesno $"Would you like to compress the data on ${PART}?" 0 0 && BTRFS_COMPRESS="compress"
else
DIALOG --defaultno --yesno $"Would you like to compress the data on ${PART} subvolume=${BTRFS_SUBVOLUME}?" 0 0 && BTRFS_COMPRESS="compress"
fi
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"
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
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"
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!
[[ "$(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
btrfs_parts() {
if [[ -s /tmp/.btrfs-devices ]]; then
BTRFS_DEVICES=""
for i in $(cat /tmp/.btrfs-devices); do
BTRFS_DEVICES="${BTRFS_DEVICES}#${i}"
# remove device if no subvolume is used!
[[ "${BTRFS_SUBVOLUME}" = "NONE" ]] && PARTS="$(echo ${PARTS} | sed -e "s#${i}\ _##g")"
done
else
[[ "${BTRFS_SUBVOLUME}" = "NONE" ]] && PARTS="$(echo ${PARTS} | sed -e "s#${PART}\ _##g")"
fi
}
# choose raid level to use on btrfs device
btrfs_raid_level() {
BTRFS_RAIDLEVELS="NONE - raid0 - raid1 - raid5 - raid6 - raid10 - single -"
BTRFS_RAID_FINISH=""
BTRFS_LEVEL=""
BTRFS_DEVICE="${PART}"
: >/tmp/.btrfs-devices
DIALOG --msgbox "BTRFS RAID OPTIONS:\n\nBTRFS has options to control the raid configuration for data and metadata.\nValid choices are raid0, raid1, raid5, raid6, raid10 and single.\nsingle means that no duplication of metadata is done, which may be desired when using hardware raid.\nraid5 requires at least 3 devices.\nraid6 and raid10 requires at least 4 devices.\n\nIf you don't need this feature select NONE." 0 0
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
break
else
# take selected device as 1st device, add additional devices in part below.
select_btrfs_raid_devices
fi
done
}
# select btrfs raid devices
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!
: >/tmp/.btrfs-devices
BTRFS_PART="${BTRFS_DEVICE}"
BTRFS_PARTS="${PARTS}"
echo "${BTRFS_PART}" >>/tmp/.btrfs-devices
BTRFS_PARTS="$(echo ${BTRFS_PARTS} | sed -e "s#${BTRFS_PART}\ _##g")"
RAIDNUMBER=2
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
BTRFS_DONE=""
RAIDNUMBER=$((${RAIDNUMBER} + 1))
# RAID5 needs 3 devices
# RAID6, RAID10 need 4 devices!
[[ "${RAIDNUMBER}" -ge 3 && ! "${BTRFS_LEVEL}" = "raid10" && ! "${BTRFS_LEVEL}" = "raid6" && ! "${BTRFS_LEVEL}" = "raid5" ]] && BTRFS_DONE="DONE _"
[[ "${RAIDNUMBER}" -ge 4 && "${BTRFS_LEVEL}" = "raid5" ]] && BTRFS_DONE="DONE _"
[[ "${RAIDNUMBER}" -ge 5 && "${BTRFS_LEVEL}" = "raid10" || "${BTRFS_LEVEL}" = "raid6" ]] && BTRFS_DONE="DONE _"
# clean loop from used partition and options
BTRFS_PARTS="$(echo ${BTRFS_PARTS} | sed -e "s#${BTRFS_PART}\ _##g")"
# add more devices
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
done
# final step ask if everything is ok?
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"
}
# prepare new btrfs device
prepare_btrfs() {
btrfs_raid_level || return 1
prepare_btrfs_subvolume || return 1
}
# prepare btrfs subvolume
prepare_btrfs_subvolume() {
DOSUBVOLUME="no"
BTRFS_SUBVOLUME="NONE"
if [[ "${SKIP_ASK_SUBVOLUME}" = "no" ]]; then
DIALOG --defaultno --yesno $"Would you like to create a new subvolume on ${PART}?" 0 0 && DOSUBVOLUME="yes"
else
DOSUBVOLUME="yes"
fi
if [[ "${DOSUBVOLUME}" = "yes" ]]; then
BTRFS_SUBVOLUME="NONE"
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})
check_btrfs_subvolume
done
else
BTRFS_SUBVOLUME="NONE"
fi
}
# check btrfs subvolume
check_btrfs_subvolume(){
[[ "${DOMKFS}" = "yes" && "${FSTYPE}" = "btrfs" ]] && DETECT_CREATE_FILESYSTEM="yes"
if [[ "${DETECT_CREATE_FILESYSTEM}" = "no" ]]; then
mount_btrfs
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
BTRFS_SUBVOLUME="NONE"
fi
done
umount_btrfs
else
subvolumes_in_use
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
BTRFS_SUBVOLUME="NONE"
fi
fi
}
# create btrfs subvolume
create_btrfs_subvolume() {
mount_btrfs
btrfs subvolume create ${BTRFSMP}/${_btrfssubvolume} >${LOG}
# change permission from 700 to 755
# to avoid warnings during package installation
chmod 755 ${BTRFSMP}/${_btrfssubvolume}
umount_btrfs
}
# choose btrfs subvolume from list
choose_btrfs_subvolume () {
BTRFS_SUBVOLUME="NONE"
SUBVOLUMES_DETECTED="no"
SUBVOLUMES=$(find_btrfs_subvolume _)
# check if subvolumes are present
[[ -n "${SUBVOLUMES}" ]] && SUBVOLUMES_DETECTED="yes"
subvolumes_in_use
for i in ${SUBVOLUME_IN_USE}; do
SUBVOLUMES=$(echo ${SUBVOLUMES} | sed -e "s#${i}\ _##g")
done
if [[ -n "${SUBVOLUMES}" ]]; then
DIALOG --menu $"Select the subvolume to mount" 21 50 13 ${SUBVOLUMES} 2>${ANSWER} || return 1
BTRFS_SUBVOLUME=$(cat ${ANSWER})
else
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
fi
}
# boot on btrfs subvolume is not supported
check_btrfs_boot_subvolume() {
if [[ "${MP}" = "/boot" && "${FSTYPE}" = "btrfs" && ! "${BTRFS_SUBVOLUME}" = "NONE" ]]; then
DIALOG --msgbox $"ERROR: \n/boot on a btrfs subvolume is not supported by any bootloader yet!" 8 65
FILESYSTEM_FINISH="no"
fi
}
# btrfs subvolume menu
btrfs_subvolume() {
FILESYSTEM_FINISH=""
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
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() {
FILESYSTEM_FINISH=""
# don't allow vfat as / filesystem, it will not work!
# don't allow ntfs as / filesystem, this is stupid!
FSOPTS=""
[[ "$(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"
[[ "$(which mkfs.btrfs 2>/dev/null)" ]] && FSOPTS="${FSOPTS} btrfs Btrfs-(Experimental)"
[[ "$(which mkfs.nilfs2 2>/dev/null)" ]] && FSOPTS="${FSOPTS} nilfs2 Nilfs2-(Experimental)"
[[ "$(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() {
FILESYSTEM_FINISH=""
MP=""
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
check_mkfs_values() {
# Set values, to not confuse mkfs call!
[[ "${FS_OPTIONS}" = "" ]] && FS_OPTIONS="NONE"
[[ "${BTRFS_DEVICES}" = "" ]] && BTRFS_DEVICES="NONE"
[[ "${BTRFS_LEVEL}" = "" ]] && BTRFS_LEVEL="NONE"
[[ "${BTRFS_SUBVOLUME}" = "" ]] && BTRFS_SUBVOLUME="NONE"
[[ "${DOSUBVOLUME}" = "" ]] && DOSUBVOLUME="no"
[[ "${LABEL_NAME}" = "" && -n "$(${_BLKID} -p -i -o value -s LABEL ${PART})" ]] && LABEL_NAME="$(${_BLKID} -p -i -o value -s LABEL ${PART})"
[[ "${LABEL_NAME}" = "" ]] && LABEL_NAME="NONE"
}
create_filesystem() {
FILESYSTEM_FINISH=""
LABEL_NAME=""
FS_OPTIONS=""
BTRFS_DEVICES=""
BTRFS_LEVEL=""
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
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 \
"$(${_BLKID} -p -i -o value -s LABEL ${PART})" 2>${ANSWER} || return 1
LABEL_NAME=$(cat ${ANSWER})
if grep ":${LABEL_NAME}$" /tmp/.parts; then
DIALOG --msgbox $"ERROR: You have defined 2 identical LABEL names! Please enter another name." 8 65
LABEL_NAME=""
fi
done
if [[ "${FSTYPE}" = "btrfs" ]]; then
prepare_btrfs || return 1
btrfs_compress
btrfs_ssd
fi
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})
fi
FILESYSTEM_FINISH="yes"
}
mountpoints() {
NAME_SCHEME_PARAMETER_RUN=""
while [[ "${PARTFINISH}" != "DONE" ]]; do
activate_special_devices
: >/tmp/.device-names
: >/tmp/.fstab
: >/tmp/.parts
#
# Select mountpoints
#
DIALOG --msgbox $"Available partitions:\n\n$(_getavailpartitions)\n" 0 0
PARTS=$(findpartitions _)
DO_SWAP=""
while [[ "${DO_SWAP}" != "DONE" ]]; do
FSTYPE="swap"
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
DOMKFS="no"
if [[ "${ASK_MOUNTPOINTS}" = "1" ]]; then
create_filesystem
else
FILESYSTEM_FINISH="yes"
fi
else
FILESYSTEM_FINISH="yes"
fi
[[ "${FILESYSTEM_FINISH}" = "yes" ]] && DO_SWAP=DONE
done
check_mkfs_values
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
DO_ROOT=""
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}
# Select root filesystem type
FSTYPE="$(${_BLKID} -p -i -o value -s TYPE ${PART})"
DOMKFS="no"
# clear values first!
clear_btrfs_values
check_btrfs_filesystem_creation
if [[ "${ASK_MOUNTPOINTS}" = "1" && "${SKIP_FILESYSTEM}" = "no" ]]; then
select_filesystem && create_filesystem && btrfs_subvolume
else
btrfs_subvolume
fi
[[ "${FILESYSTEM_FINISH}" = "yes" ]] && DO_ROOT=DONE
done
find_btrfs_raid_devices
btrfs_parts
check_mkfs_values
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
#
while [[ "${PART}" != "DONE" ]]; do
DO_ADDITIONAL=""
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
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
if [[ "${ASK_MOUNTPOINTS}" = "1" && "${SKIP_FILESYSTEM}" = "no" ]]; then
enter_mountpoint && select_filesystem && create_filesystem && btrfs_subvolume
else
enter_mountpoint
btrfs_subvolume
fi
check_btrfs_boot_subvolume
else
FILESYSTEM_FINISH="yes"
fi
[[ "${FILESYSTEM_FINISH}" = "yes" ]] && DO_ADDITIONAL="DONE"
done
if [[ "${PART}" != "DONE" ]]; then
find_btrfs_raid_devices
btrfs_parts
check_mkfs_values
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
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
if [[ "${NAME_SCHEME_PARAMETER_RUN}" = "" ]]; then
set_device_name_scheme || return 1
fi
for line in $(cat /tmp/.parts); do
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
DIALOG --infobox $"Creating ${FSTYPE} on ${PART},\nmounting to ${DESTDIR}${MP}" 0 0
fi
_mkfs yes ${PART} ${FSTYPE} ${DESTDIR} ${MP} ${LABEL_NAME} ${FS_OPTIONS} ${BTRFS_DEVICES} ${BTRFS_LEVEL} ${BTRFS_SUBVOLUME} ${DOSUBVOLUME} ${BTRFS_COMPRESS} ${BTRFS_SSD} || return 1
else
if [[ "${FSTYPE}" = "swap" ]]; then
DIALOG --infobox $"Activating swapspace on ${PART}" 0 0
else
DIALOG --infobox $"Mounting ${FSTYPE} on ${PART} to ${DESTDIR}${MP}" 0 0
fi
_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="6"
S_MKFS=1
}
# _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() {
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}
local _btrfssubvolume=${10}
local _dosubvolume=${11}
local _btrfscompress=${12}
local _btrfsssd=${13}
# correct empty entries
[[ "${_fsoptions}" = "NONE" ]] && _fsoptions=""
[[ "${_btrfsssd}" = "NONE" ]] && _btrfsssd=""
[[ "${_btrfscompress}" = "NONE" ]] && _btrfscompress=""
[[ "${_btrfssubvolume}" = "NONE" ]] && _btrfssubvolume=""
# add btrfs raid level, if needed
[[ ! "${_btrfslevel}" = "NONE" && "${_fstype}" = "btrfs" ]] && _fsoptions="${_fsoptions} -d ${_btrfslevel}"
# we have two main cases: "swap" and everything else.
if [[ "${_fstype}" = "swap" ]]; then
swapoff ${_device} >/dev/null 2>&1
if [[ "${_domk}" = "yes" ]]; then
mkswap -L ${_labelname} ${_device} >${LOG} 2>&1
if [[ $? != 0 ]]; then
DIALOG --msgbox $"Error creating swap: mkswap ${_device}" 0 0
return 1
fi
fi
swapon ${_device} >${LOG} 2>&1
if [[ $? != 0 ]]; then
DIALOG --msgbox $"Error activating swap: swapon ${_device}" 0 0
return 1
fi
else
# make sure the fstype is one we can handle
local knownfs=0
for fs in xfs jfs reiserfs ext2 ext3 ext4 btrfs nilfs2 ntfs-3g vfat; do
[[ "${_fstype}" = "${fs}" ]] && knownfs=1 && break
done
if [[ ${knownfs} -eq 0 ]]; then
DIALOG --msgbox $"unknown fstype ${_fstype} for ${_device}" 0 0
return 1
fi
# if we were tasked to create the filesystem, do so
if [[ "${_domk}" = "yes" ]]; then
local ret
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=$? ;;
# don't handle anything else here, we will error later
esac
if [[ ${ret} != 0 ]]; then
DIALOG --msgbox $"Error creating filesystem ${_fstype} on ${_device}" 0 0
return 1
fi
sleep 2
fi
if [[ "${_fstype}" = "btrfs" && -n "${_btrfssubvolume}" && "${_dosubvolume}" = "yes" ]]; then
create_btrfs_subvolume
fi
btrfs_scan
sleep 2
# create our mount directory
mkdir -p ${_dest}${_mountpoint}
# prepare btrfs mount options
_btrfsmountoptions=""
[[ -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')"
# mount the bad boy
if [[ "${_fstype}" = "btrfs" && -n "${_btrfsmountoptions}" ]]; then
mount -t ${_fstype} -o ${_btrfsmountoptions} ${_device} ${_dest}${_mountpoint} >${LOG} 2>&1
else
mount -t ${_fstype} ${_device} ${_dest}${_mountpoint} >${LOG} 2>&1
fi
if [[ $? != 0 ]]; then
DIALOG --msgbox $"Error mounting ${_dest}${_mountpoint}" 0 0
return 1
fi
# change permission of base directories to correct permission
# to avoid btrfs issues
if [[ "${_mountpoint}" = "/tmp" ]]; then
chmod 1777 ${_dest}${_mountpoint}
elif [[ "${_mountpoint}" = "/root" ]]; then
chmod 750 ${_dest}${_mountpoint}
else
chmod 755 ${_dest}${_mountpoint}
fi
fi
# add to .device-names for config files
local _fsuuid="$(getfsuuid ${_device})"
local _fslabel="$(getfslabel ${_device})"
if [[ "${GUID_DETECTED}" == "1" ]]; then
local _partuuid="$(getpartuuid ${_device})"
local _partlabel="$(getpartlabel ${_device})"
echo "# DEVICE DETAILS: ${_device} PARTUUID=${_partuuid} PARTLABEL=${_partlabel} UUID=${_fsuuid} LABEL=${_fslabel}" >> /tmp/.device-names
else
echo "# DEVICE DETAILS: ${_device} UUID=${_fsuuid} LABEL=${_fslabel}" >> /tmp/.device-names
fi
# add to temp fstab
if [[ "${NAME_SCHEME_PARAMETER}" == "FSUUID" ]]; then
if [[ -n "${_fsuuid}" ]]; then
_device="UUID=${_fsuuid}"
fi
elif [[ "${NAME_SCHEME_PARAMETER}" == "FSLABEL" ]]; then
if [[ -n "${_fslabel}" ]]; then
_device="LABEL=${_fslabel}"
fi
else
if [[ "${GUID_DETECTED}" == "1" ]]; then
if [[ "${NAME_SCHEME_PARAMETER}" == "PARTUUID" ]]; then
if [[ -n "${_partuuid}" ]]; then
_device="PARTUUID=${_partuuid}"
fi
elif [[ "${NAME_SCHEME_PARAMETER}" == "PARTLABEL" ]]; then
if [[ -n "${_partlabel}" ]]; then
_device="PARTLABEL=${_partlabel}"
fi
fi
fi
fi
if [[ "${_fstype}" = "btrfs" && -n "${_btrfsmountoptions}" ]]; then
echo -n "${_device} ${_mountpoint} ${_fstype} defaults,${_btrfsmountoptions} 0 " >>/tmp/.fstab
else
echo -n "${_device} ${_mountpoint} ${_fstype} defaults 0 " >>/tmp/.fstab
fi
if [[ "${_fstype}" = "swap" ]]; then
echo "0" >>/tmp/.fstab
else
echo "1" >>/tmp/.fstab
fi
}
# pacman_conf()
# creates temporary pacman.conf file
pacman_conf() {
if [[ $(uname -m) = 'i686' ]];then
cat << EOF > /tmp/pacman.conf
[options]
Architecture = auto
SigLevel = PackageOptional
CacheDir = ${DESTDIR}/var/cache/pacman/pkg
CacheDir = /packages/core-$(uname -m)/pkg
CacheDir = /packages/core-any/pkg
[core]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
[extra]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
[community]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
###### Repos from www.antergos.com ######
[antergos]
SigLevel = PackageRequired
Include = /etc/pacman.d/antergos-mirrorlist
###### Repos from www.antergos.com ######
EOF
else
cat << EOF > /tmp/pacman.conf
[options]
Architecture = auto
SigLevel = PackageOptional
CacheDir = ${DESTDIR}/var/cache/pacman/pkg
CacheDir = /packages/core-$(uname -m)/pkg
CacheDir = /packages/core-any/pkg
[core]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
[extra]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
[community]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
[multilib]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
###### Repos from www.antergos.com ######
[antergos]
SigLevel = PackageRequired
Include = /etc/pacman.d/antergos-mirrorlist
###### Repos from www.antergos.com ######
EOF
fi
}
pacman_secinstall_conf() {
if [[ $(uname -m) = 'i686' ]];then
cat << EOF > /tmp/pacman.conf
[options]
Architecture = auto
SigLevel = PackageOptional
CacheDir = ${DESTDIR}/var/cache/pacman/pkg
CacheDir = /packages/core-$(uname -m)/pkg
CacheDir = /packages/core-any/pkg
###### Repos from www.antergos.com ######
[antergos-secinstall]
Include = /etc/pacman.d/antergos-mirrorlist
###### Repos from www.antergos.com ######
[core]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
[extra]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
[community]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
EOF
else
cat << EOF > /tmp/pacman.conf
[options]
Architecture = auto
SigLevel = PackageOptional
CacheDir = ${DESTDIR}/var/cache/pacman/pkg
CacheDir = /packages/core-$(uname -m)/pkg
CacheDir = /packages/core-any/pkg
###### Repos from www.antergos.com ######
[antergos-secinstall]
Include = /etc/pacman.d/antergos-mirrorlist
###### Repos from www.antergos.com ######
[core]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
[extra]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
[community]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
[multilib]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist
EOF
fi
}
# pacman needs a masterkey before checking signed packages
prepare_pacman_keychain() {
if ! [[ -d ${DESTDIR}/etc/pacman.d/gnupg ]]; then
cp -ar /etc/pacman.d/gnupg ${DESTDIR}/etc/pacman.d 2>&1
fi
}
# configures pacman and syncs db on destination system
# params: none
# returns: 1 on error
prepare_pacman() {
local _state_sync=''
local _arch=`uname -m`
local PACMAN_SYNC_LOG='/tmp/pacman-sync.log'
# Set up the necessary directories for pacman use
[[ ! -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"
prepare_pacman_keychain
while [[ "${_state_sync}" != 'complete' ]];do
DIALOG --infobox $"Refreshing package database..." 6 45
${PACMAN} -Sy >${LOG} 2>${PACMAN_SYNC_LOG} || return 1
if [[ $? -ne 0 ]]; then
DIALOG --msgbox $"Pacman preparation failed! Check ${LOG} for errors." 6 60
return 1
fi
if [[ `grep error ${PACMAN_SYNC_LOG}` ]];then
_state_sync='missing'
else
_state_sync='complete'
fi
done
return 0
}
# Set PACKAGES parameter before running to install wanted packages
run_pacman(){
local _result=''
local _check=''
# 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
while [[ "${_result}" != 'Installation Complete' ]];do
( \
echo "Installing Packages..." >/tmp/pacman.log ; \
echo >>/tmp/pacman.log ; \
touch /tmp/setup-pacman-running ; \
${PACMAN} -S ${PACKAGES} >>/tmp/pacman.log 2>&1 >> /tmp/pacman.log ; \
echo $? > /tmp/.pacman-retcode ; \