1996-03-17 23:20:09 +00:00
|
|
|
.\"
|
|
|
|
.\" Copyright (c) 1996 Joerg Wunsch
|
|
|
|
.\"
|
|
|
|
.\" All rights reserved.
|
|
|
|
.\"
|
|
|
|
.\" This program is free software.
|
|
|
|
.\"
|
|
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
|
|
.\" modification, are permitted provided that the following conditions
|
|
|
|
.\" are met:
|
|
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
|
|
.\"
|
|
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
.\"
|
1998-06-06 05:50:53 +00:00
|
|
|
.\" $Id: libdisk.3,v 1.6 1998/03/19 07:34:03 charnier Exp $
|
1996-03-17 23:20:09 +00:00
|
|
|
.\" "
|
|
|
|
.Dd March 15, 1996
|
|
|
|
.Dt LIBDISK 3
|
|
|
|
.Os
|
|
|
|
.Sh NAME
|
|
|
|
.Nm Open_Disk ,
|
|
|
|
.Nm Clone_Disk ,
|
|
|
|
.Nm Free_Disk ,
|
|
|
|
.Nm Debug_Disk ,
|
|
|
|
.Nm Set_Bios_Geom ,
|
|
|
|
.Nm Delete_Chunk ,
|
|
|
|
.Nm Collapse_Disk ,
|
|
|
|
.Nm Collapse_Chunk ,
|
|
|
|
.Nm Create_Chunk ,
|
|
|
|
.Nm All_FreeBSD ,
|
|
|
|
.Nm CheckRules ,
|
|
|
|
.Nm Disk_Names ,
|
|
|
|
.Nm Set_Boot_Mgr ,
|
|
|
|
.Nm Set_Boot_Blocks ,
|
|
|
|
.Nm Write_Disk ,
|
|
|
|
.Nm Cyl_Aligned ,
|
|
|
|
.Nm Next_Cyl_Aligned ,
|
|
|
|
.Nm Prev_Cyl_Aligned ,
|
|
|
|
.Nm Track_Aligned ,
|
|
|
|
.Nm Next_Track_Aligned ,
|
|
|
|
.Nm Prev_Track_Aligned ,
|
|
|
|
.Nm Create_Chunk_DWIM ,
|
|
|
|
.Nm MakeDev ,
|
|
|
|
.Nm MakeDevDisk ,
|
|
|
|
.Nm ShowChunkFlags ,
|
|
|
|
.Nm ChunkCanBeRoot ,
|
1997-01-23 06:29:01 +00:00
|
|
|
.Nm chunk_n ,
|
|
|
|
.Nm slice_type_name
|
1996-03-17 23:20:09 +00:00
|
|
|
.Nd library interface to slice and partition labels
|
|
|
|
.Sh SYNOPSIS
|
|
|
|
.Fd #include <sys/types.h>
|
|
|
|
.Fd #include <libdisk.h>
|
1996-03-24 18:55:39 +00:00
|
|
|
.Dv extern const u_char *boot1, boot2;
|
1997-01-23 06:29:01 +00:00
|
|
|
.\" What is the correct way to cause a single line break ???
|
|
|
|
.Bd -literal
|
|
|
|
.Dv extern const char *chunk_n[];
|
|
|
|
.Ed
|
|
|
|
.Ft const char *
|
|
|
|
.Fn slice_type_name "int type" "int subtype"
|
1996-03-17 23:20:09 +00:00
|
|
|
.Ft struct disk *
|
1996-03-24 18:55:39 +00:00
|
|
|
.Fn Open_Disk "const char *devname"
|
1996-03-17 23:20:09 +00:00
|
|
|
.Ft struct disk *
|
|
|
|
.Fn Clone_Disk "struct disk *disk"
|
|
|
|
.Ft void
|
|
|
|
.Fn Free_Disk "struct disk *disk"
|
|
|
|
.Ft void
|
|
|
|
.Fn Debug_Disk "struct disk *disk"
|
|
|
|
.Ft void
|
|
|
|
.Fn Set_Bios_Geom "struct disk *disk" "u_long cyl" "u_long heads" "u_long sects"
|
|
|
|
.Ft int
|
|
|
|
.Fn Delete_Chunk "struct disk *disk" "struct chunk *"
|
|
|
|
.Ft void
|
|
|
|
.Fn Collapse_Disk "struct disk *disk"
|
|
|
|
.Ft int
|
|
|
|
.Fn Collapse_Chunk "struct disk *disk" "struct chunk *chunk"
|
|
|
|
.Ft int
|
|
|
|
.Fn Create_Chunk "struct disk *disk" "u_long offset" "u_long size" "chunk_e type" "int subtype" "u_long flags"
|
|
|
|
.Ft void
|
|
|
|
.Fn All_FreeBSD "struct disk *d" "int force_all"
|
|
|
|
.Ft char *
|
|
|
|
.Fn CheckRules "struct disk *"
|
|
|
|
.Ft char **
|
|
|
|
.Fn Disk_Names "void"
|
|
|
|
.Ft void
|
1996-03-24 18:55:39 +00:00
|
|
|
.Fn Set_Boot_Mgr "struct disk *d" "const u_char *bootmgr"
|
1996-03-17 23:20:09 +00:00
|
|
|
.Ft void
|
1996-03-24 18:55:39 +00:00
|
|
|
.Fn Set_Boot_Blocks "struct disk *d" "const u_char *boot1" "const u_char *boot2"
|
1996-03-17 23:20:09 +00:00
|
|
|
.Ft int
|
|
|
|
.Fn Write_Disk "struct disk *d"
|
|
|
|
.Ft int
|
|
|
|
.Fn Cyl_Aligned "struct disk *d" "u_long offset"
|
|
|
|
.Ft u_long
|
|
|
|
.Fn Next_Cyl_Aligned "struct disk *d" "u_long offset"
|
|
|
|
.Ft u_long
|
|
|
|
.Fn Prev_Cyl_Aligned "struct disk *d" "u_long offset"
|
|
|
|
.Ft int
|
|
|
|
.Fn Track_Aligned "struct disk *d" "u_long offset"
|
|
|
|
.Ft u_long
|
|
|
|
.Fn Next_Track_Aligned "struct disk *d" "u_long offset"
|
|
|
|
.Ft u_long
|
|
|
|
.Fn Prev_Track_Aligned "struct disk *d" "u_long offset"
|
|
|
|
.Ft struct chunk *
|
|
|
|
.Fn Create_Chunk_DWIM "struct disk *d" "struct chunk *parent" "u_long size" "chunk_e type" "int subtype" "u_long flags"
|
|
|
|
.Ft int
|
1996-03-24 18:55:39 +00:00
|
|
|
.Fn MakeDev "struct chunk *c" "const char *path"
|
1996-03-17 23:20:09 +00:00
|
|
|
.Ft int
|
1996-03-24 18:55:39 +00:00
|
|
|
.Fn MakeDevDisk "struct disk *d" "const char *path"
|
1996-03-17 23:20:09 +00:00
|
|
|
.Ft char *
|
|
|
|
.Fn ShowChunkFlags "struct chunk *c"
|
|
|
|
.Ft char *
|
|
|
|
.Fn ChunkCanBeRoot "struct chunk *c"
|
|
|
|
.Sh DESCRIPTION
|
|
|
|
.Nm Libdisk
|
|
|
|
provides an interface to the low-level disk slice and partition labels.
|
|
|
|
Most functions operate with arguments of the types
|
|
|
|
.Ql struct disk ,
|
|
|
|
or
|
|
|
|
.Ql struct chunk .
|
|
|
|
.Pp
|
|
|
|
While both types are mostly opaque to the programmer, the internal
|
|
|
|
structure is mentioned below for the sake of completeness.
|
|
|
|
.Bd -literal -offset indent
|
|
|
|
struct disk {
|
|
|
|
char *name;
|
|
|
|
u_long flags;
|
|
|
|
u_long bios_cyl;
|
|
|
|
u_long bios_hd;
|
|
|
|
u_long bios_sect;
|
|
|
|
u_char *bootmgr;
|
|
|
|
u_char *boot1;
|
|
|
|
u_char *boot2;
|
|
|
|
struct chunk *chunks;
|
|
|
|
};
|
|
|
|
.Ed
|
|
|
|
The only flag value by now is
|
|
|
|
.Ql DISK_ON_TRACK ,
|
|
|
|
meaning that this disk is handled by the On-Track Disk Manager.
|
|
|
|
.Pp
|
|
|
|
.Bd -literal -offset indent
|
|
|
|
struct chunk {
|
|
|
|
struct chunk *next;
|
|
|
|
struct chunk *part;
|
|
|
|
struct disk *disk;
|
|
|
|
long offset;
|
|
|
|
u_long size;
|
|
|
|
u_long end;
|
|
|
|
char *name;
|
|
|
|
char *oname;
|
|
|
|
chunk_e type;
|
|
|
|
int subtype;
|
|
|
|
u_long flags;
|
|
|
|
void (*private_free)(void*);
|
|
|
|
void *(*private_clone)(void*);
|
1996-03-24 18:55:39 +00:00
|
|
|
void *private_data;
|
1996-03-17 23:20:09 +00:00
|
|
|
};
|
|
|
|
.Ed
|
|
|
|
The
|
|
|
|
.Ql type
|
|
|
|
field can be one of the following values:
|
|
|
|
.Ql whole, unknown, fat, freebsd, extended, part, unused .
|
|
|
|
.Pp
|
|
|
|
These are the valid
|
|
|
|
.Ql flag
|
|
|
|
values for a
|
|
|
|
.Ql struct chunk .
|
|
|
|
.Bl -tag -offset indent -width CHUNK_BSD_COMPATXX
|
|
|
|
.It CHUNK_PAST_1024
|
|
|
|
This chunk cannot be booted from because it extends past cylinder 1024.
|
|
|
|
.It CHUNK_BSD_COMPAT
|
|
|
|
This chunk is in the BSD-compatibility, and has a short name too, i.e.
|
|
|
|
.Ql wd0s4f -> wd0f .
|
|
|
|
.It CHUNK_BAD144
|
|
|
|
This chunk has bad144 mapping.
|
|
|
|
.It CHUNK_ALIGN
|
|
|
|
This chunk should be aligned.
|
|
|
|
.It CHUNK_IS_ROOT
|
|
|
|
This
|
|
|
|
.Ql part
|
|
|
|
is a rootfs, allocate partition
|
|
|
|
.Sq a .
|
|
|
|
.It CHUNK_ACTIVE
|
|
|
|
This is the active slice in the MBR.
|
|
|
|
.It CHUNK_FORCE_ALL
|
|
|
|
Force a dedicated disk for FreeBSD, bypassing all BIOS geometry
|
|
|
|
considerations.
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
The
|
1996-03-24 18:55:39 +00:00
|
|
|
.Ql private_data ,
|
1996-03-17 23:20:09 +00:00
|
|
|
.Ql private_free ,
|
|
|
|
and
|
|
|
|
.Ql private_clone
|
|
|
|
fields are for data private to the application, and the management
|
|
|
|
thereof. If the functions are not provided, no storage management is
|
|
|
|
done, cloning will just copy the pointer and freeing will just forget
|
|
|
|
it.
|
|
|
|
.Pp
|
|
|
|
.Fn Open_Disk
|
|
|
|
will open the named disk, and return populated tree.
|
|
|
|
.Pp
|
|
|
|
.Fn Clone_Disk
|
|
|
|
clones a copy of a tree. Useful for
|
|
|
|
.Dq Undo
|
|
|
|
functionality.
|
|
|
|
.Pp
|
|
|
|
.Fn Free_Disk
|
|
|
|
frees a tree made with
|
|
|
|
.Fn Open_Disk
|
|
|
|
or
|
|
|
|
.Fn Clone_Disk .
|
|
|
|
.Pp
|
|
|
|
.Fn Debug_Disk
|
|
|
|
prints the content of the tree to stdout.
|
|
|
|
.Pp
|
|
|
|
.Fn Set_Bios_Geom
|
|
|
|
sets the geometry the bios uses.
|
|
|
|
.Pp
|
|
|
|
.Fn Delete_Chunk
|
|
|
|
frees a chunk of disk_space.
|
|
|
|
.Pp
|
|
|
|
.Fn Collapse_Disk,
|
|
|
|
and
|
|
|
|
.Fn Collapse_Chunk
|
|
|
|
are experimental, do not use.
|
|
|
|
.Pp
|
|
|
|
.Fn Create_Chunk
|
1998-06-06 05:50:53 +00:00
|
|
|
creates a chunk with the specified parameters.
|
1996-03-17 23:20:09 +00:00
|
|
|
.Pp
|
|
|
|
.Fn All_FreeBSD
|
|
|
|
makes one FreeBSD chunk covering the entire disk; if
|
|
|
|
.Ql force_all
|
|
|
|
is set, bypass all BIOS geometry considerations.
|
|
|
|
.Pp
|
|
|
|
.Fn CheckRules
|
|
|
|
returns
|
|
|
|
.Ql char*
|
|
|
|
to warnings about broken design rules in this disklayout.
|
|
|
|
.Pp
|
|
|
|
.Fn Disk_Names
|
|
|
|
returns
|
|
|
|
.Ql char**
|
|
|
|
with all disk's names (wd0, wd1 ...). You must free each pointer, as
|
|
|
|
well as the array by hand.
|
|
|
|
.Pp
|
|
|
|
.Fn Set_Boot_Mgr
|
|
|
|
sets this boot-manager for use on this disk. Gets written when
|
|
|
|
.Fn Write_Disk
|
|
|
|
is called.
|
|
|
|
.Pp
|
|
|
|
.Fn Set_Boot_Blocks
|
|
|
|
sets the boot-blocks for use on this disk. Gets written when
|
|
|
|
.Fn Write_Disk
|
1996-03-24 18:55:39 +00:00
|
|
|
is called. The external variables
|
|
|
|
.Dv boot1
|
|
|
|
and
|
|
|
|
.Dv boot2
|
|
|
|
contain suitable data to be passed to this function.
|
1996-03-17 23:20:09 +00:00
|
|
|
.Pp
|
|
|
|
.Fn Write_Disk
|
|
|
|
writes all the MBRs, disklabels, bootblocks and boot managers.
|
|
|
|
.Pp
|
|
|
|
.Fn Cyl_Aligned
|
|
|
|
checks if
|
|
|
|
.Ql offset
|
|
|
|
is aligned on a cylinder according to the BIOS.
|
|
|
|
geometry.
|
|
|
|
.Pp
|
|
|
|
.Fn Next_Cyl_Aligned
|
|
|
|
rounds
|
|
|
|
.Ql offset
|
|
|
|
up to next cylinder according to the BIOS geometry.
|
|
|
|
.Pp
|
|
|
|
.Fn Prev_Cyl_Aligned
|
|
|
|
rounds
|
|
|
|
.Ql offset
|
|
|
|
down to previous cylinder according to the BIOS geometry.
|
|
|
|
.Pp
|
|
|
|
.Fn Track_Aligned
|
|
|
|
checks if
|
|
|
|
.Ql offset
|
|
|
|
is aligned on a track according to the BIOS geometry.
|
|
|
|
.Pp
|
|
|
|
.Fn Next_Track_Aligned
|
|
|
|
rounds
|
|
|
|
.Ql offset
|
|
|
|
up to next track according to the BIOS geometry.
|
|
|
|
.Pp
|
|
|
|
.Fn Prev_Track_Aligned
|
|
|
|
checks if
|
|
|
|
.Ql offset
|
|
|
|
is aligned on a track according to the BIOS geometry.
|
|
|
|
.Pp
|
|
|
|
.Fn Create_Chunk_DWIM
|
|
|
|
creates a partition inside the given parent of the given size, and
|
|
|
|
returns a pointer to it. The first unused chunk big enough is used.
|
|
|
|
.Pp
|
|
|
|
.Fn MakeDev
|
|
|
|
makes the device nodes for this chunk.
|
|
|
|
.Pp
|
|
|
|
.Fn MakeDevDisk
|
|
|
|
makes the device nodes for all chunks on this disk.
|
|
|
|
.Pp
|
|
|
|
.Fn ShowChunkFlags
|
|
|
|
returns a string to show flags.
|
|
|
|
.Pp
|
|
|
|
.Fn ChunkCanBeRoot
|
|
|
|
returns NULL if chunk can be
|
1997-01-23 06:29:01 +00:00
|
|
|
.Pp
|
|
|
|
Chunk name strings can be accessed directly using the external array
|
|
|
|
.Va chunk_n .
|
|
|
|
.Pp
|
|
|
|
.Fn slice_type_name
|
|
|
|
returns the name strings associated with the specified
|
|
|
|
.Ql type .
|
|
|
|
.Ql subtype .
|
|
|
|
If
|
|
|
|
.Fn slice_type_name
|
1998-06-06 05:50:53 +00:00
|
|
|
returns "unknown" for slices it isn't familiar with.
|
1996-03-17 23:20:09 +00:00
|
|
|
.Ql / .
|
1998-03-19 07:34:22 +00:00
|
|
|
.Sh AUTHORS
|
1996-03-17 23:20:09 +00:00
|
|
|
.Nm Libdisk
|
1998-03-19 07:34:22 +00:00
|
|
|
has been written by
|
|
|
|
.An Poul-Henning Kamp .
|
1996-03-17 23:20:09 +00:00
|
|
|
.Pp
|
|
|
|
This man page by
|
|
|
|
.ie t J\(:org Wunsch.
|
|
|
|
.el Joerg Wunsch.
|