婉兮清扬

案上诗书杯中酒之快意人生

OpenNebula 3.8 -- 本地存储

发表时间:2013-01-06 08:46:27 评论:3

在前些时间发布的一篇教程中,我们介绍了如何在Ubuntu 12.04 Server上安装和配置OpenNebula 3.8。在本教程中,我们将讲述如何在OpenNebula中如何将虚拟机的磁盘映像存储在计算节点上。在进入本教程之前,我们假定您已经学习过如下内容:

Ubuntu 12.04 Server安装配置OpenNebula 3.8
OpenNebula 3.8中文语言包
使用VirtualBox创建KVM磁盘镜像文件
VM性能的快速测试方法

在前面的教程中,我们使用了基于NFS的共享文件系统将同控制节点上的一个目录共享给所有的计算节点。在缺省的情况下,OpenNebula将虚拟机的磁盘映像存储在共享文件系统上。这种配置能够提供虚拟机在线迁移的功能,但是虚拟机的文件IO性能会比较差。为了获得较好的文件IO性能,我们可以将选择将虚拟机的磁盘映像存储在计算节点的本地磁盘上(但是这样做会失去虚拟机在线迁移的功能)。为了达到这个目的,我们需要修改两个数据仓库的属性,一个是名为system的数据仓库,另一个是存储虚拟机源磁盘映像的数据仓库。

在OpenNebula中,名为system的数据仓库的ID为0,存放的是处于运行状态的虚拟机的磁盘映像。在缺省的情况下,这个数据仓库使用的是tm_shared驱动来传输磁盘映像,我们需要将其修改为tm_ssh驱动。我们可以用如下命令修改其属性:

onedatastore update 0

可以看到该数据仓库的属性如下:

DS_MAD="-"
SYSTEM="YES"
TM_MAD="shared"

将TM_MAD这一行修改为如下形式,存盘退出即可。

TM_MAD="ssh"

除了名为system的数据仓库之外,我们还需要修改用来创建虚拟机的特定磁盘映像所在的数据仓库的属性。在前一个教程中,我们通过SunStone管理界面从应用市场中下载了一个名为ttylinux-kvm的磁盘映像。在缺省的情况下,这个名为ttylinux-kvm的磁盘映像被注册到名为default的数据仓库中,该数据仓库的ID为1。

我们可以用如下命令修改其属性:

onedatastore update 1

可以看到该数据仓库的属性如下:

DS_MAD="fs"
TM_MAD="shared"

将TM_MAD这一行修改为如下形式,存盘退出即可。

TM_MAD="ssh"

经过这样的修改之后,当我们创建虚拟机时,OpenNebula就会通过SSH将虚拟机的磁盘映像从名为default的数据仓库拷贝到计算节点的$DATASTORE_LOCATION/0/$VM_ID目录下。需要注意的是,$DATASTORE_LOCATION的值是在管理节点的etc/oned.conf文件中设定的,$VM_ID的值是OpenNebula在创建虚拟机时动态顺序生成的。为了简单起见,建议初学者按照如下步骤操作:

在管理节点上,编辑etc/oned.conf文件,将$DATASTORE_LOCATION的值设定为/srv/cloud/one/datastores,例如:

#DATASTORE_LOCATION = /var/lib/one/datastores
DATASTORE_LOCATION = /srv/cloud/one/datastores

存盘之后,通过运行one stop和one start命令重新启动OpenNebula服务。

在计算节点上,确认已经创建了oneadmin用户(属于cloud群组)并且其HOME目录已经设置为本地磁盘上的/srv/cloud/one(在计算节点上不需要挂载NFS文件系统),然后创建与system数据仓库相对应的目录:

su -l oneadmin
mkdir -p ~/datastores/0

此外,还需要确认管理节点上的oneadmin用户能够以无密码的方式通过SSH登陆到计算节点。详细的配置方法可以参考上一个教程。经过如上配置之后,OpenNebula就会将运行状态的虚拟机磁盘映像存放在计算节点上的本地磁盘上。

 

CY12-Q4 Community Analysis — OpenStack vs OpenNebula vs Eucalyptus vs CloudStack

发表时间:2013-01-04 10:20:10 评论:15

01

This article is an update version of my previous article CY12-Q3 Community Analysis — OpenStack vs OpenNebula vs Eucalyptus vs CloudStack. Readers who are intested in further discussions please contact me via email at the above-mentioned address.

A Chinese version of this article is published at the same time, which can be found at CY12-Q4 OpenStack, OpenNebula, Eucalyptus, CloudStack社区活跃度比较.

It should be noted that this community analysis project was initiated in CY11-Q4, and this particular report is the 5th quarterly report being published since. Although the author became an employee of Eucalyptus Systems Inc in October 2012, the opinion presented in this report belongs strictly to the author rather than the employer of the author. It should also be noted that the employer of the author completely agreed that the author could continue this project with an independent perspective.

02

The objective of this article is to compare the OpenStack, OpenNebula, Eucalytpus and CloudStack user and developer communities, base on the communications between community members in the form of mailing lists or pubic forum discussions. The data being discussed include the total number of topics (threads), messages (posts), and participants (unique email addresses or registered members). To obtain the above-mentioned data, a Java program was written to retrieve all the forum posts and mailing list messages into a MySQL database for further processing. The analysis results were presented in the form of graphs generated by LibreOffice.

It should be noted that the CloudStack project moved completely from the original http://www.cloudstack.org/ site to http://incubator.apache.org/cloudstack/, and stop using the forums originally hosted on http://www.cloudstack.org/. In this report, we neglected the data published on the forums during CY12-Q4, which would produce some impact on the analysis results.

Also, when the CY12-Q2 report was published, some people questioned the inclusion of the incubator-cloudstack-dev mailing list. This particular mailing list contains a lot of messages that are automatically generated by JIRA. In CY12-Q3, we set up a filter to reject all messages with identifier “[jira]” in the subject.

03

04

 

Figure 1 and 2 represent the monthly number of topics (threads) and posts (messages). It can be seen that

(1) the volume of OpenStack and CloudStack related discussions is much higher than that of Eucalyptus and OpenNebula; and

(2) the Eucalyptus and OpenNebula clubs are exhibiting similar behaviors, with only minor differences.

05

Generally speaking, the number of replies to a specific topic represents the attention being received, and the depth of discussion for that particular topic. When the number of master posts (the original post that started a particular topic) is more than the number of replies, it is safe to conclude that the participation of the forum or mailing list is very low. Therefore, the ratio between “the number of  posts” and “the number of topics” represents the participation rate of an online community. In this study we call this ratio the Participatin Ratio.

In the past the OpenStack project had a much higher participation ratio than the others. However, during the past 6 months, the participation ratio of CloudStack and Eucalyptus are growing steadily, while the participation ratio of OpenStack is decreasing gradually. Currently CloudStack and Eucalyptus have the highest participation ratios, which are close to 4. OpenStack and OpenNebula have relatively low participation ratios, which are close to 3.

06

Figure 4 shows the number of monthly participants of the four projects being discussed. It can be seen that the active participants of CloudStack and OpenStack are much higher than OpenNebula and Eucalyptus. However, during the past 3 months, the number of participants for both CloudStack and OpenStack have decreased slightly.

It should be noted that although the number of active participants of CloudStack is somewhat less than OpenStack, but the volume of discussion (in terms of monthly number of threads and messages) of the two projects are on the same level. This indicates that the active members in the CloudStack club are talking more than those in the OpenStack club (on average).

07

Accumulated Community Population refers to the total number of users and developers who have participated in forum or mailing list discussions. (This number does not include those who have registered into discussion forums or mailing lists but have never participated in any open discussions.) These are people who have tested or used a specific product for a while, but not necessary currently an active user.

Figure 5 shows the accumulated community populations of the four projects being discussed. It can be seen that OpenStack and Eucalyptus have far more accumulated population than CloudStack and OpenNebula. Also, in our CY12-Q3 report we predicted that the OpenStack population will exceed the Eucalyptus population in CY12-Q4. Actually, it only took OpenStack a month to accomplish that!

In our CY12-Q3 report, we raised the problem of possible duplicated population counting due to the membership overlap in forums and mailing lists, and carried some measurements to eliminate duplications. In our CY12-Q4 report, further measurements were taken to de-duplication. It is safe to say that some degree of duplication still exists, but does not have a significant impact on the analysis results.

08

Figure 6 shows the monthly population growth of the four projects being discussed. During the past 3 months, the populations of OpenStack and CloudStack are growing at the same pace. (The CloudStack data exhibit an abnormal point at 2012-10 because we excluded the forum data from this analysis.)

The populations of Eucalyptus and OpenNebula are growing at relatively slow paces, as compared to that of CloudStack and OpenStack.

09

Figure 7 is a combination of Figure 4 and Figure 6. The solid lines represent the monthly participants, while the dash lines represent the monthly new members.

For OpenStack and OpenNebula, around 30% of their monthly participants are new members.  For CloudStack and Eucalyptus, around 50% of their monthly participants are new members. This indicates OpenStack and OpenNebula communities are more “sticky” than CloudStack and Eucalyptus communities.

For each of the projects being discussed, the monthly population growth is somwhat “synchronous” with its monthly participants. That’s to say, the populatoin growth of a community is somewhat related to the “activeness” of the community. This also suggests that both the population growth and the “activeness” of a community might be event-driven. A new software release, a technical conference, or a marketing event, might be the cause of the growth in population and “activeness” of the respective community.

10

Figure 8 shows the total community population, active participants of the past quarter, and active participants of the past month, of the four projects being discussed. It can be seen that

(1) OpenStack has the largest total population, followed by Eucalyptus, CloudStack, and OpenNebula;

