<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>秋天的博客</title>
	<atom:link href="http://www.fallday.org/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fallday.org</link>
	<description>虚拟主机/VPS/云计算实践</description>
	<lastBuildDate>Wed, 02 May 2012 07:18:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Installing OpenStack Essex (2012.1) on Ubuntu 12.04 (“Precise Pangolin”) (转载)</title>
		<link>http://www.fallday.org/archives/857</link>
		<comments>http://www.fallday.org/archives/857#comments</comments>
		<pubDate>Wed, 02 May 2012 07:11:27 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[openstack]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=857</guid>
		<description><![CDATA[原文地址： http://www.hastexo.com/resources/docs/installing-openstack-essex-20121-ubuntu-1204-precise-pangolin by Martin Loschwitz this manual explains how to install OpenStack Essex (Version 2012.1) on Ubuntu 12.04 (Beta). If you want to know more about why I wrote this text, please refer to the corresponding blog post. PLEASE NOTE: This document deals with the virtualization part of OpenStack only; OpenStack Swift isn&#8217;t discussed as [...]]]></description>
			<content:encoded><![CDATA[<p>原文地址： http://www.hastexo.com/resources/docs/installing-openstack-essex-20121-ubuntu-1204-precise-pangolin</p>
<p><strong>by <a href="http://www.hastexo.com/who/martin">Martin Loschwitz</a></strong></p>
<p>this manual explains how to install OpenStack Essex (Version 2012.1) on Ubuntu 12.04 (Beta). If you want to know more about why I wrote this text, please refer to the corresponding <a href="http://www.hastexo.com/blogs/martin/2012/03/26/how-install-openstack-ubuntu-1204">blog post</a>.</p>
<p><strong>PLEASE NOTE</strong>: This document deals with the virtualization part of OpenStack only; OpenStack Swift isn&#8217;t discussed as it&#8217;s not necessary for this part of the setup (if you are looking for Swift installation instructions, take a look at the <a href="http://cssoss.wordpress.com/" target="_blank">CSS OpenStack Beginner&#8217;s Guide v2.0</a> where Swift installation is discussed with all necessary details). This text also does not discuss Quantum (yet) but might well be adapted to do so later.</p>
<p><strong>Prerequisites</strong>: Ubuntu 12.04 as of April 8th, 2012 with all package updates installed. I&#8217;m using the stock OpenStack packages as delivered by Ubuntu. This howto assumes that all relevant OpenStack services are installed on the same machine; in order to add more computing nodes, install the OpenStack nova components on these nodes and adapt <em>/etc/nova/nova.conf</em> accordingly. The machine I created this setup on has two network interfaces, <em>eth0</em> and <em>eth1</em>. Last but not least, I&#8217;m assuming that you are logged in as <em>root</em>.</p>
<h1><span id="more-857"></span>Step 1: Prepare your System</h1>
<div>Submitted by martin on Fri, 2012-03-23 20:22 GMT</div>
<p>Install NTP by issuing this command on the command line:</p>
<p><code>apt-get install ntp</code></p>
<p>Then, open <em>/etc/ntp.conf</em> in your favourite editor and add these lines:</p>
<p><code>server ntp.ubuntu.com iburst<br />
server 127.127.1.0<br />
fudge 127.127.1.0 stratum 10</code></p>
<p>Restart NTP by issuing the command</p>
<p><code>service ntp restart</code></p>
<p>to finish this part of the installation. Next, install the tgt target, which features an iscsi target (we&#8217;ll need it for nova-volume):</p>
<p><code>apt-get install tgt</code></p>
<p>Then start it with</p>
<p><code>service tgt start</code></p>
<p>Given that we&#8217;ll be running nova-compute on this machine as well, we&#8217;ll also need the openiscsi-client. Install it with:</p>
<p><code>apt-get install open-iscsi open-iscsi-utils</code></p>
<p>Next, we need to make sure that our network is working as expected. As pointed out earlier, the machine we&#8217;re doing this on has two network interfaces, <em>eth0</em> and <em>eth1</em>. <em>eth0</em> is the machine&#8217;s link to the outside world, <em>eth1</em> is the interface we&#8217;ll be using for our virtual machines. We&#8217;ll also make nova bridge clients via <em>eth0</em> into the internet. To achieve this kind of setup, first create the according network configuration in <em>/etc/network/interfaces</em> (assuming that you are not using NetworkManager). An example could look like this:</p>
<p><code>auto lo<br />
iface lo inet loopback</code></p>
<p><code>auto eth0<br />
iface eth0 inet static<br />
address 10.42.0.6<br />
network 10.42.0.0<br />
netmask 255.255.255.0<br />
broadcast 10.42.0.255<br />
gateway 10.42.0.1</code></p>
<p><code>auto eth1<br />
iface eth1 inet static<br />
address 192.168.22.1<br />
network 192.168.22.0<br />
netmask 255.255.255.0<br />
broadcast 192.168.22.255</code></p>
<p>As you can see, the “public” network here is 10.42.0.0/24 while the “private” network (within which our VMs will be residing) is 192.168.22.0/24. This machine&#8217;s IP address in the public network is 10.42.0.6 and we&#8217;ll be using this IP in configuration files later on (except for when connecting to MySQL, which we&#8217;ll by connecting to 127.0.0.1). After changing your network interfaces definition accordingly, make sure that the <em>bridge-utils</em> package is installed. Should it be missing on your system, install it with</p>
<pre>apt-get install bridge-utils</pre>
<p>Then, restart your network with</p>
<p><code>/etc/init.d/networking restart</code></p>
<p>We&#8217;ll also need RabbitMQ, an AMQP-implementation, as that is what all OpenStack components use to communicate with eath other, and memcached.</p>
<pre>apt-get install rabbitmq-server memcached python-memcache</pre>
<div>As we&#8217;ll also want to run KVM virtual machines on this very same host, we&#8217;ll need KVM and libvirt, which OpenStack uses to control virtual machines. Install these packages with:</div>
<div>
<pre>apt-get install kvm libvirt-bin</pre>
</div>
<div>Last but not least, make sure you have an LVM volume group called nova-volumes; the nova-volume service will need such a VG later on.</div>
<div></div>
<div>
<h1>Step 2: Install MySQL and create the necessary databases and users</h1>
<div>Submitted by martin on Fri, 2012-03-23 20:40 GMT</div>
<p>Nova and glance will use MySQL to store their runtime data. To make sure they can do that, we&#8217;ll install and set up MySQL. Do this:</p>
<p><code>apt-get install -y mysql-server python-mysqldb</code></p>
<p>When the package installation is done and you want other machines (read: OpenStack computing nodes) to be able to talk to that MySQL database, too, open up <em>/etc/mysql/my.cnf</em> in your favourite editor and change this line:</p>
<p><code>bind-address = 127.0.0.1</code></p>
<p>to look like this:</p>
<p><code>bind-address = 0.0.0.0</code></p>
<p>Then, restart MySQL:</p>
<p><code>service mysql restart</code></p>
<p>Now create the user accounts in mysql and grant them access on the according databases, which you need to create, too:</p>
<pre>mysql -u root &lt;&lt;EOF
CREATE DATABASE nova;
GRANT ALL PRIVILEGES ON nova.* TO 'novadbadmin'@'%'
  IDENTIFIED BY 'dieD9Mie';
EOF</pre>
<pre>mysql -u root &lt;&lt;EOF
CREATE DATABASE glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glancedbadmin'@'%'
  IDENTIFIED BY 'ohC3teiv';
EOF</pre>
<h1>Step 3: Install and configure Keystone</h1>
<div>Submitted by martin on Fri, 2012-03-23 22:13 GMT</div>
<p>We can finally get to OpenStack now and we&#8217;ll start by installing the Identity component, codenamed Keystone. Install the according packages:</p>
<p><code>apt-get install keystone python-keystone python-keystoneclient</code></p>
<p>Then, open <em>/etc/keystone/keystone.conf</em> in an editor and make sure to set a value for <em>admin_token</em>. We&#8217;ll use “hastexo” in this example.</p>
<p>Scroll down to the section starting with <em>[catalog]</em>. This section defines where Keystone finds its endpoint defintions. In earlier versions of Keystone, endpoints had to be manually defined with <em>keystone-manage,</em> but in newer Keystone versions, we can just use a template for that. Ubuntu&#8217;s default configuration uses such an endpoint catalog stored in MySQL. However, according to the OpenStack developers, this isn&#8217;t the recommended method for Essex. Change the<em> [catalog]</em> section to look like this:</p>
<p><code>[catalog]<br />
driver = keystone.catalog.backends.templated.TemplatedCatalog<br />
template_file = /etc/keystone/default_catalog.templates</code></p>
<p>After you have conduced these changes, restart Keystone by issuing this command:</p>
<p><code>service keystone restart</code></p>
<div>The next step is to fill Keystone with actual data. You can use the script attached to this blog entry entitled <em>keystone_data.sh_.txt.</em><em> </em>It&#8217;s courtesy of the Devstack project with some adaptions. Rename the file to <em>keystone_data.sh.</em> Be sure to replace the admin password (<em>ADMIN_PASSWORD</em> variable) and the value for SERVICE_TOKEN with the entry you specified in keystone.conf for <em>admin_token</em> earlier. Then just make the script executable and call it; if everything goes well, it should deliver a return code of 0 and your keystone is ready to go.</div>
<div>
<p><strong><br />
</strong></p>
</div>
<div>
<div>File Attachment:</div>
<div>
<div><img src="http://www.hastexo.com/sites/all/modules/filefield/icons/text-plain.png" alt="text/plain icon" /><a type="text/plain; length=5487" href="http://www.hastexo.com/system/files/user/4/keystone_data.sh_.txt">keystone_data.sh_.txt</a></div>
</div>
<div></div>
<div><a href="http://www.fallday.org/wp-content/uploads/2012/05/keystone_data.sh_.txt">本地下载(keystone_data.sh_.txt)</a></div>
<div>
<h1>Step 4: Install and configure Glance</h1>
<div>Submitted by martin on Fri, 2012-03-23 22:33 GMT</div>
<p>The next step on our way to OpenStack is its Image Service, codenamed Glance. First, install the packages necessary for it:</p>
<div>
<p><code>apt-get install glance glance-api glance-client glance-common glance-registry python-glance</code></p>
</div>
<div>When that is done, open <em>/etc/glance/glance-api-paste.ini</em> in an editor and scroll down to the end of the document. You&#8217;ll see these three lines at its very end:</div>
<pre>admin_tenant_name = %SERVICE_TENANT_NAME%
admin_user = %SERVICE_USER%
admin_password = %SERVICE_PASSWORD%</pre>
<div>
<div>Fill in values here appropriate for your setup. If you used the <em>keystone_data.sh</em> script from this site, then your <em>admin_tenant_name</em> will be <em>admin</em> and your <em>admin_user</em> will be <em>admin</em>, too. <em>admin_password</em> is the password you defined for ADMIN_PASSWORD in <em>keystone_data.sh</em>, so use the same value here, too. In this example, we&#8217;ll use <em>hastexo</em>.</div>
</div>
<div>After this, open <em>/etc/glance/glance-registry-paste.ini</em> and scroll to that file&#8217;s end, too. Adapt it in the same way you adapted <em>/etc/glance/glance-api-paste.ini</em> earlier.</div>
<div>Please open <em>/etc/glance/glance-registry.conf</em> now and scroll down to the line starting with <em>sql_connection</em>. This is where we tell Glance to use MySQL; according to the MySQL configuration we created earlier, the <em>sql_connection</em>-line for this example would look like this:</div>
<div>
<pre>sql_connection = mysql://glancedbadmin:ohC3teiv@<strong>10.42.0.6</strong>/glance</pre>
</div>
<div>It&#8217;s important to use the machine&#8217;s actual IP in this example and <em>not</em> 127.0.0.1! After this, scroll down until the end of the document and add these two lines:</div>
<pre>[paste_deploy]
flavor = keystone</pre>
<div>These two lines instruct the Glance Registry to use Keystone for authentication, which is what we want. Now we need to do the same for the Glance API. Open <em>/etc/glance/glance-api.conf</em> and add these two lines at the end of the document:</div>
<div>
<pre>[paste_deploy]
flavor = keystone</pre>
</div>
<div>Afterwards, you need to initially synchronize the Glance database by running these commands:</div>
<pre>glance-manage version_control 0
glance-manage db_sync</pre>
<div>It&#8217;s time to restart Glance now:</div>
<pre>service glance-api restart &amp;&amp; service glance-registry restart</pre>
<div>Now what&#8217;s the best method to verify that Glance is working as expected? The <em>glance </em>command line utilty can do that for us, but to work properly, it needs to know how we want to authenticate ourselves to Glance (and keystone, subsequently). This is a very good moment to define four environmental variables that we&#8217;ll need continously when working with OpenStack: OS_TENANT_NAME, OS_USERNAME, OS_PASSWORD and OS_AUTH_URL.  Here&#8217;s what they should look like in our example scenario:</div>
<pre>export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=hastexo
export OS_AUTH_URL="http://localhost:5000/v2.0/"</pre>
<div>The first three entries are identical with what you inserted into Glance&#8217;s API configuration files earlier and the entry for OS_AUTH_URL is mostly generic and should just work. After exporting these variables, you should be able to do</div>
<pre>glance index</pre>
<p>and get no output at all in return (but the return code will be 0; check with <em>echo $?</em>). If that&#8217;s the case, Glance is setup correctly and properly connects with Keystone. Now let&#8217;s add our first image!</p>
<p>We&#8217;ll be using a Ubuntu UEC image for this. Download one:</p>
<pre>wget http://uec-images.ubuntu.com/releases/11.10/release/ubuntu-11.10-server-cloudimg-amd64-disk1.img</pre>
<div>Then add this image to Glance:</div>
<pre>glance add name="Ubuntu 11.10 cloudimg amd64" is_public=true container_format=ovf disk_format=qcow2 &lt; ubuntu-11.10-server-cloudimg-amd64-disk1.img</pre>
<div>After this, if you do</div>
<pre>glance index</pre>
<div>once more, you should be seeing the freshly added image.</div>
</div>
<div></div>
<div>
<h1>Step 5: Install and configure Nova</h1>
<div>Submitted by martin on Fri, 2012-03-23 22:35 GMT</div>
<p>OpenStack Compute, codenamed Nova, is by far the most important and the most substantial openstack component. Whatever you do when it comes to managing VMs will be done by Nova in the background. The good news is: Nova is basically controlled by one configuration file, <em>/etc/nova/nova.conf</em>. Get started by installing all nova-related components:</p>
<pre>apt-get install nova-api nova-cert nova-common nova-compute nova-compute-kvm nova-doc nova-network nova-objectstore nova-scheduler nova-vncproxy nova-volume python-nova python-novaclient</pre>
<div>Then, open <em>/etc/nova/nova.conf</em> and replace everything in there with these lines:</div>
<div>
<pre>--dhcpbridge_flagfile=/etc/nova/nova.conf
--dhcpbridge=/usr/bin/nova-dhcpbridge
--logdir=/var/log/nova
--state_path=/var/lib/nova
--lock_path=/var/lock/nova
--allow_admin_api=true
--use_deprecated_auth=false
--auth_strategy=keystone
--scheduler_driver=nova.scheduler.simple.SimpleScheduler
--s3_host=10.42.0.6
--ec2_host=10.42.0.6
--rabbit_host=10.42.0.6
--cc_host=10.42.0.6
--nova_url=http://10.42.0.6:8774/v1.1/
--routing_source_ip=10.42.0.6
--glance_api_servers=10.42.0.6:9292
--image_service=nova.image.glance.GlanceImageService
--iscsi_ip_prefix=192.168.22
--sql_connection=mysql://novadbadmin:dieD9Mie@10.42.0.6/nova
--ec2_url=http://10.42.0.6:8773/services/Cloud
--keystone_ec2_url=http://10.42.0.6:5000/v2.0/ec2tokens
--api_paste_config=/etc/nova/api-paste.ini
--libvirt_type=kvm
--libvirt_use_virtio_for_bridges=true
--start_guests_on_host_boot=true
--resume_guests_state_on_host_boot=true
--vnc_enabled=true
--vncproxy_url=http://10.42.0.6:6080
--vnc_console_proxy_url=http://10.42.0.6:6080
# network specific settings
--network_manager=nova.network.manager.FlatDHCPManager
--public_interface=eth0
--flat_interface=eth1
--flat_network_bridge=br100
--fixed_range=192.168.22.32/27
--floating_range=10.42.0.32/27 
--network_size=32
--flat_network_dhcp_start=192.168.22.33
--flat_injected=False
--force_dhcp_release
--iscsi_helper=tgtadm
--connection_type=libvirt
--root_helper=sudo nova-rootwrap
--verbose</pre>
</div>
<p>As you can see, many of the entries in this file are self-explanatory; the trickiest bit to get done right is the network configuration part, which you can see at the end of the file. We&#8217;re using Nova&#8217;s FlatDHCP network mode; 192.168.22.32/27 is the fixed range from which our future VMs will get their IP adresses, starting with 192.168.22.33. Our flat interface is eth1 (nova-network will bridge this into a bridge named <em>br100</em>), our public interface is eth0. An additional floating range is defined at 10.42.0.32/27 (for those VMs that we want to have a &#8216;public IP&#8217;).</p>
<p><strong>Attention</strong>: Every occurance of <em>10.42.0.6</em> in this file refers to the IP of the machine I used for writing this guide. You need to <strong>replace</strong> it with the actual <strong>machine IP</strong> of the box you are running  this on. For example, if your machine has the local IP address <em>192.168.0.1</em>, then use this IP instead of <em>10.42.0.6</em>.</p>
<p>After saving <em>nova.conf</em>, <strong>open <em>/etc/nova/api-paste.ini</em></strong> in an editor and scroll down to the end of the file. <strong>Adapt it</strong> according to the changes you conducted in Glance&#8217;s paste-files in step 3.</p>
<p>Then, restart all nova services to make the configuration file changes take effect:</p>
<pre>for a in libvirt-bin nova-network nova-compute nova-api nova-objectstore nova-scheduler nova-volume nova-vncproxy; do service "$a" stop; done</pre>
<pre>for a in libvirt-bin nova-network nova-compute nova-api nova-objectstore nova-scheduler nova-volume nova-vncproxy; do service "$a" start; done</pre>
<p>The next step will create all databases Nova needs in MySQL. While we are at it, we can also create the network we want to use for our VMs in the Nova databases. Do this:</p>
<pre>nova-manage db sync</pre>
<pre>nova-manage network create private --fixed_range_v4=192.168.22.32/27 --num_networks=1 --bridge=br100 --bridge_interface=eth1 --network_size=32</pre>
<div>Also, make sure that all files in /etc/nova belong to the nova user and the nova group:</div>
<pre>chown -R nova:nova /etc/nova</pre>
<div>Then, restart all nova-related services again:</div>
<pre>for a in libvirt-bin nova-network nova-compute nova-api nova-objectstore nova-scheduler nova-volume nova-vncproxy; do service "$a" stop; done</pre>
<pre>for a in libvirt-bin nova-network nova-compute nova-api nova-objectstore nova-scheduler nova-volume nova-vncproxy; do service "$a" start; done</pre>
<div>You should now see all these nova-* processes when doing <em>ps auxw</em>. And you should be able to use the numerous nova commands. For example,</div>
<pre>nova list</pre>
<div>should give you a list of all currently running VMs (none, the list should be empty). And</div>
<pre>nova image-list</pre>
<div>should show a list of the image you uploaded to Glance in the step before. If that&#8217;s the case, Nova is working as expected and you can carry on with starting your first VM.</div>
</div>
<div></div>
<div>
<h1>Step 6: Your first VM</h1>
<div>Submitted by martin on Fri, 2012-03-23 22:37 GMT</div>
<p>Once Nova works as desired, starting your first own cloud VM is easy. As we&#8217;re using a Ubuntu image for this example which allows for SSH-key based login only, we first need to store a public SSH key for our <em>admin</em> user in the OpenStack database. Upload the file containing your SSH public key onto the server (i&#8217;ll assume the file is called id_dsa.pub) and do this:</p>
<pre>nova keypair-add --pub_key id_rsa.pub key1</pre>
<div>This will add the key to OpenStack Nova and store it with the name “key1&#8243;. The only thing left to do after this is firing up your VM. Find out what ID your Ubuntu image has, you can do this with:</div>
<pre>nova image-list</pre>
<div>When starting a VM, you also need to define the flavor it is supposed to use. Flavors are pre-defined hardware schemes in OpenStack with which you can define what resources your newly created VM has. OpenStack comes with five pre-defined flavors; you can get an overview over the existing flavors with</div>
<pre>nova flavor-list</pre>
<div>Flavors are referenced by their ID, not by  their name. That&#8217;s important for the actual command to execute to start your VM. That command&#8217;s syntax basically is this:</div>
<pre>nova boot --flavor <em>ID</em> --image <em>Image-UUID</em> --key_name <em>key-name vm_name</em></pre>
<div>So let&#8217;s assume you want to start a VM with the <em>m1.tiny</em> flavor, which has the ID 1. Let&#8217;s further assume that your image&#8217;s UUID in Glance is <em>9bab7ce7-7523-4d37-831f-c18fbc5cb543</em> and that you want to use the SSH key <em>key1</em>. Last but nut least, you want your new VM to have the name <em>superfrobnicator</em>. Here&#8217;s the command you would need to start that particular VM:</div>
<pre>nova boot --flavor 1 --image <em>9bab7ce7-7523-4d37-831f-c18fbc5cb543</em> --key_name key1 superfrobnicator</pre>
<div>After hitting the Enter key, Nova will show you a summary with all important details concerning the new VM. After some seconds, issue the command</div>
<pre>nova show superfrobnicator</pre>
<div>In the line with the <em>private_network</em> keyword, you&#8217;ll see the IP address that Nova has assigned this particular VM. As soon as the VMs status is <em>ACTIVE</em>, you should be able to log into that VM by issuing</div>
<pre>ssh -i <em>Private-Key</em> ubuntu@<em>IP</em></pre>
<div>Of course <em>Private-Key</em> needs to be replaced with the path to your SSH private key and <em>IP</em> needs to be replaced with the VMs actual IP. If you&#8217;re using SSH agent forwarding, you can leave out the “-i”-parameter altogether.</div>
</div>
</div>
<div></div>
<div>
<h1>Step 7: The OpenStack Dashboard</h1>
<div>Submitted by martin on Fri, 2012-03-23 22:39 GMT</div>
<p>We can use Nova to start and stop virtual machines now, but up to this point, we can only do it on the command line. That&#8217;s not good, because typically, we&#8217;ll want users without high-level administrator skills to be able to start new VMs. There&#8217;s a solution for this on the OpenStack ecosystem called Dashboard, codename Horizon. Horizon is OpenStack&#8217;s main configuration interface. It&#8217;s django-based.</p>
<div>Let&#8217;s get going with it:</div>
<pre>apt-get install libapache2-mod-wsgi openstack-dashboard</pre>
<p>Make sure that you install at least the version <em>2012.1~rc2-0ubuntu1</em> of the <em>openstack-dashboard</em> package as this version contains some important fixes that are necessary for Horizon to work properly.</p>
<p>Then, open <em>/etc/openstack-dashboard/local_settings.py</em> in an editor. Go to the line starting with <em>CACHE_BACKEND</em> and make sure it looks like this:</p>
<pre>CACHE_BACKEND = 'memcached://127.0.0.1:11211/'</pre>
<p>Now restart Apache with</p>
<pre>service apache2 restart</pre>
<div>After this, point your webbrowser to the Nova machine&#8217;s IP address and you should see the OpenStack Dashboard login prompt. Login with <em>admin</em> and the password you specified. That&#8217;s it &#8211; you&#8217;re in!</div>
</div>
<div></div>
<div>
<h1>Step 8: Making the euca2ools work</h1>
<div>Submitted by martin on Fri, 2012-03-23 22:41 GMT</div>
<p>OpenStack offers a full-blown native API for administrator interaction. However, it also has an API compatible with Amazons AWS service. This means that on Linux you can not only use the native OpenStack clients for interaction but also the <em>euca2ools</em> toolsuite. Using <em>euca2ools</em> with keystone is possible. Large portions on how to do it are written down in <a href="http://devstack.org/eucarc.html">this</a> document. Here&#8217;s the short summary for those who are in a hurry:</p>
<pre>export EC2_URL=$(keystone catalog --service ec2 | awk '/ publicURL / { print $4 }')
export CREDS=$(keystone ec2-credentials-create)
export EC2_ACCESS_KEY=$(echo "$CREDS" | awk '/ access / { print $4 }')
export EC2_SECRET_KEY=$(echo "$CREDS" | awk '/ secret / { print $4 }')</pre>
<div>After that, the euca2ools should just work (if the <em>euca2ools</em> package is installed, of course). You can try running</div>
<pre>euca-describe-images</pre>
<div>or</div>
<pre>euca-describe-instances</pre>
<div>to find out whether it&#8217;s working or not.</div>
</div>
<div></div>
<div>
<h1>Appendix A: Making nova-volume work</h1>
<div>Submitted by martin on Sun, 2012-03-25 15:27 GMT</div>
<p><em>nova-volume </em>is the OpenStack Compute component that will allow you to assign persistent storage devices to your virtual machines. Internally, it&#8217;s using iSCSI, which is why you installed the <em>tgt</em> package earlier.</p>
<p>Assuming that you have a local LVM volume group entitled nova-volumes, you can try assigning a 1G large volume to our superfrobnicator VM by using these commands to create a 1G large volume and assign it accordingly:</p>
<pre><a id="d6e2435"><code>nova volume-create --display_name "volume1" 1 nova volume-attach superfrobnicator 1 /dev/vdb</code></a></pre>
<div>Please take particular note of the parameter between <em>superfrobnicator</em> and <em>/dev/vdb</em> in this example. It refers to the actual ID of the volume. To find out a volume&#8217;s ID, you can do</div>
<pre>nova volume-list</pre>
<div>and then use the value from the “ID” field for a specific volume. If everything went well, you&#8217;ll see a new disk device in the <em>superfrobnicator</em> VM now, <em>/dev/vdb</em>.</div>
</div>
<div></div>
<div>
<h1>Appendix B: Using floating IPs</h1>
<div>Submitted by martin on Sun, 2012-03-25 16:25 GMT</div>
<p>Floating IPs are an unbelievably handy tool in OpenStack to supply your virtual machines with “official” IP addresses. In this example, we&#8217;ve mainly been dealing with the <em>192.168.22.0/24</em> network, which is the “internal” network for our VMs. Our VMs can communicate with each other and they can communicate with the outside world, but they don&#8217;t have an official IP address that others could connect to (the “public” net in this test-setup is 10.42.0.0/24 after all). Floating IPs allow you to assign your VMs an additional IP from that “public” network, making them accessible directly. And using floating IPs is anything but hard!</p>
<p>First, you&#8217;ll have to define a range of addresses which OpenStack nova will use. Our old friend nova-manage does this:</p>
<pre>nova-manage floating create --ip_range=10.42.0.32/27</pre>
<p>Then, within Nova itself, you&#8217;ll have to create a floating IP (creating here is Nova-speak for “reserving”):</p>
<p><a id="allocating-associating-ip-addresses"><code>nova floating-ip-create</code></a></p>
<p>This command will print out an IP address (in this example it&#8217;s 10.42.0.35) that you will need in the next step. To assign this IP to our <em>superfrobnicator</em> VM, use this command:</p>
<p><a id="allocating-associating-ip-addresses"><code>nova add-floating-ip superfrobnicator 10.42.0.35</code></a></p>
<div>Please note: Assigning a floating IP to an existing VM does automatically enable that IP for the VM. You&#8217;ll not have to manually assign the IP to the VMs main network interface, as all the networking magic is done by iptables on the actual compute node.</div>
<div>That&#8217;s it! Your new VM can now use its floating IP. There is only one problem left: By default, nova uses very secure iptables rules to protect IPs reachable via floating IPs from abuse. De facto, nova will not allow any traffic from the outside to get through to your VM. We&#8217;ll have to fiddle with Security Groups to solve this problem. Here&#8217;s how you can enable SSH access and ICMP to your floating IPs:</div>
<pre>nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0</pre>
<div>After this, your VM will be reachable directly from the outside via its floating IP address (by SSH and ICMP).</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/857/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HowTo: Setup Ubuntu Desktop with LVM Partitions (转载)</title>
		<link>http://www.fallday.org/archives/854</link>
		<comments>http://www.fallday.org/archives/854#comments</comments>
		<pubDate>Fri, 27 Apr 2012 03:06:17 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[LVM]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=854</guid>
		<description><![CDATA[This tutorial will help anyone who wishs to setup their desktop using logical volumes on a fresh install of Ubuntu Desktop only. You can use the Ubuntu Alternate image to complete this as well but you will need to set it up in a TUI (Text based-User-Interface). What is LVM? &#8212; LVM stands for Logical [...]]]></description>
			<content:encoded><![CDATA[<div><strong><strong>This tutorial will help anyone who wishs to setup their desktop using logical volumes on a fresh install of Ubuntu Desktop only. You can use the Ubuntu Alternate image to complete this as well but you will need to set it up in a TUI (Text based-User-Interface).</p>
<p><strong>What is LVM?</strong><br />
&#8212;<br />
LVM stands for Logical Volume Manager (or Logical Volume Management). Instead of using all physical volumes for your system (hard to change, static), take one (or many) disk(s) and have that drive logically divided for expandability, better monitoring and all around better disk management on your computer. If you wish to learn more, please refer to the links below:</p>
<p><span id="more-854"></span><a href="http://www.redhat.com/magazine/009jul05/features/lvm2/" target="_blank">http://www.redhat.com/magazine/009jul05/features/lvm2/</a><br />
<a href="http://sourceware.org/lvm2/" target="_blank">http://sourceware.org/lvm2/</a><br />
&#8212;</p>
<p><strong>Versions tested on:</strong><br />
&#8212;<br />
Ubuntu 10.04<br />
Ubuntu 10.10<br />
Ubuntu 11.04<br />
Ubuntu 11.10 (current)<br />
&#8212;</p>
<p><strong>Preparation:</strong><br />
&#8212;<br />
<em>Ubuntu Desktop ISO</em> (<a href="http://www.ubuntu.com/download/ubuntu/download" target="_blank">http://www.ubuntu.com/download/ubuntu/download</a>)<br />
<em>CD</em> or <em>USB</em><br />
<em>A Computer</em><br />
<em>Hands</em><br />
&#8212;</p>
<p><strong>Table of Contents</strong><br />
&#8212;<br />
1. How to burn an ISO<br />
2. Start up Ubuntu Live<br />
3. Install lvm2<br />
4. Setup hard drive partions<br />
5. pvcreate, vgcreate, lvcreate, mkfs<br />
6. Ubuntu Installation<br />
7. Install lvm2 onto your new Ubuntu Install<br />
&#8212;</p>
<p><strong>1. How to burn an ISO</strong><br />
There are many guides on how to get your Ubuntu ISO going and it doesn&#8217;t matter if you use a CD or a USB, either one will work.</p>
<p>CD Install &#8211; <a href="https://help.ubuntu.com/community/BurningIsoHowto" target="_blank">https://help.ubuntu.com/community/BurningIsoHowto</a><br />
USB Install &#8211; <a href="https://help.ubuntu.com/community/Installation/FromUSBStick" target="_blank">https://help.ubuntu.com/community/In&#8230;n/FromUSBStick</a></p>
<p><strong>2. Start up Ubuntu Live</strong><br />
Once you have your Ubuntu Live CD or USB ready, start up that computer/laptop, go into your BIOS (usually its F2 but this link can help if it doesn&#8217;t work: <a href="http://www.cyberwalker.com/article/28" target="_blank">http://www.cyberwalker.com/article/28</a>) and make sure your &#8216;Boot Sequence&#8217; is set to CDROM or USB (if its supported). Save your BIOS setting and watch Ubuntu startup in front of your eyes. Later, you should see two options of “Try Ubuntu” and “Install Ubuntu” (11.04). Select “Try Ubuntu” and let it load into the Ubuntu 11.04.</p>
<p><strong>3. Install lvm2</strong><br />
Now that Ubuntu is booted up, now we will need a terminal by selecting the following:</p>
<p>Applications &gt;&gt; Accessories &gt;&gt; Terminal</p>
<p>Once the terminal in front of you, run the following command:</p>
<p></strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">sudo apt-get -y install lvm2</pre>
</div>
<div><strong><strong>This command will install lvm2 onto your Live CD session only but will help with the rest of this tutorial.</p>
<p><strong>4. Setup hard drive partions</strong><br />
Keep the terminal open as we will be creating partitions using the command fdisk. In the example below, I will be setting up my desktop using the /dev/sda patition (to find yours, do the command &#8216;sudo fdisk -l&#8217; and make sure you know much your storage is on the machine so you can figure out what physical device you want to use):</p>
<p></strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">ubuntu@ubuntu:~$ sudo fdisk /dev/sda
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x568311d6.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-5221, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-5221, default 5221): +1G

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (133-5221, default 133):
Using default value 133
Last cylinder, +cylinders or +size{K,M,G} (133-5221, default 5221):
Using default value 5221

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 8e

Changed system type of partition 2 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x568311d6

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1         132     1060258+  83  Linux
/dev/sda2             133        5221    40877392+  8e  Linux LVM

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.</pre>
</div>
<div><strong><strong>The reason for this setup is explained below:</p>
<p><span style="text-decoration: underline;">/dev/sda1</span> &#8212; This partition has been created for /boot of the installation. It always a good thing to make your /boot the first partion of any Linux system</p>
<p><span style="text-decoration: underline;">/dev/sda2</span> &#8212; This is the LVM physical parition that will be used to create the rest of the system before installation.</p>
<p><strong>5. pvcreate, vgcreate, lvcreate, mkfs</strong><br />
This part will help setup your logical volumes for your desktop. In this example, there will be three different logical volumes using one volume group and one physical volume:</p>
<p>Create the physical volume:<br />
</strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">sudo pvcreate /dev/sda2
                  ^
                  PV</pre>
</div>
<div><strong><strong>This gives the LVM an understand of what physical volumes it has to offer for volume groups and logical volumes during your setup.</p>
<p>Create a group using our newly create physical volume:<br />
</strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">sudo vgcreate sysvg /dev/sda2
                ^       ^
               name     PV</pre>
</div>
<div><strong><strong>This part creates a new volume group which is tided to a physical volume. A physical disk can not be can not be used on multiple violume groups (unless you partition that disk before hand like we did above). The name of this volume group is &#8216;sysvg&#8217; but you can name it whatever you wish.</p>
<p>Create the swap logical volume using the newly create sysvg group:<br />
</strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">sudo lvcreate -L 1G -n lvswap sysvg
                ^        ^      ^
             size(GB)   name    VG</pre>
</div>
<div><strong><strong>I need a swap for the system so 1GB will do in this case (you can change the size to whatever you want). The name can be whatever you want it to be but I like to keep a naming scheme when creating VG&#8217;s and LV&#8217;s. Then assign it to a VG group that you made from before and you will have your first LV done.</p>
<p>Create the root logical volume using the newly create sysvg group:<br />
</strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">sudo lvcreate -L 20G -n lvroot sysvg
                ^        ^      ^
             size(GB)   name    VG</pre>
</div>
<div><strong><strong>Again, like the swap but this will be used for my root file system. The size and name is up to you and make sure you point it to your VG that was created above.</p>
<p>Create the home logical volume using the newly create sysvg group:<br />
</strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">sudo lvcreate -l 100%FREE -n lvhome sysvg
                ^            ^      ^
             extents(%)     name    VG</pre>
</div>
<div><strong><strong>Without getting into a lot of details, this will create a logical volume called &#8216;home&#8217; using 100% of whats left on my VG. The percentage and name is up to you and make sure you point it to your VG that was created above. You do not need to use the rest of your disk space on home or any of the above created.</p>
<p><strong>NOTE &#8211; Please use any of the above commands if you want to make a seperate LV for tmp, var, etc&#8230;</strong></p>
<p>View the create logical volumes:<br />
</strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">sudo lvdisplay</pre>
</div>
<div><strong><strong>You don&#8217;t need to do this but its always nice to see the work as a whole.</p>
<p>Display only your free space on your volume group:<br />
</strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">sudo vgdisplay | grep -i free</pre>
</div>
<div><strong><strong>This is just important if you didn&#8217;t use the rest of the disk on a LV. This will show how much you have to expand current LV&#8217;s or create new ones at a later date.</p>
<p>Build linux file systems for all newly created logical volumes:<br />
</strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">sudo mkfs.ext4 /dev/mapper/sysvg-lvroot
sudo mkfs.ext4 /dev/mapper/sysvg-lvhome
sudo mkswap -f /dev/mapper/sysvg-lvswap</pre>
</div>
<div><strong><strong>This will help the installation process know that each LV is selectable and usable as a partition point.</p>
<p><strong>6. Ubuntu Installation</strong><br />
Now its time to get your computer setup. Double click on “Install Ubuntu 11.04&#8243; icon on the desktop and get where picture 1.0 is below:</p>
<p>picture 1.0<br />
<img src="http://ubuntuforums.org/picture.php?albumid=2326&amp;pictureid=7953" alt="" border="0" /></p>
<p>On the “Preparing to install Ubuntu” screen, you can select both “Download updates while installing” and “Install this third-party software” (this is optional). Now move to picture 1.1 for the next part:</p>
<p>picture 1.1<br />
<img src="http://ubuntuforums.org/picture.php?albumid=2326&amp;pictureid=7954" alt="" border="0" /></p>
<p>On the “Allocate drive space” screen, make sure you select &#8216;Something else&#8217; before pressing the &#8216;Forward&#8217; button. After you press the &#8216;Forward&#8217; button, go to picture 1.3 for what you should see when manually setting up your partitions:</p>
<p>picture 1.3<br />
<img src="http://ubuntuforums.org/picture.php?albumid=2326&amp;pictureid=7955" alt="" border="0" /></p>
<p>The “Allocated drive space” should look different now showing you a list of your logical volumes and the /dev/sda partitions near the bottom. Scroll down the list to the bottom and highlight /dev/sda1 and press the “Change&#8230;” button. See picture 1.4 on what the change window should look like for /dev/sda1:</p>
<p>picture 1.4<br />
<img src="http://ubuntuforums.org/picture.php?albumid=2326&amp;pictureid=7949" alt="" border="0" /></p>
<p>The partition /dev/sda1 will be the /boot partition for your system and you can select whatever file system you wish (I would advise on ext4 or better). Now lets scroll up to the top and highlight the /dev/mapper/sysvg-lvhome partition that has the “ext4&#8243; next to it. Press the “Change&#8230;” button and see picture 1.5 for what this partition should look like:</p>
<p>picture 1.5<br />
<img src="http://ubuntuforums.org/picture.php?albumid=2326&amp;pictureid=7950" alt="" border="0" /></p>
<p>This will be the /home directory for my system using ext4. Again, the file system is your choice and doesn&#8217;t need to be ext4. Do this same process for /dev/mapper/sysvg-root and /dev/mapper/sysvg-lvswap by highlighting them and pressing the “Change&#8230;” button. See pictures 1.6 and 1.7 for what you should setup for both:</p>
<p>picture 1.6<br />
<img src="http://ubuntuforums.org/picture.php?albumid=2326&amp;pictureid=7951" alt="" border="0" /></p>
<p>picture 1.7<br />
<img src="http://ubuntuforums.org/picture.php?albumid=2326&amp;pictureid=7952" alt="" border="0" /></p>
<p>If you are all setup for your system to have all proper logical volumes, you press the “Install Now” button to start the installation process. This installation will ask for you additional information like your timezone, username, etc&#8230; please fill that in with what you want for your system. Once you are done, you can sit back and wait for the whole thing to comeplete. Once the installation process is complete, you will see picture 1.8 in front of you:</p>
<p>picture 1.8<br />
<img src="http://ubuntuforums.org/picture.php?albumid=2326&amp;pictureid=7956" alt="" border="0" /></p>
<p>Make sure you <strong>DO NOT PRESS</strong> “Restart Now”. You want to press the “Continue Testing” so you can continue to step 7.</p>
<p><strong>7. Install lvm2 onto your new Ubuntu Install</strong><br />
Your system is almost ready to use LVM2 but the only problem is LVM2 isn&#8217;t a package that is installed by default (oh noes!!). To fix that we need to install it onto your newly setup Ubuntu instance. The commands below will help do this.</p>
<p>Mount your system into /mnt/:<br />
</strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">sudo mount /dev/mapper/sysvg-lvroot /mnt
sudo mount /dev/mapper/sysvg-lvhome /mnt/home/
sudo mount /dev/sda1 /mnt/boot</pre>
</div>
<div><strong><strong>We need to first mount your root file system to /mnt. Mounting your home file system probably isn&#8217;t necessary but doesn&#8217;t hurt to do. We do need your boot file system mounted to /mnt/boot to have this work so make sure you have at least your root and boot file systems mounted.</p>
<p>Change your root to /mnt/<br />
</strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">sudo chroot /mnt</pre>
</div>
<div><strong><strong>This command allows you to change your root file system so you can manage that new file system. Doing this will make any installations and changes perminant onto your changed root filesystem. Now that we are on your Ubuntu instance, you will noticed that you are now root and the symbole after &#8216;root@ubuntu:&#8217; has changed to a #. That is a good thing as we are not on the live CD&#8217;s root file system but on your instance of Ubuntu. We will need to run the following command to allow your file system to boot into your LVM create partitions.</p>
<p>Install LVM2 onto your chroot file system:<br />
</strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">root@ubuntu:/# apt-get -y install lvm2</pre>
</div>
<div><strong><strong>Just like in step 3, we install lvm2 onto your instance of Ubuntu instead of the live instance. I want to point out some of the output that is import to why you need to install lvm2 onto your instance of Ubuntu:<br />
</strong></strong></div>
<div>
<div>Code:</div>
<pre dir="ltr">update-initramfs: deferring update (trigger activated)
Setting up lvm2 (2.02.66-4ubuntu2) ...
update-initramfs: deferring update (trigger activated)
Processing triggers for initramfs-tools ...
update-initramfs: Generating /boot/initrd.img-2.6.38-8-generic</pre>
</div>
<div><strong>If you see this during your installation of lvm2, this means, in a nutshell, your initrd image will now be able to use LVM based partitions at startup. If lvm2 was not installed on your computer and you started to start it up, you computer would complain about not being able to find /dev/mapper/sysvg-lvroot and so on&#8230;</p>
<p>Your computer is now setup with Ubuntu and logical volumes by using the Ubuntu Desktop image.</p>
<p><strong>References:</strong><br />
&#8212;<br />
<a href="http://www.redhat.com/magazine/009jul05/features/lvm2/" target="_blank">http://www.redhat.com/magazine/009jul05/features/lvm2/</a><br />
<a href="http://sourceware.org/lvm2/" target="_blank">http://sourceware.org/lvm2/</a><br />
<a href="http://www.ubuntu.com/download/ubuntu/download" target="_blank">http://www.ubuntu.com/download/ubuntu/download</a><br />
<a href="https://help.ubuntu.com/community/BurningIsoHowto" target="_blank">https://help.ubuntu.com/community/BurningIsoHowto</a><br />
<a href="https://help.ubuntu.com/community/Installation/FromUSBStick" target="_blank">https://help.ubuntu.com/community/In&#8230;n/FromUSBStick</a><br />
<a href="http://www.cyberwalker.com/article/28" target="_blank">http://www.cyberwalker.com/article/28</a><br />
<a href="http://man.he.net/man8/initramfs-tools" target="_blank">http://man.he.net/man8/initramfs-tools</a></strong></div>
<div><strong></strong> </div>
<div><strong>原文链接： <a href="http://ubuntuforums.org/showthread.php?t=1782296">http://ubuntuforums.org/showthread.php?t=1782296</a></strong></div>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/854/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>利用fsarchiver转换ext4文件系统到ext3文件系统</title>
		<link>http://www.fallday.org/archives/851</link>
		<comments>http://www.fallday.org/archives/851#comments</comments>
		<pubDate>Sat, 21 Apr 2012 14:00:18 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[ext3]]></category>
		<category><![CDATA[ext4]]></category>
		<category><![CDATA[fsarchiver]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=851</guid>
		<description><![CDATA[由于一些工具不支持ext4文件系统，需要转换为ext3文件系统，文件系统是linux根系统, LVM分区。通过fsarchiver备份恢复工具，成功完成了转换。记录一下过程。 1.  减少ext4 root分区大小 ( lvreduce ) 2. 创建新的ext3分区 ( lvcreate ) 3. 格式化 ext3 分区 ( mkfs.ext3 ) 4. 为 ext4 root分区创建一个snapshot ( lvcreate ) 4. 备份 ext4 root snapshot分区 （ fsarchiver ) 5. 恢复备份到 ext3分区 ( fsarchiver ) 6. 修改 /etc/fstab 及 /boot/grub/grub.conf 使用新的 ext3 root分区 7. 删除snapshot分区( lvremove ), 重启动 ( [...]]]></description>
			<content:encoded><![CDATA[<p>由于一些工具不支持ext4文件系统，需要转换为ext3文件系统，文件系统是linux根系统, LVM分区。通过fsarchiver备份恢复工具，成功完成了转换。记录一下过程。</p>
<p>1.  减少ext4 root分区大小 ( lvreduce )</p>
<p>2. 创建新的ext3分区 ( lvcreate )</p>
<p>3. 格式化 ext3 分区 ( mkfs.ext3 )</p>
<p>4. 为 ext4 root分区创建一个snapshot ( lvcreate )</p>
<p>4. 备份 ext4 root snapshot分区 （ fsarchiver )</p>
<p>5. 恢复备份到 ext3分区 ( fsarchiver )</p>
<p>6. 修改 /etc/fstab 及 /boot/grub/grub.conf 使用新的 ext3 root分区</p>
<p>7. 删除snapshot分区( lvremove ), 重启动 ( reboot )</p>
<p>8. 如果需要，除旧的 ext4 root分区 ( lvremove ), 扩展新的 ext3 分区大小 ( lvextend )</p>
<p><span id="more-851"></span></p>
<p>fsarchiver快速入门 ( http://www.fsarchiver.org/QuickStart )</p>
<h2>How to save filesystems to an archive</h2>
<p>Here is <strong>how to use FSArchiver</strong> to backup a partition of your disk. Let&#8217;s consider your linux operating system is installed on <code>/dev/sda1</code> and you want to back it up to a file on <code>/mnt/backup</code>. You can run this command from a livecd:</p>
<pre>fsarchiver savefs /mnt/backup/gentoo-rootfs.fsa /dev/sda1</pre>
<p>You can also archive several filesystems in a single archive file:</p>
<pre>fsarchiver savefs /mnt/backup/gentoo-rootfs.fsa /dev/sda1 /dev/sda2 /dev/volgroup/lv01</pre>
<p>Here is an example of output when we save two filesystems to an archive:</p>
<pre># fsarchiver savefs -o /backup/backup-fsa/backup-fsa025-gentoo-amd64-20090103-01.fsa /dev/sda1 /dev/sda2 -v -j4 -A
filesystem features: [has_journal,resize_inode,dir_index,filetype,sparse_super,large_file]
============= archiving filesystem /dev/sda1 =============
-[00][REGFILE ] /vmlinuz-2.6.25.20-x64-fd13
-[00][REGFILE ] /sysresccd/memdisk
-[00][REGFILE ] /sysresccd/pxelinux.0
-[00][REGFILE ] /sysresccd/initram.igz
-[00][REGFILE ] /sysresccd/boot.cat
.....
-[00][DIR     ] /mkbootcd-gentoo64
-[00][REGFILE ] /System.map-2.6.25.20-x64-fd13
-[00][REGFILE ] /config-2.6.25.20-x64-fd13
-[00][REGFILE ] /config-2.6.27.09-x64-fd16
-[00][DIR     ] /
============= archiving filesystem /dev/sda2 =============
-[01][SYMLINK ] /bin/bb
-[01][REGFILE ] /bin/dd
-[01][REGFILE ] /bin/cp
-[01][REGFILE ] /bin/df
.....
-[01][REGFILE ] /fdoverlay/profiles/repo_name
-[01][DIR     ] /fdoverlay/profiles
-[01][DIR     ] /fdoverlay
-[01][DIR     ] /</pre>
<p><a id="How_to_extract_filesystems_from_an_archive" name="How_to_extract_filesystems_from_an_archive"></a></p>
<h2>How to extract filesystems from an archive</h2>
<p>FSArchiver supports multiple filesystems per archive. For that reason, you have to specify which filesystem you want to restore. Each filesystem has a number starting at 0. The first filesystem in the archive will be filesystem number 0, the second will be filesystem number 1, &#8230; You can restore either one filesystem at a time, or several filesystems with just one command.</p>
<p>Here is how to restore a filesystem from an archive when there is only one filesystem in that archive:</p>
<pre>fsarchiver restfs /mnt/backup/gentoo-rootfs.fsa id=0,dest=/dev/sda1</pre>
<p>There is how to restore the second filesystem from an archive (second = number 1):</p>
<pre>fsarchiver restfs /mnt/backup/archive-multple-filesystems.fsa id=1,dest=/dev/sdb1</pre>
<p>You can also restore both the first and the second filesystem in the same time: (numbers 0 and 1)</p>
<pre>fsarchiver restfs /mnt/backup/archive-multple-filesystems.fsa id=0,dest=/dev/sda1 id=1,dest=/dev/sdb1</pre>
<p>Option <code>-F</code> was used to convert a filesystem in old version. For instance, it allows to restore a filesystem which was ext2 when it was saved as reiserfs on the new partition. Now, you have to specify option <code>mkfs=xxx</code> with the destination partition. Here is how to restore the first filesystem from an archive to /dev/sda1 and to convert it to reiserfs in the same time:</p>
<pre>fsarchiver restfs /mnt/backup/gentoo-rootfs.fsa id=0,dest=/dev/sda1,mkfs=reiserfs</pre>
<p><a id="Display_info_about_an_archive" name="Display_info_about_an_archive"></a></p>
<h2>Display info about an archive</h2>
<p>It may be useful to know what has been saved in an archive. You can do this using <code>archinfo</code>. It will tell you how many filesystems there are, their properties, the original size of the filesystem and how much space is used:</p>
<pre>fsarchiver archinfo /backup/backup-fsa/sysimg-t3p5g965-debian-20100131-07h16.fsa</pre>
<p>Here is an example of output:</p>
<pre># fsarchiver archinfo /backup/backup-fsa/sysimg-t3p5g965-debian-20100131-07h16.fsa
====================== archive information ======================
Archive type:                   filesystems
Filesystems count:              2
Archive id:                     4b610c6e
Archive file format:            FsArCh_002
Archive created with:           0.6.6
Archive creation date:          20100131-07:16:35
Archive label:                  debian-backup
Compression level:              7 (lzma level 1)
Encryption algorithm:           none

===================== filesystem information ====================
Filesystem id in archive:       0
Filesystem format:              ext3
Filesystem label:               boot
Filesystem uuid:                d76278bf-5e65-4568-a899-9558ce61bf06
Original device:                /dev/sda1
Original filesystem size:       961.18 MB (1007869952 bytes)
Space used in filesystem:       356.86 MB (374190080 bytes)

===================== filesystem information ====================
Filesystem id in archive:       1
Filesystem format:              ext3
Filesystem label:               debian
Filesystem uuid:                4b0da78f-7f02-4487-a1e2-774c9b412277
Original device:                /dev/vgmain/snapdeb
Original filesystem size:       11.81 GB (12682706944 bytes)
Space used in filesystem:       7.11 GB (7635599360 bytes)</pre>
<p><a id="Multi-thread_compression" name="Multi-thread_compression"></a></p>
<h2>Multi-thread compression</h2>
<p>FSArchiver also supports multi-threaded <a title="Compression" href="/Compression">compression</a>. If you have a multi-core processor (eg: dual-core or quad-core) you should create several compression jobs so that all the cores are used. It will make the compression or decompression a lot faster. For instance, if you have a dual-core, you should use option <code>-j2</code> to create two compression threads to use the power of the two cores. If you have a quad-core cpu, option <code>-j4</code> is recommended, except if you want to leave one core idle for other programs. In that case you can use <code>-j3</code>. Here is an example of multi-threaded compression:</p>
<pre>fsarchiver -j3 -o savefs /mnt/backup/gentoo-rootfs.fsa /dev/sda1</pre>
<p><a id="Splitting_the_archive_into_several_volumes" name="Splitting_the_archive_into_several_volumes"></a></p>
<h2>Splitting the archive into several volumes</h2>
<p>If the archive file is very big, you may want to split it into several small files. For instance, if the size of your backup is 8GB and you want to save it on DVD+RW discs, it may be useful to split the archive into volumes of 4.3GB. File splitting is supported ijn FSArchiver-0.3.0 and newer. To use it when you create an archive, you just have to use option <code>-s</code> to specific the size you want for each volume, in mega-bytes.</p>
<pre>fsarchiver savefs -s 4300 /data/backup-rhel-5.2-fsa033.fsa /dev/sda1</pre>
<p>The first volume always have an <code>.fsa</code> extension. The names of the next volumes will terminate with <code>.f01</code>, <code>.f02</code>, <code>.f03</code>, &#8230; When you restore the archive, you just have to specify the path to the first volume on the command line, and it will automatically use the next volumes if they are in the same directory. Else it will display a prompt, where you can specify another location for a volume.</p>
<p><a id="Execution_environment" name="Execution_environment"></a></p>
<h2>Execution environment</h2>
<p>FSArchiver requires the file-system tools to be installed to save the file-system attributes (when you do a <code>fsarchiver savefs</code>) and it also requires these tools to recreate the file-system when you do a <code>fsarchive restfs</code>. Anyway, you only need the tools of the current file-system to be installed. In other words, you don&#8217;t require xfsprogs to be installed if you only work on an ext3 file-system.</p>
<p>For these reasons, it&#8217;s a good idea to run FSArchiver from an environment with all the system tools installed. The best environment is the <a title="http://www.sysresccd.org" href="http://www.sysresccd.org/" rel="nofollow">latest SystemRescueCd version</a>, since it comes with all the linux file-system tools and a very recent FSArchiver version.</p>
<p>It&#8217;s also important that you make sure that SELinux is not enabled in the kernel running FSArchiver when you save a file-system which has been labeled by SELinux, or you can use FSArchiver with SELinux enabled if you are sure that the context where it&#8217;s running has enough privileges to read the extended-attributes related to SELinux. In the other cases, the kernel could return <code>unlabeled</code> instead of the real value of the <code>security.selinux</code> attribute. Then FSArchiver would not preserve these attributes and then the system would not work when you restore your root filesystem, or you would have to ask the SELinux to relabel the file-system. The SELinux support is disabled by default if you use FSArchiver from SystemRescueCd-1.1.3 or newer, so your SELinux labels will be preserved if you use FSArchiver from that environment.</p>
<p><a id="Detection_of_the_filesystems" name="Detection_of_the_filesystems"></a></p>
<h2>Detection of the filesystems</h2>
<p>FSArchiver is able to detect the filesystems which are installed on all the disks of a computer. This is very useful when you want to work on a partition when you don&#8217;t know what is its device name.</p>
<pre># fsarchiver probe simple
[=====DEVICE=====] [==FILESYS==] [=====LABEL=====] [====SIZE====] [MAJ] [MIN]
[/dev/sda1       ] [ext3       ] [boot           ] [   768.72 MB] [  8] [  1]
[/dev/sda2       ] [reiserfs   ] [gentoo         ] [    12.00 GB] [  8] [  2]
[/dev/sda3       ] [ext3       ] [data           ] [   350.00 GB] [  8] [  3]
[/dev/sda4       ] [ext3       ] [backup         ] [   300.00 GB] [  8] [  4]
[/dev/sda5       ] [lvm2pv     ] [               ] [   134.38 GB] [  8] [  5]
[/dev/sda6       ] [lvm2pv     ] [               ] [   106.24 GB] [  8] [  6]
[/dev/sdb1       ] [reiserfs   ] [usb8gb         ] [     7.46 GB] [  8] [ 17]</pre>
<p><a id="Command_line_and_its_arguments" name="Command_line_and_its_arguments"></a></p>
<h2>Command line and its arguments</h2>
<pre>====&gt; fsarchiver version 0.6.12 (2010-12-25) - http://www.fsarchiver.org &lt;====
Distributed under the GPL v2 license (GNU General Public License v2).
 * usage: fsarchiver [&lt;options&gt;] &lt;command&gt; &lt;archive&gt; [&lt;part1&gt; [&lt;part2&gt; [...]]]
&lt;commands&gt;
 * savefs: save filesystems to an archive file (backup a partition to a file)
 * restfs: restore filesystems from an archive (overwrites the existing data)
 * savedir: save directories to the archive (similar to a compressed tarball)
 * restdir: restore data from an archive which is not based on a filesystem
 * archinfo: show information about an existing archive file and its contents
 * probe [detailed]: show list of filesystems detected on the disks
&lt;options&gt;
 -o: overwrite the archive if it already exists instead of failing
 -v: verbose mode (can be used several times to increase the level of details)
 -d: debug mode (can be used several times to increase the level of details)
 -A: allow to save a filesystem which is mounted in read-write (live backup)
 -a: allow running savefs when partition mounted without the acl/xattr options
 -e &lt;pattern&gt;: exclude files and directories that match that pattern
 -L &lt;label&gt;: set the label of the archive (comment about the contents)
 -z &lt;level&gt;: compression level from 1 (very fast)  to  9 (very good) default=3
 -s &lt;mbsize&gt;: split the archive into several files of &lt;mbsize&gt; megabytes each
 -j &lt;count&gt;: create more than one compression thread. useful on multi-core cpu
 -c &lt;password&gt;: encrypt/decrypt data in archive, "-c -" for interactive password
 -h: show help and information about how to use fsarchiver with examples
 -V: show program version and exit
&lt;information&gt;
 * Support included for: lzo=yes, lzma=yes
 * support for ntfs filesystems is unstable: don't use it for production.
&lt;examples&gt;
 * save only one filesystem (/dev/sda1) to an archive:
   fsarchiver savefs /data/myarchive1.fsa /dev/sda1
 * save two filesystems (/dev/sda1 and /dev/sdb1) to an archive:
   fsarchiver savefs /data/myarchive2.fsa /dev/sda1 /dev/sdb1
 * restore the first filesystem from an archive (first = number 0):
   fsarchiver restfs /data/myarchive2.fsa id=0,dest=/dev/sda1
 * restore the second filesystem from an archive (second = number 1):
   fsarchiver restfs /data/myarchive2.fsa id=1,dest=/dev/sdb1
 * restore two filesystems from an archive (number 0 and 1):
   fsarchiver restfs /data/arch2.fsa id=0,dest=/dev/sda1 id=1,dest=/dev/sdb1
 * restore a filesystem from an archive and convert it to reiserfs:
   fsarchiver restfs /data/myarchive1.fsa id=0,dest=/dev/sda1,mkfs=reiserfs
 * save the contents of /usr/src/linux to an archive (similar to tar):
   fsarchiver savedir /data/linux-sources.fsa /usr/src/linux
 * save a filesystem (/dev/sda1) to an archive split into volumes of 680MB:
   fsarchiver savefs -s 680 /data/myarchive1.fsa /dev/sda1
 * save a filesystem and exclude all files/dirs called 'pagefile.*':
   fsarchiver savefs /data/myarchive.fsa /dev/sda1 --exclude='pagefile.*'
 * generic exclude for 'share' such as '/usr/share' and '/usr/local/share':
   fsarchiver savefs /data/myarchive.fsa --exclude=share
 * absolute exclude valid for '/usr/share' but not for '/usr/local/share':
   fsarchiver savefs /data/myarchive.fsa --exclude=/usr/share
 * save a filesystem (/dev/sda1) to an encrypted archive:
   fsarchiver savefs -c mypassword /data/myarchive1.fsa /dev/sda1
 * Same as before but prompt for password in the terminal:
   fsarchiver savefs -c - /data/myarchive1.fsa /dev/sda1
 * extract an archive made of simple files to /tmp/extract:
   fsarchiver restdir /data/linux-sources.fsa /tmp/extract
 * show information about an archive and its file systems:
   fsarchiver archinfo /data/myarchive2.fsa</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/851/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LVM快照(snapshot)备份(转载)</title>
		<link>http://www.fallday.org/archives/846</link>
		<comments>http://www.fallday.org/archives/846#comments</comments>
		<pubDate>Thu, 19 Apr 2012 15:19:26 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[LVM]]></category>
		<category><![CDATA[Snapshot]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=846</guid>
		<description><![CDATA[Logical Volume Manager (LVM)提供了对任意一个Logical Volume(LV)做“快照”(snapshot)的功能，以此来获得一个分区的状态一致性备份。 在某一个状态下做备份的时候，可能有应用正在访问某一个文件或者数据库，这就是使得备份的时候文件处于一个状态，而备份完后，文件却处于另外一个状态，从而造成备份的非一致性，这种状态恢复数据库数据几乎不会成功。 状态的解决办法是将其分区挂载为只读，然后通过数据库的表级别锁定(table-level write locks)甚至停止数据库来备份数据。所有这些方法无意严重影响了服务的可用性。使用LVM snapshot既可以获得一致性备份，又不会影响服务器的可用性。 要提醒一点是，snapshot这种方法仅对LVM有效，对于非LVM文件系统无效。 snapshot的实现有多种方式(参考文章最后的连接)，这里说说LVM中snapshot的“写时复制”(copy on write) 的实现方法。 当一个snapshot创建的时候，仅拷贝原始卷里数据的元数据(meta- data)。创建的时候，并不会有数据的物理拷贝，因此snapshot的创建几乎是实时的，当原始卷上有写操作执行时，snapshot跟踪原始卷块的改变，这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里，因此这个原理的实现叫做写时复制(copy-on- write)。 在写操作写入块之前，CoW将原始数据移动到snapshot空间里，这样就保证了所有的数据在snapshot创建时保持一致。而对于snapshot的读操作，如果是读取数据块是没有修改过的，那么会将读操作直接重定向到原始卷上，如果是要读取已经修改过的块，那么就读取拷贝到snapshot中的块。 这样，通常的文件I/0流程有一个改变，那就是在文件系统和设备驱动之间增加了一个cow层，变成了下面这个样子： file I/0 —&#62; filesystem — &#62;CoW –&#62; block I /O 下面的图也许可以比较容易了解CoW的原理： 采取CoW实现方式时，snapshot的大小并不需要和原始卷一样大，其大小仅仅只需要考虑两个方面：从shapshot创建到释放这段时间内，估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息，那么这个snapshot立刻被释放，从而无法使用，从而导致这个snapshot无效。所以，非常重要的一点，一定要在snapshot的生命周期里，做完你需要做得事情。当然，如果你的snapshot大小和原始卷一样大，甚至还要大，那它的寿命就是“与天齐寿”了。 snapshot其实除了备份以外，还有很多其他用途： 1）虚拟化 在使用 LVM2 时，快照可以不是只读的。这意味着，在创建快照之后， 可以像常规块设备一样挂载和读写快照。 因为流行的虚拟化系统（比如 Xen、VMWare、Qemu 和 KVM）可以将块设备用作 guest 映像，所以可以创建这些映像的完整拷贝，并根据需要使用它们，它们就像是内存占用量很低的虚拟机。这样做的好处是部署迅速（创建快照的时间常常不超过几秒）和节省空间（guest 共享原映像的大多数数据）。 设置的步骤如下： 1. 为原映像创建一个逻辑卷。 2. 使用这个 LV 作为磁盘映像安装 guest 虚拟机。 [...]]]></description>
			<content:encoded><![CDATA[<p>Logical Volume Manager (LVM)提供了对任意一个Logical Volume(LV)做“快照”(snapshot)的功能，以此来获得一个分区的状态一致性备份。</p>
<p>在某一个状态下做备份的时候，可能有应用正在访问某一个文件或者数据库，这就是使得备份的时候文件处于一个状态，而备份完后，文件却处于另外一个状态，从而造成备份的非一致性，这种状态恢复数据库数据几乎不会成功。</p>
<p>状态的解决办法是将其分区挂载为只读，然后通过数据库的表级别锁定(table-level write locks)甚至停止数据库来备份数据。所有这些方法无意严重影响了服务的可用性。使用LVM snapshot既可以获得一致性备份，又不会影响服务器的可用性。</p>
<p>要提醒一点是，snapshot这种方法仅对LVM有效，对于非LVM文件系统无效。</p>
<p><span id="more-846"></span>snapshot的实现有多种方式(参考文章最后的连接)，这里说说LVM中snapshot的“写时复制”(copy on write) 的实现方法。</p>
<p>当一个snapshot创建的时候，仅拷贝原始卷里数据的元数据(meta- data)。创建的时候，并不会有数据的物理拷贝，因此snapshot的创建几乎是实时的，当原始卷上有写操作执行时，snapshot跟踪原始卷块的改变，这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里，因此这个原理的实现叫做写时复制(copy-on- write)。</p>
<p>在写操作写入块之前，CoW将原始数据移动到snapshot空间里，这样就保证了所有的数据在snapshot创建时保持一致。而对于snapshot的读操作，如果是读取数据块是没有修改过的，那么会将读操作直接重定向到原始卷上，如果是要读取已经修改过的块，那么就读取拷贝到snapshot中的块。</p>
<p>这样，通常的文件I/0流程有一个改变，那就是在文件系统和设备驱动之间增加了一个cow层，变成了下面这个样子：<br />
file I/0 —&gt; filesystem — &gt;CoW –&gt; block I /O</p>
<p>下面的图也许可以比较容易了解CoW的原理：</p>
<p><img src="data:image/png;base64,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" alt="" /></p>
<p>采取CoW实现方式时，snapshot的大小并不需要和原始卷一样大，其大小仅仅只需要考虑两个方面：从shapshot创建到释放这段时间内，估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息，那么这个snapshot立刻被释放，从而无法使用，从而导致这个snapshot无效。所以，非常重要的一点，一定要在snapshot的生命周期里，做完你需要做得事情。当然，如果你的snapshot大小和原始卷一样大，甚至还要大，那它的寿命就是“与天齐寿”了。</p>
<p>snapshot其实除了备份以外，还有很多其他用途：</p>
<p>1）虚拟化</p>
<p>在使用 LVM2 时，快照可以不是只读的。这意味着，在创建快照之后， 可以像常规块设备一样挂载和读写快照。</p>
<p>因为流行的虚拟化系统（比如 Xen、VMWare、Qemu 和 KVM）可以将块设备用作 guest 映像，所以可以创建这些映像的完整拷贝，并根据需要使用它们，它们就像是内存占用量很低的虚拟机。这样做的好处是部署迅速（创建快照的时间常常不超过几秒）和节省空间（guest 共享原映像的大多数数据）。</p>
<p>设置的步骤如下：</p>
<p>1. 为原映像创建一个逻辑卷。<br />
2. 使用这个 LV 作为磁盘映像安装 guest 虚拟机。<br />
3. 暂停这个虚拟机。内存映像可以是一个常规文件，所有其他快照都放在里面。<br />
4. 为原 LV 创建一个可读写的快照。<br />
5. 使用快照卷作为磁盘映像生成一个新的虚拟机。如果需要的话，要修改网络/控制台设置。<br />
6. 登录已经创建的虚拟机，修改网络设置/主机名。</p>
<p>完成这些步骤之后， 就可以让用户访问刚创建的虚拟机了。如果需要另一个虚拟机，那么只需重复步骤 4 到 6（所以不需要重新安装虚拟机）。还可以用一个脚本自动执行这些步骤。</p>
<p>在使用完虚拟机之后， 可以停止虚拟机并销毁快照。</p>
<p>2）数据回溯</p>
<p>在一个生产系统上要执行一些操作，需要慎之又慎，即便在模拟环境中做过很多次测试都没有问题，但是并不能保证在生产环境就一定成功，于是这个时候，我们把系统做一个snapshot，这样一旦新操作出现问题，立刻回溯到创建 snapshot的时间点，当然你也可以认为这是一个备份的扩展使用。</p>
<p>最后，我们举一些例子，加深对snapshot的理解。</p>
<p>a) 创建一个20M的snapshot，执行一些操作看看CoW的动作。</p>
<p>我们举一个例子来说明如何创建和使用snapshot。我们假定创建一个20M的snapshot，这就意味着在snapshot生命周期里，你仅能有20M的数据量改变。</p>
<p>下面的命令，为/dev/vg/lvdata创建/dev/vg/lvdata-sp</p>
<p># lvcreate -L20M -s -n lvdata-sp /dev/vg/lvdata<br />
Logical volume “lvdata-sp” created<br />
其中lvdata大小为20MB。</p>
<p># lvdisplay /dev/vg/lvdata-sp</p>
<p>— Logical volume —</p>
<p>LV Name /dev/vg/lvdata-sp<br />
VG Name vg<br />
LV UUID Yl0fQU-Ve9T-lfmp-xJPq-Uwrd-RVVM-lDDVz0<br />
LV Write Access read/write<br />
LV snapshot status active destination for /dev/vg/lvdata<br />
LV Status available<br />
# open 1<br />
LV Size 200.00 MB<br />
Current LE 50<br />
COW-table size 20.00 MB<br />
COW-table LE 5<br />
Allocated to snapshot 0.27%<br />
Snapshot chunk size 8.00 KB<br />
Segments 1<br />
Allocation inherit<br />
Read ahead sectors 0<br />
Block device 253:0</p>
<p>上面的 Allocated to snapshot 0.27%是我们关心的，表示目前还有99.73%的空间没有使用。</p>
<p>我们尝试在lvdata创建一个10M的文件，再看看这个参数值。</p>
<p># mount /dev/vg/lvdata /media/lvdata/<br />
# dd if=/dev/hda of=/media/lvdata/10M bs=1M count=10</p>
<p>10+0 records in<br />
10+0 records out<br />
10485760 bytes (10 MB) copied, 0.272393 seconds, 38.5 MB/s</p>
<p># lvdisplay /dev/vg/lvdata-sp</p>
<p>— Logical volume —</p>
<p>LV Name /dev/vg/lvdata-sp<br />
VG Name vg<br />
LV UUID Yl0fQU-Ve9T-lfmp-xJPq-Uwrd-RVVM-lDDVz0<br />
LV Write Access read/write<br />
LV snapshot status active destination for /dev/vg/lvdata<br />
LV Status available<br />
# open 0<br />
LV Size 200.00 MB<br />
Current LE 50<br />
COW-table size 20.00 MB<br />
COW-table LE 5<br />
Allocated to snapshot 51.02%<br />
Snapshot chunk size 8.00 KB<br />
Segments 1<br />
Allocation inherit<br />
Read ahead sectors 0<br />
Block device 253:0</p>
<p>”Allocated to snapshot 51.02%“,符合我们的预期。此时snapshot还剩下大概10M不到的空间了，如果我么再在lvdata上创建一个12M的文件，会发生什么呢？</p>
<p>#dd if=/dev/hda of=/media/lvdata/12M bs=1M count=12</p>
<p>12+0 records in<br />
12+0 records out<br />
12582912 bytes (13 MB) copied, 0.288311 seconds, 43.6 MB/s<br />
device-mapper: snapshots: Invalidating snapshot: Unable to allocate exception.</p>
<p>创建文件的过程中，一个报错出现了，snapshot已经无效。我们看看snapshot卷的详细信息。</p>
<p># lvdisplay /dev/vg/lvdata-sp<br />
/dev/vg/lvdata-sp: read failed after 0 of 4096 at 0: 输入/输出错误</p>
<p>— Logical volume —</p>
<p>LV Name /dev/vg/lvdata-sp<br />
VG Name vg<br />
LV UUID Yl0fQU-Ve9T-lfmp-xJPq-Uwrd-RVVM-lDDVz0<br />
LV Write Access read/write<br />
LV snapshot status INACTIVE destination for /dev/vg/lvdata<br />
LV Status available<br />
# open 0<br />
LV Size 200.00 MB<br />
Current LE 50<br />
COW-table size 20.00 MB<br />
COW-table LE 5<br />
Snapshot chunk size 8.00 KB<br />
Segments 1<br />
Allocation inherit<br />
Read ahead sectors 0</p>
<p>整个snapshot卷已经出现I/0错误了，而且snapshot的状态也是“INACTIVE”。</p>
<p>是否能挂载上来呢？</p>
<p># mount /dev/vg/lvdata-sp /media/snapshot/<br />
mount: you must specify the filesystem type</p>
<p>#dmesg</p>
<p>Buffer I/O error on device dm-0, logical block 0<br />
Buffer I/O error on device dm-0, logical block 1<br />
Buffer I/O error on device dm-0, logical block 2<br />
Buffer I/O error on device dm-0, logical block 3<br />
Buffer I/O error on device dm-0, logical block 4<br />
Buffer I/O error on device dm-0, logical block 5<br />
Buffer I/O error on device dm-0, logical block 6<br />
Buffer I/O error on device dm-0, logical block 7<br />
Buffer I/O error on device dm-0, logical block 8<br />
Buffer I/O error on device dm-0, logical block 9<br />
hfs: unable to find HFS+ superblock</p>
<p>从dmesg的错误信息来看，超级块的信息也丢失了</p>
<p>尝试激活一下lvdata-sp</p>
<p># lvchange -ay /dev/vg/lvdata-sp</p>
<p>/dev/vg/lvdata-sp: read failed after 0 of 4096 at 0: 输入/输出错误</p>
<p>恩，这个snapshot已经被释放了，所以剩下要做得事情就是删除它。</p>
<p># lvremove /dev/vg/lvdata-sp</p>
<p>/dev/vg/lvdata-sp: read failed after 0 of 4096 at 0: 输入/输出错误<br />
Do you really want to remove active logical volume “lvdata-sp”? [y/n]: y<br />
Logical volume “lvdata-sp” successfully removed</p>
<p>b）利用snapshot在线备份MySQL数据库（或者其他数据库）</p>
<p>流程是先做一个flush操作，并锁定表，然后创建snapshot，然后解锁，然后备份数据，最后释放snapshot。这样，MySQL几乎不会中断其运行。</p>
<p>FLUSH TABLES WITH READ LOCK;<br />
! lvcreate –size 100m –snapshot –name snap /dev/VolGroup01/LogVol00<br />
UNLOCK TABLES;</p>
<p>接着做一些备份的工作</p>
<p>mkdir /snap<br />
mount /dev/VolGroup01/snap /snap<br />
# This is where you back up whatever you need from /snap, e.g. rsync(1)<br />
umount /snap<br />
lvremove /dev/VolGroup01/snap<br />
rmdir /snap</p>
<p>(转载自百度文库: http://wenku.baidu.com/view/8e7b4f215901020207409cbe.html )</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/846/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache基于MySQL的简单用户认证支持</title>
		<link>http://www.fallday.org/archives/843</link>
		<comments>http://www.fallday.org/archives/843#comments</comments>
		<pubDate>Wed, 18 Apr 2012 15:18:39 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[用户认证]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=843</guid>
		<description><![CDATA[在Apache下可能很容易实现基本MySQL的简单用户认证支持。 需要加载的Apache模块: auth_basic_module authn_dbd_module dbd_module httpd.conf配置： DBDriver mysql DBDParams "dbname=xxx,user=xxx,pass=xxx" AuthName "Restricted Area" AuthType Basic AuthBasicProvider dbd require valid-user AuthDBDUserPWQuery \ "SELECT encrypt(password) FROM users WHERE username = %s" Password Formats说明: http://httpd.apache.org/docs/2.2/en/misc/password_encryptions.html]]></description>
			<content:encoded><![CDATA[<p>在Apache下可能很容易实现基本MySQL的简单用户认证支持。</p>
<p>需要加载的Apache模块:</p>
<p>auth_basic_module<br />
authn_dbd_module<br />
dbd_module</p>
<p>httpd.conf配置：<br />
<span id="more-843"></span></p>
<pre>
DBDriver mysql
DBDParams "dbname=xxx,user=xxx,pass=xxx"

<Directory /xxx>
  AuthName "Restricted Area"
  AuthType Basic
  AuthBasicProvider dbd

  require valid-user

  AuthDBDUserPWQuery \
    "SELECT encrypt(password) FROM users WHERE username = %s"
</Directory>
</pre>
<p>Password Formats说明:<br />
<a href="http://httpd.apache.org/docs/2.2/en/misc/password_encryptions.html">http://httpd.apache.org/docs/2.2/en/misc/password_encryptions.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/843/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iptables: The IP packet’s flow</title>
		<link>http://www.fallday.org/archives/831</link>
		<comments>http://www.fallday.org/archives/831#comments</comments>
		<pubDate>Mon, 16 Apr 2012 05:41:26 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[iptables]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=831</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fallday.org/archives/831/ipmasq-html2x" rel="attachment wp-att-832"><img class="alignnone size-full wp-image-832" title="ipmasq-html2x" src="http://www.fallday.org/wp-content/uploads/2012/04/ipmasq-html2x.gif" alt="" width="400" height="300" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/831/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>带MPPE加密的PPTP VPN无法访问一些网站</title>
		<link>http://www.fallday.org/archives/824</link>
		<comments>http://www.fallday.org/archives/824#comments</comments>
		<pubDate>Sun, 15 Apr 2012 10:37:35 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[MPPE]]></category>
		<category><![CDATA[PPTP]]></category>
		<category><![CDATA[VPN]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=824</guid>
		<description><![CDATA[朋友在用自己的PPTP VPN报告一些网站(比如facebook上的一些应用)通过VPN无法访问，觉得很奇怪。而且发现这个现象是在有MPPE加密时有，如果PPTP VPN连接无加密则正常。 研究了一下是MTU的问题，Linux有MPPE加密时MTU自动减4个字节及1396，Windows默认是1400 可以在linux下修改MTU为1400, 运行 ifconfig ppp0 mtu 1400 或者修改/etc/ppp/ip-up,在倒数第二行也就是exit 0前面加上/sbin/ifconfig $1 mtu 1400]]></description>
			<content:encoded><![CDATA[<p>朋友在用自己的PPTP VPN报告一些网站(比如facebook上的一些应用)通过VPN无法访问，觉得很奇怪。而且发现这个现象是在有MPPE加密时有，如果PPTP VPN连接无加密则正常。</p>
<p>研究了一下是MTU的问题，Linux有MPPE加密时MTU自动减4个字节及1396，Windows默认是1400</p>
<p>可以在linux下修改MTU为1400, 运行 ifconfig ppp0 mtu 1400</p>
<p>或者修改/etc/ppp/ip-up,在倒数第二行也就是exit 0前面加上/sbin/ifconfig $1 mtu 1400</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/824/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>回到Linode</title>
		<link>http://www.fallday.org/archives/778</link>
		<comments>http://www.fallday.org/archives/778#comments</comments>
		<pubDate>Tue, 03 Apr 2012 12:27:28 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[linode]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=778</guid>
		<description><![CDATA[最近Amazon EC2的访问越来越不稳定，这么几年下来，试来试去，Linode的体验真还是不错的，唯一的缺点就是贵。狠了一下心，还是回到了Linode。贴一下我的referral code，欢迎使用。 Referral code 011ab6851bf4347c627afdf478d496b0a3380bed Referral URL http://www.linode.com/ 也欢迎合租，联系请发邮件 admin@fallday.org]]></description>
			<content:encoded><![CDATA[<p>最近Amazon EC2的访问越来越不稳定，这么几年下来，试来试去，Linode的体验真还是不错的，唯一的缺点就是贵。狠了一下心，还是回到了Linode。贴一下我的referral code，欢迎使用。</p>
<table>
<tbody>
<tr>
<td>Referral code</td>
<td><code>011ab6851bf4347c627afdf478d496b0a3380bed</code></td>
</tr>
<tr>
<td>Referral URL</td>
<td><code><a href="http://www.linode.com/?r=011ab6851bf4347c627afdf478d496b0a3380bed">http://www.linode.com/</a></code></td>
</tr>
</tbody>
</table>
<p>也欢迎合租，联系请发邮件 admin@fallday.org</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/778/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>DD-WRT路由器自动连接PPTP VPN</title>
		<link>http://www.fallday.org/archives/770</link>
		<comments>http://www.fallday.org/archives/770#comments</comments>
		<pubDate>Sat, 10 Mar 2012 11:12:32 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[DD-WRT]]></category>
		<category><![CDATA[PPTP]]></category>
		<category><![CDATA[VPN]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=770</guid>
		<description><![CDATA[有朋友希望通过路由器自动连接VPN让XBOX 360可以访问Youtube，向他推荐了款支持DD-WRT/OpenWRT的路由器。路由器自带DD-WRT，配置VPN客户端也很简单，但默认配置连接后VPN并不是路由器的默认路由。如果想成为默认路由，需要自己设定。 VPN PPTP Client设置 远程子网：PPTP Server设定的VPN网段 远程子网：255.255.255.0 MPPE加密填写：mppe required,no40,no56,stateless 在管理中命令界面设置启动脚本 sleep 120 OLDGW=$(nvram get wan_gateway) VPNSRV=$(nvram get pptpd_client_srvip) VPNSRVSUB=$(nvram get pptpd_client_srvsub) PPTPDEV=$(route -n &#124; grep ^${VPNSRVSUB%.[0-9]*} &#124; awk '{print $NF}' &#124; head -n 1) VPNGW=$(ifconfig $PPTPDEV &#124; grep -Eo "P-t-P:([0-9.]+)" &#124; cut -d: -f2) route add -host $VPNSRV gw $OLDGW route del default gw [...]]]></description>
			<content:encoded><![CDATA[<p>有朋友希望通过路由器自动连接VPN让XBOX 360可以访问Youtube，向他推荐了款支持DD-WRT/OpenWRT的路由器。路由器自带DD-WRT，配置VPN客户端也很简单，但默认配置连接后VPN并不是路由器的默认路由。如果想成为默认路由，需要自己设定。</p>
<p>VPN PPTP Client设置<br />
远程子网：PPTP Server设定的VPN网段<br />
远程子网：255.255.255.0<br />
MPPE加密填写：mppe required,no40,no56,stateless<br />
<span id="more-770"></span><br />
在管理中命令界面设置启动脚本</p>
<pre>
sleep 120
OLDGW=$(nvram get wan_gateway)
VPNSRV=$(nvram get pptpd_client_srvip)
VPNSRVSUB=$(nvram get pptpd_client_srvsub)
PPTPDEV=$(route -n | grep ^${VPNSRVSUB%.[0-9]*} | awk '{print $NF}' | head -n 1)
VPNGW=$(ifconfig $PPTPDEV | grep -Eo "P-t-P:([0-9.]+)" | cut -d: -f2)
route add -host $VPNSRV gw $OLDGW
route del default gw $OLDGW
route add default gw $VPNGW
</pre>
<p>保存为启动脚本重启路由器。</p>
<p>如果要自己指定某些IP不走VPN网关，可以加上自己的路由规则。<br />
route add -net xxx.xxx.0.0/16 gw $OLDGW</p>
<p>另推荐几篇文章：<br />
1. DD-WRT搭配autoddvpn全自动FQ配置精简教程 （ http://duke8253.com/?p=124 ）<br />
2. autoddvpn &#8211; DD-WRT自動翻牆解決方案 （ http://code.google.com/p/autoddvpn/ ）<br />
3. chnroutes &#8211; Scripts to generate special routes for china ips （ http://code.google.com/p/chnroutes/ ）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/770/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Linux下用curlftpfs挂载FTP服务器 [CentOS][转]</title>
		<link>http://www.fallday.org/archives/763</link>
		<comments>http://www.fallday.org/archives/763#comments</comments>
		<pubDate>Sat, 21 Jan 2012 03:18:15 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[curlftpfs]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[fuse]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=763</guid>
		<description><![CDATA[A、安装curlftpfs A.1、安装DAG repository Fedora可以直接yum install curlftpfs，CentOS不行，得用DAG repository，所以得先安装DAG repository。 rpm -Uhv http://apt.sw.be/RedHat/el5/en/x86_64/rpmforge/RPMS//rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm A.2、安装 curlftpfs yum install curlftpfs B、挂载FTP服务器 B.1、用curlftpfs命令挂载 curlftpfs -o codepage=utf8 ftp://username:password@192.168.192.168 /ftp codepage：      编码 username：      FTP用户名 password:       FTP密码 192.168.1.111:  FTP地址 /ftp:           准备挂载到的路径 B.2、卸载挂载 fusermount -u /ftp 或 umount /ftp B.3、开放权限 这样其它用户也能读写了,uid和gid改成你自己的id sudo curlftpfs –o rw,allow_other,uid=0,gid=0 ftp:// username: password @192.168.1.111 /ftp B.4、开机自动挂载 echo “curlftpfs#username:password@192.168.1.111 /ftp [...]]]></description>
			<content:encoded><![CDATA[<p>A、安装curlftpfs</p>
<p>A.1、安装DAG repository</p>
<p><a title="Fedora" href="http://www.linuxidc.com/topicnews.aspx?tid=5">Fedora</a>可以直接yum install curlftpfs，CentOS不行，得用DAG repository，所以得先安装DAG repository。</p>
<p>rpm -Uhv http://apt.sw.be/<a title="RedHat" href="http://www.linuxidc.com/topicnews.aspx?tid=10">RedHat</a>/el5/en/x86_64/rpmforge/RPMS//rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm</p>
<p>A.2、安装 curlftpfs</p>
<p>yum install curlftpfs</p>
<p><span id="more-763"></span>B、挂载FTP服务器</p>
<p>B.1、用curlftpfs命令挂载</p>
<p>curlftpfs -o codepage=utf8 ftp://username:password@192.168.192.168 /ftp</p>
<p>codepage：      编码</p>
<p>username：      FTP用户名</p>
<p>password:       FTP密码<br />
192.168.1.111:  FTP地址<br />
/ftp:           准备挂载到的路径</p>
<p>B.2、卸载挂载</p>
<p>fusermount -u /ftp</p>
<p>或</p>
<p>umount /ftp</p>
<p>B.3、开放权限</p>
<p>这样其它用户也能读写了,uid和gid改成你自己的id</p>
<p>sudo curlftpfs –o rw,allow_other,uid=0,gid=0 ftp:// username: password @192.168.1.111 /ftp</p>
<p>B.4、开机自动挂载<br />
echo “curlftpfs#username:password@192.168.1.111 /ftp fuse allow_other,uid=0,gid=0 0 0&#8243; &gt;&gt; /etc/fstab</p>
<p>原文链接: http://www.linuxidc.com/Linux/2011-05/35917.htm</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/763/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

