はじめに
「自作シェルで学ぶ Linux システムプログラミング」の Udemy 講座を受講してみました!
普段は、Linux VM をたてて ACL や netplan など基本的なネットワーク設定、ユーザーアカウント管理、ssh 先で Web アプリ開発なんかをしています。
「自作OS」とかやってみたいけど、何から勉強すれば良いのか全くわからない!
「カーネル」って聞いたことはあるっちゃあるけど、なにをしているのかさっぱり。
「シェル」ってシェルスクリプトのことだよね?
というレベルで Linux 初心者の私がこの講座を受けて、Linuxの内部の動作を多少理解できて、とても良かったので講座で学んだことなどを紹介します!
本を読んでも講座を受けても、どうしても途中までやって終わってしまう、という私ですが、3時間のコースで終業後に2日間取り組んで受講が完了し、積動画とならずに済みました![]()
Linux の起動 〜 bash の起動
- CPU が BIOS / UEFI を実行
- BIOS / UEFI がブートローダをロード
- ブートローダが Linux カーネルをロード
- カーネルが init プロセス(systemd)を起動
- systemd が sshd などサービスを起動
- ssh 時では認証後、bash を起動
systemd → sshd → bash の流れは pstree で確認できる。
user@linux-host:~$ pstree -p
systemd(1)─┬─...
:
├─sshd(1146)───sshd(291041)───sshd(291077)───bash(291078)
:
内部コマンド・外部コマンドの実装
普段 bash などで使うコマンドには、 内部コマンド(組み込みコマンド)と 外部コマンド がある。
typeでどちらなのかを確認することができる。
内部コマンド
内部コマンドはシェルに実装する必要がある。
echo, cd, exit など。
$ type echo
echo is a shell builtin # 内部コマンド
外部コマンド
ELF という形式の機械語のプログラムで書かれたコマンドのファイルを PATH の中から探す
$ type cat
cat is /usr/bin/cat # 外部コマンド
$ file /usr/bin/cat
/usr/bin/cat: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), ...
$ echo $PATH | tr ':' '\n' # これらのディレクトリを順に探す
/home/user/.asdf/shims
/home/user/.asdf/bin
/usr/local/sbin
/usr/local/bin
:
シェルがカーネルに、外部コマンドを新しいプロセスとして実行する依頼をする
2つの システムコール を使う。
- fork: 子プロセスを作成
- execve: 現在のプロセスの実行内容を指定したプログラムに置き換える
strace で execve とかが呼び出されていることを確認できる。
bbix@tk-labtym-01:~$ sudo strace -ff -p 1146 2>&1 | grep execve
:
[pid 291612] execve("/usr/local/bin/pyminish", ["-pyminish"], 0x594889c13aa0 /* 15 vars */) = 0
:
os.fork() や os.execve を使って実装できる。
ここまでで1時間、多くのコマンドが叩けるようになり、感動しました!
Linux にユーザーを作って /etc/passwd で起動時のシェルを自作したシェルに置き換えれば bash 同様に使ってみることができて楽しいです!
下手するとログインできなくなるので、専用のユーザーを作るとかはした方が良いです。
その後
シグナルハンドリング
^C での SIGINT 送信時に、何も起こらないようにする、とか)
プロセスから見たファイルは、0,1,2...という数字(ファイルディスクリプタ)
標準エラー出力時に2を指定するのはこのため
$ cat abc.txt > error.output
cat: abc.txt: No such file or directory
$ cat abc.txt 2>error.output
ターミナルの表示の制御(ANSI エスケープシーケンス)
これと同じものを入力すると表示が clear される
$ clear | hexdump -c
0000000 033 [ H 033 [ 2 J 033 [ 3 J
000000b
とか、そんなことを知りました。
まとめ
知らない言葉とかもたくさん出てきて満足度が高かったです!
シェルスクリプトを実行できる、ところだけ1回聞いただけでは理解が追いつかなかったですが。。。
個人的には、python の os ライブラリがそもそもどうやってカーネル API を呼び出せているんだ等というのが疑問。今後の方向性としてはこれらがあります、とのこと。
インタプリタとかも気になりますね。
- LinuxやOSの知識をつける
- インタプリタの実装について学ぶ
- ネットワークの知識をつける
- C言語を学ぶ
普段、Google Cloud や Microsoft Azure などのベンダー資格の問題演習に使うことが多い Udemy ですが、入門したい分野の動画をチラ見するのとても良いなと思いました。