Last active
December 18, 2016 10:22
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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