`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 center 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 initialize
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 (version 1) 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.

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 cylinders, 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.
