本文用于记录redis安装脚本编写并将redis5.0.14源码包嵌入脚本的过程。
0x00.编写思路
-
通过read命令获取redis端口、redis安装目录、redis需要以什么账户运行(提供默认值)
-
将嵌入到脚本中的redis源码包释放到临时目录并进行编译安装
-
释放相关配置文件至对应目录中并开启redis服务
0x01.具体实现
-
通过命令行控制获取用户输入,如果用户未进行输入,则提供默认值
示例代码:
if [ -z $REDIS_BASE ] ; then _MANUAL_EXECUTION=true _REDIS_BASE=/opt/redis read -p "Please select the redis home dir name [$_REDIS_BASE] " REDIS_BASE if [ -z "$REDIS_BASE" ] ; then REDIS_BASE=$_REDIS_BASE echo "Selected default - $_REDIS_BASE" fi fi
-
获取脚本文件中的redis源码包并进行释放
由于采用base64编码方式(该方式释放后可以保证文件md5值不被改变)将redis源码包放入脚本末尾,因此需要通过awk获取redis数据存放在脚本的开始位置,通过tail命令指定跳过行数将redis数据提取到某位置后,还原成redis源码包。为避免安装覆盖掉原有redis,需要进行一些判断处理。
示例代码:
buid_install() { if gcc --version >/dev/null ; then if [ ! -e ${REDIS_BASE}/bin/redis-server ] ; then skip_rownum=$(awk '/^#__BIN_FILE_BEGIN__/ {print NR + 1; exit 0; }' "$1") zipname=/tmp/redis-5.0.14.tar.gz tmpname=/tmp/redis_file tail -n +${skip_rownum} "$1" >${tmpname} base64 -d ${tmpname} > ${zipname} md5="406a4ddbdf0b60b4f288bf0c3cb06933" tmpmd5=$(md5sum ${zipname}|cut -f1 -d' ') if [ "$md5"="$tmpmd5" ] ; then cd $(dirname ${zipname}) tar zxf $(basename ${zipname}) cd ${zipname$.tar.gz} make -j$(cat /proc/cpuinfo |grep "physical id"|wc -l) >/dev/null make install PREFIX=$2 rm -rf /tmp/redis* else rm -rf /tmp/redis* die "Emmmmm....The installation package is damaged and the installation is stopped." fi else echo "Skiping Build..." fi else die "GCC is not installed, installation exit" fi }
-
释放相关文件
释放redis配置文件:
CONF_FILE=${REDIS_BASE}/conf/${REDIS_PORT}.conf cat >${CONF_FILE} <<EOF bind 0.0.0.0 protected-mode yes port 6379 requirepass ${PASSWD} masterauth ${PASSWD} tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised no pidfile ${PIDFILE} loglevel notice logfile ${LOGFILE} databases 16 always-show-logo yes save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /opt/redis/data/6379 replica-serve-stale-data yes replica-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no replica-priority 100 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no replica-lazy-flush no appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 stream-node-max-bytes 4096 stream-node-max-entries 100 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit replica 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 dynamic-hz yes aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes EOF
释放用于systemed的redis环境变量文件:
cat >${REDIS_BASE}/conf/redis-env-${REDIS_PORT} <<EOF PASSWORD=${PASSWD} PORT=${REDIS_PORT} CONFIG_FILE=${CONF_FILE} EOF
释放用于关闭Transparent Huge Pages(大内存页)的脚本并配置开机运行:
由于redis的特性,开启大页内存会影响性能
cat > ${REDIS_BASE}/bin/close_thp.sh <<EOF #!/bin/bash if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi EOF chmod +x ${REDIS_BASE}/bin/close_thp.sh if ! grep "${REDIS_BASE}/bin/close_thp.sh" /etc/rc.local ; then cat >> /etc/rc.local <<EOF bash ${REDIS_BASE}/bin/close_thp.sh EOF fi chmod +x /etc/rc.local
释放systemed单元配置文件及配置PATH环境变量:
cat > /usr/lib/systemd/system/redis_${REDIS_PORT}.service <<EOF [Unit] Description=The redis service is deployed by BitBears After=syslog.target network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=${PIDFILE} EnvironmentFile=${REDIS_BASE}/conf/redis-env-${REDIS_PORT} ExecStart=${REDIS_BASE}/bin/redis-server \${CONFIG_FILE} ExecStop=${REDIS_BASE}/bin/redis-cli -a "\${PASSWORD}" -p \${PORT} shutdown Restart=on-failure RestartSec=10 User=${USERNAME} Group=${GROUPNAME} LimitNOFILE=65535 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now redis_${REDIS_PORT} cat >/etc/profile.d/BitBears_redis.sh <<EOF REDIS_HOME=$REDIS_BASE && export REDIS_HOME PATH=\${REDIS_HOME}/bin:\${PATH} && export PATH EOF source /etc/profile.d/BitBears_redis.sh
0x02.成品及使用方式
-
下载脚本
https://download.youkuaiyun.com/download/bitpanda_1/53410491https://download.youkuaiyun.com/download/bitpanda_1/53410491
-
解压脚本并赋予权限
-
运行命令并按提示输入相关参数