diff options
| author | Qiuwen Lu <[email protected]> | 2016-11-02 19:32:45 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2016-11-02 19:32:45 +0800 |
| commit | faa23bca6c775e850414cf38a4ca63ef0586083a (patch) | |
| tree | beb4c08f6db8b5b8677cf8c901857a1fa53fbdc2 /tools/systemd | |
| parent | 52066fce31fa1fc26732740e341fc063569f1a92 (diff) | |
增加对Systemd(CentOS7)的自动化启动支持。
Diffstat (limited to 'tools/systemd')
| -rw-r--r-- | tools/systemd/mrenv-script | 308 | ||||
| -rw-r--r-- | tools/systemd/mrenv.service.in | 13 | ||||
| -rw-r--r-- | tools/systemd/mrzcpd.service.in | 12 |
3 files changed, 333 insertions, 0 deletions
diff --git a/tools/systemd/mrenv-script b/tools/systemd/mrenv-script new file mode 100644 index 0000000..9b047af --- /dev/null +++ b/tools/systemd/mrenv-script @@ -0,0 +1,308 @@ +#!/bin/bash +# + +if [ -z "$MRZCPD_ROOT" ]; then + MRZCPD_ROOT=$(pkg-config mrzcpd --variable=prefix) +fi + +if [ -z "$HUGEPAGE_NUM_2M" ]; then + HUGEPAGE_NUM_2M=0 +fi + +if [ -z "$HUGEPAGE_NUM_1G" ]; then + HUGEPAGE_NUM_1G=0 +fi + +if [ -z "$PCI_ADDR_IXGBE" ]; then + PCI_ADDR_IXGBE="" +fi + +if [ -z "$PCI_ADDR_IGB" ]; then + PCI_ADDR_IGB="" +fi + +MODULE_PATH=$MRZCPD_ROOT/lib/modules/$(uname -r)/extra/mrzcpd +BIN_PATH=$MRZCPD_ROOT/bin/ +KNI_MODULE=rte_kni +UIO_MODULE=igb_uio + +NR_HUGEPAGE_FILE_2M=/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages +NR_HUGEPAGE_FILE_1G=/sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages +HUGEPAGE_PATH_2M=/mnt/.huge_2M +HUGEPAGE_PATH_1G=/mnt/.huge_1G + +DAEMON=$BIN_PATH/zcpd +NICTOOL=$BIN_PATH/mr_nic_bind +KNI_MODULE_FILENAME=$KNI_MODULE.ko +UIO_MODULE_FILENAME=$UIO_MODULE.ko + +function module_unload_uio() +{ + lsmod | grep -s $UIO_MODULE > /dev/null 2>&1 + [ $? -eq 0 ] && rmmod $UIO_MODULE 2>&1 + [ ! $? -eq 0 ] && return 1 + return 0 +} + +function module_unload_kni() +{ + lsmod | grep -s $KNI_MODULE > /dev/null 2>&1 + [ $? -eq 0 ] && rmmod $KNI_MODULE 2>&1 + [ ! $? -eq 0 ] && return 1 + return 0 +} + +function module_load_kni() +{ + if [ ! -e $MODULE_PATH/$KNI_MODULE_FILENAME ]; then + echo -n "$KNI_MODULE_FILENAME does not existed. " + return 1 + fi + + module_unload_kni + insmod $MODULE_PATH/$KNI_MODULE_FILENAME > /dev/null 2>&1 + [ ! $? -eq 0 ] && echo -n " $MODULE_PATH/$KNI_MODULE_FILENAME load failure." && return 1 + return 0 +} + +function module_load_uio() +{ + if [ ! -e $MODULE_PATH/$UIO_MODULE_FILENAME ]; then + echo -n "$MODULE_PATH/$UIO_MODULE_FILENAME does not existed. Check DPDK is installed or not. " + return 1 + fi + + module_unload_uio + modprobe uio &> /dev/null + insmod $MODULE_PATH/$UIO_MODULE_FILENAME + [ ! $? -eq 0 ] && echo -n "$MODULE_PATH/$UIO_MODULE_FILENAME load failure." && return 1 + return 0 +} + +function huge_release_1G() +{ + cat /proc/mounts | grep "$HUGEPAGE_PATH_1G" > /dev/null + grep -s "$HUGEPAGE_PATH_1G" /proc/mounts > /dev/null + if [ $? -eq 0 ]; then + umount $HUGEPAGE_PATH_1G > /dev/null + [ ! $? -eq 0 ] && echo "umount 1G hugepage failure, maybe in use" && return 1 + fi + + if [ -d $HUGEPAGE_PATH_1G ] ; then + rm -R $HUGEPAGE_PATH_1G + [ ! $? -eq 0 ] && echo "Cannot delete 2M hugepage" && return 1 + fi + return 0 +} + +function huge_release_2M() +{ + cat /proc/mounts | grep "$HUGEPAGE_PATH_2M" > /dev/null + grep -s "$HUGEPAGE_PATH_2M" /proc/mounts > /dev/null + if [ $? -eq 0 ]; then + umount $HUGEPAGE_PATH_2M > /dev/null + [ ! $? -eq 0 ] && echo "umount 2M hugepage failure, maybe in use" && return 1 + fi + + if [ -d $HUGEPAGE_PATH_2M ] ; then + rm -R $HUGEPAGE_PATH_2M + [ ! $? -eq 0 ] && echo "Cannot delete 2M hugepage" && return 1 + fi + + if [ -e $NR_HUGEPAGE_FILE_2M ]; then + echo -n 0 > $NR_HUGEPAGE_FILE_2M + fi + + return 0 +} + +function huge_alloc_1G() +{ + if [ ! -e $NR_HUGEPAGE_FILE_1G ]; then + return 1 + fi + + SIZE_1G=$(cat $NR_HUGEPAGE_FILE_1G) + [ $SIZE_1G -eq 0 ] && echo -n $HUGEPAGE_NUM_1G > $NR_HUGEPAGE_FILE_1G + + mkdir -p $HUGEPAGE_PATH_1G + mount -t hugetlbfs nodev -o pagesize=1G $HUGEPAGE_PATH_1G + [ $? -eq 0 ] && return 0 + + return 1 +} + +function huge_alloc_2M() +{ + if [ ! -e $NR_HUGEPAGE_FILE_2M ]; then + return 1 + fi + + SIZE_2M=$(cat $NR_HUGEPAGE_FILE_2M) + [ $SIZE_2M -eq 0 ] && echo -n $HUGEPAGE_NUM_2M > $NR_HUGEPAGE_FILE_2M + mkdir -p $HUGEPAGE_PATH_2M + mount -t hugetlbfs nodev $HUGEPAGE_PATH_2M + [ $? -eq 0 ] && return 0 + return 1 +} + +function huge_alloc() +{ + if [ ! $HUGEPAGE_NUM_1G -eq 0 ]; then + huge_release_1G + huge_alloc_1G + fi + + if [ ! $HUGEPAGE_NUM_2M -eq 0 ]; then + huge_release_2M + huge_alloc_2M + fi + + return $? +} + +function huge_release() +{ + huge_release_1G && huge_release_2M + huge_release_2M + return $? +} + +function nic_unbind_ixgbe() +{ + OLDIFS=$IFS; IFS=, + for ITER_PCI_ADDR in $PCI_ADDR_IXGBE; do + $NICTOOL --force -b ixgbe $ITER_PCI_ADDR + [ ! $? -eq 0 ] && return 1 + done + IFS=$OLDIFS + return 0 +} + +function nic_unbind_igb() +{ + OLDIFS=$IFS; IFS=, + for ITER_PCI_ADDR in $PCI_ADDR_IGB; do + $NICTOOL --force -b igb $ITER_PCI_ADDR + [ ! $? -eq 0 ] && return 1 + done + IFS=$OLDIFS + return 0 +} + +function nic_bind_ixgbe() +{ + OLDIFS=$IFS; IFS=, + for ITER_PCI_ADDR in $PCI_ADDR_IXGBE; do + $NICTOOL --force -b igb_uio $ITER_PCI_ADDR + [ ! $? -eq 0 ] && return 1 + done + IFS=$OLDIFS + return 0 +} + +function nic_bind_igb() +{ + OLDIFS=$IFS; IFS=, + for ITER_PCI_ADDR in $PCI_ADDR_IGB; do + $NICTOOL --force -b igb_uio $ITER_PCI_ADDR + [ ! $? -eq 0 ] && return 1 + done + IFS=$OLDIFS + return 0 +} + +function check_app_exist() +{ + APP_USE_HUGE_2M=$(lsof -t $HUGEPAGE_PATH_2M 2>/dev/null) + RET1=$? + APP_USE_HUGE_1G=$(lsof -t $HUGEPAGE_PATH_1G 2>/dev/null) + RET2=$? + + return $RET1 || $RET2 +} + +function kill_app() +{ + APP_USE_HUGE_2M=$(lsof -t $HUGEPAGE_PATH_2M 2>/dev/null) + RET1=$? + APP_USE_HUGE_1G=$(lsof -t $HUGEPAGE_PATH_1G 2>/dev/null) + RET2=$? + + if [ $RET1 -eq 0 -a "$APP_USE_HUGE_2M" != "" ]; then + kill $APP_USE_HUGE_2M + fi + if [ $RET2 -eq 0 -a "$APP_USE_HUGE_1G" != "" ]; then + kill $APP_USE_HUGE_1G + fi + return 0 +} + +function marsiod_stop() +{ + kill_app + return 0 +} + +function marsiod_start() +{ + echo 0 > /proc/sys/kernel/randomize_va_space + return 0 +} + +function start() +{ + # Require Step, if failure, all step should be stop. + module_load_uio + [ ! $? -eq 0 ] && return 1 + huge_alloc + [ ! $? -eq 0 ] && return 1 + nic_bind_ixgbe + [ ! $? -eq 0 ] && return 1 + nic_bind_igb + [ ! $? -eq 0 ] && return 1 + marsiod_start + [ ! $? -eq 0 ] && return 1 + return 0 +} + +function stop() +{ + marsiod_stop + [ ! $? -eq 0 ] && return 1 + huge_release + [ ! $? -eq 0 ] && return 1 + nic_unbind_ixgbe + [ ! $? -eq 0 ] && return 1 + nic_unbind_igb + [ ! $? -eq 0 ] && return 1 + module_unload_uio + [ ! $? -eq 0 ] && return 1 + return 0 +} + +function restart() +{ + stop + start $* +} + +action=$1 +shift + +case $action in + start) + start $* + ;; + stop) + stop + ;; + restart) + restart $* + ;; + *) + echo "Usage: service $0 {start|stop|restart}" + exit 1 +esac + +exit $?
\ No newline at end of file diff --git a/tools/systemd/mrenv.service.in b/tools/systemd/mrenv.service.in new file mode 100644 index 0000000..533071b --- /dev/null +++ b/tools/systemd/mrenv.service.in @@ -0,0 +1,13 @@ +[Unit] +Description=Setup/Unsetup mrzcpd runtime environment +After=network.target + +[Service] +Type=oneshot +EnvironmentFile=/etc/sysconfig/mrzcpd +ExecStart=@MR_INSTALL_BINDIR@/mrenv-script start +ExecStop=@MR_INSTALL_BINDIR@/mrenv-script stop +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target
\ No newline at end of file diff --git a/tools/systemd/mrzcpd.service.in b/tools/systemd/mrzcpd.service.in new file mode 100644 index 0000000..50e7154 --- /dev/null +++ b/tools/systemd/mrzcpd.service.in @@ -0,0 +1,12 @@ +[Unit] +Description=Marsio ZeroCopy Driver Daemon +Requires=mrenv.service +After=mrenv.service + +[Service] +EnvironmentFile=/etc/sysconfig/mrzcpd +ExecStart=@MR_INSTALL_BINDIR@/zcpd +Restart=on-failure + +[Install] +WantedBy=multi-user.target
\ No newline at end of file |