(2) OpenStack has the largest active population during the past quarter, followed by CloudStack, Eucalyptus, and OpenNebula;

(3) OpenStack has the largest active population during the past month, followed by CloudStack, Eucalyptus, and OpenNebula.

11

In our CY12-Q3 report, we invented the concept of "Community Activeness Index". This magic number should be the combination of the following parameters:

(1) monthly messages, which represents the volume of the discussions;

(2) participation ratio, which represents the average number of answers to a question;

(3) active population of the past quarter, which represents the possibility to get help from community in the long term; and

(4) active population of the past month, which represents the possibility to get help from the community in the short term.

In this analysis, we choose the average values of these parameters as the reference data set, and compare the corresponding parameters of each community with the reference data set. Then we call the sum of the relative values of a community the “community activeness index” of the community. Now we can say the project with the highest “community activeness index” is THE most active project in this area.

As can be seen from Figure 9, OpenStack is currently THE most active project (with obvious advantage), followed by CloudStack, Eucalyptus, and OpenNebula.

The above-mentioned concept of “community activeness index” is still very primitive, with a lot of space to optimize. However, it is an attempt to replace the old-fashion “I think”, “I believe” and “I guess” practices with quantative analysis. In our future community analysis, we will continue to use this concept to provide a quarterly ranking for OpenStack, OpenNebula, Eucalyptus, and CloudStack. Improvements to the algorithm (such as adding/removing parameters or changing the weight of different parameters) will be make when necessary.

From an end-user’s perspective, it is good to see the competition heating up because that means more choices with better quality. Cloud computing is still an evolving market that is highly inmature, and we expect more competition to come in the future.

For your convienience, a PDF version of this presentation can be downloaded from here. Please kindly keep the author information if you want to redistribute the content.

Apart from my quarterly report on community analysis, Balman A. Baset from IBM is also doing some work to compare the different IaaS projects. In the recent ACM Symposium on Cloud Computing (SoCC-2012) he published a tutorial on Open Source Cloud Technologies, which is a good reference for all cloud computing practitioners.

CY12-Q4 OpenStack, OpenNebula,Eucalyptus,CloudStack社区活跃度比较

发表时间:2013-01-04 08:54:40 评论:4

01

本文是对《CY12-Q3 OpenStack, OpenNebula,Eucalyptus,CloudStack社区活跃度比较》一文的补充和更新。对本文内容感兴趣的读者,可以通过电子邮件或者新浪微博(@qyjohn_)与我联系。

本文同时发布了一个英文版本,可以参见CY12-Q4 Community Analysis — OpenStack vs OpenNebula vs Eucalyptus vs CloudStack这个帖子。

需要说明的是,这个社区活跃度比较项目起源于CY11-Q4,此篇报告是到目前为止已经发布的第五个季度性的报告。尽管作者于2012年10月成为Eucalyptus公司的员工,但是本文中所表达之观点完全是作者本人的观点,而非作者所在公司的观点。还需要指出的是,作者所在的公司完全同意作者以独立的视角继续此项目。

02

本文的目的是通过论坛和邮件列表的原始数据对OpenStack、OpenNebula、Eucalyptus和CloudStack项目的社区活跃度进 行分析和比较。主要的原始数据是自2009年来这四个项目的官方论坛和邮件列表每个月所产生的讨论主题数、帖子数、以及参与讨论的总人数(邮件地址或者用 户账号)。为了获取这些数据,我写了一个Java程 序自动地从这四个项目的网站下载了所有的论坛和邮件列表信息,并且从这些信息中分析提取出我所需要的数据。程序提取的数据被导入MySQL数据库中以便进 行统计分析,统计分析的结果通过LibreOffice生成分析图表。

需要说明的是,CloudStack项目在CY12-Q4期间将域名从原先的http://www.cloudstack.org/全面切换到http://incubator.apache.org/cloudstack/,并停用了基于http://www.cloudstack.org/站点的论坛。在本报告中,我们忽略了在CY12-Q4期间发布在这些论坛中的数据,对分析结果有一定的影响。

此外,我们发布CY12-Q2分析报告之后,有些读者指出来自incubator-cloudstack-dev邮件列表的数据可能有些问题。这个邮件列表里包含了一些由JIRA自动生成的邮件内容。在CY12-Q3的分析中,我们设置了一个过滤器,自动地排除了所有标题中含有”[jira]“标识符的信息。

03

04

 

图1 和图2分别是如上所述四个项目每个月所产生的讨论主题数和帖子数。可以看出:

(1) 与OpenStack和CloudStack相关的讨论数量远大于与Eucalyptus和OpenNebula相关的讨论数量;

(2) 在过去三个月中,与Eucalyptus和OpenNebula相关的讨论数量在同等水平上,只有非常细微的差别。

05

通常来讲,一个讨论主题得到的回复数越多,表明该主题的讨论越深入。一个论坛或者邮件列表如果只有主帖而没有回复,说明这个社区的参与程度很低。因此,平 均意义上的“讨论帖子数/讨论主题数”则反映了一个社区的参与程度,这里我们暂且称之为参与度(Participation Ratio)。

长期以来,OpenStack项目的参与度远高于其他三个项目的参与度。但是在过去六个月中,CloudStack与Eucalyptus项目的参与度正在稳步增长,OpenStack项目的参与度正在逐步下降。目前CloudStack和Eucalyptus项目的参与度最高,接近于4;OpenStack与OpenNebula项目的参与度次之,接近于3。

06

图4 所示为这四个项目每个月参与论坛或者邮件列表讨论的总人数。可以看出,CloudStack与OpenStack的活跃用户数量要远大于OpenNebula和Eucalyptus。在过去六个月中,OpenStack项目的活跃用户数量基本上是持续攀升的,但是CloudStack项目的活跃用户数量有一定程度的下降。

值得一提的是,虽然CloudStack的活跃用户数量稍微小于OpenStack,这两个项目的主题和帖子数量是基本相当的。换句话说,CloudStack的用户在社区中比OpenStack的用户更加活跃。

07

累计社区人口(简称社区人口)指的是曾经通过论坛或者邮件列表参与过讨论的用户和开发者总数。(不包括在论坛或者邮件列表中注册但是从未公开参与讨论的社 区成员。)这些人或多或少地使用过相关产品,但是并不代表他们目前还是活跃用户。

图5 所示为这四个项目的社区人口增长趋势。可以看出,OpenStack与Eucalyptus项目的社区人口遥遥领先,CloudStack与OpenNebula项目的社区人口相对较低。在CY12-Q4报告中,我们预测过OpenStack项目的社区人口很将在CY12-Q4超过Eucalyptus项目。事实上,OpenStack项目仅仅花了一个月时间就实现了这个目标。

在CY12-Q3报告中,我们提出了社区人口数据可能存在重复计数的问题。在CY12-Q4报告中,我们采取了进一步的措施以消除重复计数。可以认为,尽管重复计数的现象依然存在,但是已经降低到对分析结果不产生明显的影响的程度。

08

图6 所示为这四个项目每个月新增加的社区人口数量。在过去三个月中,CloudStack与OpenStack的社区人口增长速度基本相当(CloudStack项目在2012年10月这个时间点上所展现的异常数据是因为这个分析中没有包括已经被停用的论坛数据。)。

与CloudStack和OpenStack向比较,Eucalyptus和OpenNebula的社区人口增长较为缓慢。

09

图7 是图4 与图6的重新组合。其中,实线部分表示的是每个月参与论坛或者邮件列表讨论的人数,虚线部分表示的是每个月新加入论坛或者邮件列表的人数。

OpenStack与OpenNebula项目的新增人口占当月活跃用户的30%左右,CloudStack与Eucalyptus项目大概是50%。如 果不考虑社区人口的规模的话,可以认为OpenStack与OpenNebula项目的粘性大于CloudStack与Eucalyptus项目。

对于任何一个项目,社区人口增长速度与当月活跃用户数量基本上是同步的。也就是说,社区人口增长速度与社区活跃程度之间存在某种程度的正相关。这也意味着社区人口增长以及社区活跃程度可能是事件驱动的。一个新版本的发布,一次技术会议,或者是一场市场活动,都可能是促进社区人口增长和提高社区活跃程度的原因。

10

图8 所示分别是本文所述四个项目的社区人口,过去一个季度的活跃用户数量,以及过去一个月的活跃用户数量。可以看出:

(1) OpenStack的社区人口最多,然后是Eucalyptus、CloudStack、OpenNebula;

(2) 在过去一个季度中,OpenStack的活跃人口最多,然后是CloudStack、Eucalyptus、OpenNebula;

(3) 在过去一个月份中,OpenStack的活跃人口最多,然后是CloudStack、Eucalyptus、OpenNebula。

11

在CY12-Q3分析中,我们首次提出了“社区活跃度指数”这样一个参数。这个参数是如下几个参数的某种组合:

(1) 当月帖子总数,代表相关讨论的规模;

(2) 当月参与度,代表每个问题获得的回帖数量;

(3) 当季活跃用户,代表从社区获得帮助的可能性(长期);

(4) 当月活跃用户,代表从社区获得帮助的可能性(短期)。

在这个分析中,我们选择如上各个社区的平均值作为参考数据,并将每个社区的数据与参考数据进行比较。我们将每个社区各个参数与平均值的比值之和称为“社区活跃度指数”。可以认为,社区活跃度指数最高的项目,是最活跃的项目。

从图9 中可以看出,目前OpenStack项目的“社区活跃度指数”最高(以明显的优势领先),然后是CloudStack、Eucalyptus、 OpenNebula。

