lap-top(iiyamaPC)にArchLinux入れてみた

# 0. 前書き
私事ですが、最近lap-topを持ち運ばなくてはならないことになってしまった。そこでOS入ってないlap-top(iiyamaPC)を購入し、archLinuxをインストールしました。ただし、現在「iiyamaPC」はOSなし構成は選択できないようです。悲しみ、、、

## 構成
ちなみに当方が購入したPC構成は以下のとおりです。

|項目|構成|
|:-:|:-:|
|CPU|intel i3-10100|
|メモリ|ddr4-2666 16GB(8GB*2)|
|GPU|GeForce MX350 2GB|
|ストレージ(メイン)|SSD(PCIe) 256GB|
|ストレージ(サブ)|SSD(sata) 512GB|

そしてこの記事でま目指すシステム構成は以下のとおりです。
>2021/6/10 編集
>ディスプレイマネージャとウインドウマネージャを変更しました。
>機能のわりに軽量な気がするし、テーマがかっこいいから。異論は認める。

|項目|構成|
|:-:|:-:|
|OS|archLinux|
|ブートローダー|GRUB|
|ディスプレイマネージャ|~~LightDM~~  SDDM|
|ウィンドウマネージャ|~~Xfce4~~  KDE|


その他、lap-topなのでセキュリティ関係はしっかりとしたいので、そのへんの構成は以下の感じ。

### ***ストレージの暗号化***

archLinuxに標準搭載の「dm-crypt」を用いて、ストレージを暗号化します。めんどくさいので、メインストレージは「/boot」「/」の2つのみのパーティションにしてます。そのうち「/」のみ暗号化します。起動時にパスワードを入力してマウントできるようにします。サブストレージはユーザースペースディレクトリにマウントできるようにして、復号化には乱数ファイルをメインストレージのどこかに保存します。そうすることによって、自身の個人的なデータはメインストレージのファイルがないと中身が見れないようにします。

### ***ファイヤーウォール***

archLinuxにファイヤーウォールは標準で**有効になっていません**。なので有効化しましょう。一応「iptables」が標準で入っていますが、ルール作成が面倒なのでさくっと設定できるサービスをインストールすることをおすすめします。今回は「firewalld」をインストールします。

### ***ウイルススキャン***

ウイルスファイルをスキャンする機能もarchLinuxには標準搭載***していません***。なのでそれもインストールしましょう。今回は「ClamAV」をインストールします。本来はWindows向けのマルウェア検出ソフトなので、linux系には意味がないと思われるかもしれません。ですが、ローカルネットにWindowsがあるような環境では間接的に感染させてしまうかもしれないので有効です。チームで開発する場合には、自身のセキュリティだけでなく周りのことも気にかけましょう。

### ***ファイル保護***

