[Fai-commit] r3576 - trunk/bin

fai-commit at lists.alioth.debian.org fai-commit at lists.alioth.debian.org
Thu Jul 20 16:31:40 UTC 2006


Author: lange
Date: 2006-07-20 16:31:39 +0000 (Thu, 20 Jul 2006)
New Revision: 3576

Modified:
   trunk/bin/setup_harddisks
Log:
revert Sam's commit r3539


Modified: trunk/bin/setup_harddisks
===================================================================
--- trunk/bin/setup_harddisks	2006-07-20 13:06:00 UTC (rev 3575)
+++ trunk/bin/setup_harddisks	2006-07-20 16:31:39 UTC (rev 3576)
@@ -1,576 +1,327 @@
-#!/usr/bin/perl -w
+#!/usr/bin/perl
 
+# $Id$
+#*********************************************************************
+#
+# setup_harddisks -- create partitions and filesystems on harddisk
+#
+# This script is part of FAI (Fully Automatic Installation)
+# Copyright (c) 1999, 2000 by ScALE Workgroup, Universitaet zu Koeln
+# Copyright (c) 2000-2006 by Thomas Lange, Uni Koeln
+#
+#*********************************************************************
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+# MA 02111-1307, USA.
+#*********************************************************************
+#
+# This program first read the configfiles, partitions and formats the harddisks,
+# produces fstab and FAI-variables-file.  It uses sfdisk, mke2fs, mkswap
+#
+# Parameters:
+# [-X]                     no test, your harddisks will be formated
+#                          default: only test, no real formating
+# [-f<config-filename>]    default: parse classes
+# [-c<class-path>]         default: $FAI/disk_config/
+# [-d]                     default: no DOS alignment
+#
+#---------------------------------------------------
+# Last changes:  see svn log
+# Last changes:  31.3.2005 by Thomas Lange add sub mapdisk{}
+# Last changes:  8.11.2004 by Thomas Lange add $devdisklist when calling sfdisk
+# Last changes:   3.2.2004 by Thomas Lange typos
+# Last changes: 14.07.2003 by Thomas Lange add xfs filesystem support
+# Last changes: 23.01.2003 by Thomas Lange print info data to stdout
+# Last changes: 03.12.2002 by Thomas Lange remove ida, cciss stuff. Just match everything
+# Last changes: 27.11.2002 by Thomas Lange allow more that 3 primary partitions
+# Last changes: 14.05.2002 by Thomas Lange use strict
+# Last changes: 04.05.2002 by Thomas Lange use strict
+# Last changes: 29.04.2002 by Thomas Lange add swaplist
+# Last changes: 12.01.2002 by Thomas Lange
+# /dev/ida/ patch 12.01.2002 by Marc Martinez <lastxit+fai at technogeeks.org>
+# Last changes: 9.11.2001 by Thomas Lange
+# reiserfs patch 8.11.2001 by Diane Trout <diane at caltech.edu>
+# Last changes: 25.10.2001 by Thomas Lange
+# Last changes: 09.07.2001 by Thomas Lange
+# Last changes: 04.07.2001 by Thomas Lange
+# Last changes: 06.05.2001 by Thomas Lange
+# Last changes: 09.03.2001 by Thomas Lange
+# Last changes: 05.12.2000 by Thomas Lange
+# Last changes: 03.05.2000 by Thomas Lange
+# Last changes: 03.04.2000 by Mattias Gaertner
+#---------------------------------------------------
+#
+# config-file format:
+#   lines beginning with # are comments
+#
+# "disk_config <device>|<diskN>|end"
+#   The disk_config command starts the parsing.
+#   It has to be the first command.
+#    <device> is the harddisk to format in short form like "hda" or "sdc".
+#    <diskN>  if first is used, the N-th disk of $disklist is used
+#    "end"    = end parsing here
+#   Example: "disk_config hdb"
+#   Example: "disk_config disk3"
+#
+# Defining one partition:
+# "primary|logical mountpoint|swap|- <size in mb>|preserve<No> [fstab-options][;extraordinary options]"
+#    "primary|logical":
+#      "primary": this are the bootable partitions like the
+#         root directory "/" or the DOS "C:" disk.
+#      "logical": this are all other partitions like a linux
+#         "/var" or a swap partition or a DOS disk.
+#
+#    "mountpoint|swap|-":
+#      "mountpoint": 
+#         This is the mount-point for fstab.
+#         For example "/","/var","/usr". There must not
+#         be a space in the mountpoint.
+#      "swap":
+#         swap-partitions
+#      "-":
+#         do not mount this partition.
+#
+#    "<size in mb>|preserve<No>":
+#      "<size in mb>":
+#        The size of the partition in megabyte
+#         Examples:
+#          "30"     = 30 mb
+#          "10-100" = 10 to 100 mb
+#          "20-"    = minimum of 20 mb
+#          "-500"   = 1 to 500 mb
+#          The megabytes will be rounded up to cylinders.
+#      "preserve<No>":
+#         This is the alternative for the size attribute.
+#         <No> is the partition number. For example
+#         preserve3 for the third partition. If the
+#         <device> was hda then this results in hda3.
+#         The partition will be left unchanged. This
+#         is useful if you have partitions that do not
+#         need re-installation or if you want to have
+#         other operation systems on the device together
+#         with Linux. Extended Partitions can not be preserved.
+#         The bootable flag will not be preserved.
+#         Preserved partitions are mounted readonly during
+#         installation.
+#
+#    "fstab-options":
+#         These options are copied to the fstab-file. The
+#         default is "default"
+#
+#   After the semicolon there could be extra options like:
+#     -i <bytes>   : Bytes per inodes
+#                    (only ext2/3 filesystem)
+#     -m <blocks>% : reserved blocks percentage for superuser
+#                    (only ext2/3 filesystem)
+#     -j	   : format in ext3
+#     -c           : check for bad blocks
+#     format       : Always format this partition even if preserve
+#     lazyformat   : Do not format if partition has not moved
+#                    (useful for testing the installation)
+#     boot         : make this partition the boot-partition (the
+#                    linux root filesystem is the default)
+#     ext2         : Extended 2 filesystem (this is the default)
+#     swap         : swap partition
+#     dosfat16     : DOS 16bit FAT file system
+#     winfat32     : Win95 FAT32 file system
+#     writable     : mounts a preserved partition writable
+#     xfs          : xfs
+#     reiser       : reiserfs
+#       -h <hash>  : set reiserfs hash
+#       -v <ver>   : set reiserfs version
+#
 use strict;
