Archipel 安装与布局

Archipel
是一个管理及监控虚拟机的开源解决方案。->型主页
->GitHub地址

目       录

葡京赌场网址 1

第八章           总体控制器的设计… 2

Architecture

8.1           总控制器的职能… 2

Archipel Agent –即达图的Physical Hypervisor 安装在各个台物理机上
Archipel Client –即达到图的Archipel GUI,安装于自由一贵linux电脑上

8.2           组装和释放部件… 3

一. Ejabberd XMPP 服务器端的布局安装

Archipel

XMPP服务器的域名就是是本机的hostname, 我的hostname是 alecyrus.org ,
这个可是及经命令” #
hostname”得到,一般默认是ubuntu, 如果需要改,可运行以下命令,别忘了随后在/etc/hosts
文件被,172.0.1.1 后当ubuntu后并列添加YourHostname,否则无法修改成功.

# hostname YourHostname
# echo YourHostname > /etc/hostname

1:安装ejabberd(至少15.04版本)

# echo "deb https://apt.jabber.at trusty ejabberd" > /etc/apt/sources.list.d/jabber.at.list
# wget -qO- https://apt.jabber.at/gpg-key | apt-key add -
# apt-get update
# apt-get install ejabberd

注:我是以ejabberd15.04版本下测试的,deb安装或installer安装都推行。两种植艺术安装后,打开关闭重开ejabberd服务的操作略发分。具体查看ejabberd官方文档而设置后使用命令开启ejabberd服务时报错,诸如Failed
RPC connection… File Operate Error…
说明ejabberd安装出错,自行查看log解决。

2:安装必需的仗包(ArchipelAgent也需要安装这些靠包)
# apt-get install -y git build-essential qemu-kvm libvirt-bin
libvirt-dev python-setuptools python-numpy python-imaging
python-apscheduler python-sqlalchemy python-libvirt subversion
python-dev

3:配置Ejabberd
老版本是ejabberd.cfg, 现在的本子都是yaml配置文件(ejabberd.yml)。
如下:

###
###             ejabberd configuration file
###         Archipel Sample default condiguration

###     =========================================
###     DEBUGGING


loglevel: 4

###     =========================================
###     SERVED HOSTNAMES

hosts:
    - "alecyrus.org"

###     =========================================
###     LISTENING PORTS

listen:
-

  port: 4560
  module: ejabberd_xmlrpc
  access_commands:
        xmlrpcaccess:
            all : []

## ejabberd c2s
-
  port: 5222
  module: ejabberd_c2s
  max_stanza_size: 65536000
  shaper: c2s_shaper
  access: c2s

## ejabbed s2s
-
  port: 5269
  module: ejabberd_s2s_in
  max_stanza_size: 65536000

-
  port: 5280
  module: ejabberd_http
  request_handlers:
    "/xmpp": ejabberd_http_ws
  web_admin: true
  http_bind: true

###     ========================================
###     S2S
s2s_policy: s2s_access
s2s_use_starttls: optional


###     =========================================
###     AUTHENTICATION

auth_method: internal

###     =========================================
###     TRAFFIC SHAPERS

shaper:
  # in B/s
  normal: 1000
  fast: 50000000

###     =========================================
###     ACCESS CONTROL LISTS

acl:
admin:
    user:
        - "admin": "alecyrus.org"
local:
    user_regexp: ""


###     =========================================
###     ACCESS RULES

access:
max_user_sessions:
    all: 10
local:
    local: allow
c2s:
    blocked: deny
    all: allow
c2s_shaper:        
    admin: none
    all: fast
s2s_shaper:
    all: fast
s2s_access:
    all: allow
announce:
    admin: allow
configure:
    admin: allow
muc_admin:
    admin: allow
muc_create:
    local: allow
muc:
    all: allow
pubsub_createnode:
    all: allow
register:
    all: allow
xmlrpcaccess:
    admin : allow

registration_timeout: infinity

###     ========================================
###     DEFAULT LANGUAGE

language: "en"

###     ========================================
###     MODULES

modules:
  mod_admin_extra: []
  mod_adhoc: []
  mod_announce:
    access: announce
  mod_caps: []
  mod_configure: []
  mod_disco: []
  mod_http_bind:
    max_inactivity: 400 
  mod_irc: []
  mod_last: []
  mod_muc:
    access: muc
    access_create: muc_create
    access_persistent: muc_create
    access_admin: muc_admin
  mod_offline: []
  mod_privacy: []
  mod_private: []
  mod_pubsub:
    access_createnode: pubsub_createnode
    ignore_pep_from_offline: true
    last_item_cache: false
    max_items_node: 1000
    plugins:
        - "flat"
        - "hometree"
        - "pep"
  mod_register:
    access: register
  mod_roster: []
  mod_shared_roster: []
  mod_time: []
  mod_vcard: []
  mod_version: []

接下来还开ejabberd服务(DEB安装方式),如果是installer安装,桌面上有俩快捷方式,若无,进入ejabberd安装目录/bin/,
运行相关命令即可

# /etc/init.d/ejabberd restart


注:如果重启不成功,使用以下命令来查看启动服务过程中是哪里出问题,一般都是配置文档
出错,语法,模块错误什么的。

# ejabberdctl live

4:ejabberd
xmpp服务器admin账户的登记(DEB安装方式,若是install方式,在装置ejabberd时便创办好了)

# ejabberdctl register admin alecyrus.org YourPassWd

8.3           事件响应… 5

二. Archipel Agent的安排安装

Archipel Agent是待装在列令物理机上,物理机上的Virtual Machine Monitor
可以是KVM、Xen、VMware…
,以后要是要将有华物理机上的一体KVM虚拟机添加至Archipel,那即便需要在就大物理机上安装Archipel
Agent.

前提:能够健康创建虚拟机,qumu,kvm这些的安装好。

1:下载Archipel以及安装

# git clone https://github.com/ArchipelProject/Archipel.git
# cd Archipel
# ./pull.sh
# easy_install apscheduler sqlalchemy numpy
# cd ArchipelAgent
# ./buildAgent -d
# archipel-initinstall

注:通常在archipel-initinstall加上 -x FQDN(# archipel-initinstall -x
alecyrus.org), 意思就是点名这台Physical Hypervisor将要连续的XMPP服务 器
的地方,如果您XMPP服务器和Physical
Hypervisor安装于同台机械及,比如现在,那么Physical Hypervisor
中Archipel的部署没问题,同一台机器,Physical Hypervisor
和XMPP服务器当然会互ping通。
唯独如果后XMPP服务器配置好了,你想将其余的Physical Hypervisor
添加至XMPP服务器上受ArchipelClient一并保管,如果还是这么安排,那么这台Physical
Hypervisor 就无法识别alecyrus.org,
所以在另外机器安装ArchipelAgent,别忘了于hosts文件中添加alecyrus.org
和XMPP服务器ip的投。同时,保证XMPP服务器和Physical Hypervisor
能互相ping通。

2:将马上大Physical Hypervisor
的ArchipelAgent初始化到XMPP服务器,使用你的XMPP服务器的领队账号。
# archipel-tagnode -j
admin@alecyrus.org
-p YourPassWD –create
# archipel-rolesnode -j
admin@alecyrus.org
-p YourPassWD –create
# archipel-adminaccounts -j
admin@alecyrus.org
-p YourPassWD –create

3:配置Archipel Agent

编辑/etc/archipel.conf, 添加以下内容

[MODULES]

action_scheduler            = True
centraldb                   = True
geolocalization             = True
hypervisor_health           = True
hypervisor_network          = True
hypervisor_vmcasts          = True
iphone_notification         = False
oomkiller                   = True
snapshoting                 = True
storage                     = True
virtualmachine_appliance    = True
vnc                         = True
xmppserver                  = True
vmparking                   = True  # needs centraldb to be     activated

[CENTRALAGENT]
# centralagent can be :
#  - auto (default) : will be central agent if there is none already started
#  - force : will be central agent (be careful to configure only one of your hypervisors this way)
centralagent               = auto

[VNC]
vnc_certificate_file                        = None
vnc_only_ssl                                = False
vnc_enable_websocket_debug                  = True

注:最后将machine_ip由auto改成为当下台hypervisor的ip地址,这样便于archipel查看ip地址。

4:重启Archipel

 # /etc/init.d/archipel restart

8.4           小结… 9

三. Archipel Client安装

Archipel Client就是一个web应用,通过官方发表之The
nightlies版本可以挺便宜之安装之,但经过测试(Ubuntu
14.04LTS),项目作者将centralAgent也加盟admin
list后,centralAgent就无法正常安装了,bu
以下命令在事先clone命令的同级目录下进展,即始即长长的命令时,ls命令可以得看到前的Archipel文件夹。

# wget http://nightlies.archipelproject.org/latest-archipel-client.tar.gz
# tar -xzf latest-archipel-client.tar.gz

 

四. 最后的工作

上Archipel目录开启HTTP服务

1:开启8000端口

# python -m SimpleHTTPServer

注:务必进入Archipel目录运行这个命令

2:
打开网址:localhost:8000

登陆信息若齐
接下来上加安装了Archipel Agent的Physical Hypervisor 的JID…

以此JID的格式可以当archipel.conf 中看到。。如下:

自这里是alecyrus@%(xmpp_server)s,,也就是说JID为:
alecyrus@alecyrus.org

2016-01-18 02:04:30屏幕截图.png

长完成后,就好当此处看到您的物理机的虚拟机管理程序了,不过它换了师

2016-01-18 02:14:08屏幕截图.png

一个Physical
Hypervisor就是您的一个沟通人,这个沟通人下可以产生多底虚拟机,你啊得将虚拟机添加关系人面临。

Done!

第八节     总体控制器的设计

   
有矣IO部分、设备驱动部分、显示有、数据导出部分及劳动组件有等,在这些就存在的接口及构建一个并入各有的到底控制器,协调各国组成部分有序工作、事件响应和控制数据流向。

   
另外,这个总控制器还担负与宿主程序进行互,可以这样懂:总控制器是宿主程序及IO部分、设备驱动部分、显示有、数据导出部分及劳务组件有内相互的载体,并且是绝无仅有的。结构示意图如下:

 葡京赌场网址 2

8.1    总控制器的机能

  
总控制器(IDeviceController)的功能包括:增加以及去设备驱动、增加导出数据实例、增加图显示实例、增加服务组件实例、单击服务事件、释放控制器资源等等。接口定义如下图:

 葡京赌场网址 3

8.2    组装和自由部件

    
DeviceController是总控制器的实例体类,继承自IDeviceController接口。通过构造函数来成功对总控制器的初始化,代码如下:

public DeviceController()
{
       _devList = DeviceManager.GetInstance();
       _ioController = IOControllerManager.GetInstance();
       _runContainer = RunContainerForm.GetRunContainer();
       _runContainer.MouseRightContextMenuHandler += RunContainer_MouseRightContextMenuHandler;
       _dataShowController = new GraphicsShowController();
       _exportController = new ExportDataController();
       _appServiceManager = new AppServiceManager();
}

   通过ReleaseDeviceController接口来形成对总控制器的资源自由,代码如下:

public void ReleaseDeviceController()
{
       _ioController.RemoveAllController();
       _runContainer.RemoveAllDevice();
       _runContainer.MouseRightContextMenuHandler -= RunContainer_MouseRightContextMenuHandler;
       _exportController.RemoveAll();
       _dataShowController.RemoveAll();
       _appServiceManager.RemoveAll();
       IEnumerator<IRunDevice> devList = _devList.GetEnumerator();
       while (devList.MoveNext())
       {
              devList.Current.ExitDevice();
       }
       _devList.RemoveAllDevice();
}

    
软件退出时释放资源而于软件启动时加载资源使复杂的差不多,这块涉及到个别端问题:(1)释放资源顺序,如果资源提前出狱,那么累会造成后止代码在履行进程被出现无法引用对象资源的情景,造成意外的结果,所以毫无疑问要是针对实例的可用性进行判定。(2)事务性的线程无法正常退出,造成软件界面就关门,但是后台进程也一直存在。特别是针对线程退出的处理,框架平台采用了联之线程退出机制,代码如下:

public void StartThead()
{
       if (_RunThread == null || !_RunThread.IsAlive)
       {
              this._IsExit = false;
              this._RunThread = new Thread(new ThreadStart(RunThead));
              this._RunThread.IsBackground = true; //该线程为后台线程
              this._RunThread.Name = "RunThread";
              this._RunThread.Start();
       }
}

private void RunThead()
{
       while (!_IsExit)
       {
              if(_IsExit)         //如果标识为true,则退出循环,退出线程
              {
                     break;
              }
              //事务处理
       }
}

public void StopThead()
{
       if (this._RunThread != null && this._RunThread.IsAlive)
       {
              this._IsExit = true;       //标识当前线程为可退出线程。
              this._RunThread.Join(1000);//阻塞调用线程,直到某个线程终止或经过了指定时间为止
              try
              {
                     _RunThread.Abort();    //为了防止线程没有退出,进行强行终止,有可能造成文件损坏
              }
              catch
              {
              }
       }
}

8.3    事件响应

     增加以及去设备驱动都见面指向设备的风波进展绑定和解绑。代码如下:

dev.DeviceRuningLogHandler += new DeviceRuningLogHandler(DeviceRuningLogHandler);
dev.UpdateContainerHandler += new UpdateContainerHandler(UpdateContainerHandler);
dev.DeviceObjectChangedHandler += new DeviceObjectChangedHandler(DeviceObjectChangedHandler);
dev.ReceiveDataHandler += new ReceiveDataHandler(ReceiveDataHandler);
dev.SendDataHandler += new SendDataHandler(SendDataHandler);
dev.COMParameterExchangeHandler += new COMParameterExchangeHandler(COMParameterExchangeHandler);
dev.DeleteDeviceHandler += new DeleteDeviceHandler(DeleteDeviceHandler);

     具体意思请参见《第3段 设备驱动的计划性》中之“3.12
事件响应设计”,COMParameterExchangeHandler改变串口参数事件响应代码如下:

private void COMParameterExchangeHandler(object source, COMParameterExchangeArgs e)
{
       if (e == null)
       {
              return;
       }
       IRunDevice dev = this._devList.GetDevice(e.DeviceID.ToString());
       if (dev != null)
       {
              if (dev.CommunicationType == CommunicationType.COM)
              {
                     if (e.OldCOM != e.NewCOM)
                     {
                            //--------------对旧串口进行处理----------------//
                            IRunDevice[] oldCOMDevList = this._devList.GetDevices(e.OldCOM.ToString(), CommunicationType.COM);
                            //---------------检测当前串口设备数------------//
                            int existCOMCount = 0;
                            for (int i = 0; i < oldCOMDevList.Length; i++)
                            {
                                   if (oldCOMDevList[i].GetHashCode() != dev.GetHashCode())
                                   {
                                          existCOMCount++;
                                   }
                            }
                            //------------------------------------------//
                            if (existCOMCount <= 0)//该串口没有可用的设备
                            {
                                   IIOController oldCOMController = IOControllerManager.GetInstance().GetController(SessionCom.FormatKey(e.OldCOM));
                                   if (oldCOMController != null)
                                   {
                                          _ioController.CloseController(oldCOMController.Key);
                                   }

                                   else
                                   {
                                          DeviceMonitorLog.WriteLog(e.DeviceName, "该设备的串口控制器为空");
                                   }
                            }
                            //--------------对新串口进行处理----------------//
                            bool newCOMControllerExist = IOControllerManager.GetInstance().ContainController(SessionCom.FormatKey(e.NewCOM));
                            if (!newCOMControllerExist)
                            {
                                   IIOController newCOMController = _ioController.BuildController(e.NewCOM.ToString(), e.NewBaud.ToString(), CommunicationType.COM);
                                   if (newCOMController != null)
                                   {
                                          newCOMController.StartService();
                                        _ioController.AddController(newCOMController.Key.ToString(), newCOMController);
                                   }
                                   else
                                   {
                                          DeviceMonitorLog.WriteLog(e.DeviceName, "创建该设备的串口控制器失败");
                                   }
                            }
                            DeviceMonitorLog.WriteLog(e.DeviceName, String.Format("串口从{0}改为{1}", e.OldCOM.ToString(), e.NewCOM.ToString()));

                     }
                     else
                     {
                            if (e.OldBaud != e.NewBaud)
                            {
                                   ISessionCom comIO = (ISessionCom)SessionComManager.GetInstance().GetIO(SessionCom.FormatKey(e.OldCOM));
                                   if (comIO != null)
                                   {
                                          bool success = comIO.IOSettings(e.NewBaud);
                                          if (success)
                                          {
                                                 DeviceMonitorLog.WriteLog(e.DeviceName, String.Format("串口{0}的波特率从{1}改为{2}成功", e.OldCOM.ToString(), e.OldBaud.ToString(), e.NewBaud.ToString()));
                                          }
                                          else
                                          {
                                                 DeviceMonitorLog.WriteLog(e.DeviceName, String.Format("串口 {0} 的波特率从 {1} 改为 {2} 失败", e.OldCOM.ToString(), e.OldBaud.ToString(), e.NewBaud.ToString()));
                                          }
                                   }
                            }
                     }
              }
              else
              {
                     DeviceMonitorLog.WriteLog(e.DeviceName, "不是串口类型的设备");
              }
       }
}

   
同时,还连GraphicsShowClosedHandler和MouseRightContextMenuHandler两只事件。当关闭显示视图的早晚会触发GraphicsShowClosedHandler事件,把目前视图从管理器中移除,并释放资源;当右键单击显示视图会触发MouseRightContextMenuHandler事件,以调用相应设施的上下文菜单。

8.4    小结

  
 总体控制器不是要的,宿主程序完全可以一直和IO部分、设备驱动部分、显示有、数据导出部分和劳动组件有开展交互。但是,为了组织清晰、方便扩展,在当中加了一样重叠进行一体化协调。

 

笔者葡京赌场网址:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

文档下载:http://pan.baidu.com/s/1pJ7lZWf

合法网址:http://www.bmpj.net