在 Ubuntu 上搭建 Ghost 博客平台

Ghost 是一款开源的博客平台,基于 Node.js,由前 WordPress UI 主管 John O’Nolan 和 WordPress 开发人员 Hannah Wolfe 创立。网上的开源博客程序众多,去年刚上线的 Ghost 来势汹汹正迅速捕获用户,0.4.1 这么早期的版本就让 Coding Horror 拥抱了 Ghost。Ghost 主题/模版越来越多,一些优秀的 WordPress 主题商,比如 WooThemes 都开始提供 Ghost 主题了

安装 Ghost 非常容易,甚至比 WordPress 还简单。下面的安装步骤在 Ubuntu 12.04.4 LTS Server 版本上测试通过。

切换到 root 账号升级和更新整个系统:

$ sudo -i

# apt-get update
# apt-get upgrade

安装 Node.js 运行环境:

# apt-get install g++ make python python-software-properties
# add-apt-repository ppa:chris-lea/node.js
# apt-get update
# apt-get install nodejs

下载、解压 Ghost 后安装:

# cd
# wget https://ghost.org/zip/ghost-0.4.1.zip
# unzip ghost-0.4.1.zip -d ghost
# cd ghost
# npm install --production

配置 Ghost 使其监听本机上的所有 IP,修改 ‘127.0.0.1’ 为 ‘0.0.0.0’:

# vi config.js
...
       server: {
            // Host to be passed to node's `net.Server#listen()`
            host: '0.0.0.0',
            // Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
            port: '2368'
        }
...

使用 npm 启动 Ghost 程序:

# npm start

> ghost@0.4.1 start /root/ghost
> node index

Ghost is running in development...
Listening on 0.0.0.0:2368
Url configured as: http://my-ghost-blog.com

Ghost 的默认端口是 2368,打开浏览器访问 http://192.168.2.178:2368 就可以看到界面了:

Ghost

登录后台访问 http://192.168.2.178:2368/admin 地址:

Ghost

Ghost 是独立程序,在 nodejs 环境下可以直接运行,在 config.js 文件里修改 Ghost 的监听端口 2366 为 80 就可以了,不过在生产环境我们一般在前端加个 Nginx.

安装和配置 Nginx:

# apt-get install nginx
# rm /etc/nginx/sites-enabled/default

# vi /etc/nginx/sites-available/ghost
server {
    listen 0.0.0.0:80;
    server_name vpsee.com;
    access_log /var/log/nginx/vpsee.com.log;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header HOST $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://127.0.0.1:2368;
        proxy_redirect off;
    }
}

# ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost

# /etc/init.d/nginx restart

Nginx 接到请求后会 pass 给(proxy_pass)Ghost 服务程序,这时候最好把刚才测试用的 Ghost 配置修改还原成 ‘127.0.0.1’,修改后记得重启 Ghost:

# vi config.js
...
            // Host to be passed to node's `net.Server#listen()`
            host: '127.0.0.1',
...

每次 npm start 太麻烦,为了 Ghost 程序在系统启动后能自动运行,需要加入脚本到 Upstart 里:

# vi /etc/init/ghost.conf
start on startup

script
    cd /root/ghost
    npm start
end script

以后需要启动、重启或者停止 Ghost 就可以用 service ghost start/restart/stop 了:

# service ghost restart
ghost stop/waiting
ghost start/running, process 11619

相比 WordPress 的臃肿 Ghost 要轻爽得多。通过 Markdown 格式、Node.js 的实时和漂亮的界面,Ghost 给用户提供了一种更简单、更纯粹的内容写作发布方式。左边是编辑文章,右边是实时预览:

Ghost

使用 lsyncd 同步本地和远程目录

自动同步本地服务器(或 VPS)上的目录到另一台或多台远程服务器的办法和工具有很多,最简单的办法可能是用 rsync + cron(参考:用 VPS 给博客做镜像),这种办法有个问题就是 rsync 只能在固定时间间隔里被 cron 调用,如果时间间隔设的太短,频繁 rsync 会增加服务器负担;如果时间间隔设的太长,可能数据不能及时同步。今天介绍的 lsyncd 采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,这种机制可以做到只有在需要(变化)的时候才去同步。lsyncd 密切监测本地服务器上的参照目录,当发现目录下有文件或目录变更后,立刻通知远程服务器,并通过 rsync 或 rsync+ssh 方式实现文件同步。lsyncd 默认同步触发条件是每20秒或者每积累到1000次写入事件就触发一次,当然,这个触发条件可以通过配置参数调整。

