Gentooの最小限のシステムを構築する(BIOS編)
はじめに
Gentoo GNU/Linuxのインストールの手順を書く。(僕にとっての)最小限のシステムを構築する。また、最近はむしろめずらしいのかもしれないが、UEFIではなくBIOSのマシンへのインストールを説明する。UEFIのマシン(最近のWindows 10マシンはだいたいこっちかと)へのインストールについては、別の記事を書く予定。
最小限のシステム(GUIもない)であれば、大きな差はないと思うので、この記事の内容は、KVM上の仮想マシンへのインストールにてテストすることにする。
構成
- 64ビットのx86 CPU
- DHCPでIPアドレスが自動取得できる環境
- GUIはない(あとから入れることはできる)
- シェルはZshとする
- 一般ユーザを作成し、sudoコマンドも導入する
- LVMは使わない
- パーティションも最低限の分割とする
参考
Gentoo AMD64 Handbook: 本家のインストールガイド
インストールCDの作成
以下のページからMinimal Installation CDイメージをダウンロードする。
上記ページの「amd64」のワクの「Boot media」の「Minimal Installation CD」をクリックする。つぎのような名前のファイルがダウンロードされる。
install-amd64-minimal-201XXXXXT214502Z.iso
XXXXXは年月日がはいる。これをCDに焼く。Linuxなら、つぎのようになる。
% cdrecord install-amd64-minimal-201XXXXXT214502Z.iso
焼いたCDをCD-romドライブに挿入し、PCを再起動する。このときBIOSの設定で、ブートメディアをCDにする必要があるかもしれない。CDからブートがうまくいくと、つぎのようなプロンプトが表示される。
BOOT:
15秒以内にエンターキーを押す。システムが立ち上がり、つぎのようなプロンプトが表示される。
livecd ~ #
ネットワークの確認をする。
livecd ~ # ping gentoo.org -c 3
PING gentoo.org (XX.YY.ZZ.WW) 56(84) bytes of data.
64 bytes from www.gentoo.org (XX.YY.ZZ.WW): icmp_seq=1 ttl=47 time=241 ms
.
.
.
3 packets transmitted, ...
3 packets transmittedと出力されれば、ネットワークは問題なくつながっている。DHCPでIPが自動取得されない環境については、この記事の範囲外なので、ほかを当たってほしい。
ディスクの用意
パーティションの作成
ハードディスクを、いくつかのパーティションにわける。コマンドpartedを使う。
# parted /dev/sda
GPTディスクラベルを設定する。
(parted) mklabel gpt
単位をMiBにする。
(parted) unit mib
パーティションの情報を表示する。
(parted) print
Model: ATA ...
Disk /dev/sda: 102400MiB
...
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
まだ、パーティションを作っていないので、パーティションは表示されない。Partition Table: gptというところに注目。GPTディスクラベルの設定はうまくいっている。またDisk /dev/sda: 102400MiBとの表示から、このハードディスクの容量が100GiBであることがわかる。パーティションを作成していこう。つぎの4つのパーティションを作成する。
grub: ブートローダが利用するパーティション
boot: ブート用のファイルが配置されるパーティション
swap: スワップ領域
root: ほかのほとんどのディレクトリが配置されるパーティション
それぞれの大きさの目安は、つぎのようになる。
grub: すごく小さくていい、ここでは2MiBとする
boot: 小さくていい、ここでは1GiB弱とする
swap: 搭載しているメモリの2倍程度が目安、ここでは8GiBほどとする
root: ハードディスクの残り、ここでは99GiBほど
free: ハードディスクの残り、今回はなし
(容量の大きいハードディスクでは、残りをこの名前のパーティションにしておく)
つぎのようなコマンドでパーティションを切っていく。
(parted) mkpart grub 1 3
(parted) set 1 bios_grub on
(parted) mkpart boot 3 1000
(parted) set 2 boot on
(parted) mkpart swap 1000 9000
(parted) mkpart root 9000 -1
(parted) quit
パーティションgrubにはgrubで使用するための印を、パーティションbootにはboot用である印を、それぞれコマンドsetを使ってつける。rootパーティションをつくっているところの-1は、ハードディスクの最後を意味する。
ファイルシステムの作成とマウント
ファイルシステムを作成し、マウントする。まずはスワップ領域から。
# mkswap /dev/sda3
# swapon /dev/sda3
# free -h
total ...
Mem: 4056184 ...
Swap: 7812092 ...
ルートディレクトリ用の領域を作成し、/mnt/gentoo/ディレクトリにマウントする。そのなかに/bootディレクトリを作成すし、ブート用のパーティションをそこにマウントする。
# mkfs.ext4 /dev/sda2
# mkfs.ext4 /dev/sda4
# mount /dev/sda4 /mnt/gentoo
# mkdir /mnt/gentoo/boot
# mount /dev/sda2 /mnt/gentoo/boot
# ls /mnt/gentoo
boot lost+found
# ls /mnt/gentoo/boot
lost+found
基本的なディレクトリツリーを用意する
時刻の設定
まずは日付けと時刻とを合わせておく。
# date
Wed Apr 4 03:57:18 UTC 2018
# rc-service ntp-client start
* Setting clock via the NTP client 'ntpdate'
# date
Wed Apr 4 03:58:45 UTC 2018
ハードウェアクロックも合わせておく。
# hwclock
2018-04-04 03:58:32.994562+0000
# hwclock --systohc
# hwclock
2018-04-04 03:59:17.983487+0000
時刻は今のところ協定世界時で表示される。
stage tarballのダウンロード
カレントディレクトリを/mnt/gentooにする。
# cd /mnt/gentoo
stage tarballをダウンロードする。以下のようなコマンドでミラーサイトのリストを表示する。
# links https://www.gentoo.org/downloads/mirrors/
ダイアログが表示されたらエンターを入力。ページが表示されたら、下矢印でカーソルをJPのところまでもっていき、エンターを入力する。日本のミラーサイトが(現在のところ)ふたつ表示され、それぞれについてhttp, rsync, ftpの3通りのプロトコルを使ったアドレスが表示される。どちらのミラーサイトを選んでも良いと思うが、プロトコルはとりあえずhttpで良いだろう。つぎのように、リンクをたどる。
releases -> amd64 -> autobuilds -> current-stage3-amd64
つぎのような名前のファイルをダウンロードする。
stage3-amd64-201XXXXXT214502Z.tar.xz
'q'キー、エンターキーでlinksをぬける。
# ls
boot lost+found stage3-amd64-201XXXXXT214502Z.tar.xz
解凍してディレクトリやファイルを配置する。
# tar xvJpf stage3-amd64-201XXXXXT214502Z.tar.xz --xattrs
コンパイルオプションを設定する。
# vi /mnt/gentoo/etc/portage/make.conf
...
CFLAGS="-march=native -O2 -pipe"
...
MAKEOPTS="-j2"
とりあえずCFLAGSに-march=nativeを追加し、MAKEOPTS="-j2"を追加する。ここで、-j2の2はCPUのコア数+1くらいが調度いいとされている。
新しいシステムにはいる
ディレクトリ/mnt/gentoo/をルートディレクトリとする新しい環境にはいる。いくつか準備が必要だ。
名前解決用の設定をコピーする
新しいシステムでもWebに接続できるように、名前解決用の設定をコピーする。
# cp -L /etc/resolv.conf /mnt/gentoo/etc/
システムの情報が利用できるようにprocファイルシステムをマウントする。
# mount -t proc proc /mnt/gentoo/proc/
その他のシステムの情報やデバイスを利用するためにディレクトリ/sys/や/dev/をマウントする。それぞれのディレクトリ下のディレクトリも再帰的にマウントしておく(mount --rbind)。また、新たにマウントされた先でのマウントの状態の変化が、もとのマウントポイントに影響しないようにしておく(mount --make-rslave)。
# mount --rbind /sys /mnt/gentoo/sys/
# mount --make-rslave /mnt/gentoo/sys/
# mount --rbind /dev /mnt/gentoo/dev/
# mount --make-rslave /mnt/gentoo/dev/
新しいシステム下にはいる。
# chroot /mnt/gentoo /bin/bash
環境変数をデフォルトに設定する。
# source /etc/profile
chroot下の環境にいることをプロンプトに表示しておく。
# export PS1="(chroot) $PS1"
Portage木の取得
Portage木を取得して、最新のものにアップデートする。
# emerge-webrsync
# emerge --sync
profileを選択する。
# eselect profile list
現在の安定版はdefault/linux/amd64/17.0だ。この記事での主旨にしたがえば、ここはそのままとするべきだ。しかし、ゆくゆくはデスクトップ用に使うことを考えて、profileを変えておく。以下のように選択したいprofileの番号を設定する。
# eselect prorile set 16
ここでは、default/linux/amd64/17.0/desktopが16番なのでset 16とした。
USEフラグの設定
TmuxとVimをインストール
作業を続けるうえで、画面分割ができないのは苦痛だ。また、エディタにはVimが使いたい。ということで、TmuxとVimをここでインストールする。
Tmuxのインストールと画面分割
まずは、Tmuxをインストールする。
emerge -av tmux
フラグ-aはインストールされるパッケージを表示したうえで、それを実行するかどうか、たずねてもらうためのフラグ。フラグ-vはより詳細な出力をもとめるためのフラグだ。
ここでは、パッケージlibeventとtmuxとがインストールされるとのことで、問題ないのでyesを入力しエンターとする。
画面を分割する。まずはコマンドtmuxを入力する。
# tmux
そのうえでCtrl-bを入力してから"(ダブルクオーテーション)を入力する。これで画面が縦ふたつに分割される。画面間の移動はCtrl-bを入力してからo(小文字のオー)だ。
Vimのインストール
まずは、つぎのコマンドを実行する。
# emerge -pv vim
.
.
.
Total: 31 packages (31 new), ...
フラグ-pは実際にインストールはせずに、どのパッケージがインストールされるのかを確認するためのフラグだ。emergeコマンドの結果として31パッケージがインストールされるという。これはパッケージvimが、USEフラグXが有効な状態でインストールされるとき、パッケージXに依存してしまうため、Xに関する多くのパッケージがインストールされてしまうからだ。ここでは、単にVimを使いたいだけなので、USEフラグXを無効にしてインストールしたい。一時的にUSEフラグXを無効にするにはUSE="-X"とする。
# USE="-X" emerge -pv vim
.
.
.
Total: 9 packages (9 new), ...
インストールされるパッケージが9個に減った。また、その9個のなかに、それほど大きいパッケージはないので、これで問題ない。以下のようにしてインストールしても良い。
# USE="-X" emerge -av vim
上記のようにすると一時的にUSEフラグXを無効にしてインストールするが、この記事では、しばらくのあいだUSEフラグXは無効のままにするので、永続的に全体にUSEフラグXの無効を設定してしまおう。
# nano /etc/portage/make.conf
USE="-X"
上記の1行をファイルの最後に追加する。エディタnanoを使用した。このエディタでは保存終了は、つぎのようにする。
Ctrl-x -> y -> Enter
Vimmerとしては正直使いにくい。まあ、nanoを使うのはこれが最後なので良しとしよう。
# emerge -av vim
もうひとつの画面に移動(Ctrl-b -> o)して、つぎのコマンドを実行しておく。
# tail -f /var/log/emerge.log
こうしておくと、インストールの進捗がわかりやすい。
USEフラグを設定
USEフラグを設定する。とくに深い考えはないが、つぎのように設定しておく。
# vi /etc/portage/make.conf
USE="-X vim-syntax unicode git zsh-complition"
タイムゾーンとロケールの設定
タイムゾーンの設定
タイムゾーンをJapanに設定する。
# date
Wed Apr 4 05:45:27 -00 2018
# echo "Japan" > /etc/timezone
# emerge --config sys-libs/timezone-data
Configureing pkg...
* Updating /etc/localtime with /usr/share/zoneinfo/Japan
# date
Wed Apr 4 14:46:08 JST 2018
ロケールの設定
CUIで日本語を表示させるのは、めんどくさいので、ここではロケールはデフォルトのままとするが、後々のためにここで作業しておく。
# vi /etc/locale.gen
# ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8
# ja_JP EUC-JP
上記のようにja_JP.UTF-8 UTF-8の行をコメントアウトする。
# locale-gen
* Generating 1 locales (this might take a while) with 1 jobs
.
.
.
今回は設定しないがロケールを設定するにはeselect localeを使う。
# eselect locale list
Available targets for the LANG variable:
[1] C
[2] POSIX
[3] ja_JP.utf8
[ ] (free form)
もしもロケールをja_JP.utf8としたければ、つぎのようにする。
# eselect locale set 3
カーネルのコンパイルとインストール
pciutilsをインストール
ハードウェアの種類や、必要なドライバを調べるために、パッケージpciutilsをインストールする。
# emerge -av pciutils
ソースコードの取得
カーネルのソースコードを取得し配置する。
# emerge -av gentoo-sources
カーネルの設定
カーネルを設定する。
# cd /usr/src/linux
# make menuconfig
メニュー画面が出るが一度、保存終了しておく。具体的にはメニュー画面が出たところで、つぎのように入力する。
右矢印 -> Enter -> Enter
こうするとファイル.configが作成される。
# ls .config
.config
Ethernetコントローラの種類を調べる。
# lspci -k | grep -A 2 -i ethernet
00:03.0 Ethernet controller: ...
Subsystem: ...
Kernel driver in use: e1000
e1000という名前のカーネルドライバが使われていることがわかる。デフォルトの設定にこれが含まれているかどうか調べる。
# grep -i e1000 .config
CONFIG_E1000=y
CONFIG_E1000E=y
CONFIG_E1000E_HWTS=y
CONFIG_E1000が設定されているので、とくにいじる必要はない。必要なドライバが設定されていなければ、make menuconfigの森のなかから、必要な設定をみつけてオンにする必要があるだろう。
カーネルの設定を読み出せるようにしたい。つぎのように設定する。
# make menuconfig
General setup --->
<*> Kernel .config support
[*] Enable access to .config through /proc/config.gz
Exitして保存するかどうかの質問にyで答える。
ビルドとインストール
ビルドしてインストールする。
# make && make modules_install
# make install
initramfsの作成
パッケージgenkernelのインストール。
# emerge -av genkernel
initramfsの作成。
# genkernel --install initramfs
fstabの作成
パーティションにラベルをつける。ラベルをつけておくことで、わかりやすい名前でパーティションを指定できる。コマンドe2labelを使う。
# e2label /dev/sda2 boot
# e2label /dev/sda4 root
# e2label /dev/sda2
boot
swapパーティションにラベルをつけるにはコマンドmkswapを使う。一度、swapoffしてから作業する。
# swapoff /dev/sda3
# mkswap -L swap /dev/sda3
# swapon LABEL=swap
# free -h
total ...
Mem: 3.9G ...
Swap: 7.5G ...
/etc/fstabを編集する。
# vi /etc/fstab
LABEL=boot /boot ext4 noauto,noatime 1 2
LABEL=root / ext4 noatime 0 1
LABEL=swap none swap sw 0 0
/dev/cdrom /mnt/cdrom auto noauto,ro 0 0
ホスト名などの設定
hostnameを設定する。
# vi /etc/conf.d/hostname
hostname="qiita_minimal"
ドメインを、いちおう、設定しておく。
# vi /etc/conf.d/net
dns_domain_lo="local.hogehoge.jp"
/etc/hostsを編集する。
# vi /etc/hosts
127.0.0.1 localhost qiita_minimal qiita_minimal.local.hogehoge.jp
::1 localhost qiita_minimal qiita_minimal.local.hogehoge.jp
ルートパスワードの設定
ルートパスワードを設定する。再起動したときに、このパスワードでログインするので忘れないように。新しいパスワードを打ち込み、エンターを入力する。確認のためにおなじことを、もう一度する。
# passwd
New password:
Retype new password:
passwd: password updated successfully
システムツールのインストール
ログ管理ツールをインストールする。起動時に立ち上がるようにrc-updateで、登録しておこう。
# emerge -av metalog
# rc-update add metalog default
決まった時間に指定した動作を実行するためのcronデーモンをインストールする。起動時に立ち上がるように設定したうえで、コマンドcrontabを実行しておく。
# emerge -av fcron
# rc-update add fcron default
# crontab /etc/crontab
パッケージmlocatをインストールする。
# emerge -av mlocate
DHCPサーバに問い合わせをするためのDHCPクライアントをインストールする。
# emerge -av dhcpcd
ブートローダのインストールと設定
パッケージgrubをインストールする。
# emerge -av grub
ハードディスクにgrubをインストールする。
# grub-install /dev/sda
起動時の設定ファイルを作成する。
# grub-mkconfig -o /boot/grub/grub.cfg
再起動
tmuxをぬける。
# exit
# exit
chrootをぬける
# exit
本当はすべてumountしてから再起動するほうが、行儀いいのかもしれないが、いきなりhaltしても、だいたい問題ない。
# halt
CD-Rをぬいて、PCを立ち上げる。
再起動後の作業
ログインなど
とりあえずrootとしてログインして、tmuxを立ち上げておく。
qiita_minimal login: root
Password: (rootパスワードを入力)
tmuxを立ち上げるためにはロケールがUTF-8である必要があるようだ。(ここに関連して、上のほうを書き直すこと!!!)
# eselect locale list
Available targets ...
[1] C
[2] POSIX
[3] ja_JP.utf8
[ ] (free form)
# eselect locale set 3
# . /etc/profile
# tmux
一般ユーザの追加とsudoの導入
一般ユーザを追加してパスワードを設定する。
# LANG='C' useradd -m -G users,portage,wheel -s /bin/bash yoshio
# LANG='C' passwd tatsuya
New password:
Retype new password:
passwd: password updated successfully
ログアウトして一般ユーザでログインしなおす。
# exit
# exit
qiita_minimal login: yoshio
Password:
$ tmux
suでrootになり、sudoをインストールする。
$ LANG='C' su
Password: (rootパスワードを入力)
# emerge -av sudo
デフォルトのテディタをvimにする。
# eselect editor list
[1] /bin/nano
[2] /usr/bin/ex
[3] /usr/bin/vi
[ ] (free form)
# eselect editor set 3
# . /etc/profile
visudoでsudoを設定する。
# visudo
%wheel ALL=(ALL) ALL
suをぬけてsudoを試してみる。
# exit
$ sudo echo hoge
(ユーザのパスワードを入力する)
hoge
Zshの導入
パッケージzshをインストールする。
$ sudo emerge -av zsh
/etc/passwdファイルの設定を変更。
$ sudo vipw
yoshio:x:1000:1000::/home/yoshio:/bin/zsh
現在、使用しているアカウントの行をみつけて、bashをzshに変更する。
ログアウトしてログインしなおす。
$ exit
$ exit
qiita_minimal login: yoshio
Password:
するとZshの設定ツールが起動する。1を入力して設定に進む。いくつか設定して、保存終了。
.zshrcの編集
(あとで書く)
tmuxの設定
(あとで書く)
おしまい
CLIのみの最低限の環境を作ることができた。