1. 前言

  • 所需包:

    • kernel-xen
    • xen
    • xen-libs (xen依赖包)
    • xen_runtime (xen依赖包)
    • 以上xen包需要版本号一致,例如4.1.3版本,这里使用xm接口管理工具,故而,本次试验选用4.1.3版本
  • 环境:
    • 虚拟宿主机(vm)环境:centos-6.5,内核版本2.6.32
    • xen版本:4.1.3
    • 因为xen要与外界通信,需要构建桥接,但是NetworkManager不支持,故而需要先关闭

2. 升级虚拟宿主机(vm)内核到3.7.4

  • 解压并进入3.7.4内核tar xf linux-3.7.4.tar.xz;cd linux-3.7.4
  • 清理以前的内核编译产生的文件make distclean
  • 宿主机的当前内核配置文件到新的内核目录cp /boot/config-*** ./.config
  • 加载xen所需模块make menuconfig,或者直接调用之前已经有的linux 3.7.4 (已包含xen所需模块)的配置文件
  • 列出dom0所需的模块
# These core options (Processor type and features| Paravirtualized guest support]
CONFIG_PARAVIRT=y
CONFIG_XEN=y
CONFIG_PARAVIRT_GUEST=y
CONFIG_PARAVIRT_SPINLOCKS=y
# add this item # And Xen pv console device support (Device Drivers|Character devices
CONFIG_HVC_DRIVER=y
CONFIG_HVC_XEN=y # And Xen disk and network support (Device Drivers|Block devices and Device Drivers|Network device support)
CONFIG_XEN_FBDEV_FRONTEND=y
CONFIG_XEN_BLKDEV_FRONTEND=y
# change the value to y
CONFIG_XEN_NETDEV_FRONTEND=y
# change the value to y # And the rest (Device Drivers|Xen driver support)
CONFIG_XEN_PCIDEV_FRONTEND=y
CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y
CONFIG_XEN_FBDEV_FRONTEND=y
CONFIG_XEN_XENBUS_FRONTEND=y
CONFIG_XEN_SAVE_RESTORE=y
CONFIG_XEN_GRANT_DEV_ALLOC=m # And for tmem support:
CONFIG_XEN_TMEM=y
# add the item
CONFIG_CLEANCACHE=y
# enable the item
CONFIG_FRONTSWAP=y
# enable the item
CONFIG_XEN_SELFBALLOONING=y
# add the item # Configure kernel for dom0 support
# NOTE: Xen dom0 support depends on ACPI support. Make sure you enable ACPI support or you won't see Dom0 options at all.
# In addition to the config options above you also need to enable:
CONFIG_X86_IO_APIC=y
CONFIG_ACPI=y
CONFIG_ACPI_PROCFS=y (optional)
CONFIG_XEN_DOM0=y
CONFIG_PCI_XEN=y
CONFIG_XEN_DEV_EVTCHN=y
CONFIG_XENFS=y
# change the value to y
CONFIG_XEN_COMPAT_XENFS=y
CONFIG_XEN_SYS_HYPERVISOR=y
CONFIG_XEN_GNTDEV=y
CONFIG_XEN_BACKEND=y
CONFIG_XEN_NETDEV_BACKEND=m
# enable the item
CONFIG_XEN_BLKDEV_BACKEND=m
# enable the item
CONFIG_XEN_PCIDEV_BACKEND=m
CONFIG_XEN_PRIVILEGED_GUEST=y
CONFIG_XEN_BALLOON=y
CONFIG_XEN_SCRUB_PAGES=y # If you're using RHEL5 or CentOS5 as a dom0 (ie. you have old udev version), make sure you enable the following options as well:
CONFIG_SYSFS_DEPRECATED=y
CONFIG_SYSFS_DEPRECATED_V2=y
  • 搜索保存完毕的.config文件,找到CONFIG_SYSFS_DEPRECATED,将此行改为CONFIG_SYSFS_DEPRECATED_V2=y,如不修改,则无法启动系统
  • 编译内核make all
  • 编译模块make modules_install
  • 安装make install,安装的过程中可能会出现某些模块找不到,如果找不到的模块,已经在.config中设置为y,则不用理会,因为已经内置编译;如果是无关紧要的模块,也可以不用理会.
  • 修改/etc/grub.conf,将default设置为0
  • 重启

