Arch Linux インストール (4)

インストールしたシステム内に入る
今までは、メモリ上に起動した Linux システム上でコマンドなどを実行してきましたが、ここからは、インストールした Arch Linux システム内に入って、設定を行っていきます。
arch-chroot
以下のコマンドで、Linux のルートを切り替えて、インストール先の Arch Linux へと移ります。

# arch-chroot /mnt

arch-chroot は、Arch Linux インストール用のスクリプトです。
指定したパスがルート "/" になるようにマウントします。

これ以降は、例えば、"/etc/fstab" とパスを指定したら、実際には "/mnt/etc/fstab" のファイルを扱うのと同じになります。

もし、この状態を抜けて、元のインストール作業用の Linux に戻りたい場合は、exit コマンドを実行します。
その後作業をして、再びルートを変更したい場合は、再度 arch-chroot を実行してください。
注意点
ここから先、実行するコマンドは、実際にインストールした Arch Linux 上にあるコマンドが使われます。
そのため、ルートを切り替えた後は、インストールメディア内にあるコマンドは使えないので、注意してください。

ただし、ネットの接続は継続されているので、パッケージのインストールは行えます。
パッケージのインストール
途中で、追加で必要になるパッケージがあった場合は、pacman コマンドでインストールしてください。
-S オプションで、指定パッケージをインストールします。

## パッケージのインストール
# pacman -S <package...>

## パッケージの検索
# pacman -Ss <name>
テキストの編集
テキストファイルの編集を行う必要がある場合、nano コマンドなど、インストール先の Arch Linux にインストールされているテキストエディタを使ってください。

pacstrap 時に、テキストエディタをインストールしていなかった場合は、# pacman -S nano でインストールしてください。
タイムゾーン
時刻を、各地域ごとの時間に合わせるために、タイムゾーンを設定します。

日本の場合は、東京に合わせるので、以下のようになります。
成功した場合は、何も表示されません。

# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ln コマンドで、/etc/localtime にシンボリックリンクを作成し、/usr/share/zoneinfo/Asia/Tokyo にリンクさせています。

Linux は、/etc/localtime のファイルを読み込んで、タイムゾーンを設定します。

各地域ごとの設定ファイル (バイナリファイル) は、/usr/share/zoneinfo ディレクトリ以下にあります。
ここから任意のファイルを選びます。

この設定により、/etc/localtime のシンボリックリンクにアクセスすると、/usr/share/zoneinfo/Asia/Tokyo にアクセスするのと同じことになります。

-sf は、-s-f オプションを同時に指定しています。
-s は、シンボリックリンクを作成します。
-f は、すでに対象のファイルが存在する場合、削除します。
ハードウェアクロック
現在の時間を、ハードウェア (マザーボード内の内部時計) に書き込みます。
※すでに正しく書き込まれているのがわかっている場合は、実行しなくても構いません。

ネットを接続した後に、timedatectl で時刻合わせを行いましたが、あれは、インストール作業用の Linux システム上における、OS 上の時刻を設定したに過ぎません。
再起動すると、その時刻は破棄されて、再びマザーボードの内部時計から時刻が読み込まれてしまいます。

再起動しても時刻が正しくなるように、現在の Linux 上での時刻を、マザーボードの内部時計に書き込みます。
書き込みには、hwclock コマンドを使います。

# hwclock --systohc --utc

-w, --systohc で、Linux 上での時刻を、ハードウェアに書き込みます。
-u, --utc で、時刻に UTC (協定世界時) を使います。

Windows の場合、UTC ではなく地域ごとのローカルタイムを使うので、Windows と Linux をデュアルブートする場合は、時刻が狂います。
Windows で UTC を使うためには、手順が必要なので、以下を参照してください。

# 時刻 - ArchWiki
ロケール
# ロケール - ArchWiki

Linux 上で使用する言語を設定します。
日本の場合は ja_JP (日本語) を使いますが、デフォルトとして en_US (英語) も必須となるので、それも指定します。
locale.gen 編集
まずは、/etc/locale.gen ファイルを編集し、使う言語の、先頭の # を削除して、使用する言語を複数選択します。

