#!/bin/bash ######################### # HELP ######################### export DEBIAN_FRONTEND=noninteractive help() { echo "This script init disks on Ubuntu" echo "" echo "Options:" echo " -b base directory for mount points (default: /usr/local/nebula)" echo " -o mount options for data disk" echo " -h default help message" } log() { echo \["$(date +%Y/%m/%d-%H:%M:%S)"\] "$1" echo \["$(date +%Y/%m/%d-%H:%M:%S)"\] "$1" >>/var/log/nebula-install.log } ######################### # Preconditions ######################### if [ "${UID}" -ne 0 ]; then log "Script executed without root permissions" echo "You must be root to run default program." >&2 exit 3 fi ######################### # Parameter handling ######################### # Base path for data disk mount points DATA_BASE="/usr/local/nebula" # Mount options for data disk MOUNT_OPTIONS="noatime,nodiratime,nodev,noexec,nosuid,nofail" while getopts :b:h:o optname; do log "Option $optname set with value ${OPTARG}" case ${optname} in b) #Set base path for data disks DATA_BASE=${OPTARG} ;; o) #mount option MOUNT_OPTIONS=${OPTARG} ;; h) #show help help exit 2 ;; \?) #unrecognized option - show help echo -e \\n"Option -${BOLD}$OPTARG${NORM} not allowed." help exit 2 ;; esac done ######################### # Installation steps as functions ######################### is_partitioned() { OUTPUT=$(partx -s "${1}" 2>&1) grep -E "failed to read partition table" <<<"${OUTPUT}" >/dev/null 2>&1 local EXIT_CODE=$? if [ $EXIT_CODE -eq 0 ]; then return 1 else return 0 fi } has_filesystem() { DEVICE=${1} OUTPUT=$(file -L -s "${DEVICE}") grep filesystem <<<"${OUTPUT}" >/dev/null 2>&1 return $? } add_to_fstab() { UUID=${1} MOUNTPOINT=${2} log "calling fstab with UUID: ${UUID} and mount point: ${MOUNTPOINT}" grep "${UUID}" /etc/fstab >/dev/null 2>&1 local EXIT_CODE=$? if [ $EXIT_CODE -eq 0 ]; then log "Not adding ${UUID} to fstab again (it's already there!)" else LINE="UUID=\"${UUID}\"\t${MOUNTPOINT}\text4\t${MOUNT_OPTIONS}\t1 2" echo -e "${LINE}" >>/etc/fstab fi } do_partition() { DISK=${1} log "create partition for ${DISK} with parted" parted -s "${DISK}" -- mklabel gpt mkpart primary 0% 100% local EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then log "An error occurred partitioning ${DISK}" echo "An error occurred partitioning ${DISK}" >&2 echo "I cannot continue" >&2 exit $EXIT_CODE fi } scan_partition_format() { DISK=${1} log "Working on ${DISK}" is_partitioned "${DISK}" local EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then log "${DISK} is not partitioned, partitioning" do_partition "${DISK}" fi PARTITION=$(fdisk -l "${DISK}" | grep -A 1 Device | tail -n 1 | awk '{print $1}') has_filesystem "${PARTITION}" if [ $EXIT_CODE -ne 0 ]; then log "Creating filesystem on ${PARTITION}." # echo "Press Ctrl-C if you don't want to destroy all data on ${PARTITION}" # sleep 10 mkfs -j -t ext4 "${PARTITION}" fi MOUNTPOINT="${DATA_BASE}/disk1" [ -d "${MOUNTPOINT}" ] || mkdir -p "${MOUNTPOINT}" read UUID FS_TYPE < <(blkid -u filesystem "${PARTITION}" | awk -F "[= ]" '{print $3" "$5}' | tr -d "\"") add_to_fstab "${UUID}" "${MOUNTPOINT}" log "Mounting disk ${PARTITION} on ${MOUNTPOINT}" mount -t ext4 "${PARTITION}" "${MOUNTPOINT}" } ######################### # Create Partitions sequence ######################### scan_partition_format "/dev/nvme1n1" exit 0