3. 安装xen包

  • 目前官方提供的xen包,已经是4.2.X版本,但是4.2版本不支持xm管理工具,故而选用4.1.3.
  • 建立本地yum源
[root@localhost ~]# vim /etc/yum.repos.d/xen.repo
[CentOS-xen4]
name=CentOS_xen4
baseurl=file:///usr/local/src/xen-4.1.3/
gpgcheck=0
[root@localhost ~]# ls /usr/local/src/xen-4.1.3/
repodata xen-doc-4.1.3-2.el6.x86_64.rpm xen-ocaml-4.1.3-2.el6.x86_64.rpm
xen-4.1.3-2.el6.x86_64.rpm xen-hypervisor-4.1.3-2.el6.x86_64.rpm xen-ocaml-devel-4.1.3-2.el6.x86_64.rpm
xen-debuginfo-4.1.3-2.el6.x86_64.rpm xen-libs-4.1.3-2.el6.x86_64.rpm xen-runtime-4.1.3-2.el6.x86_64.rpm
xen-devel-4.1.3-2.el6.x86_64.rpm xen-licenses-4.1.3-2.el6.x86_64.rpm
  • 安装xen yum install xen-4.1.3 kernel-xen

4. 修改宿主机grub配置文件vim /etc/grub.conf

  • 以xen为主,原虚拟机内核作为xen的模块
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (3.7.4)
root (hd0,0)
kernel /xen.gz dom0_mem=512M cpufreq=xen dom0_max_vcpus=2 dom0_vcpus_pin
module /vmlinuz-3.7.4 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
module /initramfs-3.7.4.img
title CentOS (2.6.32-431.20.3.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.20.3.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.20.3.el6.x86_64.img
title CentOS (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
  • 重启机器,查看xen是否已经起效 cat /proc/xen/capabilities出现control_d,则说明表示正常

5. 启动xen服务

  • service xend start
  • 查看当前xen虚拟实例xm list
[root@localhost ~]# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 512 2 r----- 99.5

常用的命令有:
* xm list列出虚拟实例
* xm create -c xen_config创建实例,-c是监控,即console
* xm destroy xen_name对某个实例断电
* xm console xen_name连接到某个实例,可通过ctrl+]返回

6. 安装cobbler环境

  • 因为我这里是两次虚拟化,故而宿主机已经不支持硬件虚拟化,故而采用xen半虚拟化方式,但是半虚拟化不支持光盘安装,只支持网络方式
  • cobbler搭建如下

7. 搭建虚拟宿主机的网络环境

  • xen的管理配置文件是/etc/xen/xend-config.sxp,内含的就有网络配置,例如网桥模式,路由模式,nat模式,仅主机模式等,不过即便有,如果不懂实现方式,也不知如何配置,故而本次试验采用手动实现网桥模式.
  • 如果想要实现VLAN高级技术,则可选用open vswitch
  • 我这里的环境如下:虚拟宿主机192.168.182.130就相当于实际环境下的宿主机

    • 宿主机192.168.182.2+虚拟服务vm-->虚拟宿主机(vm)192.168.182.130+虚拟服务(xen)-->虚拟机(xen)
    • 虚拟宿主机vm网卡eth0模拟成物理交换机peth0,工作在混杂模式,虚拟宿主机vm提供一个虚拟网桥xenbr0,然后将虚拟宿主机vm网卡eth0的MAC关联到虚拟网桥xenbr0上,然后虚拟机(xen)的虚拟网卡,通过xen程序实现桥接到虚拟宿主机vm的虚拟网桥xenbr0上.
    • xenbr0可以理解为peth0的逻辑实现
      如下图所示:
  • 创建桥接除了xen自身的,还有有以下几种:这里选择第三种,手动方式

    • 安装libvirt后,使用virsh可以直接创建
    • 安装bridge-utils包,使用brctl工具
      brctl show可以看桥接设备
      brctl addbr可以直接关联一个网卡到桥设备上
    • 手动创建
[root@localhost network-scripts]# cp ifcfg-eth0 ifcfg-xenbr0
[root@localhost network-scripts]# vim ifcfg-xenbr0
DEVICE=xenbr0
BOOTPROTO=none
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Bridge
IPADDR=192.168.128.130
NETMASK=255.255.255.0
GATEWAY=192.168.128.2
DNS1=114.114.114.114 [root@localhost network-scripts]# vim ifcfg-eth0
DEVICE=xenbr0
BOOTPROTO=none
HWADDR=00:0C:29:D3:E7:B1
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
BRIDGE=xenbr0
[root@localhost network-scripts]# service network restart

8. 配置一个xen虚拟机实例的配置文件

  • 第一种,采用图形化界面,直接安装系统

    • 需要安装包virt-manager或者virtinst
    • 使用命令virt-manager或者virtinst创建
    • 此模式下会自动创建本地回环文件作为磁盘文件
  • 第二种,采用命令行模式,自己写配置文件
    • 此模式下,需要手动创建本地回环文件作为磁盘文件

      • losetup -f查看当前空闲lo设备
      • 创建一个稀疏磁盘文件,有两种方式
        • qemu-img create -f qcow2 /xen/images/centos1.img 2G
        dd if=/dev/zero of=/xenimages/centos1.img \
        oflag=direct seek=20479 bs=1M count=1
      • 创建一个非稀疏磁盘文件 dd if=/dev/zero of=/xen/images/centos1.img bs=1M count=1024
      • losetup -f /xen/images/centos1.img挂载磁盘文件到当前空闲lo上
        • losetup -d /dev/loopN可以卸载磁盘文件
    • 利用本地(dom0)额外内核+磁盘文件vim /etc/xen/centos1
kernel="/tmp/vmlinuz"
ramdisk="/tmp/initrd.img"
name="centos1"
memory=512
#定义虚拟几颗cpu,一般来说宿主机cpu是几个,就虚拟几个,最多不要超过2倍
vcpus=2
disk=['file:/xen/images/centos1.img,xvda,w']
root="/dev/vol0/root ro"
extra="rhgb quiet"
#vif可以定义多个网卡,[]是列表
vif=['bridge=xenbr0']
  • 第三种方式,利用自己(domU)内核+虚拟宿主机负责引导第一阶段+虚拟机xen构建好的根系统,来启动
    vim /etc/xen/centos2

    bootloder="/usr/bin/pygrub"
    name="centos2"
    memory=512
    vcpus=2
    disk=['file:/xen/images/centos2.img,xvda,w']
    vif=['bridge=xenbr0']
    • 虚拟宿主机的bootloder引导程序定义了内核和initrd文件位置,故而只需要定义硬件信息即可
  • 第四种方式,仅有xen和xm工具下,使用cobbler进行网络自动化安装

    • 原理是本地(dom0)额外内核+远程ks模板构建根文件系统
    • 修改虚机实例配置文件vim /etc/xen/centos3
    kernel="/tmp/vmlinuz"
    ramdisk="/tmp/initrd.img"
    name="centos3"
    memory=512
    vcpus=2
    disk=['file:/xen/images/centos3.img,xvda,w']
    extra="ks=http://192.168.182.128/cobbler/ks_mirror/config/ks.cfg"
    vif=['bridge=xenbr0']
    • 创建disk磁盘文件(20G的稀疏磁盘)dd if=/dev/zero of=/xen/images/centos3.img oflag=direct seek=20479 count=1 bs=1M
  • 第五种方式,克隆

    • 克隆模式下,程序会对磁盘文件进行修改,比如网卡MAC之类的不能重复数据.
  • 第六种方式,磁盘模板
    • 磁盘模板:抽调敏感信息的磁盘文件
    • 此模式下,在创建虚拟机实例的时候,会将信息注入
    • 磁盘模板,有厂商免费提供或者利用工具自己制作,如红帽的oz工具
    • 磁盘模板可能没有内核,不过可以在dom0中提供,根文件系统由磁盘模板提供

#9. 在xen上生成一个简化linux

  • 采用domu内核+dom0引导方式
  • 手动创建本地回环文件作为磁盘文件,并关联到空闲loop
    • losetup -f查看当前空闲lo设备,假设空闲是loop1
    • dd if=/dev/zero of=/xen/images/centos2.img bs=1M count=1024创建一个非稀疏磁盘文件(稀疏磁盘不知道为什么没有柱面,所以无法用fdisk分区)
    • losetup -f /xen/images/centos1.img挂载磁盘文件到当前空闲lo上
  • 对磁盘文件进行分区,并挂载boot分区和/分区
    • fdisk /dev/loop1,创建一个boot分区,和一个根分区
    • 识别磁盘文件分区kpartx -a /dev/loop1,用cat /proc/partitions查看是否分区已经识别
    • 格式化分区mke2fs -t ext2 /dev/mapper/loop1p1mke2fs -t ext2 /dev/mapper/loop1p2
    • 挂载boot分区mount /dev/mapper/loop1p1 /mnt/boot
    • 挂载根分区mount /dev/mapper/loop1p2 /mnt/sysroot
  • 复制内核文件和创建引导程序,保证内核可以启动
    • cp /boot/vmlinuz /mnt/boot/vmlinuzcp /boot/initramfs /mnt/boot/initramfs.img
    • 创建grubgrub-install --root-directory=/mnt /dev/loop1
    • 创建grub配置文件vim /boot/grub/grub.conf
      shell:
      default 0
      timeout 5
      title xen centos
      root (hd0,0)
      kernel /vmlinuz ro root=/dev/xvda2 selinux=0 init=/sbin/init 3
      initrd /initramfs.img

      • 注释:grub的根路径是boot,root指定根文件系统所在分区,因为是用xen创建的系统,故而sda2就变成了xvda2,也就是虚拟宿主机上的loop1p2,init指定了启动级别
  • 复制必要的程序和脚本,构建一个基本的根文件系统,保证内核启动后,用户空间正常
    • 复制必要的程序和脚本initbashlscatuname
    • 提供根文件系统所需的配置文件rcS.conf和rc.sysinit
      shell
      #cd /mnt/sysroot/
      #mkdir -pv proc sys dev tmp var home root usr etc/{rc.d,init}
      #cp /etc/init/rcS.conf etc/init
      #vim etc/init/rcS.conf
      start on startup
      stop on runlevel
      task
      console output
      exec /etc/rc.d/rc.sysinit
      #vim etc/rc.d/rc.sysinit
      #!/bin/bash
      echo -e "Welcome to my Centos"
      /bin/bash
      #chmod u+x etc/rc.d/rc.sysinit
  • 创建xen虚拟实例配置文件vim /etc/xen/centos1
bootloder=/sbin/pygrub
name="centos2"
memory=512
#定义虚拟几颗cpu,一般来说宿主机cpu是几个,就虚拟几个,最多不要超过2倍
vcpus=2
disk=['file:/xen/images/centos1,xvda,w']
#vif可以定义多个网卡,[]是列表
vif=['bridge=xenbr0']

#10. 思考

  • 虚机实例的磁盘文件可以放在任何地方,故而最好放在集群文件系统上或者高可用集群上.以来保证安全.

#11. 附件1,xen实例配置文件参数解析

Xen配置文件一般由选项(options)、变量(variables)、CPU、网络、PCI、HVM、计时器(timers)、驱动(drivers)、磁盘设备(disk devices)、动作(behavior),以及图形及声音(Graphics and audio)几个段组成,分别用于定义不同类别的域属性或设备属性。

上面的配置文件中的各选项作用如下。

  • kernel:为当前域指定可用于DomU的内核文件;
  • ramdisk:与kernel指定的内核文件匹配使用的ramdisk映像文件,根据需要指定,此为可选项;
  • name:当前域的独有名称;每个域必须使用全局惟一的名称,否则将产生错误;
  • memory:当前域的可用物理内存空间大小,单位为MB,默认为128;
  • disk:当前域的所有可用磁盘设备列表,格式为disk = [ “disk1”, “disk2”, …],每个disk都有三个参数进行定义,格式为“backend-dev,front-dev,mode”;
    • backend-dev主要有两种类型,物理设备或虚拟磁盘映像文件,它们的格式分别为“phy:device”和“file:/path/to/file”;
    • frontend-dev定义其在DomU中的设备类型,一般为xvd[a-z];
    • mode则用于定义其访问权限,r为只读,w为读写;
  • vcpus:配置给当前域使用的虚拟CPU的个数;默认为1;
  • root:为当前域指定其根文件系统所在的设备,这个将作为内核参数在内核启动传递给内核;
  • extra:传递给内核的额外参数,其中selinux=0表示禁用selinux,init则用于指定init程序的路径;多个参数之间使用空格隔开;
  • on_reboot:执行xm reboot命令或在当前域内部执行重启操作时由Xen执行的动作;其常用的值为destroy和restart;
  • on_crash:当前域由于各种原因崩溃时由Xen执行的动作;其常用的值为destroy、restart和preserve,preserve可以保存系统崩溃前的状态信息以用于调试;
  • on_shutdown:执行xm shutdown命令或在当前域内部执行关机操作时由Xen执行的动作;
  • vif:定义当前域的可用虚拟网络接口列表,每个虚拟网络接口都可以使用“name=value”的格式定义其属性;也可在定义某接口时不指定任何属性,其所有属性将均由系统默认配置;例如:vif = ['ip = "192.168.1.19", bridge=xenbr0']
    • type:接口设备的类型,默认为netfront;
    • mac:MAC地址,默认为随机;
    • bridge:桥接到的物理设备,默认为Dom0中的第一个桥接设备;
    • ip:ip地址;
    • script:配置此接口的脚本文件,省略时将使用默认的配置脚本;
    • vifname:后端设备的设备名称,默认为vifD.N,其中D为当前域的ID,N为此网络接口的ID;
  • vfb:为当前域定义虚拟帧缓冲,其有许多可用属性,可以使用“name=value”的格式进行定义;
    • vnc或sdl:定义vnc的类型,vnc=1表示启动一个可由外部设备连接的vnc服务器,sdl=1则表示启用一个自有的vncviewer;两者可以同时使用;
    • vncdisplay:vnc显示号,默认为当前域的ID,当前域的VNC服务器将监听5900+此显示号的端口;
    • vnclisten:VNC服务器监听的地址,默认为127.0.0.1;
    • vncunused:如果此属性的值为非零值,则表示vncserver监听大于5900的第一个没被占用的端口;
    • vncpasswd:指定VNC服务器的认证密码;
    • display:用于域的自有vncviewer显示,默认为DISPLAY环境变量的值;
  • cpu:指定当前域应该在哪个物理CPU上启动,0表示第一颗CPU,1表示第二颗,依次类推;默认为-1,表示Xen可自行决定启动当前域的CPU;
  • cpus:指定当前域的VCPU可以在哪些物理CPU上运行,如cpus = ”3,5-8,^6”表示当前域的VCPU可以在3,5,7,8号CPU上运行;
  • bootloader:bootloader程序的路径;基于此bootloader,PV DomU的内核也可直接位于其文件系统上而非Dom0的文件系统;

xen之基本搭建的更多相关文章

  1. 实践:搭建基于Load Balancer的MySql Cluster

    服务器规划: 整套系统全部在rhel5u1 server 64位版本下,由基于xen的虚拟机搭建,其中集群管理节点*2.SQL节点*2.数据节点*4.Web服务节点*2组成,其中数据节点做成2个组,每 ...

  2. 利用 Serial Over Lan(SOL)搭建 XEN 的调试信息输出环境

    如有转载,请注明出处与本文连接,谢谢! 修改XEN的源码实现额外的功能,需要有一个调试环境来得到XEN的调试信息(有关源码编译并安装 XEN 请阅读我以前的博文:在CentOS下源码安装 Xen并搭建 ...

  3. 初试集群虚拟化搭建(二)—— Xen, kvm, OpenStack, VMware ESXi, Citrix XenServer等种种选择

    小伙伴们找到了一些主流方案的资料,最终选择了XenServer6.5作为平台搭建. Xen 特点: 功能强大,支持Linux的各种发行版本 通常是在现有Linux操作系统上安装,是一种半虚拟化的安装方 ...

  4. 在CentOS下源码安装 Xen并搭建Windows虚拟机

    前言 首先要感谢xing的帮助,在他的指导之下才完成环境的搭建,本文档的部分内容来自他的文档.另外,还要感谢——互联网. 1.       环境介绍 Linux: CentOS 6.3 Xen: Xe ...

  5. CentosX64使用yum快速搭建xen虚拟化环境

    Xen的大名想必已经被众SA所熟知.Xen 是一个开放源代码虚拟机监视器,由剑桥大学开发.它打算在单个计算机上运行多达100个满特征的操作系统.操作系统必须进行显式地修改(“移植”)以在Xen上运行( ...

  6. Xen之初体验:XenMotion、 StorageMotion、Site Recovery、Power Management 各种新、高级功能免费

    Xenserver 的新版本6.2现在已经全面开源,省掉了原有的序列号,也能免费体验曾经标题中的付费高级功能. 安装镜像:http://downloadns.citrix.com.edgesuite. ...

  7. Linux下搭建VPN服务器(CentOS、pptp)转

    先说我搭建过程中出现的问题吧: 按照 教程搭建好之后出现了619错误,查看日志:/var/log/messages: Nov 20 09:46:20 localhost pptpd[7498]: GR ...

  8. Tomcat双向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端超安全通信

    紧接着<Tomcat单向Https验证搭建,亲自实现与主流浏览器.Android/iOS移动客户端安全通信>,此处演示下更安全的双向Https认证的通信机制,为了清晰明了,以下进行单独描述 ...

  9. Xen

    Xen是一个开放源代码虚拟机监视器,由剑桥大学开发.它打算在单个计算机上运行多达128个有完全功能的操作系统. 在旧(无虚拟硬件)的处理器上执行Xen,操作系统必须进行显式地修改(“移植”)以在Xen ...

随机推荐

  1. CSAPP--存储器及程序的局部性

    作为一名程序员,你需要理解计算机存储系统的层次结构,他对应用程序的性能有着巨大的影响,如果程序所需要的数据存储在cpu的寄存器中,那么指令在执行期间,就可以花费零个周期来进行访问,而在Cache中则需 ...

  2. Android ndk第一步,构建jni headers

    转载请注明出处:http://www.cnblogs.com/fpzeng/p/4281801.html 源码请见 https://github.com/fpzeng/HelloJNI PC系统: u ...

  3. App 冷启动:给 Android 的 Activity 添加一个背景

    2016/8/8 11:11:18 # 纠错 之前写的这篇内容的知识点有误,给大家造成了误导,深感抱歉. android 中给 Activity 设置背景的方法是在 style 文件中设置 windo ...

  4. BZOJ 2115: [Wc2011] Xor

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 2794  Solved: 1184 [Submit][Stat ...

  5. QQ截图时窗口自动识别的原理(WindowFromPoint, ChildWindowFromPoint, ChildWindowFromPointEx,RealChildWindowFromPoint)

    新版的QQ在截图时加入了窗口自动识别的功能,能根据鼠标的位置自动画出下面窗口的轮廓.今天有人在论坛上问起这个问题,下面我们来探讨这个功能的实现原理. 首先我们要明白截图软件的基本原理,截图时实际上是新 ...

  6. PowerShell 简单模式识别 1

    PowerShell 简单模式识别 1 10 6月, 2013  在 Powershell tagged 字符串 / 文本 / 通配符 by Mooser Lee 在验证用户的条目时,模式识别是必要并 ...

  7. Android Map新用法:MapFragment应用

    MapView ,MapActivity 这种的局限在于,必须要继承MapActivity,否则无法使用MapView,但是,MapFragment 这种的局限在于,必须要安装Google Play ...

  8. RedisTemplate

    Spring Boot中Jedis几个api返回值的确认 @RequestMapping("/del/{key}") public String del(@PathVariable ...

  9. 在微软平台上运行 SAP 应用程序

     本博客介绍了在微软平台上运行 SAP 应用程序的相关信息,作者在基于微软平台使用 SAP 方面有着数十年经验. 发布关于 Azure 的 SAP 说明 几个月前,SAP 针对适用于 SAP 软件 ...

  10. bzoj1619[Usaco2008 Nov]Guarding the Farm 保卫牧场

    Description The farm has many hills upon which Farmer John would like to place guards to ensure the ...