Package: debian-installer Version: 20180610 Severity: normal Tags: patch I am in process of dropping debiandoc-sgml. So please convert partman-doc to DocBook XML with attached patch.
-- System Information: Debian Release: buster/sid APT prefers testing APT policy: (500, 'testing'), (10, 'unstable') Architecture: amd64 (x86_64) Kernel: Linux 4.17.0-3-amd64 (SMP w/4 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en_US:en (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled
From 9e165a7690557672fcba4278894858b0badc789f Mon Sep 17 00:00:00 2001 From: Osamu Aoki <os...@debian.org> Date: Fri, 31 Aug 2018 10:54:10 +0000 Subject: [PATCH] partman-doc: Convert to DocBook XML 4.5 Convert with: $ debiandoc2dbk -1 partman-doc.sgml Build script are from internals (some symlink) Also update .gitignore to match all *.html Signed-off-by: Osamu Aoki <os...@debian.org> --- debian/control | 4 +- debian/rules | 2 +- doc/devel/internals/.gitignore | 2 +- doc/devel/partman/.gitignore | 2 +- doc/devel/partman/Makefile | 27 +- doc/devel/partman/build.sh | 16 + doc/devel/partman/internals.css | 1 + doc/devel/partman/partman-doc.dbk | 1751 ++++++++++++++++++++++++++++ doc/devel/partman/partman-doc.sgml | 1507 ------------------------ doc/devel/partman/style-common.xsl | 1 + doc/devel/partman/style-html.xsl | 1 + 11 files changed, 1777 insertions(+), 1537 deletions(-) create mode 100755 doc/devel/partman/build.sh create mode 120000 doc/devel/partman/internals.css create mode 100644 doc/devel/partman/partman-doc.dbk delete mode 100644 doc/devel/partman/partman-doc.sgml create mode 120000 doc/devel/partman/style-common.xsl create mode 120000 doc/devel/partman/style-html.xsl diff --git a/debian/control b/debian/control index f903622e2..686a5ef6d 100644 --- a/debian/control +++ b/debian/control @@ -24,12 +24,10 @@ Build-Depends: # Used to test validity of mirrors. bc, # Used for some image size calculations. - debiandoc-sgml, -# partman's manual is in debiandoc. xsltproc, docbook-xml, docbook-xsl, -# The d-i internals manual is in DocBook XML. +# The d-i partman-doc and internals manual is in DocBook XML 4.x. libbogl-dev, # For bdftobogl used in font reduction. # diff --git a/debian/rules b/debian/rules index e4f417dfd..63ae420d5 100755 --- a/debian/rules +++ b/debian/rules @@ -75,7 +75,7 @@ binary-arch: install dh_testroot dh_installchangelogs dh_installdocs doc/* -X Makefile -X build.sh -X .xsl \ - -X internals.xml -X partman-doc.sgml -X .gitignore + -X internals.xml -X partman-doc.dbk -X .gitignore dh_compress dh_fixperms diff --git a/doc/devel/internals/.gitignore b/doc/devel/internals/.gitignore index eb6fe0602..3432c3fd8 100644 --- a/doc/devel/internals/.gitignore +++ b/doc/devel/internals/.gitignore @@ -1,2 +1,2 @@ -index.html +*.html diff --git a/doc/devel/partman/.gitignore b/doc/devel/partman/.gitignore index ca2b6c7a2..3432c3fd8 100644 --- a/doc/devel/partman/.gitignore +++ b/doc/devel/partman/.gitignore @@ -1,2 +1,2 @@ -partman-doc.html +*.html diff --git a/doc/devel/partman/Makefile b/doc/devel/partman/Makefile index b9cbcc66c..2e36b62b3 100644 --- a/doc/devel/partman/Makefile +++ b/doc/devel/partman/Makefile @@ -1,26 +1,5 @@ -SHELL=bash -name=partman-doc - -$(name).html/: $(name).sgml - debiandoc2html $(name).sgml - -%.txt: %.sgml - debiandoc2text $< - -%.pdf: %.sgml - debiandoc2pdf $< - -%.dvi: %.sgml - debiandoc2dvi $< - -%.info: %.sgml - debiandoc2info $< - -%.ps: %.sgml - debiandoc2ps $< - -%.tov: %.sgml - debiandoc2textov $< +all: *.xsl *.dbk + @./build.sh clean: - rm -rf $(name).html + @rm -f *.html diff --git a/doc/devel/partman/build.sh b/doc/devel/partman/build.sh new file mode 100755 index 000000000..a5e8e7816 --- /dev/null +++ b/doc/devel/partman/build.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +xsltproc=`which xsltproc` +stylesheet=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/html/chunk.xsl + +if [ -n "$xsltproc" ] ; then + if [ -e "$stylesheet" ]; then + $xsltproc --xinclude style-html.xsl partman-doc.dbk + else + echo "stylesheet missing; please install the docbook-xsl Debian package" + exit 1 + fi +else + echo "xsltproc not found; please install the xsltproc Debian package" + exit 1 +fi diff --git a/doc/devel/partman/internals.css b/doc/devel/partman/internals.css new file mode 120000 index 000000000..44d290828 --- /dev/null +++ b/doc/devel/partman/internals.css @@ -0,0 +1 @@ +../internals/internals.css \ No newline at end of file diff --git a/doc/devel/partman/partman-doc.dbk b/doc/devel/partman/partman-doc.dbk new file mode 100644 index 000000000..fafd15c73 --- /dev/null +++ b/doc/devel/partman/partman-doc.dbk @@ -0,0 +1,1751 @@ +<?xml version='1.0' encoding='utf-8'?> +<!-- -*- DocBook -*- --> +<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" + "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [ +<!-- Include entity definition file by uncommenting the following --> +<!-- <!ENTITY % versiondata SYSTEM "version.ent"> %versiondata; --> +]> + +<book lang="en"> + +<title>Partition Management for the Debian Installer</title> + +<bookinfo> + +<authorgroup> +<author><personname>Anton Zinoviev</personname><email>an...@lml.bas.bg</email></author> + +</authorgroup> +<releaseinfo></releaseinfo> + +<pubdate><!-- put date --></pubdate> + + +<copyright><year> 2003,2004,2007</year><holder>Anton Zinoviev</holder></copyright> +<legalnotice> +<para> +This manual is free software; you may 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, or (at your option) any later version. +</para> +<para> +This is distributed in the hope that it will be useful, but <emphasis>without +any warranty</emphasis>; without even the implied warranty of merchantability +or fitness for a particular purpose. See the GNU General Public License for +more details. +</para> +<para> +A copy of the GNU General Public License is available as +<literal>/usr/share/common-licenses/GPL</literal> in the Debian GNU/Linux +distribution or on the World Wide Web at the <ulink +url="http://www.gnu.org/copyleft/gpl.html">GNU website</ulink>. You can also +obtain it by writing to the Free Software Foundation, Inc., 51 Franklin St, +Fifth Floor, Boston, MA 02110-1301, USA. +</para> +</legalnotice> + +</bookinfo> + + +<chapter id="ch1"><title>Introduction</title> +<para> +There are many wishlist features that we might desire from any installer of +GNU/Linux and that are related to partitioning: +</para> +<itemizedlist> +<listitem> +<para> +The partitioner should support different file systems. Some of them need more +care than only libraries and suitable arguments for <command>mount</command>. +</para> +</listitem> +<listitem> +<para> +It should support not only regular partitions but also software RAID and LVM as +well as encrypted file systems. +</para> +</listitem> +<listitem> +<para> +It should be able to partition disks automatically and allow the user to +inspect and customise the automatic partitioning later. +</para> +</listitem> +<listitem> +<para> +It should be able to resize partitions and move their contents from one place +to another. +</para> +</listitem> +<listitem> +<para> +The users should be protected from mistakes – by allowing them to undo their +partitioning operations. +</para> +</listitem> +<listitem> +<para> +The partitioner should discover that there is already some installed GNU/Linux +system and analyse its <command>fstab</command>, <command>passwd</command>, +etc. in order to provide an automatic upgrade from the old already installed +GNU/Linux system to the new one. +</para> +</listitem> +</itemizedlist> +<para> +One nice feature of the Debian installer is that it is modular. Its components +are packaged in separate udebs and they can have relatively independent +development process. This document describes how we can solve all mentioned +tasks keeping the Debian installer as modular as it is now. Ideally in order +to add some new feature only a few new udebs must be all that is needed – no +changes in the existing udebs and no recompilation would be required. +</para> +<para> +The script <filename>partman</filename> from the package <systemitem +role="package">partman-base</systemitem> opens the main partitioning menu; it +may look like this one: +</para> +<screen> ++------------------+ [!!] Partition the storage devices +-----------------+ +| Partition, free space or device to be modified | +| | +| IDE1 master - Seagate U Series 40810 (40.0 GB) | +| #3 primary 2.1 GB B F ext3 / | +| pri/log 4.4 GB FREE SPACE | +| #5 logical 3.6 GB | +| #7 logical 10.0 GB F ext3 /usr | +| #8 logical 19.9 GB K ext2 /home | +| IDE2 master - Maxtor 6Y120L0 (122.9 GB) | +| #7 logical 1.0 GB linux-swap | +| logical 114.5 GB FREE SPACE | +| #5 logical 5.5 GB reiserfs | +| #6 logical 1.9 GB | +| | +| Undo changes to partitions | +| Finish partitioning and write changes to disk | +| | +| <Go Back> <Continue> | +| | ++-------------------------------------------------------------------------+ +</screen> +<para> +When the users choose some free space they are offered to create a new +partition just like they are in <command>cfdisk</command>. When users choose a +partition they are offered with a menu with various editing operations: +</para> +<screen> ++------------------+ [!!] Partition the storage devices +-----------------+ +| Settings on the partition: | +| | +| Usage method: format the partition | +| File system: ext3 | +| Mount point: /var/mail | +| Mount options: noatime,nodev,nosuid,noexec,usrquota | +| Bootable flag: off | +| Size: 995.2 MB | +| | +| Finished setting up partition | +| Delete the partition | +| | +| <Go Back> <Continue> | +| | ++-------------------------------------------------------------------------+ +</screen> +<para> +All udebs are allowed to add items to this menu as well as to several other +menus. They can add new items in the list of devices such as software RAID and +LVM devices, networked file systems, encrypted partitions, etc. The package +<systemitem role="package">partman-partitioning</systemitem> is responsible for +pure partitioning operations such as creation of new partitions and deletion. +The packages <systemitem role="package">partman-target</systemitem> and +<systemitem role="package">partman-basicmethods</systemitem> are responsible +for the items `Choose how this partition should be used' and `Choose a file +system'. The package <systemitem +role="package">partman-basicfilesystems</systemitem> adds support for +<literal>ext2</literal>, <literal>linux-swap</literal>, +<literal>fat16</literal> and <literal>fat32</literal>. The package <systemitem +role="package">partman-ext3</systemitem> adds support for +<literal>ext3</literal>. +</para> +</chapter> + +<chapter id="ch2"><title>Changes in partman since 2005</title> +<para> +This chapter documents important changes in the sctructure of partman. It is +provided as a test if you need to reread some of the sections in this document. +</para> +<itemizedlist> +<listitem> +<para> +New directory <command>check.d</command> with some of the scripts formerly in +<command>finish.d</command> +</para> +</listitem> +<listitem> +<para> +New directory <command>display.d</command> with different methods to do the +partitioning (manual, automatic, etc.) +</para> +</listitem> +<listitem> +<para> +New command GET_LABEL_TYPE in parted_server +</para> +</listitem> +</itemizedlist> +</chapter> + +<chapter id="ch3"><title>Package interrelations</title> +<section id="basics"><title>Basics</title> +<para> +The GNU Parted disk partitioning library provides high-level, architecture +independent functions for operations such as creating, deleting, resizing and +moving of partitions. Most of the functions of libparted work in a +nondestructive way. The partition table is written in data structures and any +change in the partition table happens only in these data structures rather than +directly on the disk. This makes possible to implement partitioning tools +based on <systemitem role="package">libparted</systemitem> that support undoing +of the editing operations. +</para> +<para> +However we have to solve two problems. The first is that we want to use as +much as possible shell scripts rather than C programs. The second is that +different programs have to operate with same instance of libparted structures. +For example the user can use some tool for automatic partitioning, then correct +or customise the automatic partitioning, perform some other arbitrary +operations being still allowed to undo everything. +</para> +<para> +There is one obvious solution of these two problems – we keep the data +structures of libparted in a daemon process and communicate with it in order to +make changes in these data structures. This process is +<filename>/bin/parted_server</filename> from the package <systemitem +role="package">partman-base</systemitem>. +</para> +<para> +The scripts from <filename>/lib/partman/init.d/</filename> are executed before +all partitioning operations. They can be used to initialise the partitioning +system. The scripts may be invoked more than once in which case they should +behave properly. For example this directory can contain a script to discover +the existing hard drives. If invoked for second time the script must either do +nothing or check if there is some new kernel module giving access to new still +undiscovered device. +</para> +<para> +Any udeb may install a script in this directory. For example the script +<filename>/lib/partman/init.d/30parted</filename> from the package <systemitem +role="package">partman-base</systemitem> is responsible for running +<command>parted_server</command>. Notice that the scripts are prefixed by a +two-digit number. This number determines the order the scripts are executed. +If any of the scripts exit with non-zero exit code the partitioning will be +aborted. This means that in almost all cases these scripts must end with +exit-code 0. +</para> +<para> +When the initialisation completes, the scripts from +<filename>/lib/partman/display.d</filename> are executed. These scripts are +supposed to make the actual partitioning interactively or non-interactively. +The exit code <replaceable>code</replaceable> of these scripts is interpreted +as follows: +</para> +<variablelist> +<varlistentry> +<term><replaceable>code</replaceable> = 0</term> +<listitem> +<para> +The script did nothing, move to the next script in +<command>display.d</command>. +</para> +</listitem> +</varlistentry> +<varlistentry> +<term>1 <= <replaceable>code</replaceable> <= 99</term> +<listitem> +<para> +Restart the partitioning (move again to the first script in +<command>display.d</command>). +</para> +</listitem> +</varlistentry> +<varlistentry> +<term>100 <= <replaceable>code</replaceable> <= 254</term> +<listitem> +<para> +The script successfully partitioned the disks, do not execute the following +scripts in <command>display.d</command>. +</para> +</listitem> +</varlistentry> +<varlistentry> +<term><replaceable>code</replaceable> = 255</term> +<listitem> +<para> +Abort the partitioning. +</para> +</listitem> +</varlistentry> +</variablelist> +<para> +When the disks become ready, the scripts in +<filename>/lib/partman/check.d</filename> are executed. They have to check if +everything is OK to proceed with commiting the changes on the disks, mounting +file systems, etc. For example the package <systemitem +role="package">partman-target</systemitem> installs there a script to check if +there is a root file system. If a script in <command>check.d</command> exits +with non-zero exit code then the scripts in <command>display.d</command> are +executed again and as a result the user is allowed to fix the partitioning. +</para> +<para> +The directory <command>check.d</command> is remarkable with the fact that some +of the scripts in it are installed by non-partman packages. The packages for +the various bootloaders (lilo, grub, palo, etc.) install there scripts to +ensure the partitioning scheme conforms to their requirements. +</para> +<para> +While the user is modifying the partitions this happens only in the memory of +the computer and not in the edited devices. This is because almost all changes +happen either in the data-structures of <command>parted_server</command> or in +files in the installer's ram-disk. That's why we can provide the user with the +option to undo everything. When the user chooses to undo the scripts in the +directory <filename>/lib/partman/undo.d/</filename> are executed. Any udeb may +install a script in this directory. For example the script +<filename>/lib/partman/undo.d/30parted</filename> is responsible for restoring +the contents of the data structures of <command>parted_server</command>. In +most cases the scripts from <command>undo.d</command> must exit with exit-code +0. If any of the scripts exit with non-zero exit code the partitioning will be +aborted. +</para> +<para> +In order to perform the editing operations on the storage devices (and in +particular to transfer the partitions from the internal data-structures of +<command>parted_server</command> to the hard disks) the scripts from the +directory <filename>/lib/partman/commit.d/</filename> are executed. The order +in which these scripts are executed is determined again by two-digit prefixes +in the script names. Every script from <command>commit.d</command> is +guaranteed that the scripts ordered before it have been already executed. +However if any of the scripts exit with non-zero exit-code the execution of the +scripts in <command>commit.d</command> will be stopped. In this case the +partitioning will continue and the user is expected to fix the problem. If any +script exits with non-zero exit code it is supposed to inform the user what +went wrong using debconf. +</para> +<para> +There are two cases when the scripts from <command>commit.d</command> are +executed. The first case is when the user wants to commit the changes to the +disks but continue partitioning. The second case is when the partitioning +ends. In the first case if none of the scripts fails the scripts from +<command>init.d</command> will be also executed and the user will be returned +to the partitioning dialog. In the second case the scripts from +<command>finish.d</command> will be executed. In both cases if any of the +scripts in <command>commit.d</command> fail the user will be returned +immediately back to the partitioning dialog. +</para> +<para> +The scripts from <filename>/lib/partman/finish.d/</filename> are responsible +for final tasks such as to mount partitions on <filename>/target</filename>, +generate of <command>fstab</command>, stop <command>parted_server</command> +etc.<footnote><para> What tasks will be performed depends on what udebs are +unpacked. If the packages responsible for mounting partitions and creating +fstab are not unpacked we have only a simple partitioner providing <systemitem +role="package">partitioned-harddrives</systemitem>. If they are unpacked they +provide also <systemitem role="package">made-filesystems</systemitem> and +<systemitem role="package">mounted-partitions</systemitem>. </para> +</footnote> If any of these scripts exit with non-zero exit-code the execution +of the scripts will be stopped. If the exit-code was 1 then the user will be +returned back to the partitioning dialog and is expected to correct the +problem. If the exit-code was neither 0 nor 1 then the partitioning will be +aborted. +</para> +<para> +For every hard disk in the system the script +<filename>/lib/partman/init.d/30parted</filename> creates a subdirectory in +<filename>/var/lib/partman/devices/</filename> and informs +<command>parted_server</command> that the device is to be edited (`opens' the +device). All udebs that provide storage device (software RAID, LVM, encrypted +partitions) must do the same. This subdirectory must contain at least three +files – <command>device</command>, <command>model</command> and +<command>size</command>. The first contains the name of a device file (for +example <filename>/dev/ide/host0/bus0/target0/lun0/disc</filename>). The +second contains the name of the device (for example `Maxtor 6Y120L0'). The +third contains the physical size of the storage device (in bytes, for example +`122942324736'). <footnote><para> Please notice that udebs that provide +support for storage `devices' that cannot be partitioned (such as networked +file systems) should not create a subdirectory in +<filename>/var/lib/partman/devices</filename> and certainly cannot provide the +device to the management of <command>parted_server</command>. </para> +</footnote> The subdirectories of +<filename>/var/lib/partman/devices/</filename> can but are not obligated to +contain additional information. We call these subdirectories <emphasis>device +directories</emphasis>. +</para> +<para> +Every partition in a device managed by <command>parted_server</command> is +given a unique name having the form +<replaceable>first_byte</replaceable>-<replaceable>last_byte</replaceable>. +This name can be used to determine where the partition starts and where it +ends.<footnote><para> Unlike one can suppose <command>parted_server</command> +always measures sizes and places in bytes rather than in sectors. +<replaceable>Last_byte</replaceable> is the number of the last byte of the last +sector of the partition. </para> </footnote> If the device directory contains +a subdirectory named +<command><replaceable>first_byte</replaceable>-<replaceable>last_byte</replaceable></command> +then this subdirectory stores information about the partition. We call this +subdirectory <emphasis>directory of the partition</emphasis>. We call the +string<replaceable>first_byte</replaceable>-<replaceable>last_byte</replaceable> +`<emphasis>id</emphasis>' of the partition. +</para> +</section> + +<section id="menudirs"><title>Menu-directories</title> +<para> +There are several menus involved in partitioning. In order to keep the Debian +installer modular and extensible we want to allow every udeb to install items +in these menus. Let us be more specific. When the users decide to format some +existing partition we need a menu with an item for every supported file system. +Obviously we don't want to hardwire the list of the supported file systems +anywhere in our installer. If we want to add support to the installer say for +XFS or UMSDOS file systems, only a few new udebs must be all that is needed. +</para> +<para> +In order to achieve this flexibility the package <systemitem +role="package">partman-base</systemitem> provides support for the so-called +menu-directories. Every such directory contains files named +<command>question</command> and <command>priority</command>. They contain the +name of a Debconf template and the priority of the question correspondingly. +The template must have exactly the following type and choices fields: +</para> +<screen> +Type: select +Choices-C: ${CHOICES} +Choices: ${DESCRIPTIONS} +</screen> +<para> +All other files in the menu directory are subdirectories. Any udeb can install +such a subdirectory in order to add items to the menu. For example the udebs +for software RAID volumes can install in the menu of the editing operations an +item to resize the chosen partition to have the same size as another. These +subdirectories must contain two scripts – <command>choices</command> and +<command>do_option</command>. The purpose of the first script is to print menu +items. For every menu item <command>choices</command> must print a line having +the form +</para> +<screen> +<replaceable>menu_item_id</replaceable><TAB>The text for the user +</screen> +<para> +The script <command>choices</command> is allowed to print nothing. In this +case no item for the menu is created. Here <literal><TAB></literal> is +ASCII 9. The text `The text for the user' will be presented to the users. If +they choose this particular menu item the script <command>do_option</command> +will be invoked. +</para> +<para> +The script <command>choices</command> may be given some arguments depending on +the particular menu-directory. The first argument given to +<command>do_option</command> is always the +<replaceable><literal>menu_item_id</literal></replaceable> of the chosen menu +item. The rest of the arguments are the same as the arguments given to +<command>choices</command>. +</para> +<para> +Let we take as an example the menu that the users see when they choose to edit +some particular partition. The file <command>question</command> in the +menu-directory for this menu contains the text +<literal>partman/active_partition</literal>. This is the name of a +Debconf-template with type `select' and description `Please choose what to do +with this partition'. The package <systemitem +role="package">partman-partitioning</systemitem> installs in this +menu-directory some subdirectories – <command>62change_name</command>, +<command>65toggle_bootable</command> and <command>85delete</command>. The +script <filename>62change_name/choices</filename> is given two arguments – +the hard disk we edit and the id of the partition. It checks if the type of +the partition table supports partition names in which case it prints the line +</para> +<screen> +setname<TAB>Set the name of the partition +</screen> +<para> +If the partition table doesn't support names, then this script prints nothing. +When the user chooses to `set the name of the partition' the script +<filename>62change_name/do_option</filename> is invoked. Its first argument is +<literal>setname</literal> (this is the first part of the line printed by +<command>choices</command>) and the other arguments are the same to the +arguments given to the script <command>choices</command>. In our case the +script <command>do_option</command> ignores its first argument. The script +<command>do_option</command> can use its first argument in order to determine +which menu item the user has chosen in cases when <command>choices</command> +has printed several. +</para> +<para> +Notice that the names of the subdirectories in any menu-directory start with +two digits. They are used to determine the order of the items in the menu. +</para> +</section> + +<section id="s3.3"><title>Partitioning</title> +<para> +The partitioning starts with the menu of the menu-directory +<filename>/lib/partman/choose_partition</filename>. This is the main +partitioning menu. Every udeb is allowed to install new items in it. If the +script <command>do_option</command> exits with exit-code 0 the user will be +shown again the main partitioning menu. If the script exits with exit-code 100 +this means that the partitioning should be finished. In this case the scripts +from <command>commit.d</command> and <command>finish.d</command> will be +executed as described in <xref linkend="basics"/>. If the script +<command>do_option</command> exits with exit code 255 the partitioning will be +aborted immediately. +</para> +<para> +The main partitioning menu always contains an item for every partitioned +storage device, an item for every partition and an item for every free space. +</para> +<para> +If the user chooses a storage device the menu of the menu-directory +<filename>/lib/partman/storage_device</filename> will be opened. The first +argument given to <command>choices</command> is the device +directory<footnote><para> We are not going to describe the arguments given to +<command>do_option</command>. Look at <xref linkend="menudirs"/>. </para> +</footnote>. +</para> +<para> +If the user chooses a free space the menu-directory +<filename>/lib/partman/free_space</filename> will be opened. The first +argument given to <command>choices</command> is the device directory. The +second argument is the id of the free space. +</para> +<para> +If the user chooses an active partition the menu-directory +<filename>/lib/partman/active_partition</filename> will be opened. The first +argument given to <command>choices</command> is the device directory. The +second argument is the id of the chosen partition. If the script +<command>do_option</command> exits with exit-code 0 the user will be shown +again the menu <command>active_partition</command> for the same partition. If +the script <command>do_option</command> exits with exit-code 100 or 255 the +user will be returned back to the main partitioning menu. This should happen +when the id of the partition is invalidated, for example when the partition is +deleted or resized. +</para> +<para> +In the main partitioning menu the partitions are presented by lines of this +kind: +</para> +<screen> +#8 primary 19.9 GB K ext2 /home +</screen> +<para> +Notice that it is useless to indicate that the partition is primary if the type +of the partition table is `mac' as this partition table doesn't support logical +partitions. On the other hand this partition table supports partition names. +We see that we need a flexible way to determine how the partitions are +presented in the main partitioning menu. +</para> +<para> +The directory <filename>/lib/partman/visual.d</filename> contains scripts that +print the parts of the partition line. For example the script +<filename>/lib/partman/visual.d/filesystem</filename> prints strings like +`ext3' or `FREE SPACE'. These scripts usualy start with the following cliche: +</para> +<screen> +cd $1 + +num=$2 +id=$3 +size=$4 +type=$5 +fs=$6 +path=$7 +shift; shift; shift; shift; shift; shift; shift +name=$* +</screen> +<para> +$1 is the device directory. $num is the number of the partition (for example +<filename>/dev/hda6</filename> has number 6). $id is the id of the partition. +$size is the size of the partition (in bytes). If this is an active partition +then $type is either `primary' or `logical'. If this is a free space then +$type shows what partition can be created in it and $type can be `primary', +`logical', `pri/log' or `unusable'. $fs is `free' if this is a free space. +Otherwise $fs is the type of the file system of this partition as known to +<command>parted_server</command>. $path is a device name for the partition, +for example <filename>/dev/ide/host0/bus0/target0/lun0/part6</filename>. $name +is the name of the partition or the empty string if the partition table doesn't +support partition names. +</para> +<para> +The script <filename>/lib/partman/commit.d/30parted</filename> transfers the +partition tables from the internal structures of +<command>parted_server</command> to the disks. The script +<filename>/lib/partman/finish.d/80parted</filename> stops +<command>parted_server</command>. +</para> +<para> +The package <systemitem role="package">partman-base</systemitem> installs in +<command>update.d</command> (see <xref linkend="update-partitions"/>) a script +to ensure that for every partition that contains some file system there is a +file <command>detected_filesystem</command> in the directory of the partition +whose contents is the type of the detected file system as returned by +<command>parted_server</command>. +</para> +</section> + +<section id="s3.4"><title>Setup <filename>/target</filename></title> +<para> +Without the package <systemitem role="package">partman-target</systemitem> the +packages <systemitem role="package">partman-base</systemitem> and <systemitem +role="package">partman-partitioning</systemitem> provide only the regular +partitioning operations. However if the package <systemitem +role="package">partman-target</systemitem> is also unpacked then the user will +be provided with options to choose file systems for the partitions, specify +wether they should be formatted and select mount points. The package +<systemitem role="package">partman-target</systemitem> adds to the menu +directory <filename>/lib/partman/active_partition</filename> the item `Usage +method:'. If the user chooses this item the menu directory +<filename>/lib/partman/choose_method</filename> will be opened. The scripts +<command>choices</command> from <command>choose_method</command> are given the +device directory as first argument and the partition id as second argument. +</para> +<para> +The package <systemitem role="package">partman-basicmethods</systemitem> adds +in the menu of the menu directory <command>choose_method</command> three items: +`Do not use the partition', `Format the partition' and `Keep and use the +existing data in the partition' (the last only if some file system is +detected). Other udebs can provide another methods to use partitions. +</para> +<para> +Every partition that is to be used somehow in the future Debian system should +have a file named `method' in its directory (what is `directory of a partition' +is described in <xref linkend="basics"/>). The scripts +<command>do_option</command> of the menu directory +<command>choose_method</command> manage the file <command>method</command>. It +contains the name of the usage method chosen by the user. For example if the +user chooses to `format the partition' the contents of this file will be +`format' and if the user chooses to `keep and use the existing data' the +contents of this file will be `keep'. Partitions that won't be used do not +have a file <command>method</command>. +</para> +<para> +The udebs providing methods may provide also translatable names of the methods +for the user interface using debconf templates named +<command>partman/method_long/<replaceable>some_method</replaceable></command> +and +<command>partman/method_short/<replaceable>some_method</replaceable></command>. +For example the package <systemitem role="package">partman-palo</systemitem> +providing method <command>palo</command> can provide also the following debconf +templates: +</para> +<screen> +Template: partman/method_long/palo +Type: text +_Description: Palo boot partition + +Template: partman/method_short/palo +Type: text +_Description: Palo +</screen> +<para> +Another job for the scripts <command>do_option</command> of the menu directory +<command>choose_method</command> is to create or remove a file named +<command>use_filesystem</command> in the directory of the partitions. This +file is created when the usage method requires the partition to be used +together with some file system. Otherwise it is removed. Example methods that +are used together with a file system are `format the partition' and `keep and +use the existing data'. Example methods that are not used together with a file +system are `LVM physical volume' and `PALO boot partition'. +</para> +<para> +Finaly, the scripts <command>do_option</command> of the menu directory +<command>choose_method</command> have to create or remove a file named `format' +in the directory of the partitions. If the partition directory contains a file +named <command>format</command> then it will be formatted. Otherwise it will +not be formatted. For example if the user chooses to `format the partition' +the script <command>do_option</command> will create a file +<command>format</command>. If the user chooses to `keep and use the existing +data' the file <command>format</command> will be removed if it exists. +</para> +<para> +The menu item `Choose a file system' in the menu directory +<command>active_partition</command> is also provided by the package <systemitem +role="package">partman-target</systemitem>. If the user chooses it the menu +<command>choose_filesystem</command> will be opened. This menu however is not +produced using a menu directory. +</para> +<para> +Packages that provide support for some file system should install a script in +the directory <filename>/lib/partman/valid_filesystems</filename>. The first +argument given to this script is some device directory, the second argument is +the id of some partition and the third argument is one of the strings +`formatable' and `existing'. If it is `formatable' then the job of the script +is to check if the specified partition can be formatted and used. If the third +argument is `existing' then the job of the script is to check if the partition +can be used without formatting. In either case if the partition can be used +then the script should print a line with the identifier of the type of the file +system. +</para> +<para> +Packages that provide support for some file systems use the directory +<filename>/lib/partman/parted_names</filename> to define a mapping from the +unique file system type identifiers to the names used by +<command>parted_server</command>. Suppose for example that the package +providing support for UMSDOS file system chooses the string `umsdos' as unique +identifier for the file system. Then this package must install in this +directory a file named <command>umsdos</command> whose contents is the string +`fat16'. This means that <command>parted_server</command> will know UMSDOS +file systems as being fat16 file systems. +</para> +<para> +The udebs providing file systems may provide also translatable names of the +file systems for the user interface using debconf templates named +<command>partman/filesystem_long/<replaceable>some_filesystem</replaceable></command> +and +<command>partman/filesystem_short/<replaceable>some_filesystem</replaceable></command>. +For example the package <systemitem role="package">partman-ext3</systemitem> +providing file system with unique identifier <command>ext3</command> can +provide also the following debconf templates: +</para> +<screen> +Template: partman/filesystem_long/ext3 +Type: text +_Description: Extended 3 + +Template: partman/filesystem_short/ext3 +Type: text +_Description: Ext3 +</screen> +<para> +Most of the packages that provide support for a file system will have to add an +item `Mount point:' to the menu <command>active_partition</command>. Of course +this item should be shown only when the contents of the file +<command>acting_filesystem</command> is appropriate. The mount point chosen by +the user should be written in a file named <command>mountpoint</command> +situated in the directory of the partition. If the user chooses not to mount +this file system then the file <command>mountpoint</command> should be removed +(if it exists). +</para> +<para> +In order to be able to mount file systems and generate fstab the directories +<filename>/lib/partman/fstab.d/</filename> and +<filename>/lib/partman/mount.d/</filename> are used. The scripts from +<command>fstab.d</command> should print lines in a form similar to that of +<filename>/etc/fstab</filename>: +</para> +<screen> +<replaceable>file_system</replaceable> <replaceable>mount_point</replaceable> <replaceable>type</replaceable> <replaceable>options</replaceable> <replaceable>dump</replaceable> <replaceable>pass</replaceable> +</screen> +<para> +The first field (<replaceable><literal>file_system</literal></replaceable>) is +the name of a device that can be accessed by the installer. For example this +can be <filename>/dev/ide/host0/bus0/target0/lun0/part5</filename> despite that +in the future system this device will be named <filename>/dev/hda5</filename>. +On the other hand the other five fields should look exactly the same way as in +the <command>fstab</command> to be generated. For example +<replaceable><literal>options</literal></replaceable> can contain options such +as <literal>quota</literal> that are senseless for the installer. +</para> +<para> +The scripts from <command>mount.d</command> are used to mount file systems. A +string having the same form as the lines output by the scripts from +<command>fstab.d</command> should be given as first argument to any script from +<command>mount.d</command>. Any script from <command>mount.d</command> checks +if it can mount the requested file system. If it cannot then the script exits +with some non-zero exit code. Otherwise the script must mount the file system +in the proper place in the hierarchy over <filename>/target</filename>, print +on its standard output a command that should be used in order to unmount the +file system and exit with exit code 0. +</para> +<para> +The scripts in the directories <command>fstab.d</command> and +<command>mount.d</command> are installed by the udebs that provide support for +file systems. +</para> +<para> +Packages that provide support for file systems install in +<command>commit.d</command> a script to format the partitions that the user has +requested to be formatted. The package <systemitem +role="package">partman-target</systemitem> installs in +<command>finish.d</command> a script to mount the partitions on +<filename>/target</filename>. The packages that provide support for storage +devices (RAID, LVM, etc.) install in <command>finish.d</command> a script to +add in <filename>/target/etc/fstab</filename> the necessary lines. +</para> +<para> +The package <systemitem role="package">partman-target</systemitem> installs in +<command>update.d</command> (see <xref linkend="update-partitions"/>) a script +to ensure that for every partition that is to be used there is a file +<command>acting_filesystem</command> in the directory of the partition whose +contents is the identifier of the type of file system under which the partition +should be used. +</para> +</section> + +</chapter> + +<chapter id="ch4"><title><filename>/lib/partman/lib/*</filename></title> +<para> +Various scripts in partman make use of <emphasis>function libraries</emphasis>: +separate files, mostly containing shell functions, that are sourced by scripts +so they can make use of common functions and code duplication can be avoided. +</para> +<para> +The main function library is <filename>base.sh</filename>, provided by +<systemitem role="package">partman-base</systemitem>. This file is sourced by +most scripts in partman as it defines a lot of useful variables and common +functions. Some of these are documented in the remainder of this chapter. +<footnote><para> The script <filename>base.sh</filename> has become somewhat +too long and this probably makes its sourcing slow. Although some +reorganization has already taken place, it could be a good idea to split it up +further. </para> </footnote> +</para> +<para> +Other packages provide more targeted function libraries. In most cases their +scope and use can easily be determined from their name. +</para> +<section id="s4.1"><title>Environment</title> +<para> +The variables <literal>TAB</literal> and <literal>NL</literal> have values +ASCII 9 and ASCII 10 correspondingly. They can be used as temporary values +for the variable <literal>IFS</literal>. The function +<command>restore_ifs</command> restores the variable <literal>IFS</literal> its +original value. +</para> +<para> +The function library <command>base.sh</command> also contains simple +reimplementations of <command>basename</command> and <command>dirname</command> +so that busybox doesn't have to provide them. +</para> +</section> + +<section id="s4.2"><title>Menus</title> +<para> +The function <command>debconf_select</command> is a high level function to ask +user with a menu using a Debconf question with type `select'. Synopsis: +</para> +<screen> +debconf_select <replaceable>priority</replaceable> <replaceable>template</replaceable> <replaceable>choices</replaceable> <replaceable>default</replaceable> +</screen> +<para> +The first argument is the debconf-priority of the question and the second is +the name of the template to be used. The third argument is a newline-separated +list of items for the menu. Each item has the form +</para> +<screen> +<replaceable>menu_item_id</replaceable><TAB>The text for the user +</screen> +<para> +Here <literal><TAB></literal> is ASCII 9. The text `The text for the +user' is the text of the menu item. If +<replaceable><literal>menu_item_id</literal></replaceable> of some menu-item is +identical with the fourth argument given to <command>debconf_select</command> +then this menu-item will be default. +</para> +<para> +If the user cancels the question <command>debconf_select</command> returns with +exit-code 255. Otherwise the value of the variable <literal>RET</literal> will +be the <replaceable><literal>menu_item_id</literal></replaceable> of the chosen +menu item. If the chosen menu item was chosen by the user then the exit-code +is 0. If the item was chosen automatically (due to the debconf-priority or to +some other reason) the exit-code is 1. +</para> +<para> +The function <command>debconf_select</command> doesn't care to +<command>db_fset</command> <literal>$template</literal> <literal>seen</literal> +<literal>false</literal>. The template must have exactly the following type +and choices fields: +</para> +<screen> +Type: select +Choices-C: ${CHOICES} +Choices: ${DESCRIPTIONS} +</screen> +<para> +The udebs that generate menus using menu-directories use the function +<command>ask_user</command> instead of <command>debconf_select</command>. +Synopsis: +</para> +<screen> +ask_user <replaceable>a_menu_directory</replaceable> <replaceable>additional_optional_arguments</replaceable>... +</screen> +<para> +This function displays the menu for +<literal><replaceable>a_menu_directory</replaceable></literal>. The first +argument is a menu-directory (see <xref linkend="menudirs"/>). If the user +cancels the dialog then <command>ask_user</command> returns with exit code 255. +Otherwise it returns with the exit code of the script +<command>do_option</command>. +</para> +<para> +If <command>ask_user</command> is called re-entrantly from within a +<command>do_option</command> script, then the calling +<command>do_option</command> script should typically be careful to handle or +discard exit code 255 itself (and sometimes other codes, depending on the +protocol in force) to avoid a backup operation inadvertently backing up out of +several nested menus at once. +</para> +<para> +The script <command>choices</command> is invoked with +<replaceable><literal>additional_optional_arguments</literal></replaceable> as +arguments. The first argument given to <command>do_option</command> is the +<replaceable><literal>menu_item_id</literal></replaceable> of the chosen menu +item and the other arguments are again +<replaceable><literal>additional_optional_arguments</literal></replaceable>. +</para> +<para> +To set the default selected item in a menu-directory, use the function +<command>menudir_default_choice</command>. Synopsis: +</para> +<screen> +menudir_default_choice <replaceable>a_menu_directory</replaceable> <replaceable>subdirectory</replaceable> <replaceable>menu_item_id</replaceable> +</screen> +<para> +Where the <replaceable><literal>subdirectory</literal></replaceable> is the +name of a subdirectory in the menu-directory with the leading sequence number +stripped off and <replaceable><literal>menu_item_id</literal></replaceable> is +the id of a menu-item printed by +<filename><replaceable>a_menu_directory</replaceable>/??<replaceable>subdirectory</replaceable>/choices</filename>. +The specified item is set as default not forever but only for the next +invocation of <command>ask_user</command>. It is not an error to set as +default non-existing item; in this case the first item in the menu will be +default. +</para> +<para> +The function <command>partition_tree_choices</command> prints a sequence of +lines in the form +</para> +<screen> +<replaceable>menu_item_id</replaceable><TAB>The text for the user +</screen> +<para> +– one for every storage device and one for every partition. The +<replaceable><literal>menu_item_id</literal></replaceable> of the storage +devices is their storage directory. The +<replaceable><literal>menu_item_id</literal></replaceable> of the partitions +has the form +<replaceable>storage_directory</replaceable>//<replaceable>partition_id</replaceable>. +The output of <command>partition_tree_choices</command> can be given as third +argument to <command>debconf_select</command>. +</para> +</section> + +<section id="s4.3"><title>Long numbers</title> +<para> +Notice that the sizes of most of the present storage devices are so large that +we cannot measure them using 32-bit integers. Consequently we cannot use the +usual shell arithmetic. The functions <command>longint_le</command>, +<command>longint2human</command>, <command>human2longint</command> and +<command>valid_human</command> exist in order to deal with such big numbers. +</para> +<para> +The function <command>longint_le</command> is used to compare two big numbers. +</para> +<screen> +longint_le <replaceable>number1</replaceable> <replaceable>number2</replaceable> +</screen> +<para> +returns with exit code 0 if the first number is less or equal to the second +and returns 1 otherwise. +</para> +<para> +The function <command>longint2human</command> accepts in its first argument +some number of bytes, converts it to something that is more meaningful for +humans and outputs the result. For example +</para> +<screen> +longint2human 1234567890 +</screen> +<para> +gives <literal>1.2 GB</literal>. Notice that this function rounds its +argument. +</para> +<para> +The function <command>human2longint</command> is used for the opposite +convertion: +</para> +<screen> +human2longint 1.234Gb +</screen> +<para> +gives <literal>1234000000</literal>. +</para> +<para> +The function <command>valid_human</command> returns with exit code 0 when its +first argument is a string that is suitable to be given to +<command>human2longint</command>. Otherwise it returns with exit code 1. +</para> +</section> + +<section id="update-partitions"><title>Updating partition directories</title> +<para> +Different components of the installer may need to get information about the +partitions. They can communicate with <command>parted_server</command> in +order to know the characteristics of the partition. However not everything can +be known from <command>parted_server</command>. Imagine an udeb that provides +the user with the option to upgrade some existing GNU/Linux installation. This +udeb analyses the <command>fstab</command> and knows that some partition is +used as <filename>/home</filename> and should not be formatted. This sort of +information has nothing to do with <command>parted_server</command>. The udeb +stores it in a subdirectory of the device directory named after the id of the +partition. +</para> +<para> +But now a problem arises. Suppose that the user chooses to format some +partition as ext2 and mount it on <filename>/home</filename>. The udebs +responsible for formatting and mounting create the directories +<command>filesystem</command> and <command>mountpoint</command> in the +partition. What will happen if the users change their mind and decide to use +the same partition as swap space? Swap spaces have no mount points and the +file <command>mountpoint</command> should be removed. Who is responsible for +removing it? The udeb that allows the user to choose a file system for the +partition doesn't have to know that swap-spaces have no mount points, only the +udeb that provides support for swap-spaces can know that the file +<command>mountpoint</command> should be removed. +</para> +<para> +In order to solve this difficulty every script that makes changes to some +partition should invoke the function <command>update_partition</command> from +<command>base.sh</command>. Synopsis: +</para> +<screen> +update_partition <replaceable>device_directory</replaceable> <replaceable>partition_id</replaceable> +</screen> +<para> +In order to update the contents of the directory +<filename><replaceable>device_directory</replaceable>/<replaceable>partition_id</replaceable></filename> +the function <command>update_partition</command> executes the scripts from the +directory <filename>/lib/partman/update.d/</filename>. Every udeb is allowed +to install scripts in this directory. Their names are prefixed by two-digit +numbers that control the order of the execution. The scripts from +<command>update.d</command> are given several arguments. $1 is the +<replaceable>device_directory</replaceable>. $2 is the number of the partition +(<filename>/dev/hda6</filename> will have number 6). $3 is the id of the +partition. $4 is the length of the partition (in bytes). $5 is the type of +the partition, it can be either `primary' or `logical'. $6 is the type of the +file system as known to <command>parted_server</command>, in most cases you +should ignore this argument. $7 is the device name (for example +<filename>/dev/ide/host0/bus0/target0/lun0/part6</filename>). +"$8 $9 $10 $11 ..." is the name of the partition in partition tables that +support partition names. Otherwise $8, $9, $10,... are not defined. +</para> +</section> + +<section id="s4.5"><title>Communication with <command>parted_server</command></title> +<para> +The package <systemitem role="package">partman-base</systemitem> creates two +FIFOs – <filename>/var/lib/partman/infifo</filename> and +<filename>/var/lib/partman/outfifo</filename>. +<command>Parted_server</command> reads instructions from +<command>infifo</command> and responds by writting to +<command>outfifo</command>. Consequently the clients write to +<command>infifo</command> and read from <command>outfifo</command>. The +function library <command>base.sh</command> contain several functions to make +the communication with <command>parted_server</command> easier. Here we will +omit the details, if you want to know the exact communication protocol please +read how these functions are implemented. +</para> +<para> +The functions <command>open_infifo</command>, <command>close_infifo</command>, +<command>open_outfifo</command> and <command>close_outfifo</command> are called +without arguments. They open and close <command>infifo</command> and +<command>outfifo</command> assigning them file descriptors 6 and 7 +correspondingly. You do not need to use these low-level functions. +</para> +<para> +The function <command>write_line</command> prints its arguments to +<command>outfifo</command>. +</para> +<para> +The function <command>read_line</command> reads from <command>infifo</command> +a line, splits it in fields according to <literal>$IFS</literal> and assigns +these fields to variables whose names are given to <command>read_line</command> +as arguments. For example +</para> +<screen> +read_line x y z +</screen> +<para> +reads a line from <command>infifo</command>, splits it and assigns the first +field to the variable <literal>x</literal>, the second field to the variable +<literal>y</literal> and the rest to the variable <literal>z</literal>. You +see that <command>read_line</command> is used the same way as the shell +operator <command>read</command>. +</para> +<para> +The function <command>read_paragraph</command> reads consequently lines from +<command>infifo</command> until it reaches an empty line. It prints the read +lines with the exception of the last empty line. +</para> +<para> +The function <command>read_list</command> reads lines the same way as the +function <command>read_paragraph</command>. However the function +<command>read_list</command> always prints only one line that is a +comma-separated sequence of the lines read from <command>infifo</command>. If +<command>read_paragraph</command> prints +</para> +<screen> +This is the first line +This is the second line +This is the third line +</screen> +<para> +<command>read_list</command> prints +</para> +<screen> +This is the first line, This is the second line, This is the third line +</screen> +<para> +In order to initiate a communication dialog with +<command>parted_server</command> you will use the function +<command>open_dialog</command>. You will invoke it in the device directory of +the device you want to issue command about. The first argument of +<command>open_dialog</command> is a command for +<command>parted_server</command>. The rest arguments are arguments for the +command. +</para> +<para> +You use the function <command>close_dialog</command> in order to terminate the +communication dialog. +</para> +<para> +When you send <command>parted_server</command> an order to do some long +operation (e.g. resize a file system) the user will be shown a progress bar. +You may give a name to it by the function <command>name_progress_bar</command>. +It may be used right before the command <command>open_dialog</command> and +accepts only one argument – a template with type text that describes what is +being done. +</para> +<para> +The function <command>log</command> appends its arguments to the file +<filename>/var/log/partman</filename>. This file is used as log-file also by +<command>parted_server</command>. +</para> +</section> + +</chapter> + +<chapter id="ch5"><title>The commands of <command>parted_server</command></title> +<para> +You should be very careful when you communicate with the +<command>parted_server</command>. If <command>parted_server</command> detects +any error it will exit immediately. This is safer approach then to try to +resolve somehow the error. However this also means that the user will not be +shown any information about what happened and why the installer freezed. The +log-file <filename>/var/log/partman</filename> can be used to see the reasons +why <command>parted_server</command> exited. +</para> +<section id="s5.1"><title>Open a new device</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog OPEN <replaceable>device_name</replaceable> +read_line status +close_dialog +case $status in + OK) + # The device has been opened successfully + ;; + failed) + # We wasn't able to open the device + ;; +esac +</screen> +<para> +Here <replaceable><literal>device_name</literal></replaceable> can be for +example <filename>/dev/ide/host0/bus0/target0/lun0/disc</filename>. +</para> +</section> + +<section id="s5.2"><title>Close a device</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog CLOSE +close_dialog +</screen> +<para> +After this command you may not issue commands regarding the device of +<replaceable><literal>device_directory</literal></replaceable>. This command +does <emphasis role="strong">not</emphasis> invoke the command COMMIT. +</para> +</section> + +<section id="s5.3"><title>Does the partition exist on the disk?</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog VIRTUAL <replaceable>partition_id</replaceable> +read_line virtuality +close_dialog +case $virtuality in + yes) + # the partition does not exist on the disk + # probably because it is newly created + ;; + no) + # the partition exists on the disk + ;; +esac +</screen> +</section> + +<section id="s5.4"><title>Remember the partition table as unchanged</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog DISK_UNCHANGED +close_dialog +</screen> +<para> +After this command <command>parted_server</command> will know that the +partition table in its onw internal data structures is the same as the +partition table actualy existing on the device. The main purpose of this +command is to be used for partition tables with type <literal>loop</literal>. +</para> +</section> + +<section id="s5.5"><title>Report whether the partition table is changed</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog IS_CHANGED +read_line changed +close_dialog +case $changed in + yes) + # the partition table is changed + ;; + no) + # the partition table is not changed + ;; +esac +</screen> +</section> + +<section id="s5.6"><title>Dump the partitions</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog DUMP +close_dialog +</screen> +<para> +This command prints in <filename>/var/log/partition_dump</filename> all the +data regarding the device. It is used for debugging. +</para> +</section> + +<section id="s5.7"><title>Write partitioning to the disk</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog COMMIT +close_dialog +</screen> +<para> +This command transfers the partitions in the device of +<replaceable><literal>device_directory</literal></replaceable> from the +internal structures of <command>parted_server</command> to the disk. +</para> +</section> + +<section id="s5.8"><title>Undo the changes</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog UNDO +close_dialog +</screen> +<para> +This command destroys the internal data structures in +<command>parted_server</command> for a device and then rereads them from the +device. +</para> +</section> + +<section id="s5.9"><title>Get the partitions</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog PARTITIONS +while { read_line num id size type fs path name; [ "$id" ]; }; do + # do something for this partition +done +close_dialog +</screen> +<para> +The body of the loop is executed for every partition and free space. $num is +the number of the partition (for example <filename>/dev/hda6</filename> has +number 6). $id is the id of the partition. $size is the size of the partition +(in bytes). If this is an active partition then $type is either `primary' or +`logical'. If this is a free space then $type shows what partition can be +created in it. In this case $type can be `primary', `logical', `pri/log' or +`unusable'. $fs is `free' if this is a free space. Otherwise $fs is the type +of the file system of this partition as known to +<command>parted_server</command>. $path is a device name for the partition, +for example <filename>/dev/ide/host0/bus0/target0/lun0/part6</filename>. $name +is the name of the partition or the empty string if the partition table doesn't +support partition names. +</para> +<para> +Notice that in the loop-body you may not initiate another dialog with +<command>parted_server</command>. If you need this you can use the following +construction instead: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog PARTITIONS +partitions=$(read_paragraph) +close_dialog + +echo "$partitions" | +while { read num id size type fs path name; [ "$id" ]; }; do + # do something for this partition +done +</screen> +</section> + +<section id="s5.10"><title>Getting info about a partition</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog PARTITION_INFO <replaceable>partition_id</replaceable> +read_line num id size type fs path name +close_dialog +</screen> +<para> +Here <replaceable><literal>partition_id</literal></replaceable> is the id of +the partition to get info. The meaning of the variables are the same as in the +command PARTITIONS. +</para> +</section> + +<section id="s5.11"><title>Getting cylinder/head/sector geometry of a partition/free space</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog GET_CHS <replaceable>partition_id</replaceable> +read_line start_cyl start_head start_sector end_cyl end_head end_sector +close_dialog +</screen> +</section> + +<section id="s5.12"><title>Getting the supported partition table types</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog LABEL_TYPES +supported=$(read_list) +close_dialog +</screen> +<para> +For the result of this command +<replaceable><literal>device_directory</literal></replaceable> is irrelevant. +Despite this <replaceable><literal>device_directory</literal></replaceable> +must be a valid device directory. +</para> +<para> +This command is used to read which types partition tables are supported by +<command>parted_server</command> (i.e. by libparted). $supported is a +comma-separated list of the supported types. At the time of writting the +following types are supported: bsd, gpt, mac, dvh, msdos, pc98, sun and loop. +</para> +</section> + +<section id="s5.13"><title>Get the type of the disk label</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog GET_LABEL_TYPE +read_line label_type +close_dialog +if [ "$label_type" = unknown ]; then + echo "The disk is unknown or it has no disk label + or the disk label is unknown" +else + echo "The type of the disk label is:" "$label_type" +fi +</screen> +<para> +This command returns the type of the disk label (i.e. the partition table) of +a disk. It can be used to check if there is a partition table (if not, then it +is safe to create a new partition table or to use the entire disk for RAID, +LVM, encrypted unit, etc). +</para> +</section> + +<section id="s5.14"><title>Create a new empty partition table</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog NEW_LABEL <replaceable>partition_table_type</replaceable> +close_dialog +</screen> +<para> +This command creates in the device a new empty partition table with type +<replaceable><literal>partition_table_type</literal></replaceable>. (Of course +it won't be written to the disk if you don't use the command COMMIT.) +</para> +</section> + +<section id="s5.15"><title>Getting the meaningful flags for a partition</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog VALID_FLAGS <replaceable>partition_id</replaceable> +meaningful_flags=$(read_list) +close_dialog +</screen> +<para> +$meaningful_flags is a comma-separated list of the flags that are meaningful +for the partition with id +<replaceable><literal>partition_id</literal></replaceable>. +</para> +<para> +In order to check wether some particular flag xyz is meaningful you can use +this code: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +xyz_is_meaningful=no +open_dialog VALID_FLAGS <replaceable>partition_id</replaceable> +while { read_line flag; [ "$flag" ]; }; do + if [ "$flag" = xyz ]; then + xyz_is_meaningful=yes + # you may not use break here + fi +done +close_dialog +</screen> +</section> + +<section id="s5.16"><title>Getting the active flags of a partition</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog GET_FLAGS <replaceable>partition_id</replaceable> +active_flags=$(read_list) +close_dialog +</screen> +<para> +$active_flags is a comma-separated list of the flags of the partition with id +<replaceable><literal>partition_id</literal></replaceable> that are in state 1. +This is a sublist of the list returned by the command VALID_FLAGS. +</para> +<para> +In order to check if some partition is denoted as bootable you can use this +code: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +is_bootable=no +open_dialog GET_FLAGS <replaceable>partition_id</replaceable> +while { read_line flag; [ "$flag" ]; }; do + if [ "$flag" = boot ]; then + is_bootable=yes + # you may not use break here + fi +done +close_dialog +</screen> +</section> + +<section id="s5.17"><title>Set the flags of a partition</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog SET_FLAGS <replaceable>partition_id</replaceable> +for flag in $all_flags_that_should_be_active; do + write_line $flag +done +write_line NO_MORE +close_dialog +</screen> +<para> +If you want to denote some partition as non-bootable you can use the following +code: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog GET_FLAGS <replaceable>partition_id</replaceable> +new_flags=$( + while { read_line flag; [ "$flag" ]; }; do + if [ "$flag" != boot ]; then + echo $flag + fi + done +) +close_dialog + +open_dialog SET_FLAGS $id +write_line "$new_flags" +write_line NO_MORE +close_dialog +</screen> +</section> + +<section id="s5.18"><title>Check if partition names are supported</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog USES_NAMES +read_line supported +close_dialog +case $supported in + yes) + # the partition table supports partition names + ;; + no) + # the partition table doesn't support partition names + ;; +esac +</screen> +</section> + +<section id="s5.19"><title>Set the name of a partition</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog SET_NAME <replaceable>partition_id</replaceable> <replaceable>new_name</replaceable> +close_dialog +</screen> +<para> +After this command the name of +<replaceable><literal>partition_id</literal></replaceable> will be +<replaceable><literal>new_name</literal></replaceable>. It is an error to use +this command with a partition table that doesn't support partition names. +</para> +</section> + +<section id="s5.20"><title>Get the maximum number of primary partitions</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog GET_MAX_PRIMARY +read_line primaries +close_dialog +logger "This disk may contain up to $primaries primary partitions" +</screen> +</section> + +<section id="s5.21"><title>Check if extended and logical partitions are supported</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog USES_EXTENDED +read_line supported +close_dialog +case $supported in + yes) + # the partition table supports extended and logical partitions + ;; + no) + # the partition table doesn't support extended and logical partitions + ;; +esac +</screen> +</section> + +<section id="s5.22"><title>Get the known to <command>parted_server</command> file systems</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog FILE_SYSTEM_TYPES +known_filesystems=$(read_list) +close_dialog +</screen> +<para> +$known_filesystems is a comma-separated list of the file systems that are known +to <command>parted_server</command>. You probably won't need to use this +command. +</para> +</section> + +<section id="s5.23"><title>Try to detect the file system in a partition</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog GET_FILE_SYSTEM <replaceable>partition_id</replaceable> +read_line filesystem +close_dialog +if [ "$filesystem" = none ]; then + # no known file system is detected +else + # a file system of type $filesystem is detected +fi +</screen> +</section> + +<section id="s5.24"><title>Change the filesystem of a partition</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog CHANGE_FILE_SYSTEM <replaceable>partition_id</replaceable> <replaceable>new_filesystem</replaceable> +close_dialog +</screen> +<para> +libparted assigns every partition some file system. This command can be used +to change this file system. The file system assigned to the partition is not +necessarily the same as the actual file system. Libparted uses it to determine +automatically the type of the partition in some partition tables. For example +with msdos partition tables the partitions with file system `ext2' receive type +83. The partitions that are swap spaces receive type 82. +</para> +</section> + +<section id="s5.25"><title>Create a new partition</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog NEW_PARTITION $type $fs $freespace $position $length +read_line num id size type fs path name +close_dialog +if [ "$id" ]; then + # the partition is successfully created +else + # wasn't able to create the partition +fi +</screen> +<para> +$type is either primary or logical. $fs is the type of the file system to be +assigned to the partition. $freespace is the id of some free space. $position +is either `full', `beginning' or `end' and determines where in $freespace to +create the new partition. If $position is not `full' then $length is the +length that the new partition should have (in bytes). +</para> +<para> +If the new file system is successfully created $num is tne number of the +created partition (for example <filename>/dev/hda6</filename> has number 6). +$id is the id of the new partition. $size is the size of the new partition. +$size is approximately $length but not necessarily the same. $type and $fs +don't change their values. $path is a device name, for example +<filename>/dev/ide/host0/bus0/target0/lun0/part6</filename>. $name is the name +of the new partition or an empty string if the partition table doesn't support +partition names. +</para> +</section> + +<section id="s5.26"><title>Delete a partition</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog DELETE_PARTITION <replaceable>partition_id</replaceable> +close_dialog +</screen> +</section> + +<section id="s5.27"><title>Resize a partition</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +name_progress_bar <replaceable>some/debconf/template</replaceable> +open_dialog RESIZE_PARTITION <replaceable>partition_id</replaceable> <replaceable>new_size</replaceable> +read_line new_id +close_dialog +</screen> +<para> +This command resizes a partition. As usualy +<replaceable><literal>new_size</literal></replaceable> is measured in bytes. +$new_id is the new id that the partition receives. The resizing is not +supported always. If it fails $new_id will be the same as +<replaceable><literal>partition_id</literal></replaceable>. +</para> +<para> +If the partition exists on the storage device and contains some file system, +then the data in the partition will be preserved and the new partition table +<emphasis>will be written on the storage device</emphasis>. When it is +impossible to resize the file system, the partition will be left unresized. +When the partition doesn't exist on the storage device, the new version of the +partition table will not be written to it. +</para> +<para> +This command doesn't move the start of the partition but only its end. +</para> +<para> +The command <command>name_progress_bar</command> may be omitted. The debconf +template must have type text. It will be used to give the user information of +what is being done. +</para> +</section> + +<section id="s5.28"><title>Get resize range</title> +<para> +Synopsis: +</para> +<screen> +cd <replaceable>device_directory</replaceable> +open_dialog GET_RESIZE_RANGE <replaceable>partition_id</replaceable> +read_line minimal_size current_size maximal_size +close_dialog +</screen> +<para> +This command returns the minimal and the maximal size that can be achieved by +using the command RESIZE_PARTITION. $minimal_size, $current_size and +$maximal_size are measured in bytes. +</para> +</section> + +</chapter> + +<chapter id="ch6"><title>Bugs and limitations</title> +<para> +All files and directories are assumed to not contain spaces in their names. +</para> +<para> +If the partition table supports extended and logical partitions the user won't +be shown free spaces whose size is less than one cylinder. +</para> +</chapter> + + +</book> + diff --git a/doc/devel/partman/partman-doc.sgml b/doc/devel/partman/partman-doc.sgml deleted file mode 100644 index bb19576e5..000000000 --- a/doc/devel/partman/partman-doc.sgml +++ /dev/null @@ -1,1507 +0,0 @@ -<!doctype debiandoc SYSTEM> - -<book> -<title> Partition Management for the Debian Installer </title> -<author> - <name>Anton Zinoviev</name><email>an...@lml.bas.bg</email> -</author> - -<copyright> -<copyrightsummary> © 2003,2004,2007 Anton Zinoviev </copyrightsummary> - -<p> This manual is free software; you may 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, or -(at your option) any later version. - -<p> This is distributed in the hope that it will be useful, but -<em>without any warranty</em>; without even the implied warranty of -merchantability or fitness for a particular purpose. See the GNU -General Public License for more details. - -<p> A copy of the GNU General Public License is available as -<tt>/usr/share/common-licenses/GPL</tt> in the Debian GNU/Linux -distribution or on the World Wide Web at the <url -id="http://www.gnu.org/copyleft/gpl.html" name="GNU website">. You can -also obtain it by writing to the Free Software Foundation, Inc., -51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. - -</copyright> - -<toc> - -<chapt> Introduction - -<p> There are many wishlist features that we might desire from any -installer of GNU/Linux and that are related to partitioning: -<list> -<item> The partitioner should support different file systems. Some of - them need more care than only libraries and suitable arguments for - <prgn>mount</prgn>. - -<item> It should support not only regular partitions but also software - RAID and LVM as well as encrypted file systems. - -<item> It should be able to partition disks automatically and allow - the user to inspect and customise the automatic partitioning - later. - -<item> It should be able to resize partitions and move their contents -from one place to another. - -<item> The users should be protected from mistakes – by allowing -them to undo their partitioning operations. - -<item> The partitioner should discover that there is already some - installed GNU/Linux system and analyse its <prgn>fstab</prgn>, - <prgn>passwd</prgn>, etc. in order to provide an automatic upgrade from - the old already installed GNU/Linux system to the new one. -</list> - -<p> One nice feature of the Debian installer is that it is modular. - Its components are packaged in separate udebs and they can have - relatively independent development process. This document describes - how we can solve all mentioned tasks keeping the Debian installer as - modular as it is now. Ideally in order to add some new feature only - a few new udebs must be all that is needed – no changes in the - existing udebs and no recompilation would be required. - -<p> The script <file>partman</file> from the package -<package>partman-base</package> opens the main partitioning menu; it may -look like this one: -<example> -+------------------+ [!!] Partition the storage devices +-----------------+ -| Partition, free space or device to be modified | -| | -| IDE1 master - Seagate U Series 40810 (40.0 GB) | -| #3 primary 2.1 GB B F ext3 / | -| pri/log 4.4 GB FREE SPACE | -| #5 logical 3.6 GB | -| #7 logical 10.0 GB F ext3 /usr | -| #8 logical 19.9 GB K ext2 /home | -| IDE2 master - Maxtor 6Y120L0 (122.9 GB) | -| #7 logical 1.0 GB linux-swap | -| logical 114.5 GB FREE SPACE | -| #5 logical 5.5 GB reiserfs | -| #6 logical 1.9 GB | -| | -| Undo changes to partitions | -| Finish partitioning and write changes to disk | -| | -| <Go Back> <Continue> | -| | -+-------------------------------------------------------------------------+ -</example> - -<p> When the users choose some free space they are offered to create a -new partition just like they are in <prgn>cfdisk</prgn>. When users -choose a partition they are offered with a menu with various editing -operations: - -<example> -+------------------+ [!!] Partition the storage devices +-----------------+ -| Settings on the partition: | -| | -| Usage method: format the partition | -| File system: ext3 | -| Mount point: /var/mail | -| Mount options: noatime,nodev,nosuid,noexec,usrquota | -| Bootable flag: off | -| Size: 995.2 MB | -| | -| Finished setting up partition | -| Delete the partition | -| | -| <Go Back> <Continue> | -| | -+-------------------------------------------------------------------------+ -</example> - -<p> All udebs are allowed to add items to this menu as well as to -several other menus. They can add new items in the list of devices -such as software RAID and LVM devices, networked file systems, -encrypted partitions, etc. The package -<package>partman-partitioning</package> is responsible for pure -partitioning operations such as creation of new partitions and -deletion. The packages <package>partman-target</package> and -<package>partman-basicmethods</package> are responsible for the items -`Choose how this partition should be used' and `Choose a file system'. -The package <package>partman-basicfilesystems</package> adds support -for <tt>ext2</tt>, <tt>linux-swap</tt>, <tt>fat16</tt> and -<tt>fat32</tt>. The package <package>partman-ext3</package> adds -support for <tt>ext3</tt>. - -<chapt> Changes in partman since 2005 - -<p> This chapter documents important changes in the sctructure of -partman. It is provided as a test if you need to reread some of the -sections in this document. - -<list> -<item> New directory <prgn>check.d</prgn> with some of the scripts -formerly in <prgn>finish.d</prgn> -<item> New directory <prgn>display.d</prgn> with different methods to -do the partitioning (manual, automatic, etc.) -<item> New command GET_LABEL_TYPE in parted_server -</list> - -<chapt> Package interrelations - -<sect id="basics"> Basics - -<p> The GNU Parted disk partitioning library provides high-level, - architecture independent functions for operations such as creating, - deleting, resizing and moving of partitions. Most of the functions of - libparted work in a nondestructive way. The partition table is - written in data structures and any change in the partition table - happens only in these data structures rather than directly on the - disk. This makes possible to implement partitioning tools based on - <package>libparted</package> that support undoing of the editing - operations. - -<p> However we have to solve two problems. The first is that we want -to use as much as possible shell scripts rather than C programs. The -second is that different programs have to operate with same instance -of libparted structures. For example the user can use some tool for -automatic partitioning, then correct or customise the automatic -partitioning, perform some other arbitrary operations being still -allowed to undo everything. - -<p> There is one obvious solution of these two problems – we -keep the data structures of libparted in a daemon process and -communicate with it in order to make changes in these data structures. -This process is <file>/bin/parted_server</file> from the package -<package>partman-base</package>. - -<p> The scripts from <file>/lib/partman/init.d/</file> are executed - before all partitioning operations. They can be used to initialise - the partitioning system. The scripts may be invoked more than once - in which case they should behave properly. For example this - directory can contain a script to discover the existing hard drives. - If invoked for second time the script must either do nothing or - check if there is some new kernel module giving access to new still - undiscovered device. - - <p> Any udeb may install a script in this directory. For example -the script <file>/lib/partman/init.d/30parted</file> from the package -<package>partman-base</package> is responsible for running -<prgn>parted_server</prgn>. Notice that the scripts are prefixed by a -two-digit number. This number determines the order the scripts are -executed. If any of the scripts exit with non-zero exit code the -partitioning will be aborted. This means that in almost all cases -these scripts must end with exit-code 0. - -<p> When the initialisation completes, the scripts from -<file>/lib/partman/display.d</file> are executed. These scripts are -supposed to make the actual partitioning interactively or -non-interactively. The exit code <var>code</var> of these scripts is -interpreted as follows: -<taglist compact> -<tag><var>code</var> = 0<item>The script did nothing, move to the next -script in <prgn>display.d</prgn>. -<tag>1 <= <var>code</var> <= 99<item>Restart the partitioning (move -again to the first script in <prgn>display.d</prgn>). -<tag>100 <= <var>code</var> <= 254<item>The script successfully -partitioned the disks, do not execute the following scripts in -<prgn>display.d</prgn>. -<tag><var>code</var> = 255<item>Abort the partitioning. -</taglist> - -<p> When the disks become ready, the scripts in -<file>/lib/partman/check.d</file> are executed. They have to check if -everything is OK to proceed with commiting the changes on the disks, -mounting file systems, etc. For example the package -<package>partman-target</package> installs there a script to check if -there is a root file system. If a script in <prgn>check.d</prgn> -exits with non-zero exit code then the scripts in -<prgn>display.d</prgn > are executed again and as a result the user is -allowed to fix the partitioning. - -<p> The directory <prgn>check.d</prgn> is remarkable with the fact -that some of the scripts in it are installed by non-partman packages. -The packages for the various bootloaders (lilo, grub, palo, etc.) -install there scripts to ensure the partitioning scheme conforms to -their requirements. - -<p> While the user is modifying the partitions this happens only in - the memory of the computer and not in the edited devices. This is - because almost all changes happen either in the data-structures of - <prgn>parted_server</prgn> or in files in the installer's ram-disk. - That's why we can provide the user with the option to undo - everything. When the user chooses to undo the scripts in the - directory <file>/lib/partman/undo.d/</file> are executed. Any udeb - may install a script in this directory. For example the script - <file>/lib/partman/undo.d/30parted</file> is responsible for - restoring the contents of the data structures of - <prgn>parted_server</prgn>. In most cases the scripts from - <prgn>undo.d</prgn> must exit with exit-code 0. If any of the - scripts exit with non-zero exit code the partitioning will be - aborted. - -<p> In order to perform the editing operations on the storage devices -(and in particular to transfer the partitions from the internal -data-structures of <prgn>parted_server</prgn> to the hard disks) the -scripts from the directory <file>/lib/partman/commit.d/</file> are -executed. The order in which these scripts are executed is determined -again by two-digit prefixes in the script names. Every script from -<prgn>commit.d</prgn> is guaranteed that the scripts ordered before it -have been already executed. However if any of the scripts exit with -non-zero exit-code the execution of the scripts in -<prgn>commit.d</prgn> will be stopped. In this case the partitioning -will continue and the user is expected to fix the problem. If any -script exits with non-zero exit code it is supposed to inform the user -what went wrong using debconf. - -<p> There are two cases when the scripts from <prgn>commit.d</prgn> -are executed. The first case is when the user wants to commit the -changes to the disks but continue partitioning. The second case is -when the partitioning ends. In the first case if none of the scripts -fails the scripts from <prgn>init.d</prgn> will be also executed and -the user will be returned to the partitioning dialog. In the second -case the scripts from <prgn>finish.d</prgn> will be executed. In both -cases if any of the scripts in <prgn>commit.d</prgn> fail the user -will be returned immediately back to the partitioning dialog. - -<p> The scripts from <file>/lib/partman/finish.d/</file> are -responsible for final tasks such as to mount partitions on -<file>/target</file>, generate of <prgn>fstab</prgn>, stop -<prgn>parted_server</prgn> etc.<footnote>What tasks will be performed -depends on what udebs are unpacked. If the packages responsible for -mounting partitions and creating fstab are not unpacked we have only a -simple partitioner providing -<package>partitioned-harddrives</package>. If they are unpacked they -provide also <package>made-filesystems</package> and -<package>mounted-partitions</package>.</footnote> If any of these -scripts exit with non-zero exit-code the execution of the scripts -will be stopped. If the exit-code was 1 then the user will be -returned back to the partitioning dialog and is expected to correct -the problem. If the exit-code was neither 0 nor 1 then the -partitioning will be aborted. - -<p> For every hard disk in the system the script -<file>/lib/partman/init.d/30parted</file> creates a subdirectory in -<file>/var/lib/partman/devices/</file> and informs -<prgn>parted_server</prgn> that the device is to be edited (`opens' -the device). All udebs that provide storage device (software RAID, -LVM, encrypted partitions) must do the same. This subdirectory must -contain at least three files – <prgn>device</prgn>, -<prgn>model</prgn> and <prgn>size</prgn>. The first contains the name -of a device file (for example -<file>/dev/ide/host0/bus0/target0/lun0/disc</file>). The second -contains the name of the device (for example `Maxtor 6Y120L0'). The -third contains the physical size of the storage device (in bytes, for -example `122942324736'). <footnote>Please notice that udebs that -provide support for storage `devices' that cannot be partitioned -(such as networked file systems) should not create a subdirectory in -<file>/var/lib/partman/devices</file> and certainly cannot provide -the device to the management of <prgn>parted_server</prgn>.</footnote> -The subdirectories of <file>/var/lib/partman/devices/</file> can but -are not obligated to contain additional information. We call these -subdirectories <em>device directories</em>. - -<p> Every partition in a device managed by <prgn>parted_server</prgn> -is given a unique name having the form -<var>first_byte</var>-<var>last_byte</var>. This name can be used to -determine where the partition starts and where it -ends.<footnote>Unlike one can suppose <prgn>parted_server</prgn> -always measures sizes and places in bytes rather than in sectors. -<var>Last_byte</var> is the number of the last byte of the last sector -of the partition.</footnote> If the device directory contains a -subdirectory named -<prgn><var>first_byte</var>-<var>last_byte</var></prgn> then this -subdirectory stores information about the partition. We call this -subdirectory <em>directory of the partition</em>. We call the -string<var>first_byte</var>-<var>last_byte</var> `<em>id</em>' of the -partition. - - -<sect id="menudirs"> Menu-directories - -<p> There are several menus involved in partitioning. In order to -keep the Debian installer modular and extensible we want to allow -every udeb to install items in these menus. Let us be more specific. -When the users decide to format some existing partition we need a menu -with an item for every supported file system. Obviously we don't want -to hardwire the list of the supported file systems anywhere in our -installer. If we want to add support to the installer say for XFS or -UMSDOS file systems, only a few new udebs must be all that is needed. - -<p> In order to achieve this flexibility the package - <package>partman-base</package> provides support for the so-called - menu-directories. Every such directory contains files named - <prgn>question</prgn> and <prgn>priority</prgn>. They contain the - name of a Debconf template and the priority of the question - correspondingly. The template must have exactly the following type - and choices fields: -<example> -Type: select -Choices-C: ${CHOICES} -Choices: ${DESCRIPTIONS} -</example> - -<p> All other files in the menu directory are subdirectories. Any - udeb can install such a subdirectory in order to add items to the - menu. For example the udebs for software RAID volumes can install in - the menu of the editing operations an item to resize the chosen - partition to have the same size as another. These subdirectories - must contain two scripts – <prgn>choices</prgn> and - <prgn>do_option</prgn>. The purpose of the first script is to print - menu items. For every menu item <prgn>choices</prgn> must print a - line having the form - -<example> -<var>menu_item_id</var><TAB>The text for the user -</example> - -<p> The script <prgn>choices</prgn> is allowed to print nothing. In -this case no item for the menu is created. Here <tt><TAB></tt> -is ASCII 9. The text `The text for the user' will be presented -to the users. If they choose this particular menu item the script -<prgn>do_option</prgn> will be invoked. - -<p> The script <prgn>choices</prgn> may be given some arguments - depending on the particular menu-directory. The first argument - given to <prgn>do_option</prgn> is always the - <var><tt>menu_item_id</tt></var> of the chosen menu item. The rest - of the arguments are the same as the arguments given to - <prgn>choices</prgn>. - -<p> Let we take as an example the menu that the users see when they - choose to edit some particular partition. The file - <prgn>question</prgn> in the menu-directory for this menu contains - the text <tt>partman/active_partition</tt>. This is the name of a - Debconf-template with type `select' and description `Please choose - what to do with this partition'. The package - <package>partman-partitioning</package> installs in this - menu-directory some subdirectories – - <prgn>62change_name</prgn>, <prgn>65toggle_bootable</prgn> and - <prgn>85delete</prgn>. The script - <file>62change_name/choices</file> is given two arguments – - the hard disk we edit and the id of the partition. It checks if the - type of the partition table supports partition names in which case - it prints the line -<example> -setname<TAB>Set the name of the partition -</example> -If the partition table doesn't support names, then this script prints -nothing. When the user chooses to `set the name of the partition' the -script <file>62change_name/do_option</file> is invoked. Its first -argument is <tt>setname</tt> (this is the first part of the line -printed by <prgn>choices</prgn>) and the other arguments are the same -to the arguments given to the script <prgn>choices</prgn>. In our -case the script <prgn>do_option</prgn> ignores its first argument. -The script <prgn>do_option</prgn> can use its first argument in order -to determine which menu item the user has chosen in cases when -<prgn>choices</prgn> has printed several. - -<p> Notice that the names of the subdirectories in any menu-directory -start with two digits. They are used to determine the order of the -items in the menu. - -<sect> Partitioning - -<p> The partitioning starts with the menu of the menu-directory -<file>/lib/partman/choose_partition</file>. This is the main -partitioning menu. Every udeb is allowed to install new items in it. -If the script <prgn>do_option</prgn> exits with exit-code 0 the user -will be shown again the main partitioning menu. If the script exits -with exit-code 100 this means that the partitioning should be -finished. In this case the scripts from <prgn>commit.d</prgn> and -<prgn>finish.d</prgn> will be executed as described in <ref -id="basics">. If the script <prgn>do_option</prgn> exits with exit -code 255 the partitioning will be aborted immediately. - -<p> The main partitioning menu always contains an item for every -partitioned storage device, an item for every partition and an item -for every free space. - -<p> If the user chooses a storage device the menu of the -menu-directory <file>/lib/partman/storage_device</file> will be -opened. The first argument given to <prgn>choices</prgn> is the -device directory<footnote>We are not going to describe the arguments -given to <prgn>do_option</prgn>. Look at <ref id="menudirs">.</footnote>. - -<p> If the user chooses a free space the menu-directory -<file>/lib/partman/free_space</file> will be opened. The first -argument given to <prgn>choices</prgn> is the device directory. The -second argument is the id of the free space. - -<p> If the user chooses an active partition the menu-directory -<file>/lib/partman/active_partition</file> will be opened. The first -argument given to <prgn>choices</prgn> is the device directory. The -second argument is the id of the chosen partition. If the script -<prgn>do_option</prgn> exits with exit-code 0 the user will be shown -again the menu <prgn>active_partition</prgn> for the same partition. -If the script <prgn>do_option</prgn> exits with exit-code 100 or 255 -the user will be returned back to the main partitioning menu. This -should happen when the id of the partition is invalidated, for example -when the partition is deleted or resized. - -<p> In the main partitioning menu the partitions are presented by -lines of this kind: -<example> -#8 primary 19.9 GB K ext2 /home -</example> -Notice that it is useless to indicate that the partition is primary if -the type of the partition table is `mac' as this partition table -doesn't support logical partitions. On the other hand this partition -table supports partition names. We see that we need a flexible way to -determine how the partitions are presented in the main partitioning -menu. - -<p> The directory <file>/lib/partman/visual.d</file> contains scripts -that print the parts of the partition line. For example the script -<file>/lib/partman/visual.d/filesystem</file> prints strings like -`ext3' or `FREE SPACE'. These scripts usualy start with the following -cliche: - -<example> -cd $1 - -num=$2 -id=$3 -size=$4 -type=$5 -fs=$6 -path=$7 -shift; shift; shift; shift; shift; shift; shift -name=$* -</example> -$1 is the device directory. $num is the number of the partition (for -example <file>/dev/hda6</file> has number 6). $id is the id of the -partition. $size is the size of the partition (in bytes). If this is -an active partition then $type is either `primary' or `logical'. If -this is a free space then $type shows what partition can be created in -it and $type can be `primary', `logical', `pri/log' or `unusable'. -$fs is `free' if this is a free space. Otherwise $fs is the type of -the file system of this partition as known to -<prgn>parted_server</prgn>. $path is a device name for the partition, -for example <file>/dev/ide/host0/bus0/target0/lun0/part6</file>. -$name is the name of the partition or the empty string if the -partition table doesn't support partition names. - -<p> The script <file>/lib/partman/commit.d/30parted</file> transfers -the partition tables from the internal structures of -<prgn>parted_server</prgn> to the disks. The script -<file>/lib/partman/finish.d/80parted</file> stops -<prgn>parted_server</prgn>. - -<p> The package <package>partman-base</package> installs in -<prgn>update.d</prgn> (see <ref id="update_partitions">) a script to -ensure that for every partition that contains some file system there -is a file <prgn>detected_filesystem</prgn> in the directory of the -partition whose contents is the type of the detected file system as -returned by <prgn>parted_server</prgn>. - -<sect> Setup <file>/target</file> - -<p> Without the package <package>partman-target</package> the packages -<package>partman-base</package> and <package>partman-partitioning</package> -provide only the regular partitioning operations. However if the -package <package>partman-target</package> is also unpacked then the -user will be provided with options to choose file systems for the -partitions, specify wether they should be formatted and select mount -points. The package <package>partman-target</package> adds to the -menu directory <file>/lib/partman/active_partition</file> the item -`Usage method:'. If the user chooses this item the menu directory -<file>/lib/partman/choose_method</file> will be opened. The scripts -<prgn>choices</prgn> from <prgn>choose_method</prgn> are given the -device directory as first argument and the partition id as second -argument. - -<p> The package <package>partman-basicmethods</package> adds in the -menu of the menu directory <prgn>choose_method</prgn> three items: `Do -not use the partition', `Format the partition' and `Keep and use the -existing data in the partition' (the last only if some file system is -detected). Other udebs can provide another methods to use partitions. - -<p> Every partition that is to be used somehow in the future Debian -system should have a file named `method' in its directory (what is -`directory of a partition' is described in <ref id="basics">). The -scripts <prgn>do_option</prgn> of the menu directory -<prgn>choose_method</prgn> manage the file <prgn>method</prgn>. It -contains the name of the usage method chosen by the user. For -example if the user chooses to `format the partition' the contents of -this file will be `format' and if the user chooses to `keep and use -the existing data' the contents of this file will be `keep'. -Partitions that won't be used do not have a file <prgn>method</prgn>. - -<p>The udebs providing methods may provide also translatable names of -the methods for the user interface using debconf templates named -<prgn>partman/method_long/<var>some_method</var></prgn> and -<prgn>partman/method_short/<var>some_method</var></prgn>. For example -the package <package>partman-palo</package> providing method -<prgn>palo</prgn> can provide also the following debconf templates: - -<example> -Template: partman/method_long/palo -Type: text -_Description: Palo boot partition - -Template: partman/method_short/palo -Type: text -_Description: Palo -</example> - -<p> Another job for the scripts <prgn>do_option</prgn> of the menu -directory <prgn>choose_method</prgn> is to create or remove a file -named <prgn>use_filesystem</prgn> in the directory of the partitions. -This file is created when the usage method requires the partition to -be used together with some file system. Otherwise it is removed. -Example methods that are used together with a file system are `format -the partition' and `keep and use the existing data'. Example methods -that are not used together with a file system are `LVM physical -volume' and `PALO boot partition'. - -<p> Finaly, the scripts <prgn>do_option</prgn> of the menu directory -<prgn>choose_method</prgn> have to create or remove a file named -`format' in the directory of the partitions. If the partition -directory contains a file named <prgn>format</prgn> then it will be -formatted. Otherwise it will not be formatted. For example if the user -chooses to `format the partition' the script <prgn>do_option</prgn> -will create a file <prgn>format</prgn>. If the user chooses to `keep -and use the existing data' the file <prgn>format</prgn> will be -removed if it exists. - -<p> The menu item `Choose a file system' in the menu directory -<prgn>active_partition</prgn> is also provided by the package -<package>partman-target</package>. If the user chooses it the menu -<prgn>choose_filesystem</prgn> will be opened. This menu however is -not produced using a menu directory. - -<p> Packages that provide support for some file system should install -a script in the directory <file>/lib/partman/valid_filesystems</file>. -The first argument given to this script is some device directory, the -second argument is the id of some partition and the third argument is -one of the strings `formatable' and `existing'. If it is `formatable' -then the job of the script is to check if the specified partition can -be formatted and used. If the third argument is `existing' then the -job of the script is to check if the partition can be used without -formatting. In either case if the partition can be used then the -script should print a line with the identifier of the type of the file -system. - -<p> Packages that provide support for some file systems use the -directory <file>/lib/partman/parted_names</file> to define a mapping -from the unique file system type identifiers to the names used by -<prgn>parted_server</prgn>. Suppose for example that the package -providing support for UMSDOS file system chooses the string `umsdos' -as unique identifier for the file system. Then this package must -install in this directory a file named <prgn>umsdos</prgn> whose -contents is the string `fat16'. This means that -<prgn>parted_server</prgn> will know UMSDOS file systems as being -fat16 file systems. - -<p>The udebs providing file systems may provide also translatable -names of the file systems for the user interface using debconf -templates named -<prgn>partman/filesystem_long/<var>some_filesystem</var></prgn> and -<prgn>partman/filesystem_short/<var>some_filesystem</var></prgn>. For -example the package <package>partman-ext3</package> providing file -system with unique identifier <prgn>ext3</prgn> can provide also the -following debconf templates: - -<example> -Template: partman/filesystem_long/ext3 -Type: text -_Description: Extended 3 - -Template: partman/filesystem_short/ext3 -Type: text -_Description: Ext3 -</example> - -<p> Most of the packages that provide support for a file system will -have to add an item `Mount point:' to the menu -<prgn>active_partition</prgn>. Of course this item should be shown -only when the contents of the file <prgn>acting_filesystem</prgn> is -appropriate. The mount point chosen by the user should be written in -a file named <prgn>mountpoint</prgn> situated in the directory of the -partition. If the user chooses not to mount this file system then the -file <prgn>mountpoint</prgn> should be removed (if it exists). - -<p> In order to be able to mount file systems and generate fstab the - directories <file>/lib/partman/fstab.d/</file> and - <file>/lib/partman/mount.d/</file> are used. The scripts from - <prgn>fstab.d</prgn> should print lines in a form similar to that of - <file>/etc/fstab</file>: -<example> -<var>file_system</var> <var>mount_point</var> <var>type</var> <var>options</var> <var>dump</var> <var>pass</var> -</example> - - The first field (<var><tt>file_system</tt></var>) is the name of a - device that can be accessed by the installer. For example this can - be <file>/dev/ide/host0/bus0/target0/lun0/part5</file> despite that - in the future system this device will be named - <file>/dev/hda5</file>. On the other hand the other five fields - should look exactly the same way as in the <prgn>fstab</prgn> to be - generated. For example <var><tt>options</tt></var> can contain - options such as <tt>quota</tt> that are senseless for the installer. - -<p> The scripts from <prgn>mount.d</prgn> are used to mount file - systems. A string having the same form as the lines output by the - scripts from <prgn>fstab.d</prgn> should be given as first argument - to any script from <prgn>mount.d</prgn>. Any script from - <prgn>mount.d</prgn> checks if it can mount the requested file - system. If it cannot then the script exits with some non-zero exit - code. Otherwise the script must mount the file system in the proper - place in the hierarchy over <file>/target</file>, print on its - standard output a command that should be used in order to unmount - the file system and exit with exit code 0. - -<p> The scripts in the directories <prgn>fstab.d</prgn> and -<prgn>mount.d</prgn> are installed by the udebs that provide support -for file systems. - -<p> Packages that provide support for file systems install in -<prgn>commit.d</prgn> a script to format the partitions that the user -has requested to be formatted. The package -<package>partman-target</package> installs in <prgn>finish.d</prgn> a -script to mount the partitions on <file>/target</file>. The packages -that provide support for storage devices (RAID, LVM, etc.) install in -<prgn>finish.d</prgn> a script to add in -<file>/target/etc/fstab</file> the necessary lines. - -<p> The package <package>partman-target</package> installs in -<prgn>update.d</prgn> (see <ref id="update_partitions">) a script to -ensure that for every partition that is to be used there is a file -<prgn>acting_filesystem</prgn> in the directory of the partition whose -contents is the identifier of the type of file system under which the -partition should be used. - -<chapt> <file>/lib/partman/lib/*</file> - -<p> Various scripts in partman make use of <em>function libraries</em>: -separate files, mostly containing shell functions, that are sourced -by scripts so they can make use of common functions and code duplication -can be avoided. - -<p> The main function library is <file>base.sh</file>, provided by -<package>partman-base</package>. This file is sourced by most scripts -in partman as it defines a lot of useful variables and common functions. -Some of these are documented in the remainder of this chapter. -<footnote>The script <file>base.sh</file> has become somewhat too long and -this probably makes its sourcing slow. Although some reorganization has -already taken place, it could be a good idea to split it up further.</footnote> - -<p> Other packages provide more targeted function libraries. In most cases -their scope and use can easily be determined from their name. - -<sect> Environment - -<p> The variables <tt>TAB</tt> and <tt>NL</tt> have values -ASCII 9 and ASCII 10 correspondingly. They can be used as -temporary values for the variable <tt>IFS</tt>. The function -<prgn>restore_ifs</prgn> restores the variable <tt>IFS</tt> its -original value. - -<p> The function library <prgn>base.sh</prgn> also contains simple -reimplementations of <prgn>basename</prgn> and <prgn>dirname</prgn> so -that busybox doesn't have to provide them. - - -<sect> Menus - -<p> The function <prgn>debconf_select</prgn> is a high level function - to ask user with a menu using a Debconf question with type `select'. - Synopsis: -<example> -debconf_select <var>priority</var> <var>template</var> <var>choices</var> <var>default</var> -</example> - -<p> The first argument is the debconf-priority of the question and the - second is the name of the template to be used. The third argument - is a newline-separated list of items for the menu. Each item has - the form -<example> -<var>menu_item_id</var><TAB>The text for the user -</example> - -<p> Here <tt><TAB></tt> is ASCII 9. The text `The text for - the user' is the text of the menu item. If - <var><tt>menu_item_id</tt></var> of some menu-item is identical with - the fourth argument given to <prgn>debconf_select</prgn> then this - menu-item will be default. - -<p> If the user cancels the question <prgn>debconf_select</prgn> - returns with exit-code 255. Otherwise the value of the variable - <tt>RET</tt> will be the <var><tt>menu_item_id</tt></var> of the - chosen menu item. If the chosen menu item was chosen by the user - then the exit-code is 0. If the item was chosen automatically (due - to the debconf-priority or to some other reason) the exit-code is 1. - -<p> The function <prgn>debconf_select</prgn> doesn't care - to <prgn>db_fset</prgn> <tt>$template</tt> <tt>seen</tt> <tt>false</tt>. - The template must have exactly the following type and choices fields: -<example> -Type: select -Choices-C: ${CHOICES} -Choices: ${DESCRIPTIONS} -</example> - -<p> The udebs that generate menus using menu-directories use the - function <prgn>ask_user</prgn> instead of - <prgn>debconf_select</prgn>. Synopsis: - -<example> -ask_user <var>a_menu_directory</var> <var>additional_optional_arguments</var>... -</example> - -<p> This function displays the menu for - <tt><var>a_menu_directory</var></tt>. The first argument is a - menu-directory (see <ref id="menudirs">). If the user cancels the - dialog then <prgn>ask_user</prgn> returns with exit code 255. - Otherwise it returns with the exit code of the script - <prgn>do_option</prgn>. - -<p> If <prgn>ask_user</prgn> is called re-entrantly from within a -<prgn>do_option</prgn> script, then the calling <prgn>do_option</prgn> -script should typically be careful to handle or discard exit code 255 -itself (and sometimes other codes, depending on the protocol in force) -to avoid a backup operation inadvertently backing up out of several -nested menus at once. - -<p> The script <prgn>choices</prgn> is invoked with -<var><tt>additional_optional_arguments</tt></var> as arguments. The -first argument given to <prgn>do_option</prgn> is the -<var><tt>menu_item_id</tt></var> of the chosen menu item and the -other arguments are again -<var><tt>additional_optional_arguments</tt></var>. - -<p> To set the default selected item in a menu-directory, use the function - <prgn>menudir_default_choice</prgn>. Synopsis: - -<example> -menudir_default_choice <var>a_menu_directory</var> <var>subdirectory</var> <var>menu_item_id</var> -</example> - -<p> Where the <var><tt>subdirectory</tt></var> is the name of a -subdirectory in the menu-directory with the leading sequence number -stripped off and <var><tt>menu_item_id</tt></var> is the id of a -menu-item printed by -<file><var>a_menu_directory</var>/??<var>subdirectory</var>/choices</file>. -The specified item is set as default not forever but only for the next -invocation of <prgn>ask_user</prgn>. It is not an error to set as -default non-existing item; in this case the first item in the menu -will be default. - -<p> The function <prgn>partition_tree_choices</prgn> prints a sequence -of lines in the form -<example> -<var>menu_item_id</var><TAB>The text for the user -</example> -– one for every storage device and one for every partition. The -<var><tt>menu_item_id</tt></var> of the storage devices is their -storage directory. The <var><tt>menu_item_id</tt></var> of the -partitions has the form -<var>storage_directory</var>//<var>partition_id</var>. The output of -<prgn>partition_tree_choices</prgn> can be given as third argument to -<prgn>debconf_select</prgn>. - - -<sect> Long numbers - -<p> Notice that the sizes of most of the present storage devices -are so large that we cannot measure them using 32-bit integers. -Consequently we cannot use the usual shell arithmetic. The functions -<prgn>longint_le</prgn>, <prgn>longint2human</prgn>, -<prgn>human2longint</prgn> and <prgn>valid_human</prgn> exist in order -to deal with such big numbers. - -<p> The function <prgn>longint_le</prgn> is used to compare two big -numbers. -<example> -longint_le <var>number1</var> <var>number2</var> -</example> -returns with exit code 0 if the first number is less or equal to -the second and returns 1 otherwise. - -<p> The function <prgn>longint2human</prgn> accepts in its first -argument some number of bytes, converts it to something that is more -meaningful for humans and outputs the result. For example -<example> -longint2human 1234567890 -</example> -gives <tt>1.2 GB</tt>. Notice that this function rounds its -argument. - -<p> The function <prgn>human2longint</prgn> is used for the opposite -convertion: -<example> -human2longint 1.234Gb -</example> -gives <tt>1234000000</tt>. - -<p> The function <prgn>valid_human</prgn> returns with exit -code 0 when its first argument is a string that is suitable to be -given to <prgn>human2longint</prgn>. Otherwise it returns with exit -code 1. - -<sect id="update_partitions"> Updating partition directories - -<p> Different components of the installer may need to get information -about the partitions. They can communicate with -<prgn>parted_server</prgn> in order to know the characteristics of the -partition. However not everything can be known from -<prgn>parted_server</prgn>. Imagine an udeb that provides the user -with the option to upgrade some existing GNU/Linux installation. This -udeb analyses the <prgn>fstab</prgn> and knows that some partition is -used as <file>/home</file> and should not be formatted. This sort of -information has nothing to do with <prgn>parted_server</prgn>. The -udeb stores it in a subdirectory of the device directory named after -the id of the partition. - -<p> But now a problem arises. Suppose that the user chooses to format -some partition as ext2 and mount it on <file>/home</file>. The udebs -responsible for formatting and mounting create the directories -<prgn>filesystem</prgn> and <prgn>mountpoint</prgn> in the partition. -What will happen if the users change their mind and decide to use the -same partition as swap space? Swap spaces have no mount points and -the file <prgn>mountpoint</prgn> should be removed. Who is -responsible for removing it? The udeb that allows the user to choose a -file system for the partition doesn't have to know that swap-spaces -have no mount points, only the udeb that provides support for -swap-spaces can know that the file <prgn>mountpoint</prgn> should be -removed. - -<p> In order to solve this difficulty every script that makes changes -to some partition should invoke the function -<prgn>update_partition</prgn> from <prgn>base.sh</prgn>. -Synopsis: -<example> -update_partition <var>device_directory</var> <var>partition_id</var> -</example> -In order to update the contents of the directory -<file><var>device_directory</var>/<var>partition_id</var></file> the -function <prgn>update_partition</prgn> executes the scripts from the -directory <file>/lib/partman/update.d/</file>. Every udeb is allowed -to install scripts in this directory. Their names are prefixed by -two-digit numbers that control the order of the execution. The -scripts from <prgn>update.d</prgn> are given several arguments. $1 is -the <var>device_directory</var>. $2 is the number of the partition -(<file>/dev/hda6</file> will have number 6). $3 is the id of the -partition. $4 is the length of the partition (in bytes). $5 is the -type of the partition, it can be either `primary' or `logical'. $6 is -the type of the file system as known to <prgn>parted_server</prgn>, in -most cases you should ignore this argument. $7 is the device name -(for example <file>/dev/ide/host0/bus0/target0/lun0/part6</file>). -"$8 $9 $10 $11 ..." is the name of the partition -in partition tables that support partition names. Otherwise $8, $9, -$10,... are not defined. - -<sect> Communication with <prgn>parted_server</prgn> - -<p> The package <package>partman-base</package> creates two FIFOs – -<file>/var/lib/partman/infifo</file> and -<file>/var/lib/partman/outfifo</file>. <prgn>Parted_server</prgn> -reads instructions from <prgn>infifo</prgn> and responds by writting -to <prgn>outfifo</prgn>. Consequently the clients write to -<prgn>infifo</prgn> and read from <prgn>outfifo</prgn>. The function -library <prgn>base.sh</prgn> contain several functions to make the -communication with <prgn>parted_server</prgn> easier. Here we will -omit the details, if you want to know the exact communication protocol -please read how these functions are implemented. - -<p> The functions <prgn>open_infifo</prgn>, <prgn>close_infifo</prgn>, -<prgn>open_outfifo</prgn> and <prgn>close_outfifo</prgn> are called -without arguments. They open and close <prgn>infifo</prgn> and -<prgn>outfifo</prgn> assigning them file descriptors 6 and 7 -correspondingly. You do not need to use these low-level functions. - -<p> The function <prgn>write_line</prgn> prints its arguments to -<prgn>outfifo</prgn>. - -<p> The function <prgn>read_line</prgn> reads from <prgn>infifo</prgn> -a line, splits it in fields according to <tt>$IFS</tt> and assigns -these fields to variables whose names are given to -<prgn>read_line</prgn> as arguments. For example -<example> -read_line x y z -</example> -reads a line from <prgn>infifo</prgn>, splits it and assigns the first -field to the variable <tt>x</tt>, the second field to the variable -<tt>y</tt> and the rest to the variable <tt>z</tt>. You see that -<prgn>read_line</prgn> is used the same way as the shell operator -<prgn>read</prgn>. - -<p> The function <prgn>read_paragraph</prgn> reads consequently lines -from <prgn>infifo</prgn> until it reaches an empty line. It prints -the read lines with the exception of the last empty line. - -<p> The function <prgn>read_list</prgn> reads lines the same way as -the function <prgn>read_paragraph</prgn>. However the function -<prgn>read_list</prgn> always prints only one line that is a -comma-separated sequence of the lines read from <prgn>infifo</prgn>. -If <prgn>read_paragraph</prgn> prints -<example> -This is the first line -This is the second line -This is the third line -</example> -<prgn>read_list</prgn> prints -<example> -This is the first line, This is the second line, This is the third line -</example> - -<p> In order to initiate a communication dialog with -<prgn>parted_server</prgn> you will use the function -<prgn>open_dialog</prgn>. You will invoke it in the device directory -of the device you want to issue command about. The first argument of -<prgn>open_dialog</prgn> is a command for <prgn>parted_server</prgn>. -The rest arguments are arguments for the command. - -<p> You use the function <prgn>close_dialog</prgn> in order to -terminate the communication dialog. - -<p> When you send <prgn>parted_server</prgn> an order to do some -long operation (e.g. resize a file system) the user will be shown a -progress bar. You may give a name to it by the function -<prgn>name_progress_bar</prgn>. It may be used right before the -command <prgn>open_dialog</prgn> and accepts only one argument – -a template with type text that describes what is being done. - -<p> The function <prgn>log</prgn> appends its arguments to the file -<file>/var/log/partman</file>. This file is used as log-file also by -<prgn>parted_server</prgn>. - -<chapt> The commands of <prgn>parted_server</prgn> - -<p> You should be very careful when you communicate with the -<prgn>parted_server</prgn>. If <prgn>parted_server</prgn> detects any -error it will exit immediately. This is safer approach then to try to -resolve somehow the error. However this also means that the user will -not be shown any information about what happened and why the installer -freezed. The log-file <file>/var/log/partman</file> can be used to -see the reasons why <prgn>parted_server</prgn> exited. - -<sect> Open a new device - -<p>Synopsis: -<example> -cd <var>device_directory</var> -open_dialog OPEN <var>device_name</var> -read_line status -close_dialog -case $status in - OK) - # The device has been opened successfully - ;; - failed) - # We wasn't able to open the device - ;; -esac -</example> -Here <var><tt>device_name</tt></var> can be for example -<file>/dev/ide/host0/bus0/target0/lun0/disc</file>. - -<sect> Close a device - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog CLOSE -close_dialog -</example> - -After this command you may not issue commands regarding the device of -<var><tt>device_directory</tt></var>. This command does -<strong>not</strong> invoke the command COMMIT. - -<sect> Does the partition exist on the disk? - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog VIRTUAL <var>partition_id</var> -read_line virtuality -close_dialog -case $virtuality in - yes) - # the partition does not exist on the disk - # probably because it is newly created - ;; - no) - # the partition exists on the disk - ;; -esac -</example> - -<sect> Remember the partition table as unchanged - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog DISK_UNCHANGED -close_dialog -</example> - -After this command <prgn>parted_server</prgn> will know that the -partition table in its onw internal data structures is the same as the -partition table actualy existing on the device. The main purpose of -this command is to be used for partition tables with type <tt>loop</tt>. - -<sect> Report whether the partition table is changed - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog IS_CHANGED -read_line changed -close_dialog -case $changed in - yes) - # the partition table is changed - ;; - no) - # the partition table is not changed - ;; -esac -</example> - - -<sect> Dump the partitions - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog DUMP -close_dialog -</example> - -<p> This command prints in <file>/var/log/partition_dump</file> -all the data regarding the device. It is used for debugging. - -<sect> Write partitioning to the disk - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog COMMIT -close_dialog -</example> - -<p> This command transfers the partitions in the device of -<var><tt>device_directory</tt></var> from the internal structures of -<prgn>parted_server</prgn> to the disk. - -<sect> Undo the changes - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog UNDO -close_dialog -</example> - -<p> This command destroys the internal data structures in -<prgn>parted_server</prgn> for a device and then rereads them from the -device. - -<sect> Get the partitions - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog PARTITIONS -while { read_line num id size type fs path name; [ "$id" ]; }; do - # do something for this partition -done -close_dialog -</example> - -<p> The body of the loop is executed for every partition and free -space. $num is the number of the partition (for example -<file>/dev/hda6</file> has number 6). $id is the id of the partition. -$size is the size of the partition (in bytes). If this is an active -partition then $type is either `primary' or `logical'. If this is a -free space then $type shows what partition can be created in it. In -this case $type can be `primary', `logical', `pri/log' or `unusable'. -$fs is `free' if this is a free space. Otherwise $fs is the type of -the file system of this partition as known to -<prgn>parted_server</prgn>. $path is a device name for the partition, -for example <file>/dev/ide/host0/bus0/target0/lun0/part6</file>. -$name is the name of the partition or the empty string if the -partition table doesn't support partition names. - -<p> Notice that in the loop-body you may not initiate another dialog -with <prgn>parted_server</prgn>. If you need this you can use the -following construction instead: -<example> -cd <var>device_directory</var> -open_dialog PARTITIONS -partitions=$(read_paragraph) -close_dialog - -echo "$partitions" | -while { read num id size type fs path name; [ "$id" ]; }; do - # do something for this partition -done -</example> - -<sect> Getting info about a partition - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog PARTITION_INFO <var>partition_id</var> -read_line num id size type fs path name -close_dialog -</example> -Here <var><tt>partition_id</tt></var> is the id of the partition to -get info. The meaning of the variables are the same as in the command -PARTITIONS. - -<sect> Getting cylinder/head/sector geometry of a partition/free space - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog GET_CHS <var>partition_id</var> -read_line start_cyl start_head start_sector end_cyl end_head end_sector -close_dialog -</example> - -<sect> Getting the supported partition table types - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog LABEL_TYPES -supported=$(read_list) -close_dialog -</example> -For the result of this command <var><tt>device_directory</tt></var> is -irrelevant. Despite this <var><tt>device_directory</tt></var> must be -a valid device directory. - -<p> This command is used to read which types partition tables are -supported by <prgn>parted_server</prgn> (i.e. by libparted). -$supported is a comma-separated list of the supported types. At the -time of writting the following types are supported: bsd, gpt, mac, -dvh, msdos, pc98, sun and loop. - -<sect> Get the type of the disk label - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog GET_LABEL_TYPE -read_line label_type -close_dialog -if [ "$label_type" = unknown ]; then - echo "The disk is unknown or it has no disk label - or the disk label is unknown" -else - echo "The type of the disk label is:" "$label_type" -fi -</example> -This command returns the type of the disk label (i.e. the partition -table) of a disk. It can be used to check if there is a partition -table (if not, then it is safe to create a new partition table or to -use the entire disk for RAID, LVM, encrypted unit, etc). - -<sect> Create a new empty partition table - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog NEW_LABEL <var>partition_table_type</var> -close_dialog -</example> -This command creates in the device a new empty partition table with -type <var><tt>partition_table_type</tt></var>. (Of course it won't be -written to the disk if you don't use the command COMMIT.) - -<sect> Getting the meaningful flags for a partition - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog VALID_FLAGS <var>partition_id</var> -meaningful_flags=$(read_list) -close_dialog -</example> -$meaningful_flags is a comma-separated list of the flags that are -meaningful for the partition with id -<var><tt>partition_id</tt></var>. - -<p> In order to check wether some particular flag xyz is meaningful -you can use this code: -<example> -cd <var>device_directory</var> -xyz_is_meaningful=no -open_dialog VALID_FLAGS <var>partition_id</var> -while { read_line flag; [ "$flag" ]; }; do - if [ "$flag" = xyz ]; then - xyz_is_meaningful=yes - # you may not use break here - fi -done -close_dialog -</example> - -<sect> Getting the active flags of a partition - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog GET_FLAGS <var>partition_id</var> -active_flags=$(read_list) -close_dialog -</example> -$active_flags is a comma-separated list of the flags of the partition -with id <var><tt>partition_id</tt></var> that are in state 1. This is -a sublist of the list returned by the command VALID_FLAGS. - -<p> In order to check if some partition is denoted as bootable you can -use this code: -<example> -cd <var>device_directory</var> -is_bootable=no -open_dialog GET_FLAGS <var>partition_id</var> -while { read_line flag; [ "$flag" ]; }; do - if [ "$flag" = boot ]; then - is_bootable=yes - # you may not use break here - fi -done -close_dialog -</example> - -<sect> Set the flags of a partition - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog SET_FLAGS <var>partition_id</var> -for flag in $all_flags_that_should_be_active; do - write_line $flag -done -write_line NO_MORE -close_dialog -</example> - -<p> If you want to denote some partition as non-bootable you can use -the following code: - -<example> -cd <var>device_directory</var> -open_dialog GET_FLAGS <var>partition_id</var> -new_flags=$( - while { read_line flag; [ "$flag" ]; }; do - if [ "$flag" != boot ]; then - echo $flag - fi - done -) -close_dialog - -open_dialog SET_FLAGS $id -write_line "$new_flags" -write_line NO_MORE -close_dialog -</example> - -<sect> Check if partition names are supported - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog USES_NAMES -read_line supported -close_dialog -case $supported in - yes) - # the partition table supports partition names - ;; - no) - # the partition table doesn't support partition names - ;; -esac -</example> - -<sect> Set the name of a partition - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog SET_NAME <var>partition_id</var> <var>new_name</var> -close_dialog -</example> -After this command the name of <var><tt>partition_id</tt></var> will -be <var><tt>new_name</tt></var>. It is an error to use this command with -a partition table that doesn't support partition names. - -<sect> Get the maximum number of primary partitions - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog GET_MAX_PRIMARY -read_line primaries -close_dialog -logger "This disk may contain up to $primaries primary partitions" -</example> - -<sect> Check if extended and logical partitions are supported - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog USES_EXTENDED -read_line supported -close_dialog -case $supported in - yes) - # the partition table supports extended and logical partitions - ;; - no) - # the partition table doesn't support extended and logical partitions - ;; -esac -</example> - -<sect> Get the known to <prgn>parted_server</prgn> file systems - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog FILE_SYSTEM_TYPES -known_filesystems=$(read_list) -close_dialog -</example> -$known_filesystems is a comma-separated list of the file systems that -are known to <prgn>parted_server</prgn>. You probably won't need to -use this command. - -<sect> Try to detect the file system in a partition - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog GET_FILE_SYSTEM <var>partition_id</var> -read_line filesystem -close_dialog -if [ "$filesystem" = none ]; then - # no known file system is detected -else - # a file system of type $filesystem is detected -fi -</example> - -<sect> Change the filesystem of a partition - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog CHANGE_FILE_SYSTEM <var>partition_id</var> <var>new_filesystem</var> -close_dialog -</example> - -<p> libparted assigns every partition some file system. This command -can be used to change this file system. The file system assigned to -the partition is not necessarily the same as the actual file system. -Libparted uses it to determine automatically the type of the partition -in some partition tables. For example with msdos partition tables the -partitions with file system `ext2' receive type 83. The partitions -that are swap spaces receive type 82. - -<sect> Create a new partition - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog NEW_PARTITION $type $fs $freespace $position $length -read_line num id size type fs path name -close_dialog -if [ "$id" ]; then - # the partition is successfully created -else - # wasn't able to create the partition -fi -</example> -$type is either primary or logical. $fs is the type of the file -system to be assigned to the partition. $freespace is the id of some -free space. $position is either `full', `beginning' or `end' and -determines where in $freespace to create the new partition. If -$position is not `full' then $length is the length that the new -partition should have (in bytes). - -<p> If the new file system is successfully created $num is tne number -of the created partition (for example <file>/dev/hda6</file> has -number 6). $id is the id of the new partition. $size is the size of -the new partition. $size is approximately $length but not necessarily -the same. $type and $fs don't change their values. $path is a -device name, for example -<file>/dev/ide/host0/bus0/target0/lun0/part6</file>. $name is the -name of the new partition or an empty string if the partition table -doesn't support partition names. - -<sect> Delete a partition - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog DELETE_PARTITION <var>partition_id</var> -close_dialog -</example> - -<sect> Resize a partition - -<p> Synopsis: -<example> -cd <var>device_directory</var> -name_progress_bar <var>some/debconf/template</var> -open_dialog RESIZE_PARTITION <var>partition_id</var> <var>new_size</var> -read_line new_id -close_dialog -</example> -This command resizes a partition. As usualy -<var><tt>new_size</tt></var> is measured in bytes. $new_id is the new -id that the partition receives. The resizing is not supported always. -If it fails $new_id will be the same as -<var><tt>partition_id</tt></var>. - -<p> If the partition exists on the storage device and contains some -file system, then the data in the partition will be preserved and the -new partition table <em>will be written on the storage device</em>. -When it is impossible to resize the file system, the partition will be -left unresized. When the partition doesn't exist on the storage -device, the new version of the partition table will not be written to -it. - -<p> This command doesn't move the start of the partition but only its -end. - -<p> The command <prgn>name_progress_bar</prgn> may be omitted. The -debconf template must have type text. It will be used to give the user -information of what is being done. - -<sect> Get resize range - -<p> Synopsis: -<example> -cd <var>device_directory</var> -open_dialog GET_RESIZE_RANGE <var>partition_id</var> -read_line minimal_size current_size maximal_size -close_dialog -</example> -This command returns the minimal and the maximal size that can be -achieved by using the command RESIZE_PARTITION. $minimal_size, -$current_size and $maximal_size are measured in bytes. - - -<chapt> Bugs and limitations - -<p> All files and directories are assumed to not contain spaces in -their names. - -<p> If the partition table supports extended and logical partitions -the user won't be shown free spaces whose size is less than one -cylinder. - -</book> - -<!-- Local variables: --> -<!-- coding: iso-8859-1 --> -<!-- End: --> diff --git a/doc/devel/partman/style-common.xsl b/doc/devel/partman/style-common.xsl new file mode 120000 index 000000000..b6e795c56 --- /dev/null +++ b/doc/devel/partman/style-common.xsl @@ -0,0 +1 @@ +../internals/style-common.xsl \ No newline at end of file diff --git a/doc/devel/partman/style-html.xsl b/doc/devel/partman/style-html.xsl new file mode 120000 index 000000000..592c2e736 --- /dev/null +++ b/doc/devel/partman/style-html.xsl @@ -0,0 +1 @@ +../internals/style-html.xsl \ No newline at end of file -- 2.18.0