CLI・CUIなワークステーションを作る へ

Gentoo/FreeBSDで動かしてみる

Linuxのディストリビューションの中には,Gentoo Linuxというのがあって,カーネルからユーザープログラムまで基本的には全てコンパイルして作り上げることから,必要な機能だけを最小限の組み合わせで実現し,かつ,個々のソフトウェアのバージョンアップがあっても,都度コンパイルすることから,使っている機械にあったプログラムができてくるという,「必要最小限の環境」を結構追い求めている私には結構ありがたいディストリビューションがあります。(もっとも,その反面,初心者には,今やFreeBSDより不親切という……。)
ただ残念だったのは,あくまでLinuxベースだったことだったのですが,有志がFreeBSDの上で動かしてしまおうと作業を進めていて,現在,FreeBSD 9の上で動くようになっております。
そうしますと,HDDにもともとのFreeBSDとGentoo/FreeBSDとが入っていると,これはファイルシステムに共通のもの(UFS)を採用した時に,割と無理なく相互にファイルを参照できるようになることから,今回入れてみた次第です。
もともとGentoo/FreeBSDを入れようなんて考える人は,英語で書かれたサイトは苦にしないでしょうが,まあ,自分用の情報整理も兼ねて,日本語で書いてみたいと思います。詳細は,
https://wiki.gentoo.org/wiki/Gentoo_FreeBSD
を参照してください。

ちなみに……。こんなことをやろうとしている人は,HDDにいろんなことを仕掛けようとすることが,既存のデータ等を壊しかねないということを知っているとは思うけど……。わからなかったり怖かったりしたら手出ししない方がいいよ〜。

0 下準備

64bitCPUの機械
実は32bitCPUでも動くのですが,上記本家Gentoo wikiでは,32bitCPUを非推奨としています。
インターネット回線
有線LANでつなぐ方がよいと思います。
無線LANについては,FreeBSDの場合,インストールプログラムがそもそも無線LANのユニットを認識しない場合が多いので。(CPUがインテルのマザーボードの場合は問題ないことが多いのですが,AMDのマザーボードの場合には認識したためしがないです。)
空き領域のあるMBRを使用しているHDD
実は空き領域があれば,MBRではなくGPTでもいいですし,またZFSを使っていても全然かまわないのですが,上で述べたとおり,私の場合,他のFreeBSDと相互に読み書きができることを目標としているところ,MBRの下でUFSを使うと,あとはマウントするだけで簡単に目標達成となるのに対し,GPTは大容量のHDDを使用できるはずなんだけど,いまだに仕組みがよくわかってないこと,ZFSについては,HDDの全部を使った例しか知らないので,自分にもなんとかなっているということだけで「MBR使用」「空き領域は確保済み」という前提で説明します。
ちなみに上記本家Gentoo wikiでは,GPT使用の例やZFS使用の例,さらには,仮想化ソフトで動かす場合の注意事項まで盛り込まれています。
USBメモリー
1GB程度のUSBメモリーを1本用意してください。規格はUSB2.0で十分です。USB3.0については,機械によって,起動できない場合があってその場合にはUSB2.0のコネクタを使わなければならなくなります。そうするとUSB3.0の規格のUSBメモリーでも宝の持ち腐れになりますので,あえて用意するまでの必要はないでしょう。
ちなみに,これは後述のとおり,非常時用の立ちあげに有効利用できるので,Gentoo/FreeBSDを運用している時には,1本をこれ専用にしておくと便利だと思います。
FreeBSDのUSBメモリー用インストールファイル
FreeBSDインストール用のファイルのうち,USBメモリー用のものを用意します。
FreeBSDの公式サイトの日本語版の方から「FreeBSDを入手する」を選び,過去のリリースについて,「FTP アーカイブからダウンロードせよ」と書いてあるので,そこから,「amd64」→「amd64」→「ISO-IMAGES」→「9.1」とたどり,「FreeBSD-9.1-RELEASE-amd64-memstick.img」をダウンロードしてきてください。

http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/amd64/amd64/ISO-IMAGES/9.1/FreeBSD-9.1-RELEASE-amd64-memstick.img
ちなみに32bitの場合には9.1ではなく9.0をダウンロードすること。
落としてきたファイルはイメージファイルを書き込むことができる適当な書き込みソフトを使って,USBメモリーに書き込んでおきます。
筆記用具
メモ用紙と鉛筆,ペンの類を用意しておきましょう。
とりあえずは,
をメモしておきましょう。

1 起動

LANケーブルをつないだ状態で,上で作ったFrssBSDインストール用USBメモリーをさして起動させます。ちなみに私の機械の場合電源投入後の画面でF11でした。
そうするとFreeBSDのインストールプログラムが起動しますが,FreeBSDと書かれた文字キャラクターによる絵のところの選択肢は,もし1セクターのサイズを4096byteにしている,4KセクターのHDDを使用している場合を除き,そのままリターンです。(1を選んでリターンでも同じ。)
仮に,4KセクターのHDDの場合には,2を選んでリターンの後,次のとおり打って,スタートさせます。

set kern.cam.ada.0.quirks="1"
boot

※ ちなみに4KセクターのHDDか否かの判別方法なのですが,先にwindowsが入っている私の場合,windowsのコマンドプロンプトで,

Fsutil fsinfo ntfsinfo c:

と打つと,HDDの情報がいろいろ表示されますが,その中の「Bytes Per Sector」の数値が4096となっているものが4KセクターのHDD,512となっているものが,従来型の512byteのHDDです。私はWindowsXpの頃の2Gバイト制限を気にしているせいで,HDDは最大2Gのものしか使っていないのですが,やはり予想通り512byteのものでした。

そうするといろいろ動き始めますが,三択で「Live CD」を選ぶと,コマンド入力画面になります。「Install」を選択しないように!

2 キーボードの設定

kbdcontrol -l us.iso

最初に作業中のキーボードの設定です。
上記本家Gentoo wikiでは,uk.isoを例示していますが,Happy Hacking Keyboadを使用している私の場合,上記のとおりus.isoでいいはずです。
一般的な日本語キーボードは,jp106.isoでいいと思うのですが……さすがにこれは検証していません。(日本語キーボードの機械もないわけじゃないけど……,検証作業のためにわざわざ今入っているOS消すか……と。)
ちなみに,どんなキーボードがあるかは,
ls -l /usr/share/syscons/keymaps | less
で一覧できます。

3 謎ディレクトリの作成

mkdir -p /tmp/bsdinstall_etc

……手順をあまり検討していないので,なぜ作るのか全く不明。

4 作業中のネットワークの設定

ifconfig

まずネットワーク機器を見つけます。
いくつもネットワーク機器がみつかっても不思議じゃないのですが,その中でstatusがactiveなのを選びます。em0とかre0とかが怪しい。lo0は無視です。
後で使いますのでメモっておきます。(私の場合re0かre1,LANのコネクタが2つあるけど区別して扱うってことだな。さては。とりあえずre0だとして進めます。)
もしDHCPを使う場合は一行で足ります。

dhclient re0

これに対し,固定アドレスをふる場合には何行かにわたります。
まず,その機械の固定アドレスを指定。

ifconfig re0 192.168.1.3

次にメモってあるデフォルトゲートウェイのアドレスを指定。

route add default 192.168.1.1

最後は,ネームサーバーとして google public DNS のアドレス8.8.8.8を指定して/etc/resolv.confに追加。

echo "nameserver 8.8.8.8" > /etc/resolv.conf

……まあ本当は自分のネットワークで使えるより近いDNSを使うべきなんだろうけどね……。この方法が上記本家Gentoo wikiが例示している方法だったりする。

5 HDDの領域確保・設定

ちなみに,HDDの情報がまるでわからないとか,確認したいという場合には,
dmesg | grep ada
で表示されます。
また
gpart show
で,領域の情報が表示されます。

