Provided by: fai-setup-storage_3.4.8ubuntu5_all bug

NAME

       setup-storage - automatically prepare storage devices

SYNOPSIS

       setup-storage [-X] [-f filename] [-d] [-h]

DESCRIPTION

       Using  FAI  disk_config files, setup-storage computes effective partition and volume sizes
       and executes the necessary commands to configure storage devices. It manages  disk  drives
       as  well  as  RAID  and LVM volumes. It handles all file systems supported by parted(8) as
       well as ntfs but is flexible enough to be extended to further types  as  well.   Once  the
       storage devices are prepared, an appropriate fstab(5) file is generated.

       Without  the  -X  parameter  setup-storage  runs  in  test-only  mode and does not execute
       commands other than writing disk labels to a blank disk.

       The exit code of setup-storage is 0 if all operations were performed successfully and non-
       zero if an error occurs.

USAGE

       To   enable   the   use  of  the  new  partioning  tool  setup-storage  you  have  to  set
       USE_SETUP_STORAGE=1   in   the    according    class    file    in    configspace    (like
       /srv/fai/config/class/FAIBASE.var for example).

OPTIONS

       -X     Really  write  the configuration to disk. Otherwise setup-storage runs in test-only
              mode.

       -f filename
              Normally setup-storage selects an appropriate configuration from  $FAI/disk_config/
              by  picking  the first class from classes that has an existing file.  If however -f
              is given the configuration in filename is used.

       -d     Enable debugging output.

       -h     Display the synopsis and version info and exit.

ENVIRONMENT

       setup-storage will use the following environment variables:

       disklist
              The disklist variable  must  contain  a  newline  separated  list  of  disk  drives
              available  in  the system. Their order matters as they may be referred to as disk1,
              etc. in disk_config.

       debug  If debug is set to a non-zero value all actions and details to track the  operation
              of setup-storage are printed to stderr.

       FAI    The location of the config space to find the disk_config directory.

       classes
              The list of FAI classes to determine the appropriate configuration to choose.

       LOGDIR setup-storage generates disk_var.sh and fstab (see below) in this directory.

       flag_initial
              This  variable determines if partitions should be preserved when they are tagged as
              to be preserved. Normally set by the list of FAI flags (FAI_FLAGS).

FILES

       If  setup-storage  executes  successfully,  an  fstab(5)  file  matching   the   specified
       configuration  is  generated as $LOGDIR/fstab. Furthermore the file $LOGDIR/disk_var.sh is
       generated.  This  file  defines  the  following  variables,  if  not  yet  set:  SWAPLIST,
       ROOT_PARTITION,  BOOT_PARTITION  (which is only set in case this resides on a disk drive),
       and BOOT_DEVICE.  The latter two describe the partition and disk/RAID/LVM  device  hosting
       the  mount point for /boot. If /boot has no extra mount point, / is used instead.  You may
       source $LOGDIR/disk_var.sh to get the variables set.

