月別アーカイブ: 2024年4月

ブートで遊ぼっ!(3)

86系のPCをブートさせて遊んでみよう、というお話の3回目になります。テキストは『OSを書く:初歩から一歩ずつ』です。
環境はAMD64+Windows10+VMware Workstation 17 Player+Debian 12.4です。
前回はMakefileを作ったところで気力が尽きちゃったんだけど、今回はどうなるかなぁ(不安)
まぁ、最低でも文字を表示するところは終わらせるつもりですけど…。

スクリーンにプリントする

画面に文字を表示します。定番と言うか、「またお前か!」というか、何と言うか。
Hello World
です。
細かい説明は(不十分かもしれませんが)テキストにありますので、まずはそちらを参考にしてください。ざっくり言うと、表示したい文字列をメモリ上に定義して、その最初のアドレスから文字列が終わるまで1文字ずつ表示しています。
ていうか、これくらいしか言うこと無くない?これ以上何を言えと?
とか思ったり思わなかったり。
ともあれ、ソースを作成します。

; boot.asm
mov ax, 0x07c0
mov ds, ax

mov ah, 0x0
mov al, 0x3
int 0x10

mov si, msg
mov ah, 0x0E

print_character_loop:
lodsb

or al, al
jz hang

int 0x10

jmp print_character_loop

msg:
db 'Hello, World!', 13, 10, 0

hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.2.1

アセンブル & 実行します。makeさん大活躍です。

make qemu

『Hello World!』が表示されました!

めでたしめでたし!
おしまい。

とか言いたいところなんですが、もし私が読み手としてこの記事をみたら
「ふざけんな!ボケぇ」
とか言いたくなるような気がするので、少しだけ追加です。

ahとal

ふと。
ahとalってaxレジスタのハイとロー、上位バイトと下位バイトじゃなかったっけ?
なら

mov ah, 0x0
mov al, 0x3

って

mov ax, 0x0003

とかにしても動くんじゃない?
というわけでソース修正。
こんな感じ。5行目が修正箇所ですね。

; boot.asm
mov ax, 0x07c0
mov ds, ax

mov ax, 0x0003
int 0x10

mov si, msg
mov ah, 0x0E

print_character_loop:
lodsb

or al, al
jz hang

int 0x10

jmp print_character_loop

msg:
db 'Hello, World!', 13, 10, 0

hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.2.2

で、実行。

無事に動きました。

or al, al の謎

まぁ、謎っていうほどのモノじゃないんですが、最初にこれを見た時に非常に悩みました。だってね

or X, Y

ってXとYのorをとって結果をXに設定する、という命令なわけで。
普通のプログラム言語っぽく書くなら

X = X or Y

なわけじゃないですか。
今回はXもYもalなので

al = al or al

になります。で、

同じ値のorをとると、元の値になります。
なので

al = al

になるという。ということはコードとしては

mov al, al

と同等になるという。
意味あるの?

ここでアセンブラを使ってるととても重要な機能と意味を持つフラグレジスタのお話がちょろっと出ます。
アセンブラの場合、全ての命令ではないのですが命令の実行結果によってフラグレジスタが更新されます。雑な言い方で申し訳ないんですが、アセンブラのコーディングでは
命令の実行
フラグの確認
といったスタイルが多くなります。

or al, al
jz hang

がこのパターンですね。
jz命令はゼロフラグが立っていたら(言い換えれば結果がゼロだったら)指定先に飛べという動作です。
表にするとこんな感じ。

lodsbで読
んだalの値
or la, alの結果ゼロフラグ文字
 1回目0x480x480H
 2回目0x650x650e
 3回目0x6c0x6c0l
 4回目0x6c0x6c0l
 5回目0x6f0x6f0o
: :: :: :: :: :
 13回目0x210x210!
 14回目0x0d0x0d0CR
 15回目0x0a0x0a0LF
 16回目0x000x001NULL
alの値とゼロフラグ

定義した文字列で一番最後の0x00の時だけ、ゼロフラグが1になります。
なので、最初から文字を1文字ずつ表示して0x00まで来たらhangに飛ぶという処理となり、めでたく『Hello World!』が表示されるというわけです。

蛇足

『alがゼロだったら~』という処理なんだから素直に

cmp al, 0x00
je hang

じゃいけないの?
という向きもあると思います。なので動かしてみましょう。
ソースはこれ。15行目、16行目を修正してます。

