Arch Linux 快適デスクトップ環境の構築 2019 

# 前置き
今回のコンセプトは Mini-ITX の小型機に Ryzen 7 2700X を積む、だ。
( Ryzen 3000 は待てなかった…）
具体的な構成とお値段は以下。いずれも2019年5月時点。

| 分類 | 部品名 | 価格 |
|:--|:--|--:|
| ケース | Metis Plus | 5,378 |
| CPU | AMD Ryzen 7 2700X BOX (※M/B とセット価格） | ※40,581 |
| M/B |GIGABYTE B450 I AORUS PRO WIFI | - |
| メモリ | Patriot PSD432G2666KH (288Pin/DDR4-2666/16GBx2)| 18,981 |
| SSD | WD M.2-2280 / 500GB / WD Blue 3D / SATA3.0 | 6,980 |
| 電源 | CORSAIR SFX600 Platinum | 16,020 |
| CPUファン | 虎徹 MarkⅡ(SCKTT-2000) | 3,132 |
| 追加ケースファン | サイズ Kaze Flex 120 PWM | 989 |
| グラボ | Palit NE5105T018G1-1070F(GTX1050Ti 4G GDR5 STORMX) | 14,601 |

上記とアイネックス ナノダイヤモンドグリス JP-DX1（1,225円）を合わせて、都合 108,556 円。

上記を組み立てインストールの儀式へと入っていった。

以降、Arch Wiki を参照しながら進めていくが、リンクは（原典な気がするので）英語版を基本的に用い、日本語版にしかないコンテンツであればそちらを貼ることとした。
英語版でもサイドペインの「日本語」リンクをクリックすればすぐに日本語版記事に飛べるので、適宜そちらも参照するとよい。

# OS インストール
基本は[公式インストールガイド](https://wiki.archlinux.org/index.php/Installation_guide)に従う。

## インストールの準備
### 署名の検証
これは旧 Arch 機から行なった。
今回は `archlinux-2019.05.02-x86_64.iso` を用いたが、バージョンはその時最新のものを指定しよう。

```
$ wget http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/2019.05.02/archlinux-2019.05.02-x86_64.iso
$ wget http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/2019.05.02/archlinux-2019.05.02-x86_64.iso.sig
$ sudo pacman-key -v archlinux-2019.05.02-x86_64.iso.sig
```

今回は CD-R が余っていたので、[Brasero](https://ja.wikipedia.org/wiki/Brasero) により ISO イメージを焼いた。
[前回](https://qiita.com/xorphitus/items/3711895eb5d9f946c782) USB メモリを使って失敗した形跡があるので、CD はまあ無難な選択かもしれない、

### ライブ環境の起動

新マシンで上記 CD からライブ環境を起動する。

### キーボードレイアウト
公式ガイドでは日本語に変更する方法が書いてあるが、自分は英語のままでよいので何もせず。

### 起動モードの確認
今回のマシンは BIOS ではなく UEFI である。
以下のディレクトリが存在しその中身があれば UEFI なので、念のためこれで UEFI であることを確定させておこう。

```
# ls /sys/firmware/efi/efivars
```

### パーティション
ディスクは 1 つしか積んでいない、デュアルブートの予定もなし、という前提のもとでポイントは 3 つ。

1. UEFI なので EFI パーティションを作成する必要がある
1. 上記以外はパーティションを分けない
1. LVM を用いる

パーティションについては、UEFI なので `/boot` を 512MB FAT32 で切る。
それ以外についてだが、まず swap は swap ファイルを使うので不要。
`/` と `/home` を分離してリカバリを容易にする作戦もあるが、`/home` の重要なものはクラウドサービスや自宅 NAS に逃がせば個人的に十分なので、再インストールは痛手ではない。
（ちなみに [HDD であれば `/home` を切ることで速くなる](https://wiki.archlinux.org/index.php/Improving_performance#Layout_on_HDDs)ようだが、今回のマシンは SSD である）
また `/var` の増加によるディスク食い潰しも起きるとも思えないので、パーティションは切らずに広くディスクを使える方が利が大きい。
この辺は人それぞれのポリシーがあると思うので、各々の判断で実施してもらいたい。

LVM については、以前のマシンでディスク容量不足に陥いった時に、SSD 追加で簡単に容量の拡張ができて助かった経験があるため今回も採用した。
マシン特性的にこれ以上 SSD を積みたくないのが本音だし、その手の作業が発生しないよう自分の用途に対して十分な容量にしたつもりだが、まあお守りだ。

なおファイルシステムの選定だが、SSD のパフォーマンス劣化防止のため [SSD Trim](https://wiki.archlinux.org/index.php/Solid_state_drive#TRIM) を有効にすることと、swap ファイルを使うことを考えると、現時点では選択肢が ext4, JFS, XFS になるだろうか。
なお [Btrfs では swap ファイルが使えない](https://wiki.archlinux.org/index.php/Swap#Swap_file)。
ファイルシステム事情には疎いのだが、JFS は [日本語 ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0) で

> ext シリーズや ReiserFS ほどは広くサポートされていませんが

とあるので却下。
定番の ext4 か、RHEL で標準となった XFS かだが…今回も無難そうな ext4 を用いることとした。

さて作業開始にあたり、まずはブロックデバイスを確認してみる。

```
root@archiso ~ # lsblk
NAME  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0  7:0     0 496.6M  1 loop /run/archiso/airootfs
sda    8:0     0 465.8G  0 disk
sr0   11:0     1   609M  0 rom  /run/archiso/bootmnt
```

というわけで今回は `/dev/sda` がお目当てのブロックデバイスだ。
対象が確認できたところでパーティションを切ろう。

```
# fdisk /dev/sda
```

fdisk の詳細は割愛するが、`m` でヘルプが出るのでそれを見ながらパーティションを設定していく、
まずは、fdisk の ヘルプから「create a new empty GTP partition table」を見つけてそのコマンドを打つ。
これにより GPT のパーティションテーブルが作成できる。

続いて、UEFI なので ESP (EFI System Partition) を作成する。
ESP の詳細が知りたければ[こちら](https://wiki.archlinux.org/index.php/EFI_system_partition)。
fdisk のヘルプから「add a new partition」を見つけてそのコマンドを打つ。
そこで設定した内容は以下である。

* Partition number に 1 を指定
* First Sector には、指定可能な最小値を設定
  * 2048 だった
* Last Sector には、512MB 相当のセクタ数を指定
  * fdisk が「Units: sectors of 1 * 512 = 512 bytes」とか表示してくれる
  * というわけで `+512M` を指定した。`+` を忘れない

同様に「create a new empty GTP partition table」により、残り全のセクタを Partition number 2 に割り当てる。

続いて「change partition type」よりパーティションタイプを指定する。
Partition number 1 には EFI System を設定したいのだが、悲しいことに指定可能なタイプ一覧はモニタサイズによっては見切れてしまい、何を指定すれば EFI System になるか分からなかったりする。
今回は `1` を選択するのが正解であった。

同様に Partition number 2 に対して change partition type を行い、今度は `Linux LVM` を設定する。

最後は「write table to disk and exit」を行なう。

### LVM の設定
https://wiki.archlinux.org/index.php/LVM#Installing_Arch_Linux_on_LVM

LVM の物理ボリュームの作成を行なう。
先ほどのパーティショニングにより `/dev/sda2` が対象の領域となったため、以下のコマンドを実行する。

```
# pvcreate /dev/sda2
```

以下のコマンドで `/dev/sda2` が表示されれば成功だ。

```
# pvdisplay
```

続いて LVM のボリュームグループを作成する。
`VolGroup00` は別の名前でも構わないはずなので、任意で変更すること。

```
# vgcreate VolGroup00 /dev/sda2
```

次のコマンドで `VolGroup00` が存在しているか確認する。


```
# vgdisplay
```

作成したボリュームグループを全て、`lvolroot` という名前で `/` へ割り当てる。

```
# lvcreate -l +100%FREE VolGroup00 -n lvolroot
```

そして以下のコマンドを打ち、`/dev/VolGroup00/lvolroot` が想定したボリュームサイズ、つまり `/boot` を除く全容量 で作成されていることを確認する。

```
$ lvdisplay
```

### パーティションのフォーマット

```
# mkfs.vfat -F32 /dev/sda1
# mkfs.ext4 /dev/mapper/VolGroup00-lvolroot
```

### パーティションのマウント
作成したパーティションをマウントする。

```
# mount /dev/mapper/VolGroup00-lvolroot /mnt
# mkdir -p /mnt/boot
# mount /dev/sda1 /mnt/boot
```

### インターネットへの接続
有線接続であればライブ環境起動時に接続できるようになっているはずなので `ping 1.1.1.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#.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.8D.E3.83.83.E3.83.88.E3.81.B8.E3.81.AE.E6.8E.A5.E7.B6.9A)を見ながら設定すること。

### システムクロックの更新
以下でシステムクロックを正確にする。

```
# timedatectl set-ntp treu
```

## インストール
### ミラーの選択
`/etc/pacman.d/mirrorlist` を開き利用したいミラーをアンコメントするの…というわけではなく、全てが最初からアンコメントされている方式なので、以下のようにした。

```
# cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
# grep -A 1 Japan /etc/pacman.d/mirrorlist | grep Server > /etc/pacman.d/mirrorlist
```

なおこのミラーリストは上から順に優先されることになる。

### ベースシステムのインストール
ではいよいよインストールだ。
これで必要なパケージ群が入る。

```
# pacstrap /mnt base base-devel
```

## システムの設定
### fstab の生成

```
# genfstab -U /mnt >> /mnt/etc/fstab
```

`/mnt/etc/fstab` の中身は念のため確認しておく。

### chroot
新しくインストールしたシステムに `chroot` する。

```
# arch-chroot /mnt
```

### タイムゾーン
日本在住なので日本にする。

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

加えてハードウェアクロックが UTC であれば、以下により `/etc/adjtime` を設定する。

```
# hwclock --systohc --utc
```

### ロケール
`/etc/locale.gen` を編集し、`en_US.UTF-8 UTF-8` と `ja_JP.UTF-8 UTF-8` をアンコメントする。
続いて以下のコマンドを実行する。

```
# locale-gen
```

最後にロケールの設定をするが、ここでは日本語ではなく英語を指定する。
CLI 環境で日本語が出てくると辛いため。

### ホストネーム

```
# echo お好みのほすとねーむ > /etc/hostname
```

`/etc/hosts` にも同様の名前を設定する。

```
127.0.0.1	localhost
::1		localhost
127.0.1.1	お好みのほすとねーむ.localdomain	お好みのほすとねーむ
```

### ネットワーク設定
この時点で設定されなくなっている状況もあるようだが、`ping 1.1.1.1` したら通ったので何もしなかった。

### Initramfs
LVM のためにまずは `/etc/mkinitcpio.conf` を編集する。
https://wiki.archlinux.org/index.php/LVM#Configure_mkinitcpio

`HOOK` において、`base` の後に `udev` を、`block` の後に `lvm2` を追加する。
`udev` と `lvm2` ではなく `systemd` と `sd-lvm2` を追加するという方式もあるようだが、`udev` がデフォルトで含まれていたので今回はそちらにした。

その後、以下を実行する。

```
# mkinitcpio -p linux
```

### Root パスワード
任意のものを設定する。

```
# passwd
```

### ブートローダー
UEFI なので systemd-boot を用いる。
以前は gumiboot を使っていたのだが、それはこの systemd-boot の旧名らしい。
以下でインストールする。

```
# bootctl --path=/boot install
```

続いて、AMD の CPU なのでマイクロコードのインストールを行なう。
https://wiki.archlinux.org/index.php/Microcode

```
# pacman -S amd-ucode
```

最後に、systemd-boot の設定ファイルを記述する。
まずは `/boot/loader/loader.conf` に以下を設定する。

```
default  arch
timeout  4
console-mode max
editor   no
```

各値は[こちら](https://wiki.archlinux.org/index.php/Systemd-boot#Loader_configuration)を見つつ変えてよいが、`editor` はセキュリティ上 `no` にすることが推奨されている。

続いて `/boot/loader/entries/arch.conf` に以下を設定する。

```
title   Arch Linux
linux   /vmlinuz-linux
initrd  /amd-ucode.img
initrd  /initramfs-linux.img
options root=root=/dev/mapper/VolGroup00-lvolroot rw
```

`initrd  /amd-ucode.img` により、先ほどインストールしたマイクロコードの自動更新がされるようになる。


### 再起動

```
# exit
# umount -R /mnt
# reboot
```

リブート時にインストールメディアを取り除くこと。
そして Arch Linux が起動すれば成功。

# デスクトップ機化への道のり
Arch Linux を起動したら root でログインする。
起動できなかったら上記の OS インストールに失敗している可能性があるので残念ながら原因を探しつつ修正する必要がある。

## 個人ユーザ作成
ひとまず個人ユーザを作り、root での作業をやめる。

```
# useradd -m {username}
# passwd {username}
# pacman -S sudo
# visudo
```

作成したユーザが `sudo` で作用ができるよう、`visudo` では以下を追記する。

```
{username} ALL=(ALL) ALL
```

ここまで終わったら `exit` し、作成したユーザでログインし直す。

## ネットワークの有効化
今回は有線なので以下で済ませた。
`@` の後はネットワーク I/F 名になるので、それは `ip a` コマンドで調べる。


```
$ systemctl enable dhcpcd@enp8s0
$ systemctl start dhcpcd@enp8s0
```

(ちなみに今回のマザボは WiFi を搭載しているがとりあえず使わない)

## パッケージの更新

```
$ sudo pacman -Syu
```

## Yay のインストール
AUR のパッケージを使いたくなるシーンがよくあるので、AUR ヘルパーである Yay を入れる。

```
$ sudo pacman -S git
$ git clone https://aur.archlinux.org/yay.git
$ cd yay
$ makepkg -si
$ rm -rf yay
```

以降は `pacman` より `yay` の方がタイプ数が少ないので、`yay` を使っていく。
`sudo` も省略できるし。

## systemd-boot の自動更新
Yay が入り AUR が簡単に使えるようになったので、AUR にある systemd-boot 自動更新用パッケージを入れる。

```
$ yay -S systemd-boot-pacman-hook
```

systemd-boot は先程のインストール手順により導入されたが、`/boot` に入ったため通常の pacman 系更新コマンドでは更新されない。
そこで上記パッケージを導入することで pacman の更新にフックして systemd-boot も更新されるようにしておくのが吉。

## Wayland を諦めた
さて GUI 環境の構築開始だ。
RHEL 8 が Wayland を採用したし、Arch ユーザとしては負けるわけにはいかねえ! と思ったのだが諦めた。
グラボが NVIDIA じゃなければ採用したのだが…。

ウィンドウマネージャに i3wm を使ってみたいと思っており、ちょうど 1.0 がリリースされた i3wm 互換の Wayland 用 ウィンドウマネージャ Sway に興味を持っていた。
が、Sway と NVIDIA は相性が悪いようだ…。

参考

* https://github.com/swaywm/sway/wiki#nvidia-users
* https://nyakuo.hatenablog.com/entry/2018/12/31/100000

「機械学習って CUDA 使えた方が有利なのかね? 申し訳程度に NVIDIA にしておくか」と思って熟慮せず選んだパーツだったが、少々悔しい。
何年も前に[リーナス御大が中指を立てていた](https://www.4gamer.net/games/017/G001762/20120618029/)ことを知らなかったわけではないが、自分はその意味をよく理解していなかったのだ…。

## 仕方なく Xorg の導入

ここでは `nvidia` パッケージを入れているが、必要なドライバはグラボのベンダーや世代によって変わるので注意すること。

```
$ yay -S nvidia
$ yay -S xorg-server
$ sudo nvidia-xconfig
```

ちなみに自分の環境では `nvidia` を入れると CUI の解像度が低くなるという問題が起きており、対応は保留中…。


## ディスプレイマネージャの導入
Xorg の起動にあたりディスプレイマネージャを導入する。
今回は LightDM を採用した。
以前は SLiM を使っていたが開発が終了したので、他の軽量なものを選んだ。

```
$ yay -S lightdm lightdm-webkit2-greeter
$ sudo systemctl enable lightdm
```

合わせてインストールしている `lightdm-webkit2-greeter` は Greeter と呼ばれるログイン情報入力 GUI である。
これには[いくつか選択肢がある](https://wiki.archlinux.org/index.php/LightDM#Greeter)ので好みのものを使うとよい。
そしてインストールした Greeter を設定する。
`/etc/lightdm/lightdm.conf` において、以下を記述する。

```
[Seat:*]
…
greeter-session=lightdm-webkit2-greeter
```

なおここで設定可能な Greeter 名は `/usr/share/xgreeters` を見れば分かる。

さて LightDM の設定は色々変更できそうだが、今回は割愛する。

## ウィンドウマネージャの導入
では早速 Xorg を起動! とはせずに、ウィンドウマネージャを入れよう。
これまで GNOME、Openbox、Xmonad と変遷してきたが、今回は i3wm にした。
ターミナルには従前より利用している Terminator を選んだ。
やはりタイル型はなじむ。実になじむ。

```
$ yay -S i3-wm i3status terminator
$ sudo reboot
```

これで成功すれば LigthDM のログイン画面が表示される。
そこで i3 のセッションを選択、id/pw を入力してログインしよう。
すると i3 のデフォルト設定がないから作るよと表示されるのでウィザードに従って作成する。

あとは `mod + enter` でターミナルが起動する。
i3 は空気を読んで未設定でも Terminator を使ってくれるようだ。

さて i3wm の設定もやりがいがありそうだが、今回は割愛する。

## フォント
### 日本語フォントの導入
AUR に Nerd Fonts パッチ適用済みの Ricty が上がっているのでありがたく使う。

```
$ yay -S nerd-fonts-ricty
```

あるいは好みであれば Cica フォントを入れてもいいかも知れない。

```
$ yay -S ttf-cica
```

### 絵文字
Symbola を使う。

```
$ yay -S ttf-symbola
$ fc-cache -f -v
```

このあと、ブラウザやターミナルエミュレータ等の GUI アプリケーションは再起動することで絵文字が表示されるようになる。

## 日本語入力
Fctix + Mozc を使う。
本当は IBus の IM 切り替えのモッサリ感が好きではない。
Fctix は母音が変な位置に出る問題があるので一度は諦めていたが、軽く触ってみたところ修正されているようだったので改めて採用した。
なお [Nimf](https://gitlab.com/nimf-i18n/nimf) という新興の IM フレームワークもあるが、どうも Anthy 縛りっぽいので見送った。

まずは `~/.xprofile` に環境変数および自動起動の設定をする。

```
export LC_CTYPE=ja_JP.utf-8

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

fcitx &
```

`LC_TYPE` で行なっているロケールの設定を忘れると、Fcitx に Mozc をはじめとした日本語 IM が追加されないので注意する。
なおこの設定は `/etc/locale.conf` でやることもできるが、その場合はシステムグローバルに日本語になり、CLI でのトラブルシューティングが辛くなるのでやらない。
ここで一旦、再ログインする。

そして必要なパッケージを入れる。

```
$ yay -S fcitx-mozc fcitx-configtool fcitx-im
```

なお前述のロケール設定を忘れて Fcitx を起動すると Mozc が現れなくなるが、この場合は `~/.config/fcitx` を消して Fcitx を再起動すれば直るようだ。

あとはタスクトレイにいる Fcitx のアイコンをクリックして Configure を選び、次の設定をして個人的な好みにした。

* インライン入力
    * Addon
        * Advanced にチェックを入れる
        * Fcitx XIM Frontend を選択し、Configure ボタンを押す
        * Use On The Spot Style for XIM にチェックを入れる
        * タスクトレイのアイコンを右クリックし、restart
* ホットキーの変更
    * Global Config -> Hotkey -> Trigger Input Method
        * `Ctrl + Space` は Emacs とぶつかるので `Ctrl + \` に変更

## ブラウザの導入
好きなものを入れれば良いが、とりあえず Chromium を入れた。
ちなみに yay ならば Vivaldi も入れられる。

```
$ yay -S chromium
```

## パスワードマネージャの導入
もし OSS のもを使うなら KeePassXC、あるいは後発の Bitwarden も良さそうだ。
この辺はお好みで。

```
$ yay -S keepassxc

# あるいは
$ yay -S bitwarden
```

必要なデータベースファイルやキーファイルは、何らかの手段でこの Arch 機のローカルまで持ってこよう。

さてここまでくれば、「とりあえず使えるぜ」感が出るだろう。

## SSH 鍵
GitHub などへの鍵登録用。

```
$ yay -S openssh
$ ssh-keygen -t ed25519
```

## 音

```
$ yay -S pulseaudio pavucontrol volumeicon
```

volumeicon を起動し、右クリックから Status Icon を開く。
そして External mixier に `pavucontrol` を指定する。

続いて PulseAudio と pavucontrol を起動する。
たった今設定したように、pavucontrol はタスクトレイの volumeicon を右クリックして表示させてもいい。

```
$ pulseaudio --start
$ pavucontrol &
```

なお PulseAudio は次回から手動で起動しなくてもよい…はず。

そして画面から適当にミュートを解除して音が出ることを確認する。
ここでブラウザで音を出そうとして出ない場合は、一度ブラウザを再起動すると直る可能性がある。

ちなみに volumeicon も初期起動するよう設定しておこう。

```
$ echo 'volumeicon &' >> .xprofile
```

## Swap
次節のハイバネートで必要になるのでこの時点で作成する。
Swap のサイズについては [RedHat の記事](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/storage_administration_guide/ch-swapspace)に従って決めると良さそうだ。
今回は 34GB になる。

また、Swap はパーティションではなく Swap ファイルとして作成する。

作成とマウントには systemd-swap を使っても良さそうだったが、手動でやっても大した手間ではないので以下のように手動でやった。
最後の `tee` コマンドで `-a` オプションを忘れると面倒なことになるので気をつけること。

```
$ sudo fallocate -l 34G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ echo '/swapfile none swap defaults 0 0' | tee -a /etc/fstab
```

## ハイバネート
カーネルパラメータの設定が必要になる。
まずは以下を実行して表示される `physical_offset` の最初の値を確認する。
以下の出力例においては `10074112` である。

```
$ sudo filefrag -v /swapfile | head -n 5

Filesystem type is: ef53
File size of /swapfile is 36507222016 (8912896 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..       0:   10074112..  10074112:      1:            
   1:        1..   10239:   10074113..  10084351:  10239:             unwritten
```

続いて `/boot/loader/entries/arch.conf` にある `option` の値を変更する。
ここまでの設定では以下のようになっているはずだ。

```
options root=/dev/mapper/VolGroup00-lvolroot rw
```

これにハイバネート用のパラメータ `resume` および `resume_offset` を付け足す。
`resume` にはスワップファイルの載っているデバイスファイルのパス、あるいは UUID を指定する。
あくまでデバイスファイルの情報であり、Swap ファイルそのもののパス (今回は `/swapfile`) を指定しないこと。
`resume_offset` は先程取得した数字を指定する。
今回の例では以下のようになる。

```
options root=/dev/mapper/VolGroup00-lvolroot rw resume=/dev/mapper/VolGroup00-lvolroot resume_offset=10074112
```

続いて initramfs の設定をする。
`/etc/mkinitcpio.conf` の `HOOKS` の中に `base` が含まれている場合 (Arch はデフォルトで含まれている) `resume` を `filesystem` の前に追加する必要がある。
なお今回のように LVM を使っている場合は `lvm2` の後ろでもある必要がある。

```
HOOKS=(base udev autodetect modconf block lvm2 resume filesystems keyboard fsck)
```

そして initramfs を再生成する。

```
$ sudo mkinitcpio -p linux
```

ではハイバネートしてみよう。
(ブート時のパラメータをいじってるので、もしかしたら一度再起動してからでないとダメかも知れない…自信なし)

```
$ systemctl hibernate
```

なおこのハイバネート用コマンドは、後述のランチャーである Rofi に登録しておくと便利である。

さて、ここでハイバネートから復帰すると気づくことがあるだろう。
認証なしで元の状態に復帰するので危険だぞ…と。
これは次のセクションで解消する。

## スクリーンロック
というわけで、ハイバネートからの復帰時や、ちょっとトイレに行ってくる間にスクリーンロックをかけられるようにする。

```
$ yay -S xss-lock i3lock
```

xss-lock はハイバネートやサスペンドにフックしてロックを呼び出してくれる機構であり、ロックそのものではない。
i3lock はロックであり、今回は i3wm であるため選択した。他の選択肢としては xsecurelock など複数あるので、i3wm 以外を使うのであれば調査して好きなものを入れること。

xss-lock による見張りを開始するには以下のコマンドを打つ。

```
$ xss-lock -- i3lock &
```

起動スクリプトへの登録しておこう。

```
$ echo 'env LC_CTYPE="" xss-lock -- i3lock &' >> ~/.xprofile
```

なおここで `LC_CTYPE` 環境変数の設定をしているのは、i3lock が以下のエラーを吐くためだ。

```
xkbcommon: ERROR: couldn't find a Compose file for locale "ja_JP.utf-8"                                                          
[i3lock] xkb_compose_table_new_from_locale failed
```

ちなみにスタンバイ状態にしてスクリーンロックをかけるコマンドは、自分は以下を使っている。
これも後述のランチャーから呼び出せるようにすると便利だ。

```
$ xset dpms force standby
```

## ランチャー
Rofi を使っている。便利。
Mac で言うところの Spotlight っぽいやつ。
自前のスクリプトを仕込んだり、SSH の候補を選んだり、アクティブなウィンドウの切り替えなんかにも使える。

```
$ yay -S rofi
```

この記事では前述の、ハイバネートとスタンバイをここから呼び出す設定を以下に書いておく。
必要なファイルは 2 つだ。
もっと色々設定できるが、それは Rofi について掘り下げている他の記事に譲る。

```shell:~/.config/rofi/config
rofi.modi:  window,run,drun,system:~/.config/rofi/rofi_system.sh
rofi.sidebar-mode: true
rofi.hide-scrollbar: true
rofi.kb-cancel: Escape
rofi.theme: /usr/share/rofi/themes/glue_pro_blue.rasi
```

```shell:~/.config/rofi/rofi_system.sh
#!/usr/bin/env bash

set -euCo pipefail

function main() {
  # can not use some special charactors
  # e.g. ( )
  local -Ar menu=(
    ['Standby']='xset dpms force standby'
    ['Hibernate']='systemctl hibernate'
  )

  local -r IFS=$'\n'
  # with some arguments:  execute a command mapped to $1
  # without any arguments show keys
  [[ $# -ne 0 ]] && eval "${menu[$1]}" || echo "${!menu[*]}"
}

main $@
```

さてこの Rofi をどうやって呼び出すかだが… i3 にショートキーで呼び出す設定を入れるのが良いだろう。
個人的な好みは `alt + space` だ。
起動オプションは任意だが、例としては以下を i3 の設定ファイルに追記すればよい。

```:~/.config/i3/config
bindsym Mod1+space exec rofi -combi-modi -font "hack 10" -show
```

ちなみに、同設定ファイルを見ると、`$mod+d` に類似のランチャーである dmenu がデフォルトで割当てられている。
が、[Rofi が dmenu replacement を謳っている](https://github.com/davatorium/rofi)ためそちらは出番なし。

## ナイトモード
夜間はブルーライトをカットし、眠りの質を多少でも上げたい。
そもそも PC なんぞやってないで早く寝ろというのは正論だが対応が難しいため、小手先の手法で何とかしたいのが人情である。

そんなニーズに応えてくれるのが Redshift である。

```
$ yay -S redshift
```

引数なしで `redshift` コマンドにより起動すると、緯度経度を取得しにいってそれをベースに計算してモニタの色合いを調整してくれるようだ。
とはいえ緯度経度を毎度取得しては欲しくないので、あらかじめ `/.config/redshift.conf` に記入しておくのがよい。

```
[redshift]
location-provider=manual

# これはハンブルグの緯度経度である
# 修正して使うこと
[manual]
lat=48.1
lon=11.6
```

このパッケージには、`redshift-gtk` という GUI フロントエンドも含まれている。
これを使うためには以下のパッケージを追加する。

```
$ yay -S python-gobject python-xdg librsvg
```

起動するとタスクトレイに常駐する。
このアイコンを右クリックして Autostart にチェックを入れておくとよい。

`redshift-gtk` も自動起動にも加えておく。

```
$ echo 'redshift-gtk &' >> ~/.xprofile
```


## デスクトップ通知
[Dunst](https://wiki.archlinux.org/index.php/Dunst) を入れる。
Dzen2 という選択肢もあるが、見た目が気に入らず却下した記憶がある。
他にもっといいのがあれば試したい。

```
$ yay -S dunst
$ mkdir -p ~/.config/dunst
$ cp /usr/share/dunst/dunstrc ~/.config/dunst/dunstrc
```

この dunstrc はカスタムして好みの見た目に仕上げるわけだが、`icon-path` の値は適切にしておかないと、通知時にこんなエラーが出る。

```
WARNING: No icon found in path: 'dialog-information'
```

`dialog-information.png` ファイルがあるアイコンテーマのパスを指定すればよく、自分の環境では以下がすでにインストールされていたのでいったん設定した。

```:~/.config/dunst/dunstrc
icon_path = /usr/share/icons/Adwaita/16x16/legacy
```

好みのアイコンセットが各々あると思うので、好きなものを入れてパスを設定すること。

では起動の設定だ。

```
echo 'dunst &' >> ~/.xprofile
```

ちなみに起動が成功したかどうかのテストには以下のようなコマンドを打てば良い。
起動できていれば通知が出る。

```
$ notify-send 'subject' 'this is test'
```

## 温度やファンの回転数を見る
PC を自作する以上は重要。
温度が高すぎるならエアフローを見直す必要がある。

ツールとしては lm_sensors を使う。
https://wiki.archlinux.org/index.php/Lm_sensors

```
$ yay -S lm_sensors
$ sudo sensors-detect
```

`sensors-detect` ではいろいろ質問されるが、すべて Enter を入力すれば無難なセットアップになるようだ。

さて温度などを見る方法だが、`sensors` コマンドを使って CUI で見てもいいし、GUI フロントエンドである xsensors または psensor を使ってもいい。
個人的には psensor の方が詳細で好きだ。アラーム機能もあり、タスクトレイに常駐させることもできる。

```
$ yay -S psensor
$ psensor &
$ psensor & >> .xprofile
```

## Web カメラ
ドライバの都合で使える Web カメラとそうでないものがあるようなので、まずは[ここ](https://wiki.archlinux.jp/index.php/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%AB%E3%83%A1%E3%83%A9%E8%A8%AD%E5%AE%9A)を眺めて使えそうなものをピックアップする。

自分は Logicool C270 を選んだ。
この Web カメラに対応するドライバ linux-uvc であり、カーネルモジュール uvcvideo がロードされていればよいようだ。
以下で確認したらすでにロード済みのようだったので、PC にカメラを接続してみたら見事に使えた。
めでたし。

```
$ modprobe -c | grep uvcvideo
```

## CLI ツール群
何を入れるか、どう設定するかは他に詳しい記事がいくらでもありそうなのでそちらに譲るが、現時点で個人的に使っているツールの中で基本的なものをざっと書いておく。
作業効率を考えれば、これらはこの一連のインストール作業の序盤で入れておくべきだったかも知れない。

* fish + fisherman
* tmux + tpm
* fzf
* ag
* fd
* `alias ls='lsd'`
* `alias diff='colordiff'`

最近は `alias cat='bat'` も検討中。

### Arch Linux 特有のもの

```
$ yay -Ss pacman-contrib pkg-tools
```

## 見た目を整える
### 壁紙
Nitrogen を使う。
先に好きな壁紙を用意しておくのをお忘れなく。

```
$ yay -S nitrogen
$ nitrogen /path/to/壁紙画像のあるディレクトリ
```

これで GUI が起動するので好みに設定し、Apply してから終了する。

そして起動時に壁紙を表示するように以下を行う。

```
$ echo 'nitrogen --restore &' >> ~/.xprofile
```

### 背景透過
Compton を使う。

```
$ yay -S compton
```

起動オプションは適宜調べて好みに設定すればよいが、バックグラウンド起動は `-b` でできるので最低限このオプションだけつけておけばいいだろう。

```
$ compton -b
$ echo 'compton -b' >> ~/.xprofile
```

### 各種テーマの導入
今のところやってない（いずれ対応してこの記事に書くかも…）。
アイコンだけでなく、複数バージョンの [GTK](https://wiki.archlinux.org/index.php/GTK%2B) と [Qt](https://wiki.archlinux.org/index.php/Qt) に対応し、かつ[両者の統一感](https://wiki.archlinux.org/index.php/Uniform_look_for_Qt_and_GTK_applications)まで考え出すと面倒。
とりあえず i3 や dunst 等の見た目を整えた時点でそれっぽいやつを適宜導入していけばいいかと思った。

ちなみに、アイコンや GTK のテーマを拾ってくる場所として以前は https://www.gnome-look.org/ を使っていたので、今回もお世話になりそう。

## Steam
まずは Multilib を有効化する。
`/etc/pacman.conf` の以下をアンコメントする。 

```:/etc/pacman.conf
[multilib]
Include = /etc/pacman.d/mirrorlist
```

続いて以下を実行する。

```
$ yay -Syy
```

そして 32 bit の NVIDIA ドライバと Steam を導入する。

```
$ yay -S lib32-nvidia-utils steam
```

もしかすると、ここでマシンを再起動する必要があるかも知れない。
`pacman -Syu` によるパッケージ更新など、グラフィックドライバに変更があった場合は再起動しないと Steam の起動で失敗するケースがあるようだ。

あとは `steam` コマンドで起動すればよい…のだが、上記の再起動をしたところでこの起動でけっこうトラブることがある。
そんな時は [Arch Wiki の Steam トラブルシューティング記事](https://wiki.archlinux.org/index.php/Steam/Troubleshooting)なんかを見ながら粘る。
粘る…。

### ゲームパッド
試しに Xbox の 360 コントローラーを買ってみたところ、Linux 側は認識しているものの Steam の入力には使えないという状態だった。

そこで antimicro を使ってゲームパッドの入力をキーボードの入力に割り当てることでゲームを遊べるようにした。

```
$ yay -S antimicro
$ antimicro &
```

# チューニング
とりあえず Arch Wiki にあるもののうち Disk I/O 関連だけやっておいた。
https://wiki.archlinux.org/index.php/Improving_performance

## SSD
### TRIM
速度劣化を防止するため TRIM を有効化する。

まずは TRIM がサポートされているかを先に確認すること。

```
$ yay -S hdparm
$ sudo hdparm -I /dev/sda |grep TRIM                                                                                               
           *    Data Set Management TRIM supported (limit 8 blocks)
           *    Deterministic read ZEROs after TRIM
$ yay -Rs hdparm
```

`supoprted` とあるので fstrim を有効にする。

```
$ sudo systemctl enable fstrim.timer
$ sudo systemctl start fstrim.timer
```

ちなみに日本語版の Arch Wiki にしか書いてなさそうだったのだが、`/etc/fstab` に `discard` フラグを追加することによる TRIM の有効化は[推奨されないらしい](https://wiki.archlinux.jp/index.php/%E3%82%BD%E3%83%AA%E3%83%83%E3%83%89%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96#.E3.83.9E.E3.82.A6.E3.83.B3.E3.83.88.E3.83.95.E3.83.A9.E3.82.B0.E3.81.A7_TRIM_.E3.82.92.E6.9C.89.E5.8A.B9.E3.81.AB.E3.81.99.E3.82.8B)。

また、今回のように LMV を使っている場合は上記に加えて `/etc/lvm/lvm.conf` の `issue_discards` の値を `1` に変更すること。

### atime
[atime 情報の更新を止めて高速化を図る](https://wiki.archlinux.org/index.php/Fstab#atime_options)。
`/etc/fstab` で `relatime` オプションを付与する。
最速は `noatime` オプションを使って完全に atime の更新を止めることなのだが、atime が全く更新されなくなると上手く動作しないアプリケーションが一部あるようなので、ファイル書き込み時だけは更新してくれる `relatime` を妥協案として使うのが現実解になりそうだ。

そして `/etc/fstab` を変更したので再起動…と思ったら、[以下のコマンドを打てばよい](http://takuya-1st.hatenablog.jp/entry/20101201/1291187213)ようだ。

```
$ sudo mount -a
```

### I/O スケジューラ
SSD の場合は伝統的な CFQ では遅いという話があり、変更を試みた。

```
$ cat /sys/block/sda/queue/scheduler                                                                                              
[mq-deadline] kyber bfq none
```

というわけでもともと `mq-deadline` になっていたのでこのまま行ってみることにした。

ちなみに LVM を使っている都合で `dm-0` というブロックデバイスもあるが

```
$ cat /sys/block/dm-0/queue/scheduler                                                                                              
none
```

これは…このままでいいいのかな？
[`none` になっていたら調整するなという記事](https://docs.oracle.com/cd/E96517_01/cwlin/setting-the-disk-io-scheduler-on-linux.html#GUID-B59FCEFB-20F9-4E64-8155-7A61B38D8CDF)も見かけたので。

ちなみにこの `dm-X` が何かというのは[こちらのスクリプト](https://superuser.com/questions/131519/what-is-this-dm-0-device/131520)で判明する。

## Swap
swappiness を 10 にする。0 にはしない。
参考: https://qiita.com/rarul/items/a96b61b1fb535dea5fe3
RAM は 32GB と多く積みはしたが、正直 swappiness の挙動をちゃんと理解できておらず、0 にするのが本当に適切なのかは怪しい…。
というわけで [Red Had の推奨値である 10](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-memory-tunables) を設定することとした。
まあこの推奨値も、Oracle DB では、という枕詞があるわけだが…。

まずはデフォルト値である `60` が設定されていることを確認しておく。

```
$ cat /proc/sys/vm/swappiness
60
```

というわけで 10 まで下げる。
現在のセッションで swappiness を一時的に変更するのと、永続化設定を両方入れるのでコマンドは 2 つ。

```
$ sudo sysctl vm.swappiness=10
$ echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-sysctl.conf
```