井出利憲「分子生物学講義中継 生物の多様性と進化の驚異」羊土社 2010 32pp
ウィーン大学で生命科学者をしている今鉄男と申します。生命の尊さ、美しさがどのようなメカニズムで生じるのかに興味があります。科学の方法論を用いて、このような問いに応えたい、私はこう思って医学生物学の基礎研究のトレーニングを受けてきました。生命を科学的手法を用いて理解を試みる上で、genomeを始めとした種々の大量データの処理が必要不可欠であることを痛感しました。また、生命科学が物理学、数学、統計学、有機化学などの種々の学問と深い関わりを持つことを実感しました。そのため、このブログは広範囲の学問領域に関しての記事を載せています。日々の学習内容を文書に書き残し、それを読み返すことによって、体系化された知識を身に付けることを目標としています。どうぞよろしくお願いします。
GNU/Linuxをソースコードからビルドする手順
私たちが普段、Linuxと読んでいるものの実態は実は、Linux kernel + GNU softwareの複合環境なのです。図で示しますと下のようになります。
したがって、GNUの人々はこのような環境のことをGNU/Linuxと呼ぶように主張しています。確かに一理あると思います。
ところで、GNU/Linuxの環境をソースコードよりビルドする時は、段階が多くとても混乱してしまいます。
そこで、今回は各段階の説明をしてみたいと思います。
#1.ファイルシステムの作成とデバイスファイルの作成
- Filesystem Hierarchy Standard(FHS)に基づいたファイルシステムを構築する。
- MAKEDEVというスクリプトを用いて/dev内にデバイスファイルを生成する。
#2.各ソフトウェのコンパイルと導入
- 基本は./configure, make, make installを繰り返すだけだが、./configureの時にオプションを大量に指定したり、make installの時に、インストール先のディレクトリを指定する必要がある。
- まずは、glibcをコンパイル。glibcは各種コマンドやソフトウェアを実行する際に必ず必要。GNU/Linux環境はほとんどのコマンドやソフトウェアでダイナミック・リンクにてglibcを利用するため、このライブラリがないと各種コマンドが実行できない。
- ncurses : コンソール端末の表現力を向上させるライブラリ。bashの動作に必須。
- bash : Linuxの標準シェル
- util-linux : ログイン関連やttyコマンド、ディスク操作
- coreutils : シェルの中でよく使うコマンド群を集めたソフトウェアパッケージ。cat, ls, suといったシェル関連コマンドを含む。
- etc.
#3.カーネルのコンパイル
- 設定項目が膨大なのので、開発環境の構成ファイルを流用すると良い。
- makeは場合によって一晩かかる時がある。
- -jのオプションで時間の短縮が可能。
#4.initramfs(initrd)ファイルの作成
- initramfsとは、カーネルをロードした後で、一時的にメモリー上に展開したルートファイルシステムを、マウントできるように準備するためのファイルである。
- 少し前までinitrdという名称で呼ばれていたが、現在はinitramfsに変更されている。
#5.ルートファイルシステムの完成
- ブート時に起動するプログラムやユーザ名、サービス名、パスワードといった最低限必要となるファイルを作成する。
- ex)inittab, rc.sysinit, rc*, passwd, group, profile, rsyslog.conf, services, fstab, hosts
#6.記憶媒体に書き込む
- fdiskによりパーティションを作成
- mke2fsなどでパーティションをフォーマット
- ビルドしたGNU/Linuxシステムをシュリンクしてから、アーカイブ、記憶媒体にコピー。
- ブートローダー(LILO, GRUB)を導入
- grub.confの設定
#7.各種アプリケーションを導入する
- 必要に応じて、vimなどのテキスト編集コマンドや、Apacheなどのサーバー関連アプリケーションを追加導入する。
【参考文献】
『日経Linux 2011年11月号』日経BP社
『日経Linux 2011年11月号』日経BP社
『日経Linux 自分で作るLinux OS 2006』日経BP社
『Software Design 総集編 2001 - 2012』技術評論社
Linuxの起動プロセス
Linuxの起動プロセスの知識は、トラブルが生じた時やkernelやその他環境をソースコードからコンパイルして組み合わせていく時に、重要となります。

【参考文献】
http://jibun.atmarkit.co.jp/lskill01/rensai/lpicdrill06/lpicdrill01.html

【参考文献】
http://jibun.atmarkit.co.jp/lskill01/rensai/lpicdrill06/lpicdrill01.html
Linuxにおけるプロセスの階層性
LinuxシステムではinitのいうPID 1のプロセスの子プロセスという形ですべてのプログラムが生成されます(forkの繰り返し)。
pstreeというコマンドを使用するとプロセスツリーをきれいに表示することができます。
$ pstree
ご覧の通り、initは最上流のプロセスということがわかります。
今回実行したpstreeというプロセスはinit-sshd-sshd-sshd-bash-pstreeのような親子関係を経てやっと実行されているのです。
ちなみにLinuxのkillコマンドはPID 1を特別なものと見なしており、killすることはできません。
#kill関数の仕様を確認
$ man 2 kill
ちなみにLinuxのkillコマンドはPID 1を特別なものと見なしており、killすることはできません。
#kill関数の仕様を確認
$ man 2 kill
Macにおけるプロセスの階層性
Linuxのプロセスはinitを1番の親プロセスとして子プロセスが再帰的に生成される形態を取っています。
Mac OS Xも同様のシステムを採用しています。
まずは、Macのプロセスの階層性を確認してみます。
#pstreeのインストール
$ wget ftp://ftp.thp.uni-duisburg.de/pub/source/pstree-2.27.tar.gz
Mac OS Xも同様のシステムを採用しています。
まずは、Macのプロセスの階層性を確認してみます。
#pstreeのインストール
$ wget ftp://ftp.thp.uni-duisburg.de/pub/source/pstree-2.27.tar.gz
$ tar xzvf pstree-2.27.tar.gz
$ gcc -o pstree pstree.c
#pstreeの実行
$ ./pstree
このツリーを眺めてみると、
rootユーザーが実行した/sbin/launchdというプロセスがすべての元のプロセス(PID : 1)ということができます。
そこで、このプロセスを停止(kill)してみるとどのような挙動が予測されるでしょうか。
UNIX系のOSにおいては親プロセスが停止されると子プロセスも強制終了されます。したがって、launchdを停止すると、システムが強制終了されることが予想されます。
実際に行ってみます
#( - 9)は強制終了のためのオプション
$ sudo kill -9 1
見事にシステムはシャットダウンされました。
登録:
投稿 (Atom)