SYNTAX

       This section describes the syntax of disk_config files

       file ::= <lines> EOF

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

       comment ::= #.*

       config ::= disk_config lvm( <lvmoption>)*
                  | disk_config raid( <raidoption>)*
                  | disk_config cryptsetup( <cryptsetupoption>)*
                  | disk_config tmpfs
                  | 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; may contain shell globbing such
                   * as /dev/disk/by-id/scsi-* */
                  | <volume>

       lvmoption ::= /* empty */
                  | preserve_always:[^/,\s\-]+-[^/,\s\-]+(,[^/,\s\-]+-[^/,\s\-]+)*
                  /* preserve volumes -- always */
                  | preserve_reinstall:[^/,\s\-]+-[^/,\s\-]+(,[^/,\s\-]+-[^/,\s\-]+)*
                  /* preserve volumes -- unless the system is installed for the
                  first time */
                  | preserve_lazy:[^/,\s\-]+-[^/,\s\-]+(,[^/,\s\-]+-[^/,\s\-]+)*
                  /* preserve volumes -- unless these don't exist yet */
                  | always_format:[^/,\s\-]+-[^/,\s\-]+(,[^/,\s\-]+-[^/,\s\-]+)*
                  /* run mkfs on the volumes, even if marked as preserve */
                  | resize:[^/,\s\-]+-[^/,\s\-]+(,[^/,\s\-]+-[^/,\s\-]+)*
                  /* attempt to resize partitions */
                  | fstabkey:(device|label|uuid)
                  /* when creating the fstab, the key used for defining the device
                  may be the device (/dev/xxx), a label given using -L, or the uuid
                  */

       raidoption ::= /* empty */
                  | preserve_always:[[:digit:]]+(,[[:digit:]]+)*
                  /* preserve volumes -- always */
                  | preserve_reinstall:[[:digit:]]+(,[[:digit:]]+)*
                  /* preserve volumes -- unless the system is installed for the
                  first time */
                  | preserve_lazy:[[:digit:]]+(,[[:digit:]]+)*
                  /* preserve volumes -- unless these don't exist yet */
                  | always_format:[[:digit:]]+(,[[:digit:]]+)*
                  /* run mkfs on the volumes, even if marked as preserve */
                  | fstabkey:(device|label|uuid)
                  /* when creating the fstab the key used for defining the device
                  may be the device (/dev/xxx), a label given using -L, or the uuid
                  */

       cryptsetupoption ::= /* empty */
                  | randinit
                  /* initialise all encrypted partitions with random data */

       option ::= /* empty */
                  | preserve_always:[[:digit:]]+(,[[:digit:]]+)*
                  /* preserve partitions -- always */
                  | preserve_reinstall:[[:digit:]]+(,[[:digit:]]+)*
                  /* preserve partitions -- unless the system is installed for the
                  first time */
                  | preserve_lazy:[[:digit:]]+(,[[:digit:]]+)*
                  /* preserve partitions -- unless these don't exist yet */
                  | always_format:[[:digit:]]+(,[[:digit:]]+)*
                  /* run mkfs on the partitions, even if marked as preserve */
                  | resize:[[:digit:]]+(,[[:digit:]]+)*
                  /* attempt to resize partitions */
                  | disklabel:(msdos|gpt|gpt-bios)
                  /* 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 */
                  | fstabkey:(device|label|uuid)
                  /* when creating the fstab the key used for defining the device
                  may be the device (/dev/xxx), a label given using -L, or the uuid
                  */
                  | sameas:(disk[[:digit:]]+|[^[:space:]]+)
                  /* Indicate that this disk will use the same scheme
                  as the given device. The referenced device must be
                  defined before the device using this option. Use only
                  with identical hardware.
                  */
                  | align-at:([[:digit:]]+[kKMGTPiB]*)
                  /* Align partitions at multiples of the given block size (unit
                  defaults to MiB, if omitted). Such an alignment, e.g., 4K, might be
                  important for proper performance of RAID arrays which use a logical
                  block size other than the sector size of the underlying disks. It
                  must, however, always be a multiple of this sector size.
                  */

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

       type ::= primary
                /* for physical disks only */
                | logical
                /* for physical disks only */
                | raid[0156]
                /* raid level */
                | luks
                /* encrypted partition using LUKS */
                | tmp
                /* encrypted partition for /tmp usage, will be
                   recreated with a random key at each boot and
                   reformatted as ext2 */
                | swap
                /* encrypted partition for swap space usage, will
                   be recreated with a random key at each boot and
                   reformatted as swap space */
                | [^/[:space:]]+-[^/[:space:]]+
                /* lvm logical volume: vg name and lv name*/

       mountpoint ::= (-|swap|/[^[:space:]]*)
                      /* do not mount, mount as swap, or mount at fully qualified path */

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

       sizespec ::= RAM:[[:digit:]]+%|[[:digit:]]+[kKMGTP%iB]*
                /* size in kilo (KiB), mega (default, MiB), giga (GiB), tera (TiB),
                 * petabytes (PiB) or percentage of disk size or RAM size; integers
                 * only, no decimal numbers.
                 * In future releases KB, MB, GB, ... will be treated as 1000 instead
                 * of 1024 (KiB, MiB, GiB, ...) multipliers */

       size ::= <sizespec>(-(<sizespec>)?)?(:resize)?
                /* size, possibly given as a range; physical partitions or lvm logical
                 * volumes only */
                | -<sizespec>(:resize)?
                /* size given as upper limit; physical partitions or lvm logical
                 * volumes only */
                | [^,:[:space:]]+(:(spare|missing))*(,[^,:[:space:]]+(:(spare|missing))*)*
                /* devices and options for a raid or lvm vg */

       tmpfs_size ::= <sizespec>
                /* tmpfs size */

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

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

       fs_options ::= (createopts=".*"|tuneopts=".*"|(pv|vg|lv|md)createopts=".*")*
                      /* options to append to mkfs.xxx and to the filesystem-specific
                       * tuning tool, pvcreate, vgcreate, lvcreate or mdadm */