$ nano /etc/locale.gen

言語名のアルファベット順に並んでいるので、まずは 「#en_US.UTF-8 UTF-8」 の行を探します。
見つけたら、その行の先頭の # を削除します。

次に、「#ja_JP.UTF-8 UTF-8」 を見つけて、同じように # を削除します。

結果的には、行頭が # のコメント行を除いて、以下のようになっていれば OK です。

en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8

日本語では、他に 「ja_JP.EUC-JP EUC-JP」 がありますが、そちらは文字コードに EUC-JP を使います。
今は UTF-8 を使うのが一般的なので、そちらを使います。

終わったら、Ctrl+XyEnter で、上書き保存します。
locale-gen
次に、/etc/locale.gen の内容を元に、locale-gen コマンドで、各言語のロケールを生成します。

# locale-gen

Generating locales...
  es_US.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.

各ロケールが生成されたのがわかります。
locale.conf
次に、/etc/locale.conf ファイルを作成して、デフォルトのロケールを指定します。

nano コマンドを使ってもいいのですが、下のコマンドで、ファイルの作成と書き込みを行うことができます。

# echo LANG=en_US.UTF-8 > /etc/locale.conf

echo コマンドで、「LANG=en_US.UTF-8」 を標準出力に出力し、「>」 で、出力された内容を指定ファイル (/etc/locale.conf) に新規作成して書き込みます。

結果的に、/etc/locale.conf の中身が以下のようになっていれば問題ありません。

LANG=en_US.UTF-8

※現段階ではまだ、ロケールを日本語にしないでください。

日本語について
純粋なコンソール画面上では、ビットマップフォントを使って文字を表示しています。

コンソールで使われるビットマップフォントは、以下のディレクトリにあります。
/usr/share/kbd/consolefonts

ここには日本語用のフォントがないので、通常のコンソール画面では日本語は表示できません。

そのため、この段階でロケールを日本語にしてしまうと、出力された日本語の文字列が文字化けしてしまい、読めないので、コンソール環境上では、常に英語で作業をしていく必要があります。

実際にロケールを日本語にするのは、GUI 環境を構築した後です。
キーマップ
インストール先の Arch Linux 上での、コンソール環境におけるキーボード配列は、デフォルトで英語用のままになっているので、設定ファイルで、キーボード配列を指定します。

# echo KEYMAP=jp106 > /etc/vconsole.conf

/etc/vconsole.conf ファイルに、「KEYMAP=jp106」 の内容を書き込みます。
これで、起動時に毎回 jp106 の配列が使われることになります。

※ GUI 環境においては、別途キーボード設定が必要になります。ここでは、純粋なコンソール画面におけるキーボード配列の設定です。
ホスト名
自分のパソコンのホスト名 (ネットワーク上で各マシンを識別するための名前) を決めて、設定します。

基本的に自分のネットワークでしか使わないので、名前は適当で構いません。
今回の場合は、仮に arch とします。

/etc/hostname ファイルに、テキストでホスト名だけを記述してください。

# echo arch > /etc/hostname
ネットワーク設定
現在のインストール作業の Linux 上においては、ネットワークに接続された状態になっていますが、インストール先の Arch Linux 上では、まだネットワークの設定を行っていないので、別途設定する必要があります。

ネットワークの接続には、複数の方法があるため、自分で好きなものを選ぶことができます。
それぞれの方法で、必要なパッケージや設定が異なるので、以下のページを参考にしてください。

>> ネットワーク設定

現在では、systemd-networkd, systemd-resolved, (無線 LAN) iwd を使うのが一般的だと思いますが、netctl を使うと、あまり複雑なことを考えずに設定できます。
ここでは、主に、systemd-networkd を使う前提で説明していきます。
設定について
現在のインストール作業用の Linux 上では、すでにネットワークに接続されている状態なので、ここでは、次回起動時にネットワークに接続できるようにするための設定を行います。

基本的には、# systemctl enable <name> で、各サービスを有効にして、必要な設定ファイルを用意したりします。