lsyncd 已经在 Ubuntu 的官方源里,安装很容易:

$ sudo apt-get update
$ sudo apt-get install lsyncd

lsyncd 安装后没有自动生成所需要的配置文件和目录,需要手动创建:

$ sudo mkdir /etc/lsyncd
$ sudo touch /etc/lsyncd/lsyncd.conf.lua

$ sudo mkdir /var/log/lsyncd
$ sudo touch /var/log/lsyncd/lsyncd.{log,status}

配置 lsyncd,注意 source, host, targetdir 部分,依次是本地需要同步到远程的目录(源头),远程机器的 IP,远程目录(目标):

$ sudo vi /etc/lsyncd/lsyncd.conf.lua
settings {
        logfile = "/var/log/lsyncd/lsyncd.log",
        statusFile = "/var/log/lsyncd/lsyncd.status"
}

sync {
        default.rsyncssh,
        source = "/home/vpsee/local",
        host = "192.168.2.5",
        targetdir = "/remote"
}

配置本地机器和远程机器 root 帐号无密码 ssh 登陆,并在远程机器上(假设 IP 是 192.168.2.5)创建一个 /remote 目录:

$ sudo su
# ssh-keygen -t rsa
# ssh-copy-id root@192.168.2.5

# ssh 192.168.2.5
# mkdir /remote

配置好后就可以在本地机器上启动 lsyncd 服务了,启动服务后本地机器 /home/vpsee/local 下的目录会自动同步到远程机器的 /remote 目录下:

$ sudo service lsyncd restart

除了同步本地目录到远程目录外,lsyncd 还可以轻松做到同步本地目录到本地另一目录,只要修改配置文件就可以了:

$ sudo vi /etc/lsyncd/lsyncd.conf.lua
settings {
        logfile = "/var/log/lsyncd/lsyncd.log",
        statusFile = "/var/log/lsyncd/lsyncd.status"
}


sync {
	default.rsync,
	source = "/home/vpsee/local",
	target = "/localbackup"
}

$ sudo service lsyncd restart

OneStack:分步部署 All-in-One 的 OneStack 实验环境

囧,上次 OneStack 项目作者 Kayven 发过来的 OneStack 介绍和配置的文章只发了一半就忘了(本来打算分两部分发的~),今天在草稿箱里把这部分整理出来了,希望文章内容还没有过时(OpenStack 和 Ubuntu 版本都有了很大变化 …)。

前部分介绍请看:OneStack:Ubuntu 12.04 上一键自动部署 OpenStack。下面介绍的是用 OneStack 分步部署 OpenStack 的方法:

1、切换 root,或者用 sudo 执行脚本:

$ sudo -i

2、(可选,如果不需要跳过本步骤):
系统语言设置,可以参考 oneStack.sh locale 部分,不在此介绍。比如设置 apt 源:

# vi /etc/apt/sources.list

3、设置网络(可以参考 oneStack.sh locale 部分):

# vi /etc/network/interfaces

4、配置参数,除了网络 ip,其它可以不变:

## 数据库
MYSQL_PASSWD=${MYSQL_PASSWD:-"cloud1234"}
## 自行检查下面network/interfaces的两个网卡设置与此处一致
OUT_IP="192.168.139.50"
## 选择虚拟技术,裸机使用kvm,虚拟机里面使用qemu
VIRT_TYPE="qemu"
## token, 登录dashboard密码
ADMIN_TOKEN="admin"

5、部署基本系统

./setup_base.sh

6、添加镜像(Ubuntu12.04),添加一个实例,注意:里面的 ip 需要自己配置,镜像地址可以自己改动:

./setup_test.sh

7、分别部署控制节点和计算节点:
控制节点同上,可以去掉 nova-compute;
计算节点,只需要配置网络、数据库、虚拟机技术即可。

配置参数,除了计算节点 ip,其余与控制节点相同(包括 nova.conf 里的 ip)自行检查下面 network/interfaces 的两个网卡设置:
ServerControlIP=”192.168.139.50″
computeControlIP=”192.168.139.150″ # 本计算节点的外网IP

