LVM HOWTO

AJ Lewis


          <alewis(at)redhat.com>
        

Copyright © 2002-2003 Sistina Software, Inc

Copyright © 2004-2005 Red Hat, Inc
Revision History                                                             
Revision 0.16            2005-07-15            Revised by: ajl               
Added lvm2 boot-time scripts info; Added "Recover physical volume metadata"  
section - thanks to Maximilian Attems for the patch                          
Revision 0.15            2005-06-09            Revised by: ajl               
Removed references to xfs_freeze - it is no longer needed; Updated snapshots 
subsection in Anatomy of LVM section; Added a couple entries to the LVM2 FAQ;
Fixed a couple typos                                                         
Revision 0.14            2004-10-06            Revised by: ajl               
Added reference to lvm2_createinitrd in source tree; Adjusted lvcreate       
example slightly; Added 'vgchange -ay' in 'Moving a volume group to another  
system' recipe                                                               
Revision 0.13            2004-08-16            Revised by: ajl               
Clarify symlink farm description; Fix dm control device major number; Remove 
/boot from vg in small lvm setup example; Add notes about /boot and / on LVM;
Remove outdated link;                                                        
Revision 0.12            2004-06-07            Revised by: ajl               
Updated LVM2 FAQ entries                                                     
Revision 0.11            2004-05-03            Revised by: ajl               
Updated LVM2 FAQ entries                                                     
Revision 0.10            2004-04-22            Revised by: ajl               
removed -print0 from find command after receiving reports that it doesn't    
work                                                                         
Revision 0.9             2004-04-16            Revised by: ajl               
Added -print0 to find command before piping it to cpio; Changed vgimport     
command line for LVM 2; Added ext3 to the ext2 resize section; Updated FAQ;  
Updated Links section                                                        
Revision 0.8             2004-02-25            Revised by: ajl               
Updated CVS locations and FTP links; Added section on extending a JFS        
filesystem; Fixed typos - Ran aspell against document                        
Revision 0.7             2004-02-16            Revised by: ajl               
Updated to include LVM 2 and device mapper information; Updated email        
addresses; Updated copyright; Added FAQ section; Added document license;     
Updated to docbook 4.2                                                       
Revision 0.6             2003-12-09            Revised by: ajl               
Updated for LVM 1.0.8; fixed broken link; Clarified redhat init script       
section;                                                                     
Revision 0.5             2003-02-10            Revised by: ajl               
Updated Redhat initscript information for 7.0 and above; Added information on
removing a partition table from a disk if pvcreate fails; Default PE size is 
32MB now; Updated method for snapshotting under XFS.                         
Revision 0.4             2002-12-16            Revised by: ajl               
Updated for LVM 1.0.6                                                        
Revision 0.3             2002-09-16            Revised by: ajl               
removed example pvmove from Command Operations section - we now just point to
the more detailed recipe on pvmove that contains various warnings and such   
Revision 0.2             2002-09-11            Revised by: ajl               
Updated for LVM 1.0.5 and converted to DocBook XML 4.1.2.                    
Revision 0.1             2002-04-28            Revised by: gf                
Initial conversion from Sistina's LaTeX source and import to tLDP in LinuxDoc
format.                                                                      


  This document describes how to build, install, and configure LVM for Linux.
A basic description of LVM is also included. This version of the HowTo is for
LVM 2 with device-mapper, as well as LVM 1.0.8.

  Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation License, Version 1.2 published by the
Free Software Foundation; with no Invariant Sections, no Front-Cover Texts
and no Back-Cover Texts. A copy of the license is included in the section
entitled "GNU Free Documentation License".

  This document is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY, either expressed or implied. While every effort has
been taken to ensure the accuracy of the information documented herein, the
author(s)/editor(s)/maintainer(s)/contributor(s) assumes NO RESPONSIBILITY
for any errors, or for any damages, direct or consequential, as a result of
the use of the information documented herein.

-----------------------------------------------------------------------------
Table of Contents
Introduction
    1. Latest Version
    2. Disclaimer
    3. Contributors
   
   
1. What is LVM?
2. What is Logical Volume Management?
    2.1. Why would I want it?
    2.2. Benefits of Logical Volume Management on a Small System
    2.3. Benefits of Logical Volume Management on a Large System
   
   
3. Anatomy of LVM
    3.1. volume group (VG)
    3.2. physical volume (PV)
    3.3. logical volume (LV)
    3.4. physical extent (PE)
    3.5. logical extent (LE)
    3.6. Tying it all together
    3.7. mapping modes (linear/striped)
    3.8. Snapshots
   
   
4. Frequently Asked Questions
    4.1. LVM 2 FAQ
    4.2. LVM 1 FAQ
   
   
5. Acquiring LVM
    5.1. Download the source
    5.2. Download the development source via CVS
    5.3. Before You Begin
    5.4. Initial Setup
    5.5. Checking Out Source Code
    5.6. Code Updates
    5.7. Starting a Project
    5.8. Hacking the Code
    5.9. Conflicts
   
   
6. Building the kernel modules
    6.1. Building the device-mapper module
    6.2. Build the LVM 1 kernel module
   
   
7. LVM 1 Boot time scripts
    7.1. Caldera
    7.2. Debian
    7.3. Mandrake
    7.4. Redhat
    7.5. Slackware
    7.6. SuSE
   
   
8. LVM 2 Boot Time Scripts
9. Building LVM from the Source
    9.1. Make LVM library and tools
    9.2. Install LVM library and tools
    9.3. Removing LVM library and tools
   
   
10. Transitioning from previous versions of LVM to LVM 1.0.8
    10.1. Upgrading to LVM 1.0.8 with a non-LVM root partition
    10.2. Upgrading to LVM 1.0.8 with an LVM root partition and initrd
   
   
11. Common Tasks
    11.1. Initializing disks or disk partitions
    11.2. Creating a volume group
    11.3. Activating a volume group
    11.4. Removing a volume group
    11.5. Adding physical volumes to a volume group
    11.6. Removing physical volumes from a volume group
    11.7. Creating a logical volume
    11.8. Removing a logical volume
    11.9. Extending a logical volume
    11.10. Reducing a logical volume
    11.11. Migrating data off of a physical volume
   
   
12. Disk partitioning
    12.1. Multiple partitions on the same disk
    12.2. Sun disk labels
   
   
13. Recipes
    13.1. Setting up LVM on three SCSI disks
    13.2. Setting up LVM on three SCSI disks with striping
    13.3. Add a new disk to a multi-disk SCSI system
    13.4. Taking a Backup Using Snapshots
    13.5. Removing an Old Disk
    13.6. Moving a volume group to another system
    13.7. Splitting a volume group
    13.8. Converting a root filesystem to LVM 1
    13.9. Recover physical volume metadata
   
   
A. Dangerous Operations
    A.1. Restoring the VG UUIDs using uuid_fixer
    A.2. Sharing LVM volumes
   
   
B. Reporting Errors and Bugs
C. Contact and Links
    C.1. Mail lists
    C.2. Links
   
   
D. GNU Free Documentation License
    D.1. PREAMBLE
    D.2. APPLICABILITY AND DEFINITIONS
    D.3. VERBATIM COPYING
    D.4. COPYING IN QUANTITY
    D.5. MODIFICATIONS
    D.6. COMBINING DOCUMENTS
    D.7. COLLECTIONS OF DOCUMENTS
    D.8. AGGREGATION WITH INDEPENDENT WORKS
    D.9. TRANSLATION
    D.10. TERMINATION
    D.11. FUTURE REVISIONS OF THIS LICENSE
    D.12. ADDENDUM: How to use this License for your documents
   
   

-----------------------------------------------------------------------------
Introduction

  This is an attempt to collect everything needed to know to get LVM up and
running. The entire process of getting, compiling, installing, and setting up
LVM will be covered. Pointers to LVM configurations that have been tested
with will also be included. This version of the HowTo is for LVM 2 with
device-mapper and LVM 1.0.8.

  All previous versions of LVM are considered obsolete and are only kept for
historical reasons. This document makes no attempt to explain or describe the
workings or use of those versions.
-----------------------------------------------------------------------------

1. Latest Version

  We will keep the latest version of this HowTo in the CVS with the other LDP
Howtos. You can get it by checking out ``LDP/howto/docbook/LVM-HOWTO.xml''
from the tLDP CVS server. You should always be able to get a human readable
version of this HowTo from the   http://www.tldp.org/HOWTO/LVM-HOWTO.html
-----------------------------------------------------------------------------

2. Disclaimer

  This document is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY, either expressed or implied. While every effort has
been taken to ensure the accuracy of the information documented herein, the
author(s)/editor(s)/maintainer(s)/contributor(s) assumes NO RESPONSIBILITY
for any errors, or for any damages, direct or consequential, as a result of
the use of the information documented herein.
-----------------------------------------------------------------------------

3. Contributors

  List of everyone who has put words into this file.

  *   [mailto:alewis@redhat.com_NOSPAM] AJ Lewis
   
  *   [mailto:thornber@redhat.com_NOSPAM] Joe Thornber
   
  *   [mailto:pcaulfie@redhat.com_NOSPAM] Patrick Caulfield
   
  *   [mailto:agk@redhat.com_NOSPAM] Alasdair Kergon
   
  *   Jochen Radmacher - JFS extend information
   

  Please notify the HowTo maintainer if you believe you should be listed
above.
-----------------------------------------------------------------------------

Chapter 1. What is LVM?

  LVM is a Logical Volume Manager for the Linux operating system. There are
now two version of LVM for Linux:

  *   LVM 2 - The latest and greatest version of LVM for Linux.
   
      LVM 2 is almost completely backward compatible with volumes created
    with LVM 1. The exception to this is snapshots (You must remove snapshot
    volumes before upgrading to LVM 2)
   
      LVM 2 uses the device mapper kernel driver. Device mapper support is in
    the 2.6 kernel tree and there are patches available for current 2.4
    kernels.
   
  *   LVM 1 - The version that is in the 2.4 series kernel,
   
      LVM 1 is a mature product that has been considered stable for a couple
    of years. The kernel driver for LVM 1 is included in the 2.4 series
    kernels, but this does not mean that your 2.4.x kernel is up to date with
    the latest version of LVM. Look at the [ftp://ftp.sistina.com/pub/LVM/1.0
    /README] README for the latest information about which kernels have the
    current code in them.
   

-----------------------------------------------------------------------------
Chapter 2. What is Logical Volume Management?

  Logical volume management provides a higher-level view of the disk storage
on a computer system than the traditional view of disks and partitions. This
gives the system administrator much more flexibility in allocating storage to
applications and users.

  Storage volumes created under the control of the logical volume manager can
be resized and moved around almost at will, although this may need some
upgrading of file system tools.

  The logical volume manager also allows management of storage volumes in
user-defined groups, allowing the system administrator to deal with sensibly
named volume groups such as "development" and "sales" rather than physical
disk names such as "sda" and "sdb".
-----------------------------------------------------------------------------

2.1. Why would I want it?

  Logical volume management is traditionally associated with large
installations containing many disks but it is equally suited to small systems
with a single disk or maybe two.
-----------------------------------------------------------------------------

2.2. Benefits of Logical Volume Management on a Small System

  One of the difficult decisions facing a new user installing Linux for the
first time is how to partition the disk drive. The need to estimate just how
much space is likely to be needed for system files and user files makes the
installation more complex than is necessary and some users simply opt to put
all their data into one large partition in an attempt to avoid the issue.

  Once the user has guessed how much space is needed for /home /usr / (or has
let the installation program do it) then is quite common for one of these
partitions to fill up even if there is plenty of disk space in one of the
other partitions.

  With logical volume management, the whole disk would be allocated to a
single volume group and logical volumes created to hold the / /usr and /home
file systems. If, for example the /home logical volume later filled up but
there was still space available on /usr then it would be possible to shrink /
usr by a few megabytes and reallocate that space to /home.

  Another alternative would be to allocate minimal amounts of space for each
logical volume and leave some of the disk unallocated. Then, when the
partitions start to fill up, they can be expanded as necessary.

  As an example: Joe buys a PC with an 8.4 Gigabyte disk on it and installs
Linux using the following partitioning system:
/boot    /dev/hda1     10 Megabytes                                          
swap     /dev/hda2    256 Megabytes                                          
/        /dev/hda3      2 Gigabytes                                          
/home    /dev/hda4      6 Gigabytes                                          
                                                                             
This, he thinks, will maximize the amount of space available for all his MP3
files.

  Sometime later Joe decides that he want to install the latest office suite
and desktop UI available but realizes that the root partition isn't large
enough. But, having archived all his MP3s onto a new writable DVD drive there
is plenty of space on /home.

  His options are not good:

 1.   Reformat the disk, change the partitioning scheme and reinstall.
   
 2.   Buy a new disk and figure out some new partitioning scheme that will
    require the minimum of data movement.
   
 3.   Set up a symlink farm on / pointing to /home and install the new
    software on /home
   

  With LVM this becomes much easier:

  Jane buys a similar PC but uses LVM to divide up the disk in a similar
manner:
/boot     /dev/hda1        10 Megabytes                                      
swap      /dev/vg00/swap   256 Megabytes                                     
/         /dev/vg00/root     2 Gigabytes                                     
/home     /dev/vg00/home     6 Gigabytes                                     
                                                                             
                                                                             

Note boot is not included on the LV because bootloaders don't understand LVM 
     volumes yet. It's possible boot on LVM will work, but you run the risk  
     of having an unbootable system.                                         

Warning root on LV should be used by advanced users only                     
        root on LVM requires an initrd image that activates the root LV. If a
        kernel is upgraded without building the necessary initrd image, that 
        kernel will be unbootable. Newer distributions support lvm in their  
        mkinitrd scripts as well as their packaged initrd images, so this    
        becomes less of an issue over time.                                  

  When she hits a similar problem she can reduce the size of /home by a
gigabyte and add that space to the root partition.

  Suppose that Joe and Jane then manage to fill up the /home partition as
well and decide to add a new 20 Gigabyte disk to their systems.

  Joe formats the whole disk as one partition (/dev/hdb1) and moves his
existing /home data onto it and uses the new disk as /home. But he has 6
gigabytes unused or has to use symlinks to make that disk appear as an
extension of /home, say /home/joe/old-mp3s.

  Jane simply adds the new disk to her existing volume group and extends her
/home logical volume to include the new disk. Or, in fact, she could move the
data from /home on the old disk to the new disk and then extend the existing
root volume to cover all of the old disk.
-----------------------------------------------------------------------------

2.3. Benefits of Logical Volume Management on a Large System

  The benefits of logical volume management are more obvious on large systems
with many disk drives.

  Managing a large disk farm is a time-consuming job, made particularly
complex if the system contains many disks of different sizes. Balancing the
(often conflicting) storage requirements of various users can be a nightmare.

  User groups can be allocated to volume groups and logical volumes and these
can be grown as required. It is possible for the system administrator to
"hold back" disk storage until it is required. It can then be added to the
volume(user) group that has the most pressing need.

  When new drives are added to the system, it is no longer necessary to move
users files around to make the best use of the new storage; simply add the
new disk into an existing volume group or groups and extend the logical
volumes as necessary.

  It is also easy to take old drives out of service by moving the data from
them onto newer drives - this can be done online, without disrupting user
service.
-----------------------------------------------------------------------------

Chapter 3. Anatomy of LVM

  This diagram gives a overview of the main elements in an LVM system:
+-- Volume Group --------------------------------+                           
|                                                |                           
|    +----------------------------------------+  |                           
| PV | PE |  PE | PE | PE | PE | PE | PE | PE |  |                           
|    +----------------------------------------+  |                           
|      .          .          .        .          |                           
|      .          .          .        .          |                           
|    +----------------------------------------+  |                           
| LV | LE |  LE | LE | LE | LE | LE | LE | LE |  |                           
|    +----------------------------------------+  |                           
|            .          .        .         .     |                           
|            .          .        .         .     |                           
|    +----------------------------------------+  |                           
| PV | PE |  PE | PE | PE | PE | PE | PE | PE |  |                           
|    +----------------------------------------+  |                           
|                                                |                           
+------------------------------------------------+                           
                                                                             
                                                                             

  Another way to look at is this (courtesy of [mailto:erik@bagfors.nu_NOSPAM]
Erik Bågfors on the linux-lvm mailing list):
    hda1   hdc1      (PV:s on partitions or whole disks)                          
       \   /                                                                      
        \ /                                                                       
       diskvg        (VG)                                                         
       /  |  \                                                                    
      /   |   \                                                                   
  usrlv rootlv varlv (LV:s)                                                       
    |      |     |                                                                
 ext2  reiserfs  xfs (filesystems)                                                
                                                                                  
                                                                                  
-----------------------------------------------------------------------------

3.1. volume group (VG)

  The Volume Group is the highest level abstraction used within the LVM. It
