在CentOS6.3中安装KVM

产品实验室服务器之前安装的是xen,kvm作为后起之秀也值得测试一下,于是将其中一台服务器格了,重装CentOS6和kvm。

服务器硬件:

  • 2 * Intel Xeon(支持虚拟化)
  • 4 * broadcom千兆网卡
  • 2 * SAS 300G硬盘

nginx on OpenBSD

UPDATE
原文针对OpenBSD4.9,现在已经是5.2了,有些内容重新做了修订。

Nginx(“engine x”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP 代理服务器 。Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的Rambler.ru 站点开发的,它已经在该站点运行超过四年多了。Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布四年来,Nginx已经因为它的稳定性、丰富的功能集、 示例配置文件和低系统资源的消耗而闻名了。目前国内各大门户网站已经部署了Nginx,如新浪、网易、腾讯等;国内几个重要的视频分享网站也部署了Nginx,如六房间、酷6等。

经过几年的发展,nginx的市场占有率稳步上升,截至2013年,市场份额占有率为15.52%(netcraft统计),微软的IIS为16.69%。nginx不日即可超越IIS。

OpenWRT网络配置

软硬件环境

  • 硬件:Linksys WRT54G修改版,8M FLASH/64M RAM
  • OS:OpenWRT 12.09

需求

  • WAN口处于闲置状态,未连接任何网络
  • LAN IP: 192.168.44.1/24,wifi IP: 192.168.77.1/24
  • wifi与LAN这两个网段之间可互相访问
  • 在wifi口启用DHCP服务
  • wifi处于AP mode,SSID为OpenWRT,启用WPS-PSK2认证

配置

# cat /etc/config/network

config switch 'eth0'
	option enable '1'

config switch_vlan 'eth0_0'
	option device 'eth0'
	option vlan '0'
	option ports '0 1 2 3 5'

config switch_vlan 'eth0_1'
	option device 'eth0'
	option vlan '1'
	option ports '4 5'

config interface 'loopback'
	option ifname 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config interface 'lan'
	option type 'bridge'
	option ifname 'eth0.0'
	option proto 'static'
	option netmask '255.255.255.0'
	option ipaddr '192.168.44.1'

config interface 'wan'
	option ifname 'eth0.1'
	option proto 'dhcp'
	
config interface 'wifi'
	option _orig_ifname 'radio0.network1'
	option _orig_bridge 'false'
	option proto 'static'
	option ipaddr '192.168.77.1'
	option netmask '255.255.255.0'

注意:在openwrt官网中,wifi section缺乏_orig_ifname_orig_bridge这两个参数,无法正常工作。

# cat /etc/config/wireless 

config wifi-device 'radio0'
	option type 'mac80211'
	option channel '11'
	option macaddr '00:13:10:e5:bc:53'
	option hwmode '11g'
	option txpower '20'
	option country '00'

config wifi-iface
	option device 'radio0'
	option network 'wifi'
	option mode 'ap'
	option encryption 'psk2'
	option key 'secret'
	option ssid 'OpenWRT'
# cat /etc/config/dhcp

config dnsmasq
	option domainneeded '1'
	option boguspriv '1'
	option localise_queries '1'
	option rebind_protection '1'
	option rebind_localhost '1'
	option local '/lan/'
	option domain 'lan'
	option expandhosts '1'
	option authoritative '1'
	option readethers '1'
	option leasefile '/tmp/dhcp.leases'
	option resolvfile '/tmp/resolv.conf.auto'
	list server '192.168.44.254'

config dhcp 'lan'
	option interface 'lan'
	option ignore '1'

config dhcp 'wan'
	option interface 'wan'
	option ignore '1'

config dhcp 'wifi'
	option interface 'wifi'
	option start     '100'
	option limit     '20'
	option leasetime '12h'

配置完成后

# ifup wifi
# /etc/init.d/dnsmasq restart

RouterOS学习笔记

2年前买了个RB493G,它是MikroTik当年出品的一款高性能企业级无线路由器,一直闲置着,落了不少灰。最近恰好要将大量数据从笔记本备份至ZFS存储,实在忍受不了LinkSYS WRT54G的无线速率,于是这两天把RB493G翻出来好好地玩了一把。

interface

RouterBOARD中的接口类型挺丰富,之前用得最多的就是千兆口和无线网卡,最近新出的RouterBOARD也带有SFP口了。当然,在RouterOS中接触最多的概念则是物理口和逻辑口。

PPPoE client

逻辑口,也就是拨号上网。注意哦,平时经常说ADSL拨号上网,实际上是两个概念,ADSL是物理层链路,拨号上网是通过PPPoE协议实现拨号、认证和计费。现在我用的是中国移动的家庭宽带,入户的直接就是一根网线,已经不再需要ADSL modern。

我将入户网线插入到RB493G的ether1中。Oracle的两根网线分别插入ether2和ether3,另外一根ether7置空,留作测试只用。

[admin@MikroTik] > interface pppoe-client print
Flags: X - disabled, R - running 
 0  R name="pppoe-out1" max-mtu=1480 max-mru=1480 mrru=disabled 
      interface=ether1 user="15904701233" password="123123" 
      profile=pppoe-client-default service-name="" ac-name="" 
      add-default-route=yes dial-on-demand=no use-peer-dns=yes 
      allow=pap,chap,mschap1,mschap2

ethernet

毋庸置疑,物理口。

[admin@MikroTik] > interface ethernet print
Flags: X - disabled, R - running, S - slave 
 #    NAME        MTU MAC-ADDRESS       ARP        MASTER-PORT     SWITCH    
 0 R  ether1     1500 00:0C:42:A9:AB:87 enabled    none            switch1   
 1 RS ether2     1500 00:05:5D:72:A5:0D enabled    none            switch2   
 2 RS ether3     1500 00:0C:42:A9:AB:89 enabled    none            switch2   
 3    ether4     1500 00:0C:42:A9:AB:8A enabled    none            switch2   
 4    ether5     1500 00:0C:42:A9:AB:8B enabled    none            switch2   
 5    ether6     1500 00:0C:42:A9:AB:8C enabled    none            switch1   
 6 R  ether7     1500 00:0C:42:A9:AB:8D enabled    none            switch1   
 7    ether8     1500 00:0C:42:A9:AB:8E enabled    none            switch1   
 8    ether9     1500 00:0C:42:A9:AB:8F enabled    none            switch1

比较特别的地方是ether2和ether3均有一个S的标识,这是由于创建了一个bonding逻辑接口,下属口就是ether2和ether3。

bonding

逻辑口,包含了ether2和ether3,这两个口通过两根网线与solaris 11的两个网口相连,构建Link Aggregation。

[admin@MikroTik] > interface bonding print         
Flags: X - disabled, R - running 
 0  R name="bonding1" mtu=1500 mac-address=00:05:5D:72:A5:0D arp=enabled 
      slaves=ether2,ether3 mode=802.3ad primary=none link-monitoring=none 
      arp-interval=100ms arp-ip-targets=192.168.172.20 mii-interval=100ms 
      down-delay=0ms up-delay=0ms lacp-rate=30secs 
      transmit-hash-policy=layer-2-and-3

RouterOS中对802.3ad的实现并不完整,尚未兼容layer-3-and-4这种策略,因此对端也只能设置成L2,L3或L2+L3。

wireless

物理口。此处用的无线网卡是R52n,可以实现2.4G和5G的802.11n。关键在于笔记本的无线网卡,很多仅支持2.4G的802.11n。

[admin@MikroTik] /interface> wireless print
Flags: X - disabled, R - running 
 0  R name="wlan1" mtu=1500 mac-address=00:0C:42:66:45:56 arp=enabled 
      interface-type=Atheros 11N mode=ap-bridge ssid="RB493G" 
      frequency=2412 band=2ghz-b/g/n channel-width=20mhz scan-list=default 
      wireless-protocol=802.11 wds-mode=disabled wds-default-bridge=none 
      wds-ignore-ssid=no bridge-mode=enabled default-authentication=yes 
      default-forwarding=yes default-ap-tx-limit=0 
      default-client-tx-limit=0 hide-ssid=no security-profile=default 
      compression=no

配置很复杂,还是通过winbox方便一些。即便是再忠诚的命令行拥护者也不能阻挡GUI的诱惑。

IP address

[admin@MikroTik] /ip> address print
Flags: X - disabled, I - invalid, D - dynamic 
 #   ADDRESS            NETWORK         INTERFACE                            
 0   192.168.22.254/24  192.168.22.0    wlan1                                
 1   192.168.172.254/24 192.168.172.0   bonding1                             
 2 D 183.254.43.236/32  183.254.0.1     pppoe-out1                           
 3   192.168.44.254/24  192.168.44.0    ether7

RouterOS跟其它的网络设备配置有些区别,IP地址跟物理口的设置分别在两个不同的菜单中,最终在IP地址菜单中实现两者的捆绑。

DHCP server

此处仅针对wireless提供DHCP服务。

[admin@MikroTik] /ip> dhcp-server print
Flags: X - disabled, I - invalid 
 #   NAME        INTERFACE     RELAY     ADDRESS-POOL        LEASE-TIME ADD-ARP
 0   dhcpServer   wlan1                     dhcp                  3d        
[admin@MikroTik] /ip> pool print
 # NAME         RANGES                         
 0 dhcp         192.168.22.1-192.168.22.10

NAT

显然,需要为RouterOS中所有网段提供NAT才能正常访问互联网。

[admin@MikroTik] /ip firewall> nat print
Flags: X - disabled, I - invalid, D - dynamic 
 0   chain=srcnat action=masquerade to-addresses=0.0.0.0 out-interface=pppoe-out1

NAT配置位于firewall菜单中,其的选项也很复杂,此处的关键是out-interface需要选择pppoe-out1

Link Aggregation

Oracle的文档非常详尽,MikroTik的RouterOS也很简单,因此创建Link Aggregation倒是很(容易)[]。

然而,两者通过两根网线连接后,死活ping不通,我尝试着更换了各种组合,譬如solaris侧分别设置了Policy: L2、L3和L2/L3,LACPactivity: active、passive和off等各种组合,RouterOS中的link monitor也尝试了arp、mii-1等,均未成功。实在没办法,于是只能采用终极大法:升级固件。

升级之后,终于实现Link Aggregation。手工模拟故障,先在RouterOS上ping solaris11的IP地址,拔掉任意一条网线均不影响两者之间的互联,顶多掉一个包。问题得到解决,solaris 11.1最终设置成了:

# dladm show-aggr aggr0

固件升级

我所买的RB493G的license是Level5,因此可以升级到后续的两个大版本号,比如说现在的RouterOS是V4.16,则最高可以升级到V6。

RouterBOARD的升级非常简单,在winbox界面中,打开file,然后将最新的firmware拖进winbox中,最后在terminal中system reboot重启即可。

自从将Linksys WRT54G换成了RB493G后,一个明显的感觉就是,笔记本通过无线浏览网页的速度比以前快多了,难道是心理作用?

OpenVPN on OpenBSD

2013-04-03添加topology subnet和ccd配置。
2013-02-14取消whichsslconf依赖。
2012-04-12初稿。
{: .info}

OpenVPN是近年来最火的VPN软件,它部署容易,使用简单,跟IPsec相比,它所缺少的只是积累和口碑,不过没关系,已经有越来越多的公司开始在生产环境中用OpenVPN来取代IPsec。

一次业务迁移的经验小结

移动介质的FS要足够普通

我准备了一块160G的移动硬盘,由于容量比较大,因此格式化为exFAT格式,然而生产环境的OS分别是windows 2003和OpenSUSE11.3,都无法识别,而移动硬盘中还有其它数据,不能直接格式化,因此费了一番心思。

所以,移动介质一定要采用最普通的文件系统,譬如FAT32,windows2003和较老的linux都无法识别exFAT。

如何实现快速拷贝

windows ntfs文件系统对付小文件力不从心,因此假如有大量小文件需要备份,有两种解决办法:

  • 压缩-传输-解压

    用winzip、winrar这样的压缩软件采用zip方式打包(不压缩,选择最快速度)小文件后,作为一个打文件传送到另外一个服务器,然后在目的地解压;

  • 使用第三方拷贝软件

    譬如fastcopy和ultracopier,千万别用teracopy,在cmoa业务数据备份的过程中发现它有两个问题:

    1. 拷贝速度不稳定,下跌厉害;
    2. 拷贝文件出现错误。而fastcopy就非常稳定,而且不会出错。

经测试,采用CIFS/SMB共享方式,fastcopy的拷贝速度可达15MB/s,基本上是千兆网络速率的极限。

尽量使用域名

基于B/S架构的业务系统尽量用域名访问,否则IP地址变更后,如何通知几百个客户是非常痛苦的一件事情,尤其是政府客户。

基础服务和业务应用分开部署

2009年部署业务应用的时缺乏经验,将一些基础服务,譬如DNS、radius、AD和OpenVPN等基础服务连同业务应用全部部署在同一台物理服务器上,导致业务应用迁移前需先做好基础服务的迁移。当然,假如物理服务器数量足够的话,没有人愿意将多个服务部署在一台服务器。

VMware中修改guest OS的MAC地址

很多业务应用的license都跟服务器的MAC地址进行绑定,因此需要提前了解VMware环境中的MAC地址修改技巧。

有两种方式

  • 修改VMware的VMX文件

  • 修改guest OS中的AMC地址,windows中我经常用的是K-mac,linux则直接在网卡的配置文件中设定即可。

新不如旧

前面的文件系统是这样,接下来的无线路由器也是这样,在本次迁移的过程中,顺手用一个D-link DIR600M换掉一台古老的linksys WRT54G。

DIR600M支持AP和无线路由两种无线工作方式,AP方式指的是WAN、LAN和wifi处于同一个网段:192.168.0.0/24,而且这个网段还不能手工改,无线路由方式指的是WAN连接互联网,LAN和wifi处于同一个网段。好在LAN可以自行设置IP地址。因此最终选择了“无线路由”方式。DIR600M仅有4M rom和32M ram,刷OpenWRT就不必了,还比不上两年前买的LinkSYS WRT54G mod,至少还有8M rom和64M ram呢。

所以说,并不是越新就越好,成本的下降往往意味着偷工减料。

seafile服务

seafile是一个非常好用的,适合于小团队的文件共享服务软件。同时,它还是一款国内的开源软件,难得可贵。这两天我花了一些时间架设seafile服务,记录下来备用。

seafile介绍

组件

  • ccnet:网络服务
  • seafile server:负责数据访问
  • seahub:网站界面,供用户管理自己在服务器上的数据和账户信息
  • HttpServer: 负责直接从网站上下载和上传文件
  • controller: 负责监控和重启上述部件

seafile环境

seafile组网示意图

如图示,seafile服务器位于防火墙之后,需要在防火墙做好端口映射。

NOTE
我用的是中国移动的宽带,无法通过官网的下载链接直接下载。必须fanqiang到https://code.google.com/p/seafile/downloads/list手工下载,然后再通过winscp传送到linux服务器上,颇为费劲。

安装

服务端支持linux和windows两种操作系统,本文的选择是debian 6 32bit。

准备存储

事先安装好nfs client,然后挂载NFS

# mkdir -p /mnt/seafile
# echo "192.168.55.120:/tank/documents/seafile  /mnt/seafile  nfs  defaults  0 1" >> /etc/fstab
# mount /mnt/seafile

准备运行环境

# aptitude update
# aptitude install python2.6 python-setuptools python-simplejson python-imaging sqlite3

安装

查看系统架构,32bit or 64bit

# uname -m      

创建seafile根目录,源文件将解压到该根目录下

# mkdir /usr/local/src/seafile
# tar -C /usr/local/src/seafile -zxvf seafile-server_1.7.0_i386.tar.gz

that's all.

配置

# cd /usr/local/src/seafile-server-*
# ./setup-seafile.sh

配置参数如下:

参数 说明
seafile server name seafile服务器的名字,3~15 个字符,可用英文字母,数字,下划线
seafile server ip or domain seafile服务器的IP地址或者域名。客户端将通过这个IP或者域名来访问Seafile服务。需要注意的是,在本例中,该IP地址应设为防火墙的互联网IP
ccnet server port 默认:10001
seafile data dir seafile数据存放目录,默认是./seafile/seafile-data,建议放在一个NFS服务器中,方便日后的扩容和维护。
seafile server port seafile服务器使用的TCP端口,默认为12001
seafile httpserver port seafile httpserver使用的TCP端口,默认为8082
seahub admin email sehaub管理员的帐户。该帐号仅是管理员帐号,用于发送邮件通知的email帐号需在seafile.conf中进行配置。
seahub admin password seahub管理员的密码

seafile的配置文件是分布式的,不同组件的配置文件单独分开,不利于维护。

启动

# ./seafile.sh start
# ./seahub.sh start
假如seahub的端口不是默认的8000,则
./seahub.sh start <new_port>

停止

# ./seafile.sh stop
# ./seahub.sh stop

重启

# ./seafile.sh restart
# ./seahub.sh restart

假如seahub的端口不是默认的8000,则

# ./seahub.sh restart <new_port>

升级

由于seafile的开发非常活跃,新版本层出不穷,因而经常需要升级。

升级前需先中止seahub和seafile进程:

# ./seahub.sh stop
# ./seafile.sh stop

新下载的版本也一并解压到seafile的根目录下,在本文中指的是/usr/local/src/seafile,读者也可以自行选择其它目录。最终的目录结构如下:

/usr/local/src
   -- seafile-server-1.7.0
   -- seafile-server-1.4.5
   -- ccnet
   -- seafile-data

小版本升级

指的是从1.6.0升级到1.6.1。

cd /usr/local/src/seafile/seafile-server-1.3.1/seahub/media
cp -rf avatars/* ../../../seahub-data/avatars/
rm -rf avatars
ln -s ../../../seahub-data/avatars

连续版本升级

指的是从1.6.0升级到1.7.0。

cd /usr/local/src/seafile-server1.7.0/upgrade
./update_1.6_1.7.sh

非连续版本升级

现在的版本为1.4,最新版本为1.7,需连续执行

cd /usr/local/src/seafile-server1.7.0/upgrade
./update_1.4_1.5.sh
./update_1.5_1.6.sh
./update_1.6_1.7.sh

升级完毕后启动seahub和seafile进程。

随机启动

seafile服务由多个进程共同协作而成,

创建/etc/init.d/seafile-server

#!/bin/sh
### BEGIN INIT INFO
# Provides:		seafile-server
# Required-Start:	$all
# Required-Stop:	$all
# Should-Start:		$local_fs
# Should-Stop:		$local_fs
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
### END INIT INFO

# Change the value of "user" to your user name
user=root

# Change the value of "script_path" to your path of seafile installation
script_path=/usr/local/src/seafile/seafile-server-1.7.0

sudo -u ${user} ${script_path}/seafile.sh start > /tmp/seafile.init.log 2>&1
sudo -u ${user} ${script_path}/seahub.sh start > /tmp/seahub.init.log 2>&1

以上脚本仅用于start,缺乏stop和restart的功能。

更新

# chmod +x /etc/init.d/seafile-server
# update-rc.d seafile-server defaults

tips

  • 变更默认端口后,seafile可能会出现问题,这种情况下建议直接重装了事,包括服务端和客户端。

  • 客户端的删除

    • 删除客户端之前请确保ccnet进程已杀掉,否则无法正常卸载。
    • 卸载完后,手工删除客户端的配置文件夹C:\用户\<用户名>\ccnet
  • 客户端的配置

    客户端的配置文件为C:\用户\<用户名>\ccnet\ccnet.conf,假如服务端的变更了默认端口号,需在此进行变更。

升级OpenBSD

我目前的两台防火墙是OpenBSD4.9,需要升级到5.2。由于OpenBSD不支持跨版本升级,因此需要采用4.9->5.0->5.1->5.2这种逐步升级的方式。

下面步骤是官网推荐的upgrade by install kernel。

# mkdir /backup
# mv /bsd.rd /backup/bsd.rd.50
# wget http://ftp.jaist.ac.jp/pub/OpenBSD/5.2/i386/bsd.rd
# shutdown -r now

在boot的提示符中输入

>bsd.rd

选择(U)pgrade,然后选择合适的sets: bsd.rd,bsd,base.tgz,comp52.tgz,man52.tgz

# wget http://ftp.jaist.ac.jp/pub/OpenBSD/5.2/i386/etc52.tgz
# sysmerge -x /backup/etc52.tgz

最后是确认所有的配置文件是否正确

# shutdown -r now

使用iSCSI作为VM的storage backend

iSCSI作为VM的storage backend也很流行,原因是iSCSI协议非常适合于小文件的读写,而且其对硬件设备几乎没有什么要求,只要IP可达即可。

在本文中,我们仍然以solaris11作为外置存储,不得不说,solaris11实在是太强悍了,ZFS,comstar,nfs都是存储必备的组件模块。

iSCSI server

iSCSI server安装在solaris11上,solaris11

iSCSI client

iSCSI client将安装在hypervisor上,本文以CentOS为例。

安装iSCSI client

[root@DL165-1 ~]# yum install iscsi-initiator-utils

配置iSCSI client

[root@DL165-1 ~]# vim /etc/iscsi/iscsid.conf
...
node.session.auth.username = linuxabc
node.session.auth.password = 123456
discovery.sendtargets.auth.username = linuxabc
discovery.sendtargets.auth.password = 123456
...

启动iSCSI服务

[root@DL165-1 ~]# /etc/init.d/iscsi start

连接到iSCSI server

[root@DL165-1 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.55.120
[root@DL165-1 ~]# iscsiadm -m node -T iqn.2010-06.xen-sanhead:xen-alfie --login
[root@DL165-1 ~]# /etc/init.d/iscsi restart

在xen dom0中执行fdisk -l就会看到系统中多出了一个块设备/dev/sdc,那正是ZFS storage上的iSCSI target。

[root@DL165-1 ~]# fdisk -l
...
Disk /dev/sdc: 8589 MB, 8589934592 bytes
64 heads, 32 sectors/track, 8192 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

Disk /dev/sdc doesn't contain a valid partition table

最后在xen dom0机器上把domU配置文件的disk一行改成:

disk = [ "phy:/dev/sdc,xvda,w" ]

CentOS5.6+xen3.4.3升级至CentOS5.8+xen3.4.4

去年使用gitco repos成功地在CentOS5.6上安装了xen 3.4.3,已经稳定地运行了一年。前段时间CentOS和xen都升级了,于是便有了下文。

升级CentOS

在升级之前为了稳妥起见,先备份相关的配置文件。

CentOS的升级很简单,就是yum update,然后重启,唯一需要注意的就是重启前需要调整/boot/grub/menu.lst中的启动顺序,因为升级后,CentOS默认的内核启动顺序是新版的kernel。

验证一下

[root@DL165-2 ~]# cat /etc/redhat-release 
CentOS release 5.8 (Final)

升级xen

[root@DL165-2 ~]# mv /etc/yum.repos.d/GITCO-xen3.4.3 backup
[root@DL165-2 ~]# wget http://www.gitco.de/xen3.4.4
[root@DL165-2 ~]# yum update xen

将从xen3.4.3升级至xen3.4.4,验证一下:

[root@DL165-2 ~]# xm info
host                   : DL165-2
release                : 2.6.18-308.13.1.el5xen
version                : #1 SMP Tue Aug 21 17:51:21 EDT 2012
machine                : x86_64
nr_cpus                : 8
nr_nodes               : 1
cores_per_socket       : 4
threads_per_core       : 1
cpu_mhz                : 2693
hw_caps                : 178bf3ff:efd3fbff:00000000:00000310:00802001:00000000:000037ff:00000000
virt_caps              : hvm
total_memory           : 8191
free_memory            : 7579
node_to_cpu            : node0:0-7
node_to_memory         : node0:7579
xen_major              : 3
xen_minor              : 4
xen_extra              : .4
xen_caps               : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64 
xen_scheduler          : credit
xen_pagesize           : 4096
platform_params        : virt_start=0xffff800000000000
xen_changeset          : unavailable
cc_compiler            : gcc version 4.1.2 20080704 (Red Hat 4.1.2-52)
cc_compile_by          : root
cc_compile_domain      : gitco.tld
cc_compile_date        : Mon Jun 25 11:29:36 CEST 2012

xend_config_format     : 4