MIGRATION FROM SETUP_HARDDISKS

       The major differences to the prior configuration syntax are:

       ·      The disk_config ... line allows for the keywords lvm and raid

       ·      Options may need to be appended to the disk_config line

       ·      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 using createopts="".

       ·      The  "preserveX"  and  "boot"  options  are  one  of  the  options now given on the
              disk_config line, using preserve_reinstall, preserve_always, or preserve_lazy,  and
              bootable.   preserve_always is equivalent to the previous preserveX option, whereas
              preserve_reinstall preserves the partition unless "initial" is given as one of  the
              FAI_FLAGS. preserve_lazy allows to preserve partitions only if these exist already.
              Otherwise they are created.

       ·      The "always_format"  option  overrides  preserving  filesystems  (via  one  of  the
              "preserveX" options), like the "format" option in setup_harddisks.

       ·      Support for LVM and RAID is completely new

       ·      Resizing partitions and filesystems is supported

EXAMPLES

       Simple configuration of /dev/hda

       disk_config hda preserve_always:6,7 disklabel:msdos bootable:3

       primary   /boot     20-100    ext3      rw
       primary   swap      1000      swap      sw
       primary   /         12000     ext3      rw        createopts="-b 2048"
       logical   /tmp      1000      ext3      rw,nosuid
       logical   /usr      5000      ext3      rw
       logical   /var      10%-      ext3      rw
       logical   /nobackup 0-        xfs       rw

       ·      Preserve the 6th and the 7th partition. The disklabel is msdos which is the default
              for x86. Furthermore the 3rd partition is made bootable.

       ·      Create a primary partition /dev/hda1 with a size between 20 and 100 MiB  and  mount
              it read-write as /boot; it is formatted using ext3 filesystem.

       ·      /dev/hda2 will be a swap space of 1000 MiB

       ·      /dev/hda3  should  be  formatted  using ext3 filesystem; when calling mkfs.ext3 the
              option "-b 2048" is appended.

       ·      Create the logical partition /dev/hda5

       ·      Make /dev/hda7 at least 10% of the disk size

       ·      Use mkfs.xfs to format the partition 8

       Create a softRAID

              disk_config raid
              raid1 /  sda1,sdd1                         ext2 rw,errors=remount-ro
              raid0 -  disk2.2,sdc1,sde1:spare:missing   ext2 default

       ·      Create a RAID-1 on /dev/sda1 and /dev/sdd1, format using mkfs.ext2 and mount it  as
              /

       ·      Create  a  RAID-0  on  the  second  partition  of  the  second disk, /dev/sdc1, and
              /dev/sde1 as a spare partition. The latter may be missing.

       Simple LVM example

              disk_config sda bootable:1
              primary        /boot  500     ext3      rw
              primary        -      4096-   -         -

              disk_config lvm
              vg             my_pv  sda2
              my_pv-_swap    swap   2048    swap      sw
              my_pv-_root    /      2048    ext3      rw

       Crypt example

              disk_config /dev/sdb
              primary   /         21750     ext3      defaults,errors=remount-ro
              primary   /boot     250       ext3      defaults
              logical   -         4000      -         -
              logical   -         2000      -         -
              logical   -         10-       -         -

              disk_config cryptsetup
              swap      swap      /dev/sdb5 swap      defaults
              tmp       /tmp      /dev/sdb6 ext2      defaults
              luks      /local00  /dev/sdb7 ext3      defaults,errors=remount-ro  createopts="-m0"

       tmpfs example

              disk_config tmpfs
              tmpfs     /tmp      RAM:20%   defaults
              tmpfs     /scratch  3GiB      defaults

       ·      Mount a tmpfs on /tmp with a maximum size equal to 20% of the total amount  of  RAM
              in the machine. This is equivalent to using size=20% in the tmpfs mount options.

       ·      Mount a tmpfs on /scratch with a maximum size of 3 GiB.

       External log device example

              disk_config /dev/sda fstabkey:uuid bootable:2
              primary   /         20GiB     ext3                          defaults
              primary   /boot     250       ext2                          defaults
              primary   swap      4GiB      swap                          defaults
              logical   -         256       ext3_journal                  -
              logical   -         256       ext4_journal                  -
              logical   -         256       xfs_journal                   -

              disk_config /dev/sdb fstabkey:uuid
              primary   /mnt/ext3 33%       ext3:journal=/dev/sda5        defaults
              primary   /mnt/ext4 33%       ext4:journal=/dev/sda6        defaults
              primary   /mnt/xfs  33%       xfs:journal=/dev/sda7         defaults

       ·      Mount an ext3 filesystem on /dev/sdb1 with an external journal on /dev/sda5

       ·      Mount an ext4 filesystem on /dev/sdb2 with an external journal on /dev/sda6

       ·      Mount an XFS filesystem on /dev/sdb3 using /dev/sda7 as the log device