gathers together a collection of Logical Volumes and Physical Volumes into
one administrative unit.
-----------------------------------------------------------------------------

3.2. physical volume (PV)

  A physical volume is typically a hard disk, though it may well just be a
device that 'looks' like a hard disk (eg. a software raid device).
-----------------------------------------------------------------------------

3.3. logical volume (LV)

  The equivalent of a disk partition in a non-LVM system. The LV is visible
as a standard block device; as such the LV can contain a file system (eg. /
home).
-----------------------------------------------------------------------------

3.4. physical extent (PE)

  Each physical volume is divided chunks of data, known as physical extents,
these extents have the same size as the logical extents for the volume group.
-----------------------------------------------------------------------------

3.5. logical extent (LE)

  Each logical volume is split into chunks of data, known as logical extents.
The extent size is the same for all logical volumes in the volume group.
-----------------------------------------------------------------------------

3.6. Tying it all together

  A concrete example will help:

  Lets suppose we have a volume group called VG1, this volume group has a
physical extent size of 4MB. Into this volume group we introduce 2 hard disk
partitions, /dev/hda1 and /dev/hdb1. These partitions will become physical
volumes PV1 and PV2 (more meaningful names can be given at the administrators
discretion). The PV's are divided up into 4MB chunks, since this is the
extent size for the volume group. The disks are different sizes and we get 99
extents in PV1 and 248 extents in PV2. We now can create ourselves a logical
volume, this can be any size between 1 and 347 (248 + 99) extents. When the
logical volume is created a mapping is defined between logical extents and
physical extents, eg. logical extent 1 could map onto physical extent 51 of
PV1, data written to the first 4 MB of the logical volume in fact be written
to the 51st extent of PV1.
-----------------------------------------------------------------------------

3.7. mapping modes (linear/striped)

  The administrator can choose between a couple of general strategies for
mapping logical extents onto physical extents:

 1.   Linear mapping will assign a range of PE's to an area of an LV in order
    eg., LE 1 - 99 map to PV1 and LE 100 - 347 map onto PV2.
   
 2.   Striped mapping will interleave the chunks of the logical extents
    across a number of physical volumes eg.,
    1st chunk of LE[1] -> PV1[1],                                            
                                                                             
    2nd chunk of LE[1] -> PV2[1],                                            
                                                                             
    3rd chunk of LE[1] -> PV3[1],                                            
                                                                             
    4th chunk of LE[1] -> PV1[2],                                            
                                                                             
    and so on. In certain situations this strategy can improve the
    performance of the logical volume.
   
    Warning LVM 1 Caveat                                                     
            LVs created using striping cannot be extended past the PVs they  
            were originally created on in LVM 1.                             
    In LVM 2, striped LVs can be extended by concatenating another set of
    devices onto the end of the first set. So you can get into a situation
    where your LV is a 2 stripe set concatenated with a linear set
    concatenated with a 4 stripe set. Are you confused yet?

-----------------------------------------------------------------------------
3.8. Snapshots

  A wonderful facility provided by LVM is 'snapshots'. This allows the
administrator to create a new block device which presents an exact copy of a
logical volume, frozen at some point in time. Typically this would be used
when some batch processing, a backup for instance, needs to be performed on
the logical volume, but you don't want to halt a live system that is changing
the data. When the snapshot device has been finished with the system
administrator can just remove the device. This facility does require that the
snapshot be made at a time when the data on the logical volume is in a
consistent state - the VFS-lock patch for LVM1 makes sure that some
filesystems do this automatically when a snapshot is created, and many of the
filesystems in the 2.6 kernel do this automatically when a snapshot is
created without patching.

  LVM1 has read-only snapshots. Read-only snapshots work by creating an 
exception table, which is used to keep track of which blocks have been
changed. If a block is to be changed on the origin, it is first copied to the
snapshot, marked as copied in the exception table, and then the new data is
written to the original volume.

  In LVM2, snapshots are read/write by default. Read/write snapshots work
like read-only snapshots, with the additional feature that if data is written
to the snapshot, that block is marked in the exception table as used, and
never gets copied from the original volume. This opens up many new
possibilities that were not possible with LVM1's read-only snapshots. One
example is to snapshot a volume, mount the snapshot, and try an experimental
program that change files on that volume. If you don't like what it did, you
can unmount the snapshot, remove it, and mount the original filesystem in its
place. It is also useful for creating volumes for use with [http://
www.cl.cam.ac.uk/Research/SRG/netos/xen/] Xen. You can create a disk image,
then snapshot it and modify the snapshot for a particular domU instance. You
can then create another snapshot of the original volume, and modify that one
for a different domU instance. Since the only storage used by a snapshot is
blocks that were changed on the origin or the snapshot, the majority of the
volume is shared by the domU's.

Warning LVM 1 -> LVM 2 Upgrade Info                                          
        Make sure to remove snapshot LVs before upgrading from LVM 1 to LVM  
        2. (See Section 4.1)                                                 
-----------------------------------------------------------------------------

Chapter 4. Frequently Asked Questions

4.1. LVM 2 FAQ

4.1.1.   I have LVM 1 installed and running on my system. How do I start
    using LVM 2?
4.1.2.   Do I need a special lvm2 kernel module?
4.1.3.   I get errors about /dev/mapper/control when I try to use the LVM 2
    tools. What's going on?
4.1.4.   Which commands and types of logical volumes are currently supported
    in LVM 2?
4.1.5.   Does LVM 2 use a different format from LVM 1 for it's ondisk
    representation of Volume Groups and Logical Volumes?
4.1.6.   Does LVM 2 support VGs and LVs created with LVM 1?
4.1.7.   Can I upgrade my LVM 1 based VGs and LVs to LVM 2 native format?
4.1.8.   I've upgraded to LVM 2, but the tools keep failing with out of
    memory errors. What gives?
4.1.9.   I have my root partition on an LV in LVM 1. How do I upgrade to LVM
    2? And what happened to lvmcreate_initrd?
4.1.10.   How resilient is LVM to a sudden renumbering of physical hard
    disks?
4.1.11.   I'm trying to fill my vg, and vgdisplay/vgs says that I have 1.87
    GB free, but when I do an lvcreate vg -L1.87G it says "insufficient free
    extends". What's going on?
4.1.12.   How are snapshots in LVM2 different from LVM1?

4.1.1. I have LVM 1 installed and running on my system. How do I start using
LVM 2?

Here's the Quick Start instructions :)

 1.   Start by removing any snapshot LVs on the system. These are not handled
    by LVM 2 and will prevent the origin from being activated when LVM 2
    comes up.
   
 2.   Make sure you have some way of booting the system other than from your
    standard boot partition. Have the LVM 1 tools, standard system tools
    (mount) and an LVM 1 compatible kernel on it in case you need to get back
    and fix some things.
   
 3.   Grab the LVM 2 tools source and the device mapper source and compile
    them. You need to install the device mapper library using "make install"
    before compiling the LVM 2 tools. Also copy the dm/scripts/
    devmap_mknod.sh script into /sbin. I recommend only installing the 'lvm'
    binary for now so you have access to the LVM 1 tools if you need them. If
    you have access to packages for LVM 2 and device-mapper, you can install
    those instead, but beware of them overwriting your LVM 1 tool set.
   
 4.   Get a device mapper compatible kernel, either built in or as a kernel
    module.
   
 5.   Figure out where LVM 1 was activated in your startup scripts. Make sure
    the device-mapper module is loaded by that point (if you are using device
    mapper as a module) and add '/sbin/devmap_mknod.sh; lvm vgscan; lvm
    vgchange -ay' afterward.
   
 6.   Install the kernel with device mapper support in it. Reboot. If all
    goes well, you should be running with lvm2.
   

4.1.2. Do I need a special lvm2 kernel module?

No. You need device-mapper. The lvm2 tools use device-mapper to interface
with the kernel and do all their device mapping (hence the name
device-mapper). As long as you have device-mapper, you should be able to use
LVM2.

4.1.3. I get errors about /dev/mapper/control when I try to use the LVM 2
tools. What's going on?

The primary cause of this is not having run the "dmsetup mknodes" after
rebooting into a dm capable kernel. This script generates the control node
for device mapper.

  If you don't have the "dmsetup mknodes", don't despair! (Though you should
probably upgrade to the latest version of device-mapper.) It's pretty easy to
create the /dev/mapper/control file on your own:

 1.   Make sure you have the device-mapper module loaded (if you didn't build
    it into your kernel).
   
 2.   Run
    # cat /proc/misc | grep device-mapper | awk '{print $1}'                 
    and note the number printed. (If you don't get any output, refer to step
    1.)
   
 3.   Run
    # mkdir /dev/mapper                                                      
    - if you get an error saying /dev/mapper already exists, make sure it's a
    directory and move on.
   
 4.   Run
    # mknod /dev/mapper/control c 10 $number                                 
    where $number is the number printed in step 2.
   

You should be all set now!

4.1.4. Which commands and types of logical volumes are currently supported in
LVM 2?

If you are using the stable 2.4 device mapper patch from the lvm2 tarball,
all the major functionality you'd expect using lvm1 is supported with the
lvm2 tools. (You still need to remove snapshots before upgrading from lvm1 to
lvm2)

  If you are using the version of device mapper in the 2.6 kernel.org kernel
series the following commands and LV types are not supported:

  * pvmove
   
  * snapshots
   

The beginnings of support for these features are in the [http://
people.sistina.com/~thornber/dm/]   unstable device mapper patches maintained
by Joe Thornber.

4.1.5. Does LVM 2 use a different format from LVM 1 for it's ondisk
representation of Volume Groups and Logical Volumes?

Yes. LVM 2 uses lvm 2 format metadata. This format is much more flexible than
the LVM 1 format metadata, removing or reducing most of the limitations LVM 1
had.

4.1.6. Does LVM 2 support VGs and LVs created with LVM 1?

Yes. LVM 2 will activate and operate on VG and LVs created with LVM 1. The
exception to this is snapshots created with LVM 1 - these should be removed
before upgrading. Snapshots that remain after upgrading will have to be
removed before their origins can be activated by LVM 2.

4.1.7. Can I upgrade my LVM 1 based VGs and LVs to LVM 2 native format?

Yes. Use vgconvert to convert your VG and all LVs contained within it to the
new lvm 2 format metadata. Be warned that it's not always possible to revert
back to lvm 1 format metadata.

4.1.8. I've upgraded to LVM 2, but the tools keep failing with out of memory
errors. What gives?

One possible cause of this is that some versions of LVM 1 (The user that
reported this bug originally was using Mandrake 9.2, but it is not
necessarily limited to that distribution) did not put a UUID into the PV and
VG structures as they were supposed to. The most current versions of the LVM
2 tools automatically fill UUIDs in for the structures if they see they are
missing, so you should grab a more current version and your problem should be
solved. If not, post to the linux-lvm mailing list

4.1.9. I have my root partition on an LV in LVM 1. How do I upgrade to LVM 2?
And what happened to lvmcreate_initrd?