## token, 登录 dashboard 密码
ADMIN_TOKEN="admin"

## 网络配置
NETWORK_CONF=${NETWORK_CONF:-"/etc/network/interfaces"}
cat <$NETWORK_CONF
# The primary network interface
auto eth0
iface eth0 inet static
pre-up ifconfig eth0 hw ether b8:ac:6f:9a:ee:e5 #不需要绑定网卡的不需要这一行
        address 192.168.139.51 #外网ip
auto eth1
iface eth1 inet static
pre-up ifconfig eth1 hw ether b8:ac:6f:9a:ee:e5
        address 10.0.0.2 #内网IP

INTERFACES
sed -i -e "s/192.168.139.51/$computeControlIP/g" $NETWORK_CONF
/etc/init.d/networking restart

注意:以下与控制节点相同

## 配置 /etc/nova/nova.conf,这里与控制节点的配置相同!比如ip是控制节点的ip
MYSQL_PASSWD=${MYSQL_PASSWD:-"cloud1234"}
NOVA_DB_USERNAME=${NOVA_DB_USERNAME:-"novadbadmin"}
NOVA_DB_PASSWD=${NOVA_DB_PASSWD:-"cloud1234"}
OUT_IP="192.168.139.50" 
……
## 选择虚拟技术,裸机使用 kvm,虚拟机里面使用 qemu
VIRT_TYPE="qemu"

7、执行 ./addComputeNode.sh

./addComputeNode.sh

如果对这篇有任何技术问题请直接咨询 OneStack 项目的原作者 Kayven (Hily.Hoo@gmail.com),git/github 粉也可以从这里获得源码: https://github.com/Kayven/OneStack

定制 Ubuntu 安装盘

最近在准备一个关于高性能计算方面的 workshop,需要50台笔记本,这样每个人在 workshop 上都可以自己动手实践和学习。给50台笔记本安装系统是个体力活,因为全部要 WiFi,无线网卡又无法做 PXE 开机启动(市面上支持无线网卡启动的好像很少),那种通过 PXE 启动的办法就行不通,所以我们的 Cobbler 服务器也派不上用场。现在考虑的办法是自制基本的 Ubuntu 系统、做10个 U 盘、修改 BIOS 后用 USB 启动安装,安装完毕后再通过 Puppet 统一管理50台笔记本,这样可以灵活应对 workshop 中间可能出现的变化,比如某时候需要安装 Java 环境、集体修改密码等。

自己定制 Ubuntu 安装盘有很多现成工具,Ubuntu Customization Kit 和 Ubuntu Builder 是用的较多的两个,我们这里选用 Ubuntu Builder. 使用这类工具之前我们都需要一个原版的 Ubuntu ISO(ubuntu-12.04.2-desktop-amd64.iso),这样才能在此基础上做定制。

安装和运行:

$ sudo add-apt-repository ppa:f-muriana/ubuntu-builder
$ sudo apt-get update
$ sudo apt-get install ubuntu-builder

$ ubuntu-builder

可以定制的选项不是很多,选择我们要定制的 ISO、选择要安装的桌面环境(窗口管理器)、编辑一下 sources.list 使用我们内部的源(这样50台笔记本同时升级和安装软件都快很多)、安装一些我们要的软件包(比如 openssh-server, puppet 在 Ubuntu 12.04 Desktop 版本中没有默认安装。)等等。

ubuntu builder

定制完成后点击 Build 就会开始创建新的 Ubuntu ISO,build 完成后会在 /home/ubuntu-builder 目录下出现一个新的 iso 文件,这个文件就是刚刚定制的 Ubuntu 安装 ISO 文件,可以用 VirtualBox 试一下是否可用,然后刻成 CD/DVD 或者 USB 盘就可以了。

在 Ubuntu 上安装 NX 服务器

远程登陆 Linux 图形桌面有很多方式,比如使用 RFB (Remote Frame Buffer) 协议的各种 VNC 工具,TightVNC, UltraVNC, Xvnc 等,使用 NX 的 NoMachine, freenx, neatx 等。NX 通过 X11 调用来通信,比 VNC 这种通过截图似的通信要快的多,而且安全(通过 ssh),更适合在网速不高(相比局域网来说)的 Internet 上应用。如果你想在 VPS 上使用 Linux 图形界面的话,使用 NX 是一个比 VNC 好得多的方案。