-
-=head1 NAME
-
-setup_harddisks - create partitions and filesystems on local disks
-
-=head1 SYNOPSIS
-
- setup_harddisks [ options ]
-
-=head1 DESCRIPTION
-
-This program sets up local hard disks during the FAI installation process.
-
-The basic operation of the program is as follows:
-
-=over
-
-=item 1. B<Scan system>
-
-L<sfdisk(8)> is used to query the disks in the system.  Internal lists
-are built of the discovered disks for later use.  Note that there is
-no real indication about which disks are on which controllers without
-devfs.
-
-=item 2. B<Parse the config files>
-
-The config file format is detailed below in L<CONFIGURATION FILE
-FORMAT>.
-
-=item 3. B<Calculate Partition Tables>
-
-Based on the configuration file and discovered disks.
-
-=item 4. B<Write Partition Tables>
-
-L<sfdisk(8)> is used again to write tables to each disk.
-
-=item 5. B<Format Filesystems>
-
-Using any or all of:
-
-=over
-
-=item L<mke2fs(8)>, L<mkreiserfs(8)>
-
-To create filesystems on partitions
-
-=item L<mkswap(8)>
-
-To setup swap space for Linux
-
-=item L<pvcreate(8)>, L<vgcreate(8)>
-
-To set up LVM managed areas
-
-=item L<mkraid(8)>
-
-To set up Linux md-utils managed spaces.
-
-=back
-
-=item 6. B<Prepare F</etc/fstab>>
-
-The B<f>ile B<s>ystem B<tab>le is written out to F</tmp/fai> for the
-installation process to read.
-
-=item 7. B<Write out FAI variables>
-
-So that later FAI installation decisions can be made based on the
-results of this step.
-
-=back
-
-Each step is detailed more fully later in the man page.
-
-=head1 COMMAND LINE OPTIONS
-
-=over
-
-=item B<-X>
-
-With this option your hard disks will really be formatted.  The
-default is to fake it.
-
-=item B<-f> I<config-filename>
-
-Specify the configuration file.  The default is to parse all files
-found in the environment variable C<classes>.
-
-=item B<-c> I<class-path>
-
-Specify where configuration files live.  The default is
-F<$FAI/disk_config/>.
-
-=item B<-d>
-
-Specify DOS alignment of partitions.  The default is B<not> to align
-so as to suit DOS.
-
-=back
-
-=head1 CONFIGURATION FILE FORMAT
-
-Lines beginning with C<#> are comments.
-
-Here is an example to give you a hint;
-
-   # Configure a system with a single IDE hard disk
-   disk_config hda
-       primary   /       256    rw,errors=remount-ro    ;-j
-       primary   swap    1024
-       logical   /usr    2048
-       logical   /var    600
-       logical   /home   0-
-
-Each disk in the system to be set up should have a B<disk_config>
-section for it.  Then, each wanted partition is listed along with the
-desired size, and any options.
-
-=over
-
-=item B<disk_config> [ I<device> | B<end> ]
-
-The disk_config command must precede each disk's partitioning
-information.
-
-I<device> is the harddisk to format, with "/dev" removed.  For
-instance, "hda" or "sdc".
-
-If the special keyword B<end> is used, parsing of the configration
-file halts.
-
-=item B<primary> | B<logical> ...
-
-B<primary> and B<logical> define partitions.
-
-The syntax is:
-
-   type     mountpoint  size  fstab-options  ; extra options
-
-=over
-
-=item B<type>
-
-This may be C<primary> or C<logical>.
-
-B<primary> paritions are those created within a normal DOS-style
-partition table (eg, F</dev/hda1> through F</dev/hda4>).
-
-B<logical> partitions are created inside the last (by convention)
-primary partition (eg, F</dev/hda5> and above).
-
-Only primary partitions are bootable by boot loaders like GRUB and
-LILO.
-
-=item B<mountpoint>
-
-This is the name of the entity that this partition is allocated to.
-
-B<Normal partitions> are defined with the name of the mount point,
-such as C</>, C</usr>, C</var>, C</home>, etc.
-
-To use a partition as a B<swap device>, use the special value C<swap>.
-
-If it is set to C<->, to the partition will be B<unused>.
-
-=item B<size>
-
-The size of the partition.
-
-To specify an B<exact size>, list a number in mebibytes (MiB, 1024 *
-1024 bytes), such as C<30> for 30MiB.
-
-To specify a B<range>, use the hyphen (C<->), such as:
-
-=over
-
-=item 10-100
-
-10 to 100MiB
-
-=item 20-
-
-At least 20 mebibytes
-
-=item -500
-
-up to 500 mebibytes.
-
-=back
-
-Partition sizes will be rounded up to the next cylinder boundary.
-
-=back
-
-To specify a partition should B<remain untouched>, use the syntax
-C<preserve>I<num>.  For example, C<preserve3> for the existing third
-partition on the disk.
-
-If the I<device> was C<hda> then this results in C<hda3>.  The
-partition will be left unchanged. This is useful if you have
-partitions that do not need re-installation or if you want to have
-other operation systems on the device together with Linux.  Logical
-Partitions can not currently be preserved.  The I<bootable> flag will
-not be preserved.  Preserved partitions are mounted read-only during
-installation.
-
-=item B<fstab-options>
-
-These options are copied to the fourth column of the F</etc/fstab>,
-and specifies I<mount options>.  See L<fstab(5)> for more information
-on mount options.  The default is C<defaults>.
-
-=item B<extra options>
-
-Extra options are specified after the semicolon, should be seperated
-by a comma, and include:
-
-=over
-
-=item B<format>
-
-Always format this partition, even if C<preserve>I<N> was specified.
-
-=item B<ext2>
-
-Format the filesystem as ext2 (this is the default)
-
-=item B<-j> or B<ext3>
-
-Format the filesystem as ext3
-
-=item B<-i> I<bytes>
-
-Bytes per inode (only ext2/3 filesystem)
-
-=item B<-m> I<blocks>
-
-Reserved block percentage for super-user (only ext2/3 filesystem)
-
-=item B<reiser>
-
-Format the filesystem as ReiserFS, using L<mkreiserfs(8)>.
-
-=item B<-h> I<hash>
-
-If formatting a ReiserFS filesystem, set the `hash' algorithm.
-
-=item B<-v> I<ver>
-
-If formatting a ReiserFS filesystem, set the reiserfs version.
-
-=item B<dosfat16>
-
-Format the filesystem using FAT16 (baby's first filesystem), as used
-by DOS 2.0 and above.
-
-=item B<winfat32>
-
-Format the filesystem using FAT32 (bloated baby's first filesystem),
-as used by Windows 95 and above.
-
-=item B<lazyformat>
-
-Do not format if partition has not moved (useful for testing the
-installation)
-
-=item B<boot>
-
-Make this (primary) partition as bootable (by default, only the linux
-root filesystem is marked as bootable).
-
-=item B<writable>
-
-Mounts a preserved partition in read-write mode
-
-=item B<raid(>I<X>, B<md>I<N>[I<a>][, I<F>]B<)>
-
-Set up the partition as part of a RAID set.
-
-I<X> specifies the RAID level - 0 means striping, 1 mirroring and 5
-cursing.
-
-I<N> specifies the number of the RAID set - ie, C</dev/mdI<N>>.
-
-I<a> specifies which half of a mirror a volume in a RAID 10 set is.
-This may be a letter from C<a> to C<e>, allowing up to 5 halves to
-your mirror.
-
-I<F> specifies the chunk factor.  This is the same as you would
-specify it to the kernel on the command line and represents
-log(chunk_size_in_KB)/log(2) - 12.  See L<BASIC MATH> for more.  The
-default is 8.
-
-=item B<lvm>[(I<VGname>)]
-
-Set up the partition as a physical volume in a volume group.
-
-=back
-
-=back
-
-=head1 EXAMPLES
-
-For examples, see F</usr/share/doc/fai/examples>.
-
-=cut
-
+# getopts variables:
+our ($opt_X, $opt_f, $opt_c, $opt_d);
 my $test;
-my $verbose;
 
 $| = 1;                     # flush always
 
 #****************************************************
-# Global Variables
+# Variables
 #****************************************************
 
-use constant PROGNAME => "setup_harddisks";
+my $Version = "version 0.38fai";
 
-my $Version = "0.16fai-sv";
-
 my $megabyte = 1024 * 1024;    # guess
-my $MegOfNulls = "\0" x (2**20);
 # $gigabyte = 1024 * $megabyte;
 my $sectorsize = 512;
 
 # used programs
-my $g_sfdisk_options = "-q";     # be quiet
-my $g_mke2fs_options = "-q";     # be quiet
-my $g_mkreiserfs_options = "";
-my $g_mkswap_options = "";
+my $sfdisk_options = "-q $ENV{sfdisk}";     # be quiet
+my $mke2fs_options = "-q";     # be quiet
+my $mkreiserfs_options = "";
+my $mkxfs_options = "-f";
+my $mkswap_options = "";
 
 # FAI input variables
-my $g_ClassPath = "$ENV{FAI}/disk_config";# this directory contains the classes
-my $g_ConfigFileName = "";   # alternative classfile, only for tests
-my $g_DOS_Alignment = "";    # align partitions for tracks
+my $ClassPath = "$ENV{FAI}/disk_config";# this directory contains the classes
+my $ConfigFileName = "";   # alternative classfile, only for tests
+my $DOS_Alignment = "";    # align partitions for tracks
 
 # FAI output variables
-my $g_BootPartition = "";    # the boot partition like "hda1"
-my $g_BOOT_DEVICE = "";      # the root device like "hda" or "sdb"
-my $g_FAIOutputFile = $ENV{diskvar}; # write output variables to this file
+my $BootPartition = "";    # the boot partition like "hda1"
+my $BOOT_DEVICE = "";      # the root device like "hda" or "sdb"
+my $FAIOutputFile = $ENV{diskvar}; # write output variables to this file
 
 # old partition tables
-my %g_DiskUnits = ();        # unit size of each disk in sectors
-my %g_DiskSize = ();         # size of every disk in units
-my %g_SectorsAlignment = ();  # tracksize in sectors
-my %g_PartOldBoot = ();      # partition was bootable. "yes"=yes
-my %g_PartOldStart = ();     # old startunit of partition
-my %g_PartOldEnd = ();       # old endunit of partition
-my %g_PartOldStartSec = ();  # old startsector of partition
-my %g_PartOldEndSec = ();    # old endsector of partition
-my %g_PartOldID = ();        # old ID of partition
-my %g_OldNotAligned = (); # "yes" if old partition boundaries are not DOS aligned
+my %DiskUnits = ();        # unit size of each disk in sectors
+my %DiskSize = ();         # size of every disk in units
+my %SectorsAlignment = ();  # tracksize in sectors
+my %PartOldBoot = ();      # partition was bootable. "yes"=yes
+my %PartOldStart = ();     # old startunit of partition
+my %PartOldEnd = ();       # old endunit of partition
+my %PartOldStartSec = ();  # old startsector of partition
+my %PartOldEndSec = ();    # old endsector of partition
+my %PartOldID = ();        # old ID of partition
+my %OldNotAligned = (); # "yes" if old partition boundaries are not DOS aligned
 
 # mountpoints  ("/<path>" or "swap<No>" or "no<No>" or "extended<disk>")
-my $g_NofSwapPart = 0;       # number of swap partitions
-my $g_NofNotMoPart = 0;      # number of not mountet partitions
-my %g_DiskMountpoints = ();  # mountpoints of every disk. separated by spaces
-my %g_MountpointPart = ();   # partition of every mountpoint. e.g. "hda2"
-my %g_PartMountpoint = ();   # mountpoint of every partition.
+my $NofSwapPart = 0;       # number of swap partitions
+my $NofNotMoPart = 0;      # number of not mountet partitions
+my %DiskMountpoints = ();  # mountpoints of every disk. separated by spaces
+my %MountpointPart = ();   # partition of every mountpoint. e.g. "hda2"
+my %PartMountpoint = ();   # mountpoint of every partition.
+my @swaplist;              # list of all swpa devices
 
 # size of partition/mountpoint
-my %g_MPMinSize = ();        # minimum size of mountpoint in units
-my %g_MPMaxSize = ();        # maximum size of mountpoint in units
-my %g_MPPreserve = ();       # preserve partition: "yes"=yes
-my %g_MPPrimary = ();        # primary partition: "yes"=yes
-my %g_MPStart = ();          # start of partition in units
-my %g_MPSize = ();           # size of partition in units
-my %g_MPID = ();             # id of partition
+my %MPMinSize = ();        # minimum size of mountpoint in units
+my %MPMaxSize = ();        # maximum size of mountpoint in units
+my %MPPreserve = ();       # preserve partition: "yes"=yes
+my %MPPrimary = ();        # primary partition: "yes"=yes
+my %MPStart = ();          # start of partition in units
+my %MPSize = ();           # size of partition in units
+my %MPID = ();             # id of partition
 
 # options
-my %g_MPfstaboptions = ();   # fstab options for every mountpoint
-my %g_MPOptions = ();        # extra options for every mountpoint
+my %MPfstaboptions = ();   # fstab options for every mountpoint
+my %MPOptions = ();        # extra options for every mountpoint
 
 # sfdisk partition tables
-my %g_sfdiskTables = ();     # partition tables for sfdisk
+my %sfdiskTables = ();     # partition tables for sfdisk
 
-# RAID & LVM options
-my $g_hostname = `uname -n`;
-chomp($g_hostname);
-my %g_md = ();
-my %g_lvm = ();
+my $verbose = 0;
+$verbose = $ENV{verbose} if $ENV{verbose};
 
-sub say    { print PROGNAME.": @_\n"; }
-sub mutter { print PROGNAME.": @_\n" if ($test or $verbose) }
-sub barf   { print STDERR PROGNAME.": error: @_\n"; exit(1); }
-sub moan   { print STDERR PROGNAME.": warning: @_\n"; }
-open CONSOLE, ">/dev/console";
-sub shout  { print CONSOLE PROGNAME.": @_\n"; }
-
-#=====================================================================
-#  MAIN SECTION STARTS HERE
-#=====================================================================
 # Parse command line
+
 use Getopt::Std;
-use vars qw($opt_X $opt_f $opt_c $opt_d $opt_v);
-&getopts('Xf:c:dv') || die "
-USAGE: [-X]                     no test, your harddisks will be formatted
-                                default: only test, no real formatting
+&getopts('Xf:c:d') || die "
+USAGE: [-X]                     no test, your harddisks will be formated
+                                default: only test, no real formating
        [-f<config-filename>]    default: parse classes
        [-c<class-path>]         default: \$FAI/disk_config/
        [-d]                     default: no DOS alignment
 ";
 
-$verbose = $opt_v;
-
-say "Version V$Version starting";
+print "setup_harddisks $Version\n";
 if (defined $opt_X){
-    $test = 0;
+    $test = 2;
 } else {
-    say "dummy mode - no real formatting";
+    print "TEST ONLY - no real formating\n\n";
     $test = 1;
 }
-$g_ConfigFileName = $opt_f if $opt_f;# alternative config file
-$g_ClassPath      = $opt_c if $opt_c;# search classes here
-$g_DOS_Alignment  = "yes" if $opt_d; # track alignment
+$ConfigFileName = $opt_f if $opt_f;# alternative config file
+$ClassPath      = $opt_c if $opt_c;# search classes here
+$DOS_Alignment  = "yes" if $opt_d; # track alignment
 
 # main part
 &GetAllDisks;
 &ParseAllConfigFiles;
 &BuildNewPartTables;
-shout "stopping existing RAID and LVM devices";
-&StopAllRaid;
-shout "partitioning disks with sfdisk";
 &PartitionPersfdisk;
-shout "setting up MD and LVM devices";
-&DoDeepRAIDnLVMmagic;
-shout "making filesystems";
 &FormatDisks;
 &WriteFSTab;
 &WriteFAIVariables;
-shout "all done";
 exit 0;
+#****************************************************
 
-
-#---------------------------------------------------------------------
-# PartName($disk, $partno)
-#
-#  Returns the device name for partition number $partno inside block
-#  device $disk
-#---------------------------------------------------------------------
+#****************************************************
+# get a partition pathname
+#****************************************************
 sub PartName {
     my ($disk, $partno) = @_;
     my $ppath;
     for ($disk) {
-	/^[a-z]+$/ and $ppath = "${disk}${partno}";
-	/\d$/ and $ppath = "${disk}p${partno}";
+      /^(i2o\/)?[a-z]+$/ and $ppath = "${disk}${partno}";
+      /\d$/ and $ppath = "${disk}p${partno}";
     }
     return $ppath;
 }
 
-=head1 INTERNAL OPERATION
-
-This section of the man page details how the internals of the script
-operates.  These sections correspond exactly with the steps of the
-script as detailed in the introduction.
-
-=over
-
-=item B<1. GetAllDisks>
-
-Read all partition tables of this machine using L<sfdisk(8)>.
-
-The status of existing partition sizes, locations, partition types,
-status of the bootable flag, and whether or not disks are aligned on
-cylinder boundaries (DOS alignment) are recorded.
-
-=cut
-
+#****************************************************
+# Read all partition tables of this machine
+#****************************************************
 sub GetAllDisks{
-
     my $line=""; my $disk=""; my $device=""; my $rest; my $result; my $divi;
+    my $devdisklist="";
 
-    my @disks;
-
-    # FIXME - hardcoded list required because util-linux is lame
-    $result = `sh -c "LC_ALL=C sfdisk /dev/sd[a-z] /dev/hd[a-z] -g -q" 2>&1`;
-
+    foreach my $device(split(/\s/,$ENV{disklist})){
+      $devdisklist = "$devdisklist /dev/$device";
+    }
+    print "Probing disks: $devdisklist\n";
+    print "Disks found:";
+    $result = `sh -c "LC_ALL=C sfdisk -g -q $devdisklist"`;
     foreach my $line(split(/\n/,$result)){
-
-	if (($disk, my ($cylinders, $heads, $sectors)) =
-	    ($line =~ m{^/dev/(.+?):\s+
-			(\d+)\s+cylinders,\s+
-			(\d+)\s+heads,\s+
-			(\d+)\s+sectors }ix)) {
-
-	    $g_DiskUnits{$disk} = $heads * $sectors;  # cylinder size
-	    $g_DiskSize{$disk} = $cylinders;          # num. cylinders
-
-	    ($g_DOS_Alignment eq "yes")
-		? ($g_SectorsAlignment{$disk} = $4)
-		: ($g_SectorsAlignment{$disk} = 1);
-
-	    push @disks, $disk;
+	if($line =~ m'^/dev/(.+?):\s+(\d+)\s+cylinders,\s+(\d+)\s+heads,\s+(\d+)\s+sectors'i){
+	    $disk = $1;
+	    $DiskUnits{$disk} = $3 * $4;# heads * sectors = cylinder size in sectors
+	    $DiskSize{$disk} = $2;      # cylinders
+	    ($DOS_Alignment eq "yes") ? ($SectorsAlignment{$disk} = $4) : ($SectorsAlignment{$disk} = 1);
+	    print " $disk";
 	}
-
     }
-
-    say "Disks found: @disks";
-
-    $result = `sh -c "LC_ALL=C sfdisk -d -q /dev/sd[a-z] /dev/hd[a-z] " 2>&1`;
-
-    my %parts;
-
+    $result = `sh -c "LC_ALL=C sfdisk -d -q $devdisklist"`;
     foreach my $line(split(/\n/,$result)){
-
-	if ($line =~ m{\043\s partition \s table \s of \s
-		       /dev/(    cciss/c\dd\d   # new COMPAQ arrays
-		            |    ida/c\dd\d     # older COMPAQ arrays
-                            |    rd/c\dd\d      # ?
-                            |    [a-z]+         # everything else
-		           )}ix){
+#	if($line =~ m'# partition table of /dev/(cciss/c\dd\d|ida/c\dd\d|rd/c\dd\d|[a-z]+)'i){
+# now just match all devices
+	if($line =~ m'# partition table of /dev/(\S+)$'i){
 	   $disk = $1;
-	   $parts{$disk} = [ ];
         }
-
-	if (($device, my ($start, $size, $Id, $rest)) =
-	    ($line =~ m{^/dev/(.+?)\s*:\s+
-			start=\s*(\d+),\s+
-			size=\s*(\d+),\s+
-			Id=\s*([a-z0-9]+)\b(.*)$}xi)){
-
-	    push @{ $parts{$disk} }, $device if $size;
-
+	if($line =~ m#^/dev/(.+?)\s*:\s+start=\s*(\d+),\s+size=\s*(\d+),\s+Id=\s*([a-z0-9]+)\b(.*)$#i){
+	    $device = $1;
             # Sectors
-            $g_PartOldStartSec{$device} = $start;
-            my $endsec = $g_PartOldEndSec{$device} = $start + $size - 1;
-
+            $PartOldStartSec{$device} = $2;
+            $PartOldEndSec{$device} = $2 + $3 - 1;
             # DiskUnits
-	    $g_PartOldStart{$device} = int ($start / $g_DiskUnits{$disk});
-	    $g_PartOldEnd{$device} = int ($endsec / $g_DiskUnits{$disk});
-
-	    # Was it aligned properly?
-	    for ( $start, $size ) {
-		my $x = ( $_ / $g_SectorsAlignment{$disk} );
-		if ( abs($x - int($x)) > 1e-9 ) {
-		    $g_OldNotAligned{$device} = "yes";
-		}
-	    }
-
-	    # Other options
-	    $g_PartOldID{$device} = $Id;
-	    $g_PartOldBoot{$device} = ($rest =~ /bootable/) ? "yes" : "";
+	    $PartOldStart{$device} = int ($2 / $DiskUnits{$disk});
+	    $PartOldEnd{$device} = int (($2 + $3 - 1) / $DiskUnits{$disk});
+	    $divi = $2 / $SectorsAlignment{$disk};
+	    ($divi != int ($divi)) && ($OldNotAligned{$device} = "yes");
+	    $divi = $3 / $SectorsAlignment{$disk};
+	    ($divi != int ($divi)) && ($OldNotAligned{$device} = "yes");
+	    $PartOldID{$device} = $4;
+	    $rest = $5;
+	    $PartOldBoot{$device} = ($rest =~ /bootable/) ? "yes" : "";
 	}
-
     }
-
-    for my $disk (sort keys %parts) {
-	say("$disk: @{$parts{$disk}}");
-    }
-
+    print "\n\n";
 }
 
-=item B<2. ParseAllConfigFiles>
-
-Parse the specified configuration file, or one filename for each
-class.
-
-=cut
-
+#****************************************************
+# parse config file or all class files
+#****************************************************
 sub ParseAllConfigFiles{
     my $ConfigFileExists = 0;  # no config file parsed yet
-    if ($g_ConfigFileName){
+    if ($ConfigFileName){
 	# Read config filename
-	&ParseConfigFile($g_ConfigFileName);
+	&ParseConfigFile($ConfigFileName);
 	$ConfigFileExists = 1;
     } else {
 	# Read classes
 	foreach my $classfile (reverse split(/\s+/,$ENV{"classes"})){
-	    my $filename = "$g_ClassPath/$classfile";
+	    my $filename = "$ClassPath/$classfile";
 	    if (($classfile) && (-r $filename)) {
                &ParseConfigFile($filename);
                $ConfigFileExists = 1;
@@ -578,1381 +329,626 @@
 	    ($ConfigFileExists) && last;
 	}
     }
-    $ConfigFileExists or barf "no config file found";
+    ($ConfigFileExists == 0) && die "ERROR: no config file for setup_harddisk found. Please check you classes and files in disk_config.\n";
 }
 
-#-------------------------------------------------------------------------------------------------------------------------
-#  ParseConfigFile($filename)
-#
-# Parses the passed configuration file and stacks up the globals.
-#-------------------------------------------------------------------------------------------------------------------------
-sub ParseConfigFile{
+#****************************************************
+# map "disk_config first" to real disk device
+#****************************************************
+sub mapdisk {
 
-    my $config_file = shift;
+  my ($disk) = @_;
+  my @dlist = split /\s+/,$ENV{disklist};
+  unshift @dlist, "nodisk"; # add dummy element, so disk1 will be mapped to dlist[1]
 
-    open (FILE, "$config_file") or die "error opening config file: $config_file; $!\n";
+  if ($disk =~ /disk(\d+)/) {
+    my $n = $1;
+    print "Mapping disk name disk$n to $dlist[$n]\n";
+    $disk = $dlist[$n];
+  }
+  return $disk;
+}
 
-    say "parsing config file: $config_file";
-
-    my $line_no = 0;
-    my $disk = "";
-    my $device = "";
-    my $vg = "";
-
-    my $disk_state;
-
-    # counts of partitions
-    my $unmounted_part_c = 0;
-    my $swap_part_c = 0;
-
- LINE:
-    while (my $line = <FILE>) {
-
+#****************************************************
+# parse config-file
+#****************************************************
+sub ParseConfigFile{
+    my $size=""; my $mountpoint=""; my $device ="";
+    my $fstaboptions=""; my $options=""; my $disk=""; my $command = "";
+    my $LogPartNo; my $PrimPartNo; my $NoMoreLogicals;
+    my $LastPresPart; my $extmp; my $Min; my $Max;
+    my $filename = shift;
+    open (FILE,"$filename")
+      || die "config file not found: $filename\n";
+    (print "Using config file: $filename\n");
+    $disk = "";
+    my $a = 1, my $paras ="", my $number=0;
+    while (my $line = <FILE>){
 	chomp($line);
-	$line_no++;
-	next if ( $line =~ /^\s*(#.*)?$/ );
+	$a++;
+	next if( $line =~ /^#|^\s*$/ );
 
 	# disk_config - command
-	my ($is_lvm, $paras);
-	if (($is_lvm, $paras) = ($line =~ /^\s*(?:(vg)|disk)_config\s*(.*)/i)){
-
-	    last LINE if $paras =~ /^end$/i;
-
-	    if ( $is_lvm ) {
-
-		my ($vg_name) = ($paras =~ m{^(?:/dev/)?(\S+)});
-		$vg_name ||= "default";
-
-		# special names - DEFAULT, HOST
-		$vg_name =~ s{\$HOSTNAME}{$g_hostname};
-		if ($vg_name =~ m/^default$/i) {
-		    ($vg_name) = (keys %g_lvm)
-			or barf("${config_file}"."[$line_no]: partitions must be "
-				."defined for a VG before they are used");
-		}
-		barf("${config_file}"."[$line_no]: unknown VG $vg_name") unless exists $g_lvm{$vg_name};
-
-		$vg = $vg_name;
+	if ($line =~ /^disk_config(.*)/i){
+	    $paras = $1;
+	    if ($paras =~ / end/i){
 		$disk = "";
-		$disk_state = undef;
-		$g_lvm{$vg_name}->{lvs} = { };
-
-		$g_DiskUnits{$vg_name} = (4096 << 10) / $sectorsize;
-		$g_DiskMountpoints{$vg_name} = "";
-
-		$g_DiskSize{$vg_name} = $g_lvm{$vg_name}->{MaxSize};
-
-	    } elsif ( ($disk) = ($paras =~ m{^(?:/dev/)?
-					(      cciss/c\dd\d
-					|      ida/c\dd\d
-					|      rd/c\dd\d
-					|      [a-z]+
-				        )}ix )){
-		$vg = "";
-
-		barf("more than one configuration of disk $disk in $config_file") if exists $g_DiskMountpoints{$disk};
-		barf "unknown disk /dev/$disk specified in $config_file" unless $g_DiskSize{$disk};
-
-		mutter "config: $disk";
-
-		$g_DiskMountpoints{$disk} = "";
-		$g_MPPrimary{"extended$disk"} = "";
-
-		$disk_state = { logical => 4,
-				primary => 0,
-				no_more_logicals => 0,
-				last_pres_part => "",
-				extmp => "extended$disk" },
-
 	    } else {
-		barf("${config_file}"."[$line_no]: disk unrecognised or invalid: '$paras'");
+#		if($paras =~ m# (/dev/)?(cciss/c\dd\d|ida/c\dd\d|rd/c\dd\d|[a-z]+)#i){
+# now match all devives
+		if($paras =~ m# (/dev/)?(\S+)#i){
+		    $disk = mapdisk($2);
+		    ($DiskMountpoints{$disk})
+		      && die "ERROR: there are more than one configuration of disk $disk.\n";
+		    ($DiskSize{$disk}) || die "ERROR: could not read device /dev/$disk\n";
+		    ($test != 1) || (print "config: $disk\n");
+		    $DiskMountpoints{$disk} = "";
+		    $MPPrimary{"extended$disk"} = "";
+		    $LogPartNo = 4;
+		    $PrimPartNo = 0;
+		    $NoMoreLogicals = 0;
+		    $LastPresPart = "";
+		    $extmp = "extended$disk";
+		} else {
+		    die "SYNTAX ERROR: in config file line $a, unknown disk_config parameter $paras\n$line\n";
+		}
 	    }
 	}
 
-	if ($disk or $vg) {
-
+	if ($disk){
 	    # primary|partition - command
-	    if (my ($command, $lv_name, $mountpoint, $size, $mntop, $options)
-		= ($line =~ m{^(primary|logical|lv)
-			      (?:\s*\(\s*(\S+)\s*\))?  # (lvname)
-			      (?: \s+ (\S+) \s*      # mount point
-			          (?: (\S+) \s*          # size
-			            ( [^;]+? \s* )?  # mount options
-			          )?
-			      )?
-			      (?: ; \s*
-			          (.*?)              # misc options
-			      \s* )?$}ix)){
-
-		$mntop||="";
-		$options||="";
-
-		barf("${config_file}"."[$line_no]: invalid mount point `$mountpoint'")
-		    unless ( ($mountpoint =~ m{^/.*|^swap$|^-$}i or
-			      $mountpoint =~ m{^\w+} && ($command eq "lv") ) );
-
-		barf("${config_file}"."[$line_no]: duplicate definition of `$mountpoint'")
-		    if (exists $g_MountpointPart{$mountpoint} and $options !~ m{raid\s*\(\s*1\s*,});
-
-		if ($mountpoint eq "/") {
-		    barf("${config_file}"."[$line_no]: root cannot be on an LVM partition")
-			if $command eq "lv";
-		    ($g_BootPartition) || ($g_BOOT_DEVICE = $disk);
+	    if($line =~ /^\s*(primary|logical)\s+(.*)$/i){
+		$command = $1;
+		# split variables
+		$paras = $2;
+		$options = "";
+		if($paras =~ /(.*?)\s*;\s*(.*)$/){
+		    $paras = $1;
+		    $options = $2;
 		}
-
-		if ($mountpoint eq "-") {
-		    $unmounted_part_c++;
-		    $mountpoint = "no$unmounted_part_c";
+		$size="";
+		$mountpoint ="";
+		$fstaboptions = "";
+		($mountpoint,$size,$fstaboptions)=split(/\s+/,$paras);
+		# mountpoint
+		($mountpoint =~ m#^/.*|^swap$|^-$#i)
+		  || die "SYNTAX ERROR in config file line $a, mountpoint: $mountpoint\n$line\n";
+		($MountpointPart{$mountpoint})
+		  && die "SYNTAX ERROR in config file line $a. Mountpoint $mountpoint redefined.\n$line\n";
+		if($mountpoint eq "/"){
+		    ($BootPartition) || ($BOOT_DEVICE = $disk);
 		}
-
-		if ($mountpoint eq "swap") {
-		    $swap_part_c++;
-		    $mountpoint = "swap$swap_part_c";
-
-		    # ?
+		if($mountpoint eq "-"){
+		    $NofNotMoPart++;
+		    $mountpoint = "no$NofNotMoPart";
+		}
+		if($mountpoint eq "swap"){
+		    $NofSwapPart++;
+		    $mountpoint = "swap$NofSwapPart";
 		    ($options !~ /\bswap\b/i) && ($options .= " swap");
-		    $mntop ||= "sw";
+		    ($fstaboptions) || ($fstaboptions = "sw");
 		}
-
-		$mntop ||= "defaults" if $mountpoint =~ m{^/};
-
-		my $devname;
-
+		if($mountpoint =~ m#^/#){
+		    ($fstaboptions) || ($fstaboptions = "defaults");
+		}
 		if ($command eq "primary") {
-
-		    ($g_MPPrimary{$disk_state->{extmp}} eq "yes") && ($disk_state->{NoMoreLogicals} = 1);
-		    $g_MPPrimary{$mountpoint} = "yes";
-
-		    my $p = \$disk_state->{primary};
-
-		    $$p++;
-
-		    # wtf ?
-		    #($$p == 3) && ($disk =~ /^sd/) && ($$p++);
-
-		    barf("${config_file}"."[$line_no]: too many primary partitions defined on $disk") if ($$p > 4);
-
-		    $devname = $g_MountpointPart{$mountpoint} = PartName($disk, $$p);
-
-		    if ($options =~ /\bboot\b/i) {
-
-			barf("${config_file}"."[$line_no]: only one partition can be bootable at a time, and "
-			     ."$g_BootPartition is already bootable") if $g_BootPartition;
-
-			$g_BOOT_DEVICE = $disk;
-			$g_BootPartition = $g_MountpointPart{$mountpoint};
+		    ($MPPrimary{$extmp} eq "yes") && ($NoMoreLogicals = 1);
+		    $MPPrimary{$mountpoint} = "yes";
+		    $PrimPartNo++;
+#		    ($PrimPartNo == 3) && ($disk =~ /^sd/) && ($PrimPartNo++);
+                    ($PrimPartNo >4 ) && die "ERROR: Too much primary partitions (max 4).".
+                                " All logicals together need one primary too.\n";
+		    $MountpointPart{$mountpoint} = PartName($disk,$PrimPartNo);
+		    if($options =~ /\bboot\b/i){
+		        ($BootPartition) && die "ERROR: only one partition can be bootable at a time.";
+			$BootPartition = $MountpointPart{$mountpoint};
+			$BOOT_DEVICE = $disk;
 		    }
-
-		} elsif ($command eq "logical") {
-
-		    barf("${config_file}"."[$line_no]: all logical partitions must be together")
-			if $disk_state->{no_more_logicals};
-
-		    $g_MPPrimary{$mountpoint} = "";
-		    my $l = \$disk_state->{logical};
-		    $$l++;
-
-		    $devname = $g_MountpointPart{$mountpoint} = PartName($disk, $$l);
-
-		    my $extmp = $disk_state->{extmp};
-		    if (!$g_MPPrimary{$extmp}){
-
-		        $g_MPPreserve{$extmp} = "";
-		        $g_MPPrimary{$extmp} = "yes";
-			$g_MPMinSize{$extmp} = 0;
-			$g_MPMaxSize{$extmp} = 0;
-			$g_MPID{$extmp} = 5;
-
-			my $p = \$disk_state->{primary};
-
-			# ??
-			# ($$p == 3) && ($disk =~ /^sd/) && ($$p++);
-
-			barf("${config_file}"."[$line_no]: too many primary partitions defined on $disk")
-			    if ($$p > 4);
-
-			$g_MountpointPart{$extmp} = PartName($disk, $disk_state->{primary});
-			$g_DiskMountpoints{$disk} .= " $extmp";
+		} else {
+		    ($NoMoreLogicals != 0) && die "ERROR: the logical partitions must be together.\n";
+		    $MPPrimary{$mountpoint} = "";
+		    $LogPartNo++;
+		    $MountpointPart{$mountpoint} = PartName($disk,$LogPartNo);
+		    if (!$MPPrimary{$extmp}){
+		        $MPPreserve{$extmp} = "";
+		        $MPPrimary{$extmp} = "yes";
+			$MPMinSize{$extmp} = 0;
+			$MPMaxSize{$extmp} = 0;
+			$MPID{$extmp} = 5;
+			$PrimPartNo++;
+			($PrimPartNo == 3) && ($disk =~ /^sd/) && ($PrimPartNo++);
+                        ($PrimPartNo >4 ) 
+			  && die "ERROR: too much primary partitions (max 4).".
+                               " All logicals together need one primary too.\n";
+			$MountpointPart{$extmp} = PartName($disk,$PrimPartNo);
+			$DiskMountpoints{$disk} .= " $extmp";
 		    }
-
-		    barf("${config_file}"."[$line_no]: only primary partitions can be bootable")
-			if ($options =~ /\bboot\b/i);
-
-		} elsif ($command eq "lv") {
-
-		    $lv_name ||= do {
-			(my $x = $mountpoint) =~ s{.*/}{};
-			if (exists $g_lvm{$vg}->{$x}) {
-			    my $n = 0;
-			    while (exists $g_lvm{$vg}->{$x.chr(ord("a")+$n)}) {
-				$n++
-			    }
-			    barf "fer fick's sake, wouldja name yer friken LVs or what?  Too many ${x}'s"
-				if $n > 25;
-			    $x .= chr(ord("a")+$n);
-			}
-			$x;
-		    };
-
-		    $g_MountpointPart{$mountpoint} = "$vg/$lv_name";
-		    $g_lvm{$vg}->{lvs}->{$lv_name} = $mountpoint;
+#		    ($options =~ /\bboot\b/i) && die "ERROR: line $a, only primary partitions can be bootable.\n";
 		}
-
-		barf("${config_file}"."[$line_no]: $mountpoint redefined ($g_DiskMountpoints{$disk||$vg})")
-		    if $g_DiskMountpoints{$disk||$vg} =~ /\b$mountpoint\b/;
-		$g_DiskMountpoints{$disk||$vg} .= " $mountpoint";
-
+		$DiskMountpoints{$disk} .= " $mountpoint";
 		# size
-		my ($number, $Min, $Max);
-		if ( ($number, $Min, $Max) = ($size =~ /^preserve(\d+)$|^(\d*)\-?(\d*)$/i)) {
-
-		    if ($number) {
-			barf("LVs cannot currently be preserved.") if $vg;
-
-			$device = PartName($disk, $number);
-
-			my $error = ( $g_OldNotAligned{$device} eq "yes"
-				      ? "partition not DOS aligned"
-				      : ( ($command eq "logical") &&
-					  ($number != $disk_state->{logical})
-					  ? "logical partition number mismatch"
-					  : ( ($command eq "primary") &&
-					      ($number!=$disk_state->{primary})
-					      ? "primary partition number mismatch"
-					      : "" ) ) );
-
-			$error ||= ( !$g_PartOldEnd{$device}
-				     ? "partition not found"
-				     : ( ($g_PartOldID{$device} == 5)
-					 || ($g_PartOldID{$device} == 85)
-					 ? "extended partitions cannot be preserved"
-					 : "" )
-				   );
-
-			barf("cannot preserve /dev/$device; $error") if $error;
-
-			$g_MPPreserve{$mountpoint} = "yes";
-
-			$g_MPMaxSize{$mountpoint} = $g_MPMinSize{$mountpoint} =
-				($g_PartOldEnd{$device} - $g_PartOldStart{$device} + 1);
-
-			$g_MPStart{$mountpoint} = $g_PartOldStart{$device};
-			$g_MPSize{$mountpoint}  = $g_MPMinSize{$mountpoint};
-
-			$g_MPID{$mountpoint} = $g_PartOldID{$device};
-
-			if ($disk_state->{last_pres_part} and
-			    ($g_PartOldStart{$device} < $g_PartOldStart{$disk_state->{last_pres_part}})) {
-			    barf("cannot preserve /dev/$device; partitions out of order");
-			}
-
-			$disk_state->{last_pres_part} = $device;
-
-			barf("cowardly refusing to preserve zero length partition $device")
-			    if $g_MPMinSize{$mountpoint} < 1;
-
+		($size =~ /^preserve\d+$|^\d+\-?\d*$|^-\d+$/i)
+		    || die "SYNTAX ERROR in config file line $a, size: $size\n$line\n";
+		if($size =~ /^preserve(\d+)$/i){
+		    my $number = $1;
+		    $device = PartName($disk,$number);
+		    ($OldNotAligned{$device} eq "yes")
+		      && die "ERROR: unable to preserve partition /dev/$device. Partition is not DOS aligned.";
+		    ($command eq "primary") && ($number != $PrimPartNo)
+                       && die "NUMERATION ERROR in line $a, the number of the partition can not be preserved:\n$line\n";
+		    ($command eq "logical") && ($number != $LogPartNo)
+                       && die "NUMERATION ERROR in line $a, the number of the partition can not be preserved:\n$line\n";
+		    if ($PartOldEnd{$device}){
+		        (($PartOldID{$device} == 5) || ($PartOldID{$device} == 85)) &&
+			  die "ERROR in config file line $a.".
+                              " Extended partitions can not be preserved. /dev/$device\n$line\n";
+			$MPPreserve{$mountpoint}="yes";
+			$MPMinSize{$mountpoint} = $PartOldEnd{$device}-$PartOldStart{$device}+1;
+			$MPMaxSize{$mountpoint} = $MPMinSize{$mountpoint}; # Max=Min
+			$MPStart{$mountpoint} = $PartOldStart{$device};
+			$MPSize{$mountpoint} = $MPMinSize{$mountpoint};
+			$MPID{$mountpoint} = $PartOldID{$device};
 		    } else {
-
-			$g_MPPreserve{$mountpoint} = "";
-			if ($mountpoint =~ m{^/}) {
-			    # If not preserve we must know the filesystemtype (why?)
-			    ($options !~ m{\b(ext2|ext3|auto|swap|dosfat16|winfat32|reiser)\b}i )
-				&& ($options .= " auto");
+			die "ERROR: cannot preserve partition $device. partition not found.$PartOldEnd{$device}\n";
+		    }
+		    if ($LastPresPart) {
+		        ($PartOldStart{$device} < $PartOldStart{$LastPresPart}) &&
+			  die "ERROR: misordered partitions: cannot preserve partitions $LastPresPart and $device\n".
+                              "       in this order because of their positions on disk.";
+		    }
+		    $LastPresPart = $device;
+		    ($MPMinSize{$mountpoint} < 1)
+		      && die "ERROR: unable to preserve partitions of size 0.\n$line\n ";
+		  } else {
+		    # If not preserve we must know the filesystemtype
+	            ($options !~ /\b(ext2|ext3|auto|swap|dosfat16|winfat32|reiser|xfs)\b/i ) && ($options .= " auto");
+		  }
+		if($size =~ /^(\d*)(\-?)(\d*)$/){
+		    $Min = $1;
+		    $Min||= 1;
+		    $Max = $3;
+		    $MPMinSize{$mountpoint} = int (($Min * $megabyte - 1) / ($DiskUnits{$disk} * $sectorsize)) + 1;
+		    if ($2 eq "-"){
+			if($Max =~ /\d+/){
+			    $MPMaxSize{$mountpoint} = int (($Max * $megabyte - 1) / ($DiskUnits{$disk} * $sectorsize)) + 1;
+			} else {
+			    $MPMaxSize{$mountpoint} = $DiskSize{$disk};
 			}
+		    } else {
+			$MPMaxSize{$mountpoint} = $MPMinSize{$mountpoint}; # Max=Min
 		    }
+		    ($MPMinSize{$mountpoint} > $DiskSize{$disk})
+		      && die "ERROR in config file line $a: Minsize larger than disk.\n$line\n";
+		    ($MPMinSize{$mountpoint} > $MPMaxSize{$mountpoint}) 
+                       && die "SYNTAX ERROR in config file line $a, MIN-MAX-size: $MPMinSize{$mountpoint}-$MPMaxSize{$mountpoint}\n$line\n";
+		    ($MPMinSize{$mountpoint} < 1)
+		      && die "SYNTAX ERROR in config file line $a. Minsize must be greater than 1.\n$line\n";
+		    $MPPreserve{$mountpoint} = "";
 		}
-
-		my $chunk = $g_DiskUnits{$disk || $vg} * $sectorsize;
-
-		my $disk_max = ($g_DiskSize{$disk || $vg} * $chunk);
-		say (($disk||$vg).": Disk size is $g_DiskSize{$disk || $vg} (chunks are $chunk) - total $disk_max");
-		$Max ||= ( $Min || ($disk_max / $megabyte) );
-		say (($disk||$vg).": Max is $Max");
-		$Min ||= 1;
-
-		$g_MPMinSize{$mountpoint} = int( ( $Min * $megabyte + $chunk - 1 ) / $chunk );
-		$g_MPMaxSize{$mountpoint} = int( ( $Max * $megabyte + $chunk - 1) / $chunk )
-		    || $g_DiskSize{$disk || $vg};
-
-		if ($disk) {
-		    my $error = ( ($g_MPMinSize{$mountpoint} > $g_DiskSize{$disk})
-				  ? "minsize larger than disk"
-				  : ( ($g_MPMinSize{$mountpoint} > $g_MPMaxSize{$mountpoint})
-				      ? "minsize larger than maxsize"
-				      : ( ($g_MPMinSize{$mountpoint} < 1)
-					  ? "minsize too small"
-				      : "" ) ) );
-
-		    barf("${config_file}"."[$line_no]: invalid size `$size'; $error") if $error;
-		}
-
-		# mntop
-		$g_MPfstaboptions{$mountpoint} = $mntop;
-
+		# fstaboptions
+		$MPfstaboptions{$mountpoint} = $fstaboptions;
 		# extra options
-		($options =~ /\b(ext[23]|auto)\b/i) && ($g_MPID{$mountpoint} = 83); # Linux native
-		($options =~ /\bswap\b/i)           && ($g_MPID{$mountpoint} = 82); # Linux swap
-		($options =~ /\bdosfat16\b/i)       && ($g_MPID{$mountpoint} = 6);  # DOS FAT 16bit (>=32MB, see later)
-		($options =~ /\bwinfat32\b/i)       && ($g_MPID{$mountpoint} = "b");# Win 95 FAT 32
-		($options =~ /\blvm\b/i)            && ($g_MPID{$mountpoint} ="8e");# LVM managed partition
-		($options =~ /\braid\b/i)           && ($g_MPID{$mountpoint} ="fd");# Linux RAID autodetect
-		($options =~ /\bid\s*\(\s*([0-9a-f]+)\s*\)\b/i)
-                                                    && ($g_MPID{$mountpoint} = lc($1)); # other
-
-		my ($raidlevel, $md_num, $chunk_factor);
-
-		if ($options =~ /\braid\b/) {
-
-		    my $side;
-		    ($raidlevel, $md_num, $side, $chunk_factor) =
-			($options =~ m/\braid\s*\(\s*(\d+)\s*,\s*md(\d+)([a-z])?\s*(?:,\s*(\d+)\s*)?\)/) or
-			    barf("${config_file}"."[$line_no]: invalid raid spec in options `$options'");
-
-		    $g_md{$md_num} ||= { level => $raidlevel,
-					 chunk_factor => $chunk_factor,
-					 members => [ ],
-					 mountpoint => $mountpoint,
-				       };
-
-		    push @{ $g_md{$md_num}->{members} }, $devname;
-
-		    if ($side) {
-			push @{ $g_md{$md_num}->{"side$side"} ||= [] }, $devname;
-		    }
-
+		($options =~ /\b(ext[23]|auto)\b/i) && ($MPID{$mountpoint} = 83); # Linux native
+		($options =~ /\bswap\b/i) && ($MPID{$mountpoint} = 82); # Linux swap
+		($options =~ /\bdosfat16\b/i) && ($MPID{$mountpoint} = 6); # DOS FAT 16bit (>=32MB, will be changed later)
+		($options =~ /\bwinfat32\b/i) && ($MPID{$mountpoint} = "b"); # Win 95 FAT 32
+		$MPOptions{$mountpoint} = $options;
+		if($test == 1){
+		    print "$mountpoint,$MPMinSize{$mountpoint}-$MPMaxSize{$mountpoint},";
+		    print "$fstaboptions,$options";
+		    ($MPPreserve{$mountpoint} eq "yes") && (print " Preserve: $MountpointPart{$mountpoint}");
+		    print "\n";
 		}
-
-		if ($options =~ /\blvm\b(\s*\(\s*\S+\s*\))?/) {
-
-		    my $lvm_name = $1 || ( $g_hostname . "_" . ($raidlevel || "0") );
-		    $g_lvm{$lvm_name} ||= {
-					   devices => [ ],
-					   lvs => { },
-					   MinSize => 0,
-					   MaxSize => 0,
-					  };
-
-		    my ($a_min, $a_max);
-		    $g_lvm{$lvm_name}->{MinSize} +=
-			$a_min=( ($g_MPMinSize{$mountpoint} * $chunk) >> 22);
-		    $g_lvm{$lvm_name}->{MaxSize} +=
-			$a_max=( ($g_MPMaxSize{$mountpoint} * $chunk) >> 22);
-		    say("$mountpoint: added $a_min - $a_max to $lvm_name");
-
-		    push @{ $g_lvm{$lvm_name}->{devices} },
-			(defined($raidlevel) ? "/dev/md$md_num" : "/dev/$devname");
-
-		}
-
-		$g_MPOptions{$mountpoint} = $options;
-
-		($mntop||="")=~s/^\s+|\s+$//g;
-		($options||="")=~s/^\s+|\s+$//g;
-		{
-		    no warnings 'void';
-		mutter("$mountpoint: size: $g_MPMinSize{$mountpoint}-$g_MPMaxSize{$mountpoint}  mntop: $mntop,  "
-		       ."options: $options"
-		       .($g_MPPreserve{$mountpoint} ? " preserved: $g_MountpointPart{$mountpoint}" : "") );
-		}
-
-	    } elsif ($line =~ m{^\s*vg_extent_size\s*(\d+)\s*$}) {
-
-		barf("${config_file}"."[$line_no]: command vg_extent_size only valid in a VG definition")
-		    unless $vg;
-
-		barf("${config_file}"."[$line_no]: command vg_extent_size only valid in a VG definition")
-		    if scalar(keys(%{$g_lvm{$vg}->{lvs}}));
-
-		$g_DiskSize{$vg} = $g_DiskSize{$vg} << (10 - $1);
-		$g_DiskUnits{$vg} = (4096 << $1) / $sectorsize;
-
 	    }
 	}
     }
     close(FILE);
-
-    my $x = 0;
-    for my $md (sort keys %g_md) {
-	say ("RAID CONFIG:") unless $x++;
-	say ("md$md: RAID ".$g_md{$md}->{level}." "
-	     .($g_md{$md}->{chunk_factor} ? " (".(4<<$g_md{$md}->{chunk_factor})."K chunk size) "
-	       : "")
-	     ."of @{$g_md{$md}->{members}}");
-	for my $side ("a".."z") {
-	    my $theside = "side$side";
-	    say("md$md side $side members: @{$g_md{$md}->{$theside}}")
-		if ($g_md{$md}->{$theside});
-	}
-    }
-    $x = 0;
-    use Data::Dumper;
-    for my $vg (sort keys %g_lvm) {
-	say ("LVM CONFIG:") unless $x++;
-	#say ("$vg: @{$g_lvm{$vg}->{devices}}");
-	print Dumper \%g_lvm;
-    }
-
 }
 
-
-=item B<3. BuildNewPartTables>
-
-Calculates the sizes of each partition.
-
-=cut
-
-#-------------------------------------------------------------------------------------------------------------------------
+#****************************************************
+# Build all partition tables
+#****************************************************
 sub BuildNewPartTables{
-
     my ($disk, $mountpoint, $part, $PrimaryMP, $LogicalMP);
-
-    mutter "building partition tables";
-
+    ($test != 1) || (print "\nBuilding partition tables:\n");
     # Build PartMountpoint array
-    foreach $disk (keys %g_DiskMountpoints) {
-
-	next if exists $g_lvm{$disk};
-	$g_DiskMountpoints{$disk} =~ s/\s(\s)/$1/g;
-	$g_DiskMountpoints{$disk} =~ s/^\s//;
-	$g_DiskMountpoints{$disk} =~ s/\s$//;
-
-	foreach $mountpoint(split(/\s/,$g_DiskMountpoints{$disk})) {
-	    $g_PartMountpoint{$g_MountpointPart{$mountpoint}} = $mountpoint;
+    foreach $disk(keys %DiskMountpoints) {
+	$DiskMountpoints{$disk} =~ s/\s(\s)/$1/g;
+	$DiskMountpoints{$disk} =~ s/^\s//;
+	$DiskMountpoints{$disk} =~ s/\s$//;
+	foreach $mountpoint(split(/\s/,$DiskMountpoints{$disk})) {
+	    $PartMountpoint{$MountpointPart{$mountpoint}} = $mountpoint;
 	}
     }
-
-    foreach $disk (keys %g_DiskMountpoints) {
-
-	next if exists $g_lvm{$disk};
+    foreach $disk(keys %DiskMountpoints) {
 	&SetPartitionPositions($disk);
-
         # change units to sectors
-        foreach $mountpoint (split(/\s/,$g_DiskMountpoints{$disk})) {
-
-            if($g_MPPreserve{$mountpoint}){
-
-	        $g_MPStart{$mountpoint} = $g_PartOldStartSec{$g_MountpointPart{$mountpoint}};
-	        $g_MPSize{$mountpoint} = ($g_PartOldEndSec{$g_MountpointPart{$mountpoint}}
-					  - $g_MPStart{$mountpoint} + 1);
-
+        foreach $mountpoint(split(/\s/,$DiskMountpoints{$disk})) {
+            if($MPPreserve{$mountpoint} eq "yes"){
+	        $MPStart{$mountpoint} = $PartOldStartSec{$MountpointPart{$mountpoint}};
+	        $MPSize{$mountpoint} = $PartOldEndSec{$MountpointPart{$mountpoint}} - $MPStart{$mountpoint} + 1;
 	    } else {
-
-	        $g_MPStart{$mountpoint} *= $g_DiskUnits{$disk};
-	        $g_MPSize{$mountpoint} *= $g_DiskUnits{$disk};
-
+	        $MPStart{$mountpoint} *= $DiskUnits{$disk};
+	        $MPSize{$mountpoint} *= $DiskUnits{$disk};
 	        # align first partition for mbr
-	        if ($g_MPStart{$mountpoint} == 0){
-	            $g_MPStart{$mountpoint} += $g_SectorsAlignment{$disk};
-		    $g_MPSize{$mountpoint} -= $g_SectorsAlignment{$disk};
+	        if($MPStart{$mountpoint} == 0){
+	            $MPStart{$mountpoint} += $SectorsAlignment{$disk};
+		    $MPSize{$mountpoint} -= $SectorsAlignment{$disk};
 	        }
 	    }
 	}
-
 	# align all logical partitions
-        foreach $mountpoint (split(/\s/, $g_DiskMountpoints{$disk})) {
-
-            next if ($g_MPPrimary{$mountpoint} eq "yes");
-	    if ($g_MountpointPart{$mountpoint} eq "${disk}5") {
+        foreach $mountpoint(split(/\s/,$DiskMountpoints{$disk})) {
+            next if ($MPPrimary{$mountpoint} eq "yes");
+	    if ($MountpointPart{$mountpoint} eq "${disk}5") {
 	        # partition with number 5 is first logical partition and start of extended partition
-  	        $g_MPStart{"extended$disk"} = $g_MPStart{$mountpoint};
-                ($g_MPPreserve{$mountpoint} eq "yes") && ($g_MPStart{"extended$disk"} -= $g_SectorsAlignment{$disk});
+  	        $MPStart{"extended$disk"} = $MPStart{$mountpoint};
+                ($MPPreserve{$mountpoint} eq "yes") && ($MPStart{"extended$disk"} -= $SectorsAlignment{$disk});
 	    }
-            if ($g_MPPreserve{$mountpoint} ne "yes") {
-  	        $g_MPStart{$mountpoint} += $g_SectorsAlignment{$disk};
-	        $g_MPSize{$mountpoint} -= $g_SectorsAlignment{$disk};
+            if ($MPPreserve{$mountpoint} ne "yes") {
+  	        $MPStart{$mountpoint} += $SectorsAlignment{$disk};
+	        $MPSize{$mountpoint} -= $SectorsAlignment{$disk};
 	    }
 	}
-
         &CalculateExtPartSize($disk);
-
         # sort mountpoints of partition number
         $PrimaryMP = "";
         $LogicalMP = "";
-
-        foreach $mountpoint (split(/\s/, $g_DiskMountpoints{$disk})) {
-	  ($g_MPPrimary{$mountpoint} eq "yes") ? ($PrimaryMP .= " $mountpoint") : ($LogicalMP .= " $mountpoint");
+        foreach $mountpoint(split(/\s/,$DiskMountpoints{$disk})) {
+	  ($MPPrimary{$mountpoint} eq "yes") ? ($PrimaryMP .= " $mountpoint") : ($LogicalMP .= " $mountpoint");
 	}
-	$g_DiskMountpoints{$disk} = "$PrimaryMP$LogicalMP";
-	$g_DiskMountpoints{$disk} =~ s/^\s//;
-
+	$DiskMountpoints{$disk} = "$PrimaryMP$LogicalMP";
+	$DiskMountpoints{$disk} =~ s/^\s//;
 	# print partition table
-        PrintPartitionTable($disk) if $test;
-
+        ($test != 1) || (PrintPartitionTable($disk));
     }
-
-    $g_BootPartition ||= $g_MountpointPart{"/"};
+    if (!$BootPartition){
+        $BootPartition = $MountpointPart{"/"};
+    }
 }
 
-#---------------------------------------------------------------------
-#  SetPartitionPositions($disk)
-#
-# set position for every partition, and updates the globals (sigh)
-#---------------------------------------------------------------------
+#****************************************************
+# set position for every partition
+#****************************************************
 sub SetPartitionPositions{
-
     my $disk = shift;
-    my ($DynGroup, $mountpoint, $StartPos, $EndPos) = ("") x 2;
-
+    my $mountpoint; my $DynGroup =""; my $StartPos; my $EndPos;
     # Build groups of unpreserved partitions between
     # preserved partitions
     $StartPos = 0;
-    foreach $mountpoint(split(/\s/,$g_DiskMountpoints{$disk})) {
-
-        if ($g_MPPreserve{$mountpoint}) {
-
-	    $EndPos =($g_PartOldStart{$g_MountpointPart{$mountpoint}}
-		      - 1);
-
+    foreach $mountpoint(split(/\s/,$DiskMountpoints{$disk})) {
+        if ($MPPreserve{$mountpoint} eq "yes") {
+	    $EndPos = $PartOldStart{$MountpointPart{$mountpoint}} - 1;
             &SetGroupPos($DynGroup,$StartPos,$EndPos);
 	    $DynGroup = "";
-	    $StartPos =($g_PartOldEnd{$g_MountpointPart{$mountpoint}}
-			+ 1);
-
+	    $StartPos = $PartOldEnd{$MountpointPart{$mountpoint}} + 1;
         } else {
 	    $DynGroup .= " $mountpoint";
 	}
     }
-
-    $EndPos = $g_DiskSize{$disk} - 1;
-
+    $EndPos = $DiskSize{$disk} - 1;
     &SetGroupPos($DynGroup,$StartPos,$EndPos);
-
-    # set FAT12 for really small DOS partitions
-    foreach $mountpoint (split(/\s/, $g_DiskMountpoints{$disk})) {
-
-	($g_MPOptions{$mountpoint} =~ /\bdosfat16\b/i)
-	    && (($g_MPSize{$mountpoint} * $g_DiskUnits{$disk}
-		 * $sectorsize) < 32 * $megabyte)
-		&& ($g_MPID{$mountpoint} = 4); # DOS 16-bit FAT <32MB
+    foreach $mountpoint(split(/\s/,$DiskMountpoints{$disk})) {
+	($MPOptions{$mountpoint} =~ /\bdosfat16\b/i)
+	    && (($MPSize{$mountpoint} * $DiskUnits{$disk} * $sectorsize) < 32 * $megabyte)
+		&& ($MPID{$mountpoint} = 4); # DOS 16-bit FAT <32MB
     }
 }
 
-#---------------------------------------------------------------------
-#  SetGroupPos($PartGroup, $Start, $End)
-#
+#****************************************************
 # set position for a group of unpreserved partitions
-# between $Start and $End
-#---------------------------------------------------------------------
+# between start and end
+#****************************************************
 sub SetGroupPos{
-    my ($PartGroup, $Start, $End) = @_;
-
+    my ($PartGroup,$Start,$End) = @_;
     $PartGroup =~ s/^ //;
     ($PartGroup) || return;
-
     my $totalsize = $End - $Start + 1;
     ($totalsize <= 0) && return;
-
-    my ($mountpoint, $mintotal, $maxmintotal, $rest, $EndUnit)
-	= (undef, 0, 0, 0, 0);
-
+    my $mountpoint; my $mintotal = 0; my $maxmintotal = 0; my $rest = 0; my $EndUnit = 0;
     # compute total of MinSizes and difference to MaxSizes
-    foreach $mountpoint (split(/\s/, $PartGroup)) {
-
-        $mintotal +=
-	    $g_MPMinSize{$mountpoint};
-        $maxmintotal +=
-	    ($g_MPMaxSize{$mountpoint} - $g_MPMinSize{$mountpoint});
-
-        $g_MPSize{$mountpoint} = $g_MPMinSize{$mountpoint};
+    foreach $mountpoint (split(/\s/,$PartGroup)) {
+        $mintotal += $MPMinSize{$mountpoint};
+        $maxmintotal += ($MPMaxSize{$mountpoint} - $MPMinSize{$mountpoint});
+        $MPSize{$mountpoint} = $MPMinSize{$mountpoint};
     }
-
     # Test if partitions fit
-    barf "mountpoints $PartGroup do not fit"
-	if $mintotal > $totalsize;
-
+    ($mintotal > $totalsize)
+      && die "ERROR: Mountpoints $PartGroup do not fit.\n";
     # Maximize partitions
     $rest = $totalsize - $mintotal;
     ($rest > $maxmintotal) && ($rest = $maxmintotal);
-
     if ($rest > 0) {
-        foreach $mountpoint (split(/\s/, $PartGroup)) {
-            $g_MPSize{$mountpoint} +=
-		int( ( ($g_MPMaxSize{$mountpoint} -
-			$g_MPMinSize{$mountpoint}   )*$rest )
-		     / $maxmintotal                           );
+        foreach $mountpoint (split(/\s/,$PartGroup)) {
+            $MPSize{$mountpoint} += int ((($MPMaxSize{$mountpoint} - $MPMinSize{$mountpoint}) * $rest) / $maxmintotal);
         }
     }
-
     # compute rest
     $rest = $totalsize;
-    foreach $mountpoint (split(/\s/, $PartGroup)) {
-        $rest -= $g_MPSize{$mountpoint};
+    foreach $mountpoint (split(/\s/,$PartGroup)) {
+        $rest -= $MPSize{$mountpoint};
     }
-
     # Minimize rest
-    foreach $mountpoint (split(/\s/, $PartGroup)) {
-        if (($rest >0) &&
-	    ($g_MPSize{$mountpoint} < $g_MPMaxSize{$mountpoint})){
-
-            $g_MPSize{$mountpoint}++;
+    foreach $mountpoint (split(/\s/,$PartGroup)) {
+        if (($rest >0) && ($MPSize{$mountpoint} < $MPMaxSize{$mountpoint})){
+            $MPSize{$mountpoint}++;
 	    $rest--;
 	}
     }
-
     # Set start for every partition
-    foreach $mountpoint (split(/\s/, $PartGroup)) {
-        $g_MPStart{$mountpoint} = $Start;
-	$Start += $g_MPSize{$mountpoint};
-	$EndUnit = ($g_MPStart{$mountpoint} +
-		    $g_MPSize{$mountpoint} - 1);
+    foreach $mountpoint (split(/\s/,$PartGroup)) {
+        $MPStart{$mountpoint} = $Start;
+	$Start += $MPSize{$mountpoint};
+	$EndUnit = $MPStart{$mountpoint} + $MPSize{$mountpoint} - 1;
     }
 }
 
-#---------------------------------------------------------------------
-#  CalculateExtPartSize($disk)
-# calculate extended partition size for $disk
-#---------------------------------------------------------------------
+#****************************************************
+# calculate extended partition size
+#****************************************************
 sub CalculateExtPartSize{
     my ($disk) = @_;
     my $extmp = "extended$disk";
-    my ($mountpoint, $ExtEnd, $NewEnd);
-
-    ($g_MPPrimary{$extmp}) || return;
-    $ExtEnd = $g_MPStart{$extmp};
-
-    foreach $mountpoint (split(/\s/, $g_DiskMountpoints{$disk})) {
-        next if ($g_MPPrimary{$mountpoint} eq "yes");
-
-	$NewEnd = ($g_MPStart{$mountpoint} +
-		   $g_MPSize{$mountpoint} - 1);
+    my $mountpoint; my $ExtEnd; my $NewEnd;
+    ($MPPrimary{$extmp}) || return;
+    $ExtEnd = $MPStart{$extmp};
+    foreach $mountpoint(split(/\s/,$DiskMountpoints{$disk})) {
+        next if ($MPPrimary{$mountpoint} eq "yes");
+	$NewEnd = $MPStart{$mountpoint} + $MPSize{$mountpoint} - 1;
 	($NewEnd > $ExtEnd) && ($ExtEnd = $NewEnd);
     }
-
-    $g_MPSize{$extmp} = ($ExtEnd - $g_MPStart{$extmp} + 1);
-
+    $MPSize{$extmp} = ($ExtEnd - $MPStart{$extmp} + 1);
 }
 
-#---------------------------------------------------------------------
-#  PrintPartitionTable($disk)
+#****************************************************
 # Print partition "number - mountpoint" table
-#---------------------------------------------------------------------
+#****************************************************
 sub PrintPartitionTable{
-
     my ($disk) = @_;
-    my ($part, $mountpoint, $mountpointname, $end);
-
-    foreach $part (sort keys %g_MountpointPart) {
-
-        next if ($part !~ /^$disk/);
-	$mountpoint = $g_PartMountpoint{$part};
-
+    my $part; my $mountpoint; my $mountpointname; my $end;
+    foreach $part (sort %MountpointPart) {
+        next if($part !~ /^$disk/);
+	$mountpoint = $PartMountpoint{$part};
         if ($mountpoint =~ /^no(.*)/){
             $mountpointname = "no mountpoint ($1)";
 	} else {
 	    $mountpointname = $mountpoint;
 	}
-
-	$end = $g_MPStart{$mountpoint} + $g_MPSize{$mountpoint} - 1;
+	$end = $MPStart{$mountpoint} + $MPSize{$mountpoint} - 1;
 	print <<"EOM";
-/dev/$part $mountpointname start=$g_MPStart{$mountpoint} size=$g_MPSize{$mountpoint} end=$end id=$g_MPID{$mountpoint}
+/dev/$part $mountpointname start=$MPStart{$mountpoint} size=$MPSize{$mountpoint} end=$end id=$MPID{$mountpoint}
 EOM
       }
 }
 
-=item B<4. PartitionPersfdisk>
-
-build all partition tables for sfdisk
-
-=cut
-
-sub PartitionPersfdisk {
-
+#****************************************************
+# build all partition tables for sfdisk
+#****************************************************
+sub PartitionPersfdisk{
     my ($disk, $mountpoint, $line, $part, $PrimaryNo);
     my ($command, $result, $filename, $number);
-
-    say "partitioning with sfdisk";
-
-    foreach $disk (keys %g_DiskMountpoints) {
-
-	next if exists $g_lvm{$disk};
-        $g_sfdiskTables{$disk}
-	    = ("# partition table of device: /dev/$disk\nunit: "
-	       ."sectors\n\n");
+    print "Creating partition table: ";
+    foreach $disk(keys %DiskMountpoints) {
+        $sfdiskTables{$disk} = "# partition table of device: /dev/$disk\nunit: sectors\n\n";
 	$PrimaryNo = 1;
-
-	my $needs_change = 0;
-
-        foreach $mountpoint (split(/\s/, $g_DiskMountpoints{$disk})) {
-
-	    $part = $g_MountpointPart{$mountpoint};
+        foreach $mountpoint(split(/\s/,$DiskMountpoints{$disk})) {
+	    $part = $MountpointPart{$mountpoint};
 	    $part =~ /(\d+)$/;
-
 	    ($1 < 5) && ($PrimaryNo++);
-
 	    if ( ($1 == 5) && ($PrimaryNo < 5) ){
-
 	        for my $number($PrimaryNo..4) {
-
-		    my $device = PartName($disk, $number);
-
-		    $g_sfdiskTables{$disk} .=
-			(BuildsfdiskDumpLine($device,0,0,0)
-			 ."\n");
-		    {
-			no warnings;
-			$needs_change = 1
-			    if ($g_PartOldStart{$device} or
-				$g_PartOldEnd{$device} or
-				$g_PartOldID{$device});
-		    }
+		    $sfdiskTables{$disk} .= BuildsfdiskDumpLine(PartName($disk,$number),0,0,0)."\n";
 	        }
 	    }
-
-	    $line = BuildsfdiskDumpLine
-		($g_MountpointPart{$mountpoint},
-		 $g_MPStart{$mountpoint}, $g_MPSize{$mountpoint},
-		 $g_MPID{$mountpoint});
-	    {
-		no warnings;
-		my $device = $g_MountpointPart{$mountpoint};
-		my $old_start = ($g_PartOldStart{$device})*$g_DiskUnits{$disk}+1;
-		my $old_size = ($g_PartOldEnd{$device} - $g_PartOldStart{$device} + 1)*$g_DiskUnits{$disk} - 1;
-		say("partition table changed; applying changes"),
-		    ($needs_change = 1)
-		    if (abs($old_start - $g_MPStart{$mountpoint})>1 or
-			abs($old_size - $g_MPSize{$mountpoint})>1 or
-			$g_PartOldID{$device} != $g_MPID{$mountpoint});
-	    }
-
-            ($part eq $g_BootPartition) && ($line .= ", bootable");
-            $g_sfdiskTables{$disk} .= "$line\n";
-
+	    $line = BuildsfdiskDumpLine($MountpointPart{$mountpoint},$MPStart{$mountpoint},$MPSize{$mountpoint},$MPID{$mountpoint});
+            ($part eq $BootPartition) && ($line .= ", bootable");
+            $sfdiskTables{$disk} .= "$line\n";
 	}
-
-	print $g_sfdiskTables{$disk} if $needs_change;
-
-	my $tmp_dir = $ENV{LOGDIR} || "/tmp";
-	$filename = ( "$tmp_dir/"
-		      . ( ($disk=~ m{/})
-			  ? join('_', split('/', $disk))
-			  : $disk)
-		      . ".sfdisk" );
-
-	if (($test != 1) && ($filename)) {
-
-	    open(FILE, ">$filename")
-		or die "unable to write temporary file $filename\n";
-
-	    print FILE $g_sfdiskTables{$disk};
+#	print $sfdiskTables{$disk};
+	$filename = "$ENV{LOGDIR}/partition." . (($disk=~ m#/#) ? join('_', split('/', $disk)) : $disk);
+	if(($test != 1) && ($filename)){
+	    open(FILE, ">$filename") || die "unable to write temporary file $filename\n";
+	    print FILE $sfdiskTables{$disk};
 	    close(FILE);
         }
-
-	$command = ("LC_ALL=C sfdisk $g_sfdisk_options /dev/$disk < "
-		    ."$filename");
-
-=pod aii
-
-	    push @{ $parts{$disk} }, $device if $size;
-
-            # Sectors
-            $g_PartOldStartSec{$device} = $start;
-            my $endsec = $g_PartOldEndSec{$device} = $start + $size - 1;
-
-            # DiskUnits
-	    $g_PartOldStart{$device} = int ($start / $g_DiskUnits{$disk});
-	    $g_PartOldEnd{$device} = int ($endsec / $g_DiskUnits{$disk});
-
-	    # Was it aligned properly?
-	    for ( $start, $size ) {
-		my $x = ( $_ / $g_SectorsAlignment{$disk} );
-		if ( abs($x - int($x)) > 1e-9 ) {
-		    $g_OldNotAligned{$device} = "yes";
-		}
-	    }
-
-	    # Other options
-	    $g_PartOldID{$device} = $Id;
-	    $g_PartOldBoot{$device} = ($rest =~ /bootable/) ? "yes" : "";
-
-=cut
-
-
-	if ($test != 1) {
-	    if ($needs_change) {
-		mutter "running: $command";
-		$result = `sh -c "$command"`;
-		barf "sfdisk failed; output:\n$result" if $?;
-	    } else {
-		say "partition table for $disk unchanged";
-	    }
+	$command = "LC_ALL=C sfdisk $sfdisk_options /dev/$disk < $filename";
+	if($test != 1){
+            print "$command\n";
+	    $result = `sh -c "$command"`;
+	    (($? >> 8) == 0) || (die "\nSFDISK ERROR:\n $result\n");
+	    -f "/etc/init.d/udev" && sleep 10; # when using udev, it takes some time until the device entries for each partition are available
 	}
     }
 }
 
-#---------------------------------------------------------------------
-# BuildsfdiskDumpLine($device, $start, $size, $id)
+#****************************************************
 # build a sfdisk dump line
-#---------------------------------------------------------------------
+#****************************************************
 sub BuildsfdiskDumpLine{
 
   sprintf "/dev/%-5s: start=%10s, size=%10s, Id=%3s", at _;
 }
 
-=item B<4b. DoDeepRAIDnLVMmagic>
-
-Sets up RAID devices and LVM partitions :->
-
-FIXME - where is ODS support ?  :-)
-
-=cut
-
-my %new_md;
-
-sub run {
-    my $cmd = shift;
-    my $err_ok = shift;
-
-    say("running: `$cmd`") if ($test or $verbose);
-
-    unless ($test) {
-	my $output = `$cmd`;
-	if ($? and !$err_ok) {
-	    barf("command `$cmd` "
-		 .($? & 255 ? "killed by signal $?"
-		   : "exited with error code".($?>>8)));
-	}
-	if ($err_ok) {
-	    return !$?;
-	}
-    }
-}
-
-sub StopAllRaid {
-
-    # stop any LVM partitions first
-    run("vgchange -an", "yes yes yes");
-
-    my @devices = ( map { /^(md\d+)/ }
-		    grep /\bactive\b/,
-		    `cat /proc/mdstat`);
-
-    say("Stopping running RAID arrays @devices");
-    s{^}{/dev/} foreach @devices;
-
-    my ($count, @failed) = (0, @devices);
-
-    while (@failed and $count != @failed) {
-	(@devices, @failed) = @failed;
-	$count = @devices;
-	foreach (@devices) {
-	    say("stopping $_");
-	    if (!run("raidstop $_",1)) {
-		say("defering $_ (rc=$?)");
-		push @failed, $_;
+#****************************************************
+# Format all disks
+#****************************************************
+sub FormatDisks{
+    my ($disk, $device, $mountpoint, $mountpointname, $command, $result);
+    print "Creating file systems:\n";
+    foreach $disk(keys %DiskMountpoints) {
+        foreach $mountpoint (split(/\s/,$DiskMountpoints{$disk})) {
+	    $device = $MountpointPart{$mountpoint};
+            if ($mountpoint =~ /^no/){
+                $mountpointname = "no mountpoint";
+            } else {
+	        $mountpointname = $mountpoint;
 	    }
-	}
-    }
-    barf("Could not stop raid devices: @failed")
-	if @failed;
-
-    
-
-}
-
-use IO::Handle;
-use Fcntl 'SEEK_END', 'O_RDWR';
-
-sub zapDev {
-    my $device = shift;
-
-    say("Zapping $device");
-    return if $test;
-    my $size = `blockdev --getsize $device`;
-
-    $size > 0 or die "No size ($size) ?";
-    #say ("size of device is $size blocks (".($size*1024)." bytes)");
-
-    sysopen BLOCKDEV, $device, O_RDWR or die "sysopen $device; $!";
-    syswrite(BLOCKDEV, $MegOfNulls);
-
-    my $seek = ($size - 8 * 1024) * 512;
-    #say ("Seeking to $seek");
-    sysseek(BLOCKDEV, $seek, 0) or die $!;
-    #sysseek(BLOCKDEV, -1024*1024*4, 2) or die $!;
-
-    while (syswrite(BLOCKDEV, $MegOfNulls, 2**20)) {
-	#say("Wrote a meg to $device, pos = ".sysseek(BLOCKDEV,0,1));
-    }
-    close BLOCKDEV;
-}
-
-sub DoDeepRAIDnLVMmagic {
-
-    my $raid10_start;
-    if (my @md = sort { $a <=> $b } keys %g_md) {
-
-	open RAIDTAB, ">$ENV{LOGDIR}/raidtab" or die $!;
-	print RAIDTAB RaidTabEntry($_) foreach @md;
-
-	$raid10_start = pop (@md) + 1;
-
-	if (my (@raid10) = (sort { $a <=> $b }
-			    grep { $_ >= $raid10_start }
-			    keys %g_md)) {
-	    print RAIDTAB RaidTabEntry($_) foreach @raid10;
-
-	} else {
-	    $raid10_start = undef;
-	}
-	close RAIDTAB;
-
-    }
-
-    if ($test) {
-	say ("raid tab:");
-	#system("cat $ENV{LOGDIR}/raidtab");
-    }
-
-    my $n;
-    if ($raid10_start) {
-	$n = $raid10_start;
-	while (exists $g_md{$n}) {
-	    if (!$test) {
-		say("Zap'ing partitions: @{$g_md{$n}->{members}}");
-		zapDev("/dev/$_") foreach @{$g_md{$n}->{members}};
+	    # preserved partition
+	    if ( ($MPPreserve{$mountpoint} eq "yes") && ($MPOptions{$mountpoint} !~ /\bformat\b/i)){
+  	        print "Preserve partition $device";
+                if ($mountpoint =~ /^no$1/){
+                    print " with no mountpoint\n";
+                } else {
+	            print " with mountpoint $mountpoint\n";
+	        }
+		next;
 	    }
-	    run("mkraid --configfile $ENV{LOGDIR}/raidtab "
-		."/dev/md$n");
-	    $n++;
-	}
-    }
-
-    $n = 0;
-    while (exists $g_md{$n} and ( defined $raid10_start ?
-				  ( $n < $raid10_start ) : 1 ) ) {
-	if (!$test) {
-	    say("Zap'ing partitions: @{$g_md{$n}->{members}}");
-	    zapDev("/dev/$_") foreach @{$g_md{$n}->{members}};
-	}
-	run("mkraid --configfile $ENV{LOGDIR}/raidtab "
-	    ."/dev/md$n");
-
-	# re-configure the device, etc
-	if (my $mountpoint = $g_md{$n}->{mountpoint}) {
-	    $g_MountpointPart{$mountpoint} = "md$n";
-	}
-
-	$n++
-    }
-
-    my $vgs = [];
-    while (my $vg = each %g_DiskMountpoints) {
-	my $vg_entry;
-	next unless $vg_entry = $g_lvm{$vg};
-
-	# first, blat all the PVs
-	say ("blatting existing PVs ( got backups? :-> )");
-	$vg_entry->{name} = $vg;
-	$vg_entry->{pvs} = [keys %{{ map { $_ => 1 }
-					 @{$vg_entry->{devices}}}}];
-	for my $pv (@{$vg_entry->{pvs}}) {
-	    say("zero'ing first block of $pv");
-	    zapDev($pv);
-	}
-	push @$vgs, $vg_entry;
-    }
-
-    if (@$vgs) {
-
-	say("Setting up LVM fake /etc & /dev...");
-	( ! -d "/tmp/fake" ) && do {
-	    mkdir("/tmp/fake") or die $!;
-	    run("cp -ax /etc /dev /tmp/fake");
-	    run("mount --bind /tmp/fake/etc /etc");
-	    run("mount --bind /tmp/fake/dev /dev");
-	};
-	run("rm -rf /etc/lvm*");
-	foreach my $vg_entry (@$vgs) {
-	    if ( -e "/dev/$vg_entry->{name}" ) {
-		run("rm -rf /dev/$vg_entry->{name}");
+	    # lazy format
+	    if ( ( $MPOptions{$mountpoint} =~ /\blazyformat\b/i )
+              && ($MPStart{$mountpoint} == $PartOldStartSec{$device})
+              && (($MPStart{$mountpoint} + $MPSize{$mountpoint} - 1) == $PartOldEndSec{$device}) ){
+	        print "Lazy format: $device";
+                if ($mountpoint =~ /^no$1/){
+                    print " with no mountpoint";
+                } else {
+	            print " with mountpoint $mountpoint";
+	        }
+                print " was neither moved nor formated.\n";
+		next;
 	    }
-	}
-
-	# vgscan, should return nothing
-	run("vgscan");
-
-	foreach my $vg_entry (@$vgs) {
-	    my $vg_name = $vg_entry->{name};
-	    for my $pv (@{$vg_entry->{pvs}}) {
-		zapDev($pv);
-		say("Creating PV $pv");
-		run("yes | pvcreate $pv");
+	    # swap
+	    if ($mountpoint =~ /^swap/i) {
+#	        print "Make swap partition:\n";
+	        $command = "mkswap $mkswap_options";
+		($MPOptions{$mountpoint} =~ /(\-c)\b/i) && ($command .= " $1");
+		push @swaplist, "/dev/$device";
+		$command .= " /dev/$device";
+	        print "  $command\n";
+	        if($test != 1){
+	            $result = `$command`;
+		    (($? >> 8) == 0) || (die "\nMKSWAP ERROR:\n $result\n");
+		}
+		next;
 	    }
-	    say("Creating Volume Group $vg_name");
-	    run("vgcreate /dev/$vg_name @{$vg_entry->{pvs}}");
-
-	    say("$vg_name created, now to set up: "
-		.join(", ", keys %{$vg_entry->{lvs}}));
-
-	    while (my ($lvname, $mountpoint)
-		   = each %{$vg_entry->{lvs}}) {
-
-		# you generally don't care about automagically setting
-		# the size with LVM...
-		my $size = $g_MPMinSize{$mountpoint};
-		my $roundedsize = ((($size) * $g_DiskUnits{$vg_name} * $sectorsize)>>20)."M";
-
-		my $which_pv = "";
-		if ($g_MPOptions{$mountpoint} =~ m{\bpv\s*\(\s*(\S+)\s*\)}) {
-		    $which_pv = " $1";
+	    # Linux Reiser file system
+	    if ($MPOptions{$mountpoint} =~ /\breiser\b/i) {
+#	        print "Make Reiser Filesystem:\n";
+	        $command = "echo y | mkreiserfs $mkreiserfs_options";
+		($MPOptions{$mountpoint} =~ /(\-h\s*\w+)\b/) && ($command .= " $1");
+		($MPOptions{$mountpoint} =~ /(\-v\s*\d+)\b/) && ($command .= " $1");
+		$command .= " /dev/$device";
+		print "  $command\n";
+		if ($test != 1){
+		    $result = `$command`;
+		    (($? >> 8) == 0) || die "\nMKREISERFS ERROR:\n $result\n";
 		}
-		run("lvcreate -n $lvname -L $roundedsize /dev/$vg_name");
-
-		FormatMountPoint($mountpoint);
-		$g_PartMountpoint{$mountpoint} = "$vg_name/$lvname";
-		$g_MountpointPart{"$vg_name/$lvname"} = $mountpoint;
-		
+		next;
 	    }
-	}
-    }
-}
-
-sub RaidTabEntry {
-    my $dev = shift;
-    my $x = $g_md{$dev};
-
-    my $entry = "raiddev /dev/md$dev\n";
-    my $aii = sub { $entry .= sprintf "    %-24s %s\n", @_ };
-
-    $aii->("raid-level", $x->{level});
-    $aii->("chunk-size", (4<<($x->{chunk_factor}||=8)));
-    $aii->("persistent-superblock", "1");
-
-    # RAID 10 is a special case
-    if ($x->{sidea}) {
-
-	my @sides = map { $x->{"side$_"} || () } ("a".."z");
-
-	my $top_md = ((sort {$b <=> $a} keys %g_md)[0]);
-
-	my @new_members;
-
-	while (my $side = shift @sides) {
-
-	    $g_md{++$top_md} = {
-				level => "0",
-				members => $side,
-				chunk_factor => $x->{chunk_factor}
-			       };
-
-	    push @new_members, "md$top_md";
-	}
-
-	$x->{members} = \@new_members;
-
-    }
-
-    $aii->("nr-raid-disks", scalar(@{$x->{members}}));
-
-    my $num = 0;
-    for my $device (sort @{$x->{members}}) {
-	$aii->("device", "/dev/$device");
-	$aii->("raid-disk", $num++);
-    }
-
-    return $entry;
-}
-
-
-=item B<5. FormatDisks>
-
-Formats all disks
-
-=cut
-
-sub FormatDisks{
-
-    my ($disk, $device, $mountpoint, $mountpointname, $command,
-	$result);
-
-    say "formatting disks";
-
-    foreach $disk (keys %g_DiskMountpoints) {
-	next if exists $g_lvm{$disk};
-        foreach $mountpoint (split(/\s/, $g_DiskMountpoints{$disk})) {
-	    say("formatting $mountpoint");
-	    FormatMountPoint($mountpoint);
+	    # Linux XFS file system
+	    if ($MPOptions{$mountpoint} =~ /\bxfs\b/i) {
+#	        print "Make XFS Filesystem:\n";
+	        $command = "mkfs.xfs $mkxfs_options";
+		$command .= " /dev/$device";
+		print "  $command\n";
+		if ($test != 1){
+		    $result = `$command`;
+		    (($? >> 8) == 0) || die "\nMKFS.XFS ERROR:\n $result\n";
+		}
+		next;
+	    }
+	    # Linux Extended 2 file system
+	    if ($MPOptions{$mountpoint} =~ /\b(ext[23]|auto)\b/i) {
+#	        print "Make Extended 2/3 Filesystem:\n";
+	        $command = "mke2fs $mke2fs_options";
+		($MPOptions{$mountpoint} =~ /(\-c)\b/i) && ($command .= " $1");
+		($MPOptions{$mountpoint} =~ /(\-i\s*\d+)\b/) && ($command .= " $1");
+		($MPOptions{$mountpoint} =~ /(\-m\s*\d+)\b/) && ($command .= " $1");
+		($MPOptions{$mountpoint} =~ /(\-j)\b/) && ($command .= " $1");
+		$command .= " /dev/$device";
+		print "  $command\n";
+		if ($test != 1){
+		    $result = `$command`;
+		    (($? >> 8) == 0) || die "\nMKE2FS ERROR:\n $result\n";
+		}
+		next;
+	    }
+	    # DOS 16bit FAT / Win95 FAT 32
+	    if ($MPOptions{$mountpoint} =~ /\b(dosfat16|winfat32)\b/i) {
+	        print "Clear first sector for DOS/Windows\n";
+	        $command = "dd if=/dev/zero of=/dev/$MountpointPart{$mountpoint} bs=512 count=1";
+		print "  $command\n";
+		if ($test != 1){
+		    $result = `$command`;
+		    (($? >> 8) == 0) || die "\nDD ERROR:\n $result\n";
+		}
+		next;
+	    }
         }
     }
 }
 
-sub FormatMountPoint{
-    my $mountpoint = shift;
-
-    my $device = $g_MountpointPart{$mountpoint};
-    my ($mountpointname, $command, $result);
-
-    if ($mountpoint =~ /^no/){
-	$mountpointname = "no mountpoint";
-    } else {
-	$mountpointname = $mountpoint;
-    }
-
-    say("considering format for $mountpoint, options are : ".$g_MPOptions{$mountpoint});
-
-    # preserved partition
-    if ( $g_MPPreserve{$mountpoint} &&
-	 ($g_MPOptions{$mountpoint} !~ /\bformat\b/i)){
-
-	say("preserving partition $device".
-	    ($mountpoint =~ /^no/
-	     ? " with no mountpoint\n"
-	     : " with mountpoint $mountpoint\n"));
-
-    }
-
-    # lazy format
-    elsif ( ( $g_MPOptions{$mountpoint} =~ /\blazyformat\b/i ) &&
-	 ( $g_MPStart{$mountpoint}
-	   == $g_PartOldStartSec{$device} ) &&
-	 ( ($g_MPStart{$mountpoint} +
-	    $g_MPSize{$mountpoint} - 1)
-	   == $g_PartOldEndSec{$device}) ) {
-
-	say("preserving partition (lazy) $device "
-	    . ($mountpoint =~ /^no$1/
-	       ? "with no mountpoint"
-	       : "with mountpoint $mountpoint"));
-    }
-
-    # swap
-    elsif ($mountpoint =~ /^swap/i) {
-
-	say "making swap partition on $device";
-
-	$command = "mkswap $g_mkswap_options";
-
-	($g_MPOptions{$mountpoint} =~ /(\-c)\b/i)
-	    && ($command .= " $1");
-
-	$command .= " /dev/$device";
-
-	mutter("running: $command");
-	if($test != 1){
-	    $result = `$command`;
-	    barf "`$command' failed; output:\n$result" if $?;
-	}
-    }
-
-    # just wants to be cleared
-    elsif ( $g_MPOptions{$mountpoint}
-	 =~ /\b(?:zap|(dosfat16|winfat32))\b/i ) {
-
-	say("ZAP'ing first sector of $device"
-	    .($1 ? " for a $1 filesystem" : ""));
-
-	$command = ("dd if=/dev/zero "
-		    ."of=/dev/$g_MountpointPart{$mountpoint}"
-		    ." bs=512 count=1");
-
-	mutter "running: $command";
-
-	if ($test != 1){
-	    $result = `$command`;
-	    barf "`$command' failed; output:\n$result" if $?;
-	}
-    }
-
-    # Linux Reiser file system
-    elsif ($g_MPOptions{$mountpoint} =~ /\breiser\b/i) {
-
-	say "making ReiserFS filesystem on $device";
-
-	$command = "echo y | mkreiserfs $g_mkreiserfs_options";
-
-	($g_MPOptions{$mountpoint} =~ /(\-h\s*\w+)\b/)
-	    && ($command .= " $1");
-	($g_MPOptions{$mountpoint} =~ /(\-v\s*\d+)\b/)
-	    && ($command .= " $1");
-
-	$command .= " /dev/$device";
-
-	mutter "running: $command\n";
-	if ($test != 1){
-	    $result = `$command`;
-	    barf "`$command' failed; output:\n$result" if $?;
-	}
-    }
-
-    # Linux Extended 2 file system
-    elsif ($g_MPOptions{$mountpoint} =~ /\b(ext[23]|auto)\b/i) {
-
-	say "making Extended 2/3 filesystem on $device";
-
-	my $opt = "";
-	if ($1 ne "ext2") {
-	    $opt = " -j";
-	}
-
-	$command = "mke2fs $opt $g_mke2fs_options";
-
-	($g_MPOptions{$mountpoint} =~ /(\-c)\b/i)
-	    && ($command .= " $1");
-	($g_MPOptions{$mountpoint} =~ /(\-i\s*\d+)\b/)
-	    && ($command .= " $1");
-	($g_MPOptions{$mountpoint} =~ /(\-m\s*\d+)\b/)
-	    && ($command .= " $1");
-	($g_MPOptions{$mountpoint} =~ /(\-j)\b/)
-	    && ($command .= " $1");
-
-	$command .= " /dev/$device";
-
-	mutter "running: $command\n";
-	if ($test != 1){
-	    $result = `$command`;
-	    barf "`$command' failed; output:\n$result" if $?;
-	}
-    }
-}
-
-=item B<6. WriteFSTab>
-
-Build fstab and write it to <root>/etc/fstab
-
-=cut
-
-sub BuildfstabLine{
-    sprintf "%-23s %-15s   %-6s  %-8s  %-4s %-4s\n", @_;
-}
-
+#****************************************************
+# Build fstab and write it to <root>/etc/fstab
+#****************************************************
 sub WriteFSTab{
-
     my ($FileSystemTab, $device, $type, $filename);
-
-    say "writing fstab";
-
     $FileSystemTab  = << "EOM";
 # /etc/fstab: static file system information.
 #
-#<file sys>             <mount point>     <type>   <options>   <dump>   <pass>
+#<file sys>          <mount point>     <type>   <options>   <dump>   <pass>
 EOM
-
     # 1. /
-    $type = "auto";
-    ($g_MPOptions{'/'} =~ /\b(reiser)\b/i) && ($type = "reiserfs");
-    ($g_MPOptions{'/'} =~ /\b(ext3)\b/i) && ($type = "ext3");
-    ($g_MPOptions{'/'} =~ /\b(ext2)\b/i) && ($type = "ext2");
-
-    $FileSystemTab .=
-	BuildfstabLine("/dev/$g_MountpointPart{'/'}", "/", $type,
-		       $g_MPfstaboptions{'/'}, 0, 1);
-
+    $type = "ext2";
+    ($MPOptions{'/'} =~ /\b(reiser)\b/i) && ($type = "reiserfs");
+    ($MPOptions{'/'} =~ /\b(xfs)\b/i) && ($type = "xfs");
+    ($MPOptions{'/'} =~ /\b(ext3)\b/i) && ($type = "ext3");
+    ($MPOptions{'/'} =~ /\b(ext2)\b/i) && ($type = "ext2");
+    $FileSystemTab .= BuildfstabLine("/dev/$MountpointPart{'/'}","/",$type,$MPfstaboptions{'/'},0,1);
     # 2. swap partitions
-    foreach my $mountpoint (%g_PartMountpoint){
+    foreach my $mountpoint (%PartMountpoint){
 	next if( $mountpoint !~ /^swap/i);
-	$FileSystemTab .=
-	    BuildfstabLine("/dev/$g_MountpointPart{$mountpoint}",
-                           "none", "swap",
-			   $g_MPfstaboptions{$mountpoint}, 0, 0);
+	$FileSystemTab .= BuildfstabLine("/dev/$MountpointPart{$mountpoint}",
+                           "none","swap",$MPfstaboptions{$mountpoint},0,0);
     }
-    # 2.5. /tmp
-    $FileSystemTab .=
-            BuildfstabLine("swap", "/tmp", "tmpfs",
-                           "defaults", 0, 0);
-
     # 3. /proc
-    $FileSystemTab .=
-	BuildfstabLine("none", "/proc", "proc", "rw,nosuid,noexec", 0, 0);
-
+    $FileSystemTab .= BuildfstabLine("none","/proc","proc","defaults",0,0);
     # 4. sorted others
-    foreach my $mountpoint (sort keys %g_PartMountpoint){
-
-	next unless $mountpoint =~ m{^/.+};
-
-	$device = $g_MountpointPart{$mountpoint};
-	$type = "auto";
-	($g_MPOptions{$mountpoint} =~ /\b(dosfat16|winfat32)\b/i)
-	    && ($type = "vfat");
-	($g_MPOptions{$mountpoint} =~ /\b(reiser)\b/i)
-	    && ($type = "reiserfs");
-	($g_MPOptions{$mountpoint} =~ /\b(ext3)\b/i)
-	    && ($type = "ext3");
-	($g_MPOptions{$mountpoint} =~ /\b(ext2)\b/i)
-	    && ($type = "ext2");
-
-	$FileSystemTab .=
-	    BuildfstabLine("/dev/$device", $mountpoint, $type,
-			   $g_MPfstaboptions{$mountpoint}, 0, 2);
+    foreach my $mountpoint (sort %PartMountpoint){
+	next if ( ($mountpoint !~ m#^/#) || ($mountpoint eq "/"));
+	$device = $MountpointPart{$mountpoint};
+	$type = "ext2";
+	($MPOptions{$mountpoint} =~ /\b(dosfat16|winfat32)\b/i) && ($type = "vfat");
+	($MPOptions{$mountpoint} =~ /\b(reiser)\b/i) && ($type = "reiserfs");
+	($MPOptions{$mountpoint} =~ /\b(xfs)\b/i) && ($type = "xfs");
+	($MPOptions{$mountpoint} =~ /\b(ext3)\b/i) && ($type = "ext3");
+	($MPOptions{$mountpoint} =~ /\b(ext2)\b/i) && ($type = "ext2");
+	$FileSystemTab .= BuildfstabLine("/dev/$device",$mountpoint,$type,$MPfstaboptions{$mountpoint},0,2);
     }
-
-    # write it!
-    my ($tmp_dir) = $ENV{LOGDIR} || "/tmp";
-    $filename = "$tmp_dir/fstab";
-
-    print $FileSystemTab;
-
+    # write it
+    $filename = "$ENV{LOGDIR}/fstab";
+#    print $FileSystemTab;
+    print "Write fstab to $filename\n" if $verbose;
     if($test != 1){
-	open(FILE, ">$filename")
-	    or barf "unable to write to $filename; $!";
+	open(FILE, ">$filename") || die "unable to write fstab $filename\n";
 	print FILE $FileSystemTab;
 	close(FILE);
     }
 }
 
-=item B<7. WriteFAIVariables>
+#****************************************************
+# Build fstab line
+#****************************************************
+sub BuildfstabLine{
 
-Write all relevant FAI variables of this program to file.
+    sprintf "%-10s   %-15s   %-6s  %-8s  %-4s %-4s\n", at _;
+}
 
-This includes:
-
-  BOOT_DEVICE
-  ROOT_PARTITION
-  BOOT_PARTITION
-
-=cut
-
+#****************************************************
+# Write all FAI variables of this program to file
+#****************************************************
 sub WriteFAIVariables{
 
-    say "writing FAI variables to file $g_FAIOutputFile";
-    return if $test;
+  my $swaps;
 
-    open(FILE, ">$g_FAIOutputFile")
-	or barf "unable to write to $g_FAIOutputFile; $!";
-
+  print "Write FAI variables to file $FAIOutputFile\n" if $verbose;
+    return if ($test == 1);
+  $swaps = join ' ', at swaplist;
+    open(FILE, ">$FAIOutputFile") || die "Unable to write file $FAIOutputFile\n";
     print FILE << "EOM";
-BOOT_DEVICE=/dev/$g_BOOT_DEVICE
-ROOT_PARTITION=/dev/$g_MountpointPart{'/'}
-BOOT_PARTITION=/dev/$g_BootPartition
+BOOT_DEVICE=/dev/$BOOT_DEVICE
+ROOT_PARTITION=/dev/$MountpointPart{'/'}
+BOOT_PARTITION=/dev/$BootPartition
+SWAPLIST="$swaps"
 EOM
-
     close(FILE);
 }
-
-__END__
-
-=head1 BASIC MATH
-
-Fish, anyone?
-
-  chunk factor    resultant chunk size
-       0                  4k
-       4                 64k
-       8                  1M
-
-=head1 CREDITS
-
- This script is part of FAI (Fully Automatic Installation)
- Copyright (c) 1999, 2000 by ScALE Workgroup, Universitaet zu Koeln
- Copyright (c) 2000-2002 by Thomas Lange, Uni Koeln
-
- Code refactoring, LVM/RAID support and POD manual page:
- Copyright (c) 2003, Sam Vilain
-
-=head1 LICENSE
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
-MA 02111-1307, USA.
-
-=cut




More information about the Fai-commit mailing list