Upgrading to LVM 2 is a bit trickier with root on LVM, but it's not
impossible. You need to queue up a kernel with device-mapper support and
install the lvm2 tools (you might want to make a backup of the lvm 1 tools,
or find a rescue disk with the lvm tools built in, in case you need them
before you're done). Then find a mkinitrd script that has support for your
distro and lvm 2.

  Currently, this is the list of mkinitrd scripts that I know support lvm2,
sorted by distro:

mkinitrd scripts with lvm 2 support

fedora
      The latest fedora core 2 [http://distro.ibiblio.org/pub/linux/
    distributions/fedora/linux/core/development/i386/Fedora/RPMS/
    mkinitrd-3.5.21-1.i386.rpm] mkinitrd handles lvm2, but it relies on a
    statically built lvm binary from the latest lvm 2 tarball.
   
      Redhat 9 users may be able to use this as well
   
Debian
      There is an unofficial version [http://www.poochiereds.net/svn/lvm2/]
    here
   
Generic
      There is a version in the lvm2 source tree under scripts/
    lvm2_createinitrd/. See the documentation in that directory for more
    details.
   

4.1.10. How resilient is LVM to a sudden renumbering of physical hard disks?

It's fine - LVM identifies PVs by UUID, not by device name.

  Each disk (PV) is labeled with a UUID, which uniquely identifies it to the
system. 'vgscan' identifies this after a new disk is added that changes your
drive numbering. Most distros run vgscan in the lvm startup scripts to cope
with this on reboot after a hardware addition. If you're doing a hot-add,
you'll have to run this by hand I think. On the other hand, if your vg is
activated and being used, the renumbering should not affect it at all. It's
only the activation that needs the identifier, and the worst case scenario is
that the activation will fail without a vgscan with a complaint about a
missing PV.

Note The failure or removal of a drive that LVM is currently using will cause
     problems with current use and future activations of the VG that was     
     using it.                                                               

4.1.11. I'm trying to fill my vg, and vgdisplay/vgs says that I have 1.87 GB
free, but when I do an lvcreate vg -L1.87G it says "insufficient free
extends". What's going on?

The 1.87 GB figure is rounded to 2 decimal places, so it's probably 1.866 GB
or something. This is a human-readable output to give you a general idea of
how big the VG is. If you want to specify an exact size, you must use extents
instead of some multiple of bytes.

  In the case of vgdisplay, use the Free PE count instead of the human
readable capacity.
              Free  PE / Size          478 / 1.87 GB                         
                                       ^^^                                   
                                                                             
So, this would indicate that you should do run
# lvcreate vg -l478                                                          
Note that instead of an upper-case 'L', we used a lower-case 'l' to tell lvm
to use extents instead of bytes.

  In the case of vgs, you need to instruct it to tell you how many extents
are available:
# vgs -o +vg_free_count,vg_extent_count                                      
                                                                             
This tell vgs to add the free extents and the total number of extents to the
end of the vgs listing. Use the free extent number the same way you would in
the above vgdisplay case.

4.1.12. How are snapshots in LVM2 different from LVM1?

In LVM2 snapshots are read/write by default, whereas in LVM1, snapshots were
only read-only. See Section 3.8 for more details
-----------------------------------------------------------------------------

4.2. LVM 1 FAQ

4.2.1.   When will there be info here?

4.2.1. When will there be info here?

When people start submitting FAQ entries ;)
-----------------------------------------------------------------------------

Chapter 5. Acquiring LVM

  The first thing you need to do is get a copy of LVM.

  * Download via FTP a tarball of LVM.
   
  *   Download the source that is under active development via CVS
   

-----------------------------------------------------------------------------
5.1. Download the source

 

  *   [ftp://sources.redhat.com/pub/dm/]   Device Mapper
   
  *     LVM 2
   
      Make sure you also grab the device mapper source
   
  *   LVM 1
   

Note The LVM 1 kernel patch must be generated using the LVM 1 source. More   
     information regarding this can be found in Section 6.2                  
-----------------------------------------------------------------------------

5.2. Download the development source via CVS

  Note: the state of code in the CVS repository fluctuates wildly. It will
contain bugs. Maybe ones that will crash LVM or the kernel. It may not even
compile. Consider it alpha-quality code. You could lose data. You have been
warned.
-----------------------------------------------------------------------------

5.3. Before You Begin

  To follow the development progress of LVM, subscribe to the LVM mailing
lists, linux-lvm and the appropriate commit list (see Section C.1).

  To build LVM from the CVS sources, you must have several GNU tools:

  * the CVS client version 1.9 or better
   
  * GCC 2.95.2
   
  * GNU make 3.79
   
  * autoconf, version 2.13 or better
   

-----------------------------------------------------------------------------
5.4. Initial Setup

  To make life easier in the future with regards to updating the CVS tree
create the file $HOME/.cvsrc and insert the following lines. This configures
useful defaults for the three most commonly used CVS commands. Do this now
before proceeding any further.
diff -u -b -B                                                                
checkout -P                                                                  
update -d -P                                                                 
                                                                             
                                                                             

  Also, if you are on a slow net link (like a dialup), you will want to add a
line containing cvs -z5 in this file. This turns on a useful compression
level for all CVS commands.
-----------------------------------------------------------------------------

5.5. Checking Out Source Code

  *   Device Mapper library and tools
   
    The device mapper library is required to build LVM 2.
   
      The first time you download from cvs, you must login
     # cvs -d :pserver:cvs@sources.redhat.com:/cvs/dm login cvs              
                                                                             
                                                                             
   
      The password is `cvs'. The command outputs nothing if successful and an
    error message if it fails. Only an initial login is required. All
    subsequent CVS commands read the password stored in the file $HOME
    /.cvspass for authentication.
   
      Use the following to check out a copy of the code
     # cvs -d :pserver:cvs@sources.redhat.com:/cvs/dm checkout device-mapper     
                                                                                 
                                                                                 
   
      This will create a new directory device-mapper in your current
    directory containing the latest, up-to-the-minute device mapper code.
   
  * LVM 2
   
      The first time you download from cvs, you must login
     # cvs -d :pserver:cvs@sources.redhat.com:/cvs/lvm2 login cvs            
                                                                             
                                                                             
   
      The password is `cvs'. The command outputs nothing if successful and an
    error message if it fails. Only an initial login is required. All
    subsequent CVS commands read the password stored in the file $HOME
    /.cvspass for authentication.
   
      Use the following to check out a copy of the code
     # cvs -d :pserver:cvs@sources.redhat.com:/cvs/lvm2 checkout LVM2        
                                                                             
                                                                             
   
      This will create a new directory LVM2 in your current directory
    containing the latest, up-to-the-minute LVM 2 code.
   
  * LVM 1
   
      The first time you download from cvs, you must login
     # cvs -d :pserver:cvs@sources.redhat.com:/cvs/lvm login cvs             
                                                                             
                                                                             
   
      The password is `cvs'. The command outputs nothing if successful and an
    error message if it fails. Only an initial login is required. All
    subsequent CVS commands read the password stored in the file $HOME
    /.cvspass for authentication.
   
      Use the following to check out a copy of the code
     # cvs -d :pserver:cvs@sources.redhat.com:/cvs/lvm checkout LVM          
                                                                             
                                                                             
   
      This will create a new directory LVM in your current directory
    containing the latest, up-to-the-minute LVM 1 code.
   

  CVS commands work from anywhere inside the source tree, and recurse
downward. So if you happen to issue an update from inside the `tools'
subdirectory it will work fine, but only update the tools directory and it's
subdirectories. In the following command examples it is assumed that you are
at the top of the source tree.
-----------------------------------------------------------------------------

5.6. Code Updates

  Code changes are made fairly frequently in the CVS repository.
Announcements of this are automatically sent to the lvm-commit list.

  You can update your copy of the sources to match the master repository with
the update command. It is not necessary to check out a new copy. Using update
is significantly faster and simpler, as it will download only patches instead
of entire files and update only those files that have changed since your last
update. It will automatically merge any changes in the CVS repository with
any local changes you have made as well. Just cd to the directory you'd like
to update and then type the following.
 # cvs update                                                                
                                                                             

  If you did not specify a tag when you checked out the source, this will
update your sources to the latest version on the main branch. If you
specified a branch tag, it will update to the latest version on that branch.
If you specified a version tag, it will not do anything.
-----------------------------------------------------------------------------

5.7. Starting a Project

  Discuss your ideas on the developers list before you start. Someone may be
working on the same thing you have in mind or they may have some good ideas
about how to go about it.
-----------------------------------------------------------------------------

5.8. Hacking the Code

  So, have you found a bug you want to fix? Want to implement a feature from
the TODO list? Got a new feature to implement? Hacking the code couldn't be
easier. Just edit your copy of the sources. No need to copy files to .orig or
anything. CVS has copies of the originals.

  When you have your code in a working state and have tested as best you can
with the hardware you have, generate a patch against the current sources in
the CVS repository.
 # cvs update                                                                
 # cvs diff > patchfile                                                      
                                                                             

  Mail the patch to the linux-lvm or dm-devel list (Section C.1) with a
description of what changes or additions you implemented.
-----------------------------------------------------------------------------

5.9. Conflicts

  If someone else has been working on the same files as you have, you may
find that there are conflicting modifications. You'll discover this when you
try to update your sources.
 # cvs update                                                                
                                                                             
 RCS file: LVM/tools/pvcreate.c,v                                            
 retrieving revision 1.5                                                     
 retrieving revision 1.6                                                     
 Merging differences between 1.5 and 1.6 into pvcreate.c                     
 rcsmerge: warning: conflicts during merge                                   
 cvs server: conflicts found in tools/pvcreate.c                             
 C tools/pvcreate.c                                                          
                                                                             
                                                                             

  Don't panic! Your working file, as it existed before the update, is saved
under the filename .#pvcreate.c.1.5. You can always recover it should things
go horribly wrong. The file named `pvcreate.c' now contains both the old
(i.e. your) version and new version of lines that conflicted. You simply edit
the file and resolve each conflict by deleting the unwanted version of the
lines involved.
 <<<<<<< pvcreate.c                                                          
    j++;                                                                     
 =======                                                                     
    j--;                                                                     
 >>>>>>> 1.6                                                                 
                                                                             
                                                                             

  Don't forget to delete the lines with all the ``<'', ``='', and ``>''
symbols.
-----------------------------------------------------------------------------

Chapter 6. Building the kernel modules

6.1. Building the device-mapper module

  Device mapper is in 2.6.9 and later, so you just need to make sure it is
enabled either as a module or builtin to the kernel. Look for /sys/class/misc
/device-mapper or look in /proc/devices for a device-mapper entry to see if
it is enabled. If neither are there, try modprobe dm_mod, then check again.
For versions previous to 2.6.9, either you or your distro must patch the
kernel to support it. Check the device mapper web page for more information.
-----------------------------------------------------------------------------

6.2. Build the LVM 1 kernel module

  To use LVM 1 you will have to build the LVM 1 kernel module (recommended),
or if you prefer rebuild the kernel with the LVM 1 code statically linked
into it.

  Your Linux system is probably based on one of the popular distributions
(eg., Red Hat, SuSE, Debian) in which case it is possible that you already
have the LVM 1 module. Check the version of the tools you have on your
system. You can do this by running any of the LVM command line tools with the
'-h' flag. Use pvscan -h if you don't know any of the commands. If the
version number listed at the top of the help listing is LVM 1.0.8, use your
current setup and avoid the rest of this section.
-----------------------------------------------------------------------------

6.2.1. Building a patch for your kernel

  In order to patch the linux kernel to support LVM 1.0.8, you must do the
following:

 1. Unpack LVM 1.0.8
     # tar zxf lvm_1.0.8.tar.gz                                              
                                                                             
   
 2. Enter the root directory of that version.
     # cd LVM/1.0.8                                                          
                                                                             
   
 3. Run configure
     # ./configure                                                           
                                                                             
   
      You will need to pass the option --with-kernel_dir to configure if your
    linux kernel source is not in /usr/src/linux. (Run ./configure --help to
    see all the options available)
   
 4. Enter the PATCHES directory
     # cd PATCHES                                                            
                                                                             
   
 5. Run 'make'
    # make                                                                   
                                                                             
   
      You should now have a patch called lvm-1.0.8-$KERNELVERSION.patch in
    the patches directory. This is the LVM kernel patch referenced in later
    sections of the howto.
   
 6. Patch the kernel
     # cd /usr/src/linux ; patch -pX < /directory/lvm-1.0.8-$KERNELVERSION.patch  
                                                                                  
   

-----------------------------------------------------------------------------
6.2.2. Building the LVM module for Linux 2.2.17+

  The 2.2 series kernel needs to be patched before you can start building,
look elsewhere for instructions on how to patch your kernel.

  Patches:

 1.   rawio patch
   
      Stephen Tweedie's raw_io patch which can be found at [http://
    www.kernel.org/pub/linux/kernel/people/sct/raw-io] http://www.kernel.org/
    pub/linux/kernel/people/sct/raw-io
   
 2.   lvm patch
   
      The relevant LVM 1 patch which should be built out of the PATCHES
    sub-directory of the LVM distribution. More information can be found in 
    Section 6.2.1, Building a patch for your kernel.
   

  Once the patches have been correctly applied, you need to make sure that
the module is actually built, LVM 1 lives under the block devices section of
the kernel config, you should probably request that the LVM /proc information
is compiled as well.

  Build the kernel modules as usual.
-----------------------------------------------------------------------------

6.2.3. Building the LVM modules for Linux 2.4

  The 2.4 kernel comes with LVM 1 already included although you should check
at the Sistina web site for updates, (eg. v2.4.9 kernels and earlier must
have the latest LVM 1 patch applied ). When configuring your kernel look for
LVM 1 under Multi-device support (RAID and LVM). LVM 1 can be compiled into
the kernel or as a module. Build your kernel and modules and install then in
the usual way. If you chose to build LVM as a module it will be called
lvm-mod.o

  If you want to use snapshots with ReiserFS, make sure you apply the
linux-2.4.x-VFS-lock patch (there are copies of this in the LVM/1.0.8/PATCHES
directory.)
-----------------------------------------------------------------------------

6.2.4. Checking the proc file system

  If your kernel was compiled with the /proc file system (most are) then you
can verify that LVM is present by looking for a /proc/lvm directory. If this
doesn't exist then you may have to load the module with the command
 # modprobe lvm-mod                                                          
                                                                             

  If /proc/lvm still does not exist then check your kernel configuration
carefully.

  When LVM is active you will see entries in /proc/lvm for all your physical
volumes, volume groups and logical volumes. In addition there is a "file"
called /proc/lvm/global which gives a summary of the LVM status and also
shows just which version of the LVM kernel you are using.
-----------------------------------------------------------------------------

Chapter 7. LVM 1 Boot time scripts

  Boot-time scripts are not provided as part of the LVM distribution, however
these are quite simple to do for yourself.

  The startup of LVM requires just the following two commands:
 # vgscan                                                                    
# vgchange -ay                                                               
                                                                             

  And the shutdown only one:
 # vgchange -an                                                              
                                                                             

  Follow the instructions below depending on the distribution of Linux you
are running.
-----------------------------------------------------------------------------

7.1. Caldera

  It is necessary to edit the file /etc/rc.d/rc.boot. Look for the line that
says "Mounting local filesystems" and insert the vgscan and vgchange commands
just before it.

  You may also want to edit the the file /etc/rc.d/init.d/halt to deactivate
the volume groups at shutdown. Insert the
 vgchange -an                                                                
                                                                             
command near the end of this file just after the filesystems are unmounted or
mounted read-only, before the comment that says "Now halt or reboot".
-----------------------------------------------------------------------------

7.2. Debian

  If you download the Debian lvm tool package, an initscript should be
installed for you.

  If you are installing LVM from source, you will still need to build your
own initscript:

  Create a startup script in /etc/init.d/lvm containing the following:
#!/bin/sh                                                                    
                                                                             
case "$1" in                                                                 
  start)                                                                     
        /sbin/vgscan                                                         
        /sbin/vgchange -ay                                                   
        ;;                                                                   
  stop)                                                                      
        /sbin/vgchange -an                                                   
        ;;                                                                   
  restart|force-reload)                                                      
        ;;                                                                   
esac                                                                         
                                                                             
exit 0                                                                       
                                                                             

  Then execute the commands
                                                                             
 # chmod 0755 /etc/init.d/lvm                                                
 # update-rc.d lvm start 26 S . stop 82 1 .                                  
                                                                             
                                                                             
Note the dots in the last command.
-----------------------------------------------------------------------------

7.3. Mandrake

  No initscript modifications should be necessary for current versions of
Mandrake.
-----------------------------------------------------------------------------

7.4. Redhat

  For Redhat 7.0 and up, you should not need to modify any initscripts to
enable LVM at boot time if LVM is built into the kernel. If LVM is built as a
module, it may be necessary to modify /etc/rc.d/rc.sysinit to load the LVM
module by adding "modprobe lvm-mod" before the section that reads:
# LVM initialization, take 2 (it could be on top of RAID)                    
if [ -e /proc/lvm -a -x /sbin/vgchange -a -f /etc/lvmtab ]; then             
        action $"Setting up Logical Volume Management:" /sbin/vgscan &&      
        /sbin/vgchange -a y                                                  
        fi                                                                   

Note This init script fragment is from Red Hat 7.3 - other versions of Redhat
     may look slightly different.                                            

  For versions of Redhat older than 7.0, it is necessary to edit the file /
etc/rc.d/rc.sysinit. Look for the line that says "Mount all other
filesystems" and insert the vgscan and vgchange commands just before it. You
should be sure that your root file system is mounted read/write before you
run the LVM commands.

  You may also want to edit the the file /etc/rc.d/init.d/halt to deactivate
the volume groups at shutdown. Insert the
vgchange -an                                                                 
                                                                             
command near the end of this file just after the filesystems are mounted
read-only, before the comment that says "Now halt or reboot".
-----------------------------------------------------------------------------

7.5. Slackware

  Slackware 8.1 requires no updating of boot time scripts in order to make
LVM work.

  For versions previous to Slackware 8.1, you should apply the following
patch to /etc/rc.d/rc.S
cd /etc/rc.d                                                                 
cp -a rc.S rc.S.old                                                          
patch -p0 < rc.S.diff                                                        
                                                                             
(the cp part to make a backup in case).
----- snip snip file: rc.S.diff---------------                               
--- rc.S.or     Tue Jul 17 18:11:20 2001                                     
+++ rc.S        Tue Jul 17 17:57:36 2001                                     
@@ -4,6 +4,7 @@                                                              
 #                                                                           
 # Mostly written by:  Patrick J. Volkerding, <volkerdi@slackware.com>       
 #                                                                           
+# Added LVM support <tgs@iafrica.com>                                       
                                                                             
 PATH=/sbin:/usr/sbin:/bin:/usr/bin                                          
                                                                             
@@ -28,19 +29,21 @@                                                          
   READWRITE=yes                                                             
 fi                                                                          
                                                                             
+                                                                            
 # Check the integrity of all filesystems                                    
 if [ ! READWRITE = yes ]; then                                              
-  /sbin/fsck -A -a                                                          
+  /sbin/fsck -a /                                                           
+  # Check only the root fs first, but no others                             
   # If there was a failure, drop into single-user mode.                     
   if [ ? -gt 1 ] ; then                                                     
     echo                                                                    
     echo                                                                    
-    echo "*******************************************************"          
-    echo "*** An error occurred during the file system check. ***"          
-    echo "*** You will now be given a chance to log into the  ***"          
-    echo "*** system in single-user mode to fix the problem.  ***"          
-    echo "*** Running 'e2fsck -v -y <partition>' might help.  ***"          
-    echo "*******************************************************"          
+    echo "************************************************************"     
+    echo "*** An error occurred during the root file system check. ***"     
+    echo "*** You will now be given a chance to log into the       ***"     
+    echo "*** system in single-user mode to fix the problem.       ***"     
+    echo "*** Running 'e2fsck -v -y <partition>' might help.       ***"     
+    echo "************************************************************"     
     echo                                                                    
     echo "Once you exit the single-user shell, the system will reboot."     
     echo                                                                    
@@ -82,6 +85,44 @@                                                           
     echo -n "get into your machine and start looking for the problem. "     
     read junk;                                                              
   fi                                                                        
+  # okay / fs is clean, and mounted as rw                                   
+  # This was an addition, limits vgscan to /proc thus                       
+  # speeding up the scan immensely.                                         
+  /sbin/mount /proc                                                         
+                                                                            
+  # Initialize Logical Volume Manager                                       
+  /sbin/vgscan                                                              
+  /sbin/vgchange -ay                                                        
+                                                                            
+  /sbin/fsck -A -a -R                                                       
+  #Check all the other filesystem, including the LVM's, excluding /         
+                                                                            
+  # If there was a failure, drop into single-user mode.                     
+  if [ ? -gt 1 ] ; then                                                     
+    echo                                                                    
+    echo                                                                    
+    echo "*******************************************************"          
+    echo "*** An error occurred during the file system check. ***"          
+    echo "*** You will now be given a chance to log into the  ***"          
+    echo "*** system in single-user mode to fix the problem.  ***"          
+    echo "*** Running 'e2fsck -v -y <partition>' might help.  ***"          
+    echo "*** The root filesystem is ok and mounted readwrite ***"          
+    echo "*******************************************************"          
+    echo                                                                    
+    echo "Once you exit the single-user shell, the system will reboot."     
+    echo                                                                    
+                                                                            
+    PS1="(Repair filesystem) #"; export PS1                                 
+    sulogin                                                                 
+                                                                            
+    echo "Unmounting file systems."                                         
+    umount -a -r                                                            
+    mount -n -o remount,ro /                                                
+    echo "Rebooting system."                                                
+    sleep 2                                                                 
+    reboot                                                                  
+  fi                                                                        
+                                                                            
 else                                                                        
   echo "Testing filesystem status: read-write filesystem"                   
   if cat /etc/fstab | grep ' / ' | grep umsdos 1> /dev/null 2> /dev/null ;  
then                                                                         
@@ -111,14 +152,16 @@                                                        
     echo -n "Press ENTER to continue. "                                     
     read junk;                                                              
   fi                                                                        
+                                                                            
 fi                                                                          
                                                                             
+                                                                            
 # remove /etc/mtab* so that mount will create it with a root entry          
 /bin/rm -f /etc/mtab* /etc/nologin /etc/shutdownpid                         
                                                                             
 # mount file systems in fstab (and create an entry for /)                   
 # but not NFS or SMB because TCP/IP is not yet configured                   
-/sbin/mount -a -v -t nonfs,nosmbfs                                          
+/sbin/mount -a -v -t nonfs,nosmbfs,proc                                     
                                                                             
 # Clean up temporary files on the /var volume:                              
 /bin/rm -f /var/run/utmp /var/run/*.pid /var/log/setup/tmp/*                
--snip snip snip end of file---------------                                  
                                                                             
                                                                             
-----------------------------------------------------------------------------

7.6. SuSE

  No changes should be necessary from 6.4 onward as LVM is included
-----------------------------------------------------------------------------

Chapter 8. LVM 2 Boot Time Scripts

  For initrds, you should have:
      dmsetup mknodes                                                        
      vgscan --ignorelockingfailure                                          
      vgchange -ay --ignorelockingfailure                                    
                                                                             
in the linuxrc to get the root LV activated before the root volume is
accessed. Most distros seem to have this setup in their mkinitrd scripts now,
and they also tend to have them in rc.sysinit or equivilant, so all volumes
get activated on bootup.
-----------------------------------------------------------------------------

Chapter 9. Building LVM from the Source

9.1. Make LVM library and tools

  Change into the LVM directory and do a ./configure followed by make. This
will make all of the libraries and programs.

  If the need arises you can change some options with the configure script.
Do a ./configure --help to determine which options are supported. Most of the
time this will not be necessary.

  There should be no errors from the build process. If there are, see 
Reporting Errors and Bugs on how to report this.

  You are welcome to fix them and send us the patches too. Patches are
generally sent to the linux-lvm list.
-----------------------------------------------------------------------------

9.2. Install LVM library and tools

After the LVM source compiles properly, simply run make install to install
the LVM library and tools onto your system.
-----------------------------------------------------------------------------

9.3. Removing LVM library and tools

  To remove the library and tools you just installed, run make remove. You
must have the original source tree you used to install LVM to use this
feature.
-----------------------------------------------------------------------------

Chapter 10. Transitioning from previous versions of LVM to LVM 1.0.8

  Transitioning from previous versions of LVM to LVM 1.0.8 should be fairly
painless. We have come up with a method to read in PV version 1 metadata (LVM
0.9.1 Beta7 and earlier) as well as PV version 2 metadata (LVM 0.9.1 Beta8
and LVM 1.0).

  Warning: New PVs initialized with LVM 1.0.8 are created with the PV version
1 on-disk structure. This means that LVM 0.9.1 Beta8 and LVM 1.0 cannot read
or use PVs created with 1.0.8.
-----------------------------------------------------------------------------

10.1. Upgrading to LVM 1.0.8 with a non-LVM root partition

  There are just a few simple steps to transition this setup, but it is still
recommended that you backup your data before you try it. You have been
warned.

 1.   Build LVM kernel and modules
   
      Follow the steps outlined in Chapter 5 - Section 6.2 for instructions
    on how to get and build the necessary kernel components of LVM.
   
 2.   Build the LVM user tools
   
      Follow the steps in Chapter 9 to build and install the user tools for
    LVM.
   
 3.   Setup your init scripts
   
      Make sure you have the proper init scripts setup as per Chapter 7.
   
 4.   Boot into the new kernel
   
      Make sure your boot-loader is setup to load the new LVM-enhanced kernel
    and, if you are using LVM modules, put an insmod lvm-mod into your
    startup script OR extend /etc/modules.conf (formerly /etc/conf.modules)
    by adding
         alias block-major-58      lvm-mod                                   
         alias char-major-109      lvm-mod                                   
                                                                             
    to enable modprobe to load the LVM module (don't forget to enable kmod).
   
      Reboot and enjoy.
   

-----------------------------------------------------------------------------
10.2. Upgrading to LVM 1.0.8 with an LVM root partition and initrd

  This is relatively straightforward if you follow the steps carefully. It is
recommended you have a good backup and a suitable rescue disk handy just in
case.

  The "normal" way of running an LVM root file system is to have a single
non-LVM partition called /boot which contains the kernel and initial RAM disk
needed to start the system. The system I upgraded was as follows:
 # df                                                                        
                                                                             
Filesystem           1k-blocks      Used Available Use% Mounted on           
/dev/rootvg/root        253871     93384    147380  39% /                    
/dev/hda1                17534     12944      3685  78% /boot                
/dev/rootvg/home       4128448      4568   3914168   0% /home                
/dev/rootvg/usr        1032088    332716    646944  34% /usr                 
/dev/rootvg/var         253871     31760    209004  13% /var                 
                                                                             
                                                                             
/boot contains the old kernel and an initial RAM disk as well as the LILO
boot files and the following entry in /etc/lilo.conf
 # ls /boot                                                                  
                                                                             
System.map                 lost+found              vmlinux-2.2.16lvm         
map                        module-info             boot.0300                 
boot.b                     os2_d.b                 chain.b                   
initrd.gz                                                                    
                                                                             
 # tail /etc/lilo.conf                                                       
                                                                             
image=/boot/vmlinux-2.2.16lvm                                                
        label=lvm08                                                          
        read-only                                                            
        root=/dev/rootvg/root                                                
        initrd=/boot/initrd.gz                                               
        append="ramdisk_size=8192"                                           
                                                                             
                                                                             

 1.     Build LVM kernel and modules
   
      Follow the steps outlined in Chapter 5 - Section 6.2 for instructions
    on how to get and build the necessary kernel components of LVM.
   
 2.     Build the LVM user tools
   
      Follow the steps in Section 6.2 to build and install the user tools for
    LVM.
   
      Install the new tools. Once you have done this you cannot do any LVM
    manipulation as they are not compatible with the kernel you are currently
    running.
   
 3.     Rename the existing initrd.gz
   
      This is so it doesn't get overwritten by the new one
    # mv /boot/initrd.gz /boot/initrd08.gz                                   
                                                                             
   
 4.     Edit /etc/lilo.conf
   
      Make the existing boot entry point to the renamed file. You will need
    to reboot using this if something goes wrong in the next reboot. The
    changed entry will look something like this:
    image=/boot/vmlinux-2.2.16lvm                                            
            label=lvm08                                                      
            read-only                                                        
            root=/dev/rootvg/root                                            
            initrd=/boot/initrd08.gz                                         
            append="ramdisk_size=8192"                                       
                                                                             
   
 5.     Run lvmcreate_initrd to create a new initial RAM disk
    # lvmcreate_initrd 2.4.9                                                 
                                                                             
    Don't forget the put the new kernel version in there so that it picks up
    the correct modules.
   
 6.     Add a new entry into /etc/lilo.conf
   
      This new entry is to boot the new kernel with its new initrd.
    image=/boot/vmlinux-2.4.9lvm                                             
            label=lvm10                                                      
            read-only                                                        
            root=/dev/rootvg/root                                            
            initrd=/boot/initrd.gz                                           
            append="ramdisk_size=8192"                                       
                                                                             
   
 7.     Re-run lilo
   
      This will install the new boot block
    # /sbin/lilo                                                             
                                                                             
   
 8.     Reboot
   
      When you get the LILO prompt select the new entry name (in this example
    lvm10) and your system should boot into Linux using the new LVM version.
   
      If the new kernel does not boot, then simply boot the old one and try
    to fix the problem. It may be that the new kernel does not have all the
    correct device drivers built into it, or that they are not available in
    the initrd. Remember that all device drivers (apart from LVM) needed to
    access the root device should be compiled into the kernel and not as
    modules.
   
      If you need to do any LVM manipulation when booted back into the old
    version, then simply recompile the old tools and install them with
    # make install                                                           
                                                                             
    If you do this, don't forget to install the new tools when you reboot
    into the new LVM version.
   

When you are happy with the new system remember to change the ``default=''
entry in your lilo.conf file so that it is the default kernel.
-----------------------------------------------------------------------------

Chapter 11. Common Tasks

  The following sections outline some common administrative tasks for an LVM
system. This is no substitute for reading the man pages.
-----------------------------------------------------------------------------

11.1. Initializing disks or disk partitions

  Before you can use a disk or disk partition as a physical volume you will
have to initialize it:

  For entire disks:

  *   Run pvcreate on the disk:
    # pvcreate /dev/hdb                                                      
                                                                             
    This creates a volume group descriptor at the start of disk.
   
  *   If you get an error that LVM can't initialize a disk with a partition
    table on it, first make sure that the disk you are operating on is the
    correct one. If you are very sure that it is, run the following:
   
    Warning DANGEROUS                                                        
            The following commands will destroy the partition table on the   
            disk being operated on. Be very sure it is the correct disk.     
    # dd if=/dev/zero of=/dev/diskname bs=1k count=1                         
    # blockdev --rereadpt /dev/diskname                                      
   

For partitions:

  *   When using LVM 1 on PCs with DOS partitions, set the partition type to
    0x8e using fdisk or some other similar program. This step is unnecessary
    on PPC systems or when using LVM 2.
   
  *   Run pvcreate on the partition:
    # pvcreate /dev/hdb1                                                     
                                                                             
    This creates a volume group descriptor at the start of the /dev/hdb1
    partition.
   

-----------------------------------------------------------------------------
11.2. Creating a volume group

  Use the 'vgcreate' program:
# vgcreate my_volume_group /dev/hda1 /dev/hdb1                               
                                                                             
NOTE: If you are using LVM 1 with devfs it is essential to use the full devfs
name of the device rather than the symlinked name in /dev. So the above would
be:
# vgcreate my_volume_group /dev/ide/host0/bus0/target0/lun0/part1 \          
                           /dev/ide/host0/bus0/target1/lun0/part1            
                                                                             
LVM 2 does not have this restriction.

  You can also specify the extent size with this command if the default of
32MB is not suitable for you with the '-s' switch. In addition you can put
some limits on the number of physical or logical volumes the volume can have.
-----------------------------------------------------------------------------

11.3. Activating a volume group

  After rebooting the system or running vgchange -an, you will not be able to
access your VGs and LVs. To reactivate the volume group, run:
# vgchange -a y my_volume_group                                              
                                                                             
-----------------------------------------------------------------------------

11.4. Removing a volume group

  Make sure that no logical volumes are present in the volume group, see
later section for how to do this.

  Deactivate the volume group:
# vgchange -a n my_volume_group                                              
                                                                             

  Now you actually remove the volume group:
# vgremove my_volume_group                                                   
                                                                             
-----------------------------------------------------------------------------

11.5. Adding physical volumes to a volume group

  Use 'vgextend' to add an initialized physical volume to an existing volume
group.
# vgextend my_volume_group /dev/hdc1                                         
                                    ^^^^^^^^^ new physical volume            
                                                                             
-----------------------------------------------------------------------------

11.6. Removing physical volumes from a volume group

  Make sure that the physical volume isn't used by any logical volumes by
using then 'pvdisplay' command:
# pvdisplay /dev/hda1                                                        
                                                                             
--- Physical volume ---                                                      
PV Name               /dev/hda1                                              
VG Name               myvg                                                   
PV Size               1.95 GB / NOT usable 4 MB [LVM: 122 KB]                
PV#                   1                                                      
PV Status             available                                              
Allocatable           yes (but full)                                         
Cur LV                1                                                      
PE Size (KByte)       4096                                                   
Total PE              499                                                    
Free PE               0                                                      
Allocated PE          499                                                    
PV UUID               Sd44tK-9IRw-SrMC-MOkn-76iP-iftz-OVSen7                 
                                                                             
                                                                             

  If the physical volume is still used you will have to migrate the data to
another physical volume using pvmove.

  Then use 'vgreduce' to remove the physical volume:
# vgreduce my_volume_group /dev/hda1                                         
                                                                             
-----------------------------------------------------------------------------

11.7. Creating a logical volume

  To create a 1500MB linear LV named 'testlv' and its block device special '/
dev/testvg/testlv':
# lvcreate -L1500 -ntestlv testvg                                            
                                                                             

  To create a 100 LE large logical volume with 2 stripes and stripe size 4
KB.
# lvcreate -i2 -I4 -l100 -nanothertestlv testvg                              
                                                                             

  If you want to create an LV that uses the entire VG, use vgdisplay to find
the "Total PE" size, then use that when running lvcreate.
# vgdisplay testvg | grep "Total PE"                                         
Total PE              10230                                                  
# lvcreate -l 10230 testvg -n mylv                                           
                                                                             
This will create an LV called mylv filling the testvg VG.

  If you want the logical volume to be allocated from a specific physical
volume in the volume group, specify the PV or PVs at the end of the lvcreate
command line.
# lvcreate -L 1500 -ntestlv testvg /dev/sdg                                  
                                                                             
-----------------------------------------------------------------------------

11.8. Removing a logical volume

  A logical volume must be closed before it can be removed:
# umount /dev/myvg/homevol                                                   
# lvremove /dev/myvg/homevol                                                 
lvremove -- do you really want to remove "/dev/myvg/homevol"? [y/n]: y       
lvremove -- doing automatic backup of volume group "myvg"                    
lvremove -- logical volume "/dev/myvg/homevol" successfully removed          
                                                                             
-----------------------------------------------------------------------------

11.9. Extending a logical volume

  To extend a logical volume you simply tell the lvextend command how much
you want to increase the size. You can specify how much to grow the volume,
or how large you want it to grow to:
# lvextend -L12G /dev/myvg/homevol                                           
lvextend -- extending logical volume "/dev/myvg/homevol" to 12 GB            
lvextend -- doing automatic backup of volume group "myvg"                    
lvextend -- logical volume "/dev/myvg/homevol" successfully extended         
                                                                             
will extend /dev/myvg/homevol to 12 Gigabytes.

 
# lvextend -L+1G /dev/myvg/homevol                                           
lvextend -- extending logical volume "/dev/myvg/homevol" to 13 GB            
lvextend -- doing automatic backup of volume group "myvg"                    
lvextend -- logical volume "/dev/myvg/homevol" successfully extended         
                                                                             
will add another gigabyte to /dev/myvg/homevol.

  After you have extended the logical volume it is necessary to increase the
file system size to match. how you do this depends on the file system you are
using.

  By default, most file system resizing tools will increase the size of the
file system to be the size of the underlying logical volume so you don't need
to worry about specifying the same size for each of the two commands.

 1.     ext2/ext3
   
      Unless you have patched your kernel with the ext2online patch it is
    necessary to unmount the file system before resizing it. (It seems that
    the online resizing patch is rather dangerous, so use at your own risk)
       # umount /dev/myvg/homevol/dev/myvg/homevol                           
       # resize2fs /dev/myvg/homevol                                         
       # mount /dev/myvg/homevol /home                                       
                                                                             
   
    If you don't have e2fsprogs 1.19 or later, you can download the
    ext2resize command from [http://ext2resize.sourceforge.net]
    ext2resize.sourceforge.net and use that:
       # umount /dev/myvg/homevol/dev/myvg/homevol                           
       # ext2resize /dev/myvg/homevol                                        
       # mount /dev/myvg/homevol /home                                       
                                                                             
   
      For ext2 there is an easier way. LVM 1 ships with a utility called
    e2fsadm which does the lvextend and resize2fs for you (it can also do
    file system shrinking, see the next section).
   
    Warning LVM 2 Caveat                                                     
            There is currently no e2fsadm equivalent for LVM 2 and the       
            e2fsadm that ships with LVM 1 does not work with LVM 2.          
    so the single command
       # e2fsadm -L+1G /dev/myvg/homevol                                     
                                                                             
    is equivalent to the two commands:
       # lvextend -L+1G /dev/myvg/homevol                                    
       # resize2fs /dev/myvg/homevol                                         
                                                                             
   
    Note Note                                                                
         You will still need to unmount the file system before running       
         e2fsadm.                                                            
   
 2.     reiserfs
   
      Reiserfs file systems can be resized when mounted or unmounted as you
    prefer:
   
      +   Online:
           # resize_reiserfs -f /dev/myvg/homevol                            
                                                                             
       
      +   Offline:
           # umount /dev/myvg/homevol                                        
           # resize_reiserfs /dev/myvg/homevol                               
           # mount -treiserfs /dev/myvg/homevol /home                        
                                                                             
       
   
 3.     xfs
   
      XFS file systems must be mounted to be resized and the mount-point is
    specified rather than the device name.
       # xfs_growfs /home                                                    
                                                                             
   
 4.     jfs
   
      Just like XFS the JFS file system must be mounted to be resized and the
    mount-point is specified rather than the device name. You need at least
    Version 1.0.21 of the jfs-utils to do this.
    # mount -o remount,resize /home                                          
                                                                             
   
    Warning Known Kernel Bug                                                 
            Some kernel versions have problems with this syntax (2.6.0 is    
            known to have this problem). In this case you have to explicitly 
            specify the new size of the filesystem in blocks. This is        
            extremely error prone as you must know the blocksize of your     
            filesystem and calculate the new size based on those units.      
                                                                             
            Example: If you were to resize a JFS file system to 4 gigabytes  
            that has 4k blocks, you would write:                             
            # mount -o remount,resize=1048576 /home                          
                                                                             
   

-----------------------------------------------------------------------------
11.10. Reducing a logical volume

  Logical volumes can be reduced in size as well as increased. However, it is
very important to remember to reduce the size of the file system or whatever
is residing in the volume before shrinking the volume itself, otherwise you
risk losing data.

 1.     ext2
   
      If you are using LVM 1 with ext2 as the file system then you can use
    the e2fsadm command mentioned earlier to take care of both the file
    system and volume resizing as follows:
    # umount /home                                                           
    # e2fsadm -L-1G /dev/myvg/homevol                                        
    # mount /home                                                            
                                                                             
   
    Warning LVM 2 Caveat                                                     
            There is currently no e2fsadm equivalent for LVM 2 and the       
            e2fsadm that ships with LVM 1 does not work with LVM 2.          
   
      If you prefer to do this manually you must know the new size of the
    volume in blocks and use the following commands:
    # umount /home                                                           
    # resize2fs /dev/myvg/homevol 524288                                     
    # lvreduce -L-1G /dev/myvg/homevol                                       
    # mount /home                                                            
                                                                             
   
 2.     reiserfs
   
      Reiserfs seems to prefer to be unmounted when shrinking
    # umount /home                                                           
    # resize_reiserfs -s-1G /dev/myvg/homevol                                
    # lvreduce -L-1G /dev/myvg/homevol                                       
    # mount -treiserfs /dev/myvg/homevol /home                               
                                                                             
   
 3.     xfs
   
      There is no way to shrink XFS file systems.
   
 4.     jfs
   
      There is no way to shrink JFS file systems.
   

-----------------------------------------------------------------------------
11.11. Migrating data off of a physical volume

  To take a disk out of service it must first have all of its active physical
extents moved to one or more of the remaining disks in the volume group.
There must be enough free physical extents in the remaining PVs to hold the
extents to be copied from the old disk. For further detail see Section 13.5.
-----------------------------------------------------------------------------

Chapter 12. Disk partitioning

12.1. Multiple partitions on the same disk

  LVM allows you to create PVs (physical volumes) out of almost any block
device so, for example, the following are all valid commands and will work
quite happily in an LVM environment:
# pvcreate /dev/sda1                                                         
# pvcreate /dev/sdf                                                          
# pvcreate /dev/hda8                                                         
# pvcreate /dev/hda6                                                         
# pvcreate /dev/md1                                                          
                                                                             

  In a "normal" production system it is recommended that only one PV exists
on a single real disk, for the following reasons:

  *   Administrative convenience
   
      It's easier to keep track of the hardware in a system if each real disk
    only appears once. This becomes particularly true if a disk fails.
   
  *   To avoid striping performance problems
   
      LVM can't tell that two PVs are on the same physical disk, so if you
    create a striped LV then the stripes could be on different partitions on
    the same disk resulting in a decrease in performance rather than an
    increase.
   

However it may be desirable to do this for some reasons:

  *   Migration of existing system to LVM
   
      On a system with few disks it may be necessary to move data around
    partitions to do the conversion (see Section 13.8)
   
  *   Splitting one big disk between Volume Groups
   
      If you have a very large disk and want to have more than one volume
    group for administrative purposes then it is necessary to partition the
    drive into more than one area.
   

  If you do have a disk with more than one partition and both of those
partitions are in the same volume group, take care to specify which
partitions are to be included in a logical volume when creating striped
volumes.

  The recommended method of partitioning a disk is to create a single
partition that covers the whole disk. This avoids any nasty accidents with
whole disk drive device nodes and prevents the kernel warning about unknown
partition types at boot-up.
-----------------------------------------------------------------------------

12.2. Sun disk labels

  You need to be especially careful on SPARC systems where the disks have Sun
disk labels on them.

  The normal layout for a Sun disk label is for the first partition to start
at block zero of the disk, thus the first partition also covers the area
containing the disk label itself. This works fine for ext2 filesystems (and
is essential for booting using SILO) but such partitions should not be used
for LVM. This is because LVM starts writing at the very start of the device
and will overwrite the disk label.

  If you want to use a disk with a Sun disk label with LVM, make sure that
the partition you are going to use starts at cylinder 1 or higher.
-----------------------------------------------------------------------------

Chapter 13. Recipes

  This section details several different "recipes" for setting up lvm. The
hope is that the reader will adapt these recipes to their own system and
needs.
-----------------------------------------------------------------------------

13.1. Setting up LVM on three SCSI disks

  For this recipe, the setup has three SCSI disks that will be put into a
logical volume using LVM. The disks are at /dev/sda, /dev/sdb, and /dev/sdc.
-----------------------------------------------------------------------------

13.1.1. Preparing the disks

  Before you can use a disk in a volume group you will have to prepare it:

Warning Warning!                                                             
        The following will destroy any data on /dev/sda, /dev/sdb, and /dev/ 
        sdc                                                                  

  Run pvcreate on the disks
# pvcreate /dev/sda                                                          
# pvcreate /dev/sdb                                                          
# pvcreate /dev/sdc                                                          
                                                                             
This creates a volume group descriptor area (VGDA) at the start of the disks.
-----------------------------------------------------------------------------

13.1.2. Setup a Volume Group

 1.   Create a volume group
    # vgcreate my_volume_group /dev/sda /dev/sdb /dev/sdc/                   
                                                                             
   
 2.   Run vgdisplay to verify volume group
    # vgdisplay                                                              
    # vgdisplay                                                              
    --- Volume Group ---                                                     
    VG Name               my_volume_group                                    
    VG Access             read/write                                         
    VG Status             available/resizable                                
    VG #                  1                                                  
    MAX LV                256                                                
    Cur LV                0                                                  
    Open LV               0                                                  
    MAX LV Size           255.99 GB                                          
    Max PV                256                                                
    Cur PV                3                                                  
    Act PV                3                                                  
    VG Size               1.45 GB                                            
    PE Size               4 MB                                               
    Total PE              372                                                
    Alloc PE / Size       0 / 0                                              
    Free  PE / Size       372/ 1.45 GB                                       
    VG UUID               nP2PY5-5TOS-hLx0-FDu0-2a6N-f37x-0BME0Y             
                                                                             
    The most important things to verify are that the first three items are
    correct and that the VG Size item is the proper size for the amount of
    space in all four of your disks.
   

-----------------------------------------------------------------------------
13.1.3. Creating the Logical Volume

  If the volume group looks correct, it is time to create a logical volume on
top of the volume group.

  You can make the logical volume any size you like. (It is similar to a
partition on a non LVM setup.) For this example we will create just a single
logical volume of size 1GB on the volume group. We will not use striping
because it is not currently possible to add a disk to a stripe set after the
logical volume is created.
# lvcreate -L1G -nmy_logical_volume my_volume_group                                      
lvcreate -- doing automatic backup of "my_volume_group"                                  
lvcreate -- logical volume "/dev/my_volume_group/my_logical_volume" successfully created 
                                                                                         
-----------------------------------------------------------------------------

13.1.4. Create the File System

  Create an ext2 file system on the logical volume
# mke2fs /dev/my_volume_group/my_logical_volume                              
mke2fs 1.19, 13-Jul-2000 for EXT2 FS 0.5b, 95/08/09                          
Filesystem label=                                                            
OS type: Linux                                                               
Block size=4096 (log=2)                                                      
Fragment size=4096 (log=2)                                                   
131072 inodes, 262144 blocks                                                 
13107 blocks (5.00%) reserved for the super user                             
First data block=0                                                           
9 block groups                                                               
32768 blocks per group, 32768 fragments per group                            
16384 inodes per group                                                       
Superblock backups stored on blocks:                                         
        32768, 98304, 163840, 229376                                         
                                                                             
Writing inode tables: done                                                   
Writing superblocks and filesystem accounting information: done              
                                                                             
-----------------------------------------------------------------------------

13.1.5. Test the File System

  Mount the logical volume and check to make sure everything looks correct
# mount /dev/my_volume_group/my_logical_volume /mnt                          
# df                                                                         
Filesystem           1k-blocks      Used Available Use% Mounted on           
/dev/hda1              1311552    628824    616104  51% /                    
/dev/my_volume_group/my_logical_volume                                       
                       1040132        20    987276   0% /mnt                 
                                                                             

  If everything worked properly, you should now have a logical volume with
and ext2 file system mounted at /mnt.
-----------------------------------------------------------------------------

13.2. Setting up LVM on three SCSI disks with striping

  For this recipe, the setup has three SCSI disks that will be put into a
logical volume using LVM. The disks are at /dev/sda, /dev/sdb, and /dev/sdc.

Note Note                                                                    
     It is not currently possible to add a disk to a striped logical volume  
     in LVM 1. Use LVM 2 with the lvm 2 format metadata if you wish to be    
     able to do so able to do so.                                            
-----------------------------------------------------------------------------

13.2.1. Preparing the disk partitions

  Before you can use a disk in a volume group you will have to prepare it:

Warning Warning!                                                             
        The following will destroy any data on /dev/sda, /dev/sdb, and /dev/ 
        sdc                                                                  

  Run pvcreate on the disks:
# pvcreate /dev/sda                                                          
# pvcreate /dev/sdb                                                          
# pvcreate /dev/sdc                                                          
                                                                             
This creates a volume group descriptor area (VGDA) at the start of the disks.
-----------------------------------------------------------------------------

13.2.2. Setup a Volume Group

 1.   Create a volume group
    # vgcreate my_volume_group /dev/sda /dev/sdb /dev/sdc                    
                                                                             
   
 2.   Run vgdisplay to verify volume group
    # vgdisplay                                                              
    --- Volume Group ---                                                     
    VG Name               my_volume_group                                    
    VG Access             read/write                                         
    VG Status             available/resizable                                
    VG #                  1                                                  
    MAX LV                256                                                
    Cur LV                0                                                  
    Open LV               0                                                  
    MAX LV Size           255.99 GB                                          
    Max PV                256                                                
    Cur PV                3                                                  
    Act PV                3                                                  
    VG Size               1.45 GB                                            
    PE Size               4 MB                                               
    Total PE              372                                                
    Alloc PE / Size       0 / 0                                              
    Free  PE / Size       372/ 1.45 GB                                       
    VG UUID               nP2PY5-5TOS-hLx0-FDu0-2a6N-f37x-0BME0Y             
                                                                             
    The most important things to verify are that the first three items are
    correct and that the VG Size item is the proper size for the amount of
    space in all four of your disks.
   

-----------------------------------------------------------------------------
13.2.3. Creating the Logical Volume

  If the volume group looks correct, it is time to create a logical volume on
top of the volume group.

  You can make the logical volume any size you like (up to the size of the VG
you are creating it on; it is similar to a partition on a non LVM setup). For
this example we will create just a single logical volume of size 1GB on the
volume group. The logical volume will be a striped set using for the 4k
stripe size. This should increase the performance of the logical volume.
# lvcreate -i3 -I4 -L1G -nmy_logical_volume my_volume_group                              
lvcreate -- rounding 1048576 KB to stripe boundary size 1056768 KB / 258 PE              
lvcreate -- doing automatic backup of "my_volume_group"                                  
lvcreate -- logical volume "/dev/my_volume_group/my_logical_volume" successfully created 
                                                                                         

Note Note                                                                    
     If you create the logical volume with a '-i2' you will only use two of  
     the disks in your volume group. This is useful if you want to create two
     logical volumes out of the same physical volume, but we will not touch  
     that in this recipe.                                                    
-----------------------------------------------------------------------------

13.2.4. Create the File System

  Create an ext2 file system on the logical volume
# mke2fs /dev/my_volume_group/my_logical_volume                              
mke2fs 1.19, 13-Jul-2000 for EXT2 FS 0.5b, 95/08/09                          
Filesystem label=                                                            
OS type: Linux                                                               
Block size=4096 (log=2)                                                      
Fragment size=4096 (log=2)                                                   
132192 inodes, 264192 blocks                                                 
13209 blocks (5.00%) reserved for the super user                             
First data block=0                                                           
9 block groups                                                               
32768 blocks per group, 32768 fragments per group                            
14688 inodes per group                                                       
Superblock backups stored on blocks:                                         
        32768, 98304, 163840, 229376                                         
                                                                             
Writing inode tables: done                                                   
Writing superblocks and filesystem accounting information: done              
                                                                             
-----------------------------------------------------------------------------

13.2.5. Test the File System

  Mount the file system on the logical volume
# mount /dev/my_volume_group/my_logical_volume /mnt                          
                                                                             
and check to make sure everything looks correct
# df                                                                         
Filesystem           1k-blocks      Used Available Use% Mounted on           
/dev/hda1              1311552    628824    616104  51% /                    
/dev/my_volume_group/my_logical_volume                                       
                       1040132        20    987276   0% /mnt                 
                                                                             
If everything worked properly, you should now have a logical volume mounted
at /mnt.
-----------------------------------------------------------------------------

13.3. Add a new disk to a multi-disk SCSI system

13.3.1. Current situation

  A data centre machine has 6 disks attached as follows:
# pvscan                                                                     
pvscan -- ACTIVE   PV "/dev/sda"  of VG "dev"   [1.95 GB / 0 free]           
pvscan -- ACTIVE   PV "/dev/sdb"  of VG "sales" [1.95 GB / 0 free]           
pvscan -- ACTIVE   PV "/dev/sdc"  of VG "ops"   [1.95 GB / 44 MB free]       
pvscan -- ACTIVE   PV "/dev/sdd"  of VG "dev"   [1.95 GB / 0 free]           
pvscan -- ACTIVE   PV "/dev/sde1" of VG "ops"   [996 MB / 52 MB free]        
pvscan -- ACTIVE   PV "/dev/sde2" of VG "sales" [996 MB / 944 MB free]       
pvscan -- ACTIVE   PV "/dev/sdf1" of VG "ops"   [996 MB / 0 free]            
pvscan -- ACTIVE   PV "/dev/sdf2" of VG "dev"   [996 MB / 72 MB free]        
pvscan -- total: 8 [11.72 GB] / in use: 8 [11.72 GB] / in no VG: 0 [0]       
                                                                             
# df                                                                         
Filesystem           1k-blocks      Used Available Use% Mounted on           
/dev/dev/cvs           1342492    516468    757828  41% /mnt/dev/cvs         
/dev/dev/users         2064208   2060036      4172 100% /mnt/dev/users       
/dev/dev/build         1548144   1023041    525103  66% /mnt/dev/build       
/dev/ops/databases     2890692   2302417    588275  79% /mnt/ops/databases   
/dev/sales/users       2064208    871214   1192994  42% /mnt/sales/users     
/dev/ops/batch         1032088    897122    134966  86% /mnt/ops/batch       
                                                                             
As you can see the "dev" and "ops" groups are getting full so a new disk is
purchased and added to the system. It becomes /dev/sdg.
-----------------------------------------------------------------------------

13.3.2. Prepare the disk partitions

  The new disk is to be shared equally between ops and dev so it is
partitioned into two physical volumes /dev/sdg1 and /dev/sdg2 :
# fdisk /dev/sdg                                                             
                                                                             
Device contains neither a valid DOS partition table, nor Sun or SGI          
disklabel Building a new DOS disklabel. Changes will remain in memory        
only, until you decide to write them. After that, of course, the             
previous content won't be recoverable.                                       
                                                                             
Command (m for help): n                                                      
Command action                                                               
   e   extended                                                              
   p   primary partition (1-4)                                               
p                                                                            
Partition number (1-4): 1                                                    
First cylinder (1-1000, default 1):                                          
Using default value 1                                                        
Last cylinder or +size or +sizeM or +sizeK (1-1000, default 1000): 500       
                                                                             
Command (m for help): n                                                      
Command action                                                               
   e   extended                                                              
   p   primary partition (1-4)                                               
p                                                                            
Partition number (1-4): 2                                                    
First cylinder (501-1000, default 501):                                      
Using default value 501                                                      
Last cylinder or +size or +sizeM or +sizeK (501-1000, default 1000):         
Using default value 1000                                                     
                                                                             
Command (m for help): t                                                      
Partition number (1-4): 1                                                    
Hex code (type L to list codes): 8e                                          
Changed system type of partition 1 to 8e (Unknown)                           
                                                                             
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 (Unknown)                           
                                                                             
Command (m for help): w                                                      
The partition table has been altered!                                        
                                                                             
Calling ioctl() to re-read partition table.                                  
                                                                             
WARNING: If you have created or modified any DOS 6.x partitions,             
please see the fdisk manual page for additional information.                 
                                                                             
                                                                             

  Next physical volumes are created on this partition:
# pvcreate /dev/sdg1                                                         
pvcreate -- physical volume "/dev/sdg1" successfully created                 
                                                                             
# pvcreate /dev/sdg2                                                         
pvcreate -- physical volume "/dev/sdg2" successfully created                 
                                                                             
-----------------------------------------------------------------------------

13.3.3. Add the new disks to the volume groups

  The volumes are then added to the dev and ops volume groups:
# vgextend ops /dev/sdg1                                                     
vgextend -- INFO: maximum logical volume size is 255.99 Gigabyte             
vgextend -- doing automatic backup of volume group "ops"                     
vgextend -- volume group "ops" successfully extended                         
                                                                             
# vgextend dev /dev/sdg2                                                     
vgextend -- INFO: maximum logical volume size is 255.99 Gigabyte             
vgextend -- doing automatic backup of volume group "dev"                     
vgextend -- volume group "dev" successfully extended                         
                                                                             
# pvscan                                                                     
pvscan -- reading all physical volumes (this may take a while...)            
pvscan -- ACTIVE   PV "/dev/sda"  of VG "dev"   [1.95 GB / 0 free]           
pvscan -- ACTIVE   PV "/dev/sdb"  of VG "sales" [1.95 GB / 0 free]           
pvscan -- ACTIVE   PV "/dev/sdc"  of VG "ops"   [1.95 GB / 44 MB free]       
pvscan -- ACTIVE   PV "/dev/sdd"  of VG "dev"   [1.95 GB / 0 free]           
pvscan -- ACTIVE   PV "/dev/sde1" of VG "ops"   [996 MB / 52 MB free]        
pvscan -- ACTIVE   PV "/dev/sde2" of VG "sales" [996 MB / 944 MB free]       
pvscan -- ACTIVE   PV "/dev/sdf1" of VG "ops"   [996 MB / 0 free]            
pvscan -- ACTIVE   PV "/dev/sdf2" of VG "dev"   [996 MB / 72 MB free]        
pvscan -- ACTIVE   PV "/dev/sdg1" of VG "ops"   [996 MB / 996 MB free]       
pvscan -- ACTIVE   PV "/dev/sdg2" of VG "dev"   [996 MB / 996 MB free]       
pvscan -- total: 10 [13.67 GB] / in use: 10 [13.67 GB] / in no VG: 0 [0]     
                                                                             
-----------------------------------------------------------------------------

13.3.4. Extend the file systems

  The next thing to do is to extend the file systems so that the users can
make use of the extra space.

  There are tools to allow online-resizing of ext2 file systems but here we
take the safe route and unmount the two file systems before resizing them:
# umount /mnt/ops/batch                                                      
# umount /mnt/dev/users                                                      
                                                                             

  We then use the e2fsadm command to resize the logical volume and the ext2
file system on one operation. We are using ext2resize instead of resize2fs
(which is the default command for e2fsadm) so we define the environment
variable E2FSADM_RESIZE_CMD to tell e2fsadm to use that command.
# export E2FSADM_RESIZE_CMD=ext2resize                                                
# e2fsadm /dev/ops/batch -L+500M                                                      
e2fsck 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09                                   
Pass 1: Checking inodes, blocks, and sizes                                            
Pass 2: Checking directory structure                                                  
Pass 3: Checking directory connectivity                                               
Pass 4: Checking reference counts                                                     
Pass 5: Checking group summary information                                            
/dev/ops/batch: 11/131072 files (0.0<!--  non-contiguous), 4127/262144 blocks         
lvextend -- extending logical volume "/dev/ops/batch" to 1.49 GB                      
lvextend -- doing automatic backup of volume group "ops"                              
lvextend -- logical volume "/dev/ops/batch" successfully extended                     
                                                                                      
ext2resize v1.1.15 - 2000/08/08 for EXT2FS 0.5b                                       
e2fsadm -- ext2fs in logical volume "/dev/ops/batch" successfully extended to 1.49 GB 
                                                                                      
                                                                                      
# e2fsadm /dev/dev/users -L+900M                                                      
e2fsck 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09                                   
Pass 1: Checking inodes, blocks, and sizes                                            
Pass 2: Checking directory structure                                                  
Pass 3: Checking directory connectivity                                               
Pass 4: Checking reference counts                                                     
Pass 5: Checking group summary information                                            
/dev/dev/users: 12/262144 files (0.0% non-contiguous), 275245/524288 blocks           
lvextend -- extending logical volume "/dev/dev/users" to 2.88 GB                      
lvextend -- doing automatic backup of volume group "dev"                              
lvextend -- logical volume "/dev/dev/users" successfully extended                     
                                                                                      
ext2resize v1.1.15 - 2000/08/08 for EXT2FS 0.5b                                       
e2fsadm -- ext2fs in logical volume "/dev/dev/users" successfully extended to 2.88 GB 
                                                                                      
-----------------------------------------------------------------------------

13.3.5. Remount the extended volumes

  We can now remount the file systems and see that the is plenty of space.
# mount /dev/ops/batch                                                       
# mount /dev/dev/users                                                       
# df                                                                         
Filesystem           1k-blocks      Used Available Use% Mounted on           
/dev/dev/cvs           1342492    516468    757828  41% /mnt/dev/cvs         
/dev/dev/users         2969360   2060036    909324  69% /mnt/dev/users       
/dev/dev/build         1548144   1023041    525103  66% /mnt/dev/build       
/dev/ops/databases     2890692   2302417    588275  79% /mnt/ops/databases   
/dev/sales/users       2064208    871214   1192994  42% /mnt/sales/users     
/dev/ops/batch         1535856    897122    638734  58% /mnt/ops/batch       
                                                                             
-----------------------------------------------------------------------------

13.4. Taking a Backup Using Snapshots

  Following on from the previous example we now want to use the extra space
in the "ops" volume group to make a database backup every evening. To ensure
that the data that goes onto the tape is consistent we use an LVM snapshot
logical volume.

  A snapshot volume is a special type of volume that presents all the data
that was in the volume at the time the snapshot was created. For a more
detailed description, see Section 3.8, Snapshots. This means we can back up
that volume without having to worry about data being changed while the backup
is going on, and we don't have to take the database volume offline while the
backup is taking place.

Note In LVM1, this type of volume was read-only, but LVM2 creates read/write 
     snapshots by default.                                                   
-----------------------------------------------------------------------------

13.4.1. Create the snapshot volume

  There is a little over 500 Megabytes of free space in the "ops" volume
group, so we will use all of it to allocate space for the snapshot logical
volume. A snapshot volume can be as large or a small as you like but it must
be large enough to hold all the changes that are likely to happen to the
original volume during the lifetime of the snapshot. So here, allowing 500
megabytes of changes to the database volume which should be plenty.
# lvcreate -L592M -s -n dbbackup /dev/ops/databases                                  
lvcreate -- WARNING: the snapshot must be disabled if it gets full                   
lvcreate -- INFO: using default snapshot chunk size of 64 KB for "/dev/ops/dbbackup" 
lvcreate -- doing automatic backup of "ops"                                          
lvcreate -- logical volume "/dev/ops/dbbackup" successfully created                  
                                                                                     
                                                                                     

Warning Full snapshot are automatically disabled                             
        If the snapshot logical volume becomes full it will become unusable  
        so it is vitally important to allocate enough space.                 
-----------------------------------------------------------------------------

13.4.2. Mount the snapshot volume

  We can now create a mount-point and mount the volume
# mkdir /mnt/ops/dbbackup                                                    
# mount /dev/ops/dbbackup /mnt/ops/dbbackup                                  
mount: block device /dev/ops/dbbackup is write-protected, mounting read-only 
                                                                             

  If you are using XFS as the filesystem you will need to add the nouuid
option to the mount command:
# mount /dev/ops/dbbackup /mnt/ops/dbbackup -onouuid,ro                      
                                                                             
-----------------------------------------------------------------------------

13.4.3. Do the backup

  I assume you will have a more sophisticated backup strategy than this!
# tar -cf /dev/rmt0 /mnt/ops/dbbackup                                        
tar: Removing leading `/' from member names                                  
                                                                             
-----------------------------------------------------------------------------

13.4.4. Remove the snapshot

  When the backup has finished you can now unmount the volume and remove it
from the system. You should remove snapshot volume when you have finished
with them because they take a copy of all data written to the original volume
and this can hurt performance.
# umount /mnt/ops/dbbackup                                                        
# lvremove /dev/ops/dbbackup                                                      
lvremove -- do you really want to remove "/dev/ops/dbbackup"? [y/n]: y            
lvremove -- doing automatic backup of volume group "ops"                          
              lvremove -- logical volume "/dev/ops/dbbackup" successfully removed 
                                                                                  
-----------------------------------------------------------------------------

13.5. Removing an Old Disk

  Say you have an old IDE drive on /dev/hdb. You want to remove that old disk
but a lot of files are on it.

Caution Backup Your System                                                   
        You should always backup your system before attempting a pvmove      
        operation.                                                           
-----------------------------------------------------------------------------

13.5.1. Distributing Old Extents to Existing Disks in Volume Group

  If you have enough free extents on the other disks in the volume group, you
have it easy. Simply run
# pvmove /dev/hdb                                                            
pvmove -- moving physical extents in active volume group "dev"               
pvmove -- WARNING: moving of active logical volumes may cause data loss!     
pvmove -- do you want to continue? [y/n] y                                   
pvmove -- 249 extents of physical volume "/dev/hdb" successfully moved       
                                                                             
This will move the allocated physical extents from /dev/hdb onto the rest of
the disks in the volume group.

Note pvmove is Slow                                                          
     Be aware that pvmove is quite slow as it has to copy the contents of a  
     disk block by block to one or more disks. If you want more steady status
     reports from pvmove, use the -v flag.                                   
-----------------------------------------------------------------------------

13.5.1.1. Remove the unused disk

  We can now remove the old IDE disk from the volume group.
# vgreduce dev /dev/hdb                                                      
vgreduce -- doing automatic backup of volume group "dev"                     
vgreduce -- volume group "dev" successfully reduced by physical volume:      
vgreduce -- /dev/hdb                                                         
                                                                             
The drive can now be either physically removed when the machine is next
powered down or reallocated to other users.
-----------------------------------------------------------------------------

13.5.2. Distributing Old Extents to a New Replacement Disk

  If you do not have enough free physical extents to distribute the old
physical extents to, you will have to add a disk to the volume group and move
the extents to it.
-----------------------------------------------------------------------------

13.5.2.1. Prepare the disk

  First, you need to pvcreate the new disk to make it available to LVM. In
this recipe we show that you don't need to partition a disk to be able to use
it.
# pvcreate /dev/sdf                                                          
pvcreate -- physical volume "/dev/sdf" successfully created                  
                                                                             
-----------------------------------------------------------------------------

13.5.2.2. Add it to the volume group

  As developers use a lot of disk space this is a good volume group to add it
into.
# vgextend dev /dev/sdf                                                      
vgextend -- INFO: maximum logical volume size is 255.99 Gigabyte             
vgextend -- doing automatic backup of volume group "dev"                     
vgextend -- volume group "dev" successfully extended                         
                                                                             
-----------------------------------------------------------------------------

13.5.2.3. Move the data

  Next we move the data from the old disk onto the new one. Note that it is
not necessary to unmount the file system before doing this. Although it is *
highly* recommended that you do a full backup before attempting this
operation in case of a power outage or some other problem that may interrupt
it. The pvmove command can take a considerable amount of time to complete and
it also exacts a performance hit on the two volumes so, although it isn't
necessary, it is advisable to do this when the volumes are not too busy.
# pvmove /dev/hdb /dev/sdf                                                   
pvmove -- moving physical extents in active volume group "dev"               
pvmove -- WARNING: moving of active logical volumes may cause data loss!     
pvmove -- do you want to continue? [y/n] y                                   
pvmove -- 249 extents of physical volume "/dev/hdb" successfully moved       
                                                                             
-----------------------------------------------------------------------------

13.5.2.4. Remove the unused disk

  We can now remove the old IDE disk from the volume group.
# vgreduce dev /dev/hdb                                                      
vgreduce -- doing automatic backup of volume group "dev"                     
vgreduce -- volume group "dev" successfully reduced by physical volume:      
vgreduce -- /dev/hdb                                                         
                                                                             
The drive can now be either physically removed when the machine is next
powered down or reallocated to some other users.
-----------------------------------------------------------------------------

13.6. Moving a volume group to another system

  It is quite easy to move a whole volume group to another system if, for
example, a user department acquires a new server. To do this we use the
vgexport and vgimport commands.

Note vgexport/vgimport is not necessary to move drives from one system to    
     another. It is an administrative policy tool to prevent access to       
     volumes in the time it takes to move them.                              
-----------------------------------------------------------------------------

13.6.1. Unmount the file system

  First, make sure that no users are accessing files on the active volume,
then unmount it
# unmount /mnt/design/users                                                  
                                                                             
-----------------------------------------------------------------------------

13.6.2. Mark the volume group inactive

  Marking the volume group inactive removes it from the kernel and prevents
any further activity on it.
# vgchange -an design                                                        
vgchange -- volume group "design" successfully deactivated                   
                                                                             
-----------------------------------------------------------------------------

13.6.3. Export the volume group

  It is now necessary to export the volume group. This prevents it from being
accessed on the ``old'' host system and prepares it to be removed.
# vgexport design                                                            
vgexport -- volume group "design" successfully exported                      
                                                                             
When the machine is next shut down, the disk can be unplugged and then
connected to it's new machine
-----------------------------------------------------------------------------

13.6.4. Import the volume group

  When plugged into the new system it becomes /dev/sdb so an initial pvscan
shows:
# pvscan                                                                             
pvscan -- reading all physical volumes (this may take a while...)                    
pvscan -- inactive PV "/dev/sdb1"  is in EXPORTED VG "design" [996 MB / 996 MB free] 
pvscan -- inactive PV "/dev/sdb2"  is in EXPORTED VG "design" [996 MB / 244 MB free] 
pvscan -- total: 2 [1.95 GB] / in use: 2 [1.95 GB] / in no VG: 0 [0]                 
                                                                                     
We can now import the volume group (which also activates it) and mount the
file system.

  If you are importing on an LVM 2 system, run:
# vgimport design                                                            
  Volume group "vg" successfully imported                                    
                                                                             

  If you are importing on an LVM 1 system, add the PVs that need to be
imported:
# vgimport design /dev/sdb1 /dev/sdb2                                        
vgimport -- doing automatic backup of volume group "design"                  
vgimport -- volume group "design" successfully imported and activated        
                                                                             
-----------------------------------------------------------------------------

13.6.5. Activate the volume group

  You must activate the volume group before you can access it.
# vgchange -ay design                                                        
                                                                             
-----------------------------------------------------------------------------

13.6.6. Mount the file system

 
# mkdir -p /mnt/design/users                                                 
# mount /dev/design/users /mnt/design/users                                  
                                                                             
The file system is now available for use.
-----------------------------------------------------------------------------

13.7. Splitting a volume group

  There is a new group of users "design" to add to the system. One way of
dealing with this is to create a new volume group to hold their data. There
are no new disks but there is plenty of free space on the existing disks that
can be reallocated.
-----------------------------------------------------------------------------

13.7.1. Determine free space

 
# pvscan                                                                     
pvscan -- reading all physical volumes (this may take a while...)            
pvscan -- ACTIVE   PV "/dev/sda"  of VG "dev"   [1.95 GB / 0 free]           
pvscan -- ACTIVE   PV "/dev/sdb"  of VG "sales" [1.95 GB / 1.27 GB free]     
pvscan -- ACTIVE   PV "/dev/sdc"  of VG "ops"   [1.95 GB / 564 MB free]      
pvscan -- ACTIVE   PV "/dev/sdd"  of VG "dev"   [1.95 GB / 0 free]           
pvscan -- ACTIVE   PV "/dev/sde"  of VG "ops"   [1.95 GB / 1.9 GB free]      
pvscan -- ACTIVE   PV "/dev/sdf"  of VG "dev"   [1.95 GB / 1.33 GB free]     
pvscan -- ACTIVE   PV "/dev/sdg1" of VG "ops"   [996 MB / 432 MB free]       
pvscan -- ACTIVE   PV "/dev/sdg2" of VG "dev"   [996 MB / 632 MB free]       
pvscan -- total: 8 [13.67 GB] / in use: 8 [13.67 GB] / in no VG: 0 [0]       
                                                                             
We decide to reallocate /dev/sdg1 and /dev/sdg2 to design so first we have to
move the physical extents into the free areas of the other volumes (in this
case /dev/sdf for volume group dev and /dev/sde for volume group ops).
-----------------------------------------------------------------------------

13.7.2. Move data off the disks to be used

  Some space is still used on the chosen volumes so it is necessary to move
that used space off onto some others.

  Move all the used physical extents from /dev/sdg1 to /dev/sde and from /dev
/sdg2 to /dev/sdf
# pvmove /dev/sdg1 /dev/sde                                                  
pvmove -- moving physical extents in active volume group "ops"               
pvmove -- WARNING: moving of active logical volumes may cause data loss!     
pvmove -- do you want to continue? [y/n] y                                   
pvmove -- doing automatic backup of volume group "ops"                       
pvmove -- 141 extents of physical volume "/dev/sdg1" successfully moved      
                                                                             
# pvmove /dev/sdg2 /dev/sdf                                                  
pvmove -- moving physical extents in active volume group "dev"               
pvmove -- WARNING: moving of active logical volumes may cause data loss!     
pvmove -- do you want to continue? [y/n] y                                   
pvmove -- doing automatic backup of volume group "dev"                       
pvmove -- 91 extents of physical volume "/dev/sdg2" successfully moved       
                                                                             
-----------------------------------------------------------------------------

13.7.3. Create the new volume group

  Now, split /dev/sdg2 from dev and add it into a new group called "design".
it is possible to do this using vgreduce and vgcreate but the vgsplit command
combines the two.
# vgsplit dev design /dev/sdg2                                               
vgsplit -- doing automatic backup of volume group "dev"                      
vgsplit -- doing automatic backup of volume group "design"                   
vgsplit -- volume group "dev" successfully split into "dev" and "design"     
                                                                             
-----------------------------------------------------------------------------

13.7.4. Remove remaining volume

  Next, remove /dev/sdg1 from ops and add it into design.
# vgreduce ops /dev/sdg1                                                     
vgreduce -- doing automatic backup of volume group "ops"                     
vgreduce -- volume group "ops" successfully reduced by physical volume:      
vgreduce -- /dev/sdg1                                                        
                                                                             
# vgextend design /dev/sdg1                                                  
vgextend -- INFO: maximum logical volume size is 255.99 Gigabyte             
vgextend -- doing automatic backup of volume group "design"                  
vgextend -- volume group "design" successfully extended                      
                                                                             
-----------------------------------------------------------------------------

13.7.5. Create new logical volume

  Now create a logical volume. Rather than allocate all of the available
space, leave some spare in case it is needed elsewhere.
# lvcreate -L750M -n users design                                            
lvcreate -- rounding up size to physical extent boundary "752 MB"            
lvcreate -- doing automatic backup of "design"                               
lvcreate -- logical volume "/dev/design/users" successfully created          
                                                                             
-----------------------------------------------------------------------------

13.7.6. Make a file system on the volume

# mke2fs /dev/design/users                                                   
mke2fs 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09                          
Filesystem label=                                                            
OS type: Linux                                                               
Block size=4096 (log=2)                                                      
Fragment size=4096 (log=2)                                                   
96384 inodes, 192512 blocks                                                  
9625 blocks (5.00<!-- ) reserved for the super user                          
First data block=0                                                           
6 block groups                                                               
32768 blocks per group, 32768 fragments per group                            
16064 inodes per group                                                       
Superblock backups stored on blocks:                                         
        32768, 98304, 163840                                                 
                                                                             
Writing inode tables: done                                                   
Writing superblocks and filesystem accounting information: done              
                                                                             
-----------------------------------------------------------------------------

13.7.7. Mount the new volume

# mkdir -p /mnt/design/users mount /dev/design/users /mnt/design/users/      
                                                                             

It's also a good idea to add an entry for this file system in your /etc/fstab
file as follows:
/dev/design/user                                                             
/mnt/design/users   ext2    defaults        1 2                              
                                                                             
-----------------------------------------------------------------------------

13.8. Converting a root filesystem to LVM 1

Caution Backup Your System                                                   
        It is strongly recommended that you take a full backup of your system
        before attempting to convert to root on LVM 1.                       

Warning Upgrade Complications                                                
        Having your root filesystem on LVM 1 can significantly complicate    
        upgrade procedures (depending on your distribution) so it should not 
        be attempted lightly. Particularly, you must consider how you will   
        insure that the LVM 1 kernel module (if you do not have LVM 1        
        compiled into the kernel) as well as the vgscan/vgchange tools are   
        available before, during, and after the upgrade.                     

Warning Recovery Complications                                               
        Having your root filesystem on LVM 1 can significantly complicate    
        recovery of damaged filesystems. If you lose your initrd, it will be 
        very difficult to boot your system. You will need to have a recover  
        disk that contains the kernel, LVM 1 module, and LVM 1 tools, as well
        as any tools necessary to recover a damaged filesystem. Be sure to   
        make regular backups and have an up-to-date alternative boot method  
        that allows for recovery of LVM 1.                                   

  In this example the whole system was installed in a single root partition
with the exception of /boot. The system had a 2 gig disk partitioned as:
/dev/hda1  /boot                                                             
/dev/hda2  swap                                                              
/dev/hda3  /                                                                 
                                                                             

  The / partition covered all of the disk not used by /boot and swap. An
important prerequisite of this procedure is that the root partition is less
that half full (so that a copy of it can be created in a logical volume). If
this is not the case then a second disk drive should be used. The procedure
in that case is similar but there is no need to shrink the existing root
partition and /dev/hda4 should be replaced with (eg) /dev/hdb1 in the
examples.

  To do this it is easiest to use GNU parted. This software allows you to
grow and shrink partitions that contain filesystems. It is possible to use
resize2fs and fdisk to do this but GNU parted makes it much less prone to
error. It may be included in your distribution, if not you can download it
from [ftp://ftp.gnu.org/pub/gnu/parted] ftp://ftp.gnu.org/pub/gnu/parted.

  Once you have parted on your system AND YOU HAVE BACKED THE SYSTEM UP:
-----------------------------------------------------------------------------

13.8.1. Boot single user

  Boot into single user mode (type linux S at the LILO prompt) This is
important. Booting single-user ensures that the root filesystem is mounted
read-only and no programs are accessing the disk.
-----------------------------------------------------------------------------

13.8.2. Run Parted

  Run parted to shrink the root partition Do this so there is room on the
disk for a complete copy of it in a logical volume. In this example a 1.8 gig
partition is shrunk to 1 gigabyte This displays the sizes and names of the
partitions on the disk
# parted /dev/hda                                                            
(parted) p                                                                   
.                                                                            
.                                                                            
.                                                                            
                                                                             

  Now resize the partition:
(parted) resize 3 145 999                                                    
                                                                             
The first number here the partition number (hda3), the second is the same
starting position that hda3 currently has. Do not change this. The last
number should make the partition around half the size it currently is.

  Create a new partition
(parted) mkpart primary ext2 1000 1999                                       
                                                                             
This makes a new partition to hold the initial LVM 1 data. It should start
just beyond the newly shrunk hda3 and finish at the end of the disk.

  Quit parted
(parted) q                                                                   
                                                                             
-----------------------------------------------------------------------------

13.8.3. Reboot

  Reboot the system
-----------------------------------------------------------------------------

13.8.4. Verify kernel config options

  Make sure that the kernel you are currently running works with LVM 1 and
has CONFIG_BLK_DEV_RAM and CONFIG_BLK_DEV_INITRD set in the config file.
-----------------------------------------------------------------------------

13.8.5. Adjust partition type

  Change the partition type on the newly created partition from Linux to LVM
(8e). Parted doesn't understand LVM 1 partitions so this has to be done using
fdisk.
# fdisk /dev/hda                                                             
Command (m for help): t                                                      
Partition number (1-4): 4                                                    
Hex code (type L to list codes): 8e                                          
Changed system type of partition 4 to 8e (Unknown)                           
Command (m for help): w                                                      
                                                                             
-----------------------------------------------------------------------------

13.8.6. Set up LVM 1 for the new scheme

  *   Initialize LVM 1 (vgscan)
    # vgscan                                                                 
                                                                             
   
  *   Make the new partition into a PV
    # pvcreate /dev/hda4                                                     
                                                                             
   
  *   create a new volume group
    # vgcreate vg /dev/hda4                                                  
                                                                             
   
  * Create a logical volume to hold the new root.
    # lvcreate -L250M -n root vg                                             
                                                                             
   

-----------------------------------------------------------------------------
13.8.7. Create the Filesystem

  Make a filesystem in the logical volume and copy the root files onto it.
# mke2fs /dev/vg/root                                                        
# mount /dev/vg/root /mnt/                                                   
# find / -xdev | cpio -pvmd /mnt                                             
                                                                             
-----------------------------------------------------------------------------

13.8.8. Update /etc/fstab

  Edit /mnt/etc/fstab on the new root so that / is mounted on /dev/vg/root.
For example:
  /dev/hda3       /    ext2       defaults 1 1                               
                                                                             
becomes:
  /dev/vg/root    /    ext2       defaults 1 1                               
                                                                             
-----------------------------------------------------------------------------

13.8.9. Create an LVM 1 initial RAM disk

# lvmcreate_initrd                                                           
                                                                             

  Make sure you note the name that lvmcreate_initrd calls the initrd image.
It should be in /boot.
-----------------------------------------------------------------------------

13.8.10. Update /etc/lilo.conf

  Add an entry in /etc/lilo.conf for LVM 1. This should look similar to the
following:
  image   = /boot/KERNEL_IMAGE_NAME                                          
  label   = lvm                                                              
  root    = /dev/vg/root                                                     
  initrd  = /boot/INITRD_IMAGE_NAME                                          
  ramdisk = 8192                                                             
                                                                             
Where KERNEL_IMAGE_NAME is the name of your LVM 1 enabled kernel, and
INITRD_IMAGE_NAME is the name of the initrd image created by
lvmcreate_initrd. The ramdisk line may need to be increased if you have a
large LVM 1 configuration, but 8192 should suffice for most users. The
default ramdisk size is 4096. If in doubt check the output from the
lvmcreate_initrd command, the line that says:
lvmcreate_initrd -- making loopback file (6189 kB)                           
                                                                             
and make the ramdisk the size given in brackets.

  You should copy this new lilo.conf onto /etc in the new root fs as well.
# cp /etc/lilo.conf /mnt/etc/                                                
                                                                             
-----------------------------------------------------------------------------

13.8.11. Run LILO to write the new boot sector

# lilo                                                                       
                                                                             
-----------------------------------------------------------------------------

13.8.12. Reboot to lvm

Reboot - at the LILO prompt type "lvm" The system should reboot into Linux
using the newly created Logical Volume.

  If that worked then you should make lvm the default LILO boot destination
by adding the line
default=lvm                                                                  
                                                                             
in the first section of /etc/lilo.conf

  If it did not work then reboot normally and try to diagnose the problem. It
could be a typing error in lilo.conf or LVM 1 not being available in the
initial RAM disk or its kernel. Examine the message produced at boot time
carefully.
-----------------------------------------------------------------------------

13.8.13. Add remainder of disk

Add the rest of the disk into LVM 1. When you are happy with this setup you
can then add the old root partition to LVM 1 and spread out over the disk.

  First set the partition type to 8e(LVM)
# fdisk /dev/hda                                                             
                                                                             
Command (m for help): t                                                      
Partition number (1-4): 3                                                    
Hex code (type L to list codes): 8e                                          
Changed system type of partition 3 to 8e (Unknown)                           
Command (m for help): w                                                      
                                                                             

  Convert it into a PV and add it to the volume group:
# pvcreate /dev/hda3                                                         
# vgextend vg /dev/hda3                                                      
                                                                             
-----------------------------------------------------------------------------

13.9. Recover physical volume metadata

  If you get the warning "incorrect metadata area header checksum" or
something about not being able to find PV with UUID foo, you probably toasted
the volume group descriptor area and lvm startup can't occur.

Warning Only run on non-functional VG                                        
        Don't do this on a properly working lvm. You need to specify the     
        correct physical volume to pvcreate or you may lose your data.       

  Extract the exact uuid for the PV that was overwritten from the file /etc/
lvm/archive/VolumeGroupName_XXXXX.vg. (Where XXXXX represents the number of
the last known good archived lvm metadata).

  Use pvcreate to restore the metadata: pvcreate --uuid "<some_long_string>"
--restorefile /etc/lvm/archive/VolumeGroupName_XXXXX.vg <PhysicalVolume>

  If you are lucky you'll find that the on-disk lvm metadata takes at least
so much space as what it was overwritten with. The above command has been
know to recover a PV overwritten with mkswap. If whatever overwrote the VGDA
writes past that area, LVs may be affected. In this case, fsck might be able
to fix the filesystem on the LV, or you may need more drastic measures to
pull data off of it. Contact your local friendly filesystem expert for help
in that case.

Note pvcreate only overwrites the lvm metadata areas on disk and doesn't     
     touch the data areas (the logical volumes).                             
-----------------------------------------------------------------------------

Appendix A. Dangerous Operations

Warning Warning                                                              
        Don't do this unless you're really sure of what you're doing. You'll 
        probably lose all your data.                                         
-----------------------------------------------------------------------------

A.1. Restoring the VG UUIDs using uuid_fixer

  If you've upgraded LVM from previous versions to early 0.9 and 0.9.1
versions of LVM and vgscan says vgscan -- no volume groups found, this is one
way to fix it.

  *   Download the UUID fixer program from the contributor directory at
    Sistina.
   
      It is located at [ftp://ftp.sistina.com/pub/LVM/contrib/
    uuid_fixer-0.3-IOP10.tar.gz] ftp://ftp.sistina.com/pub/LVM/contrib/
    uuid_fixer-0.3-IOP10.tar.gz"
   
  *   Extract uuid_fixer-0.3-IOP10.tar.gz
    # tar zxf uuid_fixer-0.3-IOP10.tar.gz                                    
                                                                             
   
  *   cd to uuid_fixer
    # cd uuid_fixer                                                          
                                                                             
   
      You have one of two options at this point:
   
     1.   Use the prebuild binary (it is build for i386 architecture).
       
          Make sure you list all the PVs in the VG you are restoring, and
        follow the prompts
        # ./uuid_fixer <LIST OF ALL PVS IN VG TO BE RESTORED>                
                                                                             
       
     2.   Build the uuid_builder program from source
       
          Edit the Makefile with your favorite editor, and make sure LVMDIR
        points to your LVM source.
       
          Then run make.
        # make                                                               
                                                                             
       
          Now run uuid_fixer. Make sure you list all the PVs in the VG you
        are restoring, and follow the prompts.
        # ./uuid_fixer <LIST OF ALL PVS IN VG TO BE RESTORED>                
                                                                             
       
   
  *   Deactivate any active Volume Groups (optional)
    # vgchange -an                                                           
                                                                             
   
  *   Run vgscan
    # vgscan                                                                 
                                                                             
   
  *   Reactivate Volume Groups
    # vgchange -ay                                                           
                                                                             
   

-----------------------------------------------------------------------------
A.2. Sharing LVM volumes

Warning LVM is not cluster aware                                             
        Be very careful doing this, LVM is not currently cluster-aware and it
        is very easy to lose all your data.                                  

If you have a fibre-channel or shared-SCSI environment where more than one
machine has physical access to a set of disks then you can use LVM to divide
these disks up into logical volumes. If you want to share data you should
really be looking at [http://www.sistina.com/gfs] GFS or other cluster
filesystems.

  The key thing to remember when sharing volumes is that all the LVM
administration must be done on one node only and that all other nodes must
have LVM shut down before changing anything on the admin node. Then, when the
changes have been made, it is necessary to run vgscan on the other nodes
before reloading the volume groups. Also, unless you are running a
cluster-aware filesystem (such as GFS) or application on the volume, only one
node can mount each filesystem. It is up to you, as system administrator to
enforce this, LVM will not stop you corrupting your data.

  The startup sequence of each node is the same as for a single-node setup
with
vgscan                                                                       
vgchange -ay                                                                 
                                                                             
in the startup scripts.

  If you need to do any changes to the LVM metadata (regardless of whether it
affects volumes mounted on other nodes) you must go through the following
sequence. In the steps below ``admin node'' is any arbitrarily chosen node in
the cluster.
Admin node                   Other nodes                                     
----------                   -----------                                     
                             Close all Logical volumes (umount)              
                             vgchange -an                                    
<make changes, eg lvextend>                                                  
                             vgscan                                          
                             vgchange -ay                                    
                                                                             

Note VGs should be active on the admin node                                  
     You do not need to, nor should you, unload the VGs on the admin node, so
     this can be the node with the highest uptime requirement.               

  I'll say it again: Be very careful doing this
-----------------------------------------------------------------------------

Appendix B. Reporting Errors and Bugs

  Just telling us that LVM did not work does not provide us with enough
information to help you. We need to know about your setup and the various
components of your configuration. The first thing you should do is check the
[http://lists.sistina.com/pipermail/linux-lvm/] linux-lvm mailing list
archives to see if someone else has already reported the same bug. If you do
not find a bug report for a problem similar to yours you should collect as
much of the following information as possible. The list is grouped into three
categories of errors.

  *   For compilation errors:
   
     1.   Detail the specific version of LVM you have. If you extracted LVM
        from a tarball give the name of the tar file and list any patches you
        applied. If you acquired LVM from the Public CVS server, give the
        date and time you checked it out.
       
     2.   Provide the exact error message. Copy the lines of output before
        the actual error message as well as the lines after. These lines
        occasionally give hints as to why the error occurred.
       
     3.   List the steps, in order, that produced the error. Is the error
        reproducible? If you start from a clean state does the same sequence
        of steps reproduce the error?
       
   
  *   For LVM errors:
   
     1.   Include all of the information requested in the compilation
        section.
       
     2.   Attach a short description of your hardware: types of machines and
        disks, disks interface (SCSI, FC, NBD). Any other tidbits about your
        hardware you feel is important.
       
     3.   The command lines used with LVM to produce the error.
       
     4.   A log file produced when running the offending commands. Make sure
        you have the following in your /etc/lvm/lvm.conf file:
        log {                                                                
                file="/tmp/lvm2.log"                                         
                level=7                                                      
                activation=1                                                 
        }                                                                    
                                                                             
       
   
  *   When LVM trips a panic trap:
   
     1.   Include all of the information requested in two sections above.
       
     2.   Provide the debug dump for the machine. This is best accomplished
        if you are watching the console output of the computer over a serial
        link, since you can't very well copy and paste from a panic'd
        machine, and it is very easy to mistype something if you try to copy
        the output by hand.
       
   

  This can be a lot of information. If you end up with more than a couple of
files, tar and gzip them into a single archive. Submit a link to where this
file can be found to the appropriate mailing list (see Section C.1) along
with a short description of the error. If you do not have a public web or ftp
site that you can post the information to, you can try to submit the file to
the list.
-----------------------------------------------------------------------------

Appendix C. Contact and Links

C.1. Mail lists

  Before you post to any of our lists please read the all of this document
and check the archives to see if your question has already been answered.
Please post in text only to our lists, fancy formated messages are near
impossible to read if someone else is not running a mail client that
understands it. Standard mailing list etiquette applies. Incomplete questions
or configuration data make it very hard for us to answer your questions.

LVM Discussion Mailing Lists

linux-lvm
      This list is aimed at user-related questions and comments. You may be
    able to get the answers you need from other people who have the same
    issues. Open discussion is encouraged. Bug reports should be sent to this
    list.
   
      Subscribe using the web interface.
   
      Look at the [http://www.redhat.com/archives/linux-lvm/]   archives
   
dm-devel
      This list is not specifically for lvm, but since device mapper is used
    by LVM 2, it is mentioned here.
   
      Subscribe using the web interface.
   
      Look at the [http://www.redhat.com/archives/dm-devel/]   archives
   

LVM-Related Commit Lists

lvm2-commit
      This list gets messages automatically whenever someone commits to the
    lvm2 cvs tree. Its main purpose is to keep up with the cvs tree.
   
      Look at the [http://sources.redhat.com/ml/lvm2-cvs/]   archives
   
lvm-commit
      This list gets messages automatically whenever someone commits to the
    lvm cvs tree. Its main purpose is to keep up with the cvs tree.
   
      Look at the [http://sources.redhat.com/ml/lvm-cvs/]   archives
   
dm-commit
      This list gets messages automatically whenever someone commits to the
    dm cvs tree. Its main purpose is to keep up with the cvs tree.
   
      Look at the [http://sources.redhat.com/ml/dm-cvs/]   archives
   

Discontinued Lists

lvm-devel
      This list has been discontinued; please use linux-lvm for lvm
    development discussion.
   
lvm-bugs
      This list has been discontinued; Bug reports should be sent to the
    linux-lvm list.
   

-----------------------------------------------------------------------------
C.2. Links

  LVM Links:

  *   The Logical Volume Manager home page.
   
  *   The LVM 1 home page.
   
  *   The Device Mapper home page.
   
  * The LVM 2 ftp site.
   
  *   The LVM 1 ftp site.
   
  *   The Device Mapper ftp site.
   

-----------------------------------------------------------------------------
Appendix D. GNU Free Documentation License

Version 1.2, November 2002

   
    Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 59 Temple
    Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy
    and distribute verbatim copies of this license document, but changing it
    is not allowed.
   
-----------------------------------------------------------------------------
D.1. PREAMBLE

The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to assure
everyone the effective freedom to copy and redistribute it, with or without
modifying it, either commercially or noncommercially. Secondarily, this
License preserves for the author and publisher a way to get credit for their
work, while not being considered responsible for modifications made by
others.

This License is a kind of "copyleft", which means that derivative works of
the document must themselves be free in the same sense. It complements the
GNU General Public License, which is a copyleft license designed for free
software.

We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free program
should come with manuals providing the same freedoms that the software does.
But this License is not limited to software manuals; it can be used for any
textual work, regardless of subject matter or whether it is published as a
printed book. We recommend this License principally for works whose purpose
is instruction or reference.
-----------------------------------------------------------------------------

D.2. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be distributed
under the terms of this License. Such a notice grants a world-wide,
royalty-free license, unlimited in duration, to use that work under the
conditions stated herein. The "Document", below, refers to any such manual or
work. Any member of the public is a licensee, and is addressed as "you". You
accept the license if you copy, modify or distribute the work in a way
requiring permission under copyright law.

A "Modified Version" of the Document means any work containing the Document
or a portion of it, either copied verbatim, or with modifications and/or
translated into another language.

A "Secondary Section" is a named appendix or a front-matter section of the
Document that deals exclusively with the relationship of the publishers or
authors of the Document to the Document's overall subject (or to related
matters) and contains nothing that could fall directly within that overall
subject. (Thus, if the Document is in part a textbook of mathematics, a
Secondary Section may not explain any mathematics.) The relationship could be
a matter of historical connection with the subject or with related matters,
or of legal, commercial, philosophical, ethical or political position
regarding them.

The "Invariant Sections" are certain Secondary Sections whose titles are
designated, as being those of Invariant Sections, in the notice that says
that the Document is released under this License. If a section does not fit
the above definition of Secondary then it is not allowed to be designated as
Invariant. The Document may contain zero Invariant Sections. If the Document
does not identify any Invariant Sections then there are none.

The "Cover Texts" are certain short passages of text that are listed, as
Front-Cover Texts or Back-Cover Texts, in the notice that says that the
Document is released under this License. A Front-Cover Text may be at most 5
words, and a Back-Cover Text may be at most 25 words.

A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the general
public, that is suitable for revising the document straightforwardly with
generic text editors or (for images composed of pixels) generic paint
programs or (for drawings) some widely available drawing editor, and that is
suitable for input to text formatters or for automatic translation to a
variety of formats suitable for input to text formatters. A copy made in an
otherwise Transparent file format whose markup, or absence of markup, has
been arranged to thwart or discourage subsequent modification by readers is
not Transparent. An image format is not Transparent if used for any
substantial amount of text. A copy that is not "Transparent" is called
"Opaque".

Examples of suitable formats for Transparent copies include plain ASCII
without markup, Texinfo input format, LaTeX input format, SGML or XML using a
publicly available DTD, and standard-conforming simple HTML, PostScript or
PDF designed for human modification. Examples of transparent image formats
include PNG, XCF and JPG. Opaque formats include proprietary formats that can
be read and edited only by proprietary word processors, SGML or XML for which
the DTD and/or processing tools are not generally available, and the
machine-generated HTML, PostScript or PDF produced by some word processors
for output purposes only.

The "Title Page" means, for a printed book, the title page itself, plus such
following pages as are needed to hold, legibly, the material this License
requires to appear in the title page. For works in formats which do not have
any title page as such, "Title Page" means the text near the most prominent
appearance of the work's title, preceding the beginning of the body of the
text.

A section "Entitled XYZ" means a named subunit of the Document whose title
either is precisely XYZ or contains XYZ in parentheses following text that
translates XYZ in another language. (Here XYZ stands for a specific section
name mentioned below, such as "Acknowledgements", "Dedications",
"Endorsements", or "History".) To "Preserve the Title" of such a section when
you modify the Document means that it remains a section "Entitled XYZ"
according to this definition.

The Document may include Warranty Disclaimers next to the notice which states
that this License applies to the Document. These Warranty Disclaimers are
considered to be included by reference in this License, but only as regards
disclaiming warranties: any other implication that these Warranty Disclaimers
may have is void and has no effect on the meaning of this License.
-----------------------------------------------------------------------------

D.3. VERBATIM COPYING

You may copy and distribute the Document in any medium, either commercially
or noncommercially, provided that this License, the copyright notices, and
the license notice saying this License applies to the Document are reproduced
in all copies, and that you add no other conditions whatsoever to those of
this License. You may not use technical measures to obstruct or control the
reading or further copying of the copies you make or distribute. However, you
may accept compensation in exchange for copies. If you distribute a large
enough number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and you may
publicly display copies.
-----------------------------------------------------------------------------

D.4. COPYING IN QUANTITY

If you publish printed copies (or copies in media that commonly have printed
covers) of the Document, numbering more than 100, and the Document's license
notice requires Cover Texts, you must enclose the copies in covers that
carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the
front cover, and Back-Cover Texts on the back cover. Both covers must also
clearly and legibly identify you as the publisher of these copies. The front
cover must present the full title with all words of the title equally
prominent and visible. You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve the
title of the Document and satisfy these conditions, can be treated as
verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit legibly, you
should put the first ones listed (as many as fit reasonably) on the actual
cover, and continue the rest onto adjacent pages.

If you publish or distribute Opaque copies of the Document numbering more
than 100, you must either include a machine-readable Transparent copy along
with each Opaque copy, or state in or with each Opaque copy a
computer-network location from which the general network-using public has
access to download using public-standard network protocols a complete
Transparent copy of the Document, free of added material. If you use the
latter option, you must take reasonably prudent steps, when you begin
distribution of Opaque copies in quantity, to ensure that this Transparent
copy will remain thus accessible at the stated location until at least one
year after the last time you distribute an Opaque copy (directly or through
your agents or retailers) of that edition to the public.

It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give them
a chance to provide you with an updated version of the Document.
-----------------------------------------------------------------------------

D.5. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under the
conditions of sections 2 and 3 above, provided that you release the Modified
Version under precisely this License, with the Modified Version filling the
role of the Document, thus licensing distribution and modification of the
Modified Version to whoever possesses a copy of it. In addition, you must do
these things in the Modified Version:

 A. Use in the Title Page (and on the covers, if any) a title distinct from
    that of the Document, and from those of previous versions (which should,
    if there were any, be listed in the History section of the Document). You
    may use the same title as a previous version if the original publisher of
    that version gives permission.
   
 B. List on the Title Page, as authors, one or more persons or entities
    responsible for authorship of the modifications in the Modified Version,
    together with at least five of the principal authors of the Document (all
    of its principal authors, if it has fewer than five), unless they release
    you from this requirement.
   
 C. State on the Title page the name of the publisher of the Modified
    Version, as the publisher.
   
 D. Preserve all the copyright notices of the Document.
   
 E. Add an appropriate copyright notice for your modifications adjacent to
    the other copyright notices.
   
 F. Include, immediately after the copyright notices, a license notice giving
    the public permission to use the Modified Version under the terms of this
    License, in the form shown in the Addendum below.
   
 G. Preserve in that license notice the full lists of Invariant Sections and
    required Cover Texts given in the Document's license notice.
   
 H. Include an unaltered copy of this License.
   
 I. Preserve the section Entitled "History", Preserve its Title, and add to
    it an item stating at least the title, year, new authors, and publisher
    of the Modified Version as given on the Title Page. If there is no
    section Entitled "History" in the Document, create one stating the title,
    year, authors, and publisher of the Document as given on its Title Page,
    then add an item describing the Modified Version as stated in the
    previous sentence.
   
 J. Preserve the network location, if any, given in the Document for public
    access to a Transparent copy of the Document, and likewise the network
    locations given in the Document for previous versions it was based on.
    These may be placed in the "History" section. You may omit a network
    location for a work that was published at least four years before the
    Document itself, or if the original publisher of the version it refers to
    gives permission.
   
 K. For any section Entitled "Acknowledgements" or "Dedications", Preserve
    the Title of the section, and preserve in the section all the substance
    and tone of each of the contributor acknowledgements and/or dedications
    given therein.
   
 L. Preserve all the Invariant Sections of the Document, unaltered in their
    text and in their titles. Section numbers or the equivalent are not
    considered part of the section titles.
   
 M. Delete any section Entitled "Endorsements". Such a section may not be
    included in the Modified Version.
   
 N. Do not retitle any existing section to be Entitled "Endorsements" or to
    conflict in title with any Invariant Section.
   
 O. Preserve any Warranty Disclaimers.
   

If the Modified Version includes new front-matter sections or appendices that
qualify as Secondary Sections and contain no material copied from the
Document, you may at your option designate some or all of these sections as
invariant. To do this, add their titles to the list of Invariant Sections in
the Modified Version's license notice. These titles must be distinct from any
other section titles.

You may add a section Entitled "Endorsements", provided it contains nothing
but endorsements of your Modified Version by various parties--for example,
statements of peer review or that the text has been approved by an
organization as the authoritative definition of a standard.

You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list of
Cover Texts in the Modified Version. Only one passage of Front-Cover Text and
one of Back-Cover Text may be added by (or through arrangements made by) any
one entity. If the Document already includes a cover text for the same cover,
previously added by you or by arrangement made by the same entity you are
acting on behalf of, you may not add another; but you may replace the old
one, on explicit permission from the previous publisher that added the old
one.

The author(s) and publisher(s) of the Document do not by this License give
permission to use their names for publicity for or to assert or imply
endorsement of any Modified Version.
-----------------------------------------------------------------------------

D.6. COMBINING DOCUMENTS

You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified versions,
provided that you include in the combination all of the Invariant Sections of
all of the original documents, unmodified, and list them all as Invariant
Sections of your combined work in its license notice, and that you preserve
all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and multiple
identical Invariant Sections may be replaced with a single copy. If there are
multiple Invariant Sections with the same name but different contents, make
the title of each such section unique by adding at the end of it, in
parentheses, the name of the original author or publisher of that section if
known, or else a unique number. Make the same adjustment to the section
titles in the list of Invariant Sections in the license notice of the
combined work.

In the combination, you must combine any sections Entitled "History" in the
various original documents, forming one section Entitled "History"; likewise
combine any sections Entitled "Acknowledgements", and any sections Entitled
"Dedications". You must delete all sections Entitled "Endorsements".
-----------------------------------------------------------------------------

D.7. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in the
collection, provided that you follow the rules of this License for verbatim
copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute it
individually under this License, provided you insert a copy of this License
into the extracted document, and follow this License in all other respects
regarding verbatim copying of that document.
-----------------------------------------------------------------------------

D.8. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate and
independent documents or works, in or on a volume of a storage or
distribution medium, is called an "aggregate" if the copyright resulting from
the compilation is not used to limit the legal rights of the compilation's
users beyond what the individual works permit. When the Document is included
in an aggregate, this License does not apply to the other works in the
aggregate which are not themselves derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these copies of
the Document, then if the Document is less than one half of the entire
aggregate, the Document's Cover Texts may be placed on covers that bracket
the Document within the aggregate, or the electronic equivalent of covers if
the Document is in electronic form. Otherwise they must appear on printed
covers that bracket the whole aggregate.
-----------------------------------------------------------------------------

D.9. TRANSLATION

Translation is considered a kind of modification, so you may distribute
translations of the Document under the terms of section 4. Replacing
Invariant Sections with translations requires special permission from their
copyright holders, but you may include translations of some or all Invariant
Sections in addition to the original versions of these Invariant Sections.
You may include a translation of this License, and all the license notices in
the Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions of
those notices and disclaimers. In case of a disagreement between the
translation and the original version of this License or a notice or
disclaimer, the original version will prevail.

If a section in the Document is Entitled "Acknowledgements", "Dedications",
or "History", the requirement (section 4) to Preserve its Title (section 1)
will typically require changing the actual title.
-----------------------------------------------------------------------------

D.10. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except as
expressly provided for under this License. Any other attempt to copy, modify,
sublicense or distribute the Document is void, and will automatically
terminate your rights under this License. However, parties who have received
copies, or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
-----------------------------------------------------------------------------

D.11. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions of the GNU
Free Documentation License from time to time. Such new versions will be
similar in spirit to the present version, but may differ in detail to address
new problems or concerns. See http://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number. If the
Document specifies that a particular numbered version of this License "or any
later version" applies to it, you have the option of following the terms and
conditions either of that specified version or of any later version that has
been published (not as a draft) by the Free Software Foundation. If the
Document does not specify a version number of this License, you may choose
any version ever published (not as a draft) by the Free Software Foundation.
-----------------------------------------------------------------------------

D.12. ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of the
License in the document and put the following copyright and license notices
just after the title page:

   
    Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute
    and/or modify this document under the terms of the GNU Free Documentation
    License, Version 1.2 or any later version published by the Free Software
    Foundation; with no Invariant Sections, no Front-Cover Texts, and no
    Back-Cover Texts. A copy of the license is included in the section
    entitled "GNU Free Documentation License".
   
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the "with...Texts." line with this:

   
    with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover
    Texts being LIST, and with the Back-Cover Texts being LIST.
   
If you have Invariant Sections without Cover Texts, or some other combination
of the three, merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend
releasing these examples in parallel under your choice of free software
license, such as the GNU General Public License, to permit their use in free
software.
