您的位置:首页 > 其它

Cloud foundry warden 源码学习(3)

2014-09-03 21:28 295 查看
上节总结道Warden::Container::Linux实际上是真正处理请求的类,DEA或者runner通过socket连接以后发送给warden server的请求,都会被转给Warden::Container::Linux处理。该类负责warden container的创建和销毁,bash command在warden container内部的处理和输入输出流定向等。在整个warden的架构中,地位不言而喻。Warden::Container::Linux使用diapatch方法分发消息,下面具体看一下创建一个warden container历经的流程。CreateRequest历经before_create, acound_create, do_create, after_create,其中最主要的是do_create方法。
def do_create(request, response)
options = { :env => env.dup }

if request.rootfs
unless Dir.exist? request.rootfs
raise WardenError.new("rootfs #{request.rootfs} not found")
end

options[:env]["rootfs_path"] = request.rootfs
end
#调用create.sh,创建linux skeleton文件结构,开启wshd进程
sh File.join(root_path, "create.sh"), container_path, options
logger.debug("Container created")
#在hook-child-before-pivot.sh中mount对应的文件系统如,buildpack_cache, droplet目录等
write_bind_mount_commands(request)
logger.debug2("Wrote bind mount commands")
#最后是启动warden虚机
        sh File.join(container_path, "start.sh"), optionslogger.debug("Container started")nilend
1.create.sh
[ -n "$DEBUG" ] && set -o xtraceset -o nounsetset -o errexitshopt -s nullglobcd $(dirname "${0}")if [ $# -ne 1 ]; thenecho "Usage: ${0} <instance_path>"exit 1fitarget=${1}if [ -d ${target} ]; thenecho "\"${target}\" already exists, aborting..."exit 1fi
#这里最主要的是将skeleton目录(其实就是一个小型linux虚机目录)拷贝到对应的warden instance目录, 之后调用unshare –m “${target}”/setup.sh,会调用${instance}/shetup.shcp -r skeleton "${target}"unshare -m "${target}"/setup.shecho ${target}
2. mount必要的文件系统,例如buildpack cache等。
      def add_bind_mount(file, src_path, dst_path, mode)dst_path = File.join(container_path, "mnt", dst_path[1..-1])file.puts "mkdir -p #{dst_path}"file.puts "mount -n --bind #{src_path} #{dst_path}"file.puts "mount -n --bind -o remount,#{mode} #{src_path} #{dst_path}"end
hook-child-before-pivot.sh
mkdir -p /var/vcap/data/warden/depot/17vedc80gj3/mnt/var/vcap/data/dea_next/droplets/850c48ada15591d8c6a56a0e1c64cb2846ea00ddmount -n --bind /var/vcap/data/dea_next/droplets/850c48ada15591d8c6a56a0e1c64cb2846ea00dd /var/vcap/data/warden/depot/17vedc80gj3/mnt/var/vcap/data/dea_next/droplets/850c48ada15591d8c6a56a0e1c64cb2846ea00ddmount -n --bind -o remount,ro /var/vcap/data/dea_next/droplets/850c48ada15591d8c6a56a0e1c64cb2846ea00dd /var/vcap/data/warden/depot/17vedc80gj3/mnt/var/vcap/data/dea_next/droplets/850c48ada15591d8c6a56a0e1c64cb2846ea00ddmkdir -p /var/vcap/data/warden/depot/17vedc80gj3/mnt/var/vcap/packages/buildpack_cachemount -n --bind /var/vcap/packages/buildpack_cache /var/vcap/data/warden/depot/17vedc80gj3/mnt/var/vcap/packages/buildpack_cachemount -n --bind -o remount,ro /var/vcap/packages/buildpack_cache /var/vcap/data/warden/depot/17vedc80gj3/mnt/var/vcap/packages/buildpack_cache
3.调用${instance}/start.sh,开启wshd进程。该wshd进程应该负责启动在wanden容器中的各个进程,例如bash, java, liberty/tomcat进程等#!/bin/bash[ -n "$DEBUG" ] && set -o xtraceset -o nounsetset -o errexitshopt -s nullglobcd $(dirname $0)source ./etc/configif [ -f ./run/wshd.pid ]thenecho "wshd is already running..."exit 1fi./net.sh setup./bin/wshd --run ./run --lib ./lib --root ./mnt --title "wshd: $id" \1> ./run/wshd.out.log \2> ./run/wshd.err.log
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cloud foundry paas