; boot.asm
mov ax, 0x07c0
mov ds, ax

mov ah, 0x0
mov al, 0x3
int 0x10

mov si, msg
mov ah, 0x0E

print_character_loop:
lodsb

cmp al, 0x00
je  hang

int 0x10

jmp print_character_loop

msg:
db 'Hello, World!', 13, 10, 0

hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.2.3

ちゃんと動きます。

う~ん、どっちを使うかなんですが、or al, al を使った方がいいことあるんでしょう、きっと。知らないけど。

《2024/4/27 15:25:24》

ブートで遊ぼっ!(2)

86系のPCをブートさせて遊んでみよう、というお話の2回目です。テキストは『OSを書く:初歩から一歩ずつ』です。
環境はAMD64+Windows10+VMware Workstation 17 Player+Debian 12.4です。
今回はMakefileを作るのと、余裕があれば文字を表示するところまでかな。届くかな?

ビルドプロセスを短縮する

Makefileを作ってビルド…というかアセンブルから実行までを簡単にしましょう、というお話。
『今時make?』という気もしなくはないんですが、アセンブラでboot周りのことをやるのなら『やっぱmakeよね!』とも思います。
やっていることというか、やりたいことは凄く単純で

と、2回コマンドを打っていたのを

で済まそうということ。
いちいちだらだらタイプしたくないし、ヒストリから拾うのも面倒だし、という怠け者の発想ですね。怠けるためにメンドクサイ仕込みをするとか、世の中よくあることです。
makeの使い方とかMakefileの書式とかを知りたい方は、ネットで調べてもらえば沢山記事があると思いますので、そちらに任せます。

テキスト通りMakefileというファイルを作成します。


実行してみます。



ん?
なにこれ?

って、どういうこと?

ちょっと調べてみたら、Makefileではコマンドの前にタブがないといけないみたいです。
何て言うか…『年寄りはこれだから困る』とか言いたくなってみたり?
気を取り直してMakefileを修正します。

2行目、5行目、8行目の先頭にタブを入れます。
で、改めて実行します。

ちゃんと動きました。めでたしめでたし。

ここで気力が尽きました。文字列の表示は次回だなぁ…。

《2024/4/19 11:14:24》

ブートで遊ぼっ!

x86系のPCをブートさせて遊んでみようと思います。
OSを作ろうとか、大それたことは言いません。技術力も知識も能力も全く足りないですから。
そもそもOSを作るのって、とっても

テキストは『OSを書く:初歩から一歩ずつ』です。ざっと目を通してみたんですが、それほどボリュームないし、解説もそれなりにあるし、これなら1日あれば確認できるかなと。チュートリアルだしねw

前提条件

テキストがDebianを前提にしているので、それに乗っかります。
今回のわたしの環境は

Intel Core i7
Windows10
VMwera Workstation 17 Plyer
Debian 12.4

です。Debianはこのために新規で入れました。ほとんど、まっさらです。

テキストで『nasm』『build-essential』『qemu』が必要だというのでインストールします。
Debianを起動してターミナルエミュレーターを実行し、以下を入力します。

む!

とか返ってきた。
どうしよう、どうする?

テキストは2016年とか2017年に書かれたものだし、今は2024年だし、8年もあれば生まれた子供も小学校3年生?になるし、パッケージ構成が変わっててもおかしくはないなぁ。
ともあれ、これでお終いにするってのは、あまりに情けなさすぎる。どうしたものか。

少し調べてみたら、色々な情報がありました。余計なものをインストールしても邪魔にならなければいいんだけれど、できるなら最小限の構成にしたいなぁ。

なので、これでどうだっ!

インストールは成功。
ではソースを書きましょう。
ファイル名は『boot.asm』です。

; boot.asm
hang:
jmp hang

times 510-($-$$) db 0

; This is a comment

db 0x55
db 0xAA

PlayWithBoot.1

コードの解説はテキストに任せて、書かれたとおりにオペレーションします。

問題ないですね。

動きました。こんな感じです。


これで前提条件が終了です。

なんか、思ったより先が長そう…

《2024/4/17 0:04:09》

Debian 12.x Bookwormのインストール(3)

