分类 "云和虚拟化" 的存档.

cloudstack通过agent实现生产机远端控制功能

cloudstack_agent_gray

agent分别使用NioConnection派生的NioClient和NioServer管理出链接和入链接。

NioServer收到请求数据后通过配置的工厂(factory->agent.create)生产Task(ServerHandler),并执行,将Task数据交给AgentRequestHandler处理(最终是调用Agent.processRequest)。

若cmd非系统操作命令(cron,upgrade,shutdown等会有相应操作,不再往下走)则会调用实现ServerResource接口的相应资源操作插件处理。

而相应的资源插件则通过进一步调用libvirt、shell、python等等途径实现对生产机资源的管理。

哈哈,cloudstack代码涉嫌故意卖萌

cloudstack 4.2.1
AgentManagerImpl.java: 469

assert noDbTxn() : "I know, I know.  Why are we so strict as to not allow txn across an agent call?  ...  Why are we so cruel ... Why are we such a dictator .... Too bad... Sorry...but NO AGENT COMMANDS WRAPPED WITHIN DB TRANSACTIONS!";
Command[] cmds = commands.toCommands();
assert cmds.length > 0 : "Ask yourself this about a hundred times.  Why am I  sending zero length commands?";

虽然这样的报错不太恰当,不够简洁明确,但是我喜欢这样的态度和风格。
coding不应该是枯燥无趣的工作。

CloudStack Virtual Router功能分析

cloudstack_virtualRouter
  ①Virtual Router为一系统功能虚机,链接内网与外网.
  ②系统通过agent控制Virtual Router,如配置StaticNat时 routerMgr 会调用 agentMgr.send 把控制指令发送给Virtual Router 上的Agent 处理。
  ③Virtual Router的VM中包含DHCP、FW、NAT等多种网络服务。
  ④当vm添加网卡到network时,DHCP会在网桥的subnet上添加Host记录,实现内网IP、MAC、Name绑定。
  ⑤network分为基本共有共享和高级私有隔离。其中高级模式中每个用户都有一个独立的Virtual Router和subnet,而基本模式则为多用户共享。
  ⑥外网IP统一通过Virtual Router的Static Nat、LB、Port Forwarding关联到内网的一台或多台虚机上。

OpenVZ备份

一、fsfreeze
fsfreeze – suspend access to a filesystem (Linux Ext3/4, ReiserFS, JFS, XFS)
fsfreeze -f mountpoint
fsfreeze -u mountpoint
挂起被冻结的分区上的写操作,所有写动作被阻塞,直至分区被解冻

二、vzdump

  1.stop
  备份时停止VM,离线时间较长。
  
  2.suspend
  ①对于OpenVZ,这一模式使用rsync拷贝VM到一个临时位置(–tmpdir选项),然后挂起VM做第二次rsync同步改变的文件,最后VM继续运行,这一备份模式需要极小的离线时间,但需要额外的空间做VM拷贝
  
  ②对于Qemu,这一备份模式与stop很像,只是用suspend/resume代替stop/start.

  3.snapshot
  这一备份模式使用LVM2快照,不需要离线时间,但是需要LVM2并且要备份的卷所在的卷组中有足够的空闲空间做快照。
  
  4.Simply dump
  如果不使用stop/suspend/snapshot中任何一个模式,虽然也不需要离线时间,但不能保证数据的一致性,所以一般不使用。警告提示如下:
  WARN: online backup without stop/suspend/snapshot
  WARN: this can lead to inconsistent data

三、lvm snapshot

与LVM的突出有点对应,它也是配置起来最麻烦的:
使用LVM2和vzdump创建快照,源卷所在卷组需要有至少512M空闲空间,因为快照卷与源卷都是可写的,快照存在的时间内,他俩之间的差异要全部保存于快照卷的空间中,一旦快照卷空间用尽,快照将会立即变为不可用状态。所以,如果磁盘空间不是问题,那么请分配足够空间保证备份过程的安全。
用来存储备份的文件夹(一般为/vz/dump)应该与你备份的源文件夹(一般为/vz/private)不在同一卷组。

为什么8核宿主机可以开出8核以上的虚拟机?

qemu代码内用Coroutine协程将vm内的一个核模拟为host上的一个线程,
以达到vm的cpu核与host的cpu核的相关性绑定。
也就是vm内的os把host上一个线程(即一个vm cpu核)获得的执行时间再分成若干时间片,然后分给vm内的线程按os调度策略执行。
一个qemu进程当然可以有多于宿主机cpu核数的线程,所以vm内的cpu核数也当然可以比host多,但是这时vm的某些核并不能并行执行,也就没什么意义了。

通过xenstore探索亚马逊EC2

已知xen的各dom之间通过xenstore共享配置信息。
so,先装上xenstore-utils
加载xenfs,并挂载到/proc/xen路径下。

root@ip-172-31-26-60:~# modprobe xenfs
root@ip-172-31-26-60:~# mount -t xenfs none /proc/xen/

然后就可以读取dom配置信息了。
由于权限问题。这里只能读自己的。
阅读更多…

lvm快照有点不一样

lvm的快照与其他普通文件镜像的快照有些不一样。
lvm的快照也是通过COW(copy on write)保存逻辑卷的瞬时状态。
但是实际上lvm的快照是创建一个新的逻辑卷。需要指定size。
快照创建之后源卷和快照卷都是可写的,源卷改变时改变前的内容会通过COW记录到快照卷,快照卷的改变内容也会记录到快照卷这size大的空间内。
需要特别注意的是,size空间一定要给足或及时扩充,不然一旦快照卷空间用尽,即Allocated to snapshot达到100%,快照卷就会立即变为不可用,若已挂载则会自动卸载。这时再去mount系统可就不认喽。

guestfish工作原理

guestfish是在宿主机里编辑虚拟机镜像的工具,guestfish命令只是对libguestfs接口的封装。
guestfish打开和操作vm镜像的过程如下:
guestfish
首先libguestfs调用febootstrap取宿主机的资源准备vm环境,包括
①在临时目录中建立到取宿主机内核的链接。
②取基本内核模块、init、modules列表打包为启动内存盘initrd
③建立稀疏文件准备制作vm启动磁盘镜像
④取宿主机的基本命令程序、配置文件和libguestfs的集成命令等等在vm镜像中构建rootfs
然后启动kvm,命令如下:
阅读更多…