我们在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的功能非常复杂,这里就只是提供一个分析思路。