最近为线上tomcat 构建chroot non-root环境,看了官方文档后,操作步骤还是不少。整个脚本以便批量创建,在这里对我当前的环境做个说明。
具体环境: tomcat 6.0.3x+apr+apr-util+apr-iconv+jdk1.6+cronolog
根据官方的建议,对jbchroot.c进行编译,获得jbchroot的可执行文件. 使用的好处是,它能够在chroot环境下,使用非root权限进行运行。在于lib64里库文件复制,可以参照物我的。我根据自己当前环境,添加了一下相应的文件。如 cp /usr/local/sbin/cronolog usr/local/sbin
脚本使用方法: ./scriptname 后,输入chroot目录路径,以及tomcat解压后的目录环境。
脚本会根据你当前的系统环境变量进行jdk1.6目录复制。
关于脚本中提到的jbchroot.c 在这里可以复制保存并上传到/tmp目录下!
Java/0596003188/jbchrootdotc/tomcat-app-c
#!/bin/bash -x
#used for create tomcat chroot
#myhat.blog.51cto.com
JAVA_HOME=/usr/local/jdk1.6
while true
do
read -p "please input your chroot directory :" CHROOT
read -p "please input tomcat direcotry :" TOM_PATH
if [ "$CHROOT" = "" ];then
echo "Your must input chroot directory"
exit 1
else
test -e $CHROOT || mkdir $CHROOT
if [ "$TOM_PATH" = "" ];then
echo "Your must input tomcat directory"
exit 1
else
test -e $TOM_PATH || mkdir $TOM_PATH
fi
fi
break
done
#mkdir base dir
mkdir -p $CHROOT/chroot/usr/local/sbin/
mkdir -p $CHROOT/chroot/{lib,lib64,etc,tmp,dev,usr,proc,bin}
cd $CHROOT/chroot/
chmod 755 etc dev usr
chmod 1777 tmp
#copy base file
cp -af /etc/hosts etc/
cp -af /etc/resolv.conf etc/
cp -af /etc/nsswitch.conf etc/
#command file
cp /bin/uname bin/
mkdir -p usr/bin/
mkdir -p usr/local/
cp -f /usr/bin/dirname usr/bin/
cp -f /usr/bin/tty usr/bin/
cp -f /bin/touch bin/
cp -f /bin/bash bin/
ln -s /bin/bash bin/sh
cp /usr/local/sbin/cronolog usr/local/sbin
#make dir and copy libs
cp -rva $JAVA_HOME $CHROOT/chroot/$JAVA_HOME
cd /lib64
for i in libpthread.so.0 ld-linux-x86-64.so.2 libc.so.6 libdl.so.2 libm.so.6 libnsl.so.1 libnss_dns.so.2 libnss_files.so.2 libresolv.so.2 librt.so.1 libtermcap.so.2
do
cp -p $i $CHROOT/chroot/lib64
done
#make dev
mkdir -p $CHROOT/chroot/dev/pts
cd /dev
./MAKEDEV -d $CHROOT/chroot/dev null random urandom zero loop* log console
cp -a MAKEDEV $CHROOT/chroot/dev
cp -a /dev/shm $CHROOT/chroot/dev
# make proc
mkdir -p $CHROOT/chroot/proc
mount -t proc proc $CHROOT/chroot/proc
# test
chroot $CHROOT/chroot $JAVA_HOME/bin/java -version && echo "tomcat chroot env is ok"
sleep 3
cp -r $TOM_PATH $CHROOT/chroot/usr/local/
# create user
id tomcat || useradd -M -s /sbin/nologin tomcat
chown tomcat.tomcat -R $CHROOT/chroot/usr/local/tomcat6.0
chown 755 $CHROOT/chroot/usr/local/tomcat6.0
cd $CHROOT/chroot/usr/local/tomcat6.0
chown -R tomcat logs/ temp/ work/ webapps/ conf/
gcc -O /tmp/jbchroot.c -o /usr/local/bin/jbchroot
chmod 755 /usr/local/bin/jbchroot
chown root.root /usr/local/bin/jbchroot
在这里有一个地方需要注意:就是挂载proc文件,有时候机器发生重启,如果直接启动会导致tomcat 启动失败,并且在启动过程中不会有任何提示。如果有重启系统,请记得挂载proc文件。
在此写一个小脚本做备用:假定我使用的chroot目录为 /opt/chroot ,我的tomcat路径为/usr/local/tomcat6.0
#!/bin/bash
case $1 in
start)
mount | grep /opt/chroot
if [ "$?" != "0" ];then
mount -t proc proc /opt/chroot/proc
fi
sleep 3
/usr/local/bin/jbchroot -U tomcat -- /opt/chroot/ /bin/bash /usr/local/tomcat6.0/bin/startup.sh
;;
stop)
if [ "$?" = "0" ];then
umount /opt/chroot/proc
fi
kill -9 `ps aux | grep java| grep -v grep | awk '{print $2}'`
;;
*)
echo "USAGE: {start|stop}"
;;
esac
以上脚本均经过测试,修改后可以正常使用。
[root@localhost ~]# ps aux |grep java