summaryrefslogtreecommitdiff
path: root/tools/systemd
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2016-11-02 19:32:45 +0800
committerQiuwen Lu <[email protected]>2016-11-02 19:32:45 +0800
commitfaa23bca6c775e850414cf38a4ca63ef0586083a (patch)
treebeb4c08f6db8b5b8677cf8c901857a1fa53fbdc2 /tools/systemd
parent52066fce31fa1fc26732740e341fc063569f1a92 (diff)
增加对Systemd(CentOS7)的自动化启动支持。
Diffstat (limited to 'tools/systemd')
-rw-r--r--tools/systemd/mrenv-script308
-rw-r--r--tools/systemd/mrenv.service.in13
-rw-r--r--tools/systemd/mrzcpd.service.in12
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