ただし、iwd での接続や、systemd-resolved のリンクファイル生成など、実際にインストールした Arch Linux を起動してから設定したほうが良い場合があります。

そのような処理が必要な場合、ここで設定しなくても、実際に Arch Linux を起動してから接続することもできますが、接続で必要になるパッケージだけは、必ずここでインストールしておいてください。
特に、無線 LAN で接続する場合は、iwdwpa_supplicant が必ず必要になります。

インストール先の Arch Linux に、ネットの接続に必要なパッケージがなければ、もちろんネット接続もできませんし、パッケージのインストールもできないので、再度インストール環境に戻ってくる必要があります。
systemd-networkd
systemd に含まれる、systemd-networkd のネットワーク接続サービスを使うと、有線/無線 LAN ともに管理でき、設定ファイルで細かい設定もできます。

なお、DNS を管理するために、基本的に systemd-resolved も必要になります。

この2つのサービスを、起動時に有効になるようにします。

# systemctl enable systemd-networkd systemd-resolved

ネットワーク設定ファイル
サービスを有効にしただけでは接続されないので、各ネットワークごとに、テキストファイルを生成し、設定する必要があります。

/etc/systemd/network/ に *.network ファイルを作成してください。
ファイル名は任意の名前で構いません。複数ファイルがある場合は、ファイル名順に読み込まれます。

有線 LAN の場合
[Match]
Name=<インターフェイス名>
[Network]
DHCP=yes

Name= に、# ip link で確認した、有線 LAN のインターフェイス名を指定してください。
有線 LAN のインターフェイス名は、enp から始まります。

DHCP=yes で、IPv4/IPv6 ともに、DHCP を使って、IP アドレスを取得します。

無線 LAN の場合
[Match]
Name=wlan0

[Network]
DHCP=yes
IPv6PrivacyExtensions=true
IgnoreCarrierLoss=3s

「IPv6PrivacyExtensions=true」は、IPv6 の IP アドレスを、プライバシー拡張の機能を使って取得します。
デフォルトのままだと、IPv6 の IP アドレスには、無線 LAN インターフェイスの MAC アドレスが含まれる形になり、セキュリティ的に懸念があるので、拡張機能を有効にして、別の IP アドレスを生成します。

「IgnoreCarrierLoss=3s」は、接続が失われた時、指定時間の間に回復すれば、構成を維持します。

※無線 LAN で接続する場合、別途 iwd か wpa_supplicant を使って、無線接続を行う必要があります。

ここでは、iwd を使うことにするので、iwd パッケージをインストール後、起動時に有効になるようにします。

# pacman -S iwd

# systemctl enable iwd

実際に起動時に接続させるためには、さらに iwctl で接続を行って、/var/lib/iwd/ に設定ファイルを生成させる必要がありますが、インストール作業用の Linux 上で無線 LAN 接続している場合、すでに systemd-networkd + iwd で接続されている状態なので、iwctl での接続は、インストール先の Arch Linux を起動した後で行う方が良いでしょう。
systemd-resolved について
systemd-resolved は、DNS を管理するサービスです。
DNS サーバは、ドメイン名から IP アドレスを取得するためのもので、ネット接続においては重要な役割を持ちます。
これが正しく設定されていないと、WEB ページなどが表示できません。

DNS サーバの IP アドレスは、/etc/resolv.conf に記述する必要がありますが、systemd-resolved を使う場合、このファイルは自動で生成されません。
代わりに、/run/systemd/resolve/ にあるファイルをリンクする必要があります。

# ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

※ただし、Arch Linux インストール中 (arch-chroot 後) にこれを実行した場合、実際には、インストール先の /etc/resolv.conf にリンクを作成することはできないので、この段階では実行しないでください。

というのも、arch-chroot のスクリプト内容 を見ればわかりますが、この中で、インストール作業 Linux 上における /etc/resolv.conf のリンク先が、/mnt/etc/resolv.conf としてバインドマウント(特定のファイルを別のパスにマウント)されるような形になっています。