安装 NX 服务器

到 NoMachine 官网下载 nxserver 4.0 到 Ubuntu 后直接安装就可以了,不需要其他的依赖包,这个比以前的 3.5 版本清晰多了,3.5 版本的 NX 服务器要装 nxnode, nxserver, nxclient,这三个名字很混淆人:

$ wget http://64.34.173.142/download/4.0/Linux/S/nxserver_4.0.181-7_i386.deb
$ sudo dpkg -i nxserver_4.0.181-7_i386.deb

安装 NX 客户端

在 Mac 上下载 nx 客户端 nxplayer 4.0 后安装,需要注意的是,nxplayer 是 nxclient 的下一代版本,目前还是预览版,因为 Mac OS X 10.8 上不能使用旧版本的 nx 客户端(nxclient-3.5.0-7.pkg),安装后不能启动,所以这里只能用 nxplayer 预览版。

$ wget http://64.34.173.142/download/4.0/MacOSX/nxplayer-4.0.181-7.dmg

测试

安装完毕后,在 Mac 上启动一个 nxplayer 连接 Linux 上的 nxserver:

nxplayer session

成功连接后输入用户名和密码就能进入 Ubuntu 桌面了:

nxplayer session

在 Ubuntu 12.04 上安装 CUDA 5 开发环境

休假时间太长,回来发现敲命令居然有点手生,一些命令都不能一次敲对。上个月去南非德班参加了一个高性能计算会议,会议的多数话题是关于 SKA 的,Square Kilometre Array(SKA)是迄今为止全球最大最灵敏的射电望远镜,将在南非和澳大利亚建造,所以这次德班会议的多个 talk 都和 SKA 项目有关。会议有很多提到 GPU 的地方,比如模拟太阳内部黑子爆发,后面用到了大量计算,普通 PC 要计算1600年的数据在现代集群 GPU 上只要几天就可以完成。我们今年新增了的几台做 GPU 高性能计算的 PowerEdge M610x 刀片服务器,上个月就到货了没来得及装配就放假了,昨天 Dell 的人过来装了一下,自己也顺便了解了一下 GPU,玩了一下 CUDA 这个开发环境。

安装必要软件包

sudo 成 root 用户后安装一些必要软件包:

$ sudo -i
# apt-get install build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev freeglut3-dev

需要在 blacklist.conf 末尾增加下面几行屏蔽几个模块,以便顺利安装驱动:

# vi /etc/modprobe.d/blacklist.conf
...
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv

安装 NVIDIA 图形卡驱动

从 NVIDIA 官网找到对应的图形卡型号,下载和安装 NVIDIA 图形卡驱动:

# wget http://us.download.nvidia.com/XFree86/Linux-x86_64/310.19/NVIDIA-Linux-x86_64-310.19.run
# chmod +x NVIDIA-Linux-x86_64-310.19.run
# ./NVIDIA-Linux-x86_64-310.19.run
# reboot

nvidia driver install for cuda

安装 CUDA 5.0 开发工具包

从 NVIDIA 官网下载和安装最新的 CUDA 5.0 开发工具包,没有 for ubuntu 12.04 的不要紧,下载 for ubuntu 11.10 的一样可以用在 ubuntu 12.04 上:

# wget http://developer.download.nvidia.com/compute/cuda/5_0/rel-update-1/installers/cuda_5.0.35_linux_64_ubuntu11.10-1.run
# chmod +x cuda_5.0.35_linux_64_ubuntu11.10-1.run
# ./cuda_5.0.35_linux_64_ubuntu11.10-1.run

检查一下日志,看看安装过程中是否有错:

# tail /var/log/nvidia-installer.log 
-> done.
-> Driver file installation is complete.
-> Running post-install sanity check:
-> done.
-> Post-install sanity check passed.
-> Shared memory test passed.
-> Running runtime sanity check:
-> done.
-> Runtime sanity check passed.
-> Installation of the kernel module for the NVIDIA Accelerated Graphics Driver for Linux-x86_64 (version 304.54) is now complete.

最后简单验证一下 cuda 是否安装成功:

# cd /usr/local/cuda/bin
# ./nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2012 NVIDIA Corporation
Built on Fri_Sep_21_17:28:58_PDT_2012
Cuda compilation tools, release 5.0, V0.2.1221

在 Ubuntu 12.04 上安装 GitLab

gitlab

我们需要一套能自己托管 git 的工具,类似 GitHub,但是要求能 host 在自己的服务器上,看了一下 Git Enterprise 版本,20人每年授权费用是5000美金,太贵,只能找找类似的开源工具,以前用的是 Redmine + GitTrac + Git/Subversion 来管理实验室的项目,有点腻了,听一个朋友说 GitLab 挺好用、基于 Rails & Gitolite、社区活跃每月都有 release、安装起来比 Gitorious 要简单。下午没事装了一个试了一下,感觉还不错,有个重要功能是支持 LDAP 认证,可以很容易和我们的 LDAP 服务器连起来,这样我们不需要在 GitLab 里另外创建用户就可以使用 GitLab 了。GitLab 的官方安装文档非常详细,按照步骤就可以完成安装。

安装 GitLab

安装 curl 后下载 GitLab 的自动安装脚本 debian_ubuntu.sh 并安装:

$ sudo apt-get install curl
$ sudo curl https://raw.github.com/gitlabhq/gitlab-recipes/master/install/debian_ubuntu.sh | sh

上面的安装脚本只进行了完成了部分工作,接下来安装一些库和包、下载 gitlab 源代码、拷贝配置文件:

$ sudo gem install charlock_holmes --version '0.6.8'
$ sudo pip install pygments
$ sudo gem install bundler
$ cd /home/gitlab

# 下载 gitlab 源代码
$ sudo -H -u gitlab git clone -b stable https://github.com/gitlabhq/gitlabhq.git gitlab

$ cd gitlab

# 拷贝配置文件
$ sudo -u gitlab cp config/gitlab.yml.example config/gitlab.yml

安装数据库引擎(可选 SQLite, MySQL, Postgres)、根据对应的数据库引擎(这里选择 SQLite)选择拷贝相应的配置文件并按照对应的 gem,最后安装数据库表:

$ sudo apt-get install -y sqlite3 libsqlite3-dev

$ sudo -u gitlab cp config/database.yml.sqlite config/database.yml

$ sudo -u gitlab -H bundle install --without development test mysql postgres  --deployment

$ sudo -u gitlab bundle exec rake gitlab:app:setup RAILS_ENV=production

配置 gitlab hooks:

$ sudo cp ./lib/hooks/post-receive /home/git/.gitolite/hooks/common/post-receive
$ sudo chown git:git /home/git/.gitolite/hooks/common/post-receive

测试一下程序状态,是否该有的配置文件都有了:

$ sudo -u gitlab bundle exec rake gitlab:app:status RAILS_ENV=production

运行 gitlab 和 resque:

$ sudo -u gitlab bundle exec rails s -e production
$ sudo -u gitlab bundle exec rake environment resque:work QUEUE=* RAILS_ENV=production BACKGROUND=yes

下载 gitlab 启动脚本并设为系统自动启动:

$ sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/master/init.d/gitlab -P /etc/init.d/
$ sudo chmod +x /etc/init.d/gitlab

$ sudo update-rc.d gitlab defaults 21

现在可以通过 /etc/init.d/gitlab 来启动、关闭和重启 gitlab 服务了:

$ sudo /etc/init.d/gitlab restart

配置 LDAP 支持(可选)

如果需要配置 LDAP 认证登陆,修改 gitlab.yml 文件的 2. Auth settings 部分:

$ sudo vi config/gitlab.yml
#
# 2. Auth settings
# ==========================
ldap:
  enabled: true
  host: 'ldap.vpsee.com'
  base: 'dc=vpsee,dc=com'
  port: 636
  uid: 'uid'
  method: 'ssl' # plain
  bind_dn: 'cn=admin,dc=vpsee,dc=com'
  password: 'password'

安装和配置 Nginx + Unicorn

GitLab 可以用 Rails 自带的服务器独立运行,但是在生产环境我们选择用 Nginx + Unicorn:

# 配置 Unicorn
$ cd /home/gitlab/gitlab
$ sudo -u gitlab cp config/unicorn.rb.example config/unicorn.rb
$ sudo -u gitlab bundle exec unicorn_rails -c config/unicorn.rb -E production -D

