こんにちは。皆様いかがお過ごしでしょうか。今年もあと二週間で終わりですね。今年こそはと決めててやり残したことはもう済みましたか?かくいう僕も今年の目標を決めてあったのにあまりできなかったなぁという認識なので、最後の月になってから目標達成に向けて全力で走り続けているような感覚です。
今回は、その目標に掲げた内の一つをこのTechRachoで執筆するという願掛けの意味で報告したいと思います。
自分の気の済むまでFreeBSD環境を構築する
思い起こせば学生時代からですが、僕が普段利用しているOSはFreeBSDです。昨今、UbuntuやCent OSなどのLinux OSと比較して、FreeBSDのシェアはデスクトップOSのシェアがほぼ0%という統計になっています1。それもあってか、FreeBSDの技術記事もLinuxと比較して少ない気がします。
そこで、目標としてやりたかったFreeBSD環境を気の済むまで自分なりに構築し、共有したいと思います。今回、環境構築で行う内容は以下の通りです。
せっかくですから、FreeBSDのインストールで僕がこだわっている部分についても簡単に書きます。
それでは一つ一つやっていきましょう!
FreeBSDのインストール
ディスクイメージの入手
FreeBSDインストールのためにディスクイメージを入手します。FreeBSDを入手するでインストールしたいFreeBSDのversion、アーキテクチャを選び入手しましょう。
ディスクイメージの種類には色々ありますが、ネットワークの帯域に余裕のある人にはbootonly.isoファイルがオススメです。FreeBSDをブートするイメージだけ入手し、必要なパッケージはネットワーク越しに入手するパターンになります。ディスクイメージの容量もそれほど大きくないのですぐにダウンロードできます。
インストール中のパッケージダウンロードが不安な場合は、サイズは大きいですがディスクイメージの中に全てのパッケージが導入されているdvd.isoを選ぶといいでしょう。
FreeBSDのインストール
物理マシンやVMにインストールしたディスクを入れて起動し、しばらく待つと以下のインストール画面に遷移します。
- 「Distribution Select」では、「doc」と「lib32」の二つを導入します。
- 「ports」は、バイナリパッケージをインストールする「pkg」を利用するので不要です。
- 「src」をオフにして、OSソースリポジトリの見直しでソースを手動で取得できるようにします。
ミラーサイトの設定
ミラーサイトの設定は、昔はftp.jaist.ac.jpのaliasであるhttp://ftp6.jp.freebsd.orgをよく選んでいました。ここ最近は、東京に引っ越してきたこともあり、ftp.iij.ad.jpのaliasであるhttp://ftp2.jp.freebsd.orgを選んでいます。
インストール時のこだわりはこの辺りでしょうか。
他にもパーティションの切り方や時刻設定などがありますが、パーティションはインストールディスクのサイズに合わせてパーティションサイズを適したサイズに大体決めてくれますので特に気にする必要はありませんし、時刻設定もJSTに変えれば完了します。
デスクトップ環境
FreeBSDでデスクトップ環境を立ち上げます。FreeBSDには基本的に(PC-BSDとかは別)デスクトップ環境が最初から入っているイメージディスクというのはありません。そのため、OSインストール後に改めて設定する必要があります。
ちなみに、僕が利用するデスクトップ環境はGnomeです。長らくFreeBSDで公式にサポートされていたのはGnome 2でしたが、FreeBSD 10辺りからようやくGnome 3のパッケージを公式リポジトリがサポートするようになりました。
また、次世代バイナリ管理ツール「pkg」が出るまでは、portsを使ってパッケージのソースを直接コンパイルしてインストールしていました。そのため、パッケージの中でも特に重いデスクトップ環境はインストール作業だけでも1〜2日かかったのを覚えています。
構築するだけでも大変だった思い出しかないデスクトップ環境ですが、今インストールするのであればやはり「pkg」でバイナリパッケージをインストールするのがいいでしょう。
Xorgのインストールと設定
まずはX Window Systemを提供するXorgをインストールします。
% sudo pkg install xorg
続いて、Xorgでドライバを認識するための設定ファイルを作成します。
と言っても、ほとんどのデバイスは自動的に検出されるため、設定を修正する必要はほとんどありません2。
ここでは、簡単に生成された設定ファイルを/usr/local/etc/X11/xorg.conf.d/
にコピーします。
% sudo Xorg -configure
% sudo cp /root/xorg.conf.new /usr/local/etc/X11/xorg.conf.d/xorg.conf
Gnomeのインストールと設定
続いてGnomeのインストールです。
% sudo pkg install gnome3
Gnomeを利用するには、/proc
ファイルシステムをマウントする必要があります。以下の内容を/etc/fstab
に追加します。
% sudo vim /etc/fstab
proc /proc procfs rw 0 0
最後に、GnomeをFreeBSDマシンの電源投入直後に起動するように、起動スクリプトである/etc/rc.conf
に設定を追加します。
ここで、GnomeのディスプレイマネージャであるGDM、メッセージバスのD-Bus、ハードウェアをリアルタイムに管理するデーモンのHALも同じく電源投入時に起動するように設定をします。
% sudo vim /etc/rc.conf
dbus_enable="YES"
hald_enable="YES"
gdm_enable="YES"
gnome_enable="YES"
以上の設定で起動時にGnome3の画面が出るようになります。
テキストエディタ
ここ最近、僕が良く使うテキストエディタはVisual Studio Codeです。そのため、本来ならVSCodeをFreeBSDにインストールしたい所です。しかし、FreeBSDではVSCodeのサポートされていないため(サポートして欲しいという要望はありますが、かなり母数が少ない(issues)ので、サポートを待ちながら他のエディタを試すことにします。
vim
vimはサーバの設定ファイルの編集によく使います。もちろんシステム開発に使うこともままありますが、VSCodeでの開発が楽なので、ここ最近はvimで開発する機会がほとんどないのが現状です。
ちなみに、最近vimrcのカスタマイズにはvim-bootstrapによる自動生成をよく使っています。
という訳でvimをFreeBSDにインストールします。
% sudo pkg install vim
emacs
学生時代はvimよりもemacsをよく使っていましたが、vimを使い始めるようになってからはほとんど使わなくなってしまいました。
しかし、後述のメーラーの箇所で使う機会が増えてきたため、こちらもインストールします。
% sudo pkg install emacs25
色々と右往左往していますが、実際の効率とスピードを考えてバランス良くやっていけたらなと思っています。
ついでに調べてみたところ、emacsにもemacs-bootstrapという設定ファイル自動生成サイトがあるようですね。
メーラー
エディタと同様、メーラーにも特にこだわりはありません。と言うよりも、まだ自分に合うようなメーラーが見つけられていないような気がします。
ThunderBirdでもいいのですが、せっかくなのでemacsで実行するメーラー「mew」を利用したいと思います。
mewのインストールと設定
mewはgitリポジトリがあるので、gitでソース管理します。
% git clone git://github.com/kazu-yamamoto/Mew.git
ソースを入手したら早速インストールします。
% cd Mew
% git pull
% make distclean (初回は不要)
% ./configure
% make
% sudo make install
Mewを起動するには、~/.emacs
に以下の設定を加えます。
(setq load-path
(cons (expand-file-name "~/Mew") load-path))
(autoload 'mew "mew" nil t)
(autoload 'mew-send "mew" nil t)
;; Optional setup (Read Mail menu):
(setq read-mail-command 'mew)
;; Optional setup (e.g. C-xm for sending a message)
(autoload 'mew-user-agent-compose "mew" nil t)
(if (boundp 'mail-user-agent)
(setq mail-user-agent 'mew-user-agent))
(if (fboundp 'define-mail-user-agent)
(define-mail-user-agent
'mew-user-agent
'mew-user-agent-compose
'mew-draft-send-message
'mew-draft-kill
'mew-send-hook))
接続するメールサーバやメールアドレスの設定等、Mewのクライアント設定は~/.mew.el
で行います。
;; To user local mailbox "mbox" or "maildir" instead of POP
(setq mew-mailbox-type 'maildir)
(setq mew-mbox-command "incm")
(setq mew-ssl-verify-level 0)
(setq mew-use-cached-passwd t)
;;Load stunnel
(sets mew-prog-ssl "/usr/local/bin/stunnel")
;; Mail Server Setting
(setq mew-config-alist
'((gmail
(name "user name")
(user "maill address")
(mail-domain "domain name")
(mbox-command-arg "-u -d ~/Maildir")
(proto "%")
(smtp-auth t)
(smtp-ssl t)
(smtp-server "smtp server")
(smtp-ssl-port "465")
(smtp-user "smtp user name")
(imap-auth t)
(imap-ssl t)
(imap-server "imap server")
(imap-ssl-port "993")
(imap-user "imap user name"))))
FreeBSDのソース同期
FreeBSDのアップデートを行うにはfreebsd-update
コマンドを使うのが簡単です。メジャーバージョンのアップグレードからセキュリティパッチの適用まで簡単に行なえます。
しかし、freebsd-update
コマンドは、デフォルトのGENERIC
カーネルで起動しているFreeBSDマシンのみをアップデートするため(勿論、カスタムカーネル導入後のマシンでもfreebsd-updateは使えるが再起動後にGENERICカーネルで実行されてしまう)後述するカスタムカーネルの構築の作業とそぐわなくなってしまいます。
そこで、FreeBSDのソースを同期する形でOSのアップデートが行える環境を作りたいと思います。FreeBSDのソース同期はsvn
による管理ツールが主流でしたが、ここ最近は、git
リポジトリでもOSのソースを取得できます。
% cd /usr
% sudo git clone https://github.com/freebsd/freebsd src
ここでのmaster
ブランチは将来リリースされる予定の機能や修正が反映されます。そのため、FreeBSDの最新の機能を追いかけるにはmasterブランチは適していますが、既にリリースされているバージョンのFreeBSDを使いたい場合は、その都度ブランチを切り替えるといいでしょう。
% sudo git branch releng/11.0
% sudo git checkout releng/11.0
% sudo git pull origin releng/11.0
ブランチを切り替えた場合は、現在のソースでFreeBSDが実行されるようにコンパイルする必要があります。その作業は、カスタムカーネルの構築を行い、worldの再構築の項目へと続きます。
カスタムカーネルの構築
FreeBSDのデフォルトカーネルであるGENERICはほとんどの機能をサポートしていますが、良く使われる機能が有効になっていない事もままあります(VIMAGEとかそうですね、、、そろそろデフォルトで有効になるらしいですが)。前述のソースの同期でカーネルも取得できたため、自分なりのカーネルを作成します。基本的には、GENERICカーネルをコピーしたカーネルをカスタマイズするのが良いでしょう。
% cd /usr/src/sys/amd64/conf
% sudo cp GENERIC MYKERNEL
% sudo vim MYKERNEL
カスタムカーネルはident
を修正して利用したい機能を追加していきます。もし追加する機能が少しでGENERICのほとんどを修正する事がない場合は、わざわざGENERIC
の全コピーをしなくても、GENERIC
をinclude
し、差分だけ追加するような修正方法も取れます。
include GENERIC
ident MYKERNL
options VIMAGE
worldの再構築
ソースの同期、カスタムカーネルの構築を行いましたので、新しいバージョンのソースにアップデート、カスタムカーネルのインストールを行います。ハンドブックでは以下のようにアップデート作業の推奨手順が決められているので、カスタムカーネルをコンパイル、インストールするように修正します。
- worldの再構築が一度でも行われると、
/usr/obj
ディレクトリが作成されます。新たにworldの再構築を行う時間を短縮できるため、先に削除しておきます。
% sudo chflags -R noschg /usr/obj/*
% sudo rm -rf /usr/obj
- 新しいコンパイルと関連ツールをコンパイルします。
-j4
はコンパイル時に実行プロセスを4つ作って実行コンパイルを実行してくれます。CPU能力によっては、更なるコンパイル時間の短縮が期待できます。
% cd /usr/src
sudo make -j4 buildworld
- 新しいコンパイラでカスタムカーネルをコンパイルし、インストールします。カーネルの指定は
KERNCONF
オプションで指定できます。
% sudo make -j4 buildkernel KERNCONF=MYKERNEL
% sudo make installkernel KERNCONF=MYKERNEL
- アップデート作業を行うために、シングルユーザーモードに移行します。
% sudo shutdown now
# mount -u /
# mount -a -t ufs
# swapon -a
# adjkerntz -i
/etc
の設定ファイルのアップデート作業を行い、新しいworldおよびシステムのバイナリをインストールします。その後、残りの設定ファイルをアップデートします。mergemaster
は古い設定ファイルと新しい設定ファイルの差分を取りmergeしていいものか手動で設定します。
アップデートするべきかどうかはしっかりと設定を見て判断しましょう。
# mergemaster -iF
# cd /usr/src
# make installworld
# mergemaster -p
- 使われなくなったファイルとライブラリを削除します。
# make delete-old
# reboot
% cd /usr/src
% sudo make delete-old-libs
まとめ
という訳で、FreeBSDの環境構築を限界までやってみたという話でした。技術にこだわって進めてみましたが、普段は仕事とのバランスを考えてやっておりますので。
ちなみに、VSCodeのFreeBSDサポートに関して少し調べてみた所、こんなissuesとスクリプトを見つけました。
- https://github.com/electron/electron/issues/3797
- https://gist.github.com/prash-wghats/89be1ee069d2acf23c289e9c606616e1
どうやらFreeBSD上でVSCodeのビルドに成功した事例があるようです。vscodeがgithubでサポートされている事もここで初めて知りました。が、僕の手元では動かせていません。ここまでいけると最高だったのですが、それはまたの機会に。