つまり、arch-chroot 後に /etc/resolv.conf のパスを使った場合、実質的なパスは /mnt/etc/resolv.conf となりますが、それがバインドマウントされているので、結果として、インストール作業 Linux のメモリ上にある /etc/resolv.conf のリンク先となります。

インストール作業上の Linux で、DNS サーバの設定を継続させるために、インストール作業上で使われている /etc/resolv.conf が必要になるので、このような形になっています。

リンクを正しく作成したい場合、一度 arch-chroot を抜けてから作成することもできますが、インストール先の Arch Linux を起動した後で作成すれば問題ないので、後で実行します。
パスワード設定
root (管理者権限) のパスワードを設定します。

# passwd

New password でパスワードの入力を求められるので、入力して Enter を押します。
次に、Retype new password で、確認のために再入力を求められるので、同じ文字を入力します。
パスワードが2つとも同じなら、設定に成功します。

Linux のコマンドライン上では、基本的にパスワードの入力文字は、一切表示されません。
入力しても何も表示されませんが、内部ではちゃんと処理されているので、問題ありません。
入力を間違えたかもしれないという時は、複数回 BackSpace キーで文字を削除するか、Ctrl+U でカーソルより前の文字を削除できます。
マイクロコード
先にマイクロコードの説明をしておきます。

# マイクロコード - ArchWiki

「マイクロコード」は、CPU のファームウェアです。
脆弱性の対応など、CPU 動作に関する修正があった時に更新されます。

Arch Linux には、Intel/AMD CPU 用のパッケージがあるので、使用している CPU に合わせて、マイクロコードは常に更新しておいた方が良いでしょう。

メーカーパッケージ名ファイル名
Intelintel-ucode/boot/intel-ucode.img
AMDamd-ucode/boot/amd-ucode.img

パッケージをインストールすると、/boot にイメージファイルがインストールされます。

2024/03/04 現在 (mkinitcpio v38)、これからのパッケージがインストールされていれば、initramfs の生成時 (カーネルなどが更新された場合、自動で生成される) に、デフォルトでこのマイクロコードが埋め込まれて、起動時に実行されるので、とりあえず、上記のパッケージだけインストールしておけば問題ありません。

マイクロコードが新しくインストールされたり、アップデートされた場合は、自動で initramfs の生成が行われます。

以前は、ブートローダーにて、マイクロコード用の設定を行う必要がありましたが、現在は不要です。
ブートローダー
# ブートローダー

OS を起動するための、ブートローダーの設定を行います。

Linux で使えるブートローダーにはいくつか種類があり、好きなものを使うことができますが、「BIOS/UEFI」「MBR/GPT」「ファイルシステム」など、ブートローダーによって対応しているものが異なるので、自分の環境に合わせて選んでください。

ここでは GRUB を紹介していますが、UEFI でシンプルなブートローダを使いたいなら、systemd-boot でも良いでしょう。

他のブートローダについては、ブートローダ で解説しています。
GRUB について
# GRUB - ArchWiki

GRUB は、BIOS/UEFI 両方に対応している、一番多機能なブートローダーです。

BIOS/UEFI や MBR/GPT によって設定方法が異なるため、それぞれで GRUB の設定方法を解説しています。
エラーなどが出た場合は、上記のページに対策が書かれているので、参考にしてください。
GRUB (UEFI-GPT 64bit の場合)
## インストール
# pacman -S grub efibootmgr

GRUB のファイルをインストール
ブートするために必要なファイルを、インストールします。

# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub

成功した場合、エラーがない旨のメッセージが出ます。
/boot/grub 以下に GRUB のファイル、/boot/EFI/arch_grub に EFI ブートファイルが作成されます。

--targetx86_64-efi で、UEFI (64bit) 用のファイルを作成します。
--efi-directoryEFI システムパーティションをマウントしたディレクトリを指定します。
ファイルをインストールする場所になります。

今回の場合、EFI システムパーティションは /dev/sda1 で、fstab ファイルによって、/dev/sda1 を /boot にマウントするように設定してあるので、/boot となります。
--bootloader-id作成するブートローダー名を、任意の名前で指定します。

