総合手引 | セクション 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.
“ | Never write it in C if you can do it in `awk'; Never do it in `awk' if `sed' can handle it; Never use `sed' when `tr' can do the job; Never invoke `tr' when `cat' is sufficient; Avoid using `cat' whenever possible. |
” |
— Taylor's Laws of Programming |