`fdisk': the Linux partition table editor
=========================================

`fdisk' is the Linux partition table editor.  In this section we
examine this utility and try to describe it thoroughly enough so that
anyone can use it.

* Contents:

* Disks and how they are described.
* Dividing up your disk.
* The `fdisk' command.
* Deleting and adding partitions.
* Active flags and system types.
* Extra commands for experts.
* Warnings for `fdisk' users.


Disks and how they are described
--------------------------------

A typical disk consists physically of one or more circular objects
called "platters", which rotate about a central axis.  Devices called
"heads" move to specified places on the disk surface to read or write
information.  There is usually one head on each side of every platter,
and all these heads are attached to a comb-like controller arm which
moves all of them at the same time, either closer to the centre of the
disk, or closer to the outer edge.

Suppose the arm is in one position, putting an area of the disk
surface within reach of one or another of the heads.  This total area,
everything that is accessible without moving the arm, is called a
"cylinder".  (A cylinder is a barrel-shaped cross section of a disk,
consisting of a circular strip from each side of each platter.)  The
part of a cylinder that one head can read or write without moving is
called a "track".

Each track is divided into several pie-shaped slices called
"sectors", which are the smallest parts of the disk which can be read
or written at a time.  The sectors on one disk are usually all the same
size.

In fact, there are not always two heads to every platter, there are
some disks which do not have the same amount of data in every cylinder,
and there may be disks which do not have the same amount of data in
every sector.  These features are usually hidden on PCs by the
controller card or the BIOS, which map the physical geometry of a disk
onto a logical geometry, which is what is actually used to access the
disk.

The numbers which describe the "geometry" of a disk are

  1. The number of cylinders it contains.

  2. The number of tracks per cylinder, which is the number of heads.

  3. The number of sectors per track.

  4. The number of bytes per sector.

These numbers vary from disk to disk, but a typical PC disk might
have about 1000 cylinders, half a dozen heads, and 15 or 20 sectors per
track, with each sector containing 512 bytes or characters; such a disk
contains 40 to 60 megabytes of data.  A "double density" floppy disk
contains 40 cylinders, with 2 heads (2 tracks per cylinder), and with 9
sectors per track; such a disk contains 360 kilobytes, or 360 * 1024
characters.  A "high density" 3.5 inch floppy contains 80 cylinders,
with 2 heads and 18 sectors per track, or 1.44 megabytes, or 1440 *
1024 characters.

The exact size of a track or cylinder in bytes varies from one disk
to another.  This `fdisk' for Linux deals mainly with cylinders, since
this is the best unit to use when allocating space for partitions.  It
reports partition sizes in "blocks" of 1024 bytes, or 2 sectors, since
`mkswap' and the various `mkfs' programs require this number.  A block
is the smallest amount of space which can be set aside for a file in
the current file systems.

An operating system, such as Linux or DOS or OS/2, may use a disk in
any way that it wishes, but if two operating systems share the same
disk, they must agree on who owns what, or else one will interfere with
the other (that is, by damaging the other's files).  A "partition" is a
section of a hard disk which is handled as a unit by all operating
systems which can access the disk.  The standard way to define
partitions (for the moment) is the "partition table", a list of
information which is stored in parts of the disk that don't belong to
any of the systems using the disk.  The beginning of the partition
table is stored in the disk's primary boot sector, and the rest is
stored in a chain of sectors scattered throughout the disk.

The first sector on the disk is called the "primary boot block" or
"primary boot sector" because (1) it comes first, before other, similar
sectors; (2) it tells where the other, similar sectors are found, so
that it is logically `prior' to them; and (3) it usually contains code
which is executed when the system boots up.  This sector contains a
table describing at most four partitions.  These areas are called
"primary partitions".

The partition table in the primary boot sector may also describe at
most one "extended partition".  This is a large area of the disk,
usually containing all the space which is not in any primary partition.
Within this space we can set aside other areas which are called
"logical partitions", because they look almost exactly like primary
partitions.  In fact, the main difference between them is that we can
boot from primary partitions, while we cannot boot from logical
partitions.  This happens because the address of a primary partition is
in a fixed place, whereas the address of a secondary partition is not,
so we require a more complicated process to discover it, one which is
too difficult for most primary boot programs.


Dividing up your disk
---------------------

It is a good idea to plan ahead before you start creating partitions
on your disk.  If you set aside a partition for some purpose, it is not
easy to change its size: you must backup all the data from the partition,
whether to floppies, to another partition, to another hard disk, or
somewhere else; then you must edit the table which describes this
partition, so changing its size; then you must reboot and initialise
the new partition, formatting it, for example, under DOS, or running
`mkfs' under Linux; finally you can copy all the data back.  It is
possible, if you have several partitions, to copy data back and forth
between them while you change their sizes, but this is a bit risky and
time consuming.  It is better to plan ahead what you will need, since
it is hard to change it afterwards.

Many people with large disks and recent versions of DOS have their
entire file system on one large partition.  They usually ask, `Isn't
there any way I can reformat my disk without copying everything off?'
There is no way to do it using standard DOS utilities, and there is no
truly safe way to do it using commercial software, because, if you make
a mistake, you will lose the entire contents of your disk.  If you are
going to back up your disk anyway, you might as well copy the data back
safely.  The Linux FAQ contains references to tools and procedures
which will allow you to do this, if you dare.

DOS and Linux both allow you to access several partitions on a
single disk; on DOS these are treated as if they were separate disks or
drives, and under Linux they are treated as different "devices".

You can have up to 64 partitions on a single IDE disk, or up to 16
partitions on a single SCSI disk, at least as far as Linux is
concerned; in practice you will rarely want so many.  The maximum size
of a Linux file system on a single partition depends on the type of
file system you use.  Minix file systems are limited to 64 megabytes.
You may have all of your Linux files in a single partition, or you may
have two, three, or more Linux file systems.  Similarly you may have
one or more DOS partitions.  If you have several small partitions, you
run much less risk of losing all your files if your disk gets
corrupted.  On the other hand, you may run out of space on a small
partition more easily.

Under DOS, you must refer to each partition by a separate drive
letter, but all partitions are automatically accessible.  Under Linux
only the root partition is automatically accessible, but once we mount
another partition, it is indistinguishable from the rest of the file
system.  Disks are usually mounted by a command in one of the system
startup files, `/etc/rc', so you need not worry about having to do it
yourself whenever you boot the system.  But even ordinary users may
be allowed to mount removable hard disks and floppy disks.

Linux requires at least one partition, which is the `root' of the
file system.  You may prefer to have a separate partition for `/usr',
which contains most of the executable files, or for `/home', which
contains most of your private files.  You may also wish to set aside a
partition to use for swap space, depending on the amount of memory your
PC has.  You will certainly need swap space if you have less than 4 MB
of RAM and wish to compile anything substantial.  You can reserve swap
space in a file, but you need a partition big enough to hold it, and
this will probably be less efficient than having a partition devoted to
swap.

The disk space you need for Linux is discussed in README.prepare.

Are you going to boot Linux from the hard disk, or will you boot
from a floppy?  Some boot programs place severe restrictions on where
the boot partition can be.  LILO is more relaxed about this, but does
require either the Master Boot Record on your first hard disk, or the
boot record on one of the first four partitions on your first hard disk.

If you have an extended partition with logical partitions in it, you
can have only three primary partitions containing data.


The `fdisk' command
-------------------

Every operating system, whether DOS, OS/2, or Linux, should provide
its own utility for editing hard disk partition tables.  At least four
of these utilities have been called `fdisk', for `Fixed DISK setup
program', where `fixed' means `not removable'.  I believe the first PC
program named `fdisk' came from Microsoft in about 1985; before that
time disks were too small to divide into separate sections.

Every operating system has its own peculiarities.  Normally you
should set up a partition for the use of one operating system by using
its own `fdisk' program.  Do not use the Linux `fdisk' to create
partitions for DOS or for any system other than Linux; otherwise you
may have problems.

An `fdisk' program performs two functions: it reports how the disk is
configured, and it changes that configuration by adding or deleting
partitions.  Most `fdisk' programs can also change other information in
partition tables.

This `fdisk' for Linux operates on one hard disk at a time.  If you
give the command

     fdisk

it reports on, and is able to change, `/dev/hda', the first hard
disk.  (If you have no `/dev/hda', `fdisk' uses `/dev/sda' as the
default device.) To look at or change the second hard disk, `/dev/hdb',
give the command

     fdisk /dev/hdb

To look at or change the first SCSI disk, give the command

     fdisk /dev/sda

There are some special forms of the `fdisk' command.  One of them,
suggested by Jim Winstead, simply lists all partitions on all available
disks:

     fdisk -l     (where `l' is a letter, not the digit `1')

The option `-v' is provided to list the current version of the
`fdisk' command.  Finally, there is an option `-s' which is not really
intended for interactive use.  It causes fdisk to print the size of a
partition in blocks of 1024 bytes as follows:

     fdisk -s /dev/hda7
     39934

Because this is intended to be used by `mkfs' and `mkswap' programs,
it does not return the size of extended partitions or of partitions
whose system type code is less than 10 (hexadecimal a).  If you start
`fdisk' without using one of these special options, it responds by
asking for a command:

     Command (m for help): _

Each `fdisk' command consists of a single letter, which must be
followed by <RETURN> before it is obeyed.  Upper and lower case are not
distinguished.  Anything you type after the first character is ignored.
Give the command `m', and you should see this menu:
      Command action
         a   toggle a bootable flag
         d   delete a partition
         l   list known partition types
         m   print this menu
         n   add a new partition
         p   print the partition table
         q   quit without saving changes
         t   change a partition's system id
         u   change display/entry units
         v   verify the partition table
         w   write table to disk and exit
         x   extra functionality (experts only)
     
      Command (m for help): _

The simplest commands are Print, Verify, and Quit.  On a small disk, the
Print command might produce a display like this one:

     Disk /dev/hda: 5 heads, 17 sectors, 977 cylinders
     Units = cylinders of 85 * 512 bytes
     
        Device Boot  Begin   Start     End  Blocks   Id  System
     /dev/hda1   *       1       1     236   10021+   1  DOS 12-bit FAT
     /dev/hda2         837     837     977    5992+   5  Extended
     /dev/hda3   *     237     237     836   25500   83  Linux native
     /dev/hda5         837     837     936    4249+  82  Linux swap
     /dev/hda6         942     942     977    1522    1  DOS 12-bit FAT

There are 5 partitions reported; `/dev/hda4' does not appear because
it is not allocated.  Partitions 1 and 3 are flagged as bootable.  The
size of each partition is reported in 1 kilobyte blocks; hence the
primary Linux partition, partition 3, is 25 1/2 megabytes in size.  The
`+' after three of the sizes warns that these partitions contain an odd
number of sectors: Linux normally allocates filespace in 1 kilobyte
blocks, so the extra sector in partition 5 is wasted.  Id numbers are
reported in hexadecimal and explained in English.

The display/entry units may be either cylinders or sectors.  The
default is cylinders, but changing the units makes the print command
display the following table for the system reported above:

     Disk /dev/hda: 5 heads, 17 sectors, 977 cylinders
     Units = sectors of 1 * 512 bytes
     
        Device Boot  Begin   Start     End  Blocks   Id  System
     /dev/hda1   *       1      17   20059   10021+   1  DOS 12-bit FAT
     /dev/hda2       71060   71060   83044    5992+   5  Extended
     /dev/hda3   *   20060   20060   71059   25500   83  Linux native
     /dev/hda5       71061   71061   79559    4249+  82  Linux swap
     /dev/hda6       79985   80001   83044    1522    1  DOS 12-bit FAT

The start of data in both DOS partitions is 16 sectors after the
beginning of the partition: this is one reason why you should use DOS's
own `FDISK' to create DOS partitions.  Changing the units to sectors
also affects the way in which the new partition command asks for the
beginning and end of a new partition.

*Warning*: it is dangerous to create a new partition when the
display/entry units are sectors.

The Verify command is useful because

  1. It warns you if anything is wrong.  *Always* do a Verify command
     to check your work before writing any changes to disk.

  2. It reports how many unallocated sectors there are on the disk.

The Quit command is also useful.  `fdisk' does not actually change
any data on your disk unless you give a Write command.  If you are
unhappy about any changes you may have made, give the Quit command, and
your disk will remain as it was before you ran `fdisk'.  You can also
interrupt `fdisk' with `CTRL-C'.


Deleting and adding partitions
------------------------------

Deleting a partition is simple.  Give the Delete command by typing
`d'.  `fdisk' asks:

     Partition number (1-6): _

Once you get this far, you must either delete a partition or
interrupt the program with `CTRL-C' (or whatever your current interrupt
character is).  Note:

  1. You may delete a nonexistent partition.  You will get a warning
     message.

  2. You may delete an extended partition.  This has the side effect of
     deleting all partitions greater than or equal to 5.

  3. You may delete a logical partition.  In that case, all partitions
     above it are renumbered at once.  For example, if you delete
     partition 5, then partition 6 becomes known as partition 5, and
     partition 7 as partition 6.

Adding a partition is just a bit more complicated.  Give the New
command by typing `n'.  `fdisk' allows you to

  1. Create a primary partition, if there is a free slot in the primary
     partition table.

  2. Create an extended partition if there is a free slot in the
     primary partition table, and if there is no extended partition.

  3. Create a logical partition if an extended partition exists.

If more than one of these actions is possible, you will be asked to
select Primary, Extended, or Logical, depending on what is currently
permissible.  Before you create a primary or an extended partition, you
are asked what slot it is to have in the table (1-4).

You may not add a primary or an extended partition if the selected
slot in the primary partition table is already occupied: in that case
you simply return to the main menu.  You are not allowed to add a new
primary partition unless there are sectors available outside the
extended partition.  You are not allowed to add a new logical partition
unless there are sectors available inside the extended partition.

If space is available, you are prompted for the first cylinder:

     First cylinder ([237]-977): _

The limits are the lowest and the highest cylinders in which sectors
are available in the appropriate part of the disk.  The square-bracketed
number is what you'll get if you simply press enter.  Not all numbers in
this range are necessarily available: they may fall inside an existing
partition.  If you select a cylinder which is already in use, you are
told off and prompted again for the first cylinder.  After selecting the
first cylinder, you are prompted again:

     Last cylinder or +size or +sizeM or +sizeK (237-[836]): _

The limits are the cylinder you have chosen as the first cylinder,
and the highest cylinder which contains a legitimate upper boundary for
the new partition.  The square-bracketed number is what you'll get if
you simply press enter. In other words, all numbers in the given range are
legitimate, unlike those in the first range of cylinders.  You may also
specify the size of a partition in megabytes, kilobytes, or in the
current units (cylinders or sectors).  A plus sign `+' indicates that
your answer is a size rather than a boundary, and the suffix `m' or `k'
(upper or lower case) indicates that the size is not given in units of
sectors or cyliners, but in megabytes or kilobytes respectively.  Thus
possible answers to the last cylinder request above are

700
     Make cylinder 700 the last cylinder in the partition.

+300
     Make cylinder 237 + 300 = 537 the last cylinder in the partition.

+15m
     Make the partition at least 15 megabytes in size.

+12500k
     Make the partition at least 12,500 kilobytes in size.

If you specify a size which is too large or an end which is out of
range, fdisk complains and repeats the prompt.

Adding or deleting partitions has no effect unless you subsequently
give the Write command.  Please remember to give the Verify command
first, just before giving the Write command: this is a safety
precaution.  After giving the Write command, you will see this message:

     The partition table has been altered!
     Calling ioctl() to re-read partition table.
     Syncing disks.

If there are no further messages, the kernel has successfully copied
the information from the partition table into its own internal table.
But sometimes you will see a message like this one:

     Re-read table failed with error 16: Device or resource busy.
     Reboot your system to ensure the partition table is updated.

In this case, depending on what you have changed in the partition
table, it may be dangerous to continue working without rebooting,
since you may lose or corrupt your data.


Here are some important things to note:

  1. Before you reboot, you *may* run `fdisk' again, either to manage
     another disk, or to make additional changes to the same disk, or
     just to check that the changes have been made as you expected.
     This is true even after you receive the message warning you to
     reboot.

  2. It is not a good idea to run any of the programs `mkfs', `mkswap',
     `mount', or `swapon' if you have received the warning message but
     have not rebooted.  In this case it is dangerous to run any program,
     but these in particular may cause serious damage to the data on your
     disk, including the partition tables themselves.


Active flags and system types
-----------------------------

The active flag is a bit in the partition table entry which marks a
partition as bootable.  This is important to some primary boot sector
programs, which will not boot from an unflagged partition.  Other such
programs do not allow more than one partition to be flagged.  Some,
like LILO, ignore the flags completely.  I prefer to flag all bootable
partitions as active so that they stand out on the menu which `fdisk'
lists.  Fdisk prints a star after the name of a partition's device file
if its active flag is set.

The Active command changes, or toggles, a partition's active flag.
Give the Active command, and select a partition by number.  If it was
marked inactive, it will be flagged as active; if it was flagged as
active, it will be marked inactive.  You may set the active flag on an
extended or logical partition, though the meaning of such a flag is by
no means clear.  This can be used to install LILO as a secondary boot
loader to boot a Linux which lives on a second hard disk.

The Type command changes the ID number which describes what type a
partition is.  `fdisk' currently recognises 30 system IDs, in the sense
that it prints a string for each of them, but it allows you to change
any system ID to any other, with the following exceptions: you may not
change any partition to or from the type Extended, and you may not
change a partition whose type is Empty (0) to any other type.  You may,
however, change the type of any data partition to 0, which is
equivalent to deleting it.

The new system ID or type code is a hexadecimal number.  There are
two ways of listing the numbers which `fdisk' recognises: use the List
command, which prints the list, or use the Type command, which, when it
prompts you for the code, says

     Hex code (type L to list codes): _

where the upper case `L' is used for clarity.  The codes printed are:
Some of these numbers are a trifle uncertain.  By default `fdisk' uses
a type of 83.  It used to use 81, the type code used by the MINIX
`fdisk'.  It seemed prudent to change the default since (a) many Linux
`minix' file systems are no longer compatible with MINIX, (b) the ext2
file system, a native Linux file system, is fairly stable, as is the
Xia file system, and (c) the number 81 causes problems with DR-DOS.
Linux does not usually care what values you use for type codes, but
other systems, in particular DOS, OS/2, and DR-DOS, may.

The value of 82 for Linux swap partitions is my own invention, and
is intended to give some recognisable distinction to the partitions
when the values are displayed in hexadecimal.

New active flags and new system type codes are not written to the
disk until you exit from `fdisk' with the Write command, as described
above, in the section on deleting and adding partitions.


Extra commands for experts
--------------------------

The eXtra command `x' puts `fdisk' into `expert' mode, in which a
slightly different set of commands is available.  The Active, Delete,
List, New, Type, Verify, and `eXpert' commands are not available in
expert mode.  The commands Write and Quit are available as in ordinary
mode, the Print command is available, but produces output in a slightly
different format, and of course the Menu command prints the expert
menu.  There are several new commands.

  1. The Return command brings you back to the main menu.

  2. The Extended command prints the list of table entries which point
     to other tables.  Ordinary users do not need this information.
     The data is shown as it is stored.  The same format is used for
     the expert Print command.

  3. The dangerous Begin command allows you to move the start of data
     in a partition away from its beginning.  Other systems create
     partitions with this format, and it is sometimes useful to be able
     to reproduce it.

  4. The slightly dangerous Cylinders command allows you to change the
     available number of cylinders.  For SCSI disk owners, note that we
     require not the actual number of physical cylinders, but the
     number of logical cylinders used by DOS and other operating
     systems.

  5. The extremely dangerous Heads and Sectors commands allow you to
     change the number of heads and sectors.  It should not be
     necessary to use these commands unless you have a SCSI disk, whose
     geometry Linux is not always able to determine.  SCSI disk owners
     note that we need not the actual number of heads or of sectors per
     track, but the number believed to exist by DOS and other operating
     systems.  *Warning*: If you set either of these numbers to a bad
     value, you may lose all data on your disk.

Always, after giving any of the commands Begin, Cylinder, Heads, or
Sectors, you should Return to the main menu and give the Verify command.


Warnings for `fdisk' users
--------------------------

In general, you should not use this `fdisk' program to create
partitions for other operating systems, only for Linux.  Nor should you
use `fdisk' commands from other operating systems to create partitions
for Linux.

DR-DOS 5.0 and 6.0 are reported to have difficulties with partition
ID codes of 80 or more.  The Linux `fdisk' used to set the system type
of new partitions to hexadecimal 81.  DR-DOS seems to confuse this with
hexadecimal 1, a DOS code.  The values 82 for swap and 83 for file
systems should not cause problems with DR-DOS.  If they do, you may use
the `fdisk' command `t' to change the system code of any Linux
partitions to some number less than hexadecimal 80; I suggest 42 and 43
for the moment.

Partitioning a hard disk may destroy data which is on that disk if you
are not careful.  Go slowly, write down a description of the partition
tables before you changed them, and always verify before you write.

Most operating systems and utilities expect that all partitions begin and
end at cylinder boundaries.  This version of `fdisk' does so by default,
but you can use it to create partitions which begin or end anywhere.
This does not normally affect Linux, but it is very dangerous, as other
operating systems (including DOS) may try to `correct' the partition
boundaries.

It is dangerous to create a new partition when the display/entry
units are sectors.

The Verify command warns you if anything is wrong.  *Always* give a
Verify command before writing any changes to disk.

If you set the disk geometry (tracks per cylinder, or sectors per
track) to an incorrect value, you may lose all data on your disk.

Do create BSD/SUN and/or IRIX/SGI disk labels only when you are sure
that you want them.  Both features are intended to allow you READing
those labels and prevent unintentional formatting of these disks.
