総合手引 | セクション 3 | オプション |
#include <sys/types.h>
#include <libdisk.h>
extern const char *chunk_n[];
const char *
slice_type_name(int type, int subtype);
struct disk *
Open_Disk(const char *devname);
struct disk *
Clone_Disk(struct disk *disk);
void
Free_Disk(struct disk *disk);
void
Debug_Disk(struct disk *disk);
void
Set_Bios_Geom(struct disk *disk, u_long cyl, u_long heads, u_long sects);
int
Delete_Chunk(struct disk *disk, struct chunk *);
void
Collapse_Disk(struct disk *disk);
int
Collapse_Chunk(struct disk *disk, struct chunk *chunk);
int
Create_Chunk(struct disk *disk, u_long offset, u_long size, chunk_e type, int subtype, u_long flags);
void
All_FreeBSD(struct disk *d, int force_all);
char *
CheckRules(struct disk *);
char **
Disk_Names(void);
void
Set_Boot_Mgr(struct disk *d, const u_char *bootmgr, const size_t bootmgr_size);
int
Set_Boot_Blocks(struct disk *d, const u_char *boot1, const u_char *boot2);
int
Write_Disk(struct disk *d);
int
Cyl_Aligned(struct disk *d, u_long offset);
u_long
Next_Cyl_Aligned(struct disk *d, u_long offset);
u_long
Prev_Cyl_Aligned(struct disk *d, u_long offset);
int
Track_Aligned(struct disk *d, u_long offset);
u_long
Next_Track_Aligned(struct disk *d, u_long offset);
u_long
Prev_Track_Aligned(struct disk *d, u_long offset);
struct chunk *
Create_Chunk_DWIM(struct disk *d, struct chunk *parent, u_long size, chunk_e type, int subtype, u_long flags);
int
MakeDev(struct chunk *c, const char *path);
int
MakeDevDisk(struct disk *d, const char *path);
char *
ShowChunkFlags(struct chunk *c);
char *
ChunkCanBeRoot(struct chunk *c);
どちらの型もプログラマにはわかりにくいので、完全を期すために 以下に内部構造を示します。
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; u_long sector_size; };関数によるフラグ値は ‘DISK_ON_TRACK’ だけで、ディスクが On-Track ディスクマネージャによって 操作されていることを意味します。
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*); void *private_data; };‘type’ フィールドは ‘whole, unknown, fat, freebsd, extended, part, unused’ のうち、どれか一つの値を取ります。
以下は ‘struct chunk’ において ‘flags’ が取ることのできる値です。
CHUNK_PAST_1024 | シリンダ 1024 を越えているため、この領域からはブートできません。 |
CHUNK_BSD_COMPAT | この領域は、 BSD 互換であり、 ‘wd0s4f -> wd0f’ のような短縮形も使用できます。 |
CHUNK_ALIGN | この領域は整合(align)していなければなりません。 |
CHUNK_IS_ROOT | この ‘part’ は rootfs であり、パーティションを ‘a’ に 割り振ります。 |
CHUNK_ACTIVE | MBR 内のアクティブスライスです。 |
CHUNK_FORCE_ALL | すべての BIOS によるジオメトリ解釈を無視し、与えられたディスク全体を 強制的に FreeBSD 用とします。 |
フィールド ‘private_data, `private_free', private_clone’ は、 アプリケーション固有のデータ、およびその管理のためのものです。この 機能がなければ、記憶域の管理はできず、クローニングによりポインタが 複製されても解放できなくなります。
Open_Disk() は、名前付ディスクを open し、一群 (populated) のツリーを 返します。
Clone_Disk() は、ツリーの複製を作成します。 "Undo" 機能に便利です。
Free_Disk() は、 Open_Disk() または Clone_Disk() で作成されたツリーを解放します。
Debug_Disk() は、標準出力 (stdout) のツリーの内容を出力します。
Set_Bios_Geom() は、 BIOS が使うジオメトリを設定します。
Delete_Chunk() は、disk_space の領域を解放します。
Collapse_Disk() および Collapse_Chunk() は、まだ試験的なものなので使ってはいけません。
Create_Chunk() は、指定されたパラメータを持つ領域を生成します。
All_FreeBSD() は、ディスク全体を一つの FreeBSD の領域を作成します。 ‘force_all’ が設定されていると、BIOS によるジオメトリ解釈をすべて無視します。
CheckRules() は、このディスクレイアウトの矛盾した区画規則についての警告を 文字列 ‘char*’ として返します。
Disk_Names() は、 すべてのディスク名 (wd0, wd1 ...) を格納した文字列群 ‘char**’ を返します。 配列と同様、各ポインタを手動で解放しなければなりません。
Set_Boot_Mgr() は、このブートマネージャをディスク上で使うように設定します。 Write_Disk() が呼び出されるときに書き込まれたものを取得します。
Set_Boot_Blocks() は、ディスク上で使われるブートブロックを設定します。 Write_Disk() が呼び出されるときに書き込まれたものを取得します。
Write_Disk() は、MBR 、ディスクラベル、ブートブロック、ブートマネージャ すべてを書き込みます。
Cyl_Aligned() は、BIOS ジオメトリに従って ‘offset’ がシリンダ上に整合しているかどうかを調べます。
Next_Cyl_Aligned() は、BIOS ジオメトリに従って ‘offset’ を次のシリンダに切り上げて配置します。
Prev_Cyl_Aligned() は、BIOS ジオメトリに従って ‘offset’ を前のシリンダに切り下げて配置します。
Track_Aligned() は、BIOS ジオメトリに従って ‘offset’ がトラック上に配置されているかどうかを調べます。
Next_Track_Aligned() は、BIOS ジオメトリに従って ‘offset’ を次のトラックに切り上げて配置します。
Prev_Track_Aligned() は、BIOS ジオメトリに従って ‘offset’ がトラック上に配置されているかどうかを調べます。
Create_Chunk_DWIM() は、指定された親領域内に指定サイズのパーティションを生成し、 そのポインタを返します。 最初に見つかった十分な大きさの未使用領域が使われます。
MakeDev() は、この領域のデバイスノードを作成します。
MakeDevDisk() は、ディスク上にあるすべての領域のデバイスノードを作成します。
ShowChunkFlags() は、フラグを表示する文字列を返します。
ChunkCanBeRoot() は、領域が ‘/’ になれるならばヌルを返します。
領域名を示す文字列は、外部配列変数 chunk_n を使って直接アクセスできます。
slice_type_name() は、指定された ‘type’. ‘subtype’ に関連づけられた名前文字列を返します。 slice_type_name() がスライスに対して "unknown" を返すのは、 未知の場合、すなわち ‘/’ です。
このマニュアルページの執筆者は Jörg Wunsch です。
LIBDISK (3) | March 15, 1996 |
総合手引 | セクション 3 | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.
“ | A typical Unix /bin or /usr/bin directory contains a hundred different kinds of programs, written by dozens of egotistical programmers, each with its own syntax, operating paradigm, rules of use ... strategies for specifying options, and different sets of constraints. | ” |
— The Unix Haters' handbook |