さて、Debianのインストールなのですが、ここからは蛇足…といいますか…むしろ本題?
基本的な設定のお話とか書いてみようかなと。

  1. IPアドレスの設定
    クライアントOSとして使用するのであれば気にしないんですが、実機や仮想を含めて複数のOSを並行して扱ったりする関係で、IPアドレスがDHCPで自動的に割り当てられるってのは、ちょっと困るわけです。
    具体的な話で言うと、SSHで接続して作業したいとか、リモートデスクトップで接続して作業したいとかでしょうか。なのでIPアドレスを固定で割り当てたいわけです。
    そもそも複数を並列でと言っても合計で10に満たないわけで、IPアドレスを固定で割り振る手間もそれほどかからないですし。

    で、IPアドレスの設定なのですが、ググれば色々見つかると思います。昔もそれなりに面倒だったんですが、設定の仕方が変わったりしたので、最近のネットワーク設定とかよくわからないんです。
    わたしはDebianのネットワーク設定を理解したいわけじゃないんです。あくまでIPアドレスを固定で割り当てたいだけ。
    もし、最近のDebianのネットワーク設定について知りたいとか思ったら、きっちり時間をとって、どっぷり調べると思います。でも…単にIPアドレスを固定にしたいだけなんですよねぇ。

    というわけで、IPアドレスを割り当てます。
    Debianを起動してログインします。
    以下はXfceの例なんですが、他のデスクトップ環境でも似たようなことはできるかなと。



    アプリケーション→設定→高度なネットワーク設定を選択します。







    Wired connection1をダブルクリック




    『IPv4設定』タブを選択



    メソッド
    アドレス/ネットマスク/ゲートウェイ
    DNSサーバ
    をそれぞれ設定して『保存』



    再起動します。



    SSHで接続してみます。





    接続できました。



  2. sudoユーザの設定
    自分しか使わない環境なので、一般ユーザではなく常時rootで入るってのもできなくはないんですが、これが当たり前になると仕事とかでオペする時にあたふたしたりします。
    なので、自分が使う一般ユーザアカウントがsudoを使えるようにしましょう。
    それだけです。

    例えば現状でroot権限が必要なコマンドを打つとこんな風になったりします。
    一例ですけど。



    sudoで同じコマンドを打つとこんな感じ。



    Debuanではsodoグループに所属しているとsudoが使えるみたいです。
    なので一瞬だけrootになって、sudoグループにr-aikaを追加します。

    コマンドは
    adduser r-aika sudo
    でいいいみたい。
    再起動しないと反映されないのかな?



    グループに所属したか一応確認します。


    sudoで実行できるか確認します。



    実行できました。

    ちなみにユーザをグループから外すのは

    sudo deluser r-aika sudo

    みたいです。
  3. リモートデスクトップ接続
    Debuanを実機に入れてデスクトップ環境で作業するとか、VMware PlayerからDebianのデスクトップ環境にアクセスするとか、それしかできなければ受け入れるんですが、細かい動作の違いが、やっぱり気になってしまうのです。
    まぁ、コピペとか?
    windowのリサイズとか?
    なので、リモデで入れるとちょっとだけ嬉しいなぁと。

    リモートデスクトップはxrdpをインストールすることで使えるようになります。
    なのでインストール。




    インストールしただけだとxrdpサーバが立ち上がっていないので立ち上げます。
    コンソールから

    sudo systemctl enable xrdp

    を実行するか、Debianを再起動します。
    ちなみにデスクトップ環境にログインできるのは1ユーザに一つみたいです。
    他のデスクトップ環境を閉じてから確認してください。

    リモートデスクトップで接続を試みます。




    反応してますね。



    ユーザ名/パスワードを入れて『OK』




    しばらく待たされるかもしれませんが、接続できました。



  4. ディスク拡張
    Linuxとか使っていてディスクがいっぱいになることが稀にあります。
    テラバイトのHDDとかが当たり前の昨今では、めったにないかもしれませんが、いっぱいになってしまうと、ものすごく切ないです。必死になって不要なファイルを削除したら10MByte空きました、とかね。焼け石に水だったりします。
    そんなとき「ディスク容量を増やすことが出来たら」と、本気で思うわけです。
    そんなわけで、インストールとは直接関係ないんですが、ディスク容量を増やしてみようと思います。

    いろんなシナリオが考えられるんですが、今回はわかりやすくHDDを追加する場合です。
    『仮想マシンの設定の編集』に入ります。



    『追加』です。



    『ハードディスク』を選択して『次へ』


    『SCSI』を選択して『次へ』


    『仮想ディスクの新規作成』を選択して『次へ』


    ディスクサイズの指定です。今回はお試しなので『3GB』のハードディスクを作成します。


    仮想ディスクの実態であるファイル名を指定します。


    『仮想マシンの設定』画面に戻ると、SCSIの3GBのディスクが新規で登録されています。


    仮想マシンを立ち上げてコンソールで作業します。
    fdiskでデバイスを見ると/dev/sdbとして3GBのハードディスクが追加されているのがわかります。
    /dev/sdaは最初からある奴で10GBです。




    ここから先、詳しくはそれぞれ別途ググってください。
    追加した/dev/sdbを全て使って物理ボリューム(Physical Volume)を作成します。


    確認します。3GBの物理ボリューム(Physical Volume)が作成されています。


    現在の論理ボリューム(Logical Volume)の状況を確認します。


    作成した物理ボリュームの/dev/sdbをrootボリュームのボリュームグループ(Volume Group)に追加します。

    親玉の論理ボリューム(Logical Volume)に増やした領域を全て使うように拡張します。


    最後にext4ファイルシステムに増やした領域を全て使うようにサイズ変更します。


    確認します。もともと8.54GBだったroot領域が11.56GBに増えています。


  5. ホスト名の設定
    これは完全にメモです。忘備録?
    ホスト名の設定方法です。