CAVEATS

       ·      Partition  UUID cannot be obtained: In case a partition was previously used as part
              of a software RAID volume and now is intended as swap space, udev fails when  asked
              for  a  UUID.  This  happens  because  mkswap  does not overwrite the previous RAID
              superblock. You can remove it using mdadm --zero-superblock <device>.

       ·      Machine does not boot because not partition is marked as bootable: If the  bootable
              option  is not specified, not partition will be marked as such. Modern BIOSes don't
              seem to require such markers  anymore,  but  for  some  systems  it  may  still  be
              necessary.  Previous  versions  of  setup-storage  by  default marked the partition
              mounting / as bootable, but this is not a sane default for all cases.  If you  want
              to  be  sure  not  boot  failures  happen  because  of  a  missing bootable marker,
              explicitly set the bootable option. Of course, there are lots of other reasons  why
              a system may fail to boot.

       ·      Crypto support requires some site-specific changes: If you use cryptsetup stanza, a
              crypttab(5) file and key files for all luks volumes will  be  created  (unless  you
              used  the  passphrase option). The key files are left in /tmp/fai; you will want to
              copy these to some removable media. To make encrypted root devices actually usable,
              you need to add busybox (and initramfs-tools) to your package config.

       ·      For  backwards  compatibility  or  other  system-specific  reasons  an alignment to
              cylinder boundaries may be necessary. Yet other systems will have  other  alignment
              constraints. setup-storage sets the alignment as follows: If align-at is set, align
              accordingly. Otherwise, if any partition on the particular disk is to be preserved,
              default to cylinder alignment. Else use sector alignment.

SEE ALSO

       This  program  is  part  of  FAI  (Fully  Automatic  Installation).   The  FAI homepage is
       http://fai-project.org.

       Further documentation, including coding related information, is maintained in a wiki  page
       at http://wiki.fai-project.org/index.php/Setup-storage.

AUTHOR

       FAI  is  courtesy  of  Thomas  Lange  <lange@informatik.uni-koeln.de>.  Michael Tautschnig
       <mt@debian.org> contributed the initial version of setup-storage to replace  the  previous
       setup-harddisks, with the help of Christian Kern.