如上所述“社区活跃度指数”的概念还非常原始,还有很大的优化空间。它有点在于用量化分析的方法取代了传统的感性分析,例如“我认为”、“我相信”、“我猜测”等等。在未来的报告中,我们将基于这个概念每个季度发布一次OpenStack、OpenNebula、 Eucalyptus、CloudStack项目的“社区活跃度指数”排名。当然,我们也会在必要的时候对相关算法进行调整,例如增加或者删除某些参数,或者是调整某些参数的权重。

对于最终用户来说,厂商之间的竞争意味着更多的选择和更好的功能。云计算市场正在发展当中,远远还没有达到成熟的程度。可以预见,未来这个领域的竞争还会更加激烈。

与本文相关的PDF版本幻灯片可以从这里下载。如果您需要重新分发本文内容,敬请您保留相关作者信息。

除了本人所进行的社区活跃度分析之外,IBM公司的Balman A. Baset也进行了一些对不同开源IaaS项目进行比较的工作。他于2012年10月在ACM Symposium on Cloud Computing (SoCC-2012)上发表了题为Open Source Cloud Technologies的教程,值得各位做云计算的同仁学习和参考。

VM性能的快速测试方法

发表时间:2012-12-24 22:16:55 评论:13

前段时间陆续发布了一些对公有云服务性能评测的数据。经常有同行问我怎么样去做这些性能评测。其实这些性能评测都很简单,任何一个具备Linux基础知识的工程师都可以完成。我们通常使用UnixBench来评估虚拟机CPU性能,mbw来评估内存性能,iozone来评估文件IO性能,iperf来评估网络性能,pgbench来评估数据库性能。在这里我将我自己做性能测试的过程整理一下,供各位同行参考。

(0)安装必要的软件

假定VM的操作系统是Ubuntu,可以按照如下步骤安装必要的软件:

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:pitti/postgresql
sudo apt-get update
apt-get install libx11-dev libgl1-mesa-dev libxext-dev perl perl-modules make gcc nfs-common postgresql-9.1 postgresql-contrib-9.1 mbw iperf

cd ~
wget http://www.iozone.org/src/current/iozone3_414.tar
wget http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
tar xvf iozone3_414.tar
tar zxvf UnixBench5.1.3.tgz

cd ~/iozone3_414/src/current
make

cd ~/UnixBench
make

(1)CPU性能测试

我们使用UnixBench来进行CPU性能测试。UnixBench是一套具有悠久历史的性能测试工具,其测试结果反映的是一台主机的综合性能。从理论上来说UnixBench测试结果与被测试主机的CPU、内存、存储、操作系统都有直接的关系。但是根据我们的观察,对于现代的计算机系统来说,UnixBench测试结果受CPU 处理能力的影响更大一些。因此,在这里我们用UnixBench测试结果来代表虚拟机的vCPU 处理能力。每个UnixBench测试结果包括两个数据,一个是单线程测试结果,另一个是多线程测试结果(虚拟机上有几颗虚拟CPU,就有几个并发的测试线程)。

cd ~/UnixBench

./Run

下面是一个可供参考的测试结果。在这个测试中使用了两台物理机,每台物理机各配置一颗Intel Core i3 540 @ 3.07 GHz (双核四线程),16 GB内存(DDR3 @ 1333 MHz),一块Seagate ST2000DL003-9VT1硬盘(SATA,2TB,5900RPM),运行Ubuntu 10.04 AMD64 Server操作系统,使用的文件系统为ext4,使用的Hypervisor为KVM(qemu-kvm-0.12.3)。我们分别测试了宿主机、磁盘映像以文件格式(RAW格式,没有启用virtio)存储在本地磁盘上的虚拟机、磁盘映像以文件格式(RAW格式,没有启用virtio)存储在NFS上的虚拟机的CPU性能。虚拟机的配置为2 颗vCPU(占用两个物理线程,也就是一个物理核心)和4 GB内存,运行Ubuntu 12.04 AMD64 Server操作系统。在这个测试中没有对操作系统、文件系统、NFS、KVM等等进行任何性能调优。





















测试场景 宿主机 本地磁盘上的虚拟机 NFS服务上的虚拟机
单线程 1360 1365 1374
多线程 3250 2529 2536

从如上测试结果可以看出,在没有进行任何性能调优的情况下,在单线程CPU性能方面,宿主机 >> 本地磁盘上的虚拟机 >> NFS服务上的虚拟机;在多线程CPU性能方面,宿主机 >> 本地磁盘上的虚拟机 = NFS服务上的虚拟机。需要注意的是,在多线程测试结果方面,宿主机所占的优势完全是由于宿主机比虚拟机多占用了两个物理线程,也就是一个物理核心。可以认为,在如上所述测试中,物理机和虚拟机的CPU性能基本上是一致的,虚拟化基本上没有导致CPU性能损失。

(2)文件IO性能测试

我们使用iozone来进行文件IO性能测试。iozone性能测试结果表示的是文件IO的吞吐量(KBps),但是通过吞吐量可以估算出IOPS。在如下命令中,我们评估的是以256K为数据块大小对文件进行写、重写、读、重读、随机读、随机写性能测试,在测试过程当中使用/io.tmp作为临时测试文件,该测试文件的大小是4 GB。需要注意的是,命令中所指定的测试文件是带路径的,因此我们可以测试同一虚拟机上不同文件系统的性能。例如我们通过NFS将某一网络共享文件系统挂载到虚拟机的/mnt目录,那么我们可以将该测试文件的路径设定为/mnt/io.tmp。

cd ~/iozone3_414/src/current

./iozone -Mcew -i0 -i1 -i2 -s4g -r256k -f /io.tmp

下面是一个可供参考的测试结果。在这个测试中使用了两台物理机,每台物理机各配置一颗Intel Core i3 540 @ 3.07 GHz (双核四线程),16 GB内存(DDR3 @ 1333 MHz),一块Seagate ST2000DL003-9VT1硬盘(SATA,2TB,5900RPM),运行Ubuntu 10.04 AMD64 Server操作系统,使用的文件系统为ext4,使用的Hypervisor为KVM(qemu-kvm-0.12.3)。我们分别测试了宿主机、NFS、磁盘映像以文件格式(RAW格式,没有启用virtio)存储在本地磁盘上的虚拟机、磁盘映像以文件格式(RAW格式,没有启用virtio)存储在NFS上的虚拟机、以及从虚拟机内部挂载宿主机NFS服务(虚拟网卡启用了virtio)的磁盘IO性能。虚拟机的配置为2 颗vCPU(占用两个物理线程,也就是一个物理核心)和4 GB内存,运行Ubuntu 12.04 AMD64 Server操作系统。在这个测试中没有对操作系统、文件系统、NFS、KVM等等进行任何性能调优。

























































测试场景 write re-write random write read re-read random read
宿主机 114398 115766 67757 4621231 4897959 4899447
NFS 51482 51253 35867 114914 4332976 476465
本地磁盘上的虚拟机 12447 22257 19664 542379 887648 468469
NFS服务上的虚拟机 7414 4433 4975 97238 581717 209665
虚拟机中的NFS 32650 31772 22076 84982 111296 88263

从如上测试结果可以看出,在如上所述特定测试场景中,在文件IO性能方面,宿主机 > NFS > 虚拟机中的NFS > 本地磁盘上的虚拟机 >NFS服务上的虚拟机。值得注意的是,即使是从虚拟机中挂载NFS服务,其文件IO性能也远远超过本地磁盘上的虚拟机。

[特别说明]需要注意的是,当我们说文件(或者磁盘)IO性能的时候,我们指的通常是应用程序(例如iozone)进行文件读写操作时所看到的IO性能。这个性能通常是与系统相关的,包括了多级缓存(磁盘自身的缓存机制、操作系统的缓存机制)的影响,而不仅仅是磁盘本身。利用iozone进行文件IO性能测试时,测试结果与主机的内存大小、测试数据块的大小、测试文件的大小都有很大的关系。如果要全面地描述一个特定系统(CPU、内存、硬盘)的文件IO性能,往往需要对测试数据块的大小和测试文件的大小进行调整,进行一系列类似的测试并对测试结果进行全面分析。本文所提供的仅仅是一个快速测试方法,所提供的测试参数并没有针对任何特定系统进行优化,仅仅是为了说明iozone这个工具的使用方法。如上所述之测试数据,仅仅在如上所述之测试场景下是有效的,并不足以定性地说明任何虚拟化场景下宿主机和虚拟机的文件IO性能差异。建议读者在掌握了iozone这个工具的使用方法的基础上,对被测试对象进行更加全面的测试。(感谢saphires网友的修改建议。)

(3)内存性能测试

我们使用mbw来测试虚拟机的内存性能。mbw通常用来评估用户层应用程序进行内存拷贝操作所能够达到的带宽(MBps)。

mbw 128

下面是一个可供参考的测试结果。在这个测试中使用了两台物理机,每台物理机各配置一颗Intel Core i3 540 @ 3.07 GHz (双核四线程),16 GB内存(DDR3 @ 1333 MHz),一块Seagate ST2000DL003-9VT1硬盘(SATA,2TB,5900RPM),运行Ubuntu 10.04 AMD64 Server操作系统,使用的文件系统为ext4,使用的Hypervisor为KVM(qemu-kvm-0.12.3),虚拟机运行Ubuntu 12.04 AMD64 Server操作系统。我们分别测试了宿主机、磁盘映像以文件格式(RAW格式,没有启用virtio)存储在本地磁盘上的虚拟机、磁盘映像以文件格式(RAW格式,没有启用virtio)存储在NFS上的虚拟机的内存性能。虚拟机的配置为2 颗vCPU(占用两个物理线程,也就是一个物理核心)和4 GB内存。在这个测试中没有对操作系统、文件系统、NFS、KVM等等进行任何性能调优。



























