Advertisement
Guest User

Untitled

a guest
Oct 9th, 2017
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.31 KB | None | 0 0
  1. #!/bin/sh
  2. # Description: Manage namespaces.
  3. # Depends on: sh, util-linux, iproute2, procps, libcgroup
  4. # Optional: iptables -t nat -A POSTROUTING -j MASQUERADE && echo 1 > /proc/sys/net/ipv4/ip_forward
  5.  
  6. NS=$(dirname $0)
  7. NSROOT=$NS/root/$2
  8. RUN=$NS/run/$2
  9.  
  10. cgroups="cpu,memory,devices"
  11.  
  12. test -f "$NS/rc.conf" && . $NS/rc.conf
  13.  
  14. start() {
  15.     check $@
  16.  
  17.     test -f $RUN && PID=$(cat $RUN)
  18.     ps -p $PID >/dev/null 2>&1 && echo $2 is running with $PID && exit 1
  19.  
  20.     eval "addr=\"\$$2_addr\""
  21.     eval "onstart=\"\$$2_onstart\""
  22.  
  23.     if test -n "$addr"; then
  24.         ip link add br0 type bridge
  25.         ip link set br0 up
  26.         ip addr add 10.0.0.1/24 dev br0
  27.  
  28.         ip link add "veth_$2" type veth peer name veth0
  29.         ip link set "veth_$2" up
  30.         ip link set "veth_$2" master br0
  31.     fi
  32.  
  33.     ip netns add "$2"
  34.  
  35.     test -n "$addr" && ip link set veth0 netns "$2"
  36.  
  37.     ip netns exec "$2" ip link set lo up
  38.  
  39.     if test -n "$addr"; then
  40.         ip netns exec "$2" ip addr add "$addr/24" dev veth0
  41.         ip netns exec "$2" ip link set veth0 up
  42.         ip netns exec "$2" ip route add default via 10.0.0.1
  43.  
  44.         cp /etc/resolv.conf $NSROOT/etc
  45.     fi
  46.  
  47.     mountpoint -q /sys/fs/cgroup || \
  48.         mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup
  49.  
  50.     for sys in $( echo "$cgroups" | tr ',' ' ' ); do
  51.         mkdir -p /sys/fs/cgroup/$sys
  52.         mountpoint -q /sys/fs/cgroup/$sys || \
  53.             mount -n -t cgroup -o $sys cgroup /sys/fs/cgroup/$sys || \
  54.             rmdir /sys/fs/cgroup/$sys || true
  55.     done
  56.  
  57.     cgcreate -g "$cgroups:$2"
  58.  
  59.     cgset -r cpu.shares="512" "$2"
  60.     cgset -r memory.limit_in_bytes="128M" "$2"
  61.     cgset -r memory.soft_limit_in_bytes="128M" "$2"
  62.  
  63.     cgset -r devices.deny="a *:* rwm" "$2"
  64.     cgset -r devices.allow="c 1:3 rwm" "$2"
  65.     cgset -r devices.allow="c 1:5 rwm" "$2"
  66.     cgset -r devices.allow="c 1:7 rwm" "$2"
  67.     cgset -r devices.allow="c 1:8 rwm" "$2"
  68.     cgset -r devices.allow="c 1:9 rwm" "$2"
  69.     cgset -r devices.allow="c 5:0 rwm" "$2"
  70.     cgset -r devices.allow="c 5:2 rwm" "$2"
  71.     cgset -r devices.allow="c 136:* rwm" "$2"
  72.  
  73.     cp $NS/init $NSROOT
  74.  
  75.     setsid cgexec -g "$cgroups:$2" \
  76.         ip netns exec $2 \
  77.         unshare -fmuipC --mount-proc \
  78.         env -i container="$2" \
  79.         chroot $NSROOT /init &
  80.  
  81.     PID=$!
  82.  
  83.     until pgrep -P $PID >/dev/null 2>&1; do :; done
  84.  
  85.     echo $(pgrep -P $PID) > $RUN
  86.  
  87.     test -n "$onstart" && printf '%s' "$onstart" | $0 run "$2" sh -
  88.  
  89.     echo "$2: started"
  90. }
  91.  
  92. stop() {
  93.     check $@
  94.     PID=$(test -f $RUN && cat $RUN)
  95.     kill -9 $PID >/dev/null 2>&1
  96.  
  97.     eval "addr=\"\$$2_addr\""
  98.  
  99.     test -n "$addr" && ip link del "veth_$2"
  100.     ip netns delete "$2"
  101.  
  102.     test -f $RUN && rm $RUN
  103.  
  104.     sleep 1
  105.     cgdelete -g "$cgroups:$2"
  106.  
  107.     echo "$2: stopped"
  108. }
  109.  
  110. run() {
  111.     check $@
  112.     test -f $RUN && PID=$(cat $RUN)
  113.  
  114.     if ps -p $PID >/dev/null 2>&1; then
  115.         true
  116.     else
  117.          echo "$2 is not running" && exit 1
  118.     fi
  119.  
  120.     container="$2"
  121.  
  122.     shift
  123.     shift
  124.     cgexec -g "$cgroups:$container" nsenter -t $PID -n -m -u -i -p -C env -i container="$container" TERM=linux chroot $NSROOT "$@"
  125. }
  126.  
  127. check() {
  128.     test -z "$2" && echo Please, specify container name && exit 1
  129.     test ! -d $NSROOT && echo $NSROOT directory does not exists && exit 1
  130. }
  131.  
  132. status() {
  133.     check $@
  134.     ps -p $(cat $RUN 2>/dev/null) >/dev/null 2>&1
  135.     retval=$?
  136.     if test ! -d $NSROOT;
  137.     then
  138.         echo "$2 does not exists"
  139.     elif test -f $RUN && test "$retval" -eq 0;
  140.     then
  141.         echo "$2 is running with pid $(cat $RUN 2>/dev/null)"
  142.     elif test -f $RUN && test "$retval" -ne 0;
  143.     then
  144.         echo "$2 is not running but pid file $RUN exists"
  145.     else
  146.         echo "$2 is not running"
  147.     fi
  148. }
  149.  
  150. restart() {
  151.     check $@
  152.     stop $@
  153.     sleep 1
  154.     start $@
  155. }
  156.  
  157. init() {
  158.     mkdir -p $NS/root
  159.     mkdir -p $NS/run
  160.     touch $NS/rc.conf
  161.     cat << EOF > $NS/rc.conf
  162. #!/bin/sh
  163.  
  164. debian_addr="10.0.0.2"
  165. debian_onstart="
  166. /etc/init.d/nginx start"
  167. EOF
  168.  
  169.     cat << EOF > $NS/init
  170. #!/bin/sh
  171.  
  172. mount -t proc none /proc
  173.  
  174. mount -n -t tmpfs none /dev
  175.  
  176. mknod -m 666 /dev/null c 1 3
  177. mknod -m 666 /dev/zero c 1 5
  178. mknod -m 666 /dev/full c 1 7
  179. mknod -m 444 /dev/random c 1 8
  180. mknod -m 444 /dev/urandom c 1 9
  181. mknod -m 666 /dev/tty c 5 0
  182. mknod -m 666 /dev/ptmx c 5 2
  183.  
  184. ln -s /proc/self/fd /dev/fd
  185. ln -s /proc/self/fd/0 /dev/stdin
  186. ln -s /proc/self/fd/1 /dev/stdout
  187. ln -s /proc/self/fd/2 /dev/stderr
  188. ln -s /proc/kcore /dev/core
  189.  
  190. mkdir /dev/pts
  191. mkdir /dev/shm
  192.  
  193. mount -t devpts -o newinstance,ptmxmode=0666,mode=620 none /dev/pts
  194. mount -t tmpfs none /dev/shm
  195. mount -t tmpfs none /tmp
  196. mount -o bind /tmp /var/tmp
  197.  
  198. while :; do sleep 86400; done
  199. EOF
  200.     chmod +x $NS/init
  201. }
  202.  
  203. help() {
  204.     cat << EOF
  205. Usage: $0 [COMMAND] [NAMESPACE] [OPTION]...
  206. Manage namespaces.
  207.  
  208. Commands:
  209.   start   initialize namespace, chroot; copy and start /init in background
  210.   stop    kill /init
  211.   restart stop and start namespace
  212.   run     exec command in running namespace
  213.   status  print container state
  214.   check   check if namespace exists in $NSROOT directory, returns 1 on fail
  215.   init    create folders, rc.conf and init file in directory of this script
  216. EOF
  217. }
  218.  
  219. case $1 in
  220.     check|status|start|stop|restart|run|init) $1 $@ ;;
  221.     *) help ;;
  222. esac
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement