Frequently asked question about the Linux floppy driver

Most of the floppy utilities mentioned in this FAQ can be found in the fdutils package. For others, consult the lsm or archie. Alpha releases of fdutils are named fdutils-version-YearMonthDay..diff.gz


How do I access floppy drives in Linux?

Either use mtools or mount the disk. Mtools can be found here.

It is a collection of utilities to access DOS disks. These utilities behave mostly like their DOS counterparts, i.e. mdir is like dir, mcopy is like copy, etc. Specifics are in the manpages.

To mount a disk on /mnt, use the following command lines:

 mount -t msdos /dev/fd0 /mnt

The directory /mnt must already exist:

 mkdir /mnt

How should I report bugs?

If you have a question or a bug report about the floppy driver, mail me at alain @ linux.lu . If you post to the news, use preferably one of the groups comp.os.linux.help (for questions) or comp.os.linux.hardware (for bug reports). As the volume in these groups is rather high, be sure to include the word "floppy" (or "FLOPPY") in the subject line.

I can't fdformat the new formats.

Fdformat is considered obsolete. Use superformat instead.

Mtools says "12 bit FAT on a: sure?" when trying to access an ED disk (or a similar message) when formatting a disk

Some ED (extra density) disks use 16 bit FATS. The FAT type (12 or 16 bit) is described in the configuration file (/etc/mtools or ~/.mtoolsrc). It is the first number. Example:
A /dev/fd0 12 0 0 0
           ^^ 12 bit FAT

12means12 bit FAT
16means16 bit FAT
0means"use whatever is appropriate"
-12means12 bit FAT, even if it looks fishy
-16means16 bit FAT, even if it looks fishy

CAUTION: If you have an /etc/mtools file AND an ~/.mtoolsrc file, the ~/.mtoolsrc file overrides /etc/mtools. The home directory used for ~/.mtoolsrc is $HOME, if that is undefined, it is derived from $LOGNAME, and if that's undefined too, it is derived from getlogin, and finally from getuid.

There are also compiled-in defaults, which are used if neither /etc/mtools, nor ~/.mtoolsrc are found.

Mtools says "fat_read: Wrong FAT encoding 12 16?" (or similar) when accessing a disk formatted with the old mtools.

mtools does some sanity checks on the size of the FAT. Unfortunately, these are too strict for certain disks formatted with the old mtools, and for hard disk partitions formatted by DOS 6, and probably for other conditions as well. Define the environment variable MTOOLS_FAT_COMPATIBILITY to override this check.

(to do this, type
 setenv MTOOLS_FAT_COMPATIBILITY 1
in csh or tcsh, and
 export MTOOLS_FAT_COMPATIBILITY=1
in sh/bash/zsh/...)

How should I describe the new 2m formats in /etc/mtools?

Support for both disk drives a: and b: for all formats (except Xdf) is already built into the new version of mtools (3.9.10). Definitions for new drive letters no longer override these default definitions.

Just for the record, here are definitions to mimic the standard behavior:

 drive a: file="/dev/fd0"
 drive b: file="/dev/fd1"

How should I describe the Xdf formats in /etc/mtools?

The following /etc/mtools lines allow to access all disks, including Xdf:


 drive a: file="/dev/fd0" use_xdf=1
 drive b: file="/dev/fd1" use_xdf=1

However, the use_xdf flag slightly slows down initial access to non Xdf disks.

Which minor device number should I use for 2m formats?

2m formats don't have a minor number associated with them, they can only be accessed using the "generic format" devices (i.e. /dev/fd0, /dev/fd1).

I have an IBM Thinkpad :-(

Don't panic. Add the line 'floppy=thinkpad' to your lilo boot parameters. This can be entered at the lilo prompt after the name of the kernel image. It can also be specified in the lilo.conf file, by adding the following line:

 append = "floppy=thinkpad"

With some IBM thinkpads, it's also possible to make their floppy drive work by toggling the "FLOPPY" option in CMOS from "auto" to "on". However, apparently this CMOS option is not available on all models.

On some models, both options may be required, on others, none are required.

More info about IBM Tinkpads on Linux can be found here.

What are the minor device numbers for the floppy device nodes?

The major device number for the floppy drives is 2. The minor device number is calculated using the following formula:

    minor_device = format_nr * 4 + 128 * fdc_nr + unit_nr

(fdc_nr identifies the floppy disk controller, and unit_nr identifies which drive on the floppy disk controller to be used) format_nr identifies the format (see the README file in fdutils for more details). If format_nr is 0, the device is an autodetection device. Use the MAKEFLOPPIES script included in the fdutils package to automatically create the needed devices.

What are the recommended names for the floppy device nodes?

Floppy drives are named fd drive_nr type max_capacity.

Drive_nr identifies the drive. It ranges from 0 to 3 for drives connected to the first controller, and from 4 to 7 for drives connected to the second controller.

Type is the type of the drive or media. The exact meaning of this (drive or media) is still being discussed. Traditionally, this letter described the type of the drive (density, 5 1/4 or 3 1/2). Lower case letters described 5 1/4 drives, and upper case letters describe 3 1/2 drives. h or H meant high density drives, d or D meant double density drives.

Initially this letter described the type of the drive and not the type of the media in the drive. For instance, a format meant for accessing 720k double density disks in a high density drive was called h720k and not d720k. The reason for this is that for 5 1/4 drives the parameters for accessing a disk do not only depend on the format of the disk, but also on the drive type. The format of the disk is already implied by the capacity, and so the type letter is used to describe the type of the drive.

However, this dependency on the drive type only exists for 5 1/4 drives. For 3 1/2 drives, this is not needed, and as 3 1/2 drives are more frequent, people started forgetting about this, and understood that the letter described the media format. When support for extra density drives was added to the kernel, people still used the name H1440 for accessing high density disks using their extra density drive. By the way, several distribution use this scheme.

In order to calm down the confusion, we propose to make the type letter again describe the type of the drive. However, all 3 1/2 drives are now described by a unique type letter: "u". This means universal (one letter fits all 3 1/2 formats). Moreover the u resembles the Greek letter mu, as in microfloppy.

So the recommended name for a device node allowing to read 1440K disks in a 3 1/2 drive (no matter its density) is called u1440. Note that this is now lowercase.

However, this new convention is still subject to discussion.

Capacity is the capacity of the media in K bytes. Fortunately, this leads to no ambiguity.

Example:

A device node allowing to use 720K 5 1/4 floppies in a high density drive connected as first unit to the second controller is called /dev/fd4h720

Right now, MAKEFLOPPIES supports all three conventions (media, drive, and "u"), you may chose amongst them using command line switches.

My drive doesn't detect disk changes / When I type mdir a:, I get the directory listing of the previous disk.

This means that there is a problem with the disk change line. This problem may have several reasons:

I get "No such device or address" errors for various floppy related commands.

This message can mean one of several things:

  1. No floppy driver is compiled into the kernel, and no floppy module is inserted. Kerneld may fail to automatically insert the floppy module when you upgraded your kernel without upgrading the module and moving it to a place where kerneld finds it.
  2. The drive doesn't exist (mistyped drive name?)
  3. No disk is in the drive.
  4. A problem with the disk change line: The disk change line is not only used to detect disk changes, but also to tell whether there is a disk in the drive at all.) See question 13 for fixes for disk change line problem.
  5. The floppy geometry is unknown for the getfdprm or fdformat programs. If you format a disk, rather use superformat.

I have a HP Omnibook 6000 :(

These laptops are supplied with a floppy-drive & fdc combo which doesn't support DMA :( Just add floppy=nodma to your Lilo command line. More info about the Omnibook and linux can be found here.

I can't get my floppy drive going, is there another method to install?

You may also install via hard disk and initrd. You need a big enough hard disk to do this (and it takes a little bit more time than the usual method). The following method presumes that it is possible to access the disk using DOS.

  1. Leave a small DOS partition (with enough spare space to hold the tar files from a few install disks). The bigger that partition is, the less come and goes from DOS are needed later. However, the bigger it is, the less space is available for Linux itself.
  2. On a desktop computer, using Linux, make a filesystem on a smallish spare partition (for instance on your swap partition). This filesystem should contain the files usually found on the install root disks. Add a '/linuxrc' file which contains the following lines:
    
    #!/bin/sh
    . etc/rc
    /bin/sh
    
  3. On the desktop computer, unmount the filesystem, and dd it to a file. Compress the file, and copy it to a floppy disk.
  4. Copy it to the Laptops hard disks.
  5. Copy the tar files from the first few install disks to the laptops hard disk.
  6. Use loadlin to boot Linux on the laptop (use the umsdos fs as root).
  7. Start installation (tell the install program to look for the tar files on your hard disk).
  8. If the first few files are installed, move back to DOS to erase the tar files which you already unpacked, and copy the next ones.
  9. reboot Linux.
  10. repeat until all is installed.
  11. After installation, it is wise to leave that DOS partition, in case you need to bring more files later.
Steps 5 to 10 may be skipped if your laptop has a CD-ROM drive :-)

Is it possible to use two floppy disk controllers under Linux?

YES. To use both controllers, boot the kernel with the lilo parameter 'floppy=two_fdc'. This parameter can be given on the lilo prompt, just after the name of the kernel. It can also be specified in the /etc/lilo.conf file by adding the following line:

 append = "floppy=two_fdc"

It is assumed that your second controller lives at 0x370. If it uses another I/O base-address, change this address in the floppy.c. The drives on the second controller use the minor device numbers 128-131 for the generic device, and 132-255 for the fixed geometry device. The following formula gives the minor number:

	minor = fdc * 128 + geometry * 4 + unit 

See the README file in fdutils for more details.

Is it possible to boot off these special format disks?

Yes. Make sure you have a version of lilo more recent than v18, and put the following line into your /etc/lilo.defines before compiling it:

 -DXL_SECS=44

This enables Lilo to boot from disks with up to 44 sectors (i.e. more than you'll ever see :-) ) It allows to boot from ED disks and from disks with more sectors than usual (up to 21 on a HD disk, 42 on an ED disk). However, 2m and Xdf disks cannot be booted using this method.

I get "Unable to allocate DMA memory" messages when trying to use the floppy.

This happens whenever the memory is too scarce to allocate the floppy driver's DMA buffer. It is possible to use the floppy driver without DMA, and in that case, the floppy driver uses vmalloc'ed memory, which is more readily available. In order to disable DMA, use the floppy=nodma boot flag. If you use the floppy driver as a module, set the environment variable 'floppy' to 'dma'.

I have a Micron Millenia Transport.

Apparently, these laptops are supplied with a floppy controller which doesn't support the fifo.

Switch off the FIFO by adding floppy=nofifo to your Lilo command line.