あ~る あいか のすべての投稿

ブートで遊ぼっ!(6)

86系のPCをブートさせて遊んでみよう、というお話の6回目になります。テキストは『OSを書く:初歩から一歩ずつ』です。
環境はAMD64+Windows10+VMware Workstation 17 Player+Debian 12.4です。
今回はテキストの練習問題の4からです。

4. あるメモリアドレスの内容をプリントする

とかすると、axには_testのアドレスが入るわけで、あとはその中身を取り出して…取り出して?
どうやって?
というのがこの課題なんでしょう。
今までやってきたように、axとかに入っている値を扱いたい場合は上の書き方をします。で、それをアドレスとしてその中身を扱いたい場合[]で囲います。例えば今回の「_test」のアドレスの中身を取り出したい場合

とかして、_testのアドレスを取得した上で

とするわけです。1
欲しいのは0x15という値(41行目の_testのあとにdb命令?で定義しています)
alは1Byte。
mov命令は気が利かないので、alが1Byteなんだからbxのアドレスから1Byteだけ読むなんてことをしてくれません。なのでbxのアドレスから([bx])1Byteをalに移送してくれ(move byte alの部分)と指示します。
読み込めたら後は今まで通り、表示するだけ。

; boot.asm

mov ax, 0x07c0
mov ds, ax

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

mov ax, 0x0000
mov bx, _test
mov byte al, [bx]
mov bx, ax

loop:

mov dx, 0
mov ax, bx
mov bx, 10
div bx
mov cx, dx
mov bx, ax
mov ah, 0x0e
mov al, dl
add al, 0x30
int 0x10

cmp bx, 0
jne loop


jmp hang

; end of proccess
;
hang:
jmp hang

_test: db 0x15, 0x00

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.5.1

実行すると、こんな感じです。

5. BIOSを使ってディスクから何かを読み込んでみる

わたしはここで挫折しかかりました。ディスク読み込みのBIOSコールは調べられたんですが、パラメータが良くわかりませんでした。
ていうか、端的に言って、シリンダー、ヘッダー、セクターが理解できません。
なんか情報が錯綜しているというか、混じりあってる?
その上、ブートでセクタにはパーティションデーブルがあって、パーティションを特定したらFATがあって、みたいな?
お詫びと開き直りをするまで、結構かかりましたとも。ええ。
で、思ったわけです。
あのね?
わたしはディスクから読み込めればいいの!
FATなんて関係ないの!
と。
そもそもブートセクタは読めているわけで(だから動いてるし)、それはheaderが0、cylinderが0、sectorが1(sectorは1オリジンだそうです)以外にあり得ない。
ならば、それはheaderが0、cylinderが0、sectorを2にすれば読めるんじゃない?
さすがに2sectorの1KByteでheaderもcylinderも変わることないでしょ?
そういう予測のもとにソースを書きます。

; boot.asm

mov ax, 0x07c0
mov ds, ax
mov es, ax

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


mov bx, 0x200   ; Destination address to read

mov ah, 0x02    ; Read Sectors From Drive
mov dl, 0x80    ; Drive
mov al, 0x01    ; Sectors To Read Count ;
mov ch, 0x00    ; Cylinder
mov cl, 0x02    ; Sector(starts from 1, not 0) ; set 2. becouse not need MBR
mov dh, 0x00    ; Head

int 0x13        ; Execute disk read

mov si, 0x0200
mov ah, 0x0E

loop:

lodsb

or al, al
jz loop_end

int 0x10

jmp loop

loop_end:


jmp hang


; end of proccess
;
hang:
jmp hang


times 510-($-$$) db 0

db 0x55
db 0xAA

test:
	db 'Hello 2nd sector!', 0x0a, 0x0d, 0x00

_padding:
        times 0x0400-($-$$) db 0

PlayWithBoot.5.2

さて、動かしてみましょう。
こういうのってワクワクしますよねw

はい。無事に動きました。

今回はここまでです。
なんだか、何かをやり遂げた気がします^^

《2024/5/9 1:18:24》

  1. mov al, [_test]とか書けた気がする…。 ↩︎

ブートで遊ぼっ!(5)

86系のPCをブートさせて遊んでみよう、というお話の5回目になります。テキストは『OSを書く:初歩から一歩ずつ』です。
環境はAMD64+Windows10+VMware Workstation 17 Player+Debian 12.4です。
前回、練習問題の1をやったので続きを。

2. 2つの数値を加算する。

すでに終わっている気もしないでもないですが、改めて。
1と3を足してみましょう。

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

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

mov ah, 0x0E

mov al, 1
mov bl, 3
add al, bl

add al, 0x30

int 0x10

; end of proccess
;
hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.4.1

説明の必要もないくらいですね。alとblにそれぞれ1と3を入れて、alとblを加算。
それだけです。
ただ、結果を確認できないのも何なので前回やった数値を表示するやりかたで、数値の1を文字の「1」に変換して表示しています。alに0x30を足すところですね。
これを実行すると、こうなります。


3. 1から100までの数を合計して解を画面にプリントする。

ネタばれしてるような気もしますが、こんな感じでソースを書いてみました。

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

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

mov ax, 0
mov bx, 0

loop:

add bx, 1
add ax, bx

cmp bx, 100
jl loop

add al, 0x30

int 0x10

; end of proccess
;
hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.4.2

実行すると、こうなります。

えっと、実は数値に0x30を足して文字に変換するって、1文字にしか対応していないんです。0~9は変換できるんですが、10から先には対応していません。
ではどうするか?
『1文字にしか対応できないなら、1文字ずつ表示すればいいじゃない』
はい、その通りです。例えば12を表示するとして、1と2を1文字ずつ表示すればいいんです。ではどうやって?
う~ん、中学受験の点取らせ問題ですね。
10で割った余りが1の位の数値になります。
答えを同じく10で割って余りが次の位の数値になります。
答えを…とまぁ数値の桁数だけ繰り返すわけです。
具体的にはこんな感じ。

12を例にしてソースを書いてみました。

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

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

mov cx, 12

mov dx, 0
mov ax, cx
mov bx, 10
div bx
mov cx, ax
mov ah, 0x0e
mov al, dl
add al, 0x30
int 0x10

mov dx, 0
mov ax, cx
mov bx, 10
div bx
mov cx, ax
mov ah, 0x0e
mov al, dl
add al, 0x30
int 0x10

; end of proccess
;
hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.4.3

割り算を行うdiv命令ってなんだか癖があって、axに入れた数値をbxで割って、答えがaxに、余りがdxに設定されます。
今回は10で割るので余りは確実に一桁。答えの下半分であるdlだけ見れば良いということになります。
1の位から上に向かって処理するので、12は21と表示されます。
こんな感じですね。

ここで大いなるお詫びと、胸を張った開き直りをしなければなりません。
12が対象なんだから、そのまま「12」と表示したいところです。
出来るんですけどね。ただものすごく少しだけ面倒くさいんです。
これがお仕事とかなら12と表示させるんですが、今回は処理の結果を確認したいだけなんです。なら21と表示されても、右から読めばいいじゃないですか。
というわけで、この場に限って「わたしはアラビア人~」と言い聞かせながら、右から読むことにします。

さて、元の問題に戻ります。ここでちょっとズルをします。1~100までを足すと答えは5050になります。つまり4桁です。4回処理をすればいいわけです。

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

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

mov ax, 0
mov bx, 0

._loop

add bx, 1
add ax, bx

cmp bx, 100
jl ._loop

mov cx, ax

mov dx, 0
mov ax, cx
mov bx, 10
div bx
mov cx, ax
mov ah, 0x0e
mov al, dl
add al, 0x30
int 0x10

mov dx, 0
mov ax, cx
mov bx, 10
div bx
mov cx, ax
mov ah, 0x0e
mov al, dl
add al, 0x30
int 0x10

mov dx, 0
mov ax, cx
mov bx, 10
div bx
mov cx, ax
mov ah, 0x0e
mov al, dl
add al, 0x30
int 0x10

mov dx, 0
mov ax, cx
mov bx, 10
div bx
mov cx, ax
mov ah, 0x0e
mov al, dl
add al, 0x30
int 0x10

; end of proccess
;
hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.4.4

ハイライトは1回分にしか入れてません。同じ処理の繰り返しだし。
で、実行するとこうなります。

無事に0505が表示されました。右から見て5050です。

さて、このソースもソフトウェアを作成する立場としては、ちょっと看過できないです。ほぼ同じコードがドカンドカンと4回もあります。繰り返しなのだからループにしちゃいましょう。
12は2桁なので2回、5050は4桁なので4回実行しています。どんな数値にも対応するためには繰り返しを終わらせる条件がわからなければいけません。
これも中学入試の点取らせ問題レベルかなぁ。
答えが0になったらどんな数で割っても余りは出ません。というわけで答えが0になったら終了すればいいわけです。

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

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

mov ax, 0
mov bx, 0

._loop

add bx, 1
add ax, bx

cmp bx, 100
jl ._loop

mov cx, ax

loop:

mov dx, 0
mov ax, cx
mov bx, 10
div bx
mov cx, ax
mov ah, 0x0e
mov al, dl
add al, 0x30
int 0x10

cmp cx, 0
jne loop

; end of proccess
;
hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.4.5

ハイライトは100まで足す部分と、1桁表示するところです。表示は繰り返しなので1回だけで。
実行するとこんな感じです。

今回はここまでです。
お疲れさまでした。

《2024/5/8 6:47:24》

ブートで遊ぼっ!(4)

86系のPCをブートさせて遊んでみよう、というお話の4回目になります。テキストは『OSを書く:初歩から一歩ずつ』です。
環境はAMD64+Windows10+VMware Workstation 17 Player+Debian 12.4です。
一応前回まででテキストの本文(?)については触れたので、今回からは練習問題について書いてみようかと思います。
まずは練習問題の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, x86!', 13, 10, 0

hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.3.1

実行すると、こう。

文字列を追加してみる

さすがに前節で「練習問題クリア!」とかいうのは何なので、文字列を追加して2つの文字列を表示してみます。これも難しくないですね。
ドカンとコピペして該当箇所をちょこっと変えます。
こんな感じ。

; 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 print_2nd_character

int 0x10

jmp print_character_loop

print_2nd_character:
mov si, msg2
mov ah, 0x0E

print_character_loop2:
lodsb

or al, al
jz hang

int 0x10

jmp print_character_loop2

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

msg2:
db 'Hello, x86!', 13, 10, 0

hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.3.2

22行目から34行までがコピーした部分です。設定する文字列のアドレスだけ変更してます。39行目と40行目は追加した文字列の定義ですね。
実行するとこう。

サブルーチンにしてみる

一応、練習問題としてはクリアなのかもしれませんが、ソフトウェアを作る立場としては、ほとんど同じで少しだけ違うコードって気持ちが悪いわけです。
こういう場合、どんな言語でも処理を共通化して、呼び出す形にします。
今回もそうしてみましょう。axに表示したい文字列のアドレスを指定して、サブルーチンを呼び出します。
こんな感じ。

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

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

mov si, msg
call print_character

mov si, msg2
call print_character

jmp hang

; sub routine
;
print_character:

mov ah, 0x0E

print_character_loop:
lodsb

or al, al
jz print_character_end

int 0x10

jmp print_character_loop

print_character_end:

ret

; define messages
;
msg:
db 'Hello, World!', 13, 10, 0

msg2:
db 'Hello, x86!', 13, 10, 0

; end of proccess
;
hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

うん。すっきりしました。
実行するとこう。前と変わらないですね^^;
(というか変わったら困ります。それはバグです。)

数値を表示してみる

さて、今までは文字を表示していたんですが、『別のもの』を『文字列でないもの』と解釈することもできるわけです。実際『レジスタの中身を見たい』とか、数値を表示したくなるわけで。例えば数値の1を表示したいとか。
なにも考えずに書いたソースがこれ。

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

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

mov ah, 0x0E
mov al, 0x01
int 0x10

; end of proccess
;
hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.3.3

実行すると、こうなります。

あらまぁ、望んだ結果にはなりませんでした。
表示したいのは1で、表示できるのは”1″なんですよね。
文字の”1″を指定してあげないと1は表示されません。
結論から言うと文字の”1″は文字コード(これは数値です)の0x31になります。
なのでソースはこうなります。

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

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

mov ah, 0x0E
mov al, 0x01

add al, 0x30

int 0x10

; end of proccess
;
hang:
jmp hang

times 510-($-$$) db 0

db 0x55
db 0xAA

PlayWithBoot.3.4

実行してみます。

望み通り1が表示されました。

ここまでやれば、練習問題1はクリアしたと言っていいんじゃないかな。
なので、今回はここまでです。

《2024/5/3 17:07:24》

ブートで遊ぼっ!(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で同じコマンドを打つとこんな感じ。



    Debianでは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 Proにゲスト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》