· 9 years ago · Jun 25, 2017, 07:10 AM
1# !/bin/bash
2#
3# Arch Base Installation Framework (version 1.3 - 08-Oct-2015)
4#
5# Written by Carl Duff for ArchBang Linux
6#
7# This program is free software, provided under the GNU General Public License
8# as published by the Free Software Foundation. So feel free to copy, distribute,
9# or modify it as you wish.
10#
11
12######################################################################
13## ##
14## Installer Variables ##
15## ##
16######################################################################
17
18# ISO Specific Variables
19ISO_HOST="mantos" # ISO Host Name
20ISO_USER="live" # Live user account
21VERSION="MantOS Installation Framework 1.0" # Installer Name / Version
22TRANS_SRC="/abif-master" # Dir where translation files are stored
23
24# Create a temporary file to store menu selections
25ANSWER="/tmp/.abif"
26
27# Installation
28BOOTLOADER="n/a" # Which bootloader has been installed?
29KEYMAP="us" # Virtual console keymap. Default is "us"
30XKBMAP="us" # X11 keyboard layout. Default is "us"
31ZONE="" # For time
32SUBZONE="" # For time
33LOCALE="en_US.UTF-8" # System locale. Default is "en_US.UTF-8"
34
35# Architecture
36ARCHI=`uname -m` # Display whether 32 or 64 bit system
37SYSTEM="Unknown" # Display whether system is BIOS or UEFI. Default is "unknown"
38ROOT_PART="" # ROOT partition
39UEFI_PART="" # UEFI partition
40UEFI_MOUNT="" # UEFI mountpoint
41INST_DEV="" # Device where system has been installed
42HIGHLIGHT=0 # Highlight items for Main Menu
43HIGHLIGHT_SUB=0 # Highlight items for submenus
44SUB_MENU="" # Submenu to be highlighted
45
46# Logical Volume Management
47LVM=0 # Logical Volume Management Detected?
48LUKS=0 # Luks Detected?
49LVM_ROOT=0 # LVM used for Root?
50LVM_SEP_BOOT=0 # 1 = Seperate /boot, 2 = seperate /boot & LVM
51LVM_DISABLE=0 # Option to allow user to deactive existing LVM
52LVM_VG="" # Name of volume group to create
53LVM_VG_MB=0 # MB remaining of VG
54LVM_LV_NAME="" # Name of LV to create
55LV_SIZE_INVALID=0 # Is LVM LV size entered valid?
56VG_SIZE_TYPE="" # Is VG in Gigabytes or Megabytes?
57
58# Installation
59MOUNTPOINT="/mnt" # Installation
60MOUNT_TYPE="" # "/dev/" for standard partitions, "/dev/mapper" for LVM
61AIROOTIMG="" # Root image to install
62BYPASS="$MOUNTPOINT/bypass/" # Root image mountpoint
63BTRFS=0 # BTRFS used? "1" = btrfs alone, "2" = btrfs + subvolume(s)
64BTRFS_OPTS="/tmp/.btrfs_opts" #BTRFS Mount options
65BTRFS_MNT="" # used for syslinux where /mnt is a btrfs subvolume
66
67# Language Support
68CURR_LOCALE="en_US.UTF-8" # Default Locale
69FONT="" # Set new font if necessary
70
71# Edit Files
72FILE="" # Which file is to be opened?
73FILE2="" # Which second file is to be opened?
74
75######################################################################
76## ##
77## Core Functions ##
78## ##
79######################################################################
80
81# Add locale on-the-fly and sets source translation file for installer
82select_language() {
83
84 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Select Language " --menu "\nLanguage / sprache / taal / sprÃ¥k / lingua / idioma / nyelv / lÃngua" 0 0 11 \
85 "1" $"English (en)" \
86 "2" $"Italian (it)" \
87 "3" $"Russian (ru)" \
88 "4" $"Turkish (tr)" \
89 "5" $"Dutch (nl)" \
90 "6" $"Greek (el)" \
91 "7" $"Danish (da)" \
92 "8" $"Hungarian (hu)" \
93 "9" $"Portuguese (pt)" \
94 "10" $"German (de)" \
95 "11" $"French (fr)" 2>${ANSWER}
96
97 case $(cat ${ANSWER}) in
98 "1") source ${TRANS_SRC}/english.trans
99 CURR_LOCALE="en_US.UTF-8"
100 ;;
101 "2") source ${TRANS_SRC}/italian.trans
102 CURR_LOCALE="it_IT.UTF-8"
103 ;;
104 "3") source ${TRANS_SRC}/russian.trans
105 CURR_LOCALE="ru_RU.UTF-8"
106 FONT="LatKaCyrHeb-14.psfu"
107 ;;
108 "4") source ${TRANS_SRC}/turkish.trans
109 CURR_LOCALE="tr_TR.UTF-8"
110 FONT="LatKaCyrHeb-14.psfu"
111 ;;
112 "5") source ${TRANS_SRC}/dutch.trans
113 CURR_LOCALE="nl_NL.UTF-8"
114 ;;
115 "6") source ${TRANS_SRC}/greek.trans
116 CURR_LOCALE="el_GR.UTF-8"
117 FONT="iso07u-16.psfu"
118 ;;
119 "7") source ${TRANS_SRC}/danish.trans
120 CURR_LOCALE="da_DK.UTF-8"
121 ;;
122 "8") source ${TRANS_SRC}/hungarian.trans
123 CURR_LOCALE="hu_HU.UTF-8"
124 FONT="lat2-16.psfu"
125 ;;
126 "9") source ${TRANS_SRC}/portuguese.trans
127 CURR_LOCALE="pt_BR.UTF-8"
128 ;;
129 "10") source ${TRANS_SRC}/german.trans
130 CURR_LOCALE="de_DE.UTF-8"
131 ;;
132 "11") source ${TRANS_SRC}/french.trans
133 CURR_LOCALE="fr_FR.UTF-8"
134 ;;
135 *) exit 0
136 ;;
137 esac
138
139 # Generate the chosen locale and set the language
140 sed -i "s/#${CURR_LOCALE}/${CURR_LOCALE}/" /etc/locale.gen
141 locale-gen >/dev/null 2>&1
142 export LANG=${CURR_LOCALE}
143}
144
145# Check user is root, then id system parameters
146check_system() {
147
148 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ChkTitle" --infobox "$_ChkBody" 0 0
149 sleep 2
150
151 # Ensure script is run as root. If not, terminate.
152 if [[ `whoami` != "root" ]]; then
153 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_RtFailTitle" --infobox "$_RtFailBody" 0 0
154 sleep 2
155 exit 1
156 fi
157
158 # Clear error log and detect system
159 echo "" > /tmp/.errlog
160
161 # Apple System Detection
162 if [[ "$(cat /sys/class/dmi/id/sys_vendor)" == 'Apple Inc.' ]] || [[ "$(cat /sys/class/dmi/id/sys_vendor)" == 'Apple Computer, Inc.' ]]; then
163 modprobe -r -q efivars || true # if MAC
164 else
165 modprobe -q efivarfs # all others
166 fi
167
168 # BIOS or UEFI Detection
169 if [[ -d "/sys/firmware/efi/" ]]; then
170 # Mount efivarfs if it is not already mounted
171 if [[ -z $(mount | grep /sys/firmware/efi/efivars) ]]; then
172 mount -t efivarfs efivarfs /sys/firmware/efi/efivars
173 fi
174 SYSTEM="UEFI"
175 else
176 SYSTEM="BIOS"
177 fi
178
179 # Encryption (LUKS) Detection
180 [[ $(lsblk -o TYPE | grep "crypt") == "" ]] && LUKS=0 || LUKS=1
181
182}
183
184# Chroot without terminating the script
185arch_chroot() {
186 arch-chroot $MOUNTPOINT /bin/bash -c "${1}"
187}
188
189# If there is an error, display it, clear the log and then go back to the main menu.
190check_for_error() {
191
192 if [[ $? -eq 1 ]] && [[ $(cat /tmp/.errlog | grep -i "error") != "" ]]; then
193 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ErrTitle" --msgbox "$(cat /tmp/.errlog)" 0 0
194 echo "" > /tmp/.errlog
195 main_menu
196 fi
197
198}
199
200# Ensure that a partition is mounted
201check_mount() {
202
203 if [[ $(lsblk -o MOUNTPOINT | grep ${MOUNTPOINT}) == "" ]]; then
204 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ErrTitle" --msgbox "$_ErrNoMount" 0 0
205 main_menu
206 fi
207
208}
209
210# Ensure that Arch has been installed
211check_base() {
212
213 if [[ ! -e ${MOUNTPOINT}/etc ]]; then
214 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ErrTitle" --msgbox "$_ErrNoBase" 0 0
215 main_menu_online
216 fi
217
218}
219
220# Show devices / partitions.
221show_devices() {
222 lsblk -o NAME,MODEL,TYPE,FSTYPE,SIZE,MOUNTPOINT | grep -v "loop" | grep -v "rom" | grep -v "arch_airootfs" > /tmp/.devlist
223 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_DevShowTitle" --textbox /tmp/.devlist 0 0
224}
225
226######################################################################
227## ##
228## Configuration Functions ##
229## ##
230######################################################################
231
232# virtual console keymap
233set_keymap() {
234
235 KEYMAPS=""
236 for i in $(ls -R /usr/share/kbd/keymaps | grep "map.gz" | sed 's/\.map.gz//g' | sort); do
237 KEYMAPS="${KEYMAPS} ${i} -"
238 done
239
240 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_KeymapTitle" \
241 --menu "$_KeymapBody" 20 40 16 ${KEYMAPS} 2>${ANSWER} || prep_menu
242 KEYMAP=$(cat ${ANSWER})
243 check_for_error
244 echo -e "KEYMAP=$KEYMAP\nFONT=$FONT" > /tmp/vconsole.conf
245 }
246
247# Set keymap for X11
248 set_xkbmap() {
249
250 XKBMAP_LIST=""
251 keymaps_xkb=("af_Afghani al_Albanian am_Armenian ara_Arabic at_German-Austria az_Azerbaijani ba_Bosnian bd_Bangla be_Belgian bg_Bulgarian br_Portuguese-Brazil bt_Dzongkha bw_Tswana by_Belarusian ca_French-Canada cd_French-DR-Congo ch_German-Switzerland cm_English-Cameroon cn_Chinese cz_Czech de_German dk_Danishee_Estonian epo_Esperanto es_Spanish et_Amharic fo_Faroese fi_Finnish fr_French gb_English-UK ge_Georgian gh_English-Ghana gn_French-Guinea gr_Greek hr_Croatian hu_Hungarian ie_Irish il_Hebrew iq_Iraqi ir_Persian is_Icelandic it_Italian jp_Japanese ke_Swahili-Kenya kg_Kyrgyz kh_Khmer-Cambodia kr_Korean kz_Kazakh la_Lao latam_Spanish-Lat-American lk_Sinhala-phonetic lt_Lithuanian lv_Latvian ma_Arabic-Morocco mao_Maori md_Moldavian me_Montenegrin mk_Macedonian ml_Bambara mm_Burmese mn_Mongolian mt_Maltese mv_Dhivehi ng_English-Nigeria nl_Dutch no_Norwegian np_Nepali ph_Filipino pk_Urdu-Pakistan pl_Polish pt_Portuguese ro_Romanian rs_Serbian ru_Russian se_Swedish si_Slovenian sk_Slovak sn_Wolof sy_Arabic-Syria th_Thai tj_Tajik tm_Turkmen tr_Turkish tw_Taiwanese tz_Swahili-Tanzania ua_Ukrainian us_English-US uz_Uzbek vn_Vietnamese za_English-S-Africa")
252
253 for i in ${keymaps_xkb}; do
254 XKBMAP_LIST="${XKBMAP_LIST} ${i} -"
255 done
256
257 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_XkbmapTitle" --menu "$_KeymapBody" 0 0 16 ${XKBMAP_LIST} 2>${ANSWER} || prep_menu
258 XKBMAP=$(cat ${ANSWER} |sed 's/_.*//')
259 echo -e "Section "\"InputClass"\"\nIdentifier "\"system-keyboard"\"\nMatchIsKeyboard "\"on"\"\nOption "\"XkbLayout"\" "\"${XKBMAP}"\"\nEndSection" > /tmp/01-keyboard-layout.conf
260 setxkbmap $XKBMAP 2>/tmp/.errlog
261 check_for_error
262}
263
264# Set the installed system's locale
265set_locale() {
266
267 LOCALES=""
268 for i in $(cat /etc/locale.gen | grep -v "# " | sed 's/#//g' | sed 's/ UTF-8//g' | grep .UTF-8); do
269 LOCALES="${LOCALES} ${i} -"
270 done
271
272 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LocateTitle" --menu "$_localeBody" 0 0 16 ${LOCALES} 2>${ANSWER} || config_base_menu
273 LOCALE=$(cat ${ANSWER})
274
275 echo "LANG=\"${LOCALE}\"" > ${MOUNTPOINT}/etc/locale.conf
276 sed -i "s/#${LOCALE}/${LOCALE}/" ${MOUNTPOINT}/etc/locale.gen 2>/tmp/.errlog
277 arch_chroot "locale-gen" >/dev/null 2>>/tmp/.errlog
278 check_for_error
279}
280
281# Set Zone and Sub-Zone
282set_timezone() {
283
284 ZONE=""
285 for i in $(cat /usr/share/zoneinfo/zone.tab | awk '{print $3}' | grep "/" | sed "s/\/.*//g" | sort -ud); do
286 ZONE="$ZONE ${i} -"
287 done
288
289 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_TimeZTitle" --menu "$_TimeZBody" 0 0 10 ${ZONE} 2>${ANSWER} || config_base_menu
290 ZONE=$(cat ${ANSWER})
291
292 SUBZONE=""
293 for i in $(cat /usr/share/zoneinfo/zone.tab | awk '{print $3}' | grep "${ZONE}/" | sed "s/${ZONE}\///g" | sort -ud); do
294 SUBZONE="$SUBZONE ${i} -"
295 done
296
297 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_TimeSubZTitle" --menu "$_TimeSubZBody" 0 0 11 ${SUBZONE} 2>${ANSWER} || config_base_menu
298 SUBZONE=$(cat ${ANSWER})
299
300 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --yesno "$_TimeZQ ${ZONE}/${SUBZONE} ?" 0 0
301
302 if [[ $? -eq 0 ]]; then
303 arch_chroot "ln -sf /usr/share/zoneinfo/${ZONE}/${SUBZONE} /etc/localtime" 2>/tmp/.errlog
304 check_for_error
305 else
306 config_base_menu
307 fi
308}
309
310set_hw_clock() {
311
312 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_HwCTitle" \
313 --menu "$_HwCBody" 0 0 2 \
314 "1" "$_HwCUTC" \
315 "2" "$_HwLocal" 2>${ANSWER}
316
317 case $(cat ${ANSWER}) in
318 "1") arch_chroot "hwclock --systohc --utc" 2>/tmp/.errlog
319 ;;
320 "2") arch_chroot "hwclock --systohc --localtime" 2>/tmp/.errlog
321 ;;
322 *) config_base_menu
323 ;;
324 esac
325
326 check_for_error
327}
328
329# Generate the installed system's FSTAB
330generate_fstab() {
331
332 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_FstabTitle" \
333 --menu "$_FstabBody" 0 0 3 \
334 "1" "$_FstabDev" \
335 "2" "$_FstabLabel" \
336 "3" "$_FstabUUID" 2>${ANSWER}
337
338 case $(cat ${ANSWER}) in
339 "1") genfstab -p ${MOUNTPOINT} >> ${MOUNTPOINT}/etc/fstab 2>/tmp/.errlog
340 ;;
341 "2") genfstab -L -p ${MOUNTPOINT} >> ${MOUNTPOINT}/etc/fstab 2>/tmp/.errlog
342 ;;
343 "3") if [[ $SYSTEM == "UEFI" ]]; then
344 genfstab -t PARTUUID -p ${MOUNTPOINT} >> ${MOUNTPOINT}/etc/fstab 2>/tmp/.errlog
345 else
346 genfstab -U -p ${MOUNTPOINT} >> ${MOUNTPOINT}/etc/fstab 2>/tmp/.errlog
347 fi
348 ;;
349 *) config_base_menu
350 ;;
351 esac
352
353 check_for_error
354
355 [[ -f ${MOUNTPOINT}/swapfile ]] && sed -i "s/\\${MOUNTPOINT}//" ${MOUNTPOINT}/etc/fstab
356
357}
358
359# Set the installed system's hostname
360set_hostname() {
361
362 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_HostNameTitle" --inputbox "$_HostNameBody" 0 0 "MantOS" 2>${ANSWER} || config_base_menu
363 HOST_NAME=$(cat ${ANSWER})
364
365 echo "$HOST_NAME" > ${MOUNTPOINT}/etc/hostname
366 sed -i "s/$ISO_HOST/$HOST_NAME/g" ${MOUNTPOINT}/etc/hosts
367}
368
369# Set the installed system's root password
370set_root_password() {
371
372 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassRtTitle" --clear --insecure --passwordbox "$_PassRtBody" 0 0 2> ${ANSWER} || config_base_menu
373 PASSWD=$(cat ${ANSWER})
374
375 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassRtTitle" --clear --insecure --passwordbox "$_PassRtBody2" 0 0 2> ${ANSWER} || config_base_menu
376 PASSWD2=$(cat ${ANSWER})
377
378 if [[ $PASSWD == $PASSWD2 ]]; then
379 echo -e "${PASSWD}\n${PASSWD}" > /tmp/.passwd
380 arch_chroot "passwd root" < /tmp/.passwd >/dev/null 2>/tmp/.errlog
381 rm /tmp/.passwd
382 check_for_error
383 else
384 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassRtErrTitle" --msgbox "$_PassRtErrBody" 0 0
385 set_root_password
386 fi
387
388}
389
390# Create new user(s) for installed system. First user is created by renaming the live account.
391# All others are brand new.
392create_new_user() {
393
394 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_NUsrTitle" --inputbox "$_NUsrBody" 0 0 "" 2>${ANSWER} || config_user_menu
395 USER=$(cat ${ANSWER})
396
397 # Loop while user name is blank, has spaces, or has capital letters in it.
398 while [[ ${#USER} -eq 0 ]] || [[ $USER =~ \ |\' ]] || [[ $USER =~ [^a-z0-9\ ] ]]; do
399 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_NUsrTitle" --inputbox "$_NUsrErrBody" 0 0 "" 2>${ANSWER} || config_user_menu
400 USER=$(cat ${ANSWER})
401 done
402
403 # Enter password. This step will only be reached where the loop has been skipped or broken.
404 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassNUsrTitle" --clear --insecure --passwordbox "$_PassNUsrBody $USER\n\n" 0 0 2> ${ANSWER} || config_base_menu
405 PASSWD=$(cat ${ANSWER})
406
407 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassNUsrTitle" --clear --insecure --passwordbox "$_PassNUsrBody2 $USER\n\n" 0 0 2> ${ANSWER} || config_base_menu
408 PASSWD2=$(cat ${ANSWER})
409
410 # loop while passwords entered do not match.
411 while [[ $PASSWD != $PASSWD2 ]]; do
412 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassNUsrErrTitle" --msgbox "$_PassNUsrErrBody" 0 0
413
414 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassNUsrTitle" --clear --insecure --passwordbox "$_PassNUsrBody $USER\n\n" 0 0 2> ${ANSWER} || config_base_menu
415 PASSWD=$(cat ${ANSWER})
416
417 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassNUsrTitle" --clear --insecure --passwordbox "$_PassNUsrBody2 $USER\n\n" 0 0 2> ${ANSWER} || config_base_menu
418 PASSWD2=$(cat ${ANSWER})
419 done
420
421 # State new new user is being created
422 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_NUsrSetTitle" --infobox "$_NUsrSetBody" 0 0
423 sleep 2
424 echo -e "${PASSWD}\n${PASSWD}" > /tmp/.passwd
425
426 # If the first (or only) user account, then change the live account
427 if [[ -e ${MOUNTPOINT}/home/$ISO_USER ]]; then
428 arch_chroot "passwd $ISO_USER" < /tmp/.passwd >/dev/null 2>>/tmp/.errlog
429 check_for_error
430
431 # Distro-specific configuration for entered username
432 sed -i "s/$ISO_USER/$USER/g" ${MOUNTPOINT}/home/$ISO_USER/.gtkrc-2.0 2>/tmp/.errlog
433
434 # Convert live account to entered username - group, password, folder, and ownership
435 sed -i "s/$ISO_USER/$USER/g" ${MOUNTPOINT}/etc/group 2>>/tmp/.errlog
436 sed -i "s/$ISO_USER/$USER/g" ${MOUNTPOINT}/etc/gshadow 2>>/tmp/.errlog
437 sed -i "s/$ISO_USER/$USER/g" ${MOUNTPOINT}/etc/passwd 2>>/tmp/.errlog
438 sed -i "s/$ISO_USER/$USER/g" ${MOUNTPOINT}/etc/shadow 2>>/tmp/.errlog
439 mv ${MOUNTPOINT}/home/$ISO_USER ${MOUNTPOINT}/home/$USER 2>>/tmp/.errlog
440 chown -R $USER:users ${MOUNTPOINT}/home/$USER 2>>/tmp/.errlog
441
442 # Change sudoers file to require passwords for sudo commands
443 sed -i '/%wheel ALL=(ALL) ALL/s/^#//' ${MOUNTPOINT}/etc/sudoers 2>>/tmp/.errlog
444 sed -i '/%wheel ALL=(ALL) ALL NOPASSWD: ALL/s/#%wheel ALL=(ALL) ALL NOPASSWD: ALL//' ${MOUNTPOINT}/etc/sudoers 2>>/tmp/.errlog
445 check_for_error
446
447 #copy over non live config
448 arch_chroot "cp -R /etc/skel/ /home/${USER}" 2>>/tmp/.errlog
449 else
450 # If the live account has already been changed, create a new user account
451 arch_chroot "useradd ${USER} -m -g users -G wheel,storage,power,network,video,audio,lp -s /bin/bash" 2>/tmp/.errlog
452 arch_chroot "passwd ${USER}" < /tmp/.passwd >/dev/null 2>>/tmp/.errlog
453
454 # Set up basic configuration files and ownership for new account
455 arch_chroot "cp -R /etc/skel/ /home/${USER}" 2>>/tmp/.errlog
456 arch_chroot "chown -R ${USER}:users /home/${USER}" 2>>/tmp/.errlog
457 check_for_error
458 fi
459 rm /tmp/.passwd
460}
461
462run_mkinitcpio() {
463
464 clear
465
466 # If $LVM is being used, add the lvm2 hook
467 [[ $LVM -eq 1 ]] && sed -i 's/block filesystems/block lvm2 filesystems/g' ${MOUNTPOINT}/etc/mkinitcpio.conf
468
469 # Amend command depending on whether LTS kernel was installed or not
470 [[ $LTS -eq 1 ]] && arch_chroot "mkinitcpio -p linux-lts" 2>/tmp/.errlog || arch_chroot "mkinitcpio -p linux" 2>/tmp/.errlog
471 check_for_error
472
473}
474
475######################################################################
476## ##
477## System and Partitioning Functions ##
478## ##
479######################################################################
480
481
482
483# Unmount partitions.
484umount_partitions(){
485
486 MOUNTED=""
487 MOUNTED=$(mount | grep "${MOUNTPOINT}" | awk '{print $3}' | sort -r)
488 swapoff -a
489
490 for i in ${MOUNTED[@]}; do
491 umount $i >/dev/null 2>>/tmp/.errlog
492 done
493
494 check_for_error
495
496}
497
498# Adapted from AIS
499confirm_mount() {
500 if [[ $(mount | grep $1) ]]; then
501 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_MntStatusTitle" --infobox "$_MntStatusSucc" 0 0
502 sleep 2
503 PARTITIONS="$(echo $PARTITIONS | sed s/${PARTITION}$' -'//)"
504 NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS - 1 ))
505 else
506 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_MntStatusTitle" --infobox "$_MntStatusFail" 0 0
507 sleep 2
508 prep_menu
509 fi
510}
511
512# btrfs specific for subvolumes
513confirm_mount_btrfs() {
514 if [[ $(mount | grep $1) ]]; then
515 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_MntStatusTitle" --infobox "$_MntStatusSucc\n$(cat ${BTRFS_OPTS})",subvol="${BTRFS_MSUB_VOL}\n\n" 0 0
516 sleep 2
517 else
518 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_MntStatusTitle" --infobox "$_MntStatusFail" 0 0
519 sleep 2
520 prep_menu
521 fi
522}
523
524# Adapted from AIS. However, this does not assume that the formatted device is the Root
525# installation device; more than one device may be formatted. This is now set in the
526# mount_partitions function, when the Root is chosen.
527select_device() {
528
529 DEVICE=""
530 devices_list=$(lsblk -d | awk '{print "/dev/" $1}' | grep 'sd\|hd\|vd');
531
532 for i in ${devices_list[@]}; do
533 DEVICE="${DEVICE} ${i} -"
534 done
535
536 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_DevSelTitle" --menu "$_DevSelBody" 0 0 4 ${DEVICE} 2>${ANSWER} || prep_menu
537 DEVICE=$(cat ${ANSWER})
538
539 }
540
541# Same as above, but goes to install_base_menu instead where cancelling, and otherwise installs Grub.
542select_grub_device() {
543
544 GRUB_DEVICE=""
545 grub_devices_list=$(lsblk -d | awk '{print "/dev/" $1}' | grep 'sd\|hd\|vd');
546
547 for i in ${grub_devices_list[@]}; do
548 GRUB_DEVICE="${GRUB_DEVICE} ${i} -"
549 done
550
551 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_DevSelGrubTitle" --menu "$_DevSelBody" 0 0 4 ${GRUB_DEVICE} 2>${ANSWER} || install_base_menu
552 GRUB_DEVICE=$(cat ${ANSWER})
553 clear
554 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Grub-install " --infobox "$_PlsWaitBody" 0 0
555 sleep 1
556 arch_chroot "grub-install --target=i386-pc --recheck ${GRUB_DEVICE}" 2>/tmp/.errlog
557 check_for_error
558
559 }
560
561# Create partitions.
562create_partitions(){
563
564# This only creates the minimum number of partition(s) necessary. Users wishing for other schemes will
565# have to learn to use a partitioning application.
566auto_partition(){
567
568# Deleting partitions in reverse order deals with logical partitions easily.
569delete_partitions(){
570
571 parted -s ${DEVICE} print | awk '/^ / {print $1}' > /tmp/.del_parts
572
573 for del_part in $(tac /tmp/.del_parts); do
574 parted -s ${DEVICE} rm ${del_part} 2>/tmp/.errlog
575 check_for_error
576 done
577
578
579}
580
581 # Identify the partition table
582 part_table=$(parted -s ${DEVICE} print | grep -i 'partition table' | awk '{print $3}')
583
584 # Autopartition for BIOS systems
585 if [[ $SYSTEM == "BIOS" ]]; then
586 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Auto-Partition (BIOS/MBR) " --yesno "$_AutoPartBody1 $DEVICE $_AutoPartBIOSBody2" 0 0
587
588 if [[ $? -eq 0 ]]; then
589 delete_partitions
590 if [[ $part_table != "msdos" ]]; then
591 parted -s ${DEVICE} mklabel msdos 2>/tmp/.errlog
592 check_for_error
593 fi
594 parted -s ${DEVICE} mkpart primary ext3 1MiB 100% 2>/tmp/.errlog
595 parted -s ${DEVICE} set 1 boot on 2>>/tmp/.errlog
596 check_for_error
597 echo -e "Partition Scheme:\n" > /tmp/.devlist
598 lsblk ${DEVICE} -o NAME,TYPE,FSTYPE,SIZE > /tmp/.devlist
599 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "" --textbox /tmp/.devlist 0 0
600 else
601 create_partitions
602 fi
603
604 # Autopartition for UEFI systems
605 else
606 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Auto-Partition (UEFI/GPT) " --yesno "$_AutoPartBody1 $DEVICE $_AutoPartUEFIBody2" 0 0
607
608 if [[ $? -eq 0 ]]; then
609 delete_partitions
610 if [[ $part_table != "gpt" ]]; then
611 parted -s ${DEVICE} mklabel gpt 2>/tmp/.errlog
612 check_for_error
613 fi
614 parted -s ${DEVICE} mkpart ESP fat32 1MiB 513MiB 2>/tmp/.errlog
615 parted -s ${DEVICE} set 1 boot on 2>>/tmp/.errlog
616 parted -s ${DEVICE} mkpart primary ext3 513MiB 100% 2>>/tmp/.errlog
617 echo -e "Partition Scheme:\n" > /tmp/.devlist
618 lsblk ${DEVICE} -o NAME,TYPE,FSTYPE,SIZE >> /tmp/.devlist
619 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "" --textbox /tmp/.devlist 0 0
620 else
621 create_partitions
622 fi
623
624 fi
625
626}
627
628 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PartToolTitle" \
629 --menu "$_PartToolBody" 0 0 7 \
630 "1" $"Auto Partition" \
631 "2" $"GParted" \
632 "3" $"Parted (BIOS & UEFI)" \
633 "4" $"CFDisk (BIOS/MBR)" \
634 "5" $"CGDisk (UEFI/GPT)" \
635 "6" $"FDisk (BIOS & UEFI)" \
636 "7" $"GDisk (UEFI/GPT)" 2>${ANSWER}
637
638 case $(cat ${ANSWER}) in
639 "1") auto_partition
640 ;;
641 "2") gparted ${DEVICE} >/dev/null 2>&1
642 ;;
643 "3") clear
644 parted ${DEVICE}
645 ;;
646 "4") cfdisk ${DEVICE}
647 ;;
648 "5") cgdisk ${DEVICE}
649 ;;
650 "6") clear
651 fdisk ${DEVICE}
652 ;;
653 "7") clear
654 gdisk ${DEVICE}
655 ;;
656 *) prep_menu
657 ;;
658 esac
659}
660
661# find all available partitions and generate a list of them
662# This also includes partitions on different devices.
663find_partitions() {
664
665 PARTITIONS=""
666 NUMBER_PARTITIONS=0
667 partition_list=$(lsblk -l | grep 'part\|lvm' | sed 's/[\t ].*//' | sort -u)
668
669 for i in ${partition_list[@]}; do
670 PARTITIONS="${PARTITIONS} ${i} -"
671 NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS + 1 ))
672 done
673
674 # Deal with incorrect partitioning
675 if [[ $NUMBER_PARTITIONS -lt 2 ]] && [[ $SYSTEM == "UEFI" ]]; then
676 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_UefiPartErrTitle" --msgbox "$_UefiPartErrBody" 0 0
677 create_partitions
678 fi
679
680 if [[ $NUMBER_PARTITIONS -eq 0 ]] && [[ $SYSTEM == "BIOS" ]]; then
681 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_BiosPartErrTitle" --msgbox "$_BiosPartErrBody" 0 0
682 create_partitions
683 fi
684}
685
686# Set static list of filesystems rather than on-the-fly. Partially as most require additional flags, and
687# partially because some don't seem to be viable.
688select_filesystem(){
689
690# Clear special FS type flags
691BTRFS=0
692
693dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_FSTitle" \
694 --menu "$_FSBody" 0 0 12 \
695 "1" "$_FSSkip" \
696 "2" $"btrfs" \
697 "3" $"ext2" \
698 "4" $"ext3" \
699 "5" $"ext4" \
700 "6" $"f2fs" \
701 "7" $"jfs" \
702 "8" $"nilfs2" \
703 "9" $"ntfs" \
704 "10" $"reiserfs" \
705 "11" $"vfat" \
706 "12" $"xfs" 2>${ANSWER}
707
708 case $(cat ${ANSWER}) in
709 "1") FILESYSTEM="skip"
710 ;;
711 "2") FILESYSTEM="mkfs.btrfs -f"
712 modprobe btrfs
713
714 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsSVTitle" --yesno "$_btrfsSVBody" 0 0
715 if [[ $? -eq 0 ]];then
716 BTRFS=2
717 else
718 BTRFS=1
719 fi
720
721 ;;
722 "3") FILESYSTEM="mkfs.ext2 -F"
723 ;;
724 "4") FILESYSTEM="mkfs.ext3 -F"
725 ;;
726 "5") FILESYSTEM="mkfs.ext4 -F"
727 ;;
728 "6") FILESYSTEM="mkfs.f2fs"
729 modprobe f2fs
730 ;;
731 "7") FILESYSTEM="mkfs.jfs -q"
732 ;;
733 "8") FILESYSTEM="mkfs.nilfs2 -f"
734 ;;
735 "9") FILESYSTEM="mkfs.ntfs -q"
736 ;;
737 "10") FILESYSTEM="mkfs.reiserfs -f -f"
738 ;;
739 "11") FILESYSTEM="mkfs.vfat -F32"
740 ;;
741 "12") FILESYSTEM="mkfs.xfs -f"
742 ;;
743 *) prep_menu
744 ;;
745 esac
746
747 }
748
749mount_partitions() {
750
751# function created to save repetition of code. Checks and determines if standard partition or LVM LV,
752# and sets the prefix accordingly.
753set_mount_type() {
754
755[[ $(echo ${PARTITION} | grep 'sd\|hd\|vd[a-z][1-99]') != "" ]] && MOUNT_TYPE="/dev/" || MOUNT_TYPE="/dev/mapper/"
756
757}
758
759btrfs_subvols() {
760
761 BTRFS_MSUB_VOL=""
762 BTRFS_OSUB_VOL=""
763 BTRFS_MNT=""
764 BTRFS_VOL_LIST="/tmp/.vols"
765 echo "" > ${BTRFS_VOL_LIST}
766 BTRFS_OSUB_NUM=1
767
768 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsSVTitle" --inputbox "$_btrfsMSubBody1 ${MOUNTPOINT}${MOUNT} $_btrfsMSubBody2" 0 0 "" 2>${ANSWER} || select_filesystem
769 BTRFS_MSUB_VOL=$(cat ${ANSWER})
770 # if root, then create boot flag for syslinux, systemd-boot and rEFInd bootloaders
771 [[ ${MOUNT} == "" ]] && BTRFS_MNT="rootflags=subvol="$BTRFS_MSUB_VOL
772
773 # Loop while subvolume is blank or has spaces.
774 while [[ ${#BTRFS_MSUB_VOL} -eq 0 ]] || [[ $BTRFS_MSUB_VOL =~ \ |\' ]]; do
775 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsSVErrTitle" --inputbox "$_btrfsSVErrBody" 0 0 "" 2>${ANSWER} || select_filesystem
776 BTRFS_MSUB_VOL=$(cat ${ANSWER})
777 # if root, then create flag for syslinux, systemd-boot and rEFInd bootloaders
778 [[ ${MOUNT} == "" ]] && BTRFS_MNT="rootflags=subvol="$BTRFS_MSUB_VOL
779 done
780
781 # change dir depending on whether root partition or not
782 [[ ${MOUNT} == "" ]] && cd ${MOUNTPOINT} || cd ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog
783 btrfs subvolume create ${BTRFS_MSUB_VOL} 2>>/tmp/.errlog
784 cd
785 umount ${MOUNT_TYPE}${PARTITION} 2>>/tmp/.errlog
786 check_for_error
787
788 # Get any mount options and mount
789 btrfs_mount_opts
790 if [[ $(cat ${BTRFS_OPTS}) != "" ]]; then
791 [[ ${MOUNT} == "" ]] && mount -o $(cat ${BTRFS_OPTS})",subvol="${BTRFS_MSUB_VOL} ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT} 2>/tmp/.errlog || mount -o $(cat ${BTRFS_OPTS})",subvol="${BTRFS_MSUB_VOL} ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog
792 else
793 [[ ${MOUNT} == "" ]] && mount -o "subvol="${BTRFS_MSUB_VOL} ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT} 2>/tmp/.errlog || mount -o "subvol="${BTRFS_MSUB_VOL} ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog
794 fi
795
796 # Check for error and confirm successful mount
797 check_for_error
798 [[ ${MOUNT} == "" ]] && confirm_mount_btrfs ${MOUNTPOINT} || confirm_mount_btrfs ${MOUNTPOINT}${MOUNT}
799
800 # Now create the subvolumes
801 [[ ${MOUNT} == "" ]] && cd ${MOUNTPOINT} || cd ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog
802 check_for_error
803
804 # Loop while the termination character has not been entered
805 while [[ $BTRFS_OSUB_VOL != "*" ]]; do
806 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsSVTitle ($BTRFS_MSUB_VOL) " --inputbox "$_btrfsSVBody1 $BTRFS_OSUB_NUM $_btrfsSVBody2 $BTRFS_MSUB_VOL.$_btrfsSVBody3 $(cat ${BTRFS_VOL_LIST})" 0 0 "" 2>${ANSWER} || select_filesystem
807 BTRFS_OSUB_VOL=$(cat ${ANSWER})
808
809 # Loop while subvolume is blank or has spaces.
810 while [[ ${#BTRFS_OSUB_VOL} -eq 0 ]] || [[ $BTRFS_SUB_VOL =~ \ |\' ]]; do
811 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsSVErrTitle ($BTRFS_MSUB_VOL) " --inputbox "$_btrfsSVErrBody ($BTRFS_OSUB_NUM)." 0 0 "" 2>${ANSWER} || select_filesystem
812 BTRFS_OSUB_VOL=$(cat ${ANSWER})
813 done
814
815 btrfs subvolume create ${BTRFS_OSUB_VOL} 2>/tmp/.errlog
816 check_for_error
817 BTRFS_OSUB_NUM=$(( BTRFS_OSUB_NUM + 1 ))
818 echo $BTRFS_OSUB_VOL" " >> ${BTRFS_VOL_LIST}
819 done
820
821 # Show the subvolumes created
822 echo -e "btrfs subvols:\n" > /tmp/.subvols
823 ls >> /tmp/.subvols
824 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --textbox /tmp/.subvols 0 0
825 cd
826}
827
828# This function allows for btrfs-specific mounting options to be applied. Written as a seperate function
829# for neatness.
830btrfs_mount_opts() {
831
832 echo "" > ${BTRFS_OPTS}
833
834 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsMntTitle" --checklist "$_btrfsMntBody" 0 0 16 \
835 "1" "autodefrag" off \
836 "2" "compress=zlib" off \
837 "3" "compress=lzo" off \
838 "4" "compress=no" off \
839 "5" "compress-force=zlib" off \
840 "6" "compress-force=lzo" off \
841 "7" "discard" off \
842 "8" "noacl" off \
843 "9" "noatime" off \
844 "10" "nodatasum" off \
845 "11" "nospace_cache" off \
846 "12" "recovery" off \
847 "13" "skip_balance" off \
848 "14" "space_cache" off \
849 "15" "ssd" off \
850 "16" "ssd_spread" off 2>${BTRFS_OPTS}
851
852 # Double-digits first
853 sed -i 's/10/nodatasum,/' ${BTRFS_OPTS}
854 sed -i 's/11/nospace_cache,/' ${BTRFS_OPTS}
855 sed -i 's/12/recovery,/' ${BTRFS_OPTS}
856 sed -i 's/13/skip_balance,/' ${BTRFS_OPTS}
857 sed -i 's/14/space_cache,/' ${BTRFS_OPTS}
858 sed -i 's/15/ssd,/' ${BTRFS_OPTS}
859 sed -i 's/16/ssd_spread,/' ${BTRFS_OPTS}
860 # then single digits
861 sed -i 's/1/autodefrag,/' ${BTRFS_OPTS}
862 sed -i 's/2/compress=zlib,/' ${BTRFS_OPTS}
863 sed -i 's/3/compress=lzo,/' ${BTRFS_OPTS}
864 sed -i 's/4/compress=no,/' ${BTRFS_OPTS}
865 sed -i 's/5/compress-force=zlib,/' ${BTRFS_OPTS}
866 sed -i 's/6/compress-force=lzo,/' ${BTRFS_OPTS}
867 sed -i 's/7/noatime,/' ${BTRFS_OPTS}
868 sed -i 's/8/noacl,/' ${BTRFS_OPTS}
869 sed -i 's/9/noatime,/' ${BTRFS_OPTS}
870 # Now clean up the file
871 sed -i 's/ //g' ${BTRFS_OPTS}
872 sed -i '$s/,$//' ${BTRFS_OPTS}
873
874
875 if [[ $(cat ${BTRFS_OPTS}) != "" ]]; then
876 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsMntTitle" --yesno "$_btrfsMntConfBody $(cat $BTRFS_OPTS)\n" 0 0
877 [[ $? -eq 1 ]] && btrfs_mount_opts
878 fi
879
880}
881
882 # LVM Detection. If detected, activate.
883 detect_lvm
884 if [[ $LVM -eq 1 ]]; then
885 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmDetTitle" --infobox "$_LvmDetBody2" 0 0
886 sleep 2
887 modprobe dm-mod 2>/tmp/.errlog
888 check_for_error
889 vgscan >/dev/null 2>&1
890 vgchange -ay >/dev/null 2>&1
891 fi
892
893 # Ensure partitions are unmounted (i.e. where mounted previously), and then list available partitions
894 umount_partitions
895 find_partitions
896
897 # Identify and mount root
898 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SelRootTitle" --menu "$_SelRootBody" 0 0 4 ${PARTITIONS} 2>${ANSWER} || prep_menu
899 PARTITION=$(cat ${ANSWER})
900 ROOT_PART=${PARTITION}
901 set_mount_type
902
903 # This is to identify the device for Grub installations.
904 if [[ $MOUNT_TYPE == "/dev/" ]]; then
905 LVM_ROOT=0
906 INST_DEV=${MOUNT_TYPE}$(cat ${ANSWER} | sed 's/[0-9]*//g')
907 else
908 LVM_ROOT=1
909 fi
910
911 select_filesystem
912 [[ $FILESYSTEM != "skip" ]] && ${FILESYSTEM} ${MOUNT_TYPE}${PARTITION} >/dev/null 2>/tmp/.errlog
913 check_for_error
914
915 # Make the root directory
916 mkdir -p ${MOUNTPOINT} 2>/tmp/.errlog
917
918 # If btrfs without subvolumes has been selected, get the mount options
919 [[ $BTRFS -eq 1 ]] && btrfs_mount_opts
920
921 # If btrfs has been selected without subvolumes - and at least one btrfs mount option selected - then
922 # mount with options. Otherwise, basic mount.
923 if [[ $BTRFS -eq 1 ]] && [[ $(cat ${BTRFS_OPTS}) != "" ]]; then
924 mount -o $(cat ${BTRFS_OPTS}) ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT} 2>>/tmp/.errlog
925 else
926 mount ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT} 2>>/tmp/.errlog
927 fi
928
929 # Check for error, confirm mount, and deal with BTRFS with subvolumes if applicable
930 check_for_error
931 confirm_mount ${MOUNTPOINT}
932 [[ $BTRFS -eq 2 ]] && btrfs_subvols
933
934 # Identify and create swap, if applicable
935 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SelSwpTitle" --menu "$_SelSwpBody" 0 0 4 "$_SelSwpNone" $"-" "$_SelSwpFile" $"-" ${PARTITIONS} 2>${ANSWER} || prep_menu
936 if [[ $(cat ${ANSWER}) != "$_SelSwpNone" ]]; then
937 PARTITION=$(cat ${ANSWER})
938
939 if [[ $PARTITION == "$_SelSwpFile" ]]; then
940 total_memory=`grep MemTotal /proc/meminfo | awk '{print $2/1024}' | sed 's/\..*//'`
941 fallocate -l ${total_memory}M ${MOUNTPOINT}/swapfile >/dev/null 2>/tmp/.errlog
942 check_for_error
943 chmod 600 ${MOUNTPOINT}/swapfile >/dev/null 2>&1
944 mkswap ${MOUNTPOINT}/swapfile >/dev/null 2>&1
945 swapon ${MOUNTPOINT}/swapfile >/dev/null 2>&1
946 else
947 set_mount_type
948 mkswap ${MOUNT_TYPE}${PARTITION} >/dev/null 2>/tmp/.errlog
949 swapon ${MOUNT_TYPE}${PARTITION} >/dev/null 2>>/tmp/.errlog
950 check_for_error
951 # Since a partition was used, remove that partition from the list
952 PARTITIONS="$(echo $PARTITIONS | sed s/${PARTITION}$' -'//)"
953 NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS - 1 ))
954 fi
955 fi
956
957 # Extra Step for VFAT UEFI Partition. This cannot be in an LVM container.
958 if [[ $SYSTEM == "UEFI" ]]; then
959
960 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SelUefiTitle" --menu "$_SelUefiBody" 0 0 4 ${PARTITIONS} 2>${ANSWER} || config_base_menu
961 PARTITION=$(cat ${ANSWER})
962 UEFI_PART=$"/dev/"${PARTITION}
963
964 # If it is already a fat/vfat partition...
965 if [[ $(fsck -N /dev/$PARTITION | grep fat) ]]; then
966 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_FormUefiTitle" --yesno "$_FormUefiBody $PARTITION $_FormUefiBody2" 0 0 && mkfs.vfat -F32 $"/dev/"${PARTITION} >/dev/null 2>/tmp/.errlog
967 else
968 mkfs.vfat -F32 $"/dev/"${PARTITION} >/dev/null 2>/tmp/.errlog
969 fi
970 check_for_error
971
972 # Inform users of the mountpoint options and consequences
973 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_MntUefiTitle" --menu "$_MntUefiBody" 0 0 2 \
974 "1" $"/boot" \
975 "2" $"/boot/efi" 2>${ANSWER}
976
977 case $(cat ${ANSWER}) in
978 "1") UEFI_MOUNT="/boot"
979 ;;
980 "2") UEFI_MOUNT="/boot/efi"
981 ;;
982 *) config_base_menu
983 ;;
984 esac
985
986 mkdir -p ${MOUNTPOINT}${UEFI_MOUNT} 2>/tmp/.errlog
987 mount $"/dev/"${PARTITION} ${MOUNTPOINT}${UEFI_MOUNT} 2>>/tmp/.errlog
988 check_for_error
989 confirm_mount ${MOUNTPOINT}${UEFI_MOUNT}
990
991 fi
992
993 # All other partitions
994 while [[ $NUMBER_PARTITIONS > 0 ]]; do
995 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ExtPartTitle" --menu "$_ExtPartBody" 0 0 4 "$_Done" $"-" ${PARTITIONS} 2>${ANSWER} || config_base_menu
996 PARTITION=$(cat ${ANSWER})
997 set_mount_type
998
999 if [[ $PARTITION == ${_Done} ]]; then
1000 break;
1001 else
1002 MOUNT=""
1003
1004 select_filesystem
1005 [[ $FILESYSTEM != "skip" ]] && ${FILESYSTEM} ${MOUNT_TYPE}${PARTITION} >/dev/null 2>/tmp/.errlog
1006 check_for_error
1007
1008 # Don't give /boot as an example for UEFI systems!
1009 if [[ $SYSTEM == "UEFI" ]]; then
1010 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ExtNameTitle $PARTITON " --inputbox "$_ExtNameBodyUefi" 0 0 "/" 2>${ANSWER} || config_base_menu
1011 else
1012 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ExtNameTitle $PARTITON " --inputbox "$_ExtNameBodyBios" 0 0 "/" 2>${ANSWER} || config_base_menu
1013 fi
1014 MOUNT=$(cat ${ANSWER})
1015
1016 # loop if the mountpoint specified is incorrect (is only '/', is blank, or has spaces).
1017 while [[ ${MOUNT:0:1} != "/" ]] || [[ ${#MOUNT} -le 1 ]] || [[ $MOUNT =~ \ |\' ]]; do
1018 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ExtErrTitle" --msgbox "$_ExtErrBody" 0 0
1019
1020 # Don't give /boot as an example for UEFI systems!
1021 if [[ $SYSTEM == "UEFI" ]]; then
1022 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ExtNameTitle $PARTITON " --inputbox "$_ExtNameBodyUefi" 0 0 "/" 2>${ANSWER} || config_base_menu
1023 else
1024 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ExtNameTitle $PARTITON " --inputbox "$_ExtNameBodyBios" 0 0 "/" 2>${ANSWER} || config_base_menu
1025 fi
1026 MOUNT=$(cat ${ANSWER})
1027 done
1028
1029 # Create directory and mount. This step will only be reached where the loop has been skipped or broken.
1030 mkdir -p ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog
1031
1032 # If btrfs without subvolumes has been selected, get the mount options
1033 [[ $BTRFS -eq 1 ]] && btrfs_mount_opts
1034
1035 # If btrfs has been selected without subvolumes - and at least one btrfs mount option selected - then
1036 # mount with options. Otherwise, basic mount.
1037 if [[ $BTRFS -eq 1 ]] && [[ $(cat ${BTRFS_OPTS}) != "" ]]; then
1038 mount -o $(cat ${BTRFS_OPTS}) ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT}${MOUNT} 2>>/tmp/.errlog
1039 else
1040 mount ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT}${MOUNT} 2>>/tmp/.errlog
1041 fi
1042
1043 # Check for error, confirm mount, and deal with BTRFS with subvolumes if applicable
1044 check_for_error
1045 confirm_mount ${MOUNTPOINT}${MOUNT}
1046 [[ $BTRFS -eq 2 ]] && btrfs_subvols
1047
1048 # Determine if a seperate /boot is used, and if it is LVM or not
1049 LVM_SEP_BOOT=0
1050 if [[ $MOUNT == "/boot" ]]; then
1051 [[ $MOUNT_TYPE == "/dev/" ]] && LVM_SEP_BOOT=1 || LVM_SEP_BOOT=2
1052 fi
1053 fi
1054 done
1055}
1056
1057######################################################################
1058## ##
1059## Logical Volume Management Functions ##
1060## ##
1061######################################################################
1062
1063
1064# LVM Detection.
1065detect_lvm() {
1066
1067 LVM_PV=$(pvs -o pv_name --noheading 2>/dev/null)
1068 LVM_VG=$(vgs -o vg_name --noheading 2>/dev/null)
1069 LVM_LV=$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)
1070
1071 if [[ $LVM_LV = "" ]] && [[ $LVM_VG = "" ]] && [[ $LVM_PV = "" ]]; then
1072 LVM=0
1073 else
1074 LVM=1
1075 fi
1076
1077}
1078
1079# Where existing LVM is found, offer to deactivate it. Code adapted from the Manjaro installer.
1080# NEED TO ADD COMMAND TO REMOVE LVM2 FSTYPE.
1081deactivate_lvm() {
1082
1083 LVM_DISABLE=0
1084
1085 if [[ $LVM -eq 1 ]]; then
1086 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmDetTitle" --yesno "$_LvmDetBody1" 0 0 \
1087 && LVM_DISABLE=1 || LVM_DISABLE=0
1088 fi
1089
1090 if [[ $LVM_DISABLE -eq 1 ]]; then
1091 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmRmTitle" --infobox "$_LvmRmBody" 0 0
1092 sleep 2
1093
1094 for i in ${LVM_LV}; do
1095 lvremove -f /dev/mapper/${i} >/dev/null 2>&1
1096 done
1097
1098 for i in ${LVM_VG}; do
1099 vgremove -f ${i} >/dev/null 2>&1
1100 done
1101
1102 for i in ${LV_PV}; do
1103 pvremove -f ${i} >/dev/null 2>&1
1104 done
1105
1106 # This step will remove old lvm metadata on partitions where identified.
1107 LVM_PT=$(lvmdiskscan | grep 'LVM physical volume' | grep 'sd[a-z]' | sed 's/\/dev\///' | awk '{print $1}')
1108 for i in ${LVM_PT}; do
1109 dd if=/dev/zero bs=512 count=512 of=/dev/${i} >/dev/null 2>&1
1110 done
1111 fi
1112
1113}
1114
1115# Find and create a list of partitions that can be used for LVM. Partitions already used are excluded.
1116find_lvm_partitions() {
1117
1118 LVM_PARTITIONS=""
1119 NUMBER_LVM_PARTITIONS=0
1120 lvm_partition_list=$(lvmdiskscan | grep -v 'LVM physical volume' | grep 'sd[a-z][1-99]' | sed 's/\/dev\///' | awk '{print $1}')
1121
1122 for i in ${lvm_partition_list[@]}; do
1123 LVM_PARTITIONS="${LVM_PARTITIONS} ${i} -"
1124 NUMBER_LVM_PARTITIONS=$(( NUMBER_LVM_PARTITIONS + 1 ))
1125 done
1126
1127}
1128
1129# This simplifies the creation of the PV and VG into a single step.
1130create_lvm() {
1131
1132# subroutine to save a lot of repetition.
1133check_lv_size() {
1134
1135 LV_SIZE_INVALID=0
1136 LV_SIZE_TYPE=$(echo ${LVM_LV_SIZE:$(( ${#LVM_LV_SIZE} - 1 )):1})
1137 chars=0
1138
1139 # Check to see if anything was actually entered
1140 [[ ${#LVM_LV_SIZE} -eq 0 ]] && LV_SIZE_INVALID=1
1141
1142 # Check if there are any non-numeric characters prior to the last one
1143 while [[ $chars -lt $(( ${#LVM_LV_SIZE} - 1 )) ]]; do
1144 if [[ ${LVM_LV_SIZE:chars:1} != [0-9] ]]; then
1145 LV_SIZE_INVALID=1
1146 break;
1147 fi
1148 chars=$(( chars + 1 ))
1149 done
1150
1151 # Check to see if first character is '0'
1152 [[ ${LVM_LV_SIZE:0:1} -eq "0" ]] && LV_SIZE_INVALID=1
1153
1154 # Check to see if last character is "G" or "M", and if so, whether the value is greater than
1155 # or equal to the LV remaining Size. If not, convert into MB for VG space remaining.
1156 if [[ ${LV_SIZE_INVALID} -eq 0 ]]; then
1157 case ${LV_SIZE_TYPE} in
1158 "G") if [[ $(( $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) * 1000 )) -ge ${LVM_VG_MB} ]]; then
1159 LV_SIZE_INVALID=1
1160 else
1161 LVM_VG_MB=$(( LVM_VG_MB - $(( $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) * 1000 )) ))
1162 fi
1163 ;;
1164 "M") if [[ $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) -ge ${LVM_VG_MB} ]]; then
1165 LV_SIZE_INVALID=1
1166 else
1167 LVM_VG_MB=$(( LVM_VG_MB - $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) ))
1168 fi
1169 ;;
1170 *) LV_SIZE_INVALID=1
1171 ;;
1172 esac
1173 fi
1174
1175}
1176
1177 # Check that there is at least one partition available for LVM
1178 if [[ $NUMBER_LVM_PARTITIONS -lt 1 ]]; then
1179 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPartErrTitle" --msgbox "$_LvmPartErrBody" 0 0
1180 prep_menu
1181 fi
1182
1183 # Create a temporary file to store the partition(s) selected. This is later used for the vgcreate command. 'x' is used as a marker.
1184 echo "x" > /tmp/.vgcreate
1185
1186 # Name the Volume Group
1187 LVM_VG=""
1188 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmNameVgTitle" --inputbox "$_LvmNameVgBody" 0 0 "" 2>${ANSWER} || prep_menu
1189 LVM_VG=$(cat ${ANSWER})
1190
1191 # Loop while the Volume Group name starts with a "/", is blank, has spaces, or is already being used
1192 while [[ ${LVM_VG:0:1} == "/" ]] || [[ ${#LVM_VG} -eq 0 ]] || [[ $LVM_VG =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_VG}) != "" ]]; do
1193 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmNameVgErrTitle" --msgbox "$_LvmNameVgErr" 0 0
1194
1195 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmNameVgTitle" --inputbox "$_LvmNameVgBody" 0 0 "" 2>${ANSWER} || prep_menu
1196 LVM_VG=$(cat ${ANSWER})
1197 done
1198
1199 # Select the first or only partition for the Volume Group
1200 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvSelTitle" --menu "$_LvmPvSelBody" 0 0 4 ${LVM_PARTITIONS} 2>${ANSWER} || prep_menu
1201 LVM_PARTITION=$(cat ${ANSWER})
1202
1203 # add the partition to the temporary file for the vgcreate command
1204 # Remove selected partition from the list and deduct number of LVM viable partitions remaining
1205 sed -i "s/x/\/dev\/${LVM_PARTITION} x/" /tmp/.vgcreate
1206 LVM_PARTITIONS="$(echo $LVM_PARTITIONS | sed s/${LVM_PARTITION}$' -'//)"
1207 NUMBER_LVM_PARTITIONS=$(( NUMBER_LVM_PARTITIONS - 1 ))
1208 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvCreateTitle" --infobox "\n$_Done\n\n" 0 0
1209 sleep 1
1210
1211 # Where there are viable partitions still remaining, run loop
1212 while [[ $NUMBER_LVM_PARTITIONS -gt 0 ]]; do
1213
1214 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvSelTitle" --menu "$_LvmPvSelBody" 0 0 4 $"Done" $"-" ${LVM_PARTITIONS} 2>${ANSWER} || prep_menu
1215 LVM_PARTITION=$(cat ${ANSWER})
1216
1217 if [[ $LVM_PARTITION == "Done" ]]; then
1218 break;
1219 else
1220 sed -i "s/x/\/dev\/${LVM_PARTITION} x/" /tmp/.vgcreate
1221 LVM_PARTITIONS="$(echo $LVM_PARTITIONS | sed s/${LVM_PARTITION}$' -'//)"
1222 NUMBER_LVM_PARTITIONS=$(( NUMBER_LVM_PARTITIONS - 1 ))
1223 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvCreateTitle" --infobox "\n$_Done\n\n" 0 0
1224 sleep 1
1225 fi
1226
1227 done
1228
1229 # Once all the partitions have been selected, remove 'x' from the .vgcreate file, then use it in 'vgcreate' command.
1230 # Also determine the size of the VG, to use for creating LVs for it.
1231 VG_PARTS=$(cat /tmp/.vgcreate | sed 's/x//')
1232 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvConfTitle" --yesno "$_LvmPvConfBody1${LVM_VG} $_LvmPvConfBody2${VG_PARTS}" 0 0
1233
1234 if [[ $? -eq 0 ]]; then
1235 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvActTitle" --infobox "$_LvmPvActBody1${LVM_VG}.$_LvmPvActBody2" 0 0
1236 sleep 2
1237 vgcreate -f ${LVM_VG} ${VG_PARTS} >/dev/null 2>/tmp/.errlog
1238 check_for_error
1239 VG_SIZE=$(vgdisplay | grep 'VG Size' | awk '{print $3}' | sed 's/\..*//')
1240 VG_SIZE_TYPE=$(vgdisplay | grep 'VG Size' | awk '{print $4}' | sed 's/\..*//')
1241 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvDoneTitle" --msgbox "$_LvmPvDoneBody1 '${LVM_VG}' $_LvmPvDoneBody2 (${VG_SIZE} ${VG_SIZE_TYPE}).\n\n" 0 0
1242 sleep 2
1243 else
1244 prep_menu
1245 fi
1246
1247 # Convert the VG size into GB and MB. These variables are used to keep tabs on space available and remaining
1248 [[ ${VG_SIZE_TYPE:0:1} == "G" ]] && LVM_VG_MB=$(( VG_SIZE * 1000 )) || LVM_VG_MB=$VG_SIZE
1249
1250 # Specify number of Logical volumes to create.
1251 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNumTitle" --inputbox "$_LvmLvNumBody1 ${LVM_VG}.$_LvmLvNumBody2" 0 0 "" 2>${ANSWER} || prep_menu
1252 NUMBER_LOGICAL_VOLUMES=$(cat ${ANSWER})
1253
1254 # Loop if the number of LVs is no 1-9 (including non-valid characters)
1255 while [[ $NUMBER_LOGICAL_VOLUMES != [1-9] ]]; do
1256 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNumErrTitle" --msgbox "$_LvmLvNumErrBody" 0 0
1257
1258 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNumTitle" --inputbox "$_LvmLvNumBody1 ${LVM_VG}.$_LvmLvNumBody2" 0 0 "" 2>${ANSWER} || prep_menu
1259 NUMBER_LOGICAL_VOLUMES=$(cat ${ANSWER})
1260 done
1261
1262 # Loop while the number of LVs is greater than 1. This is because the size of the last LV is automatic.
1263 while [[ $NUMBER_LOGICAL_VOLUMES -gt 1 ]]; do
1264 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNameTitle" --inputbox "$_LvmLvNameBody1" 0 0 "lvol" 2>${ANSWER} || prep_menu
1265 LVM_LV_NAME=$(cat ${ANSWER})
1266
1267 # Loop if preceeded with a "/", if nothing is entered, if there is a space, or if that name already exists.
1268 while [[ ${LVM_LV_NAME:0:1} == "/" ]] || [[ ${#LVM_LV_NAME} -eq 0 ]] || [[ ${LVM_LV_NAME} =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_LV_NAME}) != "" ]]; do
1269 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNameErrTitle" --msgbox "$_LvmLvNameErrBody" 0 0
1270
1271 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNameTitle" --inputbox "$_LvmLvNameBody1" 0 0 "lvol" 2>${ANSWER} || prep_menu
1272 LVM_LV_NAME=$(cat ${ANSWER})
1273 done
1274
1275 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvSizeTitle" --inputbox "\n${LVM_VG}: ${VG_SIZE}${VG_SIZE_TYPE} (${LVM_VG_MB}MB $_LvmLvSizeBody1).$_LvmLvSizeBody2" 0 0 "" 2>${ANSWER} || prep_menu
1276 LVM_LV_SIZE=$(cat ${ANSWER})
1277 check_lv_size
1278
1279 # Loop while an invalid value is entered.
1280 while [[ $LV_SIZE_INVALID -eq 1 ]]; do
1281 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvSizeErrTitle" --msgbox "$_LvmLvSizeErrBody" 0 0
1282
1283 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvSizeTitle" --inputbox "\n${LVM_VG}: ${VG_SIZE}${VG_SIZE_TYPE} (${LVM_VG_MB}MB $_LvmLvSizeBody1).$_LvmLvSizeBody2" 0 0 "" 2>${ANSWER} || prep_menu
1284 LVM_LV_SIZE=$(cat ${ANSWER})
1285 check_lv_size
1286 done
1287
1288 # Create the LV
1289 lvcreate -L ${LVM_LV_SIZE} ${LVM_VG} -n ${LVM_LV_NAME} 2>/tmp/.errlog
1290 check_for_error
1291 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvDoneTitle" --msgbox "\n$_Done\n\nLV ${LVM_LV_NAME} (${LVM_LV_SIZE}) $_LvmPvDoneBody2.\n\n" 0 0
1292 NUMBER_LOGICAL_VOLUMES=$(( NUMBER_LOGICAL_VOLUMES - 1 ))
1293 done
1294
1295 # Now the final LV. Size is automatic.
1296 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNameTitle" --inputbox "$_LvmLvNameBody1 $_LvmLvNameBody2 (${LVM_VG_MB}MB)." 0 0 "lvol" 2>${ANSWER} || prep_menu
1297 LVM_LV_NAME=$(cat ${ANSWER})
1298
1299 # Loop if preceeded with a "/", if nothing is entered, if there is a space, or if that name already exists.
1300 while [[ ${LVM_LV_NAME:0:1} == "/" ]] || [[ ${#LVM_LV_NAME} -eq 0 ]] || [[ ${LVM_LV_NAME} =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_LV_NAME}) != "" ]]; do
1301 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNameErrTitle" --msgbox "$_LvmLvNameErrBody" 0 0
1302
1303 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNameTitle" --inputbox "$_LvmLvNameBody1 $_LvmLvNameBody2 (${LVM_VG_MB}MB)." 0 0 "lvol" 2>${ANSWER} || prep_menu
1304 LVM_LV_NAME=$(cat ${ANSWER})
1305 done
1306
1307 # Create the final LV
1308 lvcreate -l +100%FREE ${LVM_VG} -n ${LVM_LV_NAME} 2>/tmp/.errlog
1309 check_for_error
1310 NUMBER_LVM_PARTITIONS=$(( NUMBER_LVM_PARTITIONS - 1 ))
1311 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmCompTitle" --yesno "$_LvmCompBody" 0 0 \
1312 && show_devices || prep_menu
1313}
1314
1315######################################################################
1316## ##
1317## Installation Functions ##
1318## ##
1319######################################################################
1320
1321install_root(){
1322
1323 clear
1324
1325 # Change installation method depending on use of img or sfs
1326 if [[ -e /run/archiso/sfs/airootfs/airootfs.img ]]; then
1327 AIROOTIMG="/run/archiso/sfs/airootfs/airootfs.img"
1328 mkdir -p ${BYPASS} 2>/tmp/.errlog
1329 mount ${AIROOTIMG} ${BYPASS} 2>>/tmp/.errlog
1330 rsync -a --progress ${BYPASS} ${MOUNTPOINT}/ 2>>/tmp/.errlog
1331 umount -l ${BYPASS}
1332 else
1333 AIROOTIMG="/run/archiso/sfs/airootfs/"
1334 rsync -a --progress ${AIROOTIMG} ${MOUNTPOINT}/ 2>/tmp/.errlog
1335 fi
1336
1337 check_for_error
1338
1339 # Keyboard config for vc and x11
1340 [[ -e /tmp/vconsole.conf ]] && cp /tmp/vconsole.conf ${MOUNTPOINT}/etc/vconsole.conf 2>>/tmp/.errlog
1341 [[ -e /tmp/01-keyboard-layout.conf ]] && cp -f /tmp/01-keyboard-layout.conf ${MOUNTPOINT}/etc/X11/xorg.conf.d/$(ls ${MOUNTPOINT}/etc/X11/xorg.conf.d/ | grep "keyboard") 2>>/tmp/.errlog
1342
1343 # set up kernel for mkiniticpio
1344 cp /run/archiso/bootmnt/arch/boot/${ARCHI}/vmlinuz ${MOUNTPOINT}/boot/vmlinuz-linux 2>>/tmp/.errlog
1345
1346 # copy over new mirrorlist
1347 cp /etc/pacman.d/mirrorlist ${MOUNTPOINT}/etc/pacman.d/mirrorlist 2>>/tmp/.errlog
1348
1349 # Clean up installation
1350 [[ -d ${MOUNTPOINT}/abif-master ]] && rm -R ${MOUNTPOINT}/abif-master 2>>/tmp/.errlog
1351 [[ -d ${MOUNTPOINT}/aif-master ]] && rm -R ${MOUNTPOINT}/abif-master 2>>/tmp/.errlog
1352 [[ -d ${MOUNTPOINT}/inst ]] && rm -R ${MOUNTPOINT}/inst &> /dev/null 2>>/tmp/.errlog
1353 rm -f ${MOUNTPOINT}/usr/bin/lastmin 2>>/tmp/.errlog
1354 rm -rf ${MOUNTPOINT}/vomi 2>>/tmp/.errlog
1355 rm -rf ${BYPASS} 2>>/tmp/.errlog
1356 rm -rf ${MOUNTPOINT}/source 2>>/tmp/.errlog
1357 rm -rf ${MOUNTPOINT}/src 2>>/tmp/.errlog
1358 rmdir ${MOUNTPOINT}/bypass 2>>/tmp/.errlog
1359 rmdir ${MOUNTPOINT}/src 2>>/tmp/.errlog
1360 rmdir ${MOUNTPOINT}/source 2>>/tmp/.errlog
1361 rm -f ${MOUNTPOINT}/etc/sudoers.d/g_wheel 2>>/tmp/.errlog
1362 rm -f ${MOUNTPOINT}/var/lib/NetworkManager/NetworkManager.state 2>>/tmp/.errlog
1363 rm -f ${MOUNTPOINT}/update-abif 2>>/tmp/.errlog
1364 sed -i 's/.*pam_wheel\.so/#&/' ${MOUNTPOINT}/etc/pam.d/su 2>>/tmp/.errlog
1365
1366 # clean out archiso files from install
1367 find ${MOUNTPOINT}/usr/lib/initcpio -name archiso* -type f -exec rm '{}' \;
1368
1369 # systemd
1370 rm -R ${MOUNTPOINT}/etc/systemd/system/getty@tty1.service.d 2>>/tmp/.errlog
1371 rm ${MOUNTPOINT}/etc/systemd/system/default.target 2>>/tmp/.errlog
1372
1373
1374 # Journal
1375 sed -i 's/volatile/auto/g' ${MOUNTPOINT}/etc/systemd/journald.conf 2>>/tmp/.errlog
1376
1377 # Stop pacman complaining
1378 arch_chroot "mkdir -p /var/lib/pacman/sync" 2>>/tmp/.errlog
1379 arch_chroot "touch /var/lib/pacman/sync/{core.db,extra.db,community.db}" 2>>/tmp/.errlog
1380
1381 # Fix NetworkManager
1382 arch_chroot "systemctl enable NetworkManager -f" 2>>/tmp/.errlog
1383
1384 # Keyboard config for vc and x11
1385 [[ -e /tmp/vconsole.conf ]] && cp /tmp/vconsole.conf ${MOUNTPOINT}/etc/vconsole.conf 2>>/tmp/.errlog
1386 [[ -e /tmp/01-keyboard-layout.conf ]] && cp -f /tmp/01-keyboard-layout.conf ${MOUNTPOINT}/etc/X11/xorg.conf.d/$(ls ${MOUNTPOINT}/etc/X11/xorg.conf.d/ | grep "keyboard") 2>>/tmp/.errlog
1387 check_for_error
1388}
1389
1390# Install Bootloader
1391install_bootloader() {
1392
1393bios_bootloader() {
1394
1395 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_InstBiosBtTitle" \
1396 --menu "$_InstBiosBtBody" 0 0 2 \
1397 "1" $"Grub2" \
1398 "2" $"Syslinux" 2>${ANSWER}
1399
1400 case $(cat ${ANSWER}) in
1401 "1") # GRUB
1402 if [[ $LVM_ROOT -eq 1 ]]; then
1403 select_grub_device
1404 else
1405 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_InstGrubDevTitle" --yesno "$_InstGrubDevBody ($INST_DEV)?$_InstGrubDevBody2" 0 0
1406
1407 if [[ $? -eq 0 ]]; then
1408 clear
1409 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Grub-install " --infobox "$_PlsWaitBody" 0 0
1410 sleep 1
1411 arch_chroot "grub-install --target=i386-pc --recheck ${INST_DEV}" 2>/tmp/.errlog
1412 check_for_error
1413 else
1414 select_grub_device
1415 fi
1416
1417 fi
1418
1419 arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>/tmp/.errlog
1420 check_for_error
1421
1422 # if /boot is LVM then amend /boot/grub/grub.cfg accordingly
1423 if ( [[ $LVM_ROOT -eq 1 ]] && [[ $LVM_SEP_BOOT -eq 0 ]] ) || [[ $LVM_SEP_BOOT -eq 2 ]]; then
1424 sed -i '/### BEGIN \/etc\/grub.d\/00_header ###/a insmod lvm' ${MOUNTPOINT}/boot/grub/grub.cfg
1425 fi
1426 BOOTLOADER="Grub"
1427 ;;
1428 "2") # Syslinux
1429 arch_chroot "syslinux-install_update -iam" 2>/tmp/.errlog
1430 check_for_error
1431
1432 # Amend configuration file depending on whether lvm used or not for root.
1433 if [[ $LVM_ROOT -eq 0 ]]; then
1434 sed -i "s/sda[0-9]/${ROOT_PART}/g" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg
1435 else
1436 sed -i "s/APPEND.*/APPEND root=\/dev\/mapper\/${ROOT_PART} rw/g" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg
1437 fi
1438
1439 # Amend configuration file for LTS kernel and/or btrfs subvolume as root
1440 [[ $LTS -eq 1 ]] && sed -i 's/linux/linux-lts/g' ${MOUNTPOINT}/boot/syslinux/syslinux.cfg
1441 [[ $BTRFS_MNT != "" ]] && sed -i "s/rw/rw $BTRFS_MNT/g" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg
1442
1443 BOOTLOADER="Syslinux"
1444 ;;
1445 *) install_base_menu
1446 ;;
1447 esac
1448}
1449
1450uefi_bootloader() {
1451
1452 #Ensure again that efivarfs is mounted
1453 [[ -z $(mount | grep /sys/firmware/efi/efivars) ]] && mount -t efivarfs efivarfs /sys/firmware/efi/efivars
1454
1455 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_InstUefiBtTitle" \
1456 --menu "$_InstUefiBtBody" 0 0 3 \
1457 "1" $"Grub2" \
1458 "2" $"rEFInd" \
1459 "3" $"systemd-boot" 2>${ANSWER}
1460
1461 case $(cat ${ANSWER}) in
1462 "1") # GRUB
1463 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Grub-install " --infobox "$_PlsWaitBody" 0 0
1464 sleep 1
1465 arch_chroot "grub-install --target=x86_64-efi --efi-directory=${UEFI_MOUNT} --bootloader-id=arch_grub --recheck" 2>/tmp/.errlog
1466 arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>>/tmp/.errlog
1467 check_for_error
1468
1469 # Ask if user wishes to set Grub as the default bootloader and act accordingly
1470 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SetGrubDefTitle" --yesno "$_SetGrubDefBody ${UEFI_MOUNT}/EFI/boot $_SetGrubDefBody2" 0 0
1471
1472 if [[ $? -eq 0 ]]; then
1473 arch_chroot "mkdir ${UEFI_MOUNT}/EFI/boot" 2>/tmp/.errlog
1474 arch_chroot "cp -r ${UEFI_MOUNT}/EFI/arch_grub/grubx64.efi ${UEFI_MOUNT}/EFI/boot/bootx64.efi" 2>>/tmp/.errlog
1475 check_for_error
1476 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SetDefDoneTitle" --infobox "\nGrub $_SetDefDoneBody" 0 0
1477 sleep 2
1478 fi
1479
1480 BOOTLOADER="Grub"
1481 ;;
1482
1483 "2") # rEFInd
1484 if [[ $UEFI_MOUNT == "/boot/efi" ]]; then
1485 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SetRefiDefTitle" --yesno "$_SetRefiDefBody ${UEFI_MOUNT}/EFI/boot $_SetRefiDefBody2" 0 0
1486
1487 if [[ $? -eq 0 ]]; then
1488 clear
1489 arch_chroot "refind-install --usedefault ${UEFI_PART} --alldrivers" 2>/tmp/.errlog
1490 else
1491 clear
1492 arch_chroot "refind-install" 2>/tmp/.errlog
1493 fi
1494
1495 check_for_error
1496
1497 # Now generate config file to pass kernel parameters. Default read only (ro) changed to read-write (rw),
1498 # and amend where using btfs subvol root
1499 arch_chroot "refind-mkrlconf" 2>/tmp/.errlog
1500 check_for_error
1501 sed -i 's/ro /rw /g' ${MOUNTPOINT}/boot/refind_linux.conf
1502 [[ $BTRFS_MNT != "" ]] && sed -i "s/rw/rw $BTRFS_MNT/g" ${MOUNTPOINT}/boot/refind_linux.conf
1503
1504 BOOTLOADER="rEFInd"
1505 else
1506 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_RefiErrTitle" --msgbox "$_RefiErrBody" 0 0
1507 uefi_bootloader
1508 fi
1509 ;;
1510
1511 "3") # systemd-boot
1512 arch_chroot "bootctl --path=${UEFI_MOUNT} install" 2>>/tmp/.errlog
1513 check_for_error
1514
1515 # Deal with LVM Root
1516 if [[ $LVM_ROOT -eq 0 ]]; then
1517 sysdb_root=$(blkid -s PARTUUID $"/dev/"${ROOT_PART} | sed 's/.*=//g' | sed 's/"//g')
1518 else
1519 sysdb_root="/dev/mapper/${ROOT_PART}"
1520 fi
1521
1522 # Deal with LTS Kernel
1523 if [[ $LTS -eq 1 ]]; then
1524 echo -e "title\tMantOS Linux\nlinux\t/vmlinuz-linux-lts\ninitrd\t/initramfs-linux-lts.img\noptions\troot=PARTUUID=${sysdb_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/MantOS.conf
1525 else
1526 echo -e "title\tMantOS Linux\nlinux\t/vmlinuz-linux\ninitrd\t/initramfs-linux.img\noptions\troot=PARTUUID=${sysdb_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/MantOS.conf
1527 fi
1528
1529 # Fix LVM Root installations, and deal with btrfs root subvolume mounting
1530 [[ $LVM_ROOT -eq 1 ]] && sed -i "s/PARTUUID=//g" ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/MantOS.conf
1531 [[ $BTRFS_MNT != "" ]] && sed -i "s/rw/rw $BTRFS_MNT/g" ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/MantOS.conf
1532
1533 BOOTLOADER="systemd-boot"
1534 # Set the loader file
1535 echo -e "default MantOS\ntimeout 5" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf 2>/tmp/.errlog
1536 check_for_error
1537 ;;
1538
1539 *) install_base_menu
1540 ;;
1541 esac
1542
1543}
1544 check_mount
1545 # Set the default PATH variable
1546 arch_chroot "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/core_perl" 2>/tmp/.errlog
1547 check_for_error
1548
1549 if [[ $SYSTEM == "BIOS" ]]; then
1550 bios_bootloader
1551 else
1552 uefi_bootloader
1553 fi
1554}
1555
1556######################################################################
1557## ##
1558## Main Interfaces ##
1559## ##
1560######################################################################
1561
1562# Greet the user when first starting the installer
1563greeting() {
1564
1565dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_WelTitle $VERSION " --msgbox "$_WelBody" 0 0
1566
1567}
1568
1569# Preparation
1570prep_menu() {
1571
1572 if [[ $SUB_MENU != "prep_menu" ]]; then
1573 SUB_MENU="prep_menu"
1574 HIGHLIGHT_SUB=1
1575 else
1576 if [[ $HIGHLIGHT_SUB != 7 ]]; then
1577 HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 ))
1578 fi
1579 fi
1580
1581 dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PrepTitle" \
1582 --menu "$_PrepBody" 0 0 7 \
1583 "1" "$_ConfBseVirtCon" \
1584 "2" "$_PrepKBLayout" \
1585 "3" "$_DevShowOpt" \
1586 "4" "$_PrepPartDisk" \
1587 "5" "$_PrepLVM" \
1588 "6" "$_PrepMntPart" \
1589 "7" "$_Back" 2>${ANSWER}
1590
1591 HIGHLIGHT_SUB=$(cat ${ANSWER})
1592 case $(cat ${ANSWER}) in
1593 "1") set_keymap
1594 ;;
1595 "2") set_xkbmap
1596 ;;
1597 "3") show_devices
1598 ;;
1599 "4") umount_partitions
1600 select_device
1601 create_partitions
1602 ;;
1603 "5") detect_lvm
1604 deactivate_lvm
1605 find_lvm_partitions
1606 create_lvm
1607 ;;
1608 "6") mount_partitions
1609 ;;
1610 *) main_menu
1611 ;;
1612 esac
1613
1614 prep_menu
1615
1616}
1617
1618# Base Installation
1619install_root_menu() {
1620
1621 if [[ $SUB_MENU != "install_base_menu" ]]; then
1622 SUB_MENU="install_base_menu"
1623 HIGHLIGHT_SUB=1
1624 else
1625 if [[ $HIGHLIGHT_SUB != 4 ]]; then
1626 HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 ))
1627 fi
1628 fi
1629
1630 dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_InstBsMenuTitle" --menu "$_InstBseMenuBody" 0 0 4 \
1631 "1" "$_InstBse" \
1632 "2" "$_MMRunMkinit" \
1633 "3" "$_InstBootldr" \
1634 "4" "$_Back" 2>${ANSWER}
1635
1636 HIGHLIGHT_SUB=$(cat ${ANSWER})
1637 case $(cat ${ANSWER}) in
1638 "1") install_root
1639 ;;
1640 "2") run_mkinitcpio
1641 ;;
1642 "3") install_bootloader
1643 ;;
1644 *) main_menu
1645 ;;
1646 esac
1647
1648 install_root_menu
1649}
1650
1651# Base Configuration
1652config_base_menu() {
1653
1654 # Set the default PATH variable
1655 arch_chroot "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/core_perl" 2>/tmp/.errlog
1656 check_for_error
1657
1658 if [[ $SUB_MENU != "config_base_menu" ]]; then
1659 SUB_MENU="config_base_menu"
1660 HIGHLIGHT_SUB=1
1661 else
1662 if [[ $HIGHLIGHT_SUB != 8 ]]; then
1663 HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 ))
1664 fi
1665 fi
1666
1667 dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ConfBseTitle" --menu "$_ConfBseBody" 0 0 8 \
1668 "1" "$_ConfBseFstab" \
1669 "2" "$_ConfBseHost" \
1670 "3" "$_ConfBseTime" \
1671 "4" "$_ConfBseHWC" \
1672 "5" "$_ConfBseSysLoc" \
1673 "6" "$_ConfUsrRoot" \
1674 "7" "$_ConfUsrNew" \
1675 "8" "$_Back" 2>${ANSWER}
1676
1677 HIGHLIGHT_SUB=$(cat ${ANSWER})
1678 case $(cat ${ANSWER}) in
1679 "1") generate_fstab
1680 ;;
1681 "2") set_hostname
1682 ;;
1683 "3") set_timezone
1684 ;;
1685 "4") set_hw_clock
1686 ;;
1687 "5") set_locale
1688 ;;
1689 "6") set_root_password
1690 ;;
1691 "7") create_new_user
1692 ;;
1693 *) main_menu
1694 ;;
1695 esac
1696
1697 config_base_menu
1698
1699}
1700
1701# Edit configs of installed system
1702edit_configs() {
1703
1704 # Clear the file variables
1705 FILE=""
1706 FILE2=""
1707
1708 if [[ $SUB_MENU != "edit configs" ]]; then
1709 SUB_MENU="edit configs"
1710 HIGHLIGHT_SUB=1
1711 else
1712 if [[ $HIGHLIGHT_SUB != 10 ]]; then
1713 HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 ))
1714 fi
1715 fi
1716
1717 dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SeeConfOptTitle" --menu "$_SeeConfOptBody" 0 0 11 \
1718 "1" "/etc/vconsole.conf" \
1719 "2" "/etc/locale.conf" \
1720 "3" "/etc/hostname" \
1721 "4" "/etc/hosts" \
1722 "5" "/etc/sudoers" \
1723 "6" "/etc/mkinitcpio.conf" \
1724 "7" "/etc/fstab" \
1725 "8" "$BOOTLOADER" \
1726 "9" "/etc/pacman.conf" \
1727 "10" "/etc/pacman.d/mirrorlist" \
1728 "11" "$_Back" 2>${ANSWER}
1729
1730 HIGHLIGHT_SUB=$(cat ${ANSWER})
1731 case $(cat ${ANSWER}) in
1732 "1") FILE="${MOUNTPOINT}/etc/vconsole.conf"
1733 ;;
1734 "2") FILE="${MOUNTPOINT}/etc/locale.conf"
1735 ;;
1736 "3") FILE="${MOUNTPOINT}/etc/hostname"
1737 ;;
1738 "4") FILE="${MOUNTPOINT}/etc/hosts"
1739 ;;
1740 "5") FILE="${MOUNTPOINT}/etc/sudoers"
1741 ;;
1742 "6") FILE="${MOUNTPOINT}/etc/mkinitcpio.conf"
1743 ;;
1744 "7") FILE="${MOUNTPOINT}/etc/fstab"
1745 ;;
1746 "8") case $BOOTLOADER in
1747 "Grub") FILE="${MOUNTPOINT}/etc/default/grub"
1748 ;;
1749 "Syslinux") FILE="${MOUNTPOINT}/boot/syslinux/syslinux.cfg"
1750 ;;
1751 "systemd-boot") FILE="${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/MantOS.conf"
1752 FILE2="${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf"
1753 ;;
1754 "rEFInd") [[ -e ${MOUNTPOINT}${UEFI_MOUNT}/EFI/refind/refind.conf ]] \
1755 && FILE="${MOUNTPOINT}${UEFI_MOUNT}/EFI/refind/refind.conf" || FILE="${MOUNTPOINT}${UEFI_MOUNT}/EFI/BOOT/refind.conf"
1756 FILE2="${MOUNTPOINT}/boot/refind_linux.conf"
1757 ;;
1758 esac
1759 ;;
1760 "9") FILE="${MOUNTPOINT}/etc/pacman.conf"
1761 ;;
1762 "10") FILE="${MOUNTPOINT}/etc/pacman.d/mirrorlist"
1763 ;;
1764 *) main_menu
1765 ;;
1766 esac
1767
1768 # open file(s) with nano
1769 if [[ -e $FILE ]] && [[ $FILE2 != "" ]]; then
1770 nano $FILE $FILE2
1771 elif [[ -e $FILE ]]; then
1772 nano $FILE
1773 else
1774 dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SeeConfErrTitle" --msgbox "$_SeeConfErrBody1" 0 0
1775 fi
1776
1777 edit_configs
1778}
1779
1780main_menu() {
1781
1782 if [[ $HIGHLIGHT != 5 ]]; then
1783 HIGHLIGHT=$(( HIGHLIGHT + 1 ))
1784 fi
1785
1786 dialog --default-item ${HIGHLIGHT} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_MMTitle" \
1787 --menu "$_MMBody" 0 0 5 \
1788 "1" "$_MMPrep" \
1789 "2" "$_MMInstBse" \
1790 "3" "$_MMConfBse" \
1791 "4" "$_SeeConfOpt" \
1792 "5" "$_Done" 2>${ANSWER}
1793
1794 HIGHLIGHT=$(cat ${ANSWER})
1795
1796 # Depending on the answer, first check whether partition(s) are mounted and whether base has been installed
1797 if [[ $(cat ${ANSWER}) -eq 2 ]]; then
1798 check_mount
1799 fi
1800
1801 if [[ $(cat ${ANSWER}) -ge 3 ]] && [[ $(cat ${ANSWER}) -le 4 ]]; then
1802 check_mount
1803 check_base
1804 fi
1805
1806 case $(cat ${ANSWER}) in
1807 "1") prep_menu
1808 ;;
1809 "2") install_root_menu
1810 ;;
1811 "3") config_base_menu
1812 ;;
1813 "4") edit_configs
1814 ;;
1815 *) dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --yesno "$_CloseInstBody" 0 0
1816
1817 if [[ $? -eq 0 ]]; then
1818 umount_partitions
1819 clear
1820 exit 0
1821 else
1822 main_menu
1823 fi
1824
1825 ;;
1826 esac
1827
1828 main_menu
1829
1830}
1831
1832######################################################################
1833## ##
1834## Execution ##
1835## ##
1836######################################################################
1837select_language
1838check_system
1839
1840 while true; do
1841 main_menu
1842 done