《2024/4/16 12:59:32》

Debian 12.x Bookwormのインストール(2)

さて、ここからはebianインストーラーのお話になります。特に難しいところは恐らくないと思うので、ほとんどの人はインストールに成功するんじゃないでしょうか。
とはいえ、せっかく記事にしたので一通り最後まで流してみようと思います。

  1. 初期画面
    最初はこの画面。ほっとくと一番上で選択されている『Graphical install』が始まります。
    ちなみに他のインストール方法を試したことはないです。


  2. 言語、場所、キーボードの選択
    使用する言語を指定します。
    まぁ『日本語』を選択するわけですが、ひじょ~~~に見つけにくいという。
    頑張って探してください。



    次いで場所の選択です。言語で『日本語』を選べばここは『日本』が選択状態のはずなので、そのまま続けます。




    キーボードレイアウトの選択です。ここも言語で『日本語』を選べば『日本』が選択状態になっている筈です。ほとんどの場合変更なしで続けると思います。



  3. ネットワーク設定
    インストールするのに最低限のシステムが読み込まれたあと、既存のネットワークへ接続を試みて成功するとこの画面になります。
    (ネットワークアダプタが検出できて、DHCPでIPアドレスが取得できると、この画面になります。)

    ここではホスト名を設定するんですが、ぶっちゃけ何でもいいです。愛称とかあだ名みたいなもんだと思って好きに設定して良いんじゃないかな。




    続いてドメイン名の設定です。まぁ、うん、ここも何入れてもいいんじゃないかなぁ。
    わかってる人はちゃんと入れればいいんだし。



  4. ユーザの設定
    rootアカウントのパスワードを設定します。



    普段使いのユーザー名を設定します。
    わたしの場合なら『r-aika』ですね。



    こちらはユーザアカウントですかね。わたしの場合はこちらも『r-aika』です。



    作成した普段使いユーザのパスワードを設定します。
    わたしの場合は『r-aika』のパスワードになります。


  5. ディスク設定
    ディスクの設定をします。
    どれでも好きなものを選べばいいんですが、わたしは『ディスク全体を使いLVMをセットアップする』を選びます。



    ディスクの選択をするんですが、1つしかないのでそのまま続けます。
    実機なんかで複数のハードディスクとか入ってると複数から選べるようになるはず。



    パーティショニングです。
    よくわからないので一番上にするか、自分や他の一般ユーザが作ったものを分離してメンテしやすく・レスキューしやすくする2番目か、UNIX/Linux標準の3番目にするか。
    これはどのような用途で使うかによるんで、どれが正解というのはないと思います。
    わたしの場合は『それなりにわかっているけど面倒くさい』ので一番上を選びます。



    ディスクの書き込み確認です。
    ハードディスクを使いまわしていたりとか、前に使っていた場合、ここで書き込むと以前のデータにさわることが基本的にできなくなります。
    バックアップとった?
    大事なデータ残ってない?
    書き込んでいい?
    そういう確認です。今回はもちろん『はい』を選びます。



    パーティショニングの指定です。ディスク全体をLVMにしたんですが、そのうち一部だけを使いたい場合とかに指定します。
    今回はえいやっ!とディスク全体を使うつもりなので変更しないで続けます。



    書き込み確認です。『はい』で続けます。



  6. パッケージマネージャの設定
    『いいえ』で続行します。



    『日本』で続行します。



    アーカイブミラーって、例えば新たにアプリを入れたいとか、セキュリティ修正を適用したいとかという時の接続先です。これはもう、お好みでどうぞとしか言えないなぁ。
    わたしは一番上を選ぶんですけど。



    プロキシの設定です。プロキシは使ってないので空のまま続行します。


  7. ソフトウェアの選択とインストール
    よくわからないのでデフォルトのまま変更せずに続行します。



    ここでインストールするソフトを選びます。
    これも用途によりますね。デスクトップをとっかえひっかえしながら楽しむ人もいるだろうし、デスクトップ環境なんていらない、標準システムがあればOKという人もいるでしょう。
    Webサーバーを入れて公開、とかする人もいるかもしれません。
    というわけで、用途とお好みに合わせて選択してください。
    わたしはデスクトップ環境としてGNOMEとXfce、それとWebサーバとSSHサーバを選択します。



    ディスプレイマネージャを選択します。
    わたしの場合は『lightdm』です。



    ブートローダーのインストール確認です。もちろん『はい』ですね。



    ブートローダーのインストール先の指定です。
    ディスクは1個しかないし、パーティションも切ってないんで、選ぶといっても一つだけ。
    『/dev/sda』を選択します。



    インストール終了です。お疲れさまでした。
    続けると再起動されてDebianが開始されます。


  8. ようこそ!

    ようこそ新世界へ!


《2024/4/13 18:54:45》

Debian 12.x Bookwormのインストール

私の初めてDebianインストールはDebian 3.0 (Woody)でした…。思えば遠くへ来たものです。それから何回インストールしたことか。そのたびにWebで設定方法とか確認していたわけです。さすがに『これはいかがなものか』と。
それこそ『もう…いいよね?』って感じです。
というわけで、インストールの手順というか流れというか設定というか、スナップショットを書き留めておきます。

Intel Core i7のPCで動いているVMware Workstation 17 PlayerにゲストOSとしてDebian 12.xを入れます。

  1. インストールメディアの入手
    なにはともあれ、Debianのインストールメディアを手に入れます。
    『debian インストールCD』とかでググれば見つかるんじゃないかな?
    今回は
    https://www.debian.or.jp/cdimage/
    のお世話になりました。
    好みもあるだろうし目的によっても違うんだろうけれど、
     PC/サーバー用 netinstイメージ 64ビット(amd64) / 32ビット(i386)』を選択。
    これはネットにつながる最小限のシステムを構成した後、残りをネット経由かつ最新版を入れてくれます。ネットにつながる環境が既にあるなら、かなり気軽にインストールできるので、私はほとんどこのパターンです。
    あ、サーバー用とはいうものの、デスクトップ環境も入れられるし、足りなければ自分で追加インストールすればいいので、今まで困ったことはありません。

  2. インストール
    実機だとDLしたISOイメージをCDに焼いて~とかあるんでしょうけれど、ゲストOSとして入れるのでファイルのままで指定できるという楽ちんさ。良い時代になったものです。

    『新規仮想マシンの作成』を選択します。



    DLしたファイルを指定して『次へ』。


    ここは自分の好みと環境に合わせて適宜修正して『次へ』。


    ディスク容量の指定なのですが、こればっかりは『どのような用途で使うか』によります。
    参考までに私のところでは、インストールが一通り終わった時点で7GBほど使用してました。
    今回は諸事情により10GBを指定して『次へ』。


    ここは飛ばしてもいいんですけど、わたし的にはちょこっと調整したいので『ハードウェアのカスタマイズ』をします。



    左側で『ネットワークアダプタ』を選択。
    右側で『ブリッジ:物理ネットワークに直接接続』を選択。
    上記の設定の後『閉じる』。


    完了です。


    ここから先はDebianのインストーラーが立ち上がります。
    指示にそって設定していけばインストールが終了します。
    その辺は稿を改めて書こうかなと思います。

《2024/4/13 12:00:04》