仮にHDDに他のOSが入っていない状態で作業する場合,MBRを書き込んでおきます。

gpart create -s mbr ada0

この作業は,既存のOSがあってMBRが存在していて,空き領域に追加してインストールする場合は不要です。
次に,空き領域にfreebsdのラベルをつけてスライスとして確保します。

gpart add -t freebsd ada0

空き領域全部を使わない場合には,-tオプションの前に-sオプションを,「-s 824G」の要領でつけて使います。
この領域をactiveにします。(windowsやBSD系で起動可能にするという話のはず。Linux系はこの作業は不要のはず。)-iオプションはgpartが付けている一連番号で,gpart showで表示されるはずです。……わかりにくいけど。まあたいていは1からスタートして順番についているはずです。

gpart set -a active -i 2 ada0

このスライスのタイプをBSD(165……だよね)に指定して確保します。

gpart create -s bsd ada0s2

このスライスの中にまずメインとなるUFSによるファイルシステム用の領域を確保します。
今回はswap以外は全部/としてぶらさげてしまいます。
残り領域からswap領域を引いた分を指定すると,残りがswap領域になるという作戦です。
ちなみにswap領域は,大昔はメインメモリーの4倍用意するのがいいとされていましたが,今は,swap領域を特に用意しないで,ファイルシステムの中にswapファイルを持たせる方法論もあるくらいで,4倍とかいう数字ではないようです。例えば「2GBまでは物理メモリの2倍(最低32MB),33GB以上は物理メモリと同量,その間では物理メモリ+2GB」を推奨しているところがあるようですし(Red Hat社?),経験則では2倍というのもよく言われますし,そもそもスワップさせるようなら負けという指摘もあります。
ここでは空き領域が824GBあったので,swapに実メモリの2倍の32GBとることにして792GBを/として確保しましょう。

gpart add -s 792G -t freebsd-ufs ada0s2

swap領域も確保します。

gpart add -t freebsd-swap ada0s2

次はファイルシステムの作成です。
-Lオプションは,ラベルをつけるということで,一種の抽象化のはずです。原理的には,ラベルつけないで,以後/dev/ada……方式で通すのもありのはずですが……。

newfs -L gfbsdroot -U /dev/ada0s2a

ada0のスライス2の最初に確保した=a領域という意味です。
なお,-tでTRIMが使用可能になるということはSSDを使用する場合には-tオプションをつけた方がいいってことですな。
-jはジャーナル使用可……ってことだけど,まだよく調べてません。
次にマウントです。

mount /dev/ufs/gfbsdroot /mnt

最後にswap領域も動かします。aの次に確保したのでada0のスライス2のb領域です。

swapon /dev/ada0s2b

6 gentooのコアな部分をダウンロード

gentoo linuxではstage3ファイルと呼ばれるものと,portageの最新版とをダウンロードしてきます。
ちなみに今は,基本的にはstage3しか提供されませんが,昔は,もっと基本的な部分についても選択可能とするため,stage2やstage1というのも普通に提供されていたんですよ。
なお,32bit版については場所が違いますので,上記本家Gentoo wikiを見ましょう。

cd /mnt
fetch http://distfiles.gentoo.org/experimental/bsd/freebsd/stages/amd64-fbsd-9.1/stage3-amd64-freebsd-9.1.tar.bz2
fetch http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2

7 コアな部分の展開

まず,念のため再度/mntに移動して,文字コードをUTF-8に指定します。

cd /mnt
setenv LANG "en_US.UTF-8"

そして,いよいよ,展開です。
stage3とportageで解凍コマンドのオプションが微妙に違うこと,解凍先が異なることに要注意です。
ちなみに……このオプションだとなぜか途中経過を報告しないので(このオプションは本来途中経過を報告するはず。文字コードが実はおかしい?),画面が動かず,うまくいっているのかどうか,ちょっと怖くなります。

tar xjpf stage3-*.tar.bz2 -C /mnt
tar xjf portage-latest.tar.bz2 -C /mnt/usr

