Linux狂热者可能会认为在微软Azure平台上运行Linux虚拟机就好像是在撒哈拉沙漠里找企鹅一样。在微软云上如何运行Linux?
为什么会有人想在微软服务器上运行Linux呢?对于有此爱好的人而言,这和喜欢攀登珠峰的人一样,不需要理由。对于商业用户而言,在微软框架中运行Linux虚拟机,是把开源技术与现有微软Azure服务结合起来的机会。而对于云市场而言,更多竞争对消费者来讲是个好消息。
云市场
以虚拟私有服务器(VPSes)形式存在的虚拟机已经推出市场有十年之久,供应商们利用的虚拟化技术大多都是Xen,Virtuozzo/OpenVZ 和KVM等。这些供应商将一个物理服务器分化成多个小型虚拟服务器。用户可以享有分配好的内存,磁盘和网络带宽,按月使用服务。
之后的供应商,如Amazon,Rackspace和微软,则通过一种更精细化的协定提供相同服务。用户可以以小时为单位使用虚拟机,按流量支付带宽费用,并且还可以使用更多高级特性,如私有网络,类似SAN的存储特性,卸载的数据库引擎等。
多样化的服务形式对终端用户而言是好消息。2002年,一台128MB的VPS每月收费100美金。2006年,一台RAM为512M的VPS每月收费为40美金。现在,这种级别的VPS每月收费不到5美金,或是每小时几美分而已。
微软进入市场
Amazon依靠弹性云计算(EC2)享受着早期的成功,其他厂商如Rackspace也开始很快效仿。微软最初选择了一种更复杂的云战略。Azure最初是作为PaaS产品创建起来的,目的是让程序员可以写出将不同的任务与Azure APIs对话的应用。理论上,这可以让程序员把注意力放在代码上,而不是担心底层的硬件架构。
在实践中,程序员被迫编写以Azure为核心的应用,其推广速度也很缓慢。许多企业使用Windows/Linux混合环境的后发现,把自助管理的服务器托管到Amazon和其他云环境中比花时间调试应用要方便得多。
2012年,微软增加了IaaS(虚拟机)产品,允许用户运行和管理他们直接控制的Windows和Linux虚拟机。
Azure 虚拟机仍然是“社区预览”版,微软称之为测试版。论坛为其提供的支持也有限。你可能注意到,该产品还需要磨合。尽管如此,在试用该服务两个月后,笔者发现Azure上运行Linux是稳定且易于使用的。
别有一番云滋味
基于云的服务以多种形式呈现给用户,主要取决于需要什么。
SaaS:供应商运行一个应用并向公开接口给用户。这仅仅是使用基于Web的应用程序。如,Saleforce.com,NetSuite和37 Signals 的Basecamp。
PaaS:供应商提供一个平台,用户可以使用这个平台创建应用。用户编写并提供代码,代码在硬件和软件服务上运行。如微软Azure最初的产品,甲骨文Fusion或谷歌的App Engine。
IaaS:供应商提供虚拟机和其他架构组件,用户可以按需进行配置。如Amazon EC2,Rackspace Cloud,Google Compute和微软Azure。虚拟私有服务器也是使用不同收费模式的IaaS产品。#p#
比较Azure与Amazon EC2
Azure的主要竞争对手是Amazon EC2,不难看出,在Amazon取得成功后,微软也开始确立自己IaaS产品的模式。
和EC2一样,Azure也是按时收费,并且费率也是相同的。社区预览版比通用版稍微便宜一点。按时收费的虚拟机的真实价格取决于双方约定的服务使用时长。例如,Amazon提供现成实例和预付费实例[v1] , 而微软会为长期合同打折。在存储和带宽的价格上两家也是很也类似。通常,在Azure和EC2上运行一台虚拟机的成本差不多,而这或许正是微软计划的。
EC2能提供微软尚不具备的特性。例如,存储虚拟机磁盘(弹性块存储,EBS),可以以快照形式在S3存储。但是,许多Amazon服务在Azure中都可以找到类似的服务。例如,Amazon的SimpleDB与Azure的Tables类似。两个供应商都提供了复杂的网络特性,缓存,监控和内容分发网络选项。不论是哪个环境,虚拟机都可以放到美洲,欧洲或亚洲,使用全球CDN节点。
Azure的价值理念并非“我们的云服务更好”,而是“使用Azure平台的同时,你能享有和EC2一样的功能”。对于部署了较多微软产品的公司,Azure的早期使用者或是想要在Azure平台上开发应用的公司而言,新的IaaS产品是将具有吸引力。
运行Azure
使用微软Azure需要一个免费的Windows Live账号和一张信用卡,用来开充值账号。如果你的员工已经加入了微软MSDN项目,你可能已经具备每月享用一定量的免费使用权。账户创建成功后,就可以进入管理页面,开始添加服务。
Azure控制面板非常简单。或许漂亮的控件并不是云服务的卖点,但Azure界面的交互体验令人惊奇。创建服务后,屏幕下方会出现“正在操作中”的提示信息。性能图表和历史都会显示出来,面板更像是一个桌面应用,而不像一个“点击-提交-等待”的Web界面。
图一 Azure管理界面易于使用,设计感强。
图二 Azure界面显示了任务消息和状态。
Azure 提供了若干Linux版本:CentOS 6.2,Ubuntu 12.04,SUSE Linux 企业服务器和OpenSUSE 12.1。Azure可以让Linux用户上传自己的影像,但是这要求使用微软Hyper-V服务器产品,而一般Linux用户不会有这种产品。
图三:创建一台虚拟机的时候,有五个不同的Linux选项
在这篇文章中,笔者创建了一个名为penguin1的CentOS 6.2虚拟机。系统在cloudapp.net域里面为虚拟机自动创建了一个域名,如果你有自己的域,也可以自定义名称。
图四 在Azure上安装penguin 1
虚拟机不会直接暴露到互联网,而是被赋予一个10.x的IP地址。在Azure面板上面,用户可以配置端点开放防火墙端口,并对其进行映射。例如,创建一个Web服务器,有必要创建一个端口80(或许是443)的端点,这个端点可以映射到虚拟机所需的任何端口。
图五 添加一个网络端点以创建一个Web服务器
网络防火墙是一个很好的安全特性。默认情况下,只有端点22 (SSH)会被配置。如果你打算改变默认的SSH端口,就需要改变Azure管理界面的端点。你还可以在管理界面对其进行改变,然后将其映射到虚拟机上的端点22。
创建“From Gallery”可以给你很多创建选择。提供名称和尺寸等基本信息后,就可以立即开始创建,耗时大约十分钟。#p#
Root密码是什么?
其他VPS系统的用户或许想知道他们需要在哪里指定Root密码。答案很简单:你无需指定。你指定的账户都可以获取sudo权限进行root:
[andrew@penguin1 ~]$ sudo su -
[sudo] password for andrew:
[root@penguin1 ~]#
从这点说,如果你想要密码就可以设置root密码。
存储
Linux虚拟机有三类存储。
第一类是拥有一个30G的root量。存储在本地比较冗余,视情况,也可以选择地理冗余,不过成本要增加33%。遗憾的是,创建自己的模板时,如果你喜欢不一样的文件系统布局或是想减少每个月的存储费用,是无法对这30G的配置进行修改的。Root容积数据重启依然会存在,而且在Azure存储中是永久BLOB。如果你删除一个虚拟机,是可以保留其root容积的,然后,再在另一个系统上安装或是将其作为新虚拟机的root容积。
你还可以尽你所能地创建更多容积。这就像Azure存储中的BLOB一样,具有持久性。它们的功能和SAN Volume相仿,可以让你创建并将其附着到一个虚拟机上,然后减小,再附着到另一个上面。遗憾的是,没有办法对这些容积的大小进行调整,这是让人比较失望的地方。虽然你可以创建更大的容积,然后转移数据,删除原来的空间,但这显然不是一种可扩展的方法。
当你创建一个新磁盘的时候,可以把磁盘附着到虚拟机上,它就像一个新的SCSI设备,你可以安装文件系统并且分区。在Azure界面创建了新的20G磁盘后,penguin1的dmesg显示如下信息:
scsi 4:0:0:0: Direct-Access Msft Virtual Disk 1.0 PQ: 0 ANSI: 4
sd 4:0:0:0: Attached scsi generic sg3 type 0
sd 4:0:0:0: [sdc] 41943040 512-byte logical blocks: (21.4 GB/20.0 GiB)
sd 4:0:0:0: [sdc] Write Protect is off
sd 4:0:0:0: [sdc] Mode Sense: 0f 00 10 00
sd 4:0:0:0: [sdc] Write cache: enabled, read cache: enabled,
supports DPO and FUA
sdc: unknown partition table
sd 4:0:0:0: [sdc] Attached SCSI disk
然后可以分区,安装文件系统:
[root@penguin1 ~]# fdisk /dev/sdc
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610):
Using default value 2610
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@penguin1 ~]# mkfs.ext4 /dev/sdc1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 5241198 blocks
262059 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736,
1605632, 2654208, 4096000
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@penguin1 ~]# mkdir /data
[root@penguin1 ~]# mount /dev/sdc1 /data
[root@penguin1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
28G 2.0G 24G 8% /
tmpfs 872M 0 872M 0% /dev/shm
/dev/sda1 485M 86M 374M 19% /boot
/dev/sdb1 69G 180M 66G 1% /mnt/resource
/dev/sdc1 20G 172M 19G 1% /data
如你所愿,如果你原本想在Azure门户上删除这个磁盘,操作会失败,除非你首先运行unmount命令。
最终,虚拟机会出现大量本地存储。这种存储并不存在于Azure云中,而是通过真实的物理节点提供。如果Azure架构中有硬件错误或其他错误,而你的虚拟机又要转移到新的主机上,那么此处保留的数据会丢失。这个文件系统原本是用于状态信息,临时抓取的数据和其他临时文件。在Linux映像上,它以/mnt/资源的形式显示出来。小型虚拟机可接收70G的文件系统,而且其大小会随虚拟机的扩展而增长,Extra Large 虚拟机可达800G的容量。
笔者经历过Azure上的硬件错误。当时,笔者的虚拟机关闭后,转移到了一个新的硬件主机上,并在新服务器上启动运行。故障之前定义的服务都正常出现,所有的网络端点都被顺利转移,重新对磁盘进行mount,虚拟机运行正常。不过,之前/mnt/资源处的抓取数据丢失了,文件系统也是空的。#p#
不足之处
CentOS映像可以使用一些改进。OpenLogic提供的有些东西还真是让笔者抓耳挠腮:
1. 虽然配置了交换分区,但却没出现在/etc/fstab中。创建了交换分区但不能用的话,那它就没什么意义,这是一个疏忽的地方。
2. 有些默认服务会毫无理由地运行。例如,为什么需要CUPS?笔者并非想在云中打印。只是RAID冗余是通过Azure存储层提供,不需要软件RAID,那么为什么启动时要运行mdmonitor?
3. 笔者会周期性地接收到来自fprintd的崩溃报告。移除这个服务是比较直接的做法,为什么要创建CentOS映像在一个虚拟的云环境中支持指纹生物验证呢?
4. iptables由一条单独的规则启用,目的是接受bootp,尽管INPUT输入链存在默认的ACCEPT策略。
希望这些事情会随着Linux入住Azure而得到纠正。
性能
通常,I/O性能很赞。但看过ioping后,笔者发现此前创建的/data磁盘平均延迟为6ms,虽然/mnt/资源延时为0.4ms。Root磁盘是18ms,但是正如微软在其文档中解释的,它优化了I/O性能:
操作系统磁盘和数据磁盘有一个主机缓冲设定,这个设定可以在一些情况下启用改进的性能。但是,这些设定会影响其他环境下的性能,具体要看使用的什么应用。默认状态下,用于数据磁盘读写操作的主机缓冲[v2] 是关闭的,而用于操作系统磁盘读写操作的主机缓冲是开启的。在大多数情况下,这些应该都不会出现什么问题。推荐用户把数据密集型操作放到与OS磁盘分离开的数据磁盘上。
图六: Azure门户性能一览图
运算的性能取决于你选择的虚拟机大小。在我们的示例中,微软使用的是AMD设备,由/proc/cpuinfo显示:
processor : 1
vendor_id : AuthenticAMD
cpu family : 16
model : 8
model name : AMD Opteron(tm) Processor 4171 HE
stepping : 1
cpu MHz : 2094.702
cache size : 512 KB
小结
可能有些人会说,在Azure上运行Linux的好处在于这样可以给Amazon和谷歌带来竞争。而对于终端用户来说,其性能和价格差不多,企业管理者或许会有能力将Linux和Windows以及Azure专用的部署结合起来使用,增加自己的优势。虽然在Azure云中运行Linux好似一只小企鹅企图在炙热的Mordor地带安营扎寨,但是多一个有竞争力的选手对大家来说是好消息。