# 安装 nginx
$ sudo apt-get install nginx

# 增加 gitlab 的 nginx 配置文件
$ sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/master/nginx/gitlab -P /etc/nginx/sites-available/
$ sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab

# 修改 **YOUR_SERVER_IP** 和 **YOUR_SERVER_FQDN**
$ sudo vi /etc/nginx/sites-enabled/gitlab

# 重启 nginx
$ sudo /etc/init.d/nginx restart

测试

打开浏览器访问这台机器域名或 IP 地址,默认用户名是 admin@local.host 密码是 5iveL!fe,登陆后可见如下界面:

gitlab

在 Ubuntu 12.04 上安装 Open vSwitch

云计算时代人类已经成功虚拟化了服务器硬件,现在大大小小的数据中心有无数的虚拟机跑在服务器硬件上,看上去很美好,但是任务还没有完成,这么多的虚拟机都依赖物理服务器(所在)的网络端口、网络和交换机(除了物理依赖还依赖这些硬件上的软件配置),这让底层变动成为一个大问题,比如我们想改变服务器 A 上的网络设置(192.168.2.0 改成 172.16.2.0)或者物理移动服务器 A 到另一数据中心,那么服务器 A 上运行的虚拟机怎么办呢?逐个改动配置是很麻烦的。有没有一种办法能把虚拟机所在的网络和物理服务器的网络隔开呢(虽然可以用 VLAN,但是还是不够)?这正是网络虚拟化正在做的,通过软件的方式形成交换机部件(vSwitch),让各个虚拟机和虚拟交换机连接起来而不用去理会真实物理机和物理交换机。比如,让 Host A 上的 VM02 和 Host B 上的虚拟机 VM10 连成一个网络而不用理会虚拟机(VM)所在服务器(Host)的网络设置。

网络虚拟化或者软件定义网络(Software Defined Network, SDN)的应用远不止这些,任何了解 SDN 的人都不会怀疑 SDN 的未来,这也是为啥 VMware 愿意花12亿美金买 Nicira(软件定义网络的先驱)。

要使用 SDN/OpenFlow 就必须有支持 OpenFlow 协议的物理(或软件)交换机,OpenvSwitch 就是这么一个支持 OpenFlow 协议的开源虚拟交换机。我们从安装虚拟交换机 Open vSwitch 开始来慢慢了解网络虚拟化吧。

安装必要软件包:

$ sudo -i
# apt-get install kvm libvirt-bin openvswitch-controller openvswitch-brcompat openvswitch-switch openvswitch-datapath-source

启动 Open vSwitch 服务,如果报错 FATAL: Error inserting brcompat_mod 模块错误则需要编译和加载 brcompat_mod 这个模块,这个模块是 openvswitch 为了兼容 linux bridge 而来的,有些程序使用 Linux bridge(比如 brctl),这些程序为了能在 openvswitch 下继续使用将需要这个 brcompat_mod 兼容模块,这个模块为那些慢慢迁移到 openvswitch 的程序提供了方便:

# service openvswitch-switch start
FATAL: Error inserting brcompat_mod (/lib/modules/3.2.0-30-generic/updates/dkms/brcompat_mod.ko): Invalid module format
 * Inserting brcompat module
Module has probably not been built for this kernel.
For instructions, read
/usr/share/doc/openvswitch-datapath-source/README.Debian
FATAL: Error inserting brcompat_mod (/lib/modules/3.2.0-30-generic/updates/dkms/brcompat_mod.ko): Invalid module format
 * Inserting brcompat module

# module-assistant auto-install openvswitch-datapath

编译模块后再次尝试启动服务:

# service openvswitch-switch restart
 * Killing ovs-brcompatd (1606)
 * Killing ovs-vswitchd (1603)
 * Killing ovsdb-server (1594)
 * Starting ovsdb-server
 * Configuring Open vSwitch system IDs
 * Starting ovs-vswitchd
 * Starting ovs-brcompatd
 * iptables already has a rule for gre, not explicitly enabling

 # service openvswitch-controller restart
 * Restarting ovs-controller ovs-controller                                              Sep 12 13:46:46|00001|stream_ssl|INFO|Trusting CA cert from /etc/openvswitch-controller/cacert.pem (/C=US/ST=CA/O=Open vSwitch/OU=switchca/CN=OVS switchca CA Certificate (2012 Sep 12 13:42:19)) (fingerprint 46:5b:14:1f:13:56:b0:b0:a7:4d:10:39:ee:68:18:d4:39:3c:4b:d0)
                                                                                  [ OK ]