8 カーネルのコンパイルの前段階

いよいよカーネルのコンパイルなのですが,実機に近いフォルダ構成にするため,一定の手順を踏んで,chrootでrootを仮想的に移動させます。

mount -t devfs devfs /mnt/dev
cp /etc/resolv.conf /mnt/etc/
chroot /mnt /bin/bash
env-update && source /etc/profile

次に,コンピューターの時計についてローカル時間を設定します。
この機械ではwindowsも使う以上,windowsの標準的な思想である「コンピューターの内部時計自体は現地時刻に合わせてあるはず」を前提に,ローカル時間として日本時間を設定します。

cp /usr/share/zoneinfo/Japan /etc/localtime

※ちなみに内部時計もUTCにあわせるUNIX的な発想だと「Japan」ではなく「UTC」でいいのかしらん。それとは別にGMTがある……。

さらに,エディタとしてnanoをインストールします。
gentooではemergeで一発。

emerge -u sys-apps/portage ; emerge sys-devel/libtool app-admin/eselect
emerge app-editors/nano

もし /etc/make.conf があれば移動させておけという話なのですが,たぶんないと思います。

ls /etc/make*

で,/etc/make.confがないことを確認しておきましょう。なければ以下の2コマンドは実行する必要がありません。

mv /etc/make.conf /etc/portage/
nano -w /etc/portage/make.conf

9 カーネルのコンパイル

カーネルのソースを持ってきましょう。あとflexも準備します。

USE=symlink emerge freebsd-sources
emerge -u sys-devel/flex

カーネルのコンパイルをするディレクトリに降ります。

cd /usr/src/sys/amd64/conf

ちなみに32bitでは違うディレクトリに降りなければなりません。
そしておなじまないをかけてカーネルのコンパイルです。

cp GENERIC.hints /boot/device.hints
config GENERIC
cd ../compile/GENERIC
make cleandepend && make depend && make -j3 && make install

10 起動時のファイルシステムの設定

/etc/fstabを編集して,起動時に,ファイルシステムがきちんと動くようにしておきます。

nano -w /etc/fstab

