[Azure]Azure虚拟机代理服务(waagent)代码简单分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qwertyupoiuytr/article/details/79142552

我们在Azure中创建一台CentOS7.4的虚拟机,首先我们看一下/sbin/waagent这个执行文件:

import os

import imp

import sys

if __name__ == '__main__' :

    import azurelinuxagent.agent as agent

    """

    Invoke main method of agent

    """

    agent.main()

if __name__ == 'waagent':

    """

    Load waagent2.0 to support old version of extensions

    """

    if sys.version_info[0] == 3:

        raise ImportError("waagent2.0 doesn't support python3")

    bin_path = os.path.dirname(os.path.abspath(__file__))

    agent20_path = os.path.join(bin_path, "waagent2.0")

    if not os.path.isfile(agent20_path):

        raise ImportError("Can't load waagent")

    agent20 = imp.load_source('waagent', agent20_path)

    __all__ = dir(agent20)

可以看到,是执行了azurelinuxagent.agent这个模块中的main方法。

我们在python中查看一下环境变量:

[root@dancentos74-2daniel]# python

Python2.7.5 (default, Aug  4 2017, 00:39:18)

[GCC4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2

Type"help", "copyright", "credits" or"license" for more information.

>>>import sys

>>>sys.path

['','/usr/lib64/python27.zip', '/usr/lib64/python2.7','/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk','/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload','/usr/lib64/python2.7/site-packages', '/usr/lib64/python2.7/site-packages/gtk-2.0','/usr/lib/python2.7/site-packages']

然后我们依次在python的环境变量里面找一下azurelinuxagent这个模块,发现在/usr/lib/python2.7/site-packages下面:

 


我们进到/usr/lib/python2.7/site-packages/azurelinuxagent:

 


进入daemon可以找到main.py:

 


查看main.py的import部分:

import azurelinuxagent.common.conf as conf

import azurelinuxagent.common.logger as logger

import azurelinuxagent.common.utils.fileutil as fileutil

from azurelinuxagent.common.event import add_event, WALAEventOperation

from azurelinuxagent.common.future import ustr

from azurelinuxagent.common.osutil import get_osutil

from azurelinuxagent.common.protocol import get_protocol_util

from azurelinuxagent.common.protocol.wire import WireClient

from azurelinuxagent.common.rdma import setup_rdma_device

from azurelinuxagent.common.version import AGENT_NAME, AGENT_LONG_NAME, \

    AGENT_VERSION, \

    DISTRO_NAME, DISTRO_VERSION, PY_VERSION_MAJOR, PY_VERSION_MINOR, \

    PY_VERSION_MICRO

from azurelinuxagent.daemon.resourcedisk import get_resourcedisk_handler

from azurelinuxagent.daemon.scvmm import get_scvmm_handler

from azurelinuxagent.ga.update import get_update_handler

from azurelinuxagent.pa.provision import get_provision_handler

from azurelinuxagent.pa.rdma import get_rdma_handler

……

我们以临时磁盘的挂在为例,可以看到下面这条import与临时磁盘有关:

fromazurelinuxagent.daemon.resourcedisk import get_resourcedisk_handler

在daemon的方法中找到相关的调用:

defdaemon(self, child_args=None):

    logger.info("Run daemon")

    self.protocol_util = get_protocol_util()

    self.scvmm_handler = get_scvmm_handler()

    self.resourcedisk_handler = get_resourcedisk_handler()

    self.rdma_handler = get_rdma_handler()

    self.provision_handler =get_provision_handler()

    self.update_handler = get_update_handler()

    # Create lib dir

    if not os.path.isdir(conf.get_lib_dir()):

        fileutil.mkdir(conf.get_lib_dir(),mode=0o700)

        os.chdir(conf.get_lib_dir())

    if conf.get_detect_scvmm_env():

        self.scvmm_handler.run()

    if conf.get_resourcedisk_format():

        self.resourcedisk_handler.run()

接着我们进入resourcedisk子目录:

 


查看default.py方法,找到run方法:

defrun(self):

    mount_point = None

    if conf.get_resourcedisk_format():

        mount_point =self.activate_resource_disk()

    if mount_point is not None and \

           conf.get_resourcedisk_enable_swap():

        self.enable_swap(mount_point)

可以看到做了两件事,第一是调用activate_resource_disk方法激活临时磁盘,第二是调用get_resourcedisk_enable_swap方法启用swap分区,当然这两个都是在判断条件为真的情况下执行的。

查看activate_resource_disk方法,我们看到mountpoint是在conf中定义的方法读取到的:

defactivate_resource_disk(self):

    logger.info("Activate resourcedisk")

    try:

        mount_point = conf.get_resourcedisk_mountpoint()

        mount_point =self.mount_resource_disk(mount_point)

        warning_file =os.path.join(mount_point,

                                   DATALOSS_WARNING_FILE_NAME)

        try:

            fileutil.write_file(warning_file,DATA_LOSS_WARNING)

        except IOError as e:

            logger.warn("Failed to writedata loss warning:{0}", e)

        return mount_point

    except ResourceDiskError as e:

        logger.error("Failed to mountresource disk {0}", e)

        add_event(name=AGENT_NAME,is_success=False, message=ustr(e),

                 op=WALAEventOperation.ActivateResourceDisk)

在default.py上面的import中找到对应的语句:

importazurelinuxagent.common.conf as conf

然后我们去/usr/lib/python2.7/site-packages/azurelinuxagent/common下面,找到conf.py,查看其中的get_resourcedisk_mountpoint方法:

defget_resourcedisk_mountpoint(conf=__conf__):

    returnconf.get("ResourceDisk.MountPoint", "/mnt/resource")

这里就找到了mountpoint了。

其他的一些配置类似,由于waagent的功能非常复杂,这里就只是提供一个分析思路。

猜你喜欢

转载自blog.csdn.net/qwertyupoiuytr/article/details/79142552