FreeBSD でカスタムカーネルのビルドとインストール
(オプション) カーネルコンフィグファイルの新規作成と編集
カーネルのセキュアレベル
/etc/rc.conf の 「kern_securelevel="-1"」の行を、(必要なら)変更する.
/etc/rc.conf の変更を有効にするためには、reboot を行ってください.
参考 Web ページ:
https://docs.freebsd.org/ja/books/handbook/security/
カーネルコンフィグファイルの新規作成と編集
下記のamd64のところは,マシンのタイプに応じて,適切に読み替えてください.
cd /usr/src/sys/amd64/conf
cp GENERIC NEWKERNEL
# ここで、NEWKERNEL の編集を行ってください

カスタムカーネルの構築ですが、昔は、性能向上が目的でした。 現在は、コンピュータは十分速いですが、 セキュリティ向上のために余分な機能を削る という目的で、カスタムカーネルの構築を行なうことをお勧めします.
config を実行する前に、NEWKERNEL の編集を行う.
- ident
必ず ident の行は GENERIC 以外に書き換えておくこと(GENERIC のままだと混乱の元です)。
* 設定例: カーネル識別名を NEWKERNEL に設定
ident NEWKERNEL
- (オプション)CPU
- (オプション) 止むを得ない理由で,カーネルから IPv6 関係のモジュールを外さないといけない場合には,options INET6, device gif, device faith をコメント化
FreeBSD の設定ファイルには, IPv6 の存在を前提に造られているものがあるので,よほどの理由が無い限り,IPv6 の機能は生かしておく方がよい.
- (オプション)NFS を使わない場合
* 設定例: NFS を使わない場合
- ATA and ATAPI devices の不要なものをコメント化
* 設定例: フロッピードライブとテーブドライブをコメント化
- SCSI peripherals は下手に触ると,起動できなくなる可能性がある(達人でないかぎり触らない,ことを勧めます).
- RAID controllers interfaced to the SCSI subsystem の不要なものをコメント化
* 設定例: すべてをコメント化
- RAID controllers の不要なものをコメント化
* 設定例: すべてをコメント化
- PCCARD (PCMCIA) の不要なものをコメント化
* 設定例: すべてをコメント化
- Serial ports の不要なものをコメント化
* 設定例: すべてをコメント化
- Parallel port の不要なものをコメント化
* 設定例: すべてをコメント化
- PCI Ethernet NICs の不要なものをコメント化
必要な NIC は「ifconfig -a」で分かるので,それ以外は取り除く,という意味.
* 但し「miibus」は取り除いてはいけない
* 設定例: em と miibus 以外をすべてコメント化
- ISA Ethernet NICs の不要なものをコメント化
* 設定例: すべてをコメント化
- Wireless NIC cards の不要なものをコメント化
* 設定例: すべてをコメント化
- USB Serial devices, USB Ethernet, USB Wireless の不要なものをコメント化
* 設定例: すべてをコメント化
- Firewire の不要なものをコメント化
【関連する外部ページ】 http://www.jp.freebsd.org/www.FreeBSD.org/doc/ja_JP.eucJP/books/handbook/kernelconfig.html
/etc/make.conf の設定
/etc/make.conf には、新しいカーネル識別名を書いておきます.
KERNCONF= NEWKERNEL
システムとカーネルのビルドとインストール
/etc/make.conf の設定
/etc/make.conf には、次のような行を追加しておく.
# /etc/make.conf を次のように設定
CFLAGS+=-O2 -fno-strict-aliasing -pipe
NO_PROFILE=true
USA_RESIDENT=NO

システムのビルド
先ほど、「cd /usr/src; make update」を実行して,ソースコードの更新を行った。更新されたソースコードを使って,システムのビルドを行う.
- FreeBSD ハンドブックに目を通す
作業を行う前に、FreeBSD ハンドブックの Web ページ を読んでおく.役に立つ情報が得られるでしょう.
- /usr/src/UPDATING に目を通す
- /usr/share/examples/etc/make.conf に目を通す
/usr/share/examples/etc/make.conf の CFLAGS, NO_PROFILE の行を参考にして,/etc/make.conf を書き換える
- (オプション)前回のビルドの結果の消去
「以前にも,同じマシンで,FreeBSD のシステムのインストール(つまり make buildworld) したことがある」という場合,前回のビルド結果を消しておく操作を行っておく.
make buildworld により,「前回のビルド結果は自動で消える」はず,とは言え,下記のようなコマンド操作を行っておくと,トラブルが減る(私の経験上)
cd /usr/obj # chflags -R noschg * で "No such file or directory" と出ても無視 chflags -R noschg * rm -rf * cd /usr/src # make cleandir は2回行う make cleandir; make cleandir
- システムのビルド操作
ビルドには大体1時間以上かかります. 「script ...」の実行で、以下「exit」までが /var/tmp/makeworld.out に記録されるようになる.これは,エラー時に役立つので便利.
* プロファイル版のライブラリを生成したくない ときは,make buildworld, make installworld の実行時(両方とも)に,「-DNOPROFILE=true」を付ける
script /var/tmp/makeworld.out cd /usr/src make -j4 buildworld
- ビルドの結果の確認
エラーメッセージが出ていないこと
- script の終了
exit
GENERIC カーネルのバックアップ
今なら「インストールした時点のカーネルのファイル(つまり確実に動くファ イル)」 が残っているので、バックアップしておく.
- シングルユーザモードで起動
カーネルのバックアップは,シングルユーザモードで行ないたい。
shutdown now fsck -p mount -u / mount -a -t ufs swapon -a
- GENERIC カーネルのバックアップ操作
mkdir /boot/GENERIC.BAK cd /boot tar -cvpf /var/tmp/GENERIC.tar ./kernel cd /boot/GENERIC.BAK tar -xvpf /var/tmp/GENERIC.tar rm /var/tmp/GENERIC.tar
- マルチユーザモードに移行
バックアップが終わったので,「exit」でマルチユーザモードに移行する.
exit
カーネルのビルドとインストール
カーネルの構築とインストールを行うが、その前に、上記の「システムのビルド」を済ませておくこと。
- カーネルのビルド操作
◆ GENERIC カーネルを再構築する場合
GENERIC カーネルを再構築してインストールする場合には 下記のように「KERNCONF=GENERIC」とします.
カーネルの構築とインストールには、時間がかかります
script /var/tmp/buildkernel.out cd /usr/src make -j4 buildkernel KERNCONF=GENRIC
◆ カスタム・カーネルを構築する場合
KERNCONF=*** のところには、作成したカーネルコンフィグファイルの名前を書く.
* 「カーネルコンフィグファイルを作っていないよ」という場合には,すでにある GENERIC を使いたいので,上の「GENERIC カーネルを再構築する場合」の手順になる.
script /var/tmp/buildkernel.out cd /usr/src make -j4 buildkernel KERNCONF=NEWKERNEL
- script の終了
exit
- シングルユーザモードで起動
カーネルのインストールは,シングルユーザモードで行ないたい。
shutdown now fsck -p mount -u / mount -a -t ufs swapon -a
- カーネルのインストール操作
◆ GENERIC カーネルをインストールする場合
GENERIC カーネルを再構築してインストールする場合には 下記のように「KERNCONF=GENERIC」とします.
カーネルの構築とインストールには、時間がかかります
cd /usr/src make installkernel KERNCONF=GENERIC
◆ カスタム・カーネルをインストールする場合
KERNCONF=*** のところには、作成したカーネルコンフィグファイルの名前を書く.
* 「カーネルコンフィグファイルを作っていないよ」という場合には,すでにある GENERIC を使いたいので,上の「GENERIC カーネルを再構築する場合」の手順になる.
cd /usr/src make installkernel KERNCONF=NEWKERNEL
- 再起動
再起動します.
sync sync sync sync sync reboot
* カーネルが起動しない場合
ブートローダ(FreeBSD の新しいバージョンなら、起動時のメニューで 「6. Escape to loader prompt」を選びます
unload
load /boot/GENERIC.BAK/kernel/kernel
boot
のようにカーネルのファイル名を指定して起動できるので、さっきバックアッ プをとっておいた GENERIC カーネルで起動します.
システムのインストール
- シングルユーザモードで起動
システムのインストールは,シングルユーザモードで行ないたい。
shutdown now fsck -p mount -u / mount -a -t ufs swapon -a
- 新カーネルのタイムゾーンの設定
adjkerntz -i
- システム設定ファイルのバックアップ
cp -Rp /etc /etc.org
- システム設定ファイルの事前マージ
mergemaster -p
基本は「d」で棄却. 必要なものだけ「m」でマージ.
- システムのインストール
make installworld のときは,オプションに -j などを付けてはいけません。
* 「make installworld」の実行時に指示が出たら、指示に従うこと
cd /usr/src make installworld
- 再起動
再起動します.操作ミスで,再起動できなくなることもよくあるので注意(そのときはシングルユーザモードで再起動して,/etc.org を使うなどで対処)
sync sync sync sync sync reboot
- 不要ファイルの削除と,システム設定ファイルの事後マージ
まず,不要ファイルの削除を行う.
cd /usr/src make delete-old
次は mergemaster の実行.
基本は「d」で棄却. 必要なものだけ「m」でマージ.
mergemaster -UPi
* mergemaster の実行によって /etc, /dev のファイルが新しいファイルに入れ替わってしまうので, 上記の手順では,「cp -Rp /etc /etc.org」 を実行して、コピーを作っています./etc.orgに古いファイルがバックアップ として残るので、必要に応じて、自分でマージを行ってください(つまり、手動でマージします. 問題が起きたときに /etc/etc.org のファイルを見る、という感じでも良いで しょう)。
- バージョンの確認
uname -a
「uname -a」を実行して、バージョンを確認しておく.
(オプション)後処理
# (オプション)古いライブラリの削除
cd /usr/src
make delete-old-libs
# (オプション)sysinstall のインストール
cd /usr/src/release/sysinstall
make all install
注意点
たいていは大丈夫なのですが、 システムの更新の結果,たまに、いくつかのソフトが動かなくなることがあります. (/usr/src/UPDATING を確認)解決法
- 該当のソフトを ports で入れ直す(make deinstall; make clean; make; make reinstall ).あるいは,
- portupgrade -f nvidia-dirver-196.07 のように実行する.