编辑配置文件,取消注释并设置 BRCOMPAT 为 yes 以便启动后能使用 brcompat_mod 模块:

# vi /etc/default/openvswitch-switch
# This is a POSIX shell fragment                -*- sh -*-

# FORCE_COREFILES: If 'yes' then core files will be enabled.
# FORCE_COREFILES=yes

# BRCOMPAT: If 'yes' and the openvswitch-brcompat package is installed, then
# Linux bridge compatibility will be enabled.
BRCOMPAT=yes

重启一下系统,验证一下是否模块被自动加载:

# reboot

# lsmod | grep brcom
brcompat_mod           13512  0 
openvswitch_mod        83993  1 brcompat_mod

使用 openvswitch 增加网桥 br0 并把网络接口 eth0 加入 br0:

# ovs-vsctl add-br br0
# ovs-vsctl add-port br0 eth0

# ovs-vsctl show          
a23c503b-bfbe-4646-8738-a7f69e5d69a0
    Bridge "br0"
        Port "eth0"
            Interface "eth0"
        Port "br0"
            Interface "br0"
                type: internal
    ovs_version: "1.4.0+build0"

配置网桥 br0 和网络接口 eth0(和用 bridge-utils 工具配置的时候一样,不同的是这里用更先进的 openvswitch/brcompat_mod 替换了 bridge-utils):

# ifconfig eth0 0
# ifconfig br0 192.168.2.45 netmask 255.255.255.0
# route add default gw 192.168.1.1 br0

为了保存网络设置,最好把上面的配置写到 /etc/network/interfaces 里:

# vi /etc/network/interfaces
auto lo
iface lo inet loopback

auto br0
iface br0 inet static
address 192.168.2.45
netmask 255.255.255.0
gateway 192.168.2.1

auto eth0
iface eth0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down

安装 log.io 实时日志监控工具

日志是个好东西,对技术人员来说写日志能纪录成长,分享经验;对机器来说纪录日志能及时发现错误,为日后的排错提供信息。如果还在一台机器上用 tail -f 监听单个日志或者用 multitail 监听多个日志也太 out 了,我们需要一种工具能纪录上百台机器、不同类型的日志,并最好能汇集到一个界面里方便查看,最好还是实时的。log.io 就是这样一个实时日志监控工具,采用 node.js + socket.io 开发,使用浏览器访问,每秒可以处理超过5000条日志变动消息。有一点要指出来的是 log.io 只监视日志变动并不存储日志,不过这个没关系,我们知道日志存储在哪个机器上。

和其他的监控工具一样,log.io 也采用服务器-客户端的模式。log.io 由两部分组成:server 和 harvester, server 运行在机器 A(服务器)上监视和纪录其他机器发来的日志消息;log harvester 运行在机器 B(客户端)上用来监听和收集机器 B 上的日志改动,并将改动发送给机器 A,每个需要纪录日志的机器都需要一个 harvester.

在机器 A 和 B 上

因为 log.io 基于 node.js,所以在服务器和客户端都要安装 node.js,这里采用编译安装的办法,首先安装需要的依赖包:

$ sudo apt-get install g++ make git libssl-dev pkg-config

下载 node.js 源代码,编译并安装:

$ wget http://nodejs.org/dist/v0.8.14/node-v0.8.14.tar.gz
$ tar zxvf node-v0.8.14.tar.gz
$ cd node-v0.8.14/ 
$ ./configure
$ make
$ sudo make install

安装 NPM:

$ curl https://npmjs.org/install.sh | sudo sh 

安装 log.io(包含了 log server 和 log harvester)

$ sudo npm config set unsafe-perm true 
$ sudo npm install -g --prefix=/usr/local log.io

在机器 A 上启动 server

$ sudo log.io server start

在机器 B 上配置和启动 harvester

