Character set: ISO-2022-JP(JIS)

ELKS FAQ

これは Linux-8086としても知られている ELKSについての何度も繰りかえされる質問 に対する答えのリストです。

この FAQは Brian Candelerさんのオリジナルを元に Alister Riddochさんがメンテナン スを行っています。アップデートは ajr@ecs.soton.ac.uk. に送って下さい。最新版は http://www.ecs.soton.ac.uk/elks. に在ります。 注! ELKSは開発の初期段階なのでこの情報はすぐ陳腐化しますよ。

他の情報は ELKSホームページ http://www.uk.linux.org/ELKS-Home/index.html. で見て下さい

メーリングリストに参加するには 本文に subscribe linux-8086とだけ書いて majordomo@vger.kernel.org に送って下さい。 メーリングリストのアーカイブは http://epocha.pd.mcs.net/Linux8086/. 又は http://www.cyberpass.net/~dummy/robert/archives/linux-8086/ which に在ります。

注! ELKSは Linuxでは在りません、ですからこのメーリングリストは Linuxに 関する質問にはふさわしく在りませよ。 comp.os.linux.misc 等に送ってね。

セクション 1 概要

セクション 2 コンパイルとインストール

セクション 3 ELKSを使う

セクション 4 未解答の質問


セクション 1 概要

Q1.1. ELKSって何?

ELKSは組み込み用途可能な Linuxカーネルのサブセットで Linuxから派生した小さな カーネルを作るプロジェクト( UNIX V7相当のシステムコールを持つカーネル)で少な いメモリー、非力なプロセッサーでも動作可能です。当初の目標はインテル 8086と 80286の 16bitプロテクトモードです。 このようなハードウェアで動くカーネルは組み込み機器に役立ち、高性能な最新の CPUの無い第三世界や、様々なパームトップ機に使えます。

更なる情報、プロジェクトの目標、進行状況は ELKS home page. で確認出来ます。

Q1.2. ELKSと Linixの違いは?

ELKSは Linuxから派生したもので、一個人が理解可能なサイズですから学習用途に使 えますよ。まだ開発の初期段階なので、スワップ、シェアドライブラリー、パラレル 、シリアルI/O、ネットワーク等が未実装です。今はブートが可能で、仮想コンソール 、minixファイルシステムフロッピーのマウント、いくつかの小さなプログラムの実行 が出来ます。

Q1.3. ELKSはすぐ使える?

まだです。Linux機を使い、ソースをダウンロードして 8086コードをクロスコンパイ ルする必要が在ります。現バージョンのELKSの bootイメージ、rootディスクイメー ジは在ります。でも多くのプラットフォームでテストする必要が在ります。 Michael Stratesさんは bootと rootイメージを一つにまとめる作業を行って下さいま した。

Q1.4. ELKSは 8088プロセッサーで動く?

8088は 16bitではなく 8bitの拡張データバスを持つことです(それで遅いよ)。 もちろんELKSは動きます。

セクション 2 コンパイルとインストール

Q2.1. ソースコードはどこに在りますか?

ftp://linux.mit.edu/pub/ELKS がプライマリーサイトです。ELKSと Dev86のある他のサイトは以下の通りです。

ftp://ftp.ecs.soton.ac.uk/pub/elks/
ftp://cam053212.student.utwente.nl/pub/8086-nix/ELKS/
ftp://tsx-11.mit.edu/pub/linux/ALPHA/linux-16/
ftp://src.doc.ic.ac.uk/packages/linux/tsx-11-mirror/ALPHA/linux-16/
ftp://ftp.amscons.com/pubi/mirrors/ELKS

もし別のサイトをご存じでしたらメインテナーまで連絡して下さい。

Q2.2. ELKSのカーネルはどのように作りますか?

dev86/Dev86-0.0.13.4.tar.gzkernel/elks-0.0.67/elks-0.0.67.tar.gz (もしくは最新バージョン)をダウンロードし /usr/src に解凍して下さい。
    tar -xvzf Dev86-0.0.13.tar.gz -C /usr/src
    tar -xvzf elks-0.0.67.tar.gz -C /usr/src
開発環境は /usr/src/linux-86に、カーネルのソースは /usr/src/elksに展開され ます。 次ぎに bccコンパイラを含むツール類を作成します。
    cd /usr/src/linux-86
    make install
それからカーネルをコンパイルします。
    cd /usr/src/elks
    # カーネルを作る。
    make config
    make dep
    make
make configは linuxカーネルの物と似た振る舞いをします。デフォルトの設定のま まで多くのシステムで動くでしょう。貴方自身の行っている事が良く理解出来ていな いうちはオプションの変更はしないで下さい。 (もし gccを使って linuxカーネルを作った事が有るなら elksカーネルの makeの 速さに驚きますよ! :-) 最終的に "Image"と呼ばれるフロッピーディスクイメージが 出来ます。フォーマットされたフロッピーディスクにコピーし、ブートして下さい。
    dd if=Image of=/dev/fd0
or
    make disk
これでこのディスクからブート出来ます。あとはマウントするルートフロッピー ディスクを作ります。bccを使い、"init"プログラムをコンパイルし、root minix ファイルシステムを作る必要があります。以下を読み進めて下さい。

Q2.3. /usr/include/linux/vm86.h が見つからないとのエラーが出ました。

/usr/include/sys/vm86.h#include <linux/vm86.h>#include <asm/vm86.h> に変更して下さい。

Q2.4. ELKSの "init"はどのように作りますか?

ELKSカーネルがブートすれば /bin/initが動き出します。

現バージョンの "init"は linux.mit.eduにもある tiny-utilsパッケージに含まれる ものです。カーネルコードが最近変更になり /bin/shの代わりに /bin/initがロード されるようになりました。

カーネル0.0.67は kernel/elks-0.0.67/elkscmd.tar.gzに initと login(パスワード チェックなし)を含むユーティリィティーのセットが在ります。そのコンパイルとイン ストール法は

    bcc -0 -O -s init.c -o init
    bcc -0 -O -s login.c -o login
として実行ファイルを作り、ルートディスクの /binディレクトリーにコピーして下 さい。loginプログラムは /etc/passwdと /etc/groupファイル、それと /bin/sh(も しくは /etc/passwdのシェルのエントリーに記されているシェル)が必要です。

コンパイラオプションの-0 (数値の"ゼロ")は8086コードを生成し、-O (大文字の"オ ー")はコードの最適化を有効にし、-ansi は ANSIファンクションプロトタイプを有効 にし、-s はバイナリーコードからシンボルを除きます。

カーネル0.0.56から sash(スタンドアローン シェル)が使え、多くの人に /bin/shの 代わりに使われています。elkscmd.tr.gzに含まれています。/etc/passwdと /etc/gr oupは linuxの物をコピーすると良いでしょう。ls -lが使えます。また sashのエラー レポートが /usr/lib/liberror.txtに残されます。 

Q2.5. rootファイルシステムはどのように作るの?