测试场景 宿主机 本地磁盘上的虚拟机 NFS服务上的虚拟机
MEMCPY 3245 3332 3261
DUMP 3165 3317 3255
MEMBLOCK 9605 9091 8739

从如上测试结果可以看出,在没有进行任何性能调优的情况下,宿主机、本地磁盘上的虚拟机、NFS服务上的虚拟机在内存性能方面基本上是一致的,虚拟化基本上没有导致内存性能损失。

(4)网络带宽测试

我们使用iperf来测试虚拟机之间的网络带宽(Mbps)。测试方法是在一台虚拟机上运行iperf服务端,另外一台虚拟机上运行iperf客户端。假设运行服务端的虚拟机的IP地址是192.168.1.1,运行客户端的虚拟机的IP地址是192.168.1.2。

在服务端执行如下命令:

iperf -s

在客户端执行如下命令:

iperf -c 192.168.1.1

测试完成后,在客户端会显示两台虚拟机之间的网络带宽。

下面是一个可供参考的测试结果。在这个测试中使用了两台物理机,每台物理机各配置一颗Intel Core i3 540 @ 3.07 GHz (双核四线程),16 GB内存(DDR3 @ 1333 MHz),一块Seagate ST2000DL003-9VT1硬盘(SATA,2TB,5900RPM),运行Ubuntu 10.04 AMD64 Server操作系统,使用的文件系统为ext4,使用的Hypervisor为KVM(qemu-kvm-0.12.3)。我们分别测试了宿主机之间、宿主机与虚拟机之间、虚拟机与虚拟机之间的内网带宽。虚拟机的配置为2 颗vCPU(占用两个物理线程,也就是一个物理核心)和4 GB内存。虚拟机的配置为2 颗vCPU(占用两个物理线程,也就是一个物理核心)和4 GB内存,运行Ubuntu 12.04 AMD64 Server操作系统。在这个测试中没有对操作系统、文件系统、NFS、KVM等等进行任何性能调优,但是虚拟机的网卡启用了virtio。















测试场景 宿主机之间 宿主机与虚拟机之间 虚拟机与虚拟机之间
内网带宽 930 920 850(虚拟机运行在不同的宿主机上)

从如上测试结果可以看出,宿主机之间的内网带宽接近内网交换机的极限。在启用了virtio的情况下,宿主机与虚拟机之间内网带宽有小幅度的性能损失,基本上不会影响数据传输能力;虚拟机与虚拟机之间的内网带宽有接近15%的损失,对数据传输能力影响也不是很大。

(5)数据库性能测试

postgresql是一个著名的开源数据库系统。在MySQL被Sun 公司收购并进一步被Oracle公司收购之后,越来越多的公司正在从MySQL迁移到postgresql。pgbench是一个针对postgresql的性能测试工具,其测试结果接近于TPC-B。pgbench的优点之一在于它能够轻易地进行多线程测试,从而充分利用多核处理器的处理能力。

在虚拟机上以postgres用户登录:

su -l postgres

将/usr/lib/postgresql/9.1/bin加入到路径PATH当中。

创建测试数据库:

createdb pgbench

初始化测试数据库:

pgbench -i -s 16 pgbench

执行单线程测试:

pgbench -t 2000 -c 16 -U postgres pgbench

执行多线程测试,在下面的命令中将N替换为虚拟机的vCPU数量:

pgbench -t 2000 -c 16 -j N -U postgres pgbench

下面是一个可供参考的测试结果。在这个测试中使用了两台物理机,每台物理机各配置一颗Intel Core i3 540 @ 3.07 GHz (双核四线程),16 GB内存(DDR3 @ 1333 MHz),一块Seagate ST2000DL003-9VT1硬盘(SATA,2TB,5900RPM),运行Ubuntu 10.04 AMD64 Server操作系统,使用的文件系统为ext4,使用的Hypervisor为KVM(qemu-kvm-0.12.3),虚拟机运行Ubuntu 12.04 AMD64 Server操作系统。我们分别测试了宿主机、磁盘映像以文件格式(RAW格式,没有启用virtio)存储在本地磁盘上的虚拟机、磁盘映像以文件格式(RAW格式,没有启用virtio)存储在NFS上的虚拟机的数据库性能。虚拟机的配置为2 颗vCPU(占用两个物理线程,也就是一个物理核心)和4 GB内存,运行Ubuntu 12.04 AMD64 Server操作系统。在这个测试中没有对操作系统、文件系统、NFS、KVM等等进行任何性能调优。





















测试场景 宿主机 本地磁盘上的虚拟机 NFS服务上的虚拟机
单线程 126 24 14
多线程 146 31 17

从如上测试结果可以看出,在没有进行任何性能调优的情况下,在数据库性能方面,宿主机 >> 本地磁盘上的虚拟机 >> NFS服务上的虚拟机。

 

Ubuntu 12.04 Server安装配置OpenNebula 3.8

发表时间:2012-12-21 22:14:50 评论:23

这个帖子是为2011年11月所发布的《Ubuntu 11.04 Server安装配置OpenNebula 3.0》一文的升级版。本教程在Ubuntu 12.04 Server的32位版本和64位版本上都进行过测试。在设备匮乏的情况下,本教程也可以在一台笔记本电脑上完成(在这种情况下,业务内网和管理内网合并成一个网络)。文章中嵌入的图片可能看得不是很清楚,可以点击图片看到清晰大图。

[网络拓扑]

存储设备(可以是FC SAN,可以是磁盘阵列,可以是管理节点上的本地硬盘,也可以是基于MooseFS或者Ceph的分布式文件系统)通过直连管理节点,并挂载为管理节点上的一个目录/srv。

管理节点和计算节点各有两个网卡,其中一个网卡连接业务内网,另外一个网卡连接存储内网。在条件允许的情况下,建议业务内网和存储内网都使用万兆网。在不能全面使用万兆网的情况下,建议管理节点(尤其是管理节点上的存储网络)连接到交换机的万兆网口,计算节点连接到交换机的千兆网口。

业务内网的IP段为 192.168.1.*,存储内网的IP段为192.168.2.*。管理节点的IP地址为192.168.1.1和192.168.2.1。

[管理节点的配置]

全新安装的Ubuntu 12.04 Server操作系统,安装的时候同时安装OpenSSH Server和LAMP Server。将eth0的IP配置为192.168.1.1,将eth1的IP配置为192.168.1.2。

安装必要的软件包:

sudo apt-get install libsqlite3-dev libxmlrpc-c3-dev g++ ruby libopenssl-ruby libssl-dev ruby-dev libxml2-dev libmysqlclient-dev libmysql++-dev libsqlite3-ruby libexpat1-dev rake rubygems libxml-parser-ruby1.8 libxslt1-dev genisoimage scons mysql-server nfs-kernel-server rails thin curl

sudo gem install nokogiri rake xmlparser json thin sequel sinatra sinatra-sequel sqlite3 mysql

创建cloud组和oneadmin用户:

sudo mkdir -p /srv/cloud/
sudo groupadd -g 10000 cloud
sudo useradd -u 10000 -g cloud -m oneadmin -d /srv/cloud/one -s /bin/bash
sudo passwd oneadmin
sudo chown -R oneadmin:cloud /srv/cloud/

为oneadmin用户配置无密码登陆:

su -l oneadmin
ssh-keygen
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
echo “StrictHostKeyChecking no” > ~/.ssh/config
exit

配置NFS服务:

sudo pico /etc/exports

增加一行内容:

/srv/cloud  192.168.2.0/24(rw,fsid=0,nohide,sync,no_root_squash,no_subtree_check)

启动NFS服务:

sudo /etc/init.d/nfs-kernel-server start

需要注意的是,如果/srv本来就是由MooseFS或者Ceph等分布式文件系统挂载过来的,就不需要在这里再次export出去了。

创建MySQL数据库:

mysql -u root -p
CREATE USER ‘oneadmin’@'localhost’ IDENTIFIED BY ‘oneadmin’;
CREATE DATABASE opennebula;
GRANT ALL PRIVILEGES ON opennebula.* TO ‘oneadmin’ IDENTIFIED BY ‘oneadmin’;
quit;

从http://downloads.opennebula.org下载最新版本的OpenNebula软件(OpenNebula 3.8.1 tarball),放在oneadmin用户的~目录下:

su -l oneadmin
tar -zxvf opennebula-3.8.1.tar.gz
cd opennebula-3.8.1
scons sqlite=no mysql=yes
./install.sh -u oneadmin -g cloud -d /srv/cloud/one

编辑~/.bash_profile,设置一些环境变量

export ONE_LOCATION=/srv/cloud/one
export ONE_AUTH=$ONE_LOCATION/.one/one_auth
export ONE_XMLRPC=http://localhost:2633/RPC2
export PATH=$ONE_LOCATION/bin:/usr/local/bin:/var/lib/gems/1.8/bin/:$PATH

执行.bash_profile,使得这些环境变量生效:

source ~/.bash_profile

编辑~/.one/one_auth,设置OpenNebula的用户名和密码:

mkdir ~/.one
echo “oneadmin:YOUR_PASSWORD” > ~/.one/one_auth
chmod 640 ~/.one/one_auth

编辑~/etc/oned.conf,设置OpenNebula所使用的数据库参数:

# DB = [ backend = "sqlite" ]

# Sample configuration for MySQL
DB = [ backend = "mysql",
server = "localhost",
port = 0,
user = "oneadmin",
passwd = "oneadmin",
db_name = "opennebula" ]

启动OpenNebula服务:

one start

关闭OpenNebula服务:

one stop

编辑~/etc/sunstone-server.conf,配置管理界面SunStone的相关参数。如果您需要从管理节点以外的节点访问SunStone管理界面,建议将Server Configuration部分的host参数配置为192.168.1.1。保存该配置之后,使用如下命令启动SunStone服务:

sunstone-server start

这时您就可以通过http://192.168.1.1:9869/来访问SunStone管理界面了。您需要使用您在~/.one/one_auth文件中所设置的用户名和密码来登陆SunStone管理界面。如果您需要停止SunStone服务,可以使用如下命令:

sunstone-server stop

编辑~/etc/occi-server.conf,配置用户自助服务界面的相关参数。同样,如果您需要从管理界点以外的节点访问用户自助服务门户,建议将host参数配置为192.168.1.1。保存该配置之后,使用如下命令启动OCCI服务:

occi-server start

这时您就可以通过http://192.168.1.1:4567/ui来访问用户自助服务界面了。如果您需要停止OCCI服务,可以使用如下命令:

occi-server stop

SunStone管理界面和OCCI用户自助服务界面都提供了多语言支持。简体中文的语言包是我制作的,该语言包已经被提交给OpenNebula,并且会被包含在即将发布的OpenNebula 4.0版本中。使用OpenNebula 3.8版本的用户,如果需要简体中文界面的话,可以从我的博客下载这个语言包。

OpenNebula 3.8中文语言包

在下面的介绍中,我们假定您已经依照上面的链接下载并安装了简体中文界面。在~/etc/sunstone-server.conf和~/etc/occi-server.conf中,您需要将lang参数配置为zh_CN,并且重新启动sunstone-server和occi-server两个服务。这时您的SunStone管理界面和OCCI自助服务门户都会被自动切换到简体中文界面。

最后,您需要运行/srv/cloud/one/share目录下的install_novnc.sh脚本,使得SunStone管理界面和OCCI用户自助服务界面支持通过VNC连接到虚拟机控制台。

cd ~/share

./install_novnc.sh

这个部分的安装比较奇特。我的经验是先sudo ./install_novnc.sh,然后清除掉/tmp中的相关内容,然后用oneadmin用户再次./install_novnc.sh,就成功了。

[计算节点的配置]

全新安装的Ubuntu 11.04 Server操作系统,安装的时候同时安装OpenSSH Sever和Virtualization。将eth0的IP配置为192.168.1.2,将eth1的IP配置为192.168.2.2。

首先安装必要的软件包:

(重要说明,如果在计算节点上没有安装ubuntu-vm-builder和ruby这两个软件包,用onehost create命令可以添加该计算节点,但是其状态会显示为err。)

sudo apt-get install qemu-kvm libvirt-bin bridge-utils ubuntu-vm-builder ruby nfs-common vlan

编辑/etc/fstab,配置NFS客户端:(假定OpenNebula管理节点的IP是192.168.1.1)

192.168.2.1:/srv/cloud /srv/cloud nfs defaults 0 0

创建NFS目录并挂载NFS文件系统:

sudo mkdir -p /srv/cloud
sudo mount /srv/cloud

创建cloud组和oneadmin用户:

sudo groupadd -g 10000 cloud
sudo useradd -u 10000 -g cloud -m oneadmin -s /bin/bash
sudo usermod -d /srv/cloud/one oneadmin
sudo passwd oneadmin
sudo chown oneadmin:cloud /srv/cloud/

编辑/etc/libvirt/libvirtd.conf配置libvirt,将操作权限授予给cloud组:

unix_sock_group = “cloud”

编辑/etc/libvirt/qemu.conf配置libvirt,设置VNC:

vnc_listen = “0.0.0.0″
user = "root"
group = "root"
dynamic_ownership = 0

重启libvirt:

sudo service libvirt-bin restart
sudo chown :cloud /var/run/libvirt/libvirt-sock

编辑/etc/network/interface,根据实际的网络状况配置网桥。在这里我们使用eth0连接到业务内网,使用192.168.1.*的内网IP。

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
address 192.168.1.2
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

重启一下网络:

sudo service networking restart

[计算节点的管理]

屏幕快照 2012-12-21 下午3.39.38

登录到SunStone管理界面,在“基础设施-》物理机”页面点击“+新增”按钮添加计算节点。在“名称”对话框中输入计算节点业务内网的IP 192.168.1.2,其他输入框中使用缺省值即可,然后点击“创建”按钮进行确认。如果计算节点已经按照前一节的描述正确配置好的话,新增加的计算节点会出现在物理机列表里。

我们可以通过命令行界面查看计算节点是否添加成功:

onehost list

这时候应该可以看到192.168.1.2出现在计算节点列表里面。如果计算节点配置正确的话,它的状态(STAT)应该显示为“on”。如果计算节点的状态显示为“err”,说明计算节点没有配置好。这时候可以做三个检查:(1)在管理节点上是否可以用无密码模式SSH登录到计算节点,(2)计算节点是否已经安装好ubuntu-vm-builder和ruby,和(3)在计算节点上oneadmin用户是否有权限控制KVM。

[管理磁盘镜像]

屏幕快照 2012-12-21 下午9.59.19

登录到SunStone管理界面,在“应用市场”页面选中“ttylinux-kvm”,并点击右上角的“导入本地基础设施”按钮(中文语言包翻译为“从本地基础设施导入”,属于翻译错误)。无需改动弹出对话框内的任何内容,直接点击“创建”按钮即可。OpenNebula会在后台自动地下载一个预先配置好的ttylinux操作系统映像文件,并注册到OpenNebula数据仓库中。您可以随时在SunStone管理界面的“虚拟资源-》映像”页面中查看现有的磁盘映像及其状态。

在OpenNebula中,磁盘映像有三种类型:OS、CD-ROM、Datablock。OS型磁盘映像等价于AWS中的AMI,也等价与Eucalyptus中的EMI;CD-ROM型磁盘映像可以理解为一个ISO文件;Datablock型磁盘映像等价于AWS和Eucalyptus中的弹性块存储EBS。

ttylinux是一个精简版的Linux,其磁盘映像比较小,应该可以在很短的时间内完成下载。此后您还可以从应用市场中导入CentOS、Ubuntu、Debian等等由官方发布的操作系统磁盘映像。

我们也可以自己制作操作系统磁盘映像。在这里我们推荐您使用VirtualBox这个工具来完成操作系统的安装,安装操作系统时选择磁盘映像格式为VDI。操作系统安装完毕后,可以用下面这个命令将VDI磁盘映像格式转换成RAW磁盘映像格式:

VBoxManage clonehd file_name.vdi file_name.img –format raw

将RAW格式的磁盘映像拷贝到一台安装有QEMU的Linux机器上,用下面这个命令将RAW磁盘映像格式转换成QCOW2磁盘映像格式:

qemu-img convert file_name.img -O qcow2 file_name.qcow2

将转换过的磁盘映像(RAW格式或者QCOW2格式)拷贝到管理节点的某个目录里,例如/srv/cloud/one/images。OpenNebula缺省地认为来自用户硬盘的磁盘映像是不安全的,从而拒绝将其导入到数据仓库中。为了让OpenNebula能够导入用户硬盘上的磁盘映像,我们首先需要修改数据仓库的属性。在管理节点上执行如下命令,可以修改default数据仓库的属性:

onedatastore update 1

在vi编辑窗口中添加一行配置,存盘退出。

SAFE_DIRS="/srv/cloud/one/images"

登录到SunStone管理界面,在“虚拟资源-》映像”页面中点击“+新增”按钮,在弹出的创建磁盘映像对话框中设定要导入的磁盘映像名称、类型、持久性、驱动程序(raw或者企鹅cow)、磁盘映像文件在管理节点上的路径等等信息,然后点击“创建”按钮。OpenNebula就会在后台将指定的磁盘映像倒入到相应的数据仓库中。您可以随时在SunStone管理界面的“虚拟资源-》映像”页面中查看现有的磁盘映像及其状态。

如果一个磁盘映像是持久性的,那么在虚拟机运行期间所执行的任何磁盘操作,在虚拟机停机之后依然会保存在磁盘映像中。如果一个磁盘映像是临时性的,那么在虚拟机运行期间所执行的任何磁盘操作,在虚拟机停机之后不会保存在磁盘映像中。

[管理网络]

屏幕快照 2012-12-21 下午9.45.46

登录到SunStone管理界面,在“基础设施-》虚拟网络”页面点击“+新增”按钮,即可定义可以分配给虚拟机使用的网络。您需要输入该网络的名称(任意字符串)、虚拟网络模式(缺省值为基于普通网桥的网络,还可以选择802.1Q、ebtables、Open vSwitch、VMWare等等网络类型)、网桥、物理网卡、可用的IP地址范围等等信息,然后点击“创建”按钮即可生成又gi额网络。您可以俗世在SunStong管理界面的“基础设施-》虚拟网络”页面中查看现有的网络定义及其状态。

您也可以通过命令行的方式来定义一个网络。例如您可以使用文本编辑软件创建一个small_network.net文件,该文件的内容定义了一个网络:

NAME = “Small Network”
TYPE = FIXED

BRIDGE = br1
LEASES = [ IP="192.168.1.5"]
LEASES = [ IP="192.168.1.6"]
LEASES = [ IP="192.168.1.7"]
LEASES = [ IP="192.168.1.8"]
LEASES = [ IP="192.168.1.9"]
LEASES = [ IP="192.168.1.10"]
LEASES = [ IP="192.168.1.11"]
LEASES = [ IP="192.168.1.12"]
LEASES = [ IP="192.168.1.13"]
LEASES = [ IP="192.168.1.14"]
LEASES = [ IP="192.168.1.15"]

将如上所定义的网络添加到系统:

onevnet create small_network.net

列出系统上所有的网络(刚刚创建的Small Network 的ID可能是0):

onevnet list

[管理虚拟机模板]

屏幕快照 2012-12-21 下午9.29.06

在OpenNebula中,操作系统磁盘映像相当于安装有操作系统的可启动硬盘。在创建虚拟机之前,还需要对虚拟机的CPU、内存、网络、显示器、输入设备等等进行定义。在OpenNebula中,我们将这些配置描述称为虚拟机模板。

用户可以通过SunStone管理界面方便地定制虚拟机模板。在“虚拟资源-》模板”页面点击“+新增”按钮,在弹出的创建VM模板中设定模板名称、内存大小、CPU数量(VM在宿主机上实际占用的CPU,精确到0.1)、vCPU数量(VM内部显示的CPU数量,为正整数)、处理器构架(i686或者x86_64)、磁盘映像(从列表中选择一个磁盘映像)、驱动程序(RAW或者QCOW2)、选择网络(从列表中选择一个可用网络)、图形界面(VNC、SDN、SPICE)等等,然后点击“创建”按钮即可生成虚拟机模板。您可以随时在SunStone管理界面的“虚拟资源-》模板”页面中查看现有的虚拟机模板及其状态。

如果您在虚拟机模板中使用了持久性的磁盘映像,你只能够基于该模板创建一个正在运行的虚拟机。这是因为一个持久型的磁盘映像只能够同时被应用到一台正在运行的虚拟机上。如果您在虚拟机模板中使用的是临时性的磁盘映像,则可以同时基于该模板创建多个虚拟机。

您也可以通过命令行来定义一个模板,编辑ttylinux.one定义虚拟机参数。这里我们使用了一个ttylinux的磁盘映像,该磁盘映像可以从下面这个链接获得。

wget http://dev.opennebula.org/attachments/download/170/ttylinux.tar.gz
tar zxvf ttylinux.tar.gz

模板文件ttylinux.one的内容如下:

NAME   = ttylinux
CPU    = 0.1
MEMORY = 64

DISK   = [
source   = "/srv/cloud/one/one-templates/ttylinux.img",
target   = "hda",
readonly = "no" ]

NIC    = [ NETWORK_ID = 0]

GRAPHICS = [ TYPE = "VNC"]

FEATURES=[ acpi="no" ]

在系统中创建该虚拟机:

onevm create ttylinux.one

列出系统上所有的虚拟机(刚刚创建的虚拟机的ID可能是0):

onevm list

如上命令列出了系统上所有虚拟机的状态,包括运行这些虚拟机的计算节点。如果需要了解某个虚拟机的详细状况,可以使用onevm show VM_ID命令,例如:

onevm show 0

这个命令会列出ID为0的虚拟机的所有相关信息,包括运行该虚拟机的计算节点,VNC端口号等等。找到这个端口号(假定为5900),就可以通过VNC客户端连接到该虚拟机的控制台,例如:

vncviewer 192.168.1.2:5900

管理虚拟机

当虚拟机模板创建完毕后,您可以在SunStone管理界面的“虚拟资源-》模板”页面中选中一个虚拟机模板,并点击页面上方的“创建实例”按钮创建一个基于该模板的虚拟机。您也可以在“虚拟资源-》虚拟机”页面点击页面上方的“+新增”按钮,并在弹出的对话框中选择一个用于创建虚拟机的模板。

屏幕快照 2012-12-21 下午10.01.53

您可以在“虚拟资源-》虚拟机”页面随时查看您可管理的虚拟机列表及其状态,并通过页面上方的各种按钮进行虚拟机生命周期管理操作(例如暂停运行、继续运行、关机、重启、删除等等)。如果您在安装OpenNebula时设定了VNC支持,并且您所创建的虚拟机指定VNC作为控制台显示设备的话,在虚拟机列表中与该虚拟机相对应的VNC图标会被点亮,您可以点击该图标,直接在浏览器中通过VNC连接到该虚拟机的控制台。

屏幕快照 2012-12-21 下午10.10.33

[其他说明]

虚拟机的在线迁移,需要配置好所有计算节点的/etc/hosts和/etc/hostname,确保在所有在计算节点上都能够根据主机名来寻找到其他计算节点,不然的话在线迁移会失败。此外,所有节点(包括控制节点和计算节点)之间需要配置无密码SSH登录。

数据库的用户名和密码尽可能不要包含:和@字符,否则会出现数据库连接错误。

我会在后续的教程中陆续介绍OpenNebula的更多配置和使用方法。

迦叶尊者

发表时间:2012-12-16 15:18:10 评论:1

IMG_0061

 

周末滞留在上海,抽空去了一下上海博物馆。因为时间很紧,只能匆匆地扫了扫一楼的古代雕塑馆。总的感觉是馆藏题材非常有限,基本上以北魏到南宋之间的佛教雕塑为主。所以这个“古代雕塑馆”实在是徒有虚名,不若叫“古代佛教雕塑馆”来得实在。即使是在佛教雕塑这个领域里,上海博物馆也缺少可圈可点的展品,总体水平不如西安小雁塔内西安博物馆的佛教造像展。

唯一的例外是这件唐朝的木雕迦叶头像。历尽千年沧桑的高僧,脸容依然慈祥,眼神依然在笑,第一眼看见就很喜欢。

《欧里庇得斯悲剧六种》

发表时间:2012-12-09 15:48:14 评论:1

最近出差比较多,发现在飞机上坐着是个读书的好时机。狭小的空间,一丝一毫都动弹不得。两旁都是陌生人,不是闭眼养神就是一脸漠然。好不容易挤到座位上,强烈的孤独和寂寞便如期而至,除了读书就只好思考人生了。

最近书包里带的是罗念生先生翻译的《欧里庇得斯悲剧六种》。上个星期天下午,海口到北京,读完了《阿尔刻提斯》和《美狄亚》。星期一下午,北京到海口,读完了《特洛亚妇女》和《伊菲格涅亚在陶洛人里》。星期六上午,海口到天津,读完了《酒神的伴侣》和《安德洛玛克(节译)》。星期天上午,天津到海口,又顺便把全书温习了一遍。

《阿尔刻提斯》

菲赖城(Pherai)的国王阿德墨托斯(Admetos)得了阿波罗(Apollon)的帮助,得到一次不死的机会,条件是有一位亲人代替他到下界去。他问过所有的亲人,包括他的父亲和母亲,但是除了他的妻子阿尔刻提斯(Alcestis)之外,没有人愿意替他去死。阿尔刻提斯死前与阿德墨托斯依依惜别,托付儿女,最终被死神带到冥界。阿德墨托斯的父亲菲瑞斯(Pheres)向儿媳妇的遗体献上礼物,却被儿子斥责贪生怕死,引起了父亲是否应该替儿子去死的辩论。宙斯(Zeus)的儿子赫剌克勒斯(Herakles)在这不恰当的时刻来到阿德墨托斯的宫殿作客,阿德墨托斯在悲痛之中仍不愿怠慢远道而来的客人,对赫剌克勒斯隐瞒了妻子死亡的消息,并吩咐随从在客房设宴宽带赫剌克勒斯。赫剌克勒斯最终从闷闷不乐的随从那里得知事情的真相,他被阿德墨托斯的热情好客所感动,埋伏在阿尔刻提斯的坟前与前来吸饮血浆的死神进行搏斗,最终从死神的手里将阿尔刻提斯解救了回来。

我们不能说阿德墨托斯不爱他的妻子,但是他爱自己显然远胜于爱自己的妻子。面对生命的诱惑,他可以一边说“神啊,快引了我,引了我一同下去吧”,一边任凭妻子的身体在他的怀里慢慢失去温度。菲瑞斯无疑是深爱他的儿子的,但是面对儿子的斥责,他也可以坦然说出“你自己高兴看见阳光,你以为当父亲的就不高兴看见阳光吗”的朴素道理。在这样的前提下,阿尔刻提斯其实已经是非死不可了。妇女的社会地位以及妻子的责任使她顺从地放弃了自己的生命,从而保全自己的名节并且正当地请求让丈夫不要为儿女讨一个后娘。如果阿尔刻提斯不愿为丈夫去死的话,恐怕还是难逃一死的命运,还要落得个身败名裂的下场。在本剧的结尾部分,阿尔刻提斯被赫剌克勒斯从死神的手中夺回。获得重生的妻子是否会与丈夫恩爱如初我们不得而知,但是阿德墨托斯与亲生父母俨然已经恩义两绝了。

人生最大的悲剧,莫过于命还在,但是爱已经不在了。

《美狄亚》

科尔喀斯(Kolkhis)的公主美狄亚(Medeia)爱上了伊俄尔科斯(Iolkos)的王子伊阿宋(Iason)。她帮助伊阿宋夺走了科尔喀斯的金羊毛,并与伊阿宋乘坐阿耳戈(Argo)船逃走,在逃跑的过程中竟杀死了自己的兄弟阿普绪耳托斯(Apsyrtos)。他们两个逃到科任托斯(Korinthos)后,忘恩负义的丈夫要娶科任托斯的公主格劳刻(Glauke)为妻。科任托斯的国王克瑞翁(Kreon)知道美狄亚有很重的复仇心理,为了保护自己的女儿决定将美狄亚逐出科任托斯。美狄亚为了丈夫背叛了自己的祖国,又被逐权夺利的丈夫所背叛,再度面临流亡的命运。美狄亚在极度的悲愤中用巫术毒死了国王克瑞翁和公主格劳刻,更亲手杀死了自己与伊阿宋所生的两个儿子,最后乘坐龙车逃离了科任托斯。