server 用来监听各个机器发来的日志消息,harvester 用来把本机的日志发给 server,所以 harvester 配置的时候需要指定 server 的主机地址(或域名)。如何告诉 harvester 哪些日志需要监控呢?log_file_paths 就是指定日志路径的地方。下面的配置是 harvester 把 auth.log 和 harvester.log 这两个日志的改动发送给 server:

$ sudo vi /etc/log.io/harvester.conf
exports.config = {
  // Log server host & port
  server: {
    host: 'log.vpsee.com', // 也可以用 IP 地址
    port: 8998,
  },

  // Watch the following log files, defined by label:path mappings
  log_file_paths: {
    logio_auth: '/var/log/auth.log',
    logio_harvester: '/var/log/log.io/harvester.log',
  },

  instance_name : 'log_node_1'
}

启动 harvester:

$ sudo log.io harvester start

测试

打开浏览器访问 log server 所在的机器 A,域名是 log.vpsee.com(也可以用 IP 地址),端口是 8998(注:为了隐私和保护内部信息,文章里面出现的 IP、域名、密码以及任何敏感信息都是处理过的,所以这里的 log.vpsee.com 是参考用的、是打不开的,囧,下面还有人留言问为啥打不开~):

log.io

如何在 KVM 虚拟机上运行 KVM

上次讨论了如何在 VMware ESXi 虚拟机上运行 KVM 问题,前不久有读者想 “在 kvm 上面创建个虚拟机安装 rackspace 的 openstack” 问到 “如何开启虚拟机上的 CPU VT 功能以便在 KVM 上运行 KVM”,又是一个嵌套应用虚拟机的问题:在 KVM 虚拟机上运行 KVM 虚拟机。以下步骤在 Ubuntu Server 12.04 LTS 64 bit 上测试通过。

首先检查 KVM host(母机)上是否打开了嵌套虚拟机功能(默认是开启的):

# modinfo kvm_intel | grep nested
parm:           nested:bool

# cat /sys/module/kvm_intel/parameters/nested
Y

如果上面的显示结果不是 Y 的话需要开启 nested:

# modprobe -r kvm-intel
# modprobe kvm-intel nested=1
# cat /sys/module/kvm_intel/parameters/nested
Y

然后在 KVM guest(虚拟机)的 xml 配置文件中加入 vmx 选项,并启动虚拟机(这里用的是 Ubuntu 官方发布的 Ubuntu KVM 镜像 ubuntu-12.04-server-cloudimg-amd64-disk1.img):

# vi nestedvm.xml
...
<cpu match='exact'/>
   <model>core2duo</model/>
   <feature policy='require' name='vmx'//>
</cpu/>
...

# virsh create nestedvm.xml

启动虚拟机后登陆并安装 KVM,执行 kvm-ok 和 modinfo 均出现错误:

# apt-get install ubuntu-virt-server

# kvm-ok
INFO: /dev/kvm does not exist
HINT:   sudo modprobe kvm_intel
INFO: Your CPU supports KVM extensions
KVM acceleration can be used

# modinfo kvm_intel
ERROR: modinfo: could not find module kvm_intel

这是因为我们使用的是 ubuntu-12.04-server-cloudimg-amd64-disk1.img 这个官方虚拟机镜像,这个镜像使用的是 linux 3.2.0-23-virtual 内核,缺少 KVM 模块(kvm-intel.ko),所以我们需要改为 generic 内核:

# uname -a
Linux test 3.2.0-23-virtual #36-Ubuntu SMP Tue Apr 10 22:29:03 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

# apt-get install linux-generic

重启后进入虚拟机执行 kvm-ok 和 modinfo 均成功:

# kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

# modinfo kvm_intel
filename:       /lib/modules/3.2.0-30-generic/kernel/arch/x86/kvm/kvm-intel.ko
license:        GPL
author:         Qumranet
srcversion:     3BAF54F96ECD4B02292CAA0
depends:        kvm
intree:         Y
vermagic:       3.2.0-30-generic SMP mod_unload modversions 
parm:           vpid:bool
parm:           flexpriority:bool
parm:           ept:bool
parm:           unrestricted_guest:bool
parm:           emulate_invalid_guest_state:bool
parm:           vmm_exclusive:bool
parm:           yield_on_hlt:bool
parm:           fasteoi:bool
parm:           nested:bool
parm:           ple_gap:int
parm:           ple_window:int

现在应该可以在这个虚拟机上创建另一个虚拟机了。