Shell Script Cloning Solaris Zones
Dec. 23rd, 2012 12:43 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
This script was written on Solaris 11 running inside VirtualBox.
set -Cex ROOT=/opt/euromake DEFROUTER=10.0.2.2 NETWORK=17 MIN=10 MAX=99 cd $ROOT mkdir -p vacant for p in $(ls vacant); do test -d "vacant/$p" if echo $$ >"vacant/$p/lock"; then POOL=$p trap 'rm -f "vacant/$POOL/lock"' INT TERM EXIT break fi done test "$POOL" -ge "$MIN" test "$POOL" -le "$MAX" read ZONE <vacant/$POOL/next test "$ZONE" -ge "$MIN" test "$ZONE" -le "$MAX" ZONENAME=$NETWORK.$POOL.$ZONE ZONEPATH=/zones/clones/$NETWORK/$POOL/$ZONE # Comment at your own risk! echo \ zonecfg -z $ZONENAME <<-COMMIT create set zonepath=$ZONEPATH select anet linkname=net0 set defrouter=$DEFROUTER set allowed-address=10.$ZONENAME COMMIT echo \ zoneadm -z $ZONENAME clone origin # from /zones/origin NEXT=$(($ZONE + 1)) if [ "$NEXT" -le "$MAX" ]; then echo $NEXT >|vacant/$POOL/next rm -f vacant/$POOL/lock else mkdir -p full test ! -e "full/$POOL" mv vacant/$POOL full fi trap - INT TERM EXIT
root@euromake:~# find /opt/euromake /opt/euromake /opt/euromake/create.sh root@euromake:~# mkdir -p /opt/euromake/vacant/{13,42} root@euromake:~# touch /opt/euromake/vacant/13/lock root@euromake:~# echo 98 >/opt/euromake/vacant/42/next root@euromake:~# sh /opt/euromake/create.sh + ROOT=/opt/euromake + DEFROUTER=10.0.2.2 + NETWORK=17 + MIN=10 + MAX=99 + cd /opt/euromake + mkdir -p vacant + ls vacant + test -d vacant/13 + echo 2258 + /opt/euromake/create.sh[14]: vacant/13/lock: file already exists [File exists] + test -d vacant/42 + echo 2258 + 1> vacant/42/lock + POOL=42 + trap 'rm -f "vacant/$POOL/lock"' INT TERM EXIT + break + test 42 -ge 10 + test 42 -le 99 + read ZONE + 0< vacant/42/next + test 98 -ge 10 + test 98 -le 99 + ZONENAME=17.42.98 + ZONEPATH=/zones/clones/17/42/98 + echo zonecfg -z 17.42.98 + 0<< \COMMIT create set zonepath=/zones/clones/17/42/98 select anet linkname=net0 set defrouter=10.0.2.2 set allowed-address=10.17.42.98 COMMIT zonecfg -z 17.42.98 + echo zoneadm -z 17.42.98 clone origin zoneadm -z 17.42.98 clone origin + NEXT=99 + [ 99 -le 99 ] + echo 99 + 1>| vacant/42/next + rm -f vacant/42/lock + trap - INT TERM EXIT root@euromake:~# sh /opt/euromake/create.sh + ROOT=/opt/euromake + DEFROUTER=10.0.2.2 + NETWORK=17 + MIN=10 + MAX=99 + cd /opt/euromake + mkdir -p vacant + ls vacant + test -d vacant/13 + echo 2262 + /opt/euromake/create.sh[14]: vacant/13/lock: file already exists [File exists] + test -d vacant/42 + echo 2262 + 1> vacant/42/lock + POOL=42 + trap 'rm -f "vacant/$POOL/lock"' INT TERM EXIT + break + test 42 -ge 10 + test 42 -le 99 + read ZONE + 0< vacant/42/next + test 99 -ge 10 + test 99 -le 99 + ZONENAME=17.42.99 + ZONEPATH=/zones/clones/17/42/99 + echo zonecfg -z 17.42.99 + 0<< \COMMIT create set zonepath=/zones/clones/17/42/99 select anet linkname=net0 set defrouter=10.0.2.2 set allowed-address=10.17.42.99 COMMIT zonecfg -z 17.42.99 + echo zoneadm -z 17.42.99 clone origin zoneadm -z 17.42.99 clone origin + NEXT=100 + [ 100 -le 99 ] + mkdir -p full + test ! -e full/42 + mv vacant/42 full + trap - INT TERM EXIT root@euromake:~# sh /opt/euromake/create.sh + ROOT=/opt/euromake + DEFROUTER=10.0.2.2 + NETWORK=17 + MIN=10 + MAX=99 + cd /opt/euromake + mkdir -p vacant + ls vacant + test -d vacant/13 + echo 2267 + /opt/euromake/create.sh[14]: vacant/13/lock: file already exists [File exists] + test '' -ge 10 root@euromake:~# find /opt/euromake /opt/euromake /opt/euromake/full /opt/euromake/full/42 /opt/euromake/full/42/next /opt/euromake/full/42/lock /opt/euromake/create.sh /opt/euromake/vacant /opt/euromake/vacant/13 /opt/euromake/vacant/13/lock root@euromake:~# rm -fr /opt/euromake/{vacant,full} root@euromake:~# find /opt/euromake /opt/euromake /opt/euromake/create.sh root@euromake:~#