[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Partman



Hi!

A few week ago I wrote about my intentions to write a Debconf frontend
for parted.  The result is a program that can serve not only as a
partitioner but for many other purposes.  I expect to have less time
for coding this month so maybe it is time to publish what I have
done.  It is at http://people.debian.org/~zinoviev.

I wasn't able to test these udebs because I don't know how to satisfy
the library requirements of partman-parted.  Maybe I have missed
something in the documentation of d-i or this is not documented.  I
have dane tests mostly as non-root -- look at the directory test.  I
discovered that parted has several bugs when it partitiones regular
files instead of disks, so you may find some problems if you try
partman as non-root.  It seams however that there are no such problems
when parted partitiones real hard disks.

The Debconf templates contain rather terse messages.  They contain
dots instead of spaces because Debconf deletes spaces (and it does
this also for the non-break spaces U+00A0).  I don't know what is the
behaviour of cdebconf.  All priorities are set to high but most of
them have to be critical.  There is no internationalization in this
version.  On the other hand the software is already able to partition
the hard disks.

The documentation is very incomplete, but I will work on this.  It is
in the README file.  For your convenience I have attached it to this
message.

Anton Zinoviev
PARTMAN

The main task of partman is to allow the user to perform various
`editing' operations on things that can store file systems.
The available editing operations are different depending on the
installed plugins.  For example a plugin can provide partman with
operations for creating and deletion of partitions in which case
partman is simply a partitioner.  But it is possible also to create a
plugin that provides operations to create file systems or assign
mount points.  These filesystems don't need to be on phisical
devices -- it is possible to create plugins for LVM or software RAID
volumes.

Because of this flexibility the udebs for partman and its plugins
don't provide any menu items for main-menu and don't provide any of
the virtual packages created-fstab, mounted-partitions,
made-filesystems, partitioned-harddrives by themselves.  They do this
indirectly by empty meta-packages.  For example the udeb
`partman-partitioner' provides partitioned-harddrives and menu item to
partition the hard drives.  The postinst of this meta-package simply
invokes partman and it depends on partman, partman-parted and
partman-parted-partitioning -- the last two udebs are plugins for
partman that allow to partition the hard drives.

Now a short review of how partman works follows.

Its first task is to initialize the environment variables PARTMAN,
STORAGES, OSES, TEMP, MNT, DEVICES and PARTITIONS.  The values of all
these variables are directories.

PARTMAN.  This value of this variable is the directory that contains
	  all components of partman.  Currently this is /lib/partman.

STORAGES.  This directory contains all storage plugins.  Currently
	   this is /lib/partman/storages.  The main storage plugin is
	   partman-parted which discovers the existing hard drives
	   and allows the user edit them.

OSES.  This directory contains all OS-plugins, i.e. plugins for
       operating systems.  One of the tasks for such plugins is to
       give expressive names of the partitions (such as `Debian
       GNU/Linux (/dos), FreeDos (C:)).  The more advanced plugins of
       this kind can analize files such as /etc/fstab and /etc/passwd
       and use this information in order to allow automatical upgrade
       of some existing Unix-like system to Debian.

TEMP.  This is a directory where partman and its plugins are expected
       to create theirs temporary files.  Currently this is
       /tmp/partman.SOME_NUMBER.

MNT.  Currently this is $TEMP/mnt.

DEVICES.  This directory contains the `devices' that the user will
	  edit.  For each such a `device' there is a subdirectory in
	  $DEVICES.  These subdirectories are created by the storage
	  plugins during their initialization.  Usualy each storage
	  plugin creates one subdirectory of $DEVICES.  A notable
	  exception is partman-parted that creates one subdirectory
	  for every hard drive in the system.  On the other hand a
	  plugin that allows installation on remote filesystems will
	  create no subdirectory of $DEVICES if the connection to
	  other computers is impossible for some reason.  Currently
	  DEVICES=$TEMP/devices.

PARTITIONS.  Currently PARTITIONS=$TEMP/partitions.  This is a sort of
	     database of the things that can contain filesystems.
	     Usualy these `things' are partitions but they can be also
	     LVM or RAID volumes.

The second task of partman after it initializes beforementioned
variables is to initialize its plugins.  Firstly it invokes the init
script of each storage plugin.  The init script creates subdirectories
in $DEVICES and $PARTITIONS:

for drv in $STORAGES/*; do
        [ -d $drv ] || continue
        $drv/init
done

The OS-plugins have two initialization scripts.  The first of them
($OSES/*/test1) is invoked several times.  Each time some of the
partitions will be mounted on $MNT and the test1 script will have the
chance to analize if this partition contains the corresponding to the
plugin operating system.  Afterwards the script $OSES/*/test2 is
invoked.  No partition is mounted at its invocation, but this script
is able to mount temporary whatever it likes.

At this stage the initialization of partman is completed.  The last
thing to do is to display the main menu of partman.  For each device
in $DEVICES there is one item.  There are also two special items
`Undo all changes' and `Commit changes and exit'.  All editing
operations are supposed to be reversible.  The user can delete
partitions, create filesystems, etc. but all this actualy happens
only when partman exits and before that time the user is always able
to undo all changes in which case no data will be lost.


THE DIRECTORIES UNDER $DEVICES

Every subdirectory of $DEVICES is created by the init script of some
storage plugin.  Every such a subdirectory must contain the following 
files:

abort.  Partman invokes this script when the user aborts it.  All
	editing operations are invalid and should be abandoned.  This
	script has only two tasks: to clear the temporary files and
	to kill the spawned processes (if any).

commit.  Partman invokes this script when it exits normaly.  It has to
	 make actual the performed by the user editing operations --
	 delete partitions, created new partitions and file systems,
	 resize partitions, etc.  Afterwards this script deletes the
	 temporary files and kills the spawned processes.

edit.  Partman invokes this script when the uses chooses the
       corresponding menu item.

name.  This file contains the name of the menu item.  For example
       this could be `IDE1 master (120 GB; Maxtor 94098U8)'.

undo.  Partman invokes this script when the user wants to undo all
       operations.  This script doesn't have to restore the original
       contents of the subdirectories of $PARTITIONS because partman
       has made a backup copy of them.


PARTMAN-PARTED

This is the most important storage plugin.  It is responsible for all
devices that parted can detect, namely the hard drives.  For each hard
drive this plugin creates a subdirectory in $DEVICES.  This
subdirectory contains tho FIFOs -- infifo and outfifo.  The scripts of
partman and its plugins use these FIFOs to communicate with a special
server process.  This server serves as a mediator between the shell
scripts and libparted.

When the user chooses a hard drive in the main menu of partman,
partman invokes the edit script of this hard drive
($DEVICES/..../edit).  This script displays a menu.  For each
partition and each free space in the disk there is a menu item.  There
is also a special menu item `Create new empty label (partition table)
on this device'.

Because the partman-parted storage plugin is so general, the editing
operations the user can perform are packaged in other udebs.  For
example partman-parted-partitioning provides the following editing
operations: create new partition, delete partition, change the flags
of partition and change the name of partition (the last is only for
Macintosh disk labels).

In order to achieve this, partman and its plugins often use the so
caled menu-directories for theirs menus.  One such a directory is
$STORAGES/parted/active_partition.  It represents the menu that
partman-parted displays when the user chooses some partition in the
menu of partman-parted.  The file question in this directory contains
the name of the Debconf template (in this case this is
partman-parted/active_partition).  All other files in the
menu-directory are subdirectories.  Any udeb can install such a
subdirectory.  (For example the storage plugin for software RAID
volumes can install an item to resize the choosed partition to have
the same size as another.)  These subdirectories contain two scripts
-- choices and do_option.  The first script prints menu items.  The
second is invoked if the user chooses an item printed by the first
script.  For example the contents of
$STORAGES/parted/active_partition/30change_name/choices is:

-----------------------------------------------------
#!/bin/sh

# Some necessary functions provided by partman-parted:
. $STORAGES/parted/partman-parted-functions.sh

# First let we see if this partition label supports partition names
open_dialog  USES_NAMES
read_line x
close_dialog

# If yes, then output the menu item `Set the name of the partition'
if [ "$x" = yes ]; then
        printf "setname\tSet the name of the partition\n"
fi

# Otherwise output no menu item.
-----------------------------------------------------


The contents of the corresponding dp_option script is:

-----------------------------------------------------
#!/bin/sh

. $STORAGES/parted/partman-parted-functions.sh

dev=$2
id=$3

cd $DEVICES/$dev

# First let we see what was is the current name of the partition
open_dialog PARTITION_INFO $id
read_line x1 id x2 x3 x2 x3 x4 old_name
close_dialog

# Then we ask the user for a new name
db_fset partman-parted-partitioning/set_name seen false
db_set partman-parted-partitioning/set_name "$old_name"
db_input high partman-parted-partitioning/set_name || true
db_go || exit 1
db_get partman-parted-partitioning/set_name

# Here we set the new name.
open_dialog SET_NAME "$id" "$RET"
close_dialog
-----------------------------------------------------


Reply to: