Compare commits

..

10 Commits

106
setup.sh
View File

@@ -65,22 +65,21 @@ function get_parts () {
} }
function we_have_exactly_one_part () { function we_have_exactly_one_part () {
declare parttype parts_list parts_count local parttype parts_list parts_count
parttype="${1:?}" parttype="${1:?}"
parts_list="${2:?}" parts_list="${2:?}"
parts_count="$(wc -l <<<"${parts_list}")" parts_count="$(wc -l <<<"${parts_list}")"
if [[ "$(wc -c <<<"${parts_list}")" -gt '1' ]]; then if [[ "$(wc -c <<<"${parts_list}")" -gt '1' ]]; then
case "${parts_count}" in case "${parts_count}" in
0) 0)
printf -- '%s\n' 'No '"${parttype}"' partition found. Exiting 1 ...' printf -- '%s\n' 'No '"${parttype^^}"' partition found. Exiting 1 ...'
exit 1 exit 1
;; ;;
1) 1)
return 0 return 0
;; ;;
*) *)
printf -- '%s\n' 'Multiple '"${parttype}"' partitions found. We expect exactly one. Cowardly exiting 1 ...' return 1
exit 1
;; ;;
esac esac
printf -- '%s\n' 'Partition list does not look valid. Cowardly exiting 1 ...' printf -- '%s\n' 'Partition list does not look valid. Cowardly exiting 1 ...'
@@ -88,6 +87,46 @@ function we_have_exactly_one_part () {
fi fi
} }
function get_drive_id () {
declare drive_id
drive_id="$(find -L /dev/disk/by-id -samefile "${1:?}")"
if [[ "$(wc -l <<<"${drive_id}")" -eq '1' ]] && [[ "$(wc -c <<<"${drive_id}")" -gt '1' ]]; then
printf -- '%s' "${drive_id}"
return 0
fi
printf -- '%s\n' 'Not exactly one '"'${1:?}'"' partition entry in /dev/disk/by-id, exiting 1 ...'
exit 1
}
function select_part () {
local parts enriched_parts enriched_parts_count part_number part_type
declare part
part_type="${1:?}" # 'efi' or 'zfs'
parts="$(get_parts "${part_type}")"
if we_have_exactly_one_part "${part_type}" "${parts}"; then
part="${parts}"
else
printf -- '%s\n' 'Which '"${part_type^^}"' partition do you want us to use?'
while IFS= read -r found_part; do
enriched_parts+=("'${found_part}'"' (aka ID '"'$(get_drive_id "${found_part}")'"')')
done <<<"${parts}"
enriched_parts_count="${#enriched_parts[@]}"
select part in "${enriched_parts[@]}"; do
part_number="${REPLY}"
if [[ "${part_number}" -le "${enriched_parts_count}" ]]; then
part="$(sed "${REPLY}q;d" <<<"${parts}")"
printf -- '%s\n' 'You'"'"'ve selected '"'${part}'"' ...'
break
else
printf -- '%s\n' 'Invalid option, please choose between 1 and '"${enriched_parts_count}"
fi
done
fi
printf -- '%s' "${part}"
return 0
}
function no_zpool_exists () { function no_zpool_exists () {
declare zpool_list declare zpool_list
zpool_list="$(zpool list -H)" zpool_list="$(zpool list -H)"
@@ -95,17 +134,6 @@ function no_zpool_exists () {
return 1 return 1
} }
function zpool_drive_id () {
declare drive_id
drive_id="$(find -L /dev/disk/by-id -samefile "${1:?}")"
if [[ "$(wc -l <<<"${drive_id}")" -eq '1' ]]; then
printf -- '%s' "${drive_id}"
return 0
fi
printf -- '%s\n' 'More than zpool partition entry in /dev/disk/by-id, exiting 1 ...'
exit 1
}
function set_zpool_password () { function set_zpool_password () {
# May or may not have a newline at the end, ZFS doesn't care # May or may not have a newline at the end, ZFS doesn't care
printf -- '%s' 'password' > '/etc/zfs/'"${zpool_name}"'.key' printf -- '%s' 'password' > '/etc/zfs/'"${zpool_name}"'.key'
@@ -162,7 +190,7 @@ function export_pool () {
function setup_zpool () { function setup_zpool () {
declare zpool_drive drive_by_id declare zpool_drive drive_by_id
zpool_drive="${1:?}" zpool_drive="${1:?}"
drive_by_id="$(zpool_drive_id "${zpool_drive}")" drive_by_id="$(get_drive_id "${zpool_drive}")"
set_zpool_password set_zpool_password
if no_zpool_exists; then if no_zpool_exists; then
@@ -182,12 +210,9 @@ function mount_system () {
zfs mount "${zpool_name}"'/root/'"${zfs_arch_dataset_name}" zfs mount "${zpool_name}"'/root/'"${zfs_arch_dataset_name}"
zfs mount -a zfs mount -a
declare efi_part local efi_part="$(select_part 'efi')"
efi_part="$(get_parts 'efi')" mkdir -p '/mnt/efi'
if we_have_exactly_one_part 'efi' "${efi_part}"; then mount "${efi_part}" '/mnt/efi'
mkdir -p '/mnt/efi'
mount "${efi_part}" '/mnt/efi'
fi
} }
function copy_zpool_cache () { function copy_zpool_cache () {
@@ -544,26 +569,25 @@ function main () {
else else
set_ntp set_ntp
update_pacman_db update_pacman_db
install_pkgs 'jq' install_pkgs 'jq'
declare zfs_part local zfs_part
zfs_part="$(get_parts 'zfs')" zfs_part="$(select_part 'zfs')"
if we_have_exactly_one_part 'zfs' "${zfs_part}"; then
printf -- 'Creating zpool on partition '"'"'%s'"'"' ...\n' "${zfs_part}" install_zfs
install_zfs setup_zpool "${zfs_part}"
setup_zpool "${zfs_part}" mount_system
mount_system copy_zpool_cache
copy_zpool_cache install_archlinux
install_archlinux gen_fstab
gen_fstab set_hostname
set_hostname set_locale
set_locale add_zfs_hook_to_initramfs
add_zfs_hook_to_initramfs set_initramfs_build_list
set_initramfs_build_list add_zfs_files_to_new_os
add_zfs_files_to_new_os enter_chroot
enter_chroot # We're done in chroot
# We're done in chroot finalize_os_setup
finalize_os_setup
fi
fi fi
} }