LVM_addDisk.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #!/bin/bash
  2. # Author : mrkips (Cybergavin)
  3. # Date Created : 18th March 2017
  4. # Description : This is a utility script that provisions mountpoints (using LVM) when hard disks are added to VMs.
  5. # Tested with RHEL 7 and CentOS 8.
  6. #
  7. #~~~~~~~~~~~~~~~~~~
  8. # VERSION HISTORY
  9. #~~~~~~~~~~~~~~~~~~
  10. # v1.0 | 18-Mar-2017 | First Version
  11. #
  12. #######################################################################################################
  13. #
  14. # Redirect unhandled stderr
  15. #
  16. exec 2> /var/log/LVM_addDisk.err
  17. #
  18. # Only allow execution with root privileges
  19. #
  20. if [ "$(id -u)" != "0" ]; then
  21. printf "\nThis script must be executed with root privileges. Exiting...\n"
  22. exit 1
  23. fi
  24. #
  25. # Determine Script Location
  26. #
  27. if [ -n "`dirname $0 | grep '^/'`" ]; then
  28. SCRIPT_LOCATION=`dirname $0`
  29. elif [ -n "`dirname $0 | grep '^..'`" ]; then
  30. cd `dirname $0`
  31. SCRIPT_LOCATION=$PWD
  32. cd - > /dev/null
  33. else
  34. SCRIPT_LOCATION=`echo ${PWD}/\`dirname $0\` | sed 's#\/\.$##g'`
  35. fi
  36. SCRIPT_NAME=`basename $0`
  37. if [ ! -f ${SCRIPT_LOCATION}/${SCRIPT_NAME} ]; then
  38. printf "\n`date '+%Y%m%d_%H%M'` : ERROR : Could not detect script location and/or name. Check and test script. Exiting...\n"
  39. exit 1
  40. fi
  41. function helpme
  42. {
  43. cat<<EOF
  44. ~~~~~~~~~~~~~~~~~~~~~~ LVM_addDisk USAGE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  45. $(echo -e "${YELLOW}USE CASE 1: A single hard disk added to the VM.${NC}")
  46. $(echo -e "${GREEN}./${SCRIPT_NAME} -n <name of mount point>${NC}")
  47. Example: For a single hard disk added to a VM (presented as any device file /dev/sd?):
  48. ./LVM_addDisk.sh -n log
  49. $(echo -e "${YELLOW}USE CASE 2: Multiple hard disks added to the VM.${NC}")
  50. $(echo -e "${GREEN}./${SCRIPT_NAME} -n <name of mount point> -m <mount point>${NC}")
  51. Example: For multiple hard disks added to a VM and presented as device files /dev/sdb and /dev/sdc:
  52. ./LVM_addDisk.sh -n app -m /dev/sdb
  53. ./LVM_addDisk.sh -n log -m /dev/sdc
  54. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  55. EOF
  56. exit 100
  57. }
  58. function lvmCreate
  59. {
  60. mp_name=$1
  61. mp=$2
  62. appcount=0
  63. pvcreate $mp
  64. [[ $? -ne 0 ]] && appcount=$(( appcount + 1 ))
  65. lvi=$(vgdisplay | awk '/VG Name/{print $NF}' | awk -F'vg0' '{print $2}' | sort -n | tail -1)
  66. myvi=$(( lvi + 1 ))
  67. myvg=vg0${myvi}
  68. vgcreate $myvg $mp
  69. [[ $? -ne 0 ]] && appcount=$(( appcount + 1 ))
  70. mype=`vgdisplay $myvg | grep "Total PE" | awk '{print $3}'`
  71. lvcreate -l $mype $myvg -n $mp_name
  72. [[ $? -ne 0 ]] && appcount=$(( appcount + 1 ))
  73. vgchange -aly $myvg
  74. [[ $? -ne 0 ]] && appcount=$(( appcount + 1 ))
  75. mkfs.xfs /dev/mapper/${myvg}-${mp_name}
  76. [[ $? -ne 0 ]] && appcount=$(( appcount + 1 ))
  77. mkdir /${mp_name}
  78. [[ $? -ne 0 ]] && appcount=$(( appcount + 1 ))
  79. echo "/dev/mapper/${myvg}-${mp_name} /${mp_name} xfs defaults,nodev,nosuid 0 0" >> /etc/fstab
  80. [[ $? -ne 0 ]] && appcount=$(( appcount + 1 ))
  81. mount /${mp_name}
  82. [[ $? -ne 0 ]] && appcount=$(( appcount + 1 ))
  83. if [ $appcount -eq 0 ]; then
  84. echo -e "${GREEN}INFO${NC}: Provisioned unused storage device $mp as /${MP_NAME}"
  85. else
  86. echo -e "${RED}ERROR${NC}: Failed to provision unused storage device $mp."
  87. fi
  88. }
  89. #
  90. # Main
  91. #
  92. clear
  93. #
  94. # Variables
  95. #
  96. GREEN="\033[0;32m"
  97. RED="\033[0;31m"
  98. YELLOW="\033[0;33m"
  99. NC="\033[0m" # No Color
  100. #
  101. # Parse input parameters
  102. #
  103. if [ $# -eq 0 ]; then
  104. helpme
  105. fi
  106. while getopts ":n:m:h" opt; do
  107. case $opt in
  108. n) MP_NAME=$OPTARG
  109. ;;
  110. m) MP=$OPTARG
  111. ;;
  112. h) helpme
  113. ;;
  114. \?) echo "Invalid option: -$OPTARG"
  115. helpme
  116. ;;
  117. :) echo "Option -$OPTARG requires an argument."
  118. helpme
  119. ;;
  120. esac
  121. done
  122. shift $((OPTIND-1))
  123. #
  124. # Device File Validation
  125. #
  126. d_count=0
  127. for d in `ls /dev/sd[b-z]`
  128. do
  129. if [ -z "`pvdisplay | grep $d`" ]; then
  130. d_count=$(( d_count + 1 ))
  131. d_name=$d
  132. fi
  133. done
  134. #
  135. # Provision mount point
  136. #
  137. if [ $d_count -eq 1 -a -n "${MP_NAME}" ]; then
  138. echo -e "${GREEN}INFO${NC}: Found unused storage device $d_name. Provisioning /${MP_NAME}..."
  139. lvmCreate ${MP_NAME} $d_name
  140. elif [ $d_count -gt 1 -a -n "${MP_NAME}" -a -n "${MP}" ]; then
  141. echo -e "${GREEN}INFO${NC}: Provisioning ${MP} as /${MP_NAME}..."
  142. lvmCreate ${MP_NAME} ${MP}
  143. elif [ $d_count -eq 0 ]; then
  144. echo -e "${YELLOW}WARNING${NC}: No unused storage devices (hard disks) found. Exiting...."
  145. else
  146. helpme
  147. fi