Xen 半虚拟化安装 NetBSD 虚拟机(domU)

很久以前我们开始提供 NetBSD 的 VPS,期间陆续有朋友写信询问怎么制作 NetBSD/FreeBSD 的半虚拟化(PV)Xen 镜像,今天以安装最新的 NetBSD 6.0.1 版本为例演示一下,随便说一下制作 FreeBSD PV 虚拟机方法是类似的。Xen 全虚拟化方式(HVM)安装 NetBSD 虚拟机就不说了,和安装其他操作系统 Linux, Windows 差不多,毕竟全虚拟化不用考虑内核,安装要简单得多。考虑到性能,半虚拟化依然是 Xen 的强项,所以我们的 VPS 都是采用半虚拟化的,不过随着硬件的发展和 CPU 厂商的大力支持,半虚拟化的优势正渐渐消失。

这里演示的是安装 NetBSD domU,如果想了解安装 NetBSD dom0 的话看这里:在 NetBSD 上安装和配置 Xen.

准备

新建一个目录,然后下载一些东西,netbsd-INSTALL_XEN3_DOMU.gz 是安装 NetBSD 时候用的内核,netbsd-XEN3_DOMU.gz 是运行 NetBSD 用的内核,不要弄混了;NetBSD-6.0.1-amd64.iso 是我们需要的安装光盘。

$ mkdir netbsd
$ cd netbsd

$ wget http://ftp.netbsd.org/pub/NetBSD/NetBSD-6.0.1/iso/NetBSD-6.0.1-amd64.iso

$ wget http://ftp.netbsd.org/pub/NetBSD/NetBSD-6.0.1/amd64/binary/kernel/netbsd-INSTALL_XEN3_DOMU.gz
$ wget http://ftp.netbsd.org/pub/NetBSD/NetBSD-6.0.1/amd64/binary/kernel/netbsd-XEN3_DOMU.gz

安装

首先制作一个大小为 5GB 的硬盘:

$ dd if=/dev/zero of=netbsd.disk bs=1024k count=1 seek=5000

然后新建一个 Xen domU 配置文件,并输入以下内容,:

$ vi netbsd
name = "netbsd"
memory = "256"
kernel = "/home/vpsee/netbsd/netbsd-INSTALL_XEN3_DOMU.gz"
disk = [ 'file:/home/vpsee/netbsd/netbsd.disk,xvda,w', 'file:/home/vpsee/netbsd/NetBSD-6.0.1-amd64.iso,ioemu:hdc:cdrom,r' ]
vif = [ 'bridge=xenbr0' ]
vcpus = "1"

使用 root 帐号启动这个名为 netbsd 的虚拟机开始 NetBSD 安装过程,这一步需要注意的是在选择安装介质的时候选择从 CD-ROM 安装并使用设备名 xbd0a (device [xbd1a]: xbd0a):

$ su

# xm create netbsd -c

NetBSD 安装界面如下,顺着屏幕提示安装即可,没有难度:

google apps directory sync

安装完毕后关闭这个虚拟机,修改 netbsd 的 Xen 配置文件,然后用新的配置文件启动虚拟机:

# xm destroy netbsd

# vi netbsd
name = "netbsd"
memory = "256"
kernel = "/home/vpsee/netbsd/netbsd-XEN3_DOMU.gz"
disk = [ 'file:/home/vpsee/netbsd/netbsd.disk,xvda,w' ]
vif = [ 'bridge=xenbr0' ]
vcpus = "1"

# xm create netbsd
Using config file "./netbsd".
Started domain netbsd

虚拟机启动后用 xm list 确认一下,然后就可以从控制台登陆 NetBSD 虚拟机了:

# xm list
Name                                      ID Mem(MiB) VCPUs State   Time(s)
Domain-0                                   0     1024     4 r----- 279689.0
netbsd                                   242      256     1 -b----      0.6

# xm console netbsd

剩下的配置 NetBSD 环境、IP 地址等这里就不用赘述了~

在 NetBSD 上安装和配置 Xen

到目前为止,VPSee 已经陆续介绍了:在 CentOS 上安装和配置 Xen在 Ubuntu 上安装和配置 Xen在 Debian 上安装和配置 Xen在 OpenSolaris 上安装和配置 Xen,加上这篇 “在 NetBSD 上安装和配置 Xen” 就完整了,这是我们目前所有应用在生产环境的 Xen 系统。有人可能会问为什么要用这么多种系统?管理起来不是更复杂吗?其实没想像的那么复杂,我们实验室应用的虚拟机生产环境和我们销售的 VPS 不同,因为可以不考虑成本,所以采用了昂贵的存储设备,虚拟机都是存储在专门的 iSCSI 存储系统上,Xen 服务器只不过是一个 node 用来连接和启动存储网络上的虚拟机镜像,所以使用什么系统做 node 不是很重要,事实上 NetBSD 是这几个系统里面最容易配置和安装的系统,没有 trouble shooting,没有 work around,安装即成功,非常的赞!以下操作在 NetBSD 5.0.2 上完成。

安装 Xen

在 NetBSD 上使用 pkg_add 来安装软件包,相当于 CentOS/Fedora 的 yum 和 Ubuntu/Debian 的 apt-get,如果在公司或者学校使用代理上网的话需要先配置代理服务器:

# vi .kshrc
...
PKG_PATH=http://ftp.us.netbsd.org/pub/pkgsrc/packages/NetBSD/ \
amd64/5.0.2_2010Q3/All

export HTTP_PROXY=http://username:password@squid.vpsee.com:3128/
export FTP_PROXY=http://username:password@squid.vpsee.com:3128/

安装 xen hypervisor 和 xen tools:

# pkg_add -v xenkernel33
# pkg_add -v python26
# pkg_add -v xentools33
# pkg_add -v e2fsprogs

在上面的步骤安装 xentools33 的是后屏幕会打印提示需要从 /usr/pkg/share/examples/rc.d/ 拷贝一些配置文件到 /etc/rc.d 以便开机启动后自动运行:

# cd /etc/rc.d
# cp /usr/pkg/share/examples/rc.d/xendomains .
# cp /usr/pkg/share/examples/rc.d/xend .
# cp /usr/pkg/share/examples/rc.d/xenbackendd .

# vi /etc/rc.conf
...
xend=yes
xenbackendd=yes
xendomains=yes

确定 xend 需要的 xen 设备存在(没有的话创建一个):

# cd /dev && sh MAKEDEV xen

把上面安装的 Xen Hypervisor (xen.gz) 拷贝到根目录下 /:

# cp /usr/pkg/xen3-kernel/xen.gz /

下载和安装 Xen dom0 kernel:

# cd /
# wget http://ftp.us.netbsd.org/pub/NetBSD/NetBSD-5.0.2/amd64/ \
binary/kernel/netbsd-XEN3_DOM0.gz
# gunzip netbsd-XEN3_DOM0.gz

配置 NetBSD 开机引导,比 Linux 的 Grub 和 LILO 都简单多了:

# vi /boot.cfg
...
menu=NetBSD/XEN:load /netbsd-XEN3_DOM0;multiboot /xen.gz dom0_mem=64M
installboot -v -o timeout=5 /dev/rwd0a /usr/mdec/bootxx_ffsv1

配置 bridge:

# vi /etc/ifconfig.bridge0
create
!brconfig $int add re0 up

重启系统,选择 NetBSD/Xen 内核登陆,登陆后用 xm 检查 xen 是否正常运行:

# shutdown -r now

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0    64     1     r-----     18.5

安装虚拟机

先做个连接,方便以后使用:

# ln -sf /usr/pkg/etc/xen/ xen

在 NetBSD 上没有 xen-create-image, virt-install 等工具,而且没有 lvm,文件系统又不同,所以要创建 Linux 虚拟机(domU)比较麻烦,这里 VPSee 直接从另外一台 Linux Xen 服务器上拷贝一个虚拟机镜像(模版)过来运行,只需要编辑 debian.cfg 配置文件就可以了:

# vi /etc/xen/debian.cfg
bootloader = "/usr/pkg/bin/pygrub"
memory = 128
name = "debian"
vif = [ 'bridge=bridge0' ]
disk = ['file:/home/vpsee/debian.img,sda1,w']
root = "/dev/sda1"
extra = "fastboot"
extra = "xencons=tty1"

启动和查看 debian 虚拟机:

# xm create debian.cfg

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0    64     1     r-----   4764.1
debian                                      10   128     1     ------      6.6

在 NetBSD 上安装和配置 OpenVPN

关于 OpenVPN 在 Linux 上的安装配置都写烂了,搜索一下到处都有,但是 NetBSD 上的资料并不多,VPSee 在这里简单记录一下在 NetBSD 上配置 OpenVPN 的过程,步骤和流程都是和 Linux 一样的,只不过具体操作的细节不同,相信我们的客户和熟悉 Linux 上 OpenVPN 的朋友能很快用我们的 64MB NetBSD VPS 架设一台经济实惠的个人用 OpenVPN 服务器出来。以下步骤在我们的 NetBSD VPS 上执行通过:

安装 OpenVPN Server

源码安装 OpenVPN 服务器(如果自己 /usr/ 下没有 pkgsrc 这个目录的话参考这篇文章:下载 pkgsrc 去下载解压一个):

# cd /usr/pkgsrc/net/openvpn
# make install clean clean-depends

拷贝 openvpn 启动配置文件到 NetBSD 的启动配置目录下,然后编辑 /etc/rc.conf 以便系统启动的时候自动运行 NetBSD:

# cp  /usr/pkg/share/examples/rc.d/openvpn /etc/rc.d

# vi /etc/rc.conf 
openvpn=YES

拷贝创建认证需要的一些脚本到 openvpn 的配置目录:

# cp /usr/pkg/share/openvpn/easy-rsa/* /usr/pkg/etc/openvpn/

给 vars 文件加写权限,然后做一些必要的编辑和定制:

# chmod +w /usr/pkg/etc/openvpn/vars
# vi /usr/pkg/etc/openvpn/vars

因为 vars 脚本需要 bash 才能运行,所以要先在 NetBSD 上安装 bash:

# cd /usr/pkgsrc/shells/bash2
# make install clean clean-depends

安装完 bash 后切入到 bash shell,然后运行:

# bash
bash-2.05b# source /usr/pkg/etc/openvpn/vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/pkg/etc/openvpn/keys

现在开始创建 certificate authority (CA):

# cd /usr/pkg/etc/openvpn/
# ./build-ca

给服务器创建 certificates 和 private key:

# ./build-key-server server

给客户端创建 keys:

# ./build-key client

创建 Diffie Hellman 密钥,Diffie–Hellman 是一种安全协议,可让双方在没有任何对方预先信息的条件下通过不安全隧道创建一个密钥,并且这个密钥可用在后续的通讯中来加密通讯内容。OpenVPN 必须要 Diffie Hellman 密钥:

# ./build-dh

拷贝 OpenVPN Server 的样例配置文件到 openvpn 的配置文件目录(如果客户端不幸需要通过 http 代理访问 openvpn server 的话,可以在 server.conf 做一些设置,具体看:用代理连接 OpenVPN 的问题):

# cp /usr/pkg/share/examples/openvpn/config/server.conf /usr/pkg/etc/openvpn/

启动 OpenVPN 服务器,首次启动出错是因为没有找到 dh1024.pem 文件,把 dh1024.pem 等文件从 /usr/pkg/etc/openvpn/keys 里拷到上级目录后再次启动就成功了:

# /etc/rc.d/openvpn start
Starting openvpn.
Aug  4 20:20:19  openvpn[1266]: Cannot open dh1024.pem for DH parameters: error:02001002:system library:fopen:No such file or directory: error:2006D080:BIO routines:BIO_new_file:no such file

# mv /usr/pkg/etc/openvpn/keys/* /usr/pkg/etc/openvpn/

# /etc/rc.d/openvpn start
Starting openvpn.
add net 10.8.0.0: gateway 10.8.0.2

查看 OpenVPN 服务器正常启动后是否生成 tun 设备:

# ifconfig -a
tun0: flags=8051 mtu 1500
        inet 10.8.0.1 -> 10.8.0.2 netmask 0xffffffff
        inet6 fe80::216:3eff:fe55:4f16%tun0 ->  prefixlen 64 scopeid 0x3

在内核打开 IP 转发功能,并把 IP 转发写到启动文件:

# sysctl -w net.inet.ip.forwarding=1

# vi /etc/sysctl.conf
net.inet.ip.forwarding=1

安装 OpenVPN Client

OpenVPN 客户端软件有多种、有支持 Linux, MacOS X 和 Windows 的、有图形界面的、也有命令行的,根据自己系统和喜好挑一个客户端,在 Mac 上 VPSee 推荐开源的 Tunnelblick,不同客户端的配置都差不多,主要是把服务器上的 ca.crt, client.crt, .csr, .key 等文件拷到客户端,然后调整一下客户端的配置以连接上服务器。

连接测试

连接后就会在客户端的日志看到类似这样的成功连接信息:

tunnelblick

NetBSD 上安装和配置 Nginx+PHP+FastCGI+MySQL

NetBSD 支持 n 种硬件架构,是地球上支持最多体系的系统;OpenBSD 来自 NetBSD,自称是地球上最安全的系统;FreeBSD 和 NetBSD 一样来自原始的 4.4 BSD-lite,但是 FreeBSD 现在主要支持 i386,在 PC 体系上 FreeBSD 比 NetBSD/OpenBSD 好很多,性能也最好。这三种 BSD 各有特点,和不同的 Linux 发行版一样每个系统都有很多粉丝,当然使用 FreeBSD 的人最多。VPSee 的一台老掉牙的 IBM ThinkPad 就在跑 FreeBSD,嗯,现在这台机器还在工作呢。虽然 NetBSD 的性能在 i386 上没有 FreeBSD 那么好,但是它的稳定性是非常的赞,Benchmarking BSD and Linux 这篇测试的作者说:

Please note that NetBSD was the only BSD that never crashed or panicked on me, so it gets favourable treatment for that.

我们上周五发布了 NetBSD VPS,我们鼓励用户自己动手安装 Nginx+PHP+FastCGI+MySQL 和熟悉 NetBSD 环境,这篇文章在我们的 NetBSD VPS 上搭建:

下载 pkgsrc

The NetBSD Packages Collection (pkgsrc) 是 NetBSD 下的基于源码的软件包管理系统,不同于 Debian/Ubuntu 上的 apt-get,pkgsrc 是基于源代码的方式管理软件包的,有点像 Gentoo 里面的 emerge 系统。pkgsrc 有三个分支,HEAD、pkgsrc-yyyyQqq 和 pkgsrc-wip,前两个是 pkgsrc 项目组的正式分支。我们在这里使用 pkgsrc-yyyyQqq(季度分支),下载和解压 pkgsrc 并放到合适的目录:

# ftp ftp://ftp.NetBSD.org/pub/pkgsrc/pkgsrc-2010Q2/pkgsrc-2010Q2.tar.bz2
# tar jxvf pkgsrc-2010Q2.tar.bz2
# mv pkgsrc /usr/

安装 Nginx+PHP+FastCGI+MySQL

编译和安装 PHP,注意编译 PHP 的时候需要加上 fastcgi 说明,这样 PHP 编译才会把 FastCGI 部分编译进去:

# vi /etc/mk.conf
PKG_OPTIONS.php = fastcgi

# cd /usr/pkgsrc/lang/php5
# make install clean clean-depends

配置 PHP:

# /usr/pkg/etc/php.ini
cgi.fix_pathinfo=1

编译和安装 FastCGI:

# cd /usr/pkgsrc/www/spawn-fcgi/
# make install clean clean-depends

编译和安装 Nginx:

# cd /usr/pkgsrc/www/nginx
# make install clean clean-depends

配置 Nginx:

# cp /usr/pkg/share/examples/rc.d/nginx /etc/rc.d/
# vi /usr/pkg/etc/nginx/nginx.conf
location / {
            root   share/examples/nginx/html;
            index  index.html index.htm index.php;
        }

...

location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/pkg/share/examples/nginx/html$f
astcgi_script_name;
            include        /usr/pkg/etc/nginx/fastcgi_params;
        }

把 Nginx 加到启动文件以便启动系统时自动启动:

# vi /etc/rc.conf 
nginx=YES

编译和安装 MySQL:

# cd /usr/pkgsrc/databases/php-mysql
# make install clean clean-depends

# cd /usr/pkgsrc/databases/mysql5-server
# make install clean clean-depends

配置 PHP 以便加载 MySQL 动态连接库:

# vi /usr/pkg/etc/php.ini
extension=mysql.so

把 MySQL 加到启动文件以便启动系统时自动启动:

# cp /usr/pkg/share/examples/rc.d/mysqld /etc/rc.d/

# vi /etc/rc.conf 
mysqld=YES

启动 FastCGI:

# /usr/pkg/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -f /usr/pkg/libexec/cgi-bin/php
spawn-fcgi: child spawned successfully: PID: 18554

启动 Nginx:

# /etc/rc.d/nginx start
Starting nginx.

启动 MySQL 和设置 root 密码:

# /etc/rc.d/mysqld start

# /usr/pkg/bin/mysqladmin -u root -p password 'new-password'

测试

写一个 phpinfo() 文件放在 nginx 目录下,然后打开浏览器测试是否能正确访问 php 文件:

# vi /usr/pkg/share/examples/nginx/html/index.php


http://www.vpsee.com/index.php

NetBSD,欢迎你

经过一个多星期的测试,NetBSD 正式成为我们支持的操作系统之一,到目前为止我们的 VPS 已经支持包括 CentOS, Debian, Ubuntu, Gentoo, Arch Linux, Fedora, OpenSUSE, Slackware 在内的8种最流行的 Linux 发行版和1种 BSD 发行版。不熟悉 BSD 历史的朋友可以看看错综复杂的 Unix 家谱。对于每一种操作系统和我们制作的 Xen domU 模版,我们都做了严格的测试。前段时间我们在1台双 CPU 四核的 8GB SUN Fire V20z 服务器上测试了32个 128/256MB FreeBSD VPS 的混合,每个 VPS 上跑不同的应用和压力工具,测试结果不理想,有多个 FreeBSD VPS 无响应,但没有造成服务器主机的 crash. 目前理论和实验都显示 FreeBSD/Xen 组合还不够稳定,离应用到生产环境还有一段距离。

作为能在 Xen PV 上稳定运行的唯一 BSD 系统,NetBSD 表现的非常优秀,喜欢 Gentoo, Arch 风格的 Linux 玩家应该也会对纯 Unix 血统、干净的 BSD 系统感兴趣。VPSee 已经把 vpsee.com 的备份站点移植到了我们拉斯维加斯机房的的 NetBSD VPS 上,默认安装完 NetBSD + Nginx + MySQL + PHP(NNMP)并启动后,在没有任何优化的情况下内存消耗仅为 42MB:

netbsd vps

NetBSD 的使用方式、各个命令和命令的参数用法都和 Linux 有很大差异,比如 NetBSD 上面的工具都是 BSD 的那一套,Linux 上的很多工具都是 GNU 那套,虽然做的事情是一样的,做事方式差不多,但是这些细小的差别让人刚开始使用的时候觉得不方便。比如在 BSD 下看内存使用情况没有 free 工具:

$ sysctl -a | grep -i memory
kern.memory_protection = 1
proc.curproc.rlimit.memoryuse.soft = 121909248
proc.curproc.rlimit.memoryuse.hard = 121909248
proc.curproc.rlimit.memorylocked.soft = 40636416
proc.curproc.rlimit.memorylocked.hard = 121909248
proc.curproc.rlimit.vmemoryuse.soft = unlimited
proc.curproc.rlimit.vmemoryuse.hard = unlimited

NetBSD 上的 top 和 Linux 上的 top 在参数的解释上也有所不同。所以,我们仅推荐此系统给非常有经验并肯自己钻研的 Unix/Linux 用户。我们提供的 NetBSD 版本是 5.0.1,NetBSD 相关资料比较少,为了给大家提供方便和更快入手,我们还制作了一个 NNMP 版本,NNMP 版本是一个已经装好 Nginx/MySQL/PHP 工具包的 NetBSD 版本,用户直接把博客/网站放上去就可以用了。学习是一个实践的过程,我们还是推荐新手使用最小化的版本,然后通过看书、查资料、自己动手熟悉 NetBSD 环境。