いくつかの物を含んだ minixフロッピーを作らねばなりません。/bin/に initと lo ginと sh、/etc/には passwdと group、/dev/には initの為の3つの ttysが必要です 。
注! /dev/ttyは Linuxが標準で使う(5、0)とは異なりますよ。
    mkdir /usr/src/root86
    cd /usr/src/root86
    mkdir dev
    cd dev
    mknod tty c 4 0
    mknod tty2 c 4 1
    mknod tty3 c 4 2
    mknod fd0 b 3 128
    cd ..
    mkdir bin
    cd bin
    cp <path-to-elkscmd-init> init
    cp <path-to-elkscmd-login> login
    cp <path-to-elkscmd-sash> sh
    cd ..
    mkdir etc
    cd etc
    cp <path-to-skeleton-passwd> passwd
    cp <path-to-skeleton-group> group
    cd ..
    fdformat /dev/fd0H1440      # if floppy not yet formatted
    mkfs -t minix -n14 /dev/fd0 1440
    mount -t minix /dev/fd0 /a  # need a mount point "/a"
    cp -pR /usr/src/root86/* /a
    umount /a
いくつかのディストリビューションでは /dev/fd0H1440のかわりに /dev/fd0u1440を 使います。

パスワードはまだサポートされていないので passwdファイルからパスワードを削除 して下さい。

もし2.2.xカーネルで mount-2.5kが使えるならハードディスクにループバックファイルシ ステムを使ってディスクイメージを作れます。そうしたらフロッピーにダンプして 下さい。

    dd if=/dev/zero of=root.image bs=18k count=80
    losetup /dev/loop0 root.image
    mkfs -t minix /dev/loop0 1440
    mount -t minix /dev/loop0 /a
    ...
    umount /a
    dd if=root.image of=/dev/fd0
ELKS.0.53から 1.44M以外のフロッピーも使えます。上の方法でサイズを適宜おきか えて下さい。1.2Mのドライブで 360Kの書き込みが可能です。360Kのドライブでブー トしたいのなら必要でしょう。

Q2.6. XT と 360Kディスクドライブが在るのですがどうすれば良いですか?

目的のマシンが 360Kドライブがついているときなど 別のマシンで bootとroot イメージを使うときはちょっとした注意が必要です。360Kドライブ(5.25"DD)は 40トラックですし 1.2MB(5.25"HD)は 80トラックです。1.2MBドライブは 360Kの ディスクを読めますが、書き込めません。

一つの方法として 360Kのドライブを Linux PCの2つめのドライブとし fdformat /dev/fd1d360 とフォーマットしてからファイルシステムを作ります。

それから DOSで "rawrite"を使い イメージファイルを作り直します。

Boot disks

'Image'ファイルはどのタイプのフロッピーにも書き込めますし、正しくブート します。必要な事は 'rawrite'を使い、目的のディスクを作ることだけです。

Root disksは自動検出されるようになりました。ですから、もう 1.44Mb以外のサイズ にコンパイルし直す必要はありません。

Root disks

ファイルシステムのサイズを 360Kに置き換え mkfsコマンドを実行し 360Kの ルートイメージが出来たら必要なファイルをこのディスクにコピーして下さい。 そしてアンマウントし、次の様にディスクイメージを作ります。
        dd if=/dev/fd0 of=root.image bs=1k count=360
'rawrite'をする前に作っておいて下さい。ループバックファイルシステムを使っ たのならこの操作は不必要です。

RAMの制限

バージョン0.0.44は、640K RAMを前提としていました。しかしながら 640K以下で起きる DEF_INITSEGと DEF_SETUPSEGの問題は以降のバージョンでは修正されていますので、何も 変更する必要はありません。

* Q2.7. bootイメージのルートデバイスを 変える方法は?

バージョン0.0.62のブートディスクは 2つ目のフロッピードライブをルートディス クとして使うようにコンパイルされてました。なぜなら wait_for_keypress()ファン クションが壊れてしまうからです。

もし "root disk mount failing on device 03c0 "(03c0でルートディスクのマウントに失敗しました。)とメッセージが出たら 16進 コードエディターでブートイメージの中の始めの方に有る C003hを捜し、8003hに 替えて下さい。(c003hはインテル式の記述では 03c0となります。) これは多くのバージョンで動きます。けれども別のバージョンではどのアドレスに相 当するか定かではありません。 jose@cnct.com さんの報告によれば 0.0.62のブートイメージでは 0adfと0adeとの事で した。

* Q2.8. ハードディスクへのインストール方法は?

バージョン0.0.65から ELKSルートディスクをハードディスクにインストール出来るよ うに成り、それを使うようにブートフロッピーを作れます。まだいくつかのバグがあ りますが、ルートフロッピーより便利でしょう。

まず fdiskを使い区画(パーティション)を作ります。いくつかのバージョンの fdisk が使えますが今のルートディスクのみ hd?1-4をサポートしています。 もし DOSの基本区画があれば DOSの fdiskでは 2つ目の基本区画は作れません。 ELKS 0.0.67のルートディスクにある fdiskはまだ枯れていませんが私のシステムでは 問題なく使えています。

区画分けが済んだら bootと rootフロッピーを使い ELKSを立ち上げて mkfsを使いフ ァイルシステムを作って下さい。これは ELKSの fdiskを使いファイルシステムを作ろ うとしている区画の正しいデバイス名を知る為の安全な方法です。

    mkfs /dev/hd?? <size>
hd??は正しい区画番号を、sizeの所は キロバイト単位を入れて下さい。は 32M 以上は使えません。 例として IDEドライブでスレーブに接続されたディスクの最初の区画に 20Mのファイ ルシステムを作るときは
    mkfs /dev/hdb1 20000

これでマウントポイント /mntにマウントするには

    mount /dev/hd?? /mnt とします。
新しい区画のルートディレクトリは少しミスがあり /mntからは "ls -l"が使えません なぜ mkfsが少し間違ったファイルシステムを作るのか私には分かりませんが、その 上で作業してます。

以下の様に新しいファイルシステムに基本的なディレクトリを作ります。


    mkdir /mnt/bin
    mkdir /mnt/dev
    mkdir /mnt/usr
    mkdir /mnt/usr/lib
    mkdir /mnt/mnt
    mkdir /mnt/etc
    mkdir /mnt/root
    mkdir /mnt/home
    mkdir /mnt/home/user?....

次に基本的なファイルを移します。まともなシステムにするにはよりおおくのファイ ルが必要でしょうけれども、ここは基本となるものだけですが結構役立ちます。

    cp /bin/init /mnt/bin/init
    cp /bin/login /mnt/bin/login
    cp /bin/sh /mnt/bin/sh
    cp /bin/ls /mnt/bin/ls
    cp /bin/pwd /mnt/bin/pwd
    cp /bin/mount /mnt/bin/mount
    cp /bin/umount /mnt/bin/umount
    cp /bin/cp /mnt/bin/cp
    cp /etc/passwd /mnt/etc/passwd
    cp /etc/group /mnt/etc/group
    cp /usr/lib/liberror.txt /mnt/usr/lib/liberror.txt

最後に基本的なデバイスを作ります。

    mknod /mnt/dev/tty c 4 0
    mknod /mnt/dev/tty2 c 4 1
    mknod /mnt/dev/tty3 c 4 2
    mknod /mnt/dev/fd0 b 3 128
    mknod /mnt/dev/fd1 b 3 192
    mknod /mnt/dev/hda b 3 0
    mknod /mnt/dev/hda1 b 3 1
    mknod /mnt/dev/hda2 b 3 2
    mknod /mnt/dev/hda3 b 3 3
    mknod /mnt/dev/hda4 b 3 4
    mknod /mnt/dev/hdb b 3 64
    mknod /mnt/dev/hdb1 b 3 65
    mknod /mnt/dev/hdb2 b 3 66
    mknod /mnt/dev/hdb3 b 3 67
    mknod /mnt/dev/hdb4 b 3 68

そしたらアンマウントしましょう。

    umount /dev/hd??

次に正しいデバイスを指定した新しいカーネルをコンパイルし直す必要があります。 これは ELKSカーネルソースにある include/linuxmt/config.hを編集し、ROOT_DEVの 0x380を区画の番号に変えます。最後の2つの数値は区画の番号を16進表記したマイ ナー番号です。 -例- hdb3のマイナー番号は 67、これは16進表記では43です。ですから ROOT_DEV の数値は 0x343となります。

新しいカーネルフロッピーディスクを作る為に Type

    make disk と入力して下さい
そしてこの新しいブートディスクで ELKSを立ちあげて下さい。新しくルートがマウン トされます。警告メッセージがでますが通常どうりに動きます。でもフロッピーディ スクのものより速いですよ。ルートディレクトリは完璧ではないけれど別のディレク トリに移れますし、その他の点もいつもどうり動きます。

セクション 3 ELKSを使う

Q3.1. Linuxで bccのバイナリーは動きますか?

はい。カーネルモジュールをロードする事により ELKSバイナリーを直接実行出来ます 。これは ELKS上でプログラムを開発するより手軽ですし、Linux機でテスト出来ます 。(とは言ってもあなたのプログラムがカーネル未実装のコードを使ってもELKSでは 動きませんが。)
    cd /usr/src/linux-86/elksemu
    make module
    insmod binfmt_elks.o
リブートする度に 'insmod'と入力する必要が有る事に注意して下さい。 /usr/src/linux-86/testsに試せる bccのサンプルプログラムがいくつか在ります。 ('wc'等)

モジュール作成時に "modversions.h: no such file or directory"のエラーが出たら Makefileから次の行を削除して下さい。

MODCFLAGS=-D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer \
          -fno-strength-reduce -pipe -m486 -DCPU=486 -DMODULE -DMODVERSIONS

Q3.2. DOSEMU上で ELKSはブートしますか?

はい。Linux 2.0.7の dosemu 0.63.1.36で ELKSはブート出来ます。多分他の組みあわ せでも良いでしょう。フロッピーブートを行う為に dosもしくは xdosで -Aフラグを 使い /etc/dosemuにフロッピーディスクドライブの設定をします。
    floppy { device /dev/fd0 threeinch }  

セクション 4 未解答の質問

これらの質問の答えを歓迎いたします。


Alistair Riddoch / last updated 15th July 1997
Japanese translation by Tadayoshi Kubo