ちなみに,注意すべき点は2つ。
(1) /dev/ufs/gfbsdroot / ufs rw 1 1 を入れておくこと。
ちなみに /dev/ufs/gfbsdroot の代わりに /dev/ada0s2a と直接指定していたことがかつてありました。私。……大丈夫だったよ。
(2) /dev/ada0s2b none swap sw 0 0 を入れておくこと。(もしくは冒頭の#を消すことでコメントアウトしておく。)

書き換えたら,control-o で保存し,control-xでnanoを終了させます。

11 機械名の設定

機械の名前を設定します。

nano -w /etc/conf.d/hostname

で,/etc/conf.d/hostnameを開き,

hostname="daemon.homenetwork"

という行を入れると,この機械はdaemon.homenetworkという名前で認識されます。
ちなみにFQDN推奨だそうですが,ブロバイダー経由で接続している場合,そのブロバイダーのドメイン名から書くのは何か違うと思うし,私みたいにドメインを持っている人でも,そのドメイン名から書くのはこれまた何か違うと思うのです。なもんで,コンピューター名だけをそれっぽく入れておけばいいんじゃないかと思います。
書き換えたら,control-o で保存し,control-xでnanoを終了させます。

12 ネットワークの設定

ネットワークの設定ですが,まず冒頭は機械名設定と同様です。

nano -w /etc/conf.d/net

で/etc/conf.d/netを開き

dns_domain_lo="homenetwork"

の要領でネットワーク名を入れます……が,
ちなみにドメイン名入力推奨だそうですが……(以下略)

で,ここからが重要。
DHCPを使用する場合は,

config_re0="dhcp"

の行を入れてください。当然re0はネットワーク機器として認識してメモってある,例の文字列を入れるのですよ。

これに対し,固定アドレスで立ち向かう場合には,この行は入れないで,デフォルトゲートウェイ 192.168.1.1 ,機械のIPアドレス 192.168.1.3 ,ネットマスク 255.255.255.0 とした場合,

config_re0="192.168.1.3 netmask 255.255.255.0"
routes_re0="default via 192.168.1.1"

と書き加えてください。
書き換えたら,control-o で保存し,control-xでnanoを終了させます。

最後におまじないです。ネット関係の設定を反映させます。

cd /etc/init.d
ln -s net.lo0 net.re0
rc-update add net.re0 default

13 キーボードの設定

キーボードの設定が必要の場合は,
nano -w /etc/conf.d/syscons
で,設定します。
どう設定するかについては,(上にも書きましたが)
ls -l /usr/share/syscons/keymaps | less
で,確認します。

14 rootのパスワードの設定

passwd
rootのパスワードを設定します。

15 ユーザーの追加……は後でいい

上記本家Gentoo wikiでは,ここでユーザーの追加登録を行います。なんでもrootでやるなという点では,ユーザー登録しておいた方が筋がいいのはわかるのですが……。
……後ででいいんじゃね?
ちなみに,adduserコマンドですが,FreeBSDのインストール時に聞かれるのと全く同じです。……てえか同じじゃないと困るのだが……。

16 SSHもDHCPも使えるようにしておく

emerge -u net-misc/openssh
rc-update add sshd default
emerge net-misc/dhcpcd
特に最後の行は,固定アドレス使わないでDHCPを使うことにした人は必須!

17  ブートマネージャーのインストール

emerge sys-freebsd/boot0
gpart bootcode -b /boot/boot0 ada0
gpart bootcode -b /boot/boot ada0s2

ちなみに……。3行目は必須です。一方2行目は……,grubやgrub2が設定済みの場合には,省略してください。ない場合にだけ実行します。実行の結果,FreeBSDの一番単純なブートマネージャーがHDDの先頭に書き込まれ,電源投入→マザーボードの自己診断の後,まっさきに起動されることとなります。

18 終了

ここまで無事できたら,

exit

の後,「reboot」でも「shutdown -h now」でも,お好きなものをどうぞ……なのです。
なお,現在のGentoo/FreeBSDは,FreeBSD10.1推奨なので,あとでupdateかけておきたいところなのですが……。
2015年11月29日現在,「freebsd-update -r 10.1-RELEASE upgrade」は,freebsd-updateがデフォルトではインストールされていないので,動きません。また,上記本家Gentoo wikiでも記述がありません。

緊急起動用USBで起動したのち

上の方で,「非常時用の立ちあげに有効利用できるので,Gentoo/FreeBSDを運用している時には,1本をこれ専用にしておくと便利」と書きましたが,そのUSBメモリーで起動した後,どうすればよいのかという話。
たとえば,grubが入っていてそれを利用して起動していたんだけど,普通のFreeBSDの領域に再インストールしたら,/boot/grub/grub.cfgが消えちゃって,うまく起動してくれないんで,とりあえずGentoo/FreeBSDを動かして gpart bootcode -b /boot/boot0 ada0でboot0をインストールして最低限起動できるようにしたい(起動してしまえば,普通のFreeBSDの側でgrubインストールして/boot/grub/grub.cfg書けるでしょ)って話。
まずは,LiveCDを選んでコマンド入力画面(CUI画面)に移動してください。

kbdcontrol -l us.iso
mount /dev/ufs/gfbsdroot /mnt
swapon /dev/ada0s2b
mount -t devfs devfs /mnt/dev
cp /etc/resolv.conf /mnt/etc/
chroot /mnt /bin/bash
env-update && source /etc/profile
この段階でネットワーク接続が必要なら
dhclient re0
か,
ifconfig re0 192.168.1.3
route add default 192.168.1.1
echo "nameserver 8.8.8.8" > /etc/resolv.conf
を追加

あとは,必要な作業をやるだけです。

(2015.11.23.初版)
(2015.11.29.最終改訂)

CLI・CUIなワークステーションを作る へ