home *** CD-ROM | disk | FTP | other *** search
/ Freelog Special Edition 1: Linux / CD1.iso / doc / HOWTO / mini / Large-Disk < prev    next >
Text File  |  1998-10-14  |  20KB  |  463 lines

  1.   Large Disk HOWTO
  2.   Andries Brouwer, aeb@cwi.nl
  3.   v1.1, 18 May 1998
  4.  
  5.   All about disk geometry and the 1024 cylinder limit for disks.
  6.  
  7.   1.  The problem
  8.  
  9.   Suppose you have a disk with more than 1024 cylinders.  Suppose
  10.   moreover that you have an operating system that uses the BIOS.  Then
  11.   you have a problem, because the usual INT13 BIOS interface to disk I/O
  12.   uses a 10-bit field for the cylinder on which the I/O is done, so that
  13.   cylinders 1024 and past are inaccessible.
  14.  
  15.   Fortunately, Linux does not use the BIOS, so there is no problem.
  16.  
  17.   Well, except for two things:
  18.  
  19.   (1) When you boot your system, Linux isn't running yet and cannot save
  20.   you from BIOS problems.  This has some consequences for LILO and
  21.   similar boot loaders.
  22.  
  23.   (2) It is necessary for all operating systems that use one disk to
  24.   agree on where the partitions are.  In other words, if you use both
  25.   Linux and, say, DOS on one disk, then both must interpret the
  26.   partition table in the same way.  This has some consequences for the
  27.   Linux kernel and for fdisk.
  28.  
  29.   Below a rather detailed description of all relevant details.  Note
  30.   that I used kernel version 2.0.8 source as a reference.  Other
  31.   versions may differ a bit.
  32.  
  33.  
  34.  
  35.   2.  Booting
  36.  
  37.   When the system is booted, the BIOS reads sector 0 (known as the MBR -
  38.   the Master Boot Record) from the first disk (or from floppy), and
  39.   jumps to the code found there - usually some bootstrap loader.  These
  40.   small bootstrap programs found there typically have no own disk
  41.   drivers and use BIOS services.  This means that a Linux kernel can
  42.   only be booted when it is entirely located within the first 1024
  43.   cylinders.
  44.  
  45.   This problem is very easily solved: make sure that the kernel (and
  46.   perhaps other files used during bootup, such as LILO map files) are
  47.   located on a partition that is entirely contained in the first 1024
  48.   cylinders of a disk that the BIOS can access - probably this means the
  49.   first or second disk.
  50.  
  51.   Another point is that the boot loader and the BIOS must agree as to
  52.   the disk geometry.  It may help to give LILO the `linear' option.
  53.   More details below.
  54.  
  55.  
  56.  
  57.   3.  Disk geometry and partitions
  58.  
  59.   If you have several operating systems on your disks, then each uses
  60.   one or more disk partitions.  A disagreement on where these partitions
  61.   are may have catastrophic consequences.
  62.  
  63.   The MBR contains a partition table describing where the (primary)
  64.   partitions are.  There are 4 table entries, for 4 primary partitions,
  65.   and each looks like
  66.  
  67.   struct partition {
  68.           char active;    /* 0x80: bootable, 0: not bootable */
  69.           char begin[3];  /* CHS for first sector */
  70.           char type;
  71.           char end[3];    /* CHS for last sector */
  72.           int start;      /* 32 bit sector number (counting from 0) */
  73.           int length;     /* 32 bit number of sectors */
  74.   };
  75.  
  76.  
  77.  
  78.  
  79.   (where CHS stands for Cylinder/Head/Sector).
  80.  
  81.   Thus, this information is redundant: the location of a partition is
  82.   given both by the 24-bit begin and end fields, and by the 32-bit start
  83.   and length fields.
  84.  
  85.   Linux only uses the start and length fields, and can therefore handle
  86.   partitions of not more than 2^32 sectors, that is, partitions of at
  87.   most 2 TB.  That is a hundred times larger than the disks available
  88.   today, so maybe it will be enough for the next eight years or so.
  89.  
  90.   Unfortunately, the BIOS INT13 call uses CHS coded in three bytes, with
  91.   10 bits for the cylinder number, 8 bits for the head number, and 6
  92.   bits for the track sector number.  Possible cylinder numbers are
  93.   0-1023, possible head numbers are 0-255, and possible track sector
  94.   numbers are 1-63 (yes, sectors on a track are counted from 1, not 0).
  95.   With these 24 bits one can address 8455716864 bytes (7.875 GB), two
  96.   hundred times larger than the disks available in 1983.
  97.  
  98.   Even more unfortunately, the standard IDE interface allows 256
  99.   sectors/track, 65536 cylinders and 16 heads.  This in itself allows
  100.   access to 2^37 = 137438953472 bytes (128 GB), but combined with the
  101.   BIOS restriction to 63 sectors and 1024 cylinders only 528482304 bytes
  102.   (504 MB) remain addressable.
  103.  
  104.   This is not enough for present-day disks, and people resort to all
  105.   kinds of trickery, both in hardware and in software.
  106.  
  107.  
  108.  
  109.   4.  Translation and Disk Managers
  110.  
  111.   Nobody is interested in what the `real' geometry of a disk is.
  112.   Indeed, the number of sectors per track often is variable - there are
  113.   more sectors per track close to the outer rim of the disk - so there
  114.   is no `real' number of sectors per track.  For the user it is best to
  115.   regard a disk as just a linear array of sectors numbered 0, 1, ...,
  116.   and leave it to the controller to find out where a given sector lives
  117.   on the disk.
  118.  
  119.   This linear numbering is known as LBA.  The linear address belonging
  120.   to (c,h,s) for a disk with geometry (C,H,S) is c*H*S + h*S + (s-1).
  121.   All SCSI controllers speak LBA, and some IDE controllers do.
  122.  
  123.   If the BIOS converts the 24-bit (c,h,s) to LBA and feeds that to a
  124.   controller that understands LBA, then again 7.875 GB is addressable.
  125.   Not enough for all disks, but still an improvement.  Note that here
  126.   CHS, as used by the BIOS, no longer has any relation to `reality'.
  127.  
  128.   Something similar works when the controller doesn't speak LBA but the
  129.   BIOS knows about translation.  (In the setup this is often indicated
  130.   as `Large'.)  Now the BIOS will present a geometry (C',H',S') to the
  131.   operating system, and use (C,H,S) while talking to the disk
  132.   controller.  Usually S = S', C' = C/N and H' = H*N, where N is the
  133.   smallest power of two that will ensure C' <= 1024 (so that least
  134.   capacity is wasted by the rounding down in C' = C/N).  Again, this
  135.   allows access of up to 7.875 GB.
  136.  
  137.   If a BIOS does not know about `Large' or `LBA', then there are
  138.   software solutions around.  Disk Managers like OnTrack or EZ-Drive
  139.   replace the BIOS disk handling routines by their own.  Often this is
  140.   accomplished by having the disk manager code live in the MBR and
  141.   subsequent sectors (OnTrack calls this code DDO: Dynamic Drive
  142.   Overlay), so that it is booted before any other operating system.
  143.   That is why one may have problems when booting from a floppy when a
  144.   Disk Manager has been installed.
  145.  
  146.   The effect is more or less the same as with a translating BIOS - but
  147.   especially when running several different operating systems on the
  148.   same disk, disk managers can cause a lot of trouble.
  149.  
  150.   Linux does support OnTrack Disk Manager since version 1.3.14, and EZ-
  151.   Drive since version 1.3.29.  Some more details are given below.
  152.  
  153.  
  154.  
  155.   5.  Kernel disk translation for IDE disks
  156.  
  157.   If the Linux kernel detects the presence of some disk manager on an
  158.   IDE disk, it will try to remap the disk in the same way this disk
  159.   manager would have done, so that Linux sees the same disk partitioning
  160.   as for example DOS with OnTrack or EZ-Drive.  However, NO remapping is
  161.   done when a geometry was specified on the command line - so a
  162.   `hd=cyls,heads,secs' command line option might well kill compatibility
  163.   with a disk manager.
  164.  
  165.   The remapping is done by trying 4, 8, 16, 32, 64, 128, 255 heads
  166.   (keeping H*C constant) until either C <= 1024 or H = 255.
  167.  
  168.   The details are as follows - subsection headers are the strings
  169.   appearing in the corresponding boot messages.  Here and everywhere
  170.   else in this text partition types are given in hexadecimal.
  171.  
  172.  
  173.   5.1.  EZD
  174.  
  175.   EZ-Drive is detected by the fact that the first primary partition has
  176.   type 55.  The geometry is remapped as described above, and the
  177.   partition table from sector 0 is discarded - instead the partition
  178.   table is read from sector 1.  Disk block numbers are not changed, but
  179.   writes to sector 0 are redirected to sector 1.  This behaviour can be
  180.   changed by recompiling the kernel with
  181.    #define FAKE_FDISK_FOR_EZDRIVE  0 in ide.c.
  182.  
  183.  
  184.   5.2.  DM6:DDO
  185.  
  186.   OnTrack DiskManager (on the first disk) is detected by the fact that
  187.   the first primary partition has type 54.  The geometry is remapped as
  188.   described above and the entire disk is shifted by 63 sectors (so that
  189.   the old sector 63 becomes sector 0).  Afterwards a new MBR (with
  190.   partition table) is read from the new sector 0.  Of course this shift
  191.   is to make room for the DDO - that is why there is no shift on other
  192.   disks.
  193.  
  194.  
  195.   5.3.  DM6:AUX
  196.  
  197.   OnTrack DiskManager (on other disks) is detected by the fact that the
  198.   first primary partition has type 51 or 53.  The geometry is remapped
  199.   as described above.
  200.  
  201.  
  202.   5.4.  DM6:MBR
  203.  
  204.   An older version of OnTrack DiskManager is detected not by partition
  205.   type, but by signature.  (Test whether the offset found in bytes 2 and
  206.   3 of the MBR is not more than 430, and the short found at this offset
  207.   equals 0x55AA, and is followed by an odd byte.) Again the geometry is
  208.   remapped as above.
  209.  
  210.  
  211.   5.5.  PTBL
  212.  
  213.   Finally, there is a test that tries to deduce a translation from the
  214.   start and end values of the primary partitions: If some partition has
  215.   start and end cylinder less than 256, and start and end sector number
  216.   1 and 63, respectively, and end heads 31, 63 or 127, then, since it is
  217.   customary to end partitions on a cylinder boundary, and since moreover
  218.   the IDE interface uses at most 16 heads, it is conjectured that a BIOS
  219.   translation is active, and the geometry is remapped to use 32, 64 or
  220.   128 heads, respectively.  (Maybe there is a flaw here, and genhd.c
  221.   should not have tested the high order two bits of the cylinder
  222.   number?)  However, no remapping is done when the current idea of the
  223.   geometry already has 63 sectors per track and at least as many heads
  224.   (since this probably means that a remapping was done already).
  225.  
  226.  
  227.   6.  Consequences
  228.  
  229.   What does all of this mean?  For Linux users only one thing: that they
  230.   must make sure that LILO and fdisk use the right geometry where
  231.   `right' is defined for fdisk as the geometry used by the other
  232.   operating systems on the same disk, and for LILO as the geometry that
  233.   will enable successful interaction with the BIOS at boot time.
  234.   (Usually these two coincide.)
  235.  
  236.   How does fdisk know about the geometry?  It asks the kernel, using the
  237.   HDIO_GETGEO ioctl.  But the user can override the geometry
  238.   interactively or on the command line.
  239.  
  240.   How does LILO know about the geometry?  It asks the kernel, using the
  241.   HDIO_GETGEO ioctl.  But the user can override the geometry using the
  242.   `disk=' option.  One may also give the linear option to LILO, and it
  243.   will store LBA addresses instead of CHS addresses in its map file, and
  244.   find out of the geometry to use at boot time (by using INT 13 Function
  245.   8 to ask for the drive geometry).
  246.  
  247.   How does the kernel know what to answer?  Well, first of all, the user
  248.   may have specified an explicit geometry with a `hd=cyls,heads,secs'
  249.   command line option.  And otherwise the kernel will ask the hardware.
  250.  
  251.  
  252.   6.1.  IDE details
  253.  
  254.   Let me elaborate.  The IDE driver has four sources for information
  255.   about the geometry.  The first (G_user) is the one specified by the
  256.   user on the command line.  The second (G_bios) is the BIOS Fixed Disk
  257.   Parameter Table (for first and second disk only) that is read on
  258.   system startup, before the switch to 32-bit mode.  The third (G_phys)
  259.   and fourth (G_log) are returned by the IDE controller as a response to
  260.   the IDENTIFY command - they are the `physical' and `current logical'
  261.   geometries.
  262.  
  263.   On the other hand, the driver needs two values for the geometry: on
  264.   the one hand G_fdisk, returned by a HDIO_GETGEO ioctl, and on the
  265.   other hand G_used, which is actually used for doing I/O.  Both G_fdisk
  266.   and G_used are initialized to G_user if given, to G_bios when this
  267.   information is present according to CMOS, and to to G_phys otherwise.
  268.   If G_log looks reasonable then G_used is set to that.  Otherwise, if
  269.   G_used is unreasonable and G_phys looks reasonable then G_used is set
  270.   to G_phys.  Here `reasonable' means that the number of heads is in the
  271.   range 1-16.
  272.  
  273.   To say this in other words: the command line overrides the BIOS, and
  274.   will determine what fdisk sees, but if it specifies a translated
  275.   geometry (with more than 16 heads), then for kernel I/O it will be
  276.   overridden by output of the IDENTIFY command.
  277.  
  278.  
  279.   6.2.  SCSI details
  280.  
  281.   The situation for SCSI is slightly different, as the SCSI commands
  282.   already use logical block numbers, so a `geometry' is entirely
  283.   irrelevant for actual I/O.  However, the format of the partition table
  284.   is still the same, so fdisk has to invent some geometry, and also uses
  285.   HDIO_GETGEO here - indeed, fdisk does not distinguish between IDE and
  286.   SCSI disks.  As one can see from the detailed description below, the
  287.   various drivers each invent a somewhat different geometry.  Indeed,
  288.   one big mess.
  289.  
  290.   If you are not using DOS or so, then avoid all extended translation
  291.   settings, and just use 64 heads, 32 sectors per track (for a nice,
  292.   convenient 1 MB per cylinder), if possible, so that no problems arise
  293.   when you move the disk from one controller to another.  Some SCSI disk
  294.   drivers (aha152x, pas16, ppa, qlogicfas, qlogicisp) are so nervous
  295.   about DOS compatibility that they will not allow a Linux-only system
  296.   to use more than about 8 GB.  This is a bug.
  297.  
  298.   What is the real geometry?  The easiest answer is that there is no
  299.   such thing.  And if there were, you wouldn't want to know, and
  300.   certainly NEVER, EVER tell fdisk or LILO or the kernel about it.  It
  301.   is strictly a business between the SCSI controller and the disk.  Let
  302.   me repeat that: only silly people tell fdisk/LILO/kernel about the
  303.   true SCSI disk geometry.
  304.  
  305.   But if you are curious and insist, you might ask the disk itself.
  306.   There is the important command READ CAPACITY that will give the total
  307.   size of the disk, and there is the MODE SENSE command, that in the
  308.   Rigid Disk Drive Geometry Page (page 04) gives the number of cylinders
  309.   and heads (this is information that cannot be changed), and in the
  310.   Format Page (page 03) gives the number of bytes per sector, and
  311.   sectors per track.  This latter number is typically dependent upon the
  312.   notch, and the number of sectors per track varies - the outer tracks
  313.   have more sectors than the inner tracks.  The Linux program scsiinfo
  314.   will give this information.  There are many details and complications,
  315.   and it is clear that nobody (probably not even the operating system)
  316.   wants to use this information.  Moreover, as long as we are only
  317.   concerned about fdisk and LILO, one typically gets answers like
  318.   C/H/S=4476/27/171 - values that cannot be used by fdisk because the
  319.   partition table reserves only 10 resp. 8 resp. 6 bits for C/H/S.
  320.  
  321.   Then where does the kernel HDIO_GETGEO get its information from?
  322.   Well, either from the SCSI controller, or by making an educated guess.
  323.   Some drivers seem to think that we want to know `reality', but of
  324.   course we only want to know what the DOS or OS/2 FDISK (or Adaptec
  325.   AFDISK, etc) will use.
  326.  
  327.   Note that Linux fdisk needs the numbers H and S of heads and sectors
  328.   per track to convert LBA sector numbers into c/h/s addresses, but the
  329.   number C of cylinders does not play a role in this conversion.  Some
  330.   drivers use (C,H,S) = (1023,255,63) to signal that the drive capacity
  331.   is at least 1023*255*63 sectors.  This is unfortunate, since it does
  332.   not reveal the actual size, and will limit the users of most fdisk
  333.   versions to about 8 GB of their disks - a real limitation in these
  334.   days.
  335.  
  336.   In the description below, M denotes the total disk capacity, and C, H,
  337.   S the number of cylinders, heads and sectors per track.  It suffices
  338.   to give H, S if we regard C as defined by M / (H*S).
  339.  
  340.   By default, H=64, S=32.
  341.  
  342.  
  343.      aha1740, dtc, g_NCR5380, t128, wd7000:
  344.         H=64, S=32.
  345.  
  346.  
  347.      aha152x, pas16, ppa, qlogicfas, qlogicisp:
  348.         H=64, S=32 unless C > 1024, in which case H=255, S=63, C =
  349.         min(1023, M/(H*S)).  (Thus C is truncated, and H*S*C is not an
  350.         approximation to the disk capacity M.  This will confuse most
  351.         versions of fdisk.)  The ppa.c code uses M+1 instead of M and
  352.         says that due to a bug in sd.c M is off by 1.
  353.  
  354.  
  355.      advansys:
  356.         H=64, S=32 unless C > 1024 and moreover the `> 1 GB' option in
  357.         the BIOS is enabled, in which case H=255, S=63.
  358.  
  359.  
  360.      aha1542:
  361.         Ask the controller which of two possible translation schemes is
  362.         in use, and use either H=255, S=63 or H=64, S=32.  In the former
  363.         case there is a boot message "aha1542.c: Using extended bios
  364.         translation".
  365.  
  366.  
  367.      aic7xxx:
  368.         H=64, S=32 unless C > 1024, and moreover either the "extended"
  369.         boot parameter was given, or the `extended' bit was set in the
  370.         SEEPROM or BIOS, in which case H=255, S=63.
  371.  
  372.  
  373.      buslogic:
  374.         H=64, S=32 unless C >= 1024, and moreover extended translation
  375.         was enabled on the controller, in which case if M < 2^22 then
  376.         H=128, S=32; otherwise H=255, S=63.  However, after making this
  377.         choice for (C,H,S), the partition table is read, and if for one
  378.         of the three possibilities (H,S) = (64,32), (128,32), (255,63)
  379.         the value endH=H-1 is seen somewhere then that pair (H,S) is
  380.         used, and a boot message is printed "Adopting Geometry from
  381.         Partition Table".
  382.  
  383.  
  384.      fdomain:
  385.         Find the geometry information in the BIOS Drive Parameter Table,
  386.         or read the partition table and use H=endH+1, S=endS for the
  387.         first partition, provided it is nonempty, or use H=64, S=32 for
  388.         M < 2^21 (1 GB), H=128, S=63 for M < 63*2^17 (3.9 GB) and H=255,
  389.         S=63 otherwise.
  390.  
  391.  
  392.      in2000:
  393.         Use the first of (H,S) = (64,32), (64,63), (128,63), (255,63)
  394.         that will make C <= 1024.  In the last case, truncate C at 1023.
  395.  
  396.  
  397.      seagate:
  398.         Read C,H,S from the disk.  (Horrors!)  If C or S is too large,
  399.         then put S=17, H=2 and double H until C <= 1024.  This means
  400.         that H will be set to 0 if M > 128*1024*17 (1.1 GB).  This is a
  401.         bug.
  402.  
  403.  
  404.      ultrastor and u14_34f:
  405.         One of three mappings ((H,S) = (16,63), (64,32), (64,63)) is
  406.         used depending on the controller mapping mode.
  407.  
  408.  
  409.   If the driver does not specify the geometry, we fall back on an edu¡
  410.   cated guess using the partition table, or using the total disk capac¡
  411.   ity.
  412.  
  413.   Look at the partition table.  Since by convention partitions end on a
  414.   cylinder boundary, we can, given end = (endC,endH,endS) for any
  415.   partition, just put H = endH+1 and S = endS.  (Recall that sectors are
  416.   counted from 1.)  More precisely, the following is done.  If there is
  417.   a nonempty partition, pick the partition with the largest beginC.  For
  418.   that partition, look at end+1, computed both by adding start and
  419.   length and by assuming that this partition ends on a cylinder
  420.   boundary.  If both values agree, or if endC = 1023 and start+length is
  421.   an integral multiple of (endH+1)*endS, then assume that this partition
  422.   really was aligned on a cylinder boundary, and put H = endH+1 and S =
  423.   endS.  If this fails, either because there are no partitions, or
  424.   because they have strange sizes, then look only at the disk capacity
  425.   M.  Algorithm: put H = M/(62*1024) (rounded up), S = M/(1024*H)
  426.   (rounded up), C = M/(H*S) (rounded down).  This has the effect of
  427.   producing a (C,H,S) with C at most 1024 and S at most 62.
  428.  
  429.  
  430.   7.  The Linux IDE 8 GB limit
  431.  
  432.   The Linux IDE driver gets the geometry and capacity of a disk (and
  433.   lots of other stuff) by using an ATA IDENTIFY request.  Until recently
  434.   the driver would not believe the returned value of lba_capacity if it
  435.   was more than 10% larger than the capacity computed by C*H*S. However,
  436.   recent Quantum Bigfoot 12 GB disks return C=16383, H=16, S=63, for a
  437.   total of 16514064 sectors (7.8 GB) but give lba_capacity of 23547888
  438.   sectors (11.2 GB, that is, C=23361).
  439.  
  440.   Recent Linux kernels (2.0.34pre14, 2.1.90) know about this and do the
  441.   right thing. If you have an older Linux kernel and do not want to
  442.   upgrade, and this kernel only sees 8 GB of a much larger disk, then
  443.   try changing the routine lba_capacity_is_ok in
  444.   /usr/src/linux/drivers/block/ide.c into something like
  445.  
  446.  
  447.        static int lba_capacity_is_ok (struct hd_driveid *id) {
  448.                id->cyls = id->lba_capacity / (id->heads * id->sectors);
  449.                return 1;
  450.        }
  451.  
  452.  
  453.  
  454.  
  455.   For a more cautious patch, see 2.1.90.
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.