SmartOS折腾笔记

前段时间入手了一台Gen8,准备用做家里文件、媒体服务器。看了EXSiFreeNASNAS4FreeProxmox等方案后,觉得还是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。

imgadmvmadm是管理虚拟机的两个常用命令,前者主要用来管理镜像,而后者用来管理虚拟机。你可以通过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='rw=@192.168.1.0/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的系统,还有更多的特性有待发掘。