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

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

はじめに
-------

Gentoo GNU/Linuxのインストールの手順を書く。(僕にとっての)最小限のシステムを構築する。また、最近はむしろめずらしいのかもしれないが、UEFIではなくBIOSのマシンへのインストールを説明する。UEFIのマシン(最近のWindows 10マシンはだいたいこっちかと)へのインストールについては、別の記事を書く予定。

最小限のシステム(GUIもない)であれば、大きな差はないと思うので、この記事の内容は、KVM上の仮想マシンへのインストールにてテストすることにする。

構成
----

* 64ビットのx86 CPU
* DHCPでIPアドレスが自動取得できる環境
* GUIはない(あとから入れることはできる)
* シェルはZshとする
* 一般ユーザを作成し、sudoコマンドも導入する
* LVMは使わない
* パーティションも最低限の分割とする

参考
----

[Gentoo AMD64 Handbook](https://wiki.gentoo.org/wiki/Handbook:AMD64/ja): 本家のインストールガイド

インストールCDの作成
------------------

以下のページからMinimal Installation CDイメージをダウンロードする。

[Gentoo Linux - Downloads](https://www.gentoo.org/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のみの最低限の環境を作ることができた。