SmartOS折腾笔记
前段时间入手了一台Gen8,准备用做家里文件、媒体服务器。看了EXSi、FreeNAS、NAS4Free、Proxmox等方案后,觉得还是SmartOS最好。它支持ZFS,能够更好管理数据、保证数据有效性;此外,它支持kvm虚拟化技术,能够虚拟常见的操作系统,满足各种软件需求;它还支持类似Docker的Zones容器技术,比kvm更为高效。
安装配置
SmartOS可以装在一个U盘里面。这样的好处很多,比如增加了系统的安全性和稳定性,可用磁盘空间也大了,系统升级也很简单——更新一下U盘就行了。我用了一个16G的U盘,按照官方的教程下载镜像、创建可启动U盘,然后从U盘启动就可以了。
SmartOS使用了zones技术,U盘启动后进入一个全局的zone(Global Zone),负责管理其它的zone。一个zone就是一个虚拟化的实例,SmartOS创建的每个虚拟机都是跑在一个单独的zone里面。
SmartOS使用了ZFS文件系统,所有虚拟机的zone都是存放在一个叫zones
的zpool中。第一次启动时,除了让你配置网络,还会要求你创建zones
。我有4块3T的硬盘,1块256G的SSD,在启动时选择4块硬盘组成一个raidz来作为zones池。在我的机器上,4块硬盘分别是c1t0d0, c1t1d0, c1t2d0和c1t3d0。
为了取得更好的性能,用format将SSD(c1t4d0)分为32G和224G两个分区,分别作为ZIL(log)和L2ARC(cache):
# zpool add zones log c1t4d0s0
# zpool add zones cache c1t4d0s1
配置完之后磁盘的信息如下:
# zpool status
pool: zones
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zones ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
c1t0d0 ONLINE 0 0 0
c1t1d0 ONLINE 0 0 0
c1t2d0 ONLINE 0 0 0
c1t3d0 ONLINE 0 0 0
logs
c1t4d0s0 ONLINE 0 0 0
cache
c1t4d0s1 ONLINE 0 0 0
errors: No known data errors
如果上述步骤搞错了,可以参照官方的步骤重装。很不幸的是,我安装官方的步骤选择Grub第2项(noinstall)几乎每次都会死机,如果你遇到和我一样的情况,也可以在启动时出现Grub界面的时候,在第1项按e
,然后在最后加上destroy_zpools=true
的选项,这样启动后就会删除所有的zpool,然后就可以重新配置了。(注意:磁盘上已经有数据的慎用!)
创建虚拟机
U盘启动的SmartOS是一个只读系统,你所能做的事情非常有限。不过SmartOS就是为虚拟化而生的,它支持zones和kvm两种虚拟化技术,前者类似容器技术,具有很好的性能,但支持的OS较少;后者性能不如前者,但能支持大部分常见的OS。
imgadm
和vmadm
是管理虚拟机的两个常用命令,前者主要用来管理镜像,而后者用来管理虚拟机。你可以通过imgadm avail
来查看已有的虚拟机镜像,用vmadm create
来根据镜像创建虚拟机。
此外,我希望数据能够单独存储,即使虚拟机坏掉或者删除数据仍然存在,因此专门建立一个数据存储的dataset:
# zfs create zones/datastore
kvm虚拟机
kvm是从linux移植过来的技术,能支持大部分常见的操作系统,在创建kvm虚拟机之前首先要创建或下载相应的镜像。Joyent已经提供了很多常见的镜像,如果我想装一个debian 8,可以首先进行搜索:
# imgadm avail | grep debian-8
ca291f66-048c-11e5-98b3-c3f2a972a4cc debian-8 20150527 linux 2015-05-27T16:24:03Z
2f56d126-20d0-11e5-9e5b-5f3ef6688aba debian-8 20150702 linux 2015-07-02T15:37:02Z
然后可以选择需要的镜像进行下载:
# imgadm import 2f56d126-20d0-11e5-9e5b-5f3ef6688aba
创建虚拟机时,首先需要创建一个JSON格式的虚拟机描述文件,下面是debian 8的描述文件,主要是网络设置以及镜像设置:
{
"brand": "kvm",
"alias": "debian",
"hostname": "debian",
"resolvers": [
"192.168.1.1",
"114.114.114.114",
"8.8.8.8",
"8.8.4.4"
],
"ram": "2048",
"vcpus": "1",
"nics": [
{
"nic_tag": "admin",
"ip": "192.168.1.102",
"netmask": "255.255.255.0",
"gateway": "192.168.1.1",
"model": "virtio",
"primary": true
}
],
"disks": [
{
"image_uuid": "2f56d126-20d0-11e5-9e5b-5f3ef6688aba",
"boot": true,
"model": "virtio"
}
]
}
具体的可用选项可以查看vmadm
的文档以及SmartOS的wiki。
将文件存为debian8.json
,然后就可以通过vmadm
创建镜像:
# vmadm create -f debian8.json
Successfully created VM b94d3a92-4a3b-4fae-baca-e53c726be924
可以通过vmadm list
来查看当前虚拟机的状态。创建好的虚拟机可以通过VNC登录,首先要查看虚拟机的VNC信息,然后通过ip和端口进行登录:
# vmadm info b94d3a92-4a3b-4fae-baca-e53c726be924 vnc
{
"vnc": {
"host": "192.168.1.100",
"port": 57869,
"display": 51969
}
}
我们希望在虚拟机中访问datastore
,并将重要的数据存在其中,这样即使虚拟机挂掉也不影响数据的访问。可以通过NFS来进行文件恭喜。首先将datastore
共享:
# zfs set sharenfs='[email protected]/24,root=192.168.1.102' zones/datastore
在debian里面安装nfs相关的包并将datastore挂载过去:
# apt-get update && apt-get install nfs-common
# mkdir -p /mnt/datastore && mount -o rw,async,hard,intr 192.168.1.100:/zones/datastore /mnt/datastore
在debian虚拟机中就可以将常用数据放在/mnt/datastore中了。
zone
Zone是一种更高效的虚拟化技术,但是它适用的OS也比较有限。比如你如果想玩玩SmartOS,那用Global Zone的系统可能不是一个很好的选择,因为它是只读的,而且缺少包管理等工具。我们可以用zone虚拟一个SmartOS,你可以用imgadm
搜索并下载base64
镜像,并通过下面的JSON文件来创建虚拟机:
{
"brand": "joyent",
"image_uuid": "62f148f8-6e84-11e4-82c5-efca60348b9f",
"alias": "smartos",
"hostname": "smartos",
"max_physical_memory": 2048,
"quota": 20,
"resolvers": ["192.168.1.1", "114.114.114.114", "8.8.8.8", "8.8.4.4"],
"nics": [
{
"nic_tag": "admin",
"ip": "192.168.1.101",
"netmask": "255.255.255.0",
"gateway": "192.168.1.1"
}
]
}
然后,用vmadm
来创建虚拟机。和kvm不同的是,这种方式创建的虚拟机不能用VNC登录,但是可以用zlogin来登录:
# vmadm create -f smartos.json
Successfully created VM 0b3c7b3b-9f19-4d26-ab22-a8b10a9add25
# zlogin 0b3c7b3b-9f19-4d26-ab22-a8b10a9add25
[Connected to zone '0b3c7b3b-9f19-4d26-ab22-a8b10a9add25' pts/2]
__ . .
_| |_ | .-. . . .-. :--. |-
|_ _| ;| || |(.-' | | |
|__| `--' `-' `;-| `-' ' ' `-'
/ ; Instance (base64 14.3.0)
`-' http://wiki.joyent.com/jpc2/Base+Instance
Zone不只是支持SmartOS,它还支持LX Branded Zones,允许你在zone里面直接运行linux。imgadm avail
中列出的镜像中以lx-
开头的支持LX Branded Zones。此外,使用这种方法创建虚拟机时,不必用NFS来共享数据,可以直接通过filesystems
字段来指定目录映射。下面是一个lx-ubuntu-14.04
的例子:
{
"brand": "lx",
"alias": "ubuntu1404",
"kernel_version": "3.13.0",
"max_physical_memory": 2048,
"image_uuid": "a21a64a0-0809-11e5-a64f-ff80e8e8086f",
"resolvers": ["192.168.1.1","114.114.114.114","8.8.8.8","8.8.4.4"],
"nics": [
{
"nic_tag": "admin",
"ip": "192.168.1.103",
"netmask": "255.255.255.0",
"gateway": "192.168.1.1",
"primary": true
}
],
"filesystems": [
{
"type": "lofs",
"source": "zones/datastore",
"target": "/mnt/datastore"
}
]
}
可以看到我们直接将Global Zone的zones/datastore
映射到虚拟机的/mnt/datastore
。然后就可以通过zlogin进行登录,设置好ssh后也可以通过ssh远程登录。
SmartOS确实是一个很适合NAS的系统,还有更多的特性有待发掘。