2014年5月14日水曜日

思い立ったがGentoo(UEFIブートできるようインストール)

[追記: 2016/10/13]
この記事はUEFIブートに関する情報が公式ハンドブックになかったために執筆しましたが、今や日本語でも情報が載っていますので、この記事を読むことはおすすめしません。是非公式ハンドブックを参照ください。

ハンドブック:AMD64 - Gentoo Wiki


久しぶりに書きます。ていうか執筆中だけど公開して随時更新します。


当方メインにDebian sidをしばらく使っていました(半年ほど)が、debパッケージにすごい煩わされるのでGentooを試してみました。

ちなみに今までの私のディストリビューション歴は、Ubuntu→Debian(squeeze)→Debian(sid)でずーっとdeb系から離れられず、rpm系は一時的にCent OSやFedoraやopenSUSEやMageiaに触るという事はありましたが、常用はしたことがありません。

そして、なぜGentooを使おうと思ったのかという話なのですが、それは前述の通りdebパッケージに(メンテナーに)不備があった場合、いくら環境を変えても解決しようのない問題で、そういった問題に半日を費やしたこともあったので、バイナリパッケージから離れてみようという気持ちがあったからです。

たとえば私が今プライベートでのみ利用しているDebian Wheezyなサーバで、OwnCloudを導入しようと思ったのでaptitude installしたのですが、バージョンが古いとかは別段気にしないとして、なぜかパーミッション関係でおかしな事になるとかで、結局openSUSEコミュニティで別にビルドされた最新のパッケージでは不具合無く動くという。ググるとこんなんあるし、どうせ使えないならパッケージ消しといてくださいとか思っちゃいますけどね。

本来ならば私がDebianコミュニティに参加してMLに投下するとかメンテナーになれるよう始めるとかするべきなんでしょうが、そういう勇気はなかったので、ソースパッケージが扱えるGentooを試すことにしました。

Gentooのドキュメントはとても丁寧で、基本的にはこの通りで構わないのですが、日本語に翻訳されたものはほんの少し古いだとか、UEFIブートしたいとかは叶えられないとかがあるので、この記事にて試した痕跡や思ったところを残しておこうと思います。

参考にしたもの


まず、インストールに使うディスクはドキュメントにあるようなGentooインストールCDではなく、SystemRescueCdをおすすめします。なぜかというと、Gentooのインストール工程自体がそれほどインストールメディアに依存しないものであること、SystemRescueCdもまたGentooベースであるので混乱が少ないこと、そしてカーネルがEFIをサポートするようにビルドされていること、という3点があるためです。

ネットワーク関係はnet-setupを使えば問題ないでしょう。ただし私の環境では無線はうまく使えませんでした。

パーティションを分けるときは、余程のこだわりがない限り、パーティションテーブルはgptにして、gdiskやcgdisk、partedといったコマンドを使うと良いでしょう。必ず最初のパーティションにはEFIパーティション(私は余ったスペースだった240MBくらい)を作ってmkfs.vfatでフォーマットしておきましょう。他にもusrやvarやhomeパーティションを区切るのはお好みで。

make.confは今では/etc/portage/内に移動されています。コンパイラーのフラグはとりあえず

CFLAG="-march=native -O2 -pipe"
CXXFLAGS="${CFLAGS}"
MAKEOPTS="-j5"
に、しました。-march=native以外はドキュメント通りです。

そろそろchrootするために先ほど区切ったパーティションをマウントしたりすると思うのですが、ドキュメントのprocやdevのマウントの他にsysfsやEFIパーティションのマウントもしてください。後のちのgrub-efiインストールに必須です。

# mkdir /mnt/gentoo/boot/efi
# mount -t vfat /dev/sdaX /mnt/gentoo/boot/efi
# mount -t sysfs none /mnt/gentoo/sys

システムprofileの設定は、選択肢内にあるようなgnomeやkdeを使うようでなければ、例えばXfceを使うようであれば、デフォルトのままで構わないと思います。

USEフラグですが、ドキュメントにある通り、これはportageの根幹を成す程に重要で、目玉なオプションです。ノートPC+Xfce+日本語環境を構築するのであれば

USE="bindist mmx sse sse2 jpeg png perl python lua acpi scsi dbus fuse udev udisks upower consolekit policykit session wifi bluetooth usb cdda dvd alsa pulseaudio cairo opengl cjk ibus nls X libnotify startup-notification gtk gtk3 -gnome -kde"
とかじゃないですかね。試行錯誤あるのみです。まぁあとでUSEフラグを弄っても
# emerge --update --deep --newuse world
してなんとでもなるので気楽に行きましょう。

次に、カーネルの構築・インストールです。ドキュメントにある通り、カーネルの設定を自分でいじるか、genkernelで万能なカーネルを作ってもらうかの2通りがあります。私は、自分で設定することをおすすめします。なぜならば、genkernelと比較して明らかにビルドにかかる時間が短いし、一度ビルドさえしてしまえば、後で設定を変更しても再ビルドは一瞬ですから。あ、/bootに忘れずビルドしたカーネルを置いてくださいね。kernel-*とかvmlinuz-*とかリネームして。make installでやってくれますね。見落としていました。

fstabにパーティションを書き込むとき、もしSSDを使っているなら、マウントオプションにdiscardを追加すると良いでしょう。先ほど作ったEFIパーティションは、/boot/efiにマウントされるようにして下さい。あと、パッケージビルドの作業で使われるDISTDIR(デフォルトでは/var/tmp/portage。make.confに書いてあります)はtmpfsでマウントしたほうがよいです。SSDの寿命的に。

tmpfs   /var/tmp/portage tmpfs  nodev,nosuid,size=4g 0 0

ホスト名、ドメイン名の設定をドキュメント通りにやっただけでは、コンソールでのログイン画面でドメイン部に"unknown_domain"と表示されて鬱陶しいです。ですので、もしホスト名が"gentoo"、ドメイン名が"jp"なら、/etc/hostsのループバックアドレスに

127.0.0.1 gentoo.jp gentoo localhost
と書いておくと良いです。

インストール完了後のネットワーク設定ですが、/etc/conf.dに個別に設定する必要はなく、/etc/init.d/net.loからシンボリックリンクを/etc/init.d/net.<ネットワークデバイス名>で貼り、rc-update addすれば、勝手にdhcp接続してくれます。dhcpcdはインストール不要です。

時間設定については、hwclockがlocalなのかutcなのかを確認する以外にも/etc/localtimeで、どの地方時間を使うかも指定する必要があります。これはもし日本に住んでいるなら

# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
としておくと良いでしょう。

さて、いよいよgrubをインストールする段階になったのですが、まずmake.confにどのプラットフォームにインストールしようとしているかオプションを書いておく必要があります。

GRUB_PLATFORMS="efi-32 efi-64 pc"
UEFIブートするほとんどのものはefi-64で良いはずです。ちなみにpcはBIOSブートを指しています。

次にgrubのインストールと、grub.cfgの生成をします。

# emerge -av grub
# mkdir /boot/grub
# grub2-mkconfig -o /boot/grub/grub.cfg
mkconfigした際にFound linux imageの旨のメッセージが出ているなら、いい感じです。最後に
# grub2-install --target="x86_64-efi" /dev/sda
とかして、再起動時にgrubの起動選択画面が出たらインストール完了です。


長ったらしい、可読性の欠片もない文章を書きました。いかがでしたでしょうか。

portageについてですが、常にemergeするときは-avや-pvなどといったオプションをつけて、何のパッケージが何のUSEフラグをオンにしているか、オフにしているかを把握しようとしながらやっていくと、自ずと何をUSEフラグに追加するべきか分かるはずです。USEフラグを変えたら--newuse worldで他のパッケージに適用することを忘れぬよう。

aptitudeやapt-getと違って、パッケージを--unmergeで削除するときには個別に依存関係を読んで自動的にはアンインストールしてくれません。portageでは--depcleanを使って依存関係から孤立したパッケージを片っ端に消すのが流儀みたいです。消されては困るパッケージは--noreplaceで指定するみたいです。

個別にパッケージのUSEフラグを指定したい、パッケージ特有のUSEフラグがある、なんてときには/etc/portage/package.useに書くと良いです。

media-plugins/gst-plugins-meta aac flac lame libass libvisual mp3 ogg vorbis

他にはemergeするときに何か足りないだとか追記する必要があるとかいうメッセージがあったら、こんなふうに

# echo 'sys-firmware/iwl2030-ucode' >> /etc/portage/package.accept_keywords
とかechoで追加して行ったらいいと思います。


Gentooを触り始めて1ヶ月ほどたちますが、portageは本当によくできています。totemを入れるからってgnomeパッケージをぞろぞろ仲間にする必要がないというだけでもう素晴らしい。unzipだってDebianだと自分で文字コードパッチを当ててパッケージ作ってインストールしても、オリジナルとのバージョン重複でガミガミ言われるようなところをGentooではUSEフラグのnatspecを指定すれば良いですし。

ディストリビューション固有のツールだとかもGentooでは他と比較するとあまり多くない気がします。そのおかげであまり混乱せずに済みました。

巷で言われているようなGentooは玄人向け、変態専用などというイメージは全く事実に即していません。個人的にドキュメントのインストールガイドはArchのインストレーションガイドより分かりやすかったです。ソースパッケージビルドだって、FreebsdのPortsのようにコンパイルオプションをyesだかnoだかいちいち選択する必要はなく、全部USEフラグで片付きますから。とても扱いやすいです。パッケージのインストールにかかる時間は、そりゃ重量級パッケージをインストールするときは時間がかかりますが、私のノートの低電力版Core i5のCPUでさえ最低半日もあれば終わります。軽いパッケージは下手したらバイナリパッケージをダウンロードする時間といい勝負をするかもしれません。

ちょっとのひと手間で得られるこの利便性は、何にも代え難いですね。


[追記: 2014/07/21]
zoneinfoのパスを間違えていたので修正しました。

[追記: 2014/08/17]
カーネルのbzImageについての記述を訂正しました。

[追記: 2015/05/02]
localtimeに関する記述を変更しました。