-
Notifications
You must be signed in to change notification settings - Fork 0
/
creating-kvm-guest-on-ubuntu.html
408 lines (383 loc) · 20.7 KB
/
creating-kvm-guest-on-ubuntu.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="7rack" />
<meta name="copyright" content="7rack" />
<meta property="og:type" content="article" />
<meta name="twitter:card" content="summary">
<meta name="keywords" content="KVM, FreeBSD, Ubuntu, CentOS, Virtualization, " />
<meta property="og:title" content="Ubuntu上运行KVM创建虚拟机 "/>
<meta property="og:url" content="http://www.7rack.info/creating-kvm-guest-on-ubuntu.html" />
<meta property="og:description" content="设置BIOS支持KVM¶ 一般来说在BIOS设置菜单里,选择Advanced Step → CPU Options, 以确认Intel Virtualization Technology 选项是否 Enabled。 开机进入系统后,可以通过以下命令检查系统处理器是否支持KVM: grep -E 'vmx|svm' /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx ..." />
<meta property="og:site_name" content="轨迹" />
<meta property="og:article:author" content="7rack" />
<meta property="og:article:published_time" content="2014-03-23T22:30:00+08:00" />
<meta name="twitter:title" content="Ubuntu上运行KVM创建虚拟机 ">
<meta name="twitter:description" content="设置BIOS支持KVM¶ 一般来说在BIOS设置菜单里,选择Advanced Step → CPU Options, 以确认Intel Virtualization Technology 选项是否 Enabled。 开机进入系统后,可以通过以下命令检查系统处理器是否支持KVM: grep -E 'vmx|svm' /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx ...">
<title>Ubuntu上运行KVM创建虚拟机 · 轨迹
</title>
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.1/css/font-awesome.css" rel="stylesheet">
<link rel="stylesheet" href="http://www.7rack.info/theme/css/style.min.css?7aeecf36">
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-39673245-1', 'auto');
ga('send', 'pageview');
</script>
</head>
<body>
<div id="content-sans-footer">
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="container-fluid">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="http://www.7rack.info/"><span class=site-name>轨迹</span></a>
<div class="nav-collapse collapse">
<ul class="nav pull-right top-menu">
<li ><a href="http://www.7rack.info">Home</a></li>
<li ><a href="http://www.7rack.info/pages/about-me.html">About</a></li>
<li ><a href="http://www.7rack.info/categories.html">Categories</a></li>
<li ><a href="http://www.7rack.info/tags.html">Tags</a></li>
<li ><a href="http://www.7rack.info/archives.html">Archives</a></li>
<li><form class="navbar-search" action="http://www.7rack.info/search.html" onsubmit="return validateForm(this.elements['q'].value);"> <input type="text" class="search-query" placeholder="Search" name="q" id="tipue_search_input"></form></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row-fluid">
<div class="span1"></div>
<div class="span10">
<article>
<div class="row-fluid">
<header class="page-header span10 offset2">
<h1><a href="http://www.7rack.info/creating-kvm-guest-on-ubuntu.html"> Ubuntu上运行KVM创建虚拟机 </a></h1>
</header>
</div>
<div class="row-fluid">
<div class="span2 table-of-content">
<nav>
<h4>Contents</h4>
<div class="toc">
<ul>
<li><a href="#bioskvm">设置BIOS支持KVM</a></li>
<li><a href="#kvm">安装KVM</a></li>
<li><a href="#_1">设置网络</a></li>
<li><a href="#kvm-guest">创建KVM guest</a><ul>
<li><a href="#freebsd100">安装FreeBSD10.0</a></li>
<li><a href="#centos65">安装CentOS6.5</a></li>
</ul>
</li>
</ul>
</div>
</nav>
</div>
<div class="span8 article-content">
<h2 id="bioskvm">设置BIOS支持KVM<a class="headerlink" href="#bioskvm" title="Permanent link">¶</a></h2>
<p>一般来说在BIOS设置菜单里,选择Advanced Step → CPU Options,
以确认Intel Virtualization Technology 选项是否 Enabled。
开机进入系统后,可以通过以下命令检查系统处理器是否支持KVM:</p>
<div class="highlight"><pre>grep -E 'vmx|svm' /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid
</pre></div>
<p>如果有返回值,说明系统是支持KVM的。<code>vmx</code>功能标识指代Intel VT芯片,<code>svm</code>功能标识指代AMD-V芯片。</p>
<h2 id="kvm">安装KVM<a class="headerlink" href="#kvm" title="Permanent link">¶</a></h2>
<p>这里很简单:</p>
<div class="highlight"><pre>apt-get install kvm
</pre></div>
<h2 id="_1">设置网络<a class="headerlink" href="#_1" title="Permanent link">¶</a></h2>
<p>首先需安装bridge-utils:</p>
<div class="highlight"><pre>apt-get install bridge-utils
</pre></div>
<p>如果你的host主机安装了桌面环境,需要禁止<code>Network Manager</code>:</p>
<div class="highlight"><pre>update-rc.d network-manager disable
/etc/init.d/network-manager stop
</pre></div>
<p>编辑<code>/etc/network/interfaces</code>,像下面一样:</p>
<div class="highlight"><pre>auto lo
iface lo inet loopback
# The primary network interface
auto virbr0
iface virbr0 inet static
bridge_ports eth0
address 10.49.4.244
netmask 255.255.255.0
gateway 10.49.4.1
dns-nameservers 10.1.1.100
#如果是在dhcp的网络环境中,可用以下配置
#auto virbr0
#iface virbr0 inet dhcp
# bridge_ports eth0
</pre></div>
<p>重启networking服务,以激活virbr0网桥,并查看:</p>
<div class="highlight"><pre># /etc/init.d/networking restart
# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.265f1a9f1c6e no eth0
$ ifconfig
eth0 Link encap:以太网 硬件地址 d4:be:d9:99:0d:e5
inet6 地址: fe80::d6be:d9ff:fe99:de5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:15163805 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:323948 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:14043073032 (14.0 GB) 发送字节:159989689 (159.9 MB)
中断:20 Memory:e1a00000-e1a20000
virbr0 Link encap:以太网 硬件地址 26:5f:1a:9f:1c:6e
inet 地址:10.49.4.244 广播:10.49.4.255 掩码:255.255.255.0
inet6 地址: fe80::d6be:d9ff:fe99:de5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:14827415 错误:0 丢弃:31 过载:0 帧数:0
发送数据包:245653 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:13718846920 (13.7 GB) 发送字节:149494998 (149.4 MB)
</pre></div>
<h2 id="kvm-guest">创建KVM guest<a class="headerlink" href="#kvm-guest" title="Permanent link">¶</a></h2>
<h3 id="freebsd100">安装FreeBSD10.0<a class="headerlink" href="#freebsd100" title="Permanent link">¶</a></h3>
<ul>
<li>建立disk image(qcow2),使用qemu-img命令:</li>
</ul>
<div class="highlight"><pre> qemu-img create -f qcow2 ~/vm/image.qcow2 10G
</pre></div>
<ul>
<li>创建guest os:</li>
</ul>
<div class="highlight"><pre> kvm -smp <span class="m">4</span> -drive <span class="nv">file</span><span class="o">=</span>/home/xxx/vm/image.qcow2,if<span class="o">=</span>virtio -cdrom /tmp/FreeBSD-10.0-RELEASE-amd64-bootonly.iso -m <span class="m">1024</span> -nographic -curses -net nic,model<span class="o">=</span>e1000 -net tap -boot d
</pre></div>
<p>以上命令<code>-smp 4</code>设置4 CPUs(默认是1),<code>-m 1024</code>设置内存1024M(默认128M),<code>-nographic -curses</code>设置从serial console 安裝,<code>-net nic,model=e1000 -net tap</code>设置Guest OS 使用 e1000,直接bridge到virbr0。
在安装过程中选择static IP。</p>
<ul>
<li>安装完成后创建个脚本,用以快捷启动guest os:</li>
</ul>
<div class="highlight"><pre><span class="c">#! /bin/bash</span>
kvm -smp <span class="m">4</span> -drive <span class="nv">file</span><span class="o">=</span>/home/xxx/vm/freebsd.qcow2,if<span class="o">=</span>virtio <span class="se">\</span>
-m <span class="m">1024</span> -display none -daemonize<span class="se">\</span>
-net nic,model<span class="o">=</span>e1000 -net tap
</pre></div>
<p><code>-daemonize</code>使得guest os在初始后在后台运行,<code>virtio</code>提高了i/o 性能,概念上是半虚拟化 hypervisor 中位于设备之上的抽象层。</p>
<h3 id="centos65">安装CentOS6.5<a class="headerlink" href="#centos65" title="Permanent link">¶</a></h3>
<p>在文本模式下安装CentOS还是要多个步骤,通过实验使用<code>-curses</code>或者<code>-nographic</code>参数直接加载minimal.iso是没有成功。可通过<code>-append console=ttyS0</code>参数来重定向guest的console。</p>
<ul>
<li>获得启动kernel和initrd文件</li>
</ul>
<div class="highlight"><pre> mount /tmp/CentOS-6.5-x86_64-minimal.iso /mnt/ -o loop
</pre></div>
<ul>
<li>创建guest os</li>
</ul>
<div class="highlight"><pre> qemu-system-x86_64 -enable-kvm -m <span class="m">1024</span> -smp <span class="m">4</span> -hda vm/vm/centos6.5.qcow2 -cdrom /tmp/CentOS-6.5-x86_64-minimal.iso -nographic -append <span class="nv">console</span><span class="o">=</span>ttyS0 -kernel /mnt/isolinux/vmlinuz -initrd /mnt/isolinux/initrd.img -net nic,model<span class="o">=</span>e1000 -net tap -boot d
</pre></div>
<p>这样的text安装界面有些错位 囧 。可看下图<br/>
<a href="http://www.7rack.info/images/2014/03/centos6.5nographic.png"><img alt="screenshot of nographic" src="http://www.7rack.info/images/2014/03/centos6.5nographic.png"/></a></p>
<ul>
<li>创建启动脚本
安装完成后重启,下次开机使用下面的脚本启动。</li>
</ul>
<div class="highlight"><pre><span class="c">#! /bin/bash</span>
qemu-system-x86_64 -enable-kvm -m <span class="m">1024</span> -smp <span class="m">4</span> <span class="se">\</span>
/home/xxx/vm/centos6.5.qcow2 -nographic -daemonize <span class="se">\</span>
-net nic,model<span class="o">=</span>e1000 -net tap
</pre></div>
<p>最后可以看看网络的情况:</p>
<div class="highlight"><pre># brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.0ede79ae20ca no eth0
tap0
tap1
# ifconfig -a
eth0 Link encap:以太网 硬件地址 d4:be:d9:99:0d:e5
inet6 地址: fe80::d6be:d9ff:fe99:de5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:15308150 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:368549 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:14169794107 (14.1 GB) 发送字节:172651372 (172.6 MB)
中断:20 Memory:e1a00000-e1a20000
tap0 Link encap:以太网 硬件地址 2e:5d:7b:be:b8:18
inet6 地址: fe80::2c5d:7bff:febe:b818/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:66 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:6801 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:500
接收字节:11671 (11.6 KB) 发送字节:6293612 (6.2 MB)
tap1 Link encap:以太网 硬件地址 0e:de:79:ae:20:ca
inet6 地址: fe80::cde:79ff:feae:20ca/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:96 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:4239 错误:0 丢弃:36 过载:0 载波:0
碰撞:0 发送队列长度:500
接收字节:11186 (11.1 KB) 发送字节:3879188 (3.8 MB)
virbr0 Link encap:以太网 硬件地址 0e:de:79:ae:20:ca
inet 地址:10.49.4.244 广播:10.49.4.255 掩码:255.255.255.0
inet6 地址: fe80::d6be:d9ff:fe99:de5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:14970219 错误:0 丢弃:31 过载:0 帧数:0
发送数据包:287199 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:13842638850 (13.8 GB) 发送字节:161783854 (161.7 MB)
</pre></div>
<p>下次用该学学使用<code>virt-manager</code>来管理虚拟机。</p>
<section>
<p id="post-share-links">
Share on:
<a href="http://twitter.com/home?status=Ubuntu%E4%B8%8A%E8%BF%90%E8%A1%8CKVM%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9F%E6%9C%BA%20http%3A//www.7rack.info/creating-kvm-guest-on-ubuntu.html" target="_blank" title="Share on Twitter">Twitter</a>
❄
<a href="http://www.facebook.com/sharer/sharer.php?s=100&p%5Burl%5D=http%3A//www.7rack.info/creating-kvm-guest-on-ubuntu.html" target="_blank" title="Share on Facebook">Facebook</a>
❄
<a href="https://plus.google.com/share?url=http%3A//www.7rack.info/creating-kvm-guest-on-ubuntu.html" target="_blank" title="Share on Google Plus">Google+</a>
❄
<a href="mailto:?subject=Ubuntu%E4%B8%8A%E8%BF%90%E8%A1%8CKVM%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9F%E6%9C%BA&body=http%3A//www.7rack.info/creating-kvm-guest-on-ubuntu.html" target="_blank" title="Share via Email">Email</a>
</p>
</section>
<section>
<div class="accordion" id="accordion2">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle disqus-comment-count" data-toggle="collapse" data-parent="#accordion2"
href="http://www.7rack.info/creating-kvm-guest-on-ubuntu.html#disqus_thread">
Comments
</a>
</div>
<div id="disqus_thread" class="accordion-body collapse">
<div class="accordion-inner">
<div class="comments">
<div id="disqus_thread"></div>
<script type="text/javascript">
var disqus_shortname = '7rack';
var disqus_identifier = 'http://www.7rack.info/creating-kvm-guest-on-ubuntu.html';
var disqus_url = 'http://www.7rack.info/creating-kvm-guest-on-ubuntu.html';
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
</div>
</div>
</div>
</div>
</div>
</section>
<hr/>
<section>
<h2>Related Posts</h2>
<ul class="related-posts-list">
<li><a href="http://www.7rack.info/manual-upgrade-firefox.html" title="firefox手动升级">firefox手动升级</a></li>
<li><a href="http://www.7rack.info/loading-freebsd-with-grub.html" title="grub引导freebsd">grub引导freebsd</a></li>
<li><a href="http://www.7rack.info/sound-driver-problem-on-freebsd.html" title="解决FreeBSD下声卡驱动问题">解决FreeBSD下声卡驱动问题</a></li>
</ul>
<hr />
</section>
<aside>
<nav>
<ul class="articles-timeline">
<li class="previous-article">« <a href="http://www.7rack.info/issues-of-Feb.html" title="Previous: 问题集锦(二月)">问题集锦(二月)</a></li>
<li class="next-article"><a href="http://www.7rack.info/devstack-installation-and-create-instance-with-cli.html" title="Next: DevStack安装并使用CLI创建实例">DevStack安装并使用CLI创建实例</a> »</li>
</ul>
</nav>
</aside>
</div>
<section>
<div class="span2" style="float:right;font-size:0.9em;">
<h4>Published</h4>
<time pubdate="pubdate" datetime="2014-03-23T22:30:00+08:00"> 3 23, 2014</time>
<h4>Category</h4>
<a class="category-link" href="http://www.7rack.info/categories.html#virtualization-ref">Virtualization</a>
<h4>Tags</h4>
<ul class="list-of-tags tags-in-article">
<li><a href="http://www.7rack.info/tags.html#centos-ref">CentOS
<span>1</span>
</a></li>
<li><a href="http://www.7rack.info/tags.html#freebsd-ref">FreeBSD
<span>4</span>
</a></li>
<li><a href="http://www.7rack.info/tags.html#kvm-ref">KVM
<span>1</span>
</a></li>
<li><a href="http://www.7rack.info/tags.html#ubuntu-ref">Ubuntu
<span>1</span>
</a></li>
</ul>
<h4>Contact</h4>
<a href="mailto:vimxiang@gmail.com" title="My Email Address" class="sidebar-social-links" target="_blank">
<i class="fa fa-envelope sidebar-social-links"></i></a>
<a href="http://github.com/7rack" title="My Github Profile" class="sidebar-social-links" target="_blank">
<i class="fa fa-github sidebar-social-links"></i></a>
</div>
</section>
</div>
</article>
</div>
<div class="span1"></div>
</div>
</div>
<div id="push"></div>
</div>
<footer>
<div id="footer">
<ul class="footer-content">
<li class="elegant-power">Powered by <a href="http://getpelican.com/" title="Pelican Home Page">Pelican</a>. Theme: <a href="http://oncrashreboot.com/pelican-elegant" title="Theme Elegant Home Page">Elegant</a> by <a href="http://oncrashreboot.com" title="Talha Mansoor Home Page">Talha Mansoor</a></li>
</ul>
</div>
</footer> <script src="http://code.jquery.com/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
<script>
function validateForm(query)
{
return (query.length > 0);
}
</script>
<script type="text/javascript">
var disqus_shortname = '7rack';
(function () {
var s = document.createElement('script'); s.async = true;
s.type = 'text/javascript';
s.src = '//' + disqus_shortname + '.disqus.com/count.js';
(document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
}());
</script>
<script language="javascript" type="text/javascript">
function uncollapse() {
if (window.location.hash.match(/^#comment-\d+$/)) {
$('#disqus_thread').collapse('show');
}
}
</script>
<script type="text/javascript" language="JavaScript">
uncollapse();
window.onhashchange=function(){
if (window.location.hash.match(/^#comment-\d+$/))
window.location.reload(true);
}
</script>
<script>
$('#disqus_thread').on('shown', function () {
var link = document.getElementsByClassName('accordion-toggle');
var old_innerHTML = link[0].innerHTML;
$(link[0]).fadeOut(500, function() {
$(this).text('Click here to hide comments').fadeIn(500);
});
$('#disqus_thread').on('hidden', function () {
$(link[0]).fadeOut(500, function() {
$(this).text(old_innerHTML).fadeIn(500);
});
})
})
</script>
</body>
<!-- Theme: Elegant built for Pelican
License : http://oncrashreboot.com/pelican-elegant -->
</html>