Agenda: lab-libvirt-cloning.en.htm

File lab-libvirt-cloning.en.htm, 21.5 KB (added by admin, 5 years ago)
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2<html xmlns="http://www.w3.org/1999/xhtml">
3<head>
4  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5  <meta http-equiv="Content-Style-Type" content="text/css" />
6  <meta name="generator" content="pandoc" />
7  <title>Creating multiple VMs from a single VM</title>
8  <style type="text/css">code{white-space: pre;}</style>
9  <link rel="stylesheet" href="http://wsnoc.nsrc.org/css/style.css" type="text/css" />
10</head>
11<body>
12<div id="header">
13<h1 class="title">Creating multiple VMs from a single VM</h1>
14</div>
15<div id="TOC">
16<ul>
17<li><a href="#create-a-gold-image-with-your-public-key-included"><span class="toc-section-number">1</span> Create a &quot;Gold&quot; image with your public key included</a><ul>
18<li><a href="#for-windows-users"><span class="toc-section-number">1.1</span> For Windows users</a></li>
19<li><a href="#for-linux-unix-os-x-users"><span class="toc-section-number">1.2</span> For Linux / Unix / OS X users</a></li>
20<li><a href="#use-vmbuilder-to-create-a-gold-image-for-workshop-student-vms"><span class="toc-section-number">1.3</span> Use vmbuilder to create a Gold image for workshop student vms</a></li>
21</ul></li>
22<li><a href="#updating-your-gold-vm"><span class="toc-section-number">2</span> Updating your Gold VM</a></li>
23<li><a href="#manually-clone-your-gold-vm"><span class="toc-section-number">3</span> Manually clone your gold VM</a></li>
24<li><a href="#clone-multiple-vms-with-a-single-command"><span class="toc-section-number">4</span> Clone multiple VMs with a single command</a></li>
25<li><a href="#control-multiple-vms-from-the-command-line"><span class="toc-section-number">5</span> Control multiple VMs from the command line</a></li>
26<li><a href="#optional-exercise---ssh-agent-forwarding"><span class="toc-section-number">6</span> Optional exercise - SSH Agent forwarding</a><ul>
27<li><a href="#for-linux-unix-os-x"><span class="toc-section-number">6.1</span> For Linux / Unix / OS X</a></li>
28<li><a href="#for-windows"><span class="toc-section-number">6.2</span> For Windows</a></li>
29</ul></li>
30<li><a href="#use-ssh-on-s1.ws.nsrc.org-to-run-a-command-across-multiple-vms"><span class="toc-section-number">7</span> Use SSH on s1.ws.nsrc.org to run a command across multiple VMs</a></li>
31</ul>
32</div>
33<h1 id="create-a-gold-image-with-your-public-key-included"><a href="#create-a-gold-image-with-your-public-key-included"><span class="header-section-number">1</span> Create a &quot;Gold&quot; image with your public key included</a></h1>
34<p>To get started Connect to your workshop server as the &quot;nsrc&quot; user. Don't become root except where indicated.</p>
35<p>To do this we need to update the authorized_keys file that vmbuilder uses when building a new virtual machine. We will place your public key in a directory on the nsrc user account. When you create the directory please use your name so that you do not clash with other users doing this exercise:</p>
36<pre><code>cd
37mkdir &lt;YOURNAME&gt;</code></pre>
38<p>Copy your public key to the /home/nsrc/<YOURNAME> directory. Use the instructions below for the platform on your laptop.</p>
39<h2 id="for-windows-users"><a href="#for-windows-users"><span class="header-section-number">1.1</span> For Windows users</a></h2>
40<p>Open the psftp.exe program</p>
41<pre><code>psftp&gt; open s1.ws.nsrc.org
42login as: nsrc
43nsrc@s1.ws.nsrc.org&#39;s password: &lt;usual one&gt;
44Remote working directory is /home/nsrc
45psftp&gt;cd &lt;YOURNAME&gt;
46Remote working directory is /home/nsrc/&lt;YOURNAME&gt;
47psftp&gt; put id_rsa.pub
48local:id_rsa.pub =&gt; remote:/home/nsrc/&lt;YOURNAME&gt;id_rsa.pub
49psftp&gt; quit</code></pre>
50<p>Your public ssh key is now in the /home/nsrc/<YOURNAME> directory on your workshop server.</p>
51<p>Now we need to fix the key's format as it is not compatible with the SSH server format on Linux and Unix.</p>
52<p>Open putty.exe and make a connection to s1.ws.nsrc.org as the user nsrc. Once you have done this do:</p>
53<pre><code>cd &lt;YOURNAME&gt;
54ssh-keygen -i -f id_rsa.pub &gt;&gt; id_rsa.pub.new</code></pre>
55<p>Note that we use a different name for the resultant public key.</p>
56<p>Now that your public key is in the correct format you can add it to the authorized_keys file that vmbuilder uses to create a new virtual machine.</p>
57<pre><code>sudo -s
58cat id_rsa.pub.new &gt;&gt; /etc/vmbuilder/misc/authorized_keys
59exit</code></pre>
60<p>That's it. Your public key is now in the correct location for vmbuilder.</p>
61<h2 id="for-linux-unix-os-x-users"><a href="#for-linux-unix-os-x-users"><span class="header-section-number">1.2</span> For Linux / Unix / OS X users</a></h2>
62<p>Open a shell (sometimes called terminal) on your laptop. Inside the shell type the command:</p>
63<pre><code>cd
64cat .ssh/id_rsa.pub | ssh root@s1.ws.nsrc.org &#39; cat &gt;&gt; /etc/vmbuilder/misc/authorized_keys&#39;</code></pre>
65<p>If you don't understand what this command is doing please ask one of your instructors.</p>
66<h2 id="use-vmbuilder-to-create-a-gold-image-for-workshop-student-vms"><a href="#use-vmbuilder-to-create-a-gold-image-for-workshop-student-vms"><span class="header-section-number">1.3</span> Use vmbuilder to create a Gold image for workshop student vms</a></h2>
67<p>Be sure you log back in to s1.ws.nsrc.org as user nsrc for these steps.</p>
68<p>Now we will generate a single virtual machine that we will duplicate multiple times that can be used for students in a workshop. To do this we will use vmbuilder like you have done previously.</p>
69<p>Everyone in your group will ssh into the server and build a VM; it's fine for you to do them at the same time. Use the following name for your initial VM:</p>
70<ul>
71<li>1st person in the group: gold.ws.nsrc.org</li>
72<li>2nd person in the group: gold2.ws.nsrc.org</li>
73<li>3rd person in the group: gold3.ws.nsrc.org</li>
74<li>...etc</li>
75</ul>
76<p>To build your VM, run the following command. Agree amongst yourselves which image you will each build. If you are not the first person in the group then modify the two places where &quot;gold.ws.nsrc.org&quot; appears.</p>
77<pre><code>sudo vmbuilder kvm ubuntu --hostname gold.ws.nsrc.org --mem 512 --debug \
78    --rootsize 20480 --dest /var/lib/libvirt/images/gold.ws.nsrc.org</code></pre>
79<p>This builds a VM which will initially have 512MB RAM allocated when it runs, and a root disk which can grow up to 20GB.</p>
80<p>Check that no errors are shown at the end of the build. You should see something like:</p>
81<pre><code>...
822013-11-11 10:30:21,390 DEBUG   : Calling deploy method in VMBuilder.plugins.ubuntu.distro plugin.
832013-11-11 10:30:21,391 DEBUG   : No such method
842013-11-11 10:30:21,391 DEBUG   : Calling deploy method in context plugin VMBuilder.plugins.kvm.vm.
852013-11-11 10:30:21,391 DEBUG   : [&#39;rm&#39;, &#39;-rf&#39;, &#39;--one-file-system&#39;, &#39;/tmp/tmpjC8QLO&#39;]</code></pre>
86<p>If you have three people in your group, then you would end up with the following three new VM image files:</p>
87<pre><code>/var/lib/libvirt/images/gold.ws.nsrc.org
88/var/lib/libvirt/images/gold2.ws.nsrc.org
89/var/lib/libvirt/images/gold3.ws.nsrc.org</code></pre>
90<p>Verify your VM is available for use:</p>
91<pre><code>virsh list --all</code></pre>
92<p>You might see something like:</p>
93<pre><code> Id Name                 State
94----------------------------------
95  - gold.ws.nsrc.org     shut off
96  - gold2.ws.nsrc.org    shut off
97  - gold3.ws.nsrc.org    shut off
98  - noc.ws.nsrc.org      shut off</code></pre>
99<h1 id="updating-your-gold-vm"><a href="#updating-your-gold-vm"><span class="header-section-number">2</span> Updating your Gold VM</a></h1>
100<p>Start the VM that you built. Remember to change &quot;gold.ws.nsrc.org&quot; to the name of your VM.</p>
101<pre><code>virsh start gold.ws.nsrc.org
102virsh list         # show running VMs</code></pre>
103<p>If you do not see your VM running you can ask for help to troubleshoot this.</p>
104<p>Now we want to attach to our VM via the emulated serial console. We don't use ssh to connect at first as we do not know the IP address that has been assigned to your new gold VM. Remeber to use your VM's name below:</p>
105<pre><code>virsh console gold.ws.nsrc.org</code></pre>
106<p>Hit Enter a few times. You should get a login prompt. Log in using:</p>
107<pre><code>user: sysadm
108password: &lt;Given in Class&gt;</code></pre>
109<p>View the VM's IP address and verify network connectivity is working:</p>
110<pre><code>ifconfig -a
111ping 8.8.8.8
112ping nsrc.org</code></pre>
113<p>Now let's add a package that was not included by the vmbuilder process. You may realize after building a Gold VM that you have some specific settings or items that you want all the duplicated VMs to have that will be created from your gold VM image.</p>
114<p>In this case let's install nmap (Network MAPper). A useful network forensic tool and do an &quot;apt-get update&quot; to make sure our Ubuntu package database is up to date and an upgrade to make sure all packages are up to date:</p>
115<pre><code>sudo apt-get update
116sudo apt-get upgrade
117sudo apt-get install nmap</code></pre>
118<p>You can test that nmap is working:</p>
119<pre><code>nmap localhost</code></pre>
120<p>At this point your gold VM is in a state that we would like to freeze and use for multiple VMs that will be created from this image.</p>
121<p>Exit from the gold image by typing:</p>
122<pre><code>ctrl-]</code></pre>
123<p>This drops you back to the s1.ws.nsrc.org prompt. Now do:</p>
124<pre><code>virsh list --all</code></pre>
125<p>You can see your gold image running. Let's shut it down via virsh (remember to use your VM's name):</p>
126<pre><code>virsh shutdown gold.ws.nsrc.org</code></pre>
127<p>Verify your VM has shut off:</p>
128<pre><code>virsh list --all</code></pre>
129<h1 id="manually-clone-your-gold-vm"><a href="#manually-clone-your-gold-vm"><span class="header-section-number">3</span> Manually clone your gold VM</a></h1>
130<p>First, let's update our workshop-kit git repository on s1.ws.nsrc.org.</p>
131<pre><code>cd
132cd workshop-kit
133git pull http://trainers@wsnoc.nsrc.org:8000/nsrc/workshop-kit.git</code></pre>
134<p>When you installed the workshop-kit Git repository on s1.ws.nsrc.org one of the directories that was installed includes some useful scripts for cloning VMs.</p>
135<pre><code>cd scripts
136ls</code></pre>
137<p>You should see the file clonevm.sh. This is a shell script to help simplify the process of duplicating a VM from an initial image (our gold image). Try running the script with no options:</p>
138<pre><code>./clonevm.sh</code></pre>
139<p>You should see:</p>
140<pre><code>Usage: [BRIDGE=brX] ./clonevm.sh &lt;source&gt; &lt;clone-as&gt; [target-dir]
141Then use &#39;virsh start &lt;clone-as&gt;&#39; to run it</code></pre>
142<p>Let's use this script to create a new VM cloned from the gold image you just created. For this exercise we are going to split in to three groups per workshop server. This is important to ensure you do not overwrite your neighbor's work. Here are the groups:</p>
143<pre><code>gold  ==&gt; vm1-vm10
144gold2 ==&gt; vm11-vm20
145gold3 ==&gt; vm21-vm30</code></pre>
146<p>To start you are going to manually create two new VMs using the clonevm.sh script, like this:</p>
147<pre><code>gold creates vm1.ws.nsrc.org and vm2.ws.nsrc.org
148gold2 creates vm11.ws.nsrc.org and vm12.ws.nsrc.org
149gold3 creates vm21.ws.nsrc.org and vm22.ws.nsrc.org</code></pre>
150<p>Here is what each person should now do:</p>
151<p>For the gold VM:</p>
152<pre><code>./clonevm.sh gold.ws.nsrc.org vm1.ws.nsrc.org
153./clonevm.sh gold.ws.nsrc.org vm2.ws.nsrc.org</code></pre>
154<p>For the gold2 VM:</p>
155<pre><code>./clonevm.sh gold2.ws.nsrc.org vm11.ws.nsrc.org
156./clonevm.sh gold2.ws.nsrc.org vm12.ws.nsrc.org</code></pre>
157<p>For the gold3 VM:</p>
158<pre><code>./clonevm.sh gold3.ws.nsrc.org vm21.ws.nsrc.org
159./clonevm.sh gold3.ws.nsrc.org vm22.ws.nsrc.org</code></pre>
160<p>What you might notice is how fast this is. Each of you now have two new VMs that are duplicate images of your initial gold VM. View what VMs are available:</p>
161<pre><code>virsh list --all</code></pre>
162<p>You should see something like:</p>
163<pre><code> Id Name                 State
164----------------------------------
165  - gold.ws.nsrc.org     shut off
166  - gold2.ws.nsrc.org    shut off
167  - gold3.ws.nsrc.org    shut off
168  - noc.ws.nsrc.org      shut off
169  - vm1.ws.nsrc.org      shut off
170  - vm11.ws.nsrc.org     shut off
171  - vm12.ws.nsrc.org     shut off
172  - vm2.ws.nsrc.org      shut off
173  - vm21.ws.nsrc.org     shut off
174  - vm22.ws.nsrc.org     shut off</code></pre>
175<p>Start your two new VMs now using the &quot;virsh start&quot; command. Hint, for the gold VM user &quot;virst start vm1.ws.nsrc.org&quot; and so on. Once you are all done you should see something like:</p>
176<pre><code> Id Name                 State
177----------------------------------
178  5 vm1.ws.nsrc.org      running
179  6 vm2.ws.nsrc.org      running
180  7 vm11.ws.nsrc.org     running
181  8 vm12.ws.nsrc.org     running
182  9 vm21.ws.nsrc.org     running
183 10 vm22.ws.nsrc.org     running
184  - gold.ws.nsrc.org     shut off
185  - gold2.ws.nsrc.org    shut off
186  - gold3.ws.nsrc.org    shut off
187  - noc.ws.nsrc.org      shut off</code></pre>
188<p>Now try pinging some of the new VMs:</p>
189<pre><code>ping vm1.ws.nsrc.org
190ping vm11.ws.nsrc.org
191ping vm21.ws.nsrc.org</code></pre>
192<p>(If you don't have three members in your group, then just ping what is available).</p>
193<p>Do you notice something? The DNS already has entries for each of these VMs. This is on purpose. Furthermore, the VMs all have reasonable IP addresses. How did we do this? We will explain the details at the end of this exercise.</p>
194<p>Use ssh to connect to your two new VM images and to verify that things look OK. You can ssh directly from your laptop to the vm, or you can use the command line ssh logged in as the nsrc user on s1.ws.nsrc.org.</p>
195<p>Once you are logged in on your new VMs let's do this:</p>
196<pre><code>ifconfig -a
197ping 8.8.8.8
198ping nsrc.org
199ping s1.ws.nsrc.org
200ping vm1.ws.nsrc.org
201nmap s1.ws.nsrc.org</code></pre>
202<p>Remember we installed nmap on the gold image? That's why nmap is now installed on your VMs.</p>
203<p>Now log out of this vm and be sure you are logged in to s1.ws.nsrc.org as the nsrc user:</p>
204<h1 id="clone-multiple-vms-with-a-single-command"><a href="#clone-multiple-vms-with-a-single-command"><span class="header-section-number">4</span> Clone multiple VMs with a single command</a></h1>
205<p>Now we want you to create the following VMs depending on your gold VM image. Here are the machine you need to create:</p>
206<pre><code>gold.ws.nsrc.org ==&gt; vm3-vm10
207gold2.ws.nsrc.org ==&gt; vm13-vm20
208gold3.ws.nsrc.org ==&gt; vm23-vm30</code></pre>
209<p>Note we are not creating the first two VMs in each range as we've already done this manually.</p>
210<p>We can use the power of the command line and a for statement to create a programmatic loop with variables to create these VMs. For example, to create sample1.ws.nsrc.org to sample30.ws.nsrc.org from a sample.ws.nsrc.org image you could do (DON'T DO THIS!) on the command line:</p>
211<pre><code>for i in $(seq 1 1 30); do ./clonevm.sh sample.ws.nsrc.org sample$i.ws.nsrc.org; done</code></pre>
212<p>This assumes clonevm.sh is in the directory from where you are running this command. Below are the commands each user should run for each gold image to duplicate the remaining 8 VMs we would like you to create:</p>
213<p>For the gold VM:</p>
214<pre><code>cd
215cd workshop-kit/scripts
216for i in $(seq 3 1 10); do ./clonevm.sh gold.ws.nsrc.org vm$i.ws.nsrc.org; done</code></pre>
217<p>For the gold2 VM:</p>
218<pre><code>cd
219cd workshop-kit/scripts
220for i in $(seq 13 1 20); do ./clonevm.sh gold2.ws.nsrc.org vm$i.ws.nsrc.org; done</code></pre>
221<p>For the gold3 VM:</p>
222<pre><code>cd
223cd workshop-kit/scripts
224for i in $(seq 23 1 30); do ./clonevm.sh gold3.ws.nsrc.org vm$i.ws.nsrc.org; done</code></pre>
225<p>Now let's see what VMs are available to run:</p>
226<pre><code>virsh list --all</code></pre>
227<p>Wow! You've just created multiple and fully functioning Linux servers using a single command.</p>
228<h1 id="control-multiple-vms-from-the-command-line"><a href="#control-multiple-vms-from-the-command-line"><span class="header-section-number">5</span> Control multiple VMs from the command line</a></h1>
229<p>At this point starting each VM manually using &quot;virsh start&quot; will quickly become tedious. Let's use the same concept and do this with a single command. We'll include the first two VMs you created in case one of them is not running. It is fine to do virsh start for a machine that's already started:</p>
230<p>For the gold VM:</p>
231<pre><code>for i in $(seq 1 1 10); do virsh start vm$i.ws.nsrc.org; done</code></pre>
232<p>For the gold2 VM:</p>
233<pre><code>for i in $(seq 11 1 20); do virsh start vm$i.ws.nsrc.org; done</code></pre>
234<p>For the gold3 VM:</p>
235<pre><code>for i in $(seq 21 1 30); do virsh start vm$i.ws.nsrc.org; done</code></pre>
236<p>Once you have all the VMs up and running do:</p>
237<pre><code>virsh list --all</code></pre>
238<p>What IP addresses do these VMs have?</p>
239<pre><code>for i in $(seq 1 1 30); do dig +short vm$i.ws.nsrc.org; done</code></pre>
240<p>Are you beginng to see how &quot;for&quot; works?</p>
241<p>Try pinging each of these addresses to see if your VMs are up and running. If you don't have all 30 VMs see ify can adjust the sample command below to just ping the VMs you are using:</p>
242<pre><code>for i in $(seq 1 1 30); do ping -c 1 -W 1 vm$i.ws.nsrc.org; done</code></pre>
243<p>Remember you can scroll back in your terminal windows to see results that scroll off the visible screen.</p>
244<p>Can you figure out how to write a single command that would shutdown each of your running VMs using the &quot;virsh shutdown&quot; command? Of so, do this now.</p>
245<h1 id="optional-exercise---ssh-agent-forwarding"><a href="#optional-exercise---ssh-agent-forwarding"><span class="header-section-number">6</span> Optional exercise - SSH Agent forwarding</a></h1>
246<p>When you connect as the user nsrc to your workshop server (s1.ws.nsrc.org) you connect using your private key / public key authentication. To be able to connect to the VMs running on s1.ws.nsrc.org using your public/private key pair you need to enable SSH Agent forwarding so that your key is available for use in your session as user nsrc (or root) on s1.ws.nsrc.org.</p>
247<h2 id="for-linux-unix-os-x"><a href="#for-linux-unix-os-x"><span class="header-section-number">6.1</span> For Linux / Unix / OS X</a></h2>
248<p>From the command line:</p>
249<pre><code>ssh -o ForwardAgent=yes nsrc@s1.ws.nsrc.org</code></pre>
250<p>To make this permanent:</p>
251<pre><code>cd
252editor .ssh/config</code></pre>
253<p>and add these lines to the file:</p>
254<pre><code>Host *
255    ForwardAgent=yes</code></pre>
256<p>But, be careful as this will forward your key to every host you connect to. You could do:</p>
257<pre><code>Host s1.ws.nsrc.org
258    ForwardAgent=yes</code></pre>
259<p>If you do this, then when you are logged in on s1.ws.nsrc.org you can use keys to connect to the VMs. From a Linux / Unix / OS X laptop, however, you can just connect directly to the VMs if you wish.</p>
260<h2 id="for-windows"><a href="#for-windows"><span class="header-section-number">6.2</span> For Windows</a></h2>
261<ul>
262<li>Open putty.exe</li>
263<li>If you have a saved session for connection to s1.ws.nsrc.org Load this (if you don't create one now)</li>
264<li>In the left-hand column go down to SSH, click on the &quot;+&quot; symbol and select Auth</li>
265<li>Check the box that says &quot;Allow agent forwarding&quot;</li>
266<li>In the left-hand column scroll back to the top and click on Session</li>
267<li>Be sure to click &quot;Save&quot; to save these settings for the next time.</li>
268<li>Now click on Open</li>
269</ul>
270<p>From now on SSH Agent forwarding is enabled for future SSH connection.</p>
271<h1 id="use-ssh-on-s1.ws.nsrc.org-to-run-a-command-across-multiple-vms"><a href="#use-ssh-on-s1.ws.nsrc.org-to-run-a-command-across-multiple-vms"><span class="header-section-number">7</span> Use SSH on s1.ws.nsrc.org to run a command across multiple VMs</a></h1>
272<p>Log in on s1.ws.nsrc.org the user nsrc. Be sure you do this with SSH Agent forwarding enabled.</p>
273<p>Now start your VMs.</p>
274<p>For the gold VM:</p>
275<pre><code>for i in $(seq 1 1 10); do virsh start vm$i.ws.nsrc.org; done</code></pre>
276<p>For the gold2 VM:</p>
277<pre><code>for i in $(seq 11 1 20); do virsh start vm$i.ws.nsrc.org; done</code></pre>
278<p>For the gold3 VM:</p>
279<pre><code>for i in $(seq 21 1 30); do virsh start vm$i.ws.nsrc.org; done</code></pre>
280<p>Since your SSH key is available you should be able to ssh to each VM using your private key's passphrase. But, we don't want to type this each time so we'll enable the ssh agent on s1.ws.nsrc.org:</p>
281<pre><code>ssh-add </code></pre>
282<p>Now try running a command on your VMs using SSH. Note, you <em>do not</em> need to log in on each VM. You can issue a command via SSH by using SSH in this form:</p>
283<pre><code>ssh user@remote-host command</code></pre>
284<p>So, to issue the command hostname on vm1.ws.nsrc.org without having to log in and log back out you can do:</p>
285<pre><code>ssh sysadm@vm1.ws.nsrc.org hostname</code></pre>
286<p>Give that a try.</p>
287<p>Now let's do this across all 10 of your VMs for each gold group. Can you figure out how to do this without looking at the example below?</p>
288<p>The first time you connect you'll have to accept each VM's public key, so this will not be all that impressive. Run the command twice. The second time will be much faster and give you an idea of how useful this could be when administering multiple VMs:</p>
289<p>For the gold VM:</p>
290<pre><code>for i in $(seq 1 1 10); do ssh sysadm@vm$i.ws.nsrc.org hostname; done</code></pre>
291<p>For the gold2 VM:</p>
292<pre><code>for i in $(seq 11 1 20); do ssh sysadm@vm$i.ws.nsrc.org hostname; done</code></pre>
293<p>For the gold3 VM:</p>
294<pre><code>for i in $(seq 21 1 30); do ssh sysadm@vm$i.ws.nsrc.org hostname; done</code></pre>
295<p>Now we'll explain some of the details behind how things were built.</p>
296</body>
297</html>