ファイルの不正な編集やディレクトリへの不正なアクセスを保護する考え方で「任意アクセス制御」「強制アクセス制御」があります。任意アクセス制御は標準で搭載されていますが、強制アクセス制御は導入されていません。~~なので、この記事では「SELinux」をインストールします。~~
この記事では「AppArmor」を使用導入します。「SELinux」は有効化するのがかなり面倒なので今回は見送りです。AppArmorとSELinuxの違いは[ここ](https://wiki.archlinux.jp/index.php/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3#.E5.BC.B7.E5.88.B6.E3.82.A2.E3.82.AF.E3.82.BB.E3.82.B9.E5.88.B6.E5.BE.A1)を参照してください。

とりあえずセキュリティ的にはこんなところ。あとの細かいところはインストール手順で説明します。

# 1. インストール手順

さて、やっと本題です。基本的にはインストール手順は[ここ](https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)に書いてあるのですが、参考までに。また、***linuxにはじめてさわる方はarchlinuxはおすすめしません。おとなしくubuntu等から始めましょう。CLI操作に慣れていないとかなりきついです。***

## インストールディスクの作成

まずはインストールメディアを入手します。[ここ](https://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/latest/)にアクセスし、最新のisoファイルを入手してください。そしてWindowsでは「ブータブルUSB作成ツール」で作成してください。Macやlinuxでは以下のようにコマンドで作成できます。

```
$ sudo dd bs=1M if=path/to/iso of=/dev/sdX
```

sdXの部分には、インストールするUSBを指定してください。

## BIOS設定

まずBIOSの設定画面に入ってください。そして以下の設定項目を探し、パラメータを更新してください。インストールUSBを挿した状態で入っておくとブートデバイスを指定できるので、この時点で挿しておくといいでしょう。

|設定項目|パラメータ|
|:-:|:-:|
|ブート方式|UEFI|
|セキュアブート|無効|
|ブートデバイス|*インストールUSB*|

## 起動

インストールUSBを挿した状態で起動し、archLinuxのブート画面で一番上の選択肢を選択してインストールシェルを起動します。

## CLIでの操作

ここから先はコンソールで設定することになります。インストールシェルでは「Zsh」がデフォルトで有効になっていて、コマンド補完が強力に動作します。なので、長いコマンドなどは最初の数文字打って「Tab」キーを押すと補完されます。便利なので使いましょう。コマンドだけでなく、ディレクトリやファイルも補完してくれるので是非。

### キーボードレイアウトの指定

キーボードのレイアウトを変更します。おそらく日本語の標準キーボードだと思うので、レイアウトに「jp106」を指定。

```shell
$ loadkeys jp106
```

### 起動モードの確認

一応起動方式が「UEFI」であるかを確認するために、以下のコマンドを実行。もしディレクトリが存在しないと表示されたら、「MBR」で起動されていますので、[BIOSの設定](https://qiita.com/takaNS/private/47f52d51447ba5c412f5#bios%E8%A8%AD%E5%AE%9A)を確認してブート方式がUEFIになっているか確認してください。

```shell
$ ls /sys/firmware/efi/efivars
```

### ネットワークへの接続

インストールメディアにはインストールデータは入ってません。いや入ってはいるのですが、そこからコピーするのではなく、ネットワークからインストールします。なのでネットに接続しなければなりません。

#### 有線接続の場合

PCにLANポートがある場合はそこにLANを挿して、以下のコマンドで自分がIPアドレスをもらえているか確認してください。

```shell
$ ip a
```
出力結果のうち、「lo」から始まる段はあまり気にせず。「eth~」か「enp~」から始まる段は有線接続のネットワークインターフェースの出力です。確認すべきは「inet」から始まる行に何かしらのアドレスが表示されていればIPアドレスが取得できています。「wlp~」か「wlan」から始まる段は無線接続のネットワークインターフェースの出力で、内容の見方は無線と同じです。

##### ルーターがDHCPに対応していない場合

もしルーターがDHCPに***対応していない***場合IPが自動でもらえません。なので手動で設定しましょう。[ここ](https://wiki.archlinux.jp/index.php/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9A#.E6.89.8B.E5.8B.95.E3.81.A7.E5.89.B2.E3.82.8A.E5.BD.93.E3.81.A6.E3.82.8B)を参考にしてください。ただしサブネットマスクなどが不明の場合、システム管理者に問い合わせてください。

```shell
$ ip link set eth0 up
$ ip addr add 192.168.1.2/24 broadcast 192.168.1.255 dev eth0
$ ip route add default via 192.168.1.1
```

1行目はネットワークインターフェイス起動しています。「eth0」はネットワークインターフェースを指定しますが、「eth~」か「enp~」で始まることが多いです。上記の「[有線接続の場合](https://qiita.com/takaNS/private/47f52d51447ba5c412f5#%E6%9C%89%E7%B7%9A%E6%8E%A5%E7%B6%9A%E3%81%AE%E5%A0%B4%E5%90%88)」のコマンドを実行して確認してください。

2行目は自分にIPアドレスを指定し、それをローカルネットに通知しています。ちなみにコマンド引数の「192.168.1.2/24」の/より前がIPアドレス、後がサブネットマスクです。IPアドレスはローカルネット上で重複は許されません。なので手動で設定するするときにはちゃんと確認しましょう。サブネットマスクは、同じローカルネットでは一致していないといけません。なのでIPアドレスと同じく確認しましょう。

3行目はデフォルトのゲートウェイを指定しています。グローバルネットに接続するための設定です。

#### 無線接続の場合

archLinuxのインストールメディアには無線接続ためのサービスで「iwd」が入っています。なので[ここ](https://wiki.archlinux.jp/index.php/Iwd#iwctl)を参考に無線LANに接続します。

```shell-session
$ iwctl  #無線設定用シェルを起動
[iwd]# device list  #ワイヤレスデバイス名を確認します
[iwd]# station DEVICE scan  #確認したデバイス名でネットワークをスキャンします
[iwd]# station DEVOCE get-networks  #利用可能なネットワークを確認します
[iwd]# station DEVICE connect SSID  #SSIDを指定してアクセスします。
```

パスフレーズが設定されている場合、パスフレーズを要求されますので、入力します。

##### ルーターがDHCPに対応していない場合

無線接続の場合も有線接続と同様、DHCPが有効になっていない場合、手動でIPアドレスを指定しなくてはなりません。[ここ](https://wiki.archlinux.jp/index.php/Iwd#Setting_static_IP_address_in_network_configuration)を参考に設定していきます。
まずテキストエディタで「/var/lib/iwd/spaceship.psk」を編集します。ここでテキストエディタは「nano」を使います。

```shell
$ nano /var/lib/iwd/spaceship.psk
```

そしてファイルを以下のように編集します。

```/var/lib/iwd/spaceship.psk
[IPv4]
Address=192.168.1.10
Netmask=255.255.255.0
Gateway=192.168.1.1
Broadcast=192.168.1.255
DNS=192.168.1.1
```
もし自身でネットワークを設定していない場合はネットワーク管理者に問い合わせてください。

#### 接続の確認

以下のコマンドで、ネットワークへの接続を確認します。ちゃんとパケットが帰ってきていれば大丈夫。

```shell
$ ping archlinux.jp
```

### システムクロックの更新

システムクロックを正確にしないと、たまにアクセスを拒否される時があります。なので「timedatectl」サービスを使ってシステムクロックを更新します。

```shell
$ timedatectl set-ntp true
```

### パーティションの作成

今回のシステムでは暗号化をする関係上、設定が面倒になるので「tmp」や「var」等のパーティションは設定しません。「swap」すら用意しません。スワップファイルも設定しません。というかメモリ16GBあってサーバーでもないのにスワップあっても、パフォーマンスの向上を見込めないし、SSDの寿命を縮めるだけなのでいらないです。なので以下のような構成になります。

|パーティション|容量|タイプ（タイプコード）|
|:-:|:-:|:-:|
|/dev/nvme0n1p1|256MB|EFI System partition（ef00）|
|/dev/nvme0n1p2|残り全部|dm-crypt（8308）|

まずはメインストレージのパーティションを行います。

```shell
$ gdisk /dev/nvme0n1  #gdiskでnvmeディスクを指定

~~~~ 省略 ~~~~

Command (? for help): o  # 新規のGPTを作成する
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y # 作成して大丈夫？って聞かれてるだけなのでYを入力

Command (? for help): n  #新規パーティション作成
Partition number (1-128, default 1):   #そのままEnter
First sector (~省略~):  #そのままEnter
Last sector (~省略~): +256MB  #サイズを256MBに指定
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): ef00  #パーティションタイプを「EFI system partition」に指定
Changed type of partition to 'EFI system partition'

Command (? for help): n  #新規パーティション作成
Partition number (1-128, default 2):   #そのままEnter
First sector (~省略~):  #そのままEnter
Last sector (~省略~):  #そのままEnter
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 8308  #パーティションタイプを「Linux dm-crypt」に指定
Changed type of partition to 'Linux dm-crypt'

Command (? for help): w  #変更を保存

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!!

Do you want to proceed? (Y/N): Y  #変更保存しちゃって大丈夫？って聞かれてるだけなのでYを入力
```

これでメインストレージはパーティショニングが終了。
次にサブストレージのパーティションを作成します。サブストレージは単一パーティションのみで「/home」にマウントします。パーティションタイプを「dm-crypt」にする以外はデフォルトでOK。

````shell
$ gdisk /dev/sda  #gdiskでsdaディスクを指定

~~~~ 省略 ~~~~

Command (? for help): o  # 新規のGPTを作成する
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y # 作成して大丈夫？って聞かれてるだけなのでYを入力

Command (? for help): n  #新規パーティション作成
Partition number (1-128, default 1):   #そのままEnter
First sector (~省略~):  #そのままEnter
Last sector (~省略~):  #そのままEnter
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 8308  #パーティションタイプを「Linux dm-crypt」に指定
Changed type of partition to 'Linux dm-crypt'

Command (? for help): w  #変更を保存

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!!

Do you want to proceed? (Y/N): Y  #変更保存しちゃって大丈夫？って聞かれてるだけなのでYを入力
````

これでサブストレージもパーティショニング終了。

### メインストレージの暗号化

先ほど作成したパーティションのうち「/dev/nvme0n1p2」をパスフレーズによって暗号化します。サブストレージは後程キーファイルによって暗号化するのでここでは暗号化しません

```shell
$ cryptsetup -v luksFormat /dev/nvme0n1p2

~~~~  省略 ~~~~
Are you sure? (Type 'yes' in capital letters): YES  #諸々了承したら大文字で「yes」と入力
/dev/nvme0n1p2のパスフレーズを入力して下さい:  #パスフレーズを入力してEnter
同じパスフレーズを入力して下さい:  #同じパスフレーズを入力してEnter
~~~~ 省略 ~~~~

$ cryptsetup open /dev/nvme0n1p2 crypt-root  #暗号化デバイスを「crypt-root」として接続
/dev/nvme0n1p2のパスフレーズを入力してください:  #パスフレーズを入力してEnter

~~~~ 省略 ~~~~
```

### メインストレージのフォーマット

メインストレージのフォーマットを行います。フォーマと形式は以下の通り。

|ディスク|フォーマット|
|:-|:-:|
|/dev/nvme0n1p1|FAT32|
|/dev/mapper/crypt-root|ext4|

なお「/dev/nvme0n1p2」を指定してフォーマットしないように注意しましょう。

```shell
$ mkfs.vfat -F32 /dev/nvme0n1p1  #FAT32を指定してフォーマット
$ mkfs.ext4 /dev/mapper/crypt-root  #ext4を指定してフォーマット
```


### メインストレージのマウント

メインストレージをマウントします。

```shell
$ mount /dev/mapper/crypt-root /mnt  #「/mnt」に「/dev/mapper/crypt-root」をマウント
$ mkdir /mnt/boot  #「boot」ディレクトリを作成
$ mount /dev/nvme0n1p1 /mnt/boot  #「/mnt/boot」に「/dev/nvme0n1p1 」をマウント
```


### コアパッケージのインストール

必要最低限のパッケージをインストールします。

```shell
$ pacstrap /mnt base base-devel linux linux-firmware 
```

### fstabの生成

fstabを生成し、自動マウントできるようにします。

```shell
$ genfstab -U /mnt >> /mnt/etc/fstab
```

### chroot

新しくインストールした環境に仮想的にログインします。

```shell
$ arch-chroot /mnt
```

### PGP鍵の取得

PGPを取得します。

```shell
$ pacman-key --populate archlinux
$ pacman-key --init
```

### タイムゾーン

タイムゾーンを日本に設定します。

```shell
$ ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ hwclock --systohc
```
### ロケールの設定

/etc/locale.gen を編集して、「en_US.UTF-8 UTF-8」と「ja_JP.UTF-8 UTF-8」をアンコメント(行頭の#を消去)します。そして以下のコマンドを実行。

```shell
$ locale-gen  #ロケールの生成
$ echo 'LANG=en_US.UTF-8' > /etc/locale.conf  #ロケールの設定
$ echo 'KEYMAP=jp106' > /etc/vconsole.conf  #仮想コンソールのキーボードマップ設定永続化
```
### rootパスワードの変更

rootパスワードがない状態は非常に危険なので、変更しましょう。

```shell
$ passwd
新しいパスワードを入力してください:  #設定したいパスワードを入力してEnter
新しいパスワードを再入力してください:  #もう一度パスワードを入力してEnter
```

### ブートローダーの設定

さてここからブートローダーの設定をしていきます。

#### GRUBのインストール 

まずはブートローダー関係のパッケージをインストールします。今回の環境では「GRUB」を導入します。「UEFI」方式のブートに対応していて、カーネルパラメータが設定しやすい。（気がする）またGEUBでUEFIブートに必要なパッケージとして「EFI boot manager」もインストールします。

```shell
$ pacman -S grub efibootmgr
```
#### マイクロコードのインストール
マイクロコードをインストールします。マイクロコードとは、CPUのファームウェアのようなもので、これを入れておかないとシステムが不安定になる場合があるらしい。

##### インテル系のCPUの場合

```shell
$ pacman -S intel-ucode
```

##### AMD系CPUの場合

```shell
$ pacman -S amd-ucode
```

#### mkinitcpioの設定

デバイスの暗号化をしているため、起動時にパスコードを要求できるようにします。これをしないとブートできても暗号化が解除できないので使えるようになりません。  
[ここ](https://wiki.archlinux.jp/index.php/Dm-crypt/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E5%AE%9A)を参考に、まず「/etc/mkinitcpio.conf」を編集します。「keyboard」「keymap」「encrypt」を追加しています。ちなみに記述した順番に読み込まれるので、この順番に記述してください。

``` /etc/mkinitcpio.conf
~~~~ 省略 ~~~~

HOOKS="base udev autodetect keyboard keymap consolefont modconf block encrypt lvm2 filesystems fsck"

~~~~ 省略 ~~~~
```

編集したのち、以下のコマンドを実行してmkinitcpioを再生成します。

````shell
$ mkinitcpio -p linux
````

#### GRUBカーネルパラメータの編集

起動時にどのデバイスの暗号化を解除させるかを指定し、mapperを命名します。「/etc/default/grub」を編集し、以下のようなカーネルパラメータを指定してください。

``` /etc/default/grub

~~~~ 省略 ~~~~

GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet cryptdevice=/dev/nvme0n1p2:crypt-root root=/dev/mapper/crypt-root"

~~~~ 省略 ~~~~
```

#### ブートローダーのインストール

次にブートローダーをインストールし、設定ファイルを生成します。

```shell
$ grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --boot-directory=/boot --debug
$ grub-mkconfig -o /boot/grub/grub.cfg
```

#### 暗号化デバイスの自動マウント設定

暗号化したディスクを起動時に自動マウントするために、「/etc/crypttab」を編集します。

```/etc/crypttab

~~~~ 省略 ~~~~
crypt-root /dev/nvme0n1p2 none luks,timeout=180
```

#### その他パッケージのインストールと設定

ここからは最低限動かすのに必要（であろうものも含めて）なパッケージをインストール。

- NetworkManager・・・ネットワーク設定ツール。有線接続も無線接続もちゃんとできて、VPNなどのプラグインもあるので結構便利。
- firewalld・・・ファイヤーウォール。
- nano・・・コンソールテキストエディタ。初心者に比較的優しい。
- gdisk・・・GPT用のディスクパーティション作成ツール。

```shell
$ pacman -S networkmanager firewalld nano gdisk
``` 

インストールしたのち、起動時に有効化するようにします。

```shell
$ systemctl enable NetworkManager
$ systemctl enable firewalld
```

###再起動

再起動して、ブートが完了するか確認してください。

```shell
$ exit  #arch-chrootから脱出
$ umount -R /mnt  #ディスクをアンマウント
$ reboot  #再起動する。
```

再起動時にインストールUSBを外し、BIOS画面に移行し、起動ディスクをインストールしたメディアに設定。

ここまででいったん記事は終わります。GUI導入からはまた後日書きたいと思います。