美狄亚向科任托斯的国王和公主复仇,是因为他们夺走了自己的丈夫。她杀死自己的儿子们,剧中的解释是“我已经下了决心,马上就去做这件事情:杀掉我的孩子再逃出这地方。我决不耽误时机,决不抛撇我的孩儿,让他们死在更残忍的手里。”但是,既然美狄亚自己可以乘坐龙车逃离,她又何尝不能将孩子们一起带走呢?用杀死亲生孩子的办法向背叛自己的丈夫报仇,美狄亚不是第一个,也不是最后一个。美狄亚并非不爱自己的儿子们,但是她对丈夫的仇恨超过了她对孩子的亲情。

获得重生的阿尔刻提斯即使不再爱自己的丈夫,但是她还有一双可爱的儿女。尽管美狄亚可以乘坐龙车逃离科任托斯,但是她的两个儿子再也不能复活了。从这个意义上来说,美狄亚的悲剧,更甚于阿尔刻提斯的悲剧。我们是不是可以这样说:阿尔刻提斯的顺从,使得她可以保留一份亲情;而美狄亚的反抗,使得她彻底失去所有亲情?

《特洛亚妇女》

忒提斯(Thetis)与佩琉斯(Peleus)邀请众神参加他们的婚宴,独独忘了邀请纷争女神厄里斯(Eris)。厄里斯便扔过来一个金苹果,说是要送给最美丽的女神。雅典娜(Athena)、赫拉(Hera)和阿佛洛狄忒(Aphrodite)都争着要这金苹果。众神不敢决定三个女神的胜负,把他们一起引到特洛亚(Troia)郊外的伊得(Ide)山上,却让特洛亚王子帕里斯(Paris)来评判。这三位女神都想要收买这位裁判,雅典娜答应给他武功,赫拉答应给他小亚细亚的统治权,阿佛洛狄忒却许诺给他一个最美丽的女人。王子将金苹果判给了阿佛洛狄忒,却使得特洛亚与雅典娜和赫拉结下了仇恨。阿佛洛狄忒赢得了比赛,就让帕里斯到斯巴达去作客,并帮助帕里斯拐走了国王墨涅拉俄斯(Menelaos)的妻子海伦(Helene)。希腊人恼羞成怒,就来攻打特洛亚,没有得到金苹果的雅典娜和赫拉都站在希腊人这边,得到了金苹果的阿佛洛狄忒站在了特洛亚人这边。残酷的战争持续了整整十年,希腊人凭了雅典娜的诡计假装撤离,但是在特洛亚城外留下了一只里面藏着兵士的巨大木马。特洛亚人将这木马拖回城里庆祝胜利,却给城邦带来了致命的灾难。特洛亚的男人已经被悉数杀死,黄金和甲帐都被运入希腊人的船仓,只有被俘虏的妇女们还在等待希腊人宣判她们将被分配给谁做奴隶。

特洛亚的王后赫卡帕(Hekabe)在战争中失去了她的丈夫普里阿摩斯(Priamos)还有儿子赫克托耳(Hektor)与帕里斯(Paris)。赫卡帕的女儿波吕克塞娜(Polyxena)被希腊人所俘虏,但是在战争中死去的阿喀琉斯(Akhilleus)生前爱过波吕克塞娜,托了个梦给争抢战利品的希腊人说他要娶这女人为妻,他的儿子皮洛斯(Pyrrhus)便把波吕克塞娜杀来献祭。赫卡帕的另外一个女儿卡珊德拉(Kassandra)被阿伽门农看中,被阿伽门农带到密刻奈(Mykenai)去做新娘。柔弱的卡珊德拉却庆祝自己的命运,她满怀复仇的心,说:“那闻名的阿伽门农娶了我,便会比娶了海伦还要懊恼!我要去把他杀了,我要去破坏他的家庭,替我的父兄报仇雪恨。”她又说:“母亲,请不要再为这城邦而悲痛,为我的婚姻而悲痛,我自会借这婚事,把你我的仇人害死。”卡珊德拉和阿伽门农到了斯巴达,和这国王一起被国王的原配克吕泰涅斯特拉(Klytaimnestra)杀死了。国王的儿子俄瑞斯特斯(Orestes)因为母亲杀死了父亲,又杀死了母亲为父报仇。

赫卡帕与海伦之间的辩论,为这部悲剧创造了一个小高潮。海伦认为三位女神之间的比赛是悲剧的根源,她之所以和帕里斯一起私奔,不过是三个女神之间比赛的不可逆转的结果。帕里斯到斯巴达来作客时,丈夫墨涅拉俄斯竟然将英俊的帕里斯留在家里自己到克瑞忒(Crete)岛去,都是因为女神阿佛洛狄忒在从中捣鬼,不然的话她根本就不会爱上帕里斯。赫卡帕则认为是自己的儿子生得太漂亮了,海伦一看见他心里便产生了一个爱神(人心里得一切妄想都成了“阿佛洛狄忒”),又嫌弃斯巴达得穷苦难,羡慕特洛亚得奢华富饶,这才主动勾搭上自家的儿子。这倾国倾城的爱情,到底是命中注定,还是颠倒梦想呢?

这悲剧中最催人泪下的部分,是希腊人担心赫克托耳的儿子阿斯堤阿那克斯(Astyanax)会造成后患,残忍地将他从城墙上扔下来摔死了。孩子的母亲安德洛玛刻(Andromakhe)在希腊人要抱走儿子的时候哭喊道:“那不吉的新床,不详的婚礼阿,你曾把我带到赫克托耳家里,不是要我生一个儿子来让希腊人屠杀,而是要我为这丰饶的亚细亚生一个国王。儿呀,你在哭吗?你也明白你的灾难吗?为什么用手拖这我,为什么抓住我的袍子,像一个雏儿躲到我的翅膀底下?赫克托耳再也不会从地下起来,举着那闻名的戈矛来保护你。你族里的亲人和特洛亚的力量再也救不了你;你会从那城墙高出倒坠下来,那凄惨的跌落会打断你的呼吸,可没有人怜恤你!啊,你曾是我怀中的小宝贝,母亲最疼爱的婴儿,你的肌肤曾放出一阵阵的乳香,只可惜我白白地包裹你,白白地哺养你,白受苦,白费力。这时候,快拥抱我,拥抱你的母亲,用你的手楼主我的脖子,同我亲吻,这是最后一次了。”

读过《特洛亚妇女》的人大都称颂赫卡帕的名言 - 当一个有福的人还没有死的时候,切不要说他是幸福的。我却觉得这样的句子虽然包含哲理,但是很难激起读者的共鸣。而一位母亲如此歇斯底里的呼号,不管在什么情况下读到,都会令人肝肠寸断,青衫遍湿。

罗念生先生在这个悲剧的译者序里面还提到他在一个古庙里听高僧解说梵经,高僧向他念出关于玄奘译经的一段记载。记载说:“师返慈恩,专务翻译,无弃寸阴:每日自立程课,若昼日有事不充,必兼夜以续之,过乙之后,方乃停笔。摄经已,复礼佛行道,至三更暂眠,五更复起,读颂梵本,朱点次第,拟明日所翻。”读到这里,不由得翻出自己尚未翻译完成的爱尔兰神话《众神与战士》来看,发现博客里贴出来的最后一段是去年二月份翻的,真是惭愧至死。

《伊菲格涅亚在陶洛人里》

在特洛亚战争中,阿耳戈斯(Argos)国王阿伽门农(Agamemnon)出兵帮助自己的弟弟斯巴达国王墨涅拉俄斯(Menelaos)报仇雪恨。他在奥利斯(Aulis)召集了一千只战船远征特洛亚,但是在出师的时候狂风大作,船只受阻。国王举行燔祭,先知卡尔卡斯(Kalkhas)说国王曾经向光明女神阿耳忒弥斯(Artemis)许愿要献上一年中最丰美的产物,而国王的妻子克吕泰涅斯特拉(Klytaimnestra)在国王许愿的那年生了个女儿伊菲革涅亚(Iphigeneia),因此国王就得拿自己的女儿来献祭。国王欺骗王后说要将伊菲革涅亚出嫁给阿喀琉斯,从母亲那里把女儿接了去,实际上却抬到火葬堆上要杀来献祭。阿耳忒弥斯用一只母鹿换走了伊菲革涅亚,放到蛮夷人陶洛人的地盘陶里刻,让她做自己神庙里的祭司,但是所有的人都以为伊菲革涅亚是真的被献杀给女神了。十年的战争结束后,国王阿伽门农回到了故乡,王后这才得知自己的女儿早在十年以前就已经被丈夫献杀,一怒之下杀死了丈夫。国王的儿子俄瑞斯特斯(Orestes)因为母亲杀死了父亲,又杀死了母亲为父报仇。报仇女神厄里倪厄斯(Erinyes)们由于俄瑞斯特斯犯下了杀母的罪行,又来追杀俄瑞斯特斯,但是最后神示让俄瑞斯特斯前来陶里刻的阿耳忒弥斯神庙盗窃庙里的神像并送到雅典,只等他做了这件事,就能解脱痛苦。

俄瑞斯特斯和她的朋友皮拉得斯(Pylades)经过种种险阻来到了陶里刻。陶里刻有一个法律,只要有任何希腊人到这岛上来,都要抓来给女神阿耳忒弥斯献祭。如今俄瑞斯特斯和皮拉得斯都已经被土人们捉到,五花大绑地送到了伊菲革涅亚担任祭司的阿耳忒弥斯神庙。伊菲革涅亚当然不知道即将被献杀的希腊人中有自己的亲弟弟,俄瑞斯特斯也不知道即将要将自己献杀的祭司就是自己的亲姐姐。

