Skip to content

Instantly share code, notes, and snippets.

@justsml
Last active December 18, 2016 10:22
Show Gist options
  • Save justsml/6e1f69b3e3afa5a10455438dd7322e66 to your computer and use it in GitHub Desktop.
Save justsml/6e1f69b3e3afa5a10455438dd7322e66 to your computer and use it in GitHub Desktop.
Automatically sets up NVMe drives on Linux servers. ~~~ Tested on Packet.net's Amazing `Type3` Servers.
#!/bin/bash
# This Script: https://gist.github.com/justsml/6e1f69b3e3afa5a10455438dd7322e66
# Description: Automated setup of NVMe SSD disk(s) (supports a single drive or 2 in RAID0 or RAID1)
# Tested on Packet.net's MASSIVE Type3 Servers w/ Ububtu/Debian (check packet.net out, those guys are amazing)
# Author: Dan Levy github.com/justsml
# Credit/Original Ref: https://www.packet.net/help/kb/how-do-i-configure-an-nvme-flash-drive/
set -x
# OPTIONS
NVME_DEVICE_EXISTS="$(lsblk | grep 'nvme0' 2>/dev/null)"
NVME_ALREADY_SETUP="$(fdisk -l 2>/dev/null | grep --count '/dev/nvme0n1')"
# All RAID_* vars are optional - 2 disks are required
RAID_LEVEL=${RAID_LEVEL-"1"}
RAID_DEVICE_NAME=${RAID_DEVICE_NAME-"md0"}
RAID_DEVICE_EXISTS=$(df | grep "/dev/$RAID_DEVICE_NAME")
set -e
function setup_raid () {
printf "\n\n*** Auto Configuring RAID $RAID_LEVEL ***\n\n"
## Auto-config RAID based on availability of 2nd nvme device
# - Credit/Ref: http://www.ducea.com/2009/03/08/mdadm-cheat-sheet/
if [ "$RAID_LEVEL" != "" ]; then
printf " - RAID$RAID_LEVEL Auto Config\n\n"
mdadm --create --verbose /dev/$RAID_DEVICE_NAME --level=$RAID_LEVEL /dev/nvme0n1 /dev/nvme1n1
export NVME_DEVICE_PATH=/dev/$RAID_DEVICE_NAME
printf " - RAID$RAID_LEVEL Configured! /dev/$RAID_DEVICE_NAME\n\n"
printf "============\n"
printf "RAID Status (cat /proc/mdstat)\n"
cat /proc/mdstat
printf "============\n"
printf "Available S/HDD Space (df -h)\n"
df -h
TARGET_MOUNT_DEVICE="/dev/$RAID_DEVICE_NAME"
fi
}
function partition_drives () {
printf '\n\n*** Check for NVMe HDDs ***\n\n'
if [ "$(lsblk | grep 'nvme0')" != "" ]; then
printf ' - Found: nvme0\n'
parted -a optimal /dev/nvme0n1 mklabel gpt
parted -a optimal /dev/nvme0n1 mkpart primary ext4 0% 100%
sleep 4s
mkfs.ext4 /dev/nvme0n1
TARGET_MOUNT_DEVICE="/dev/nvme0n1"
printf ' - Partitioned: nvme0\n'
else
printf '\n[NVMe disk 1 could be found]\n'
fi
if [ "$(lsblk | grep 'nvme1')" != "" ]; then
printf ' - Found: nvme1\n'
parted -a optimal /dev/nvme1n1 mklabel gpt
parted -a optimal /dev/nvme1n1 mkpart primary ext4 0% 100%
sleep 4s
mkfs.ext4 /dev/nvme1n1
printf ' - Partitioned: nvme1\n'
setup_raid
fi
### Disks initialized
}
function safety_first () {
if [ "$UID" != "0" ]; then
printf '\n\n\n*** ERROR: Must be root. Prefix command w/ sudo. Exiting...\n'
exit -1
else
printf "\n[ Detected Required Permissions (root) ]\n"
fi
if [ ! -f "$(which parted)" ]; then
apt-get update && apt-get install parted -y
fi
if [ "$(echo $NVME_DEVICE_EXISTS | egrep '^0')" != "" ]; then
printf "\nINFO: No NVMe Devices Found\n\n"
exit 0
fi
if [ "$NVME_ALREADY_SETUP" == "" ]; then
if [ "$RAID_DEVICE_EXISTS" == "" ]; then
printf "\n\nWARNING: RAID DEVICE ALREADY EXISTS /dev/$RAID_DEVICE_NAME"
else
partition_drives
fi
else
printf '\n\n\n ^^^^ Note: NVMe DRIVES ALREADY SETUP ^^^^ \n'
printf "NVME_ALREADY_SETUP: $NVME_ALREADY_SETUP"
printf ' [ exiting... ] \n'
exit 0
fi
}
function mount_data () {
mkdir -p $TARGET_MOUNT_PATH
mount $TARGET_MOUNT_DEVICE $TARGET_MOUNT_PATH -t ext4
}
function add_to_startup () { # NOT USED CURRENTLY
mount | grep nvme >> /etc/fstab
}
safety_first
if [ "$TARGET_MOUNT_DEVICE" == "" ]; then
mount_data
printf "\n\n###### DONE SETTING UP NVME $TARGET_MOUNT_PATH on $TARGET_MOUNT_DEVICE\n============\n\n\n"
else
printf "\n\n *** *** \n\n"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment