Macはいいんだが、度々思うことがある。
フルカスタムできるLinuxがほしい。
Archが良いんじゃないか?
32bitに対応してない。
Linuxはどこも64bitのみの配布に切り替わっていくらしい。
よしわかった。Gentooを入れよう(決意)。
ネタバレ:
途中で心折れてとまりました。いつか続きやる
手順としては終わっているので、初めて入れる場合の参考にはなるかもと思い投下。
環境
余ってるマシン
- VAIO Pシリーズ VGN-P90NS
もともとVista入ってたポケットPC。
ポインティングデバイスはトラックポイント。いいゾこれ。
インストール手順
手持ちのマシンが32bitだったため、基本的にこちらの公式wikiの手順どおりにすすめていく。
なお、shellについてはプロンプトを $
としているが、実際はrootユーザで行っているので、あしからず。
インストールディスク用意
iso拾ってくる
Gentooはビルドの段階に Stage
というものがあり、本当にベースから組みたい人は Stage1
からビルドするらしい。
よしわかった。ほとんど揃ってる Stage3
でインストールしよう。(逃げ腰)
USBメモリに焼く
このあたり曖昧なのだが、Vaio type P はUSBからの起動の際、MBR だとうまくいくようす。
このため、ディスクユーティリティからUSBをフォーマットする時、FAT の MBR でフォーマットしている。
母艦がMacなので、漢は黙って dd
$ diskutil list # USBらしきものを確認
# さっき見たN番を入れてアンマウント
$ diskutil unmountDisk /dev/diskN
# ifにはisoのパス、ofはdiskにr付き(RAW)で番号をいれる。
$ dd if=/path/of.iso of=/dev/rdiskN bs=4m
ブート、初期設定
vaioはF2でBIOSが開いた。
USBメモリが優先的に読まれるように変える。
起動
どのカーネルでBootするか聞かれたので、F1で一覧を見せてもらい、
ひとまずgentooを選択。
ここでハードウェア類のオプションなんかをつけられる様子。まずつけないでなんとかしてみる。
この後、起動の最中に一瞬だけキーボード配列を確認されるタイミングがある。
ほっとくと勝手に進んでしまうので、JPと書かれた22番を指定。jisキーボードとして認識される。
※22じゃなくなってる可能性あるので要確認
ただ、できなくても後で設定ができるので、以下の通り編集。
$ vi /etc/conf.d/keymaps # エディタ初心者はnano使ったほうがいいかも
# 以下のように編集して保存
...省略...
keymap="jp106"
...省略...
$ rc-service keymaps restart
ネットワーク設定
プロンプトが立ち上がったので ifconfig
すると、無線LANアダプタが認識されていたので 以下wpa_supplicantでの設定を参照。net-setup アダプタ名
で設定をすすめる。
SSIDを一覧で表示して、旦那様どれになさいます?なんてことはないので、
Macで接続している情報を元に、
SSID、セキュリティの種類、password、を入力して接続。
ping -c 3 google.com
として疎通を確認する。
ただ、 8.8.8.8
は飛ぶが、 google.com
は飛ばない。
原因はipv6だった模様。 ipv6のせいではなかった。
wpa_supplicantで接続するとdhcpまでしっかり行い、ちゃーんとつながってくれた。
wpa_supplicantでの設定についてはArchWikiでかんたんな方法が書いてあるのでこちらでやる
https://wiki.archlinux.jp/index.php/Wpa_supplicant
最近のwifiはだいたいWPA2とかの暗号方式かと思うので、net-setupでは役不足。このあたりはArchwikiのネットワークの設定あたりがわかりやすいので参照のこと。
https://wiki.archlinux.jp/index.php/ワイヤレス設定
追記: DNSが疑われる場合はdhcpcdあたりで dhcpcd <your network interface>
するとDHCPサーバにローカルipやらdnsのipやら教わってきてくれる。
一応、以下は備忘録で残す。
標準でipv6が有効になっていて、ipv4しか対応していない弊家回線では使えなかったらしい。
/etc/sysctl.d/
に以下の内容でファイルを作成、ipv6をdisableしてくる。
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
$ sysctl -p /etc/sysctl.d/disable_ipv6.conf # 設定読み込み
これで
ifconfig
して、inet6
のアドレスが消えていればOK
※余談
最初、なにを思ったか -p
のオブションをQだと空目して、 syscrl: cannot stat /proc/sys//etc/sysctl.d/...
とエラーが出て、パスの設定とかマウントとか色々疑って時間を浪費してしまった。恥ずかしい。
ディスクの準備
http://note.kurodigi.com/gentoo-uefi-install/
↑GPTで進めてみている。パーティション切りもこの方法を真似る
パーティション初期化、設定
ハードディスクがどこにあるか、 df -h
とか parted -l
とかで確認。
追記:
# lsblk # ざっくりディスク名やどのtype(lvmとかdiskとかpartitionとか)とかを表示してくれる
# df -h # 容量みるとき使う
# lvscan # lvmなら
大体、余計なものが刺さってなければ /dev/sdb/
にあるかも。
今回、マザボがUEFI Readyとなっていたので、GPTでインストールしてみる。
以下の作業で元のディスクは読めなくなる。
$ parted /dev/sdb # 今回はsdbだった
(parted) mklabel gpt # YesとかIgnoreしてすすめる。
(parted) print # パーティションテーブルがgptになってるか確認
この後パーティションテーブルを切っていくが、面倒なので以下の設計も参考に。
Gentooをインストールして、XmonadでGUI環境を整える - Qiita
パーティション構成(MiB単位)
- grub: 1 - 3 (2MiB)
- boot: 3 - 131 (128MiB)
- swap: 131 - 16515 (16GiB)
- root: 16515 - -1 (のこり全部)
追記: ちなみに、このあと数台ArchLinuxをインストールした覚えだと、カーネルが複数入ると想定してboot領域はこれだと少々少ない気がする。念の為に200MiBよりはあるとよさそうかなと思う。今使っているArchは余裕もって512MiB取ってる
更にいうとswapについてはメモリが16GBあるマシンとかなら、正直いらないと思って使っていない(今回のVaio Pは2GBなので要るし、このあと16GBではなく2GBで作成し直している)。最悪欲しくなればパーティションではなくswapファイルを作成して使えばいいし、この柔軟性を確保したければswapパーティションをLVMで切るのが安牌なきがする。ここでは切っていないが、最近Linuxマシンをセットアップする際には必ずLVMにしている。インストールの際にはGentooWikiのLVMの項を確認し、カーネルに含めるのをわすれないとよさそう。
LVMだとわりとかんたんにボリュームサイズを変更したり分けたりくっつけたりできるので、よさそう。例としてはこんな感じ↓
https://densan-hoshigumi.com/server/lvm-change-home-root
以下、公式のインストール手順通り進める。
# 単位をMiBに
(parted) unit mib
# GRUB2用のブートローダ領域
(parted) mkpart primary 1 3
(parted) name 1 grub
(parted) set 1 bios_grub on # grub用のフラグを立てる
partedプロンプトで print
すると、grubの領域ができているのが確認できた。
同様にほかも進める。
(parted) mkpart primary 3 131
(parted) name 2 boot
(parted) set 2 boot on # bootフラグ
(parted) mkpart primary 131 16515
(parted) name 3 swap
(parted) mkpart primary 16515 -1
(parted) name 4 rootfs
(parted) print # 確認
(parted) q # quitしておく
ファイルシステムの適用
パーティションを分け終わったのでファイルシステムを適用していく。
fdisk -l
すると、さっき切ったパーティションのパスが見える。
ので、これを参考に、最初にswap領域。
$ mkswap /dev/sdb3
$ swapon /dev/sdb3
$ free -g # 認識されているか確認
その他の領域も適用していく。今回はどちらもext4で。
$ mkfs.ext4 /dev/sdb2 # boot領域
$ mkfs.ext4 /dev/sdb4 # root領域
追記: bootでコケるのもアレなので、bootもFAT32 mkfs.fat -F32 /dev/<yourdevice>
でフォーマットすることが多くなってきた。ほんとに必要かは不明...
パーティションのマウント
rootパーティションを /mnt/gentoo
にマウントする。
$ mount /dev/sdb4 /mnt/gentoo
tarballの展開と準備
stage3 tarballのダウンロード
マウントしたディスクに入る cd /mnt/gentoo/
コマンドラインのブラウザを使い、以下からstage3のtarballを落とす。
$ links https://www.gentoo.org/downloads/mirrors/
JPのミラー配布場所に飛び、 releases/x86/autobuilds/
内に。
とりあえず、i686のbuildを見つけたので、 d
でダウンロード。
終わったら q
でブラウザを終了する。
tarballを展開する
$ tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner
今回落としたファイルは tar.bz2
ではなく tar.xz
だったので、公式のコマンドから修正。
コンパイルオプションの設定
公式「エディタはnanoを使います」
小生「ヤダ。小生viがいい。」
Gentoo最適化のためにPortageパッケージマネージャの設定をしていく。
/etc/portage/make.conf
が設定として使われるので、そこに記入していく。
$ vi /mnt/gentoo/etc/portage/make.conf
(viの使い方は面倒なので、nanoを使うことをおすすめ。)
以下暫定だが、設定をしてみる。
...省略...
COMMON_FLAGS="-O2 -march=native -pipe"
# ↑もともとはmarchはi686だが、native指定で現在のシステムのアーキテクチャを指定してくれるので、一応書き換え。
...省略...
MAKEOPTS="-j2"
# ↑パッケージインストール時の並行実行数。コア数+1がおすすめされているので、2で。
Gentooのベースシステムのインストール
サーバー、リポジトリの設定
ソースを落とす速度を考え、ミラーサーバーを選択しておく。
公式の mirrorselect
コマンドでインタラクティブにえらぶ。
$ mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf
スペースでチェックがつけられるので、jaistのサーバーを選択しておいた。
次に ebuildリポジトリの設定。
# おそらく無いので以下ディレクトリを切って、Portageのリポジトリファイルをコピー
$ mkdir --parents /mnt/gentoo/etc/portage/repos.conf
$ cp /mnt/gentoo/usr/share/portage/config/repos.conf /mnt/gentoo/etc/portage/repos.conf/gentoo.conf
Gentooの環境に入る
の前にDNS情報のコピー
$ cp -L /etc/resolv.conf /mnt/gentoo/etc/
必要になるファイルシステムのマウント。
$ mount -t proc /proc /mnt/gentoo/proc
$ mount --rbind /sys /mnt/gentoo/sys
$ mount --make-rslave /mnt/gentoo/sys
$ mount --rbind /dev /mnt/gentoo/dev
$ mount --make-rslave /mnt/gentoo/dev
これ、公式ではprocを --types
オプションで指定してるんだが、 /etc/fstab
に設定がないよ、とか怒られて、後々うまくいかない。
Gentooのコミュニティとか漁ってたら省略系の -t
オプション使ってるのを目にして、ダメ元でやったらうまくいった。
さて次。chrootしてGentooの環境をrootにして、
profileを読み込んで、プロンプトをちょっと変えておく。
$ chroot /mnt/gentoo /bin/bash
$ source /etc/profile
$ export PS1="(chroot) ${PS1}" # なんでもいいけど、わかるようにだけ。
ここがようやくセーブポイント。
ここからは中断してもルートのパーティションをマウントした後、mkswapとかswaponとか、DNS情報をコピーするあたりから戻れる。
ブートパーティションのマウント
あとでカーネルのビルドと、ブートローダーのインストールでつかう。
$ mount /dev/sdb2 /boot
Portageの設定
パッケージマネージャの設定
リポジトリ関係
ebuildリポジトリのスナップショット(Portageのツリーってことか)をアップデート。
以下のコマンドではrsync(873番ポート)が使えない環境向けに、web(80番ポート)で落としてくるものらしい。
要らないけど一応更新掛けて、少し待つ。
$ emerge-webrsync
プロファイルの設定
$ eselect profile list
上記リストから選択。
とりあえずデスクトップ環境は要らない(時間もかかってしまう)ので、そのままなにもないやつを選択。
(今回は[1]番目の default/linux/x86/17.0 (stable)
を選択)
$ eselect profile set 1
@World
の更新
world setを更新
参考: world setを使おう - 突破してみる?
これでベースシステムの構築ができるらしい。
結構時間食うので、余裕を見て実行されたし。
$ emerge --ask --verbose --update --deep --newuse @world
tmuxとvimのインストール
少しずついつもの環境に近づけていく。
$ emerge -av tmux
$ tmux new -s hogepiyoセッション名
続けてvimも。参考にした先ではデスクトップ環境向けの部分をガン無視して(USEに -X
)ビルドしていたので、真似る。
この処理も少しかかるので待機。
$ USE="-X" emerge -av vim
USEフラグの編集
これ、ちょっと曖昧なのだが、Portageパッケージマネージャでビルドする際にデフォルト使うフラグを、 /etc/portage/make.conf
に USE="hoge -piyo"
などと付けておけるものの様子。
まだどれが必要か、というのがわからないので、ひとまず見ていて必要そうだと思ったもののみ記述してみた。
あと、ローカライズ設定もここからできるらしいのでついでに。
USE="unicode git gzip mp3 ogg wifi networkmanager vim-syntax"
...
LINGUAS="ja"
L10N="ja"
タイムゾーン、ロケール
タイムゾーン、ロケールを日本にする。
ロケールは複数選択できるそうだが、utf-8のロケールを最低1つは入れる必要があるとのこと。
その他は使うとは思えないので、 en_US.UTF-8 UFT-8
のみ選択
なんでjpでないかというと、後でところどころ日本語になったときに、豆腐文字化けして(▪▪▪)悲しいので。
$ ls /usr/share/zoneinfo # Japanがあったので今回はそれ
$ echo "Japan" > /etc/timezone
$ emerge --config sys-libs/timezone-data # 設定を適用
...
# 以下コメントを取った
en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8
$ locale-gen # さっきのファイルに従ってロケールを生成
$ eselect locale list # en_US.utf8の番号を控える
$ eselect locale set 2 # 今回は[2]となっていた
環境をリロードする
$ env-update && source /etc/profile
$ export PS1="(chroot) ${PS1}" # これはプロンプトの識別用に一応。
カーネルのインストール
長い...まだカーネルだ...
ブートローダーまでながい...
カーネルソースをインストール
カーネルのソースをインストールするそうです。
ここもまた、選択のGentooといったところか。
gentoo-sourcesパッケージを使うことが推奨されているので素直に従う。
これまた少々時間がかかる。
$ emerge -av sys-kernel/gentoo-sources
# /usr/src 以下にインストールされていることを確認
$ ls -l /usr/src/linux
さて、この次は2つのアプローチがあるそうだ。
1.カーネルを マニュアル で設定およびビルドする。
2.Linuxカーネルを 自動的 にビルド・インストールするgenkernelを使用する。
おお、自動設定が有るんですか。それではその...
ここ (Gentoo公式Wiki) では、環境を最適化するのに最も適した "マニュアル設定" をデフォルトとして説明します。
おし、やったろみゃーか(血涙)
楽しようとしてgenkernel使ったら、丸1日かけてビルドしたものがコケて心折られたとは言っていない
カーネルをマニュアルでインストール
この Gentoo Install Battle™
に於いて、マニュアルにできるところがあるならば、マニュアルでするしか無いのです。
それがGentooにドハマリした先駆者への礼儀というもの。(なにが)
カーネルのマニュアル設定は難しいと言われるが、幾度かやってみればそんなことはない(Gentoo公式Wiki談)んだそうだ。
そのとき、ハードウェアの構成を知っておくのが大事、とのことで、
lspci
などのツールを以下でまとめてインストールしておく。
$ emerge -av sys-apps/pciutils
menuconfigを実行して、インストールするカーネルをカスタマイズする。
$ cd /usr/src/linux
$ make menuconfig
このあたりはこの記事を参照させていただく。
まず走っているカーネルから設定を入手できるよう設定。一旦saveして終わる。
チェックをつけるには y
General setup --->
<*> Kernel .config support
[*] Enable access to .config through /proc/config.gz
ということでハードをすべて調べ上げるべきなのだが、
まずはネット関係のみ確実に
有線、無線LAN
$ lspci -k | grep -A 2 -i ethernet
Kernel driver in use: sky2
vimを使い、 sky2
を検索
(vimの初期設定だと大文字と小文字の違いを認識してしまうので :set ignorecase
してからの /sky2
)
...
CONFIG_SKY2=y
# CONFIG_SKY2_DEBUG is not set
DEBUGはついていないが、一応SKY2はついているので良しとする。
こんな感じで、探して行くのだが、どうやら .config
の並びと make menuconfig
の並びが一致するようなので、
大まかなデバイスの種類(EthernetとかNetworkとか)がわかれば、あたりをつけて検索できそう。
まず起動したら今度ビルドし直そう。
そして、カーネルのビルドとインストール。
$ make && make modules_install
$ make install
で、インストールまで完了。
genkernelで楽する (できませんでした。)
以下は失敗したものなので、あくまで手順の記録として。
genkernelでは、最初にGentooのインストールディスクをブートした時と同様に、
自動で判断してカーネルを設定してくれる。
選択のGentooの良さをぶち壊すインストール方法だが、他に勉強しなければならないことがあるので、あしからず。
これはこれで結構インストールに時間がかかった。
$ emerge -av sys-kernel/genkernel
としたのだが、どうやらインストールされていない様子。
何故かと思って調べていたら、Portageにupdateが来ており、それをしていなかったからと言うことのようだ。
ご丁寧に IMPORTANT!
と書いていたアップデートを見ていなかった...
調べたフォーラムでは、
IMPORTANT is Important.
という、ありがたいお言葉があったので、肝に銘じることにする。
さて、気を取り直して、公式を参考に etc-update
を行い、再度 genkernel
のインストールを行った。
つぎ、 /etc/fstab
を編集し、 /boot
のマウントポジションを記述しておく。
/dev/sda2 /boot ext2 defaults 0 2
カーネルソースをコンパイルする。
ただし、この方法だと何もかもコンパイルするので、小生の低スペ&シングルコアPCでは膨大な時間がかかった。
$ genkernel all
コケました
ビルドに失敗していたようで、結局手動でやりました。
以下続き。
initramfsのビルド
今回ファイルシステムは分けていないのだが、
勉強のためにブート時のRAMベースのファイルシステムをビルドしてみる。
genkernelのインストールは上記のボツ見出しを参考に...
$ genkernel --install initramfs
おわったと思ったら
...
* WARNING... WARNING... WARNING...
* Additional kernel cmdline arguments that *may* be required to boot properly...
* With support for several ext* filesystems available, it may be needed to
* add "rootfstype=ext3" or "rootfstype=ext4" to the list of boot parameters.
...
最後ちょっと気になる表示があったが、調べてみてもそのままで問題になってる人がいなかったのでスルーしておく。
ファームウェアのインストール
一応、インストール後に無線が使えないことが無いように、大凡の無線に対応するファームウェアを入れておく。
$ emerge -av sys-kernel/linux-firmware
実際、入っていたがビルドが数日前の物だった(このインストール自体かなりかかってやっている)ので、一応更新された。
fstabの設定
パーティションに名前をつけて、簡単に指定できる、というものがあるので、使ってみる。
$ e2label /dev/sdb2 boot
$ e2label /dev/sdb4 root
$ e2label /dev/sdb2 # bootと表示されればOK
swapは swapon
で。swapし直す。
$ swapoff /dev/sdb3
$ mkswap -L swap /dev/sdb3
$ swapon LABEL=swap
fstab ( /etc/fstab
)を書き換える。
LABEL=boot /boot ext4 noauto,noatime 1 2
LABEL=root / ext4 noatime 0 1
LABEL=swap none swap sw 0 0
/etc/conf.d/hostname
にホスト名( hostname
)、 /etc/conf.d/net
にドメイン( dns_domain_lo
)をよしなに。
/etc/hosts
にも同様に上記を設定。
システム用ツール
それぞれ入れて設定をする。
ログ
$ emerge -av metalog
$ rc-update add metalog default #起動時立ち上がるように
cron
/etc/crontab
でcronを使えるように設定しておく。
$ emerge -av fcron
$ rc-update add metalog default
$ crontab /etc/crontab
システム内の検索高速化のため、インデックスを張ってくれる locate コマンド
参考にしていた記事でmlocateパッケージで入れていたのでついでに。
$ emerge -av mlocate
DHCPクライアント
$ emerge -av dhcpcd
あと、公式で推奨しているOpenRCのネットワーク設定スクリプトも。noreplaceオプションも付いているので注意。
$ emerge -avn net-misc/netifrc
grub(ブートローダ)のインストール
ようやく...GRUBまできた...USB起動から開放される...
grubのインストール後、設定ファイルまで生成する。
$ emerge -av grub
$ grub-install /dev/sdb
$ grub-mkconfig -o /boot/grub/grub.cfg
最後に再起動。grubから起動するか...
所感、勉強になったこと
initシステムってなんぞ
もともとGentooではOpenRCというものが使われるらしいが、Portageのプロファイル選択でsystemdを選択することもできる。
このinitはLinuxの機能で、Linuxのランレベルに応じて /etc/init.d/
内のプロセスを実行するというもの。
参考: Linuxシステムのブート
PortageのUSEフラグ
Portageでは、環境ごと要る要らないという要素をUSEフラグで管理しているようで、
環境ごとに、X Window向けのコードが要らない、とかUnicodeほしい、とかのフラグを立てると、ビルド時に自分の好きなようにカスタマイズできる、ということらしい。
さすが、選択のGentooである。
GRUBからの起動、fstabの設定
GRUB自体はすんなりインストールできていて、USBなしで単体のブートはできたものの、
!! Could not find the root block device in UUID= ...
!! ...
と表示されて、起動の途中で止まってしまった。
このままshellが開けたので /etc/fstab
が原因だと思ってviで開いたが
これ、おそらく初回にfstabの設定を中途半端にしていたのが原因で、
今後の展望
- キー配列の変更 (CapsLock ⇔ Ctrl)
参考
ほぼ @YoshikuniJujo さんの記事ばっかりパクって参照してました。大変参考になりました。