女祭司向被献杀者询问祖国的消息,却意外地发现他们对自己的家族非常了解。思乡心切的女祭司许诺解救两位献杀者当中的一位,条件是他要帮她送一封信给自己在家乡的亲人。两位男子汉互相推让活命的机会,最终俄瑞斯特斯说服皮拉得斯回去送信,自己则留在陶里刻充当祭品。为了慎重起见,伊菲革涅亚让皮拉得斯牢牢记住信板上的内容,结果皮拉得斯发现自己什么都不用做就完成了任务。女祭司当然会怀疑被献杀者的话语,但是俄瑞斯特斯回忆起伊菲革涅亚曾经将金羊毛的故事织到精致的布上,说起伊菲革涅亚从母亲那里得到洗澡水带到奥利斯,又说起藏在伊菲革涅亚闺房里那只祖传的古矛。姐弟两个绝地相逢,那种欢乐的悲哀,真是难以言表。

接下来的故事就顺理成章了。伊菲革涅亚告诉国王说两位献杀者犯了杀母的罪行,不宜就这样献给女神,得带到远处得港湾那里用海水彻底洗干净才能够献祭。至于那块俄瑞斯特斯梦寐以求得神像,因为曾经被献杀者摸过,也得拿到海里去洗一洗才行。除了祭司之外的任何人都不能看这两个不洁的人和神像,因此物陶里刻岛上得所有居民都得躲在屋里,等到被献杀者和神像都被洗干净之后才能够出来。就这样女祭司带着弟弟、老乡和神像到了港口,登上弟弟带来的大船出了港口。

但是这时候诗人展示了讲故事者的才华。借用向国王报信的信使的话来说,就是“可怕的风暴突然吹来,吹着船往后退。他们坚持着向波浪反冲,但是退潮又把船冲回陆地......那船越来越靠近石头了,我们有的人涉水入海,有的人把绳圈儿捆好......那海的主宰,威严的波塞东(Poseidon)......好像要把阿伽门农的儿子交到你和你市民手里,还要把他姐姐也交还,因为她欺骗了女神,忘记了在奥利斯的杀献。”这个时候女神雅典娜自空中出现了,她说:“请听我雅典娜的话。快停止追捕......神示预先派定俄瑞斯特斯到这里来,好让他逃避报仇神的愤怒,把他姐姐送回阿耳戈斯,把那神圣的像带到我的土地上......波塞东看在我的面上,已使海面平静下来,让他坐船走了。”

阿伽门农一家的自相残杀,似乎是源自海伦的私奔,又最终可以将责任推卸到三位女神的比赛那里。但是阿伽门农难道不是为了建功立业才率军远征特洛亚的吗?弟媳妇的私奔固然是败坏了家族的声誉,为此又献杀自己的亲生女儿,难道不是更加可悲吗?如果不是阿耳忒弥斯都看不下去了,恐怕就不会用一只母鹿将伊菲革涅亚解救了吧。还好诗人最终没有让伊菲革涅亚与俄瑞斯特斯姊弟相残,这样的结尾读起来总算是让人心情愉快了些。

《酒神的伴侣》

宙斯曾爱上忒拜(Thaibes)城的建立者卡得摩斯(Kadmus)的女儿塞墨勒(Semele)。宙斯的妻子赫拉出于妒忌化妆成一个女人,怂恿塞墨勒请求宙斯以带着光彩的形象在她的面前出现。由于宙斯曾经起誓要答应塞墨勒的任何要求,只好以雷神的形象出现在塞墨勒的面前。塞墨勒遭到了雷击,死前生下一个尚未足月的婴儿。宙斯把婴儿放进他的髀肉,后来由髀肉里生下狄俄倪索斯(Dionysus),把他交给倪萨(Nysa)的山林女神抚养。狄俄倪索斯又名巴克科斯(Bacchus),是原始的草木动物之神,又是酒神,也是欢乐之神。

狄俄倪索斯长大之后,到处宣扬他的教仪,让人们腰缠鹿皮,手持神仗,狂欢作乐。但是狄俄倪索斯在忒拜城的亲戚们并不承认他是神的儿子,以为塞墨勒同凡人结了私情,反把失身的罪过推到宙斯的头上,因此才遭到宙斯的报复。狄俄倪索斯为自己的神格不被故乡所承认而深感愤怒。他使母亲的姊妹们神经错乱,纵情狂欢。他又设计将忒拜城的王彭透斯(Pentheus)引入圈套,被彭透斯自己的母亲阿高戈(Agaue)在迷乱中猎杀。

这一出悲剧,是诗人对神权公然的质疑与控诉。仅仅是由于亲戚们不相信自己是神的儿子,狄俄倪索斯背叛并毁灭了母亲的家族。用现在的话来讲,狄俄倪索斯的“神二代”属性,象征了神权的凶恶、残暴、荒淫与堕落。在诗人所处的时代,这样的表述无疑是大胆而危险的。

我不喜欢这一出悲剧,因为看了之后让人觉得太绝望了。

《安德洛玛克(节译)》

从介绍来看,《安德洛玛克》是诗人所著的一部独立的作品。在《欧里庇得斯悲剧六种》中所收录的,仅仅是其中的一些小结。从翻译的内容来看,和《特洛亚妇女》一剧中与安德洛玛克相关的部分基本上是相同的。

 

OpenNebula 3.8中文语言包

发表时间:2012-12-06 21:48:39 评论:3

最近花时间制作了OpenNebula 3.8的中文语言包,已经向OpenNebula提交了相关的布丁。在自己的博客里也留一个备份吧。

我所制作的是简体中文(zh_CN)语言包,参考的模板是OpenNebula 3.8里面自带的繁体中文(zh_TW)语言包。有需要的同学可以下载Chinese_zh_CN这个文件,并参考如下安装方法。

1、解压缩下载的文件,里面有两个文件夹。一个是SunStone,另外一个是OCCI。

2、为SunStone进行汉化,需要将SunStone目录下的zh_CN目录拷贝到$ONE_LOCATION/lib/sunstone/public/locale目录下,并将SunStone目录下的config_tab.js文件拷贝到$ONE_LOCATION/lib/sunstone/public/js/plugins目录下。

3、为OCCI自助服务门户进行汉化,需要将OCCI目录下的zh_CN目录拷贝到$ONE_LOCATION/lib/ruby/cloud/occi/ui/public/locale目录下,并将OCCI目录下的configurations.js文件拷贝到$ONE_LOCATION/lib/ruby/cloud/occi/ui/public/js/plugins目录下。

进行上述修改后,需要刷新一下SunStone页面或者OCCI自助服务门户页面方能生效。

使用VirtualBox创建KVM磁盘镜像文件

发表时间:2012-12-06 00:55:14 评论:1

在OpenNebula等等IaaS系统中,管理员经常需要定制一些操作系统镜像。常见的教程都推荐使用virt-manager,不过我发现用VirtualBox更加好用。因为VirtualBox这个工具在Windows、Linux和OS X上都可以使用,并且使用起来相当方便。

为OpenNebula制作操作系统镜像时,需要同时安装必要的Contextualization脚本。

主要的步骤如下:

1、在VirtualBox中创建一台虚拟机,系统盘使用VDI格式。在VirtualBox中安装所需的操作系统,并进行各种定制化。

2、用下面这个命令将VDI磁盘格式转换成RAW磁盘格式:

# VBoxManage clonehd file_name.vdi file_name.img –format raw

3、将RAW格式的磁盘镜像拷贝到一台安装有QEMU的Linux机器上,用下面这个命令将RAW磁盘格式转换成QCOW2磁盘格式:

# qemu-img convert file_name.img -O qcow2 file_name.qcow2

就这么简单啦。

烤红薯

发表时间:2012-11-27 20:47:31 评论:0

下午放学,咪咪去接婉清回家。路上买了两块烤红薯,一人一块。咪咪问婉清:“你要不要留一点点给球球呢?”婉清说:“你要留的话就留吧,我这一块是要吃完的。”于是咪咪从自己那块红薯那留了半块红薯,带回家里。

到了家里,咪咪吧红薯递给球球吃。球球吃了几口,跑过去找姐姐说:“红薯,吃。”

真是个招人心疼的娃呀。

 
更晚内容 更早内容

云与清风常拥有,
冰雪知音世难求。
击节纵歌相对笑,
案上诗书杯中酒。

2020年12月31日
洛杉矶

最新评论


2026-07-23 11:37:04
qyjohn 评论了 《几句翻译》

2026-07-21 20:11:28
wells 评论了 《几句翻译》

2025-11-15 06:29:51
qyjohn 评论了 《青桔》

2025-11-14 01:55:04
wells 评论了 《青桔》

2025-10-24 18:04:06
Ted Wang 评论了 《关于作者(About Me)》

2025-03-27 08:28:09
Max 评论了 《父亲走了》

2025-03-08 04:13:52
W 评论了 《我不想颂扬普京大帝》

2024-07-22 16:02:03
云思 评论了 《无题》

2024-06-27 10:01:54
yiming 评论了 《致访客(Welcome)》

2024-05-06 08:50:06
qyjohn 评论了 《致访客(Welcome)》

2024-05-03 19:49:00
jimmie 评论了 《致访客(Welcome)》

2024-02-19 03:32:57
林小静 评论了 《埋剑渡》

2024-01-05 03:54:28
路过者 评论了 《2023年度盘点》

2024-01-04 10:22:05
qyjohn 评论了 《致访客(Welcome)》

2024-01-04 08:05:13
qyjohn 评论了 《2023年度盘点》