Posted at

Gentooの最小限のシステムを構築する(BIOS編)

More than 1 year has passed since last update.


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イメージをダウンロードする。

Gentoo Linux - Downloads

上記ページの「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のみの最低限の環境を作ることができた。