Setup-storage: Difference between revisions

From FAIWiki
Jump to navigation Jump to search
Line 240: Line 240:
disk_config lvm
disk_config lvm
vg  my_pv  md2,md3   
vg  my_pv  md2,md3   
my_pv-_usr /usr 2048        reiser rw,notail -O dir_index,resize_inode
my_pv-_usr /usr 2048        ext3 rw -O dir_index,resize_inode
my_pv-_var /var 600        reiser rw,notail -O dir_index,resize_inode
my_pv-_var /var 600        ext3 rw -O dir_index,resize_inode
my_pv-_e_h /export/home 10240      reiser          rw,notail
my_pv-_e_h /export/home 10240      reiser          rw,notail
my_pv-_e_s /export/sites 2048        reiser          rw,notail
my_pv-_e_s /export/sites 2048        reiser          rw,notail

Revision as of 20:06, 9 October 2007

Introduction

As setup_harddisks is not portable due to its dependency on sfdisk and the lack of support for RAID and LVM, it has been re-implemented from scratch. However, it is not yet integrated with FAI and deserves rigorous testing. Meanwhile you might also want to look at

To test my current implementation, keep reading this one. There are some TODOs left and probably a lot more will arise as soon as people actually start testing it. Before you start, just let me clarify that this is a very dangerous piece of software that has not been sufficiently tested for any cases where you want to retain any of your data. It will definitely destroy any data on any of your disks in your system. You have been warned.

If you're still interested, the following steps are required next:

  • install libparse-recdescent-perl, parted, lvm2 within your NFSROOT
  • grab setup_harddisks_2 from the SVN: [1] (get all the shdd2* files)
  • For a first shot copy the files somewhere into your NFSROOT
  • create a disk_config for <CLASS> from the old one apart from (at least) the following changes:
    • the filesystem is now given as the 4th column, the mount options are now in column 5
    • there is no ;-hack anymore -- anything given after the mount options is passed on to mkfs.<filesystem>
    • Partitions are marked as bootable using the bootable:<nr> option in the disk_config line
    • The other things should at least work like they did before, but there are some new things as well, like RAID support (which is surely incomplete), LVM support, mounting by label or UUID. Please take a look at the attached examples to get an idea of the new format.

All details of the implemented syntax and examples are given below.

  • create a hook partition.<CLASS>.source as follows (make sure you don't forget the .source)
#!/bin/sh

# load the device mapper module for LVM support
modprobe dm_mod

cd <somewhere>
debug=1 ./shdd2
# if you really brave, you can get things written to disk as well
debug=1 ./shdd2 -X
# now define variable for root and boot partition and boot device
# this is necessary because we skip the original task
. $LOGDIR/disk_var.sh
# skip the original parititioning
skiptask partition

  • Give it a go and hope... There will be lots of debug output; if it finishes with the printout of an fstab file that is to your liking, it should have succeeded.

Proposal for a new configuration file syntax

In the following, we present a complete EBNF description of a modified configuration file syntax, as well as some examples.


file ::= <lines> EOF 

lines ::= EOL 
          /* empty lines or whitespace only */
          | <comment> EOL 
          | <config> EOL 

comment ::= #.* 

config ::= disk_config lvm 
           | disk_config raid
           | disk_config end 
           | disk_config disk[[:digit:]]+( <option>)*
           | disk_config [^[:space:]]+( <option>)*
           /* fully qualified device-path or short form, like hda, whereby full
            * path is assumed to be /dev/hda */
           | <volume>

option ::= /* empty */
           | preserve:[[:digit:]]+(,[[:digit:]]+)*
           /* preserve partitions */
           | disklabel:(msdos|sun)
           /* write a disklabel - default is msdos */
           | bootable:[[:digit:]]
           /* mark a partition bootable, default is / */
           | virtual
           /* do not assume the disk to be a physical device, use with xen */

volume ::= <type> <mountpoint> <size> <filesystem> <mount_options> <fs_options>
           | vg <name> <size>
           /* lvm vg */

type ::= primary
         /* for physical disks only */
         | logical
         /* for physical disks only */
         | raid[015]
         /* raid level */
         | [^/[:space:]]+-[^/[:space:]]+
         /* lvm logical volume: vg name and lv name*/

mountpoint ::= -
               /* do not mount */
               | swap
               /* swap space */
               | /[^[:space:]]*
               /* fully qualified path */

name ::= [^/[:space:]]+
         /* lvm volume group name */

size ::= [[:digit:]]+%?(-[[:digit:]]+%?)?(:resize)?
         /* size in megabytes or %, possibly given as a range; physical
          * partitions or lvm logical volumes only */
         | -[[:digit:]]+%?(:resize)?
         /* size in megabytes or % given as upper limit; physical partitions 
          * or lvm logical volumes only */
         | preserve[[:digit:]]+
         /* do not modify this partition */
         | [^,:[:space:]]+(:(spare|missing))*(,[^,:[:space:]]+(:(spare|missing))*)*
         /* devices and options for a raid or lvm vg */

mount_options ::= [^[:space:]]+

filesystem ::= -
               | swap
               | [^[:space:]]
               /* mkfs.xxx must exist */

fs_options ::= .*
               /* options appended to mkfs.xxx call */

The major differences to the prior format:

  • the disk_config ... line allows for the keywords lvm and raid
  • options may be appended to the disk_config line as well, but this may be subject to change
  • the ";" is not used anymore, the options that were given there have now been split up
    • the filesystem is now an explicit parameter; note, that the order of filesystem/mount-options is the same /etc/fstab, as opposed to the previous format of disk_config
    • any options to mkfs.xxx may be given
    • the "boot"-option is one of the options now given on the disk_config line
  • support for LVM and RAID is completely new :-)
  • resizing partitions is supported

