forked from linux985/linux985.github.io
-
Notifications
You must be signed in to change notification settings - Fork 1
shell_disk
linux211 edited this page May 13, 2017
·
1 revision
获取系统磁盘名称:
parted -l 2>/dev/null |egrep -o '/dev/[a-z]{3,4}\b'
获取磁盘分区:
parted /dev/sdd print 2>/dev/null|egrep '^[[:space:]]?[1-9][0-9]?'
#!/bin/bash
getCurPath()
{
if [ "` dirname "$0" `" = "" ] || [ "` dirname "$0" `" = "." ]; then
PACKAGE_PATH="`pwd`"
else
cd ` dirname "$0" `
PACKAGE_PATH="`pwd`"
cd - > /dev/null 2>&1
fi
echo $PACKAGE_PATH
}
curpath=$(getCurPath)
declare -r scriptName="createPartitions.sh"
alias LOG_INFO='echoMessage [INFO] [$$] [${scriptName} ${LINENO}] '
alias LOG_WARN='echoMessage [WARN] [$$] [${scriptName} ${LINENO}] '
alias LOG_ERROR='echoMessage [ERROR] [$$] [${scriptName} ${LINENO}] '
# constant params
P1_INDEX=1
P2_INDEX=2
partitionIndex=0
UNPARTITIONED_DEVICE_NAME=""
FATABL_FILE="/etc/fstab"
LOGGER_PATH_FOLDER=/tmp/tool
LOGGER_FILE=system.log
LOGMAXSIZE=5120
P1_SIZE=43G
P1_FS_TYPE=ext3
TMP_P1_MOUNT_PATH=/mnt/tmp-var_log
P1_MOUNT_PATH=/var/log
P2_FS_TYPE=ext3
TMP_P2_MOUNT_PATH=/mnt/tmp-opt
P2_MOUNT_PATH=/opt
echoMessage()
{
# 打印后续信息
local strMsg="$@"
if [ -n "$strMsg" ]; then
# 每一行的首字符大写
strMsg=$(echo "$strMsg" | awk -F'\n' '{print toupper(substr($1,1,1)) substr($1,2);}')
fi
# 打印结果
echo "${strMsg}";
# 记录log文件
logger "${strMsg}" ;
}
createDir()
{
local dir="$1";
if [ ! -d "$dir" ]; then
mkdir -p $dir
fi
}
logger()
{
# 初始化文件目录
createDir $LOGGER_PATH_FOLDER
# 设定权限
chmod 700 ${LOGGER_PATH_FOLDER}/
local LOG_FULL_FILE_PATH=${LOGGER_PATH_FOLDER}/${LOGGER_FILE}
local logsize=0
if [ -e "$LOG_FULL_FILE_PATH" ]; then
logsize=`ls -lk ${LOG_FULL_FILE_PATH} | awk -F " " '{print $5}'`
fi
if [ "$logsize" -gt "$LOGMAXSIZE" ]; then
# 每次删除10000行,约300K
sed -i '1,10000d' $LOG_FULL_FILE_PATH
fi
echo "[$(date -d today +"%Y-%m-%d %H:%M:%S %:::z")] $1" >> ${LOG_FULL_FILE_PATH} 2>/dev/null
chmod 600 ${LOG_FULL_FILE_PATH}
}
init()
{
LOG_INFO "Begin to init"
mkdir -p "${TMP_P1_MOUNT_PATH}"
mkdir -p "${TMP_P2_MOUNT_PATH}"
LOG_INFO "End to init"
}
getUnpartitionedDeviceName()
{
LOG_INFO "Begin to getUnpartitionedDeviceName"
local disk_list=$(parted -l 2>/dev/null|egrep -o '/dev/[a-z]{2}[b-z]{1,2}\>')
if [ -z "$disk_list" ];then
LOG_INFO "there is no extra disk, please insert a new one"
else
for i in $disk_list
do
local isdisk_unparted=$(parted $i print 2>&1|egrep -c '^[[:space:]]?[1-9][0-9]*\>')
if [ $isdisk_unparted == 0 ];then
UNPARTITIONED_DEVICE_NAME=$i
fi
done
if [ -z $UNPARTITIONED_DEVICE_NAME ];then
LOG_INFO "the disk have no extra space,please insert a new one"
exit 0
fi
fi
LOG_INFO "End to getUnpartitionedDeviceName,UNPARTITIONED_DEVICE_NAME=${UNPARTITIONED_DEVICE_NAME}"
}
createPartitions()
{
# Example: createPartitions 1 ext3 0G 43G
LOG_INFO "Begin to createPartitions"
if [ -z "${UNPARTITIONED_DEVICE_NAME}" ];then
{
LOG_ERROR "no available disk found. Please check and run again"
return 1
}
fi
LOG_INFO "createPartitions for P${1} will Begin."
if [ $1 == 1 ];then
parted -s ${UNPARTITIONED_DEVICE_NAME} mklabel msdos
fi
parted -s ${UNPARTITIONED_DEVICE_NAME} mkpart primary $2 $3 $4
eval P${1}_NAME="${UNPARTITIONED_DEVICE_NAME}${1}"
LOG_INFO "createPartitions for P${1} End."
}
mkfs_tmp_mount()
{
# mkfs_tmp_mount ext3 /dev/xvde2 /mnt/tmp_opt
LOG_INFO "mkfs for $2 Begin."
mkfs -t $1 $2
if [ $? == 0 ];then
LOG_INFO "mkfs for $2 Success."
mkdir -p $3
LOG_INFO "mount $2 temporarily"
mount $2 $3 -o errors=panic
else
LOG_INFO "mkfs for $2 Faild."
fi
}
Release_the_Catalog (){
# Example: Release_the_Catalog /var/log
sshd_proc_name='/usr/sbin/sshd'
process_list=`lsof $1|egrep -v "$$|$sshd_proc_name"| awk '$2!~/PID/{print $2 }'|sort -n|uniq`
if [ -n "$process_list" ];then
kill $process_list &>/dev/null||kill -9 $process_list &>/dev/null
fi
}
######################################################################
# FUNCTION : Transfer_Data
# CALLS : N/A
# CALLED BY : main
# INPUT : N/A
# OUTPUT : N/A
# LOCAL VAR : N/A
# USE GLOBVAR: UNPARTITIONED_DEVICE_NAME ,P2_FS_TYPE,TMP_P1_MOUNT_PATH
# RETURN : N/A
# DESCRIPTION:backup the data before mounting
# the disk that already exists
######################################################################
function Transfer_Data(){
# Example: Transfer_Data '/home/zabbix/etc' '/tmp/tmp'
LOG_INFO "Begin Transfer_Data For ${1}."
cd ~
local MOUNT_PATH=$1
local TMP_MOUNT_PATH=$2
Release_the_Catalog $MOUNT_PATH
tar -cpf - -C ${MOUNT_PATH} ./ |tar -xf - -C ${TMP_MOUNT_PATH} && LOG_INFO "Transfer data for $1 Success!"
df -h |grep -q "${P_MOUNT_PATH}"
if [ $? = 0 ];then
umount $MOUNT_PATH
if [ $? != 0 ];then
Release_the_Catalog $MOUNT_PATH
umount $MOUNT_PATH
fi
fi
umount ${TMP_MOUNT_PATH}
rmdir ${TMP_MOUNT_PATH}
LOG_INFO "End Transfer_Data For ${1}."
}
MountPartition (){
local P_NAME=$1
local P_MOUNT_PATH=$2
local P_FS_TYPE=$3
df -h |grep -q "${P_MOUNT_PATH}"
if [ $? = 0 ];then
umount $P_MOUNT_PATH
if [ $? != 0 ];then
Release_the_Catalog $P_MOUNT_PATH
sleep 1
umount -f $P_MOUNT_PATH
fi
fi
sleep 2
mount -t ext3 ${P_NAME} ${P_MOUNT_PATH} -o errors=panic
sleep 4
#show the result
local P_name=$(echo ${P_NAME##*/})
sed -i "/${P_name}/d" ${FATABL_FILE}
grep -v "${P_MOUNT_PATH}" ${FATABL_FILE} >${FATABL_FILE}.tmp
mv ${FATABL_FILE}.tmp ${FATABL_FILE}
echo "${P_NAME} ${P_MOUNT_PATH} ${P_FS_TYPE} defaults,errors=panic 1 2" >> ${FATABL_FILE}
mount -a
LOG_INFO "$(df -h)"
}
function Start_Process()
{
LOG_INFO "get unpartitioned device name"
getUnpartitionedDeviceName
LOG_INFO "the unpartitioned device name is ${UNPARTITIONED_DEVICE_NAME}"
LOG_INFO "create partition for ${UNPARTITIONED_DEVICE_NAME} Begin."
createPartitions ${P1_INDEX} ${P1_FS_TYPE} 0G ${P1_SIZE}
createPartitions ${P2_INDEX} ${P2_FS_TYPE} ${P1_SIZE} 100%
LOG_INFO "create partition for ${UNPARTITIONED_DEVICE_NAME} End."
# force fresh the linux core to know the new partition
partprobe
sleep 5
partx ${UNPARTITIONED_DEVICE_NAME}
sleep 3
LOG_INFO "mkfs and mount Begin."
mkfs_tmp_mount ${P1_FS_TYPE} ${P1_NAME} ${TMP_P1_MOUNT_PATH}
mkfs_tmp_mount ${P2_FS_TYPE} ${P2_NAME} ${TMP_P2_MOUNT_PATH}
LOG_INFO "mkfs and mount End."
service cron stop||systemctl stop crond
service ntp stop||systemctl stop ntpd
Transfer_Data "$P1_MOUNT_PATH" "$TMP_P1_MOUNT_PATH"
Transfer_Data "$P2_MOUNT_PATH" "$TMP_P2_MOUNT_PATH"
MountPartition ${P1_NAME} ${P1_MOUNT_PATH} ${P1_FS_TYPE}
MountPartition ${P2_NAME} ${P2_MOUNT_PATH} ${P2_FS_TYPE}
service cron start||systemctl start crond
service ntp start||systemctl start ntpd
service sshd start||systemctl start sshd
}
Main_Process()
{
local var_log_size=`df -m|awk '$1~/\dev\/[a-z][a-z][b-z]?[b-z][1-9]/&&$6~/\/var\/log$/{print $4 }'`
local opt_size=`df -m|awk '$1~/\dev\/[a-z][a-z][b-z]?[b-z][1-9]/&&$6~/\/opt$/{print $4}'`
if [ -z "$var_log_size" -a -z "$opt_size" ];then
Start_Process
else
LOG_INFO "nothing to do"
exit 0
fi
}
case $1 in
normal)
Main_Process;;
force)
Start_Process;;
*)
shell_name=`basename $0`
echo Usage:" sh $shell_name [normal|force]"
esac
exit 0