Tech Racho エンジニアの「?」を「!」に。
  • インフラ

限界までFreeBSDの環境を構築したい

こんにちは。皆様いかがお過ごしでしょうか。今年もあと二週間で終わりですね。今年こそはと決めててやり残したことはもう済みましたか?かくいう僕も今年の目標を決めてあったのにあまりできなかったなぁという認識なので、最後の月になってから目標達成に向けて全力で走り続けているような感覚です。

今回は、その目標に掲げた内の一つをこの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にインストールしたディスクを入れて起動し、しばらく待つと以下のインストール画面に遷移します。

FreeBSD_installer

  • 「Distribution Select」では、「doc」と「lib32」の二つを導入します。
  • 「ports」は、バイナリパッケージをインストールする「pkg」を利用するので不要です。
  • 「src」をオフにして、OSソースリポジトリの見直しでソースを手動で取得できるようにします。

Distribution_Select

ミラーサイトの設定

ミラーサイトの設定は、昔は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の画面が出るようになります。

gnome_desktop

テキストエディタ

ここ最近、僕が良く使うテキストエディタは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の全コピーをしなくても、GENERICincludeし、差分だけ追加するような修正方法も取れます。

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とスクリプトを見つけました。

どうやらFreeBSD上でVSCodeのビルドに成功した事例があるようです。vscodeがgithubでサポートされている事もここで初めて知りました。が、僕の手元では動かせていません。ここまでいけると最高だったのですが、それはまたの機会に。

参考文献


  1. ちなみに、FreeBSDのシェアが急に伸びたりするのはファイルシステムの検証で使われることが多いからです。実際にOracleがZFSを提案した時に、FreeBSDでサポートした時には急に伸びました。 
  2. 日本語配列のキーボードを利用している場合は設定ファイルの配列を修正する必要あり。 

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。