Some examples


# Configure the device /dev/hda
disk_config hda   preserve:6,7   disklabel:msdos  bootable:3
# preserve the 6th and the 7th partition. Alternatively, 
# one could say preserve7 below. The disklabel is msdos, which is the default
# for x86. Furthermore the 3rd partition is made bootable, which would have
# happened as well by default as it is mounted as /
primary /boot     20-100        ext3            rw
# create a primary partition /dev/hda1 with a size between 20 and 100 MB and mount it
# read-write as /boot; it is formatted using ext3 filesystem
primary swap      1000     swap       sw
# /dev/hda2 will be a swap space of 1000 MB
primary /         12000      ext3           rw        -b 2048
# /dev/hda3 should be formatted using ext3 filesystem; when calling mkfs.ext3
# the option "-b 2048" is appended.
logical /tmp      1000      ext3            rw,nosuid
# create the logical partition /dev/hda5
logical /usr      preserve6      ext3          rw
logical /var      10%-      ext3               rw
# make /dev/hda7 at least 10% of the disk size
logical /nobackup 0-        xfs                rw
# use mkfs.xfs to format the partition


# Configure the virtual device /dev/sda (for, e.g., Xen setups), all
# partitions are primary and sizes are ignored (so one could as well specify
# anything other than 0)
disk_config sda virtual
primary /boot     0            ext3                 rw
primary /         0            ext3                 rw
primary /tmp      0            ext3                 rw
primary /usr      0            ext3                 rw
primary /var      0            ext3                 rw

# resizing partitions is possible by appending :resize to any given size
disk_config /dev/scsi/host0/bus0/target1/lun0 
primary /      3000-6000:resize         ext3         rw
# resize to any value between 3000 and 6000 MB, as limited by the disk size,
# the desired sizes of the other partitions, and the data on the partition
primary /tmp   1000                     ext3         rw


# Create a softRAID
disk_config raid
raid1        /    sda1,sdd1  ext2        rw,errors=remount-ro
# create a RAID-1 on /dev/sda1 and /dev/sdd1, format using mkfs.ext2 and mount
# it as /
raid0        -    disk2.2,sdc1,sde1:spare:missing  ext2       default
# create a RAID-0 on the second partition of the second disk, /dev/sdc1, and
# /dev/sde1 as a spare partition, which (may?) me missing


A pretty complex setup looks as follows:

disk_config sda

primary  -    256         -    -  
primary  swap 1024        swap       sw
primary  -		0-				 -    -

disk_config sdb
primary  -		0-				 - -

disk_config sdc
primary  -		0-				 - -

disk_config sdd
primary  -             	256         - -
primary  -          	1024        -                   -
primary  -		0-				 - -

disk_config sde
primary  -		0-				 - -

disk_config sdf
primary  -		0-				 - -

disk_config raid

raid1        /    sda1,sdd1  ext2    rw,errors=remount-ro   
raid1        swap sda2,sdd2  swap    rw                     
raid1        -    sda3,sdd3  ext2    default                

raid0        -    sdb1,sde1  ext2    default
raid0        -    sdc1,sdf1  ext2    default

# config the LVM
disk_config lvm
vg  my_pv   md2,md3   
my_pv-_usr	/usr			2048        ext3  rw -O dir_index,resize_inode
my_pv-_var	/var			600         ext3  rw -O dir_index,resize_inode
my_pv-_e_h	/export/home		10240       reiser          rw,notail
my_pv-_e_s	/export/sites		2048        reiser          rw,notail
my_pv-_v	/vservers		2048        ext3    rw 

Implementation

The current implementation is found at [2] and has still some TODOs left:

  • Missing features
    • some auto mode (something like auto:server, auto:desktop?) might be desirable
    • no man page
    • crypto support would be nice to have; we could implement it by an additional (optional) argument to the mount point specification. A nice tutorial on crypt setups is found at [3]
  • Implementation details
    • resize should imply resizing the filesystem as well (unless this is done by parted already, needs to be checked)
    • LVMs definitely require resizing the filesystem
    • more error messages must be caught by shdd2-exec
    • how to detect old-style config files? migration strategies?
    • implement disklabels other than msdos and gpt
    • the RAID commands are surely incomplete and lack any management of unanticipated situations
    • try to get libparted-swig-perl and use that one instead of the manual parsing
    • (maybe done) setup_harddisks_2 writes the UUIDs or labels to fstab, but grub's menu.lst must be adapted as well
  • Ideas that came up on IRC
    • it should be possible to preserve logical volumes, etc. using preserve instead of giving a size
    • (done) volume groups and RAID configs should refer to disk1.2 etc.