決意表明
これは日記だ、なのでドラマチックなことは起きないし、ハーレムウハウハもない。
Linuxを勉強しようと思ったのだがどこから手を付けていいかわからないのでこうして記録に残しておく。
はじまりーーーー
暇を持て余していた……やることがない。
最近ではYoutubeも金のために放送している連中が多くあまり楽しめなくなってきたのは歳のせいだろうか?
はじめにやろうとしたことはHurdへの参加だった。
結論から言えば失敗した。
死ぬ気でVirtualBoxにインストールした上でウインドウを表示しようとしたのだが、七転八倒した結果やっとXが動くところまでだった。
いや、マジで無理です! 勘弁してください!
挫折したのは日本語入力で、そもそも日本人が関わっていないのか非常にIMEが貧弱なんだ。
やっとの思い出uim-fepを使って日本語入力ができるようになった。
成功したじゃんって? コンソール上だけではそうだね。
WEBブラウザ等はまともに動かず日本語入力が可能な状態になったのがターミナル上のみだった。
ついでにいうとフォントすら貧弱だった。
これについていくら書いても賽の河原の石積みの如き作業なので実用性が皆無なので以上とする。
さあLinuxでいこうか!
Hurd? 無理だよアレは。
まずは仮想環境にLinuxをインストールする。
外部リンクに対し運営が厳しい態度を取るのでURLは書けないがKali Linuxで検索してもらえばヒットする。
このディストリビューションはテスト向けに構築されているので実機に突っ込むものじゃない、なので仮想環境にインストールすることにする。
使用する仮想環境はVirtualBox、WindowsならOracle公式から、Linuxならパッケージマネージャからインストールするのが楽だろう。
Linuxを使用しているユーザならインストールに戸惑うところはないと思う。
Windowsならグラフィカルインストーラを使用するのが難易度が低くていいだろう。
さてLinuxをガチるのでカーネルを読もうと思う。
カーネルっていうのはOSの中心でLinuxを厳密に定義するとこれだけがLinuxであり、その他のツールは超すごいGNUという集団が主に作っている。
Linuxについて書きだすと切がないのでフリーのOSくらいに思ってもらえればいい。
ちなみにフリーというのは無料という意味でなく「自由」という意味なんだね。
これについてはコピーレフトという概念で「お前のものは俺のもの、俺のものはお前のもの」的考えである。
Qiitaに書けというごもっともな意見もあるだろうけど、あそこは本物が集まってるので怖いんだよね。
つーことでKaliLinuxをインストールした。
インストール時に日本を選んだのでタイムゾーンとロケールはちゃんと日本になっているのだが……日本語の部分が所謂豆腐状態になっている。
それを修正するのに以下を入力した。
apt update
apt upgrade
apt install fonts-vlgothic
そして再起動、うん、ちゃんと日本語になった!
では早速カーネルを弄ろうか。
まずドライバフォルダを作ってそこに移動する。
そして
vim sample.c
と入力してドライバのソースを作る。
え? カーネルを作るんじゃないのかって?
Linuxはカーネルがアレもこれもする万能の神様なのでドライバも広義のOSになるんだ。
おっとスマホ世代には「ドライバ」の解説も必要かな?
平たく言えばデバイスを操作する「運転手」のようなものなんだ。
デバイスをつないでドライバがあればそれを操作することが可能なんだ。
ではネット上で見つけたコードにちょい手を加えたものを以下に書く。
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Satoru Takeuchi <satoru.takeuchi@gmail.com>");
MODULE_DESCRIPTION("Hello world kernel module");
static int hello_kern(void) {
printk(KERN_ALERT "Hello world!\n");
return 0;
}
static void goodbye_kern(void) {
/* Do nothing */
printk(KERN_ALERT "good bye!\n");
}
module_init(hello_kern);
module_exit(goodbye_kern);
GPLなので改造品を載せても問題ないはずなんだ。
これが何をしているかといえば、モジュールのロード時にHello world!と表示され、アンロード時にgood bye!と表示させるものだ。
printk関数でjournalctlにログがアラートとして表示される。
これをビルドするMakefileも書いておこう。
obj-m := sample.o
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
obj-mでオブジェクトファイルを指定してmake -Cで.koファイルを生成する。
.koがデバイスドライバになる。
このサンプルをビルドするとsample.koができるのでこれをinsmodコマンドでロードする。
以下のコマンドで実行を確認しよう。
journalctl | tail
insmod sample.ko
journalctl | tail
上のコマンドで表示されていなかった二行が下のコマンドでは高表示される。
1月 22 20:37:50 kali kernel: Hello world!
1月 22 20:38:00 kali kernel: good bye!
なお日時とkaliの部分は実行環境によって異なる。
これでprintkが実行されたのが確認できる。
今日はここまでだが、参考までにLinuxカーネルのメーリングリストにも勇気をだして登録した。
ここでちょっとハマったのがメインで使っているprotonmailでは登録できなかった。
あれやこれやしたが結局の所Gmailで登録することで解決した。
以上。