/boot/EFI ディレクトリ内に、指定した名前のディレクトリが作成され、その中に、GRUB 用の EFI ブートファイル grubx64.efi が作成されます。

同じディスクに複数の OS をインストールする場合、各 OS のブートローダーごとに /boot/EFI 内にディレクトリが作成されることになるので、他の OS と重複しないように名前を付けてください。

今回の場合は、Arch Linux 用の GRUB なので、arch_grub としました。

.efi のコピー
UEFI のファームウェアによっては、/boot/EFI/boot 内に bootx64.efi という名前で、デフォルトの efi ファイルが必要な場合があります。

そのため、一応 GRUB 用の *.efi ファイルをコピーして、作成しておきます。

# mkdir /boot/EFI/boot
# cp /boot/EFI/arch_grub/grubx64.efi /boot/EFI/boot/bootx64.efi
               ~~~~~~~~~

arch_grub の部分は、--bootloader-id で指定した名前に置き換えてください。

日本語対応
現在の GRUB には、日本語のビットマップフォントが含まれているので、メニュー画面で日本語を表示することができます。
日本語にするためには、現在の Linux の言語設定を日本語にする必要があるので、grub.cfg を生成する前に、LANG 環境変数を設定して、日本語にしておくと良いです。
英語に戻す場合は、en_US.UTF-8 に設定してください。

# export LANG=ja_JP.UTF-8

grub.cfg の生成
起動情報などが書かれた設定ファイルを、自動で生成します。

# grub-mkconfig -o /boot/grub/grub.cfg

grub-mkconfig コマンドを使うと、現在の Linux システム(今回の場合、新規インストールした Arch Linux)については、自動で設定を書き込んでくれるので、通常はそのファイルをそのまま使えば問題ありません。

ただし、他に起動したい OS がある場合や、起動設定を変えたい場合などは、手動で編集する必要があります。
GRUB (BIOS-MBR の場合)
パッケージのインストール
BIOS の場合、os-prober パッケージをインストールしておくと、grub-mkconfig 実行時に、他のパーティションにインストールされている OS を自動で検出して設定してくれます。
複数の OS をインストールしている場合は、これを使うと便利です。

# pacman -S grub

インストール
BIOS の場合は、ディスクの MBR ブートコード領域にインストールします。

書き込み対象のディスクを指定する必要があるので、以下のコマンドの /dev/sda は自分の環境のデバイス名に置き換えください。
※この時、/dev/sda1 のように、パーティションを指定しないでください。ディスク自体の MBR 領域に対して書き込みを行います。

# grub-install --target=i386-pc /dev/sda
                                     ~~~
# grub-mkconfig -o /boot/grub/grub.cfg

UEFI の場合と同じように、ブート用ファイルのインストールと、設定ファイルの生成を行います。

--targeti386-pc なので、32bit OS 用のような印象を受けますが、64bit の場合でも同じなので、気にしなくて構いません。
再起動
これで、インストール先の Arch Linux を起動させる準備ができました。

この段階で、インストールメディアは必要なくなります。
以降は、実際にインストールした Arch Linux を起動して、細かい設定を行っていきます。

# exit
# umount -R /mnt
# reboot

exit コマンドでログアウトして、インストールメディアの環境に戻ります。
umount コマンドで、マウントしたパーティションをすべてアンマウントして、Linux から切り離します。
reboot コマンドを実行すると、再起動が行われます。

再起動したら、インストールメディアを取り外します。

起動に問題がなければ、ブートローダのメニューが出て、OS 選択になるので、Arch Linux を選択して Enter を押してください。

Arch Linux が起動すると、コンソール画面になり、ログインが求められます。

起動後、しばらくしてもなかなか次の画面に移らない場合は、ネット接続に時間が掛かっているか、接続に失敗して、タイムアウト時間まで待っている可能性があります。
デフォルトでは、90 秒待てば次の画面に移ります。

この段階では、まだ GUI 環境を何もインストールしていないので、引き続き、コマンドライン上で作業をしていきます。

>> インストール (5)