Arch Linux インストール〜基本的な環境設定まで(UEFI/GPT/LVM/無線LAN)

# 前置き
特別定額給付金の使い道をどうしようかと考えていた折にYouTubeで以下の動画を見て、自作PCを組むことにしました。

- [給付金10万円で自作ゲーミングPCを作ろう！【10万円PCの構成を考える編】 - 吉田製作所](https://www.youtube.com/watch?v=Qm8QGVzAcqk&feature=emb_title)

前々からLinuxマシンが欲しかったのもあり、OSはLinuxを選択。
せっかくPCを組むならOSも自作感溢れるものが良かろうと、ディストリビューションはArch Linuxにすることにしました。
(Gentooはさすがに勇気が出ず。。あとはNixOSも面白そうで迷いました。)
使い始めてまだ数ヶ月ですが、とても快適で楽しいです。Arch Linuxを弄っているだけで無限に時間が溶けていく。。

Arch Linuxは[公式Wiki](https://wiki.archlinux.jp/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)がしっかりしていますし、調べればいっぱい情報は出てきます。
ただ、それでも自分の環境に合わせるためには、相当調べ回って色々と試行錯誤しました。
自分の備忘録としても、これから同じような環境でArch Linuxのインストールに挑む人のためにも、ここに手順を残しておくことにします。

# Arch Linux インストール
主に以下の記事を参考にしました。
本記事の章立ては基本的にArchWikiのインストールガイドに沿って作成しています。

- [インストールガイド - ArchWiki](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)
- [Arch Linuxをインストールする - クロの思考ノート](http://note.kurodigi.com/post-0-21/)
- [Arch Linuxインストール （OSインストール編）| UEFI, GPT, XFSを使用してインストール - 普段使いのArch Linux] (https://www.archlinux.site/2016/03/arch-linux-uefi-gpt-xfs.html)
- [Arch Linux インストール俺々式完全版 - Qiita](https://qiita.com/TsutomuNakamura/items/b60518f8788e5e998744)
- [ArchLinuxのインストール(3つのブート方式ごとの設定) - Qiita](https://qiita.com/Gen_Arch/items/da296b7cbe5d87abc5a4)
- [arch linux + LVM + UEFI + GPT なインストール手順 - Qiita](https://qiita.com/niwatolli3/items/926563abb65e1a9a8d4b)
- [Arch Linuxインストール（無線LANで） : LUKS, LVM, UEFI - Qiita](https://qiita.com/kentakozuka/items/55d799caad7a54d0ecaa)

## インストールの準備
### インストールメディアの作成
- [USB インストールメディア - ArchWiki](https://wiki.archlinux.jp/index.php/USB_%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2)

まずは[Arch Linuxをダウンロード](https://www.archlinux.jp/download/)し、USBに書き込む。
自分はWindowsだったので、[Rufas](https://rufus.ie/ja_JP.html)を使用。パーティション構成はGPTを選択。

### Live環境を起動
USBメモリからArch LinuxのLive環境を起動。この時点では有線LANで接続しておくのが良いかも。
本当はこの時点から無線LANで作業できれば良かったのですが、自分の場合は[ドライバの問題](#無線lanの設定)で接続できず。。

### キーボードレイアウト
- [コンソールでのキーボード設定 - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A)

デフォルトはUS配列になっているため、使用しているキーボードによって設定変更を行う。

```
# ls /usr/share/kbd/keymaps/**/*.map.gz
# loadkeys jp106
```

### 起動モードの確認
UEFIで起動していることを確認

```
# ls /sys/firmware/
acpi  devicetree  dmi  efi  memmap
#

# efivar -l
```

### インターネットへの接続
- [ネットワークインタフェース - ArchWiki](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#.E3.83.8D.E3.83.83.E3.83.88.E3.83.AF.E3.83.BC.E3.82.AF.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9)

ネットワークインタフェースが有効になっていることを確認。

```
# ip link show
# ping -c 3 archlinux.jp
```

### 無線LANの設定
- [ワイヤレス設定 - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E8%A8%AD%E5%AE%9A)
-  [Arch Linuxのインストール時にステルスWi-Fiに接続する方法 - ニゴロバ ～明日は256倍がんばります～](https://nigoroba.com/arch-linux-install-connect-stealth-wifi/)

ドライバの確認。
自分の場合はerrorとなっていて、この時点ではWiFiが使用できませんでした。。
(Intel CPUの第10世代が出た直後だったためマザーボードが新しく、Live環境用のパッケージはまだ対応できていなかったのかもしれません)

```
# lspci -k | grep wifi
	Kernel driver in use: iwlwifi
	Kernel modules: iwlwifi, wl
#

# dmesg | grep firmware
[    5.206241] i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/kbl_dmc_ver1_04.bin (v1.4)
[   10.440517] iwlwifi 0000:01:00.0: loaded firmware version 29.163394017.0 3168-29.ucode op_mode iwlmvm
[   10.441105] iwlwifi 0000:01:00.0: Direct firmware load for iwl-debug-yoyo.bin failed with error -2
#

# dmesg | grep iwlwifi
[   10.363189] iwlwifi 0000:01:00.0: enabling device (0000 -> 0002)
[   10.440517] iwlwifi 0000:01:00.0: loaded firmware version 29.163394017.0 3168-29.ucode op_mode iwlmvm
[   10.441105] iwlwifi 0000:01:00.0: Direct firmware load for iwl-debug-yoyo.bin failed with error -2
[   10.597903] iwlwifi 0000:01:00.0: Detected Intel(R) Dual Band Wireless AC 3168, REV=0x220
[   10.615568] iwlwifi 0000:01:00.0: base HW address: cc:f9:e4:36:9b:9c
#
```

- [Arch Linuxインストールメディア環境下でのWi-Fi接続(ワイヤレス設定）について](https://unskilled.site/arch-linux%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2%E7%92%B0%E5%A2%83%E4%B8%8B%E3%81%A7%E3%81%AEwi-fi%E6%8E%A5%E7%B6%9A%E3%83%AF%E3%82%A4%E3%83%A4/)
- [ワイヤレス設定#iwlwifi - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E8%A8%AD%E5%AE%9A#iwlwifi)

ドライバに問題なければ、以下で接続できるはず。

```
# ip link show
# iw dev wlan0 link
# iw dev wlan0 scan | grep SSID
# wpa_supplicant -B -i wlan0 -c <(wpa_passphrase <ESSID> <password>)
# dhcpcd wlan0
# ip addr show
```

### SSHの起動
リモートログインできるようにSSHを起動。rootパスワードも設定しておく。

```
# systemctl start sshd
# systemctl status sshd
# passwd root
# ip link show
# ip addr show
```

これで別の端末からTeraTermなどを使用して、リモートログイン可能となります。
コマンドをコピペで打てたり、作業ログが取得できたり。色々と便利！

### システムクロックの更新
システムクロックを合わせておく。

```
# timedatectl set-ntp true
# timedatectl status
# systemctl is-active systemd-timesyncd
active
#
```

### パーティション
- [パーティショニング - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0)

自分は以下のようにしてみました。

| パーティション | VG | LV | サイズ | ファイルシステム | マウントポイント |
| :--- | :--- | :---| :---| :--- | :--- |
| /dev/nvme0n1p1 | - | - | 512 MB | FAT32 | /boot/efi |
| /dev/nvme0n1p2 | vg_main | lv_swap | 8 GB | swap | - |
| /dev/nvme0n1p2 | vg_main | lv_root | 50 GB | XFS | / |
| /dev/nvme0n1p2| vg_main | lv_var | 50 GB | XFS | /var |
| /dev/nvme0n1p2|  vg_main | lv_home | 残り全て | XFS | /home |

事前に現在の状態を確認。

```
# fdisk -l
# lsblk
# blkid
# df -Th
```

`gdisk`コマンドでディスクをパーティショニング。

```
# gdisk -l /dev/nvme0n1

# gdisk /dev/nvme0n1
GPT fdisk (gdisk) version 1.0.5

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): o 
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-976773134, default = 2048) or {+-}size{KMGTP}: (何もせずにEnter)
Last sector (2048-976773134, default = 976773134) or {+-}size{KMGTP}: +512M
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): ef00
Changed type of partition to 'EFI system partition'

Command (? for help): n
Partition number (2-128, default 2): 2
First sector (34-976773134, default = 1050624) or {+-}size{KMGTP}: (何もせずにEnter)
Last sector (1050624-976773134, default = 976773134) or {+-}size{KMGTP}: (何もせずにEnter)
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): (何もせずにEnter)
Changed type of partition to 'Linux filesystem'

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
OK; writing new GUID partition table (GPT) to /dev/nvme0n1.
The operation has completed successfully.
#

# gdisk -l /dev/nvme0n1
# lsblk
```

LVMでPV/VG/LVの作成。

```
# pvcreate /dev/nvme0n1p2
# pvs
# pvscan
# pvdisplay
```
```
# vgcreate vg_main /dev/nvme0n1p2
# vgs
# vgscan
# vgdisplay
```
```
# lvcreate -L 8G -n lv_swap vg_main
# lvcreate -L 50G -n lv_root vg_main
# lvcreate -L 50G -n lv_var vg_main
# lvcreate -l 100%FREE -n lv_home vg_main
# lvs
# lvscan
# lvdisplay
```

### パーティションのフォーマット
それぞれ任意のファイルシステムでフォーマット。

```
# mkfs.vfat -F 32 /dev/nvme0n1p1
# mkswap /dev/vg_main/lv_swap
# swapon /dev/vg_main/lv_swap
# swapon -s

# mkfs.xfs /dev/vg_main/lv_root
# mkfs.xfs /dev/vg_main/lv_var
# mkfs.xfs /dev/vg_main/lv_home
```

### ファイルシステムのマウント
それぞれマウントポイントを作成して、マウントする。

```
# mount /dev/vg_main/lv_root /mnt
# mkdir -p /mnt/boot/efi
# mkdir -p /mnt/var
# mkdir -p /mnt/home
# mount /dev/nvme0n1p1 /mnt/boot/efi
# mount /dev/vg_main/lv_var /mnt/var
# mount /dev/vg_main/lv_home /mnt/home

# df -Th
# mount
```

## インストール
### ミラーの選択
日本のリポジトリを上に持ってくるように編集する記事が多いですが、今はデフォルトでjpのリポジトリがなさそうなので特に何もしなくて良いかと。

```
# ls -l /etc/pacman.d/mirrorlist
# cat /etc/pacman.d/mirrorlist | grep jp
```

### ベースシステムのインストール
Arch Linuxの必須パッケージをインストール。

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

## システムの設定
### fstab の生成
再起動時にマウントしてくれるようにfstabを作成。

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

### chroot
Arch Linuxをインストールした領域にchrootし、併せて作業に必要なパッケージを導入。

```
# arch-chroot /mnt
# pacman -S xfsprogs vim git
```

### タイムゾーン
- [時刻#タイムゾーン - ArchWiki](https://wiki.archlinux.jp/index.php/%E6%99%82%E5%88%BB#.E3.82.BF.E3.82.A4.E3.83.A0.E3.82.BE.E3.83.BC.E3.83.B3)

日本のタイムゾーンに設定し、ハードウェアクロックも合わせておく。

```
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# hwclock --systohc --utc
# timedatectl status
```

### ロケール
- [ロケール - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB)
- [コンソールでのキーボード設定 - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A)

システムロケールの設定を行う。[後ほど日本語フォントを入れる](#日本語環境)ので、一旦英語(en_US.UTF-8)にしておく。

```
# ls -l /etc/locale.gen
# cat /etc/locale.gen | grep -vE "^#|^$"
# vim /etc/locale.gen
```
```:/etc/locale.gen
### 以下のコメントアウトを解除する

en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8
```
```
# cat /etc/locale.gen | grep -vE "^#|^$"
# locale-gen
# echo "LANG=en_US.UTF-8" > /etc/locale.conf
# cat /etc/locale.conf
```

キーボードレイアウトはUS配列になっているため、使用しているキーボードによって設定をしておく。

```
# echo "KEYMAP=jp106" > /etc/vconsole.conf
# cat /etc/vconsole.conf
```

### ネットワーク設定
- [ネットワーク設定 - ArchWiki](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)

ホスト名を設定する。

```
# echo myhostname > /etc/hostname
# vim /etc/hosts
```
```:/etc/hosts
127.0.0.1	localhost
::1		localhost
127.0.1.1	myhostname.localdomain  myhostname
```

ネットワーク関連で必要なパッケージを導入。

```
# pacman -S dhcpcd iw networkmanager wireless_tools wpa_supplicant
# systemctl enable NetworkManager
```

### Initramfs
- [mkinitcpio - ArchWiki](https://wiki.archlinux.jp/index.php/Mkinitcpio)
- [LVM#mkinitcpio.confの設定 - ArchWiki](https://wiki.archlinux.jp/index.php/LVM#mkinitcpio.conf_.E3.81.AE.E8.A8.AD.E5.AE.9A)

自分の場合はLVMにしているので、OS起動のために対応が必須。初回はここでだいぶハマりました。。

```
# pacman -S lvm2
# ls -l /etc/mkinitcpio.conf*
# cp -p /etc/mkinitcpio.conf{,.org}
# cat /etc/mkinitcpio.conf | grep -vE "^#|^$"
# vim /etc/mkinitcpio.conf
```
```:/etc/mkinitcpio.conf
# HOOKSに systemd と sd-lvm2 を追加

HOOKS=(base systemd udev autodetect modconf block sd-lvm2 filesystems keyboard fsck)
```
```
# cat /etc/mkinitcpio.conf | grep -vE "^#|^$"
# mkinitcpio -P
```

### Root パスワード
rootユーザのパスワードを変更。

```
# passwd root
```

ついでに一般ユーザの作成とsudoの設定をしておく。

```
# useradd -m -g users -G wheel -s /bin/bash myusername
# passwd myusername

# cat /etc/sudoers | grep -vE "^#|^$"
# visudo
```
```:/etc/sudoers
### どちらかのコメントアウトを解除する(sudo実行時にパスワード入力するかしないかの違い)

## Uncomment to allow members of group wheel to execute any command
# %wheel ALL=(ALL) ALL
 
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWS: ALL
```

`vi`コマンドがないと`visudo`コマンドを実行したときにエラーとなってしまう。以下で回避する。

```
# pacman -S vi

または

# ln -s /usr/bin/vim /usr/bin/vi
```

### ブートローダー
- [ブートローダー - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%96%E3%83%BC%E3%83%88%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC)
- [GRUB - ArchWiki](https://wiki.archlinux.jp/index.php/GRUB)
- [マイクロコード - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B3%E3%83%BC%E3%83%89)
- [Intel Microcode Updateの設定 - 普段使いのArch Linux](https://www.archlinux.site/2014/12/intel-microcode-update.html)


使用しているCPUに合わせて、マイクロコードのアップデートを有効にする。

```
### Intel CPUの場合
# pacman -S intel-ucode

### AMD CPUの場合
# pacman -S amd-ucode
```

ブートローダはGRUBを使用する。

```
# pacman -S grub dosfstools efibootmgr
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch --recheck --debug
# grub-mkconfig -o /boot/grub/grub.cfg
# mkdir /boot/efi/EFI/boot
# cp -p /boot/efi/EFI/arch/grubx64.efi /boot/efi/EFI/boot/bootx64.efi
```

### 再起動
OSを再起動して、インストールを完了。

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

# 環境設定
ここから先は主に以下を参考にしています。

- [一般的な推奨事項 - ArchWiki](https://wiki.archlinux.jp/index.php/%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E6%8E%A8%E5%A5%A8%E4%BA%8B%E9%A0%85)

### ネットワーク

無線LANに接続する。
自分の場合は`linux-firmware`導入前は[ドライバでエラー](#無線lanの設定)が起きていたので、解消されたかを確認しています。

```
$ su -
# lspci -k | grep wifi
# dmesg | grep firmware
# dmesg | grep iwlwifi

# ip link show
# iw dev wlp1s0 link
# iw dev wlp1s0 scan | grep SSID
# wpa_supplicant -B -i wlp1s0 -c <(wpa_passphrase <ESSID> <password>)
```

DHCPでIPアドレスを割り振る。
dhcpcdは`/etc/resolv.conf`を[自動で上書きする](https://wiki.archlinux.jp/index.php/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA#DNS_.E8.A8.AD.E5.AE.9A.E3.81.AE.E4.BF.9D.E8.AD.B7)ため、気にする場合は事前にバックアップしておく。

```
# cp -p /etc/resolv.conf{,.org}
# dhcpcd wlp1s0
# ip addr show
```

OS起動時に自動でIPアドレスを取得するよう設定する。
設定後にOSを再起動して設定が上手くいっているか確認。

```
# wpa_passphrase <ESSID> <password> > /etc/wpa_supplicant/wpa_supplicant-wlp1s0.conf
# systemctl enable wpa_supplicant@wlp1s0
# systemctl enable dhcpcd@wlp1s0
# reboot

$ iw dev wlp1s0 link
$ ip addr show
```

[2022/02/18 追記]
しばらくネットワーク接続が安定せず、色々調べたところ、
　・NetworkManagerとdhcpcdは相性が悪いらしい。。
　・NetworkManagerとwpa_supplicant@wlp1s0で競合してるかも。。
という点に突き当り、現在はNetworkManagerでWi-Fi接続しており、安定して使えています。
こちらの記事に反映していないことに気付いたので追記。

```
$ sudo nmcli dev wifi connect <ESSID> password <password>
$ nmcli dev status
```

### ミラーリスト
日本のリポジトリを設定しておく。

```
$ sudo cp -p /etc/pacman.d/mirrorlist{,.org}
$ sudo curl -o /etc/pacman.d/mirrorlist https://www.archlinux.org/mirrorlist/?country=JP&protocol=http&protocol=https&ip_version=4
$ sudo vim /etc/pacman.d/mirrorlist
```
```:/etc/pacman.d/mirrorlist
### Server行のコメントアウトを解除する。httpsのものを上に寄せておくといい感じ。

## Japan
#Server = http://mirrors.cat.net/archlinux/$repo/os/$arch
#Server = https://mirrors.cat.net/archlinux/$repo/os/$arch
#Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch
#Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
#Server = https://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
```

### AURヘルパー
- [Arch User Repository - ArchWiki](https://wiki.archlinux.jp/index.php/Arch_User_Repository)
- [AURヘルパー - ArchWiki](https://wiki.archlinux.jp/index.php/AUR_%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC)

色々便利なものを導入できるようにAURヘルパーを導入しておく。調べた感じだと`yay`が人気みたい。

```
$ git clone https://aur.archlinux.org/yay
$ cd yay && makepkg -si --noconfirm && cd .. && rm -rf yay
```

### Bash
- [Bash - ArchWiki](https://wiki.archlinux.jp/index.php/Bash)

入力補完の強化のためにパッケージを導入しておく。(すぐにzshやfishにする人の方が多そうではあるけど。。)

```
$ sudo pacman -S bash-completion
```

### デスクトップ環境
- [Arch LinuxにGUIデスクトップ環境を構築する - クロの思考ノート](http://note.kurodigi.com/post-0-20/)
- [Xorg - ArchWiki](https://wiki.archlinux.jp/index.php/Xorg)
- [Budgie Desktop - ArchWiki](https://wiki.archlinux.jp/index.php/Budgie_Desktop)

GUIのデスクトップ環境を導入する。何となくBudgie Desktopにしてみた。
そのうちawesomeやxmonadなどのタイル型ウィンドウマネージャにしてみたい。。
あとはX Serverにしてしまっているけど、本当はWaylandの方がいいのかもしれないなとか思っていたり。。

まずはX Serverを導入。
CPUによってインストールするドライバが違うため、詳細は [Xorg#ドライバーのインストール - ArchWiki](https://wiki.archlinux.jp/index.php/Xorg#.E3.83.89.E3.83.A9.E3.82.A4.E3.83.90.E3.83.BC.E3.81.AE.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB) を参照。
自分の場合はIntel CPUのため、以下を導入。

```
$ lspci | grep -E "VGA|3D"
$ sudo pacman -S xorg-server xf86-video-fbdev xf86-video-vesa xf86-video-intel mesa xorg-xinit
$ sudo pacman -S xorg-twm xorg-xclock xterm
$ sudo startx

### exit で X を抜ける
```

Budgie Desktopを導入。GNOMEが必要なので一緒に入れる。
[2021/01/03 追記]
`gnome-screensaver`をインストールしないと、スクリーンロックが機能しませんでした。

```
$ sudo pacman -S budgie-desktop gnome gnome-screensaver
$ sudo systemctl enable gdm
$ vim ~/.xinitrc
```
```:~/.xinitrc
export XDG_CURRENT_DESKTOP=Budgie:GNOME
exec budgie-desktop
```
```
sudo reboot now
```

ユーザ選択後のパスワード入力画面で、右下の歯車(セッション設定)からBudgie Desktopを選択する。
(最初これがわからずドハマりしました。。。)

### 日本語環境
- [Arch Linuxインストール (デスクトップ環境・日本語化編) | X, GNOME, 日本語フォント, 日本語入力の設定 - 普段使いのArch Linux](https://www.archlinux.site/2016/03/arch-linux-x-gnome.html)
- [Arch Linuxに日本語環境を構築する - クロの思考ノート](http://note.kurodigi.com/post-0-19/)
- [国際化 - ArchWiki](https://wiki.archlinux.jp/index.php/%E5%9B%BD%E9%9A%9B%E5%8C%96)
- [IBus - ArchWiki](https://wiki.archlinux.jp/index.php/IBus)
- [Fcitx - ArchWiki](https://wiki.archlinux.jp/index.php/Fcitx)

日本語フォントにはIPAフォントを導入。

```
$ sudo pacman -S otf-ipafont
```

インプットメソッドにはfcitxを導入。

```
$ sudo pacman -S fcitx-im fcitx-mozc fcitx-configtool
$ vim ~/.xprofile
```
```:~/.xprofile
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
fcitx
```

システムロケールを日本語(ja_JP.UTF-8)に変更する。
GNOMEだと以下の`gsettings`コマンドを打たないと[fcitxが有効にならなかった](https://wiki.archlinux.jp/index.php/Fcitx#Ctrl.2BSpace_.E3.81.8C_GTK_.E3.81.AE.E3.83.97.E3.83.AD.E3.82.B0.E3.83.A9.E3.83.A0.E3.81.A7.E6.A9.9F.E8.83.BD.E3.81.97.E3.81.AA.E3.81.84)。

```
$ sudo localectl set-locale LANG=ja_JP.UTF-8
$ gsettings set org.gnome.settings-daemon.plugins.xsettings overrides "{'Gtk/IMModule':<'fcitx'>}"
$ sudo reboot now
```

### 時刻同期
- [chrony - ArchWiki](https://wiki.archlinux.jp/index.php/Chrony)
- [Japan — jp.pool.ntp.org](https://www.ntppool.org/zone/jp)

時刻同期にはChronyを選択。

```
$ sudo pacman -S chrony
$ sudo cp -p /etc/chrony.conf{,.org}
$ sudo vim /etc/chrony.conf
```
```:/etc/chrony.conf
### SPECIFY YOUR NTP SERVER に server を追加
server 0.jp.pool.ntp.org iburst
server 1.jp.pool.ntp.org iburst
server 2.jp.pool.ntp.org iburst
server 3.jp.pool.ntp.org iburst

### 以下はデフォルトで有効なはず
driftfile /var/lib/chrony/drift
rtconutc
rtcsync
```
```
$ cat /etc/chrony.conf | grep -vE "^[#;%\!]|^$"
$ sudo systemctl is-active systemd-timesyncd
inactive
$

$ sudo systemctl start chronyd
$ sudo systemctl enable chronyd
$ chronyc sources
```

### ファイアウォール
- [nftables - ArchWiki](https://wiki.archlinux.jp/index.php/Nftables)
- [Linuxにおける新たなパケットフィルタリングツール「nftables」入門 - さくらのナレッジ](https://knowledge.sakura.ad.jp/22636/)

ファイアウォールにはnftablesを選択。そのままで大丈夫そうなので特に設定は弄ってない。
(SSHのポート22が空いてるので、必要に応じて閉じた方が良いかも)

```
$ sudo pacman -S nftables
$ sudo systemctl is-active nftables
$ sudo systemctl start nftables
$ sudo systemctl enable nftables
$ sudo nft list ruleset
```

### アンチウィルス
- [ClamAV - ArchWiki](https://wiki.archlinux.jp/index.php/ClamAV)

ClamAVを入れてみた。

```
$ sudo pacman -S clamav
$ sudo systemctl start clamav-daemon
$ sudo systemctl enable clamav-daemon
$ su -
# freshclam

$ sudo systemctl start clamav-freshclam
$ sudo systemctl enable clamav-freshclam
$ curl https://www.eicar.org/download/eicar.com.txt | clamscan -
```

### ブラウザ
[ウェブブラウザ - ArchWiki]( https://wiki.archlinux.jp/index.php/%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA:%E3%82%A6%E3%82%A7%E3%83%96%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6)

Firefox、Chromium、Vivaldiなどをお好みで。

```
### Firefox
$ sudo pacman -S firefox firefox-i18n-ja

### Chromium
$ sudo pacman -S chromium

### Vivaldi
$ sudo pacman -S vivaldi
```

### DNSローカルキャッシュ
- [Pdnsd - ArchWiki](https://wiki.archlinux.jp/index.php/Pdnsd)

LinuxはDNSのキャッシュをローカルで持たないので、
pdnsdはBINDやdnsmasqなど違って、OS再起動後もキャッシュを保持するらしいので選択してみた。
設定ファイルは正直かなり適当にしているので、見直さないといけない気がしている。。

```
$ sudo pacman -S pdnsd
$ sudo cp -p /usr/share/doc/pdnsd/pdnsd.conf /etc/pdnsd.conf
$ sudo vim /etc/pdnsd.conf
```
```:/etc/pdnsd.conf
global {
	perm_cache=1024;
	cache_dir="/var/cache/pdnsd";
#	pid_file = /var/run/pdnsd.pid;
	run_as="pdnsd";
	server_ip = 127.0.0.1;  # Use eth0 here if you want to allow other
				# machines on your network to query pdnsd.
	status_ctl = on;
#	paranoid=on;       # This option reduces the chance of cache poisoning
	                   # but may make pdnsd less efficient, unfortunately.
	query_method=udp_tcp;
	min_ttl=15m;       # Retain cached entries at least 15 minutes.
	max_ttl=1w;        # One week.
	timeout=10;        # Global timeout option (10 seconds).
	neg_domain_pol=on;
	udpbufsize=1024;   # Upper limit on the size of UDP messages.
}

server {
 	label= "google";
 	ip = 8.8.8.8,8.8.4.4;  # Put your ISP's DNS-server address(es) here.
 #	proxy_only=on;     # Do not query any name servers beside your ISP's.
 	                   # This may be necessary if you are behind some
 	                   # kind of firewall and cannot receive replies
 	                   # from outside name servers.
 	timeout=4;         # Server timeout; this may be much shorter
 			   # that the global timeout option.
 	uptest=if;         # Test if the network interface is active.
 	interface=wlp1s0;    # The name of the interface to check.
 	interval=10m;      # Check every 10 minutes.
 	purge_cache=off;   # Keep stale cache entries in case the ISP's
 			   # DNS servers go offline.
 	edns_query=yes;    # Use EDNS for outgoing queries to allow UDP messages
 			   # larger than 512 bytes. May cause trouble with some
 			   # legacy systems.
 }
 
server {
	label= "myisp";
	ip = 192.168.1.1;  # Put your ISP's DNS-server address(es) here.
#	proxy_only=on;     # Do not query any name servers beside your ISP's.
	                   # This may be necessary if you are behind some
	                   # kind of firewall and cannot receive replies
	                   # from outside name servers.
	timeout=4;         # Server timeout; this may be much shorter
			   # that the global timeout option.
	uptest=if;         # Test if the network interface is active.
	interface=wlp1s0;    # The name of the interface to check.
	interval=10m;      # Check every 10 minutes.
	purge_cache=off;   # Keep stale cache entries in case the ISP's
			   # DNS servers go offline.
	edns_query=yes;    # Use EDNS for outgoing queries to allow UDP messages
			   # larger than 512 bytes. May cause trouble with some
			   # legacy systems.
}
```
```
$ sudo systemctl start pdnsd
$ sudo systemctl enable pdnsd
$ sudo systemctl status pdnsd
```

dhcpcdが`/etc/resolv.conf`を上書きするので、設定を変えておく。

- [ドメイン名前解決#DNS 設定の保護 - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA#DNS_.E8.A8.AD.E5.AE.9A.E3.81.AE.E4.BF.9D.E8.AD.B7)

```
$ sudo cp -p /etc/dhcpcd.conf{,.org}
$ sudo vim /etc/dhcpcd.conf
```
```:/etc/dhcpcd.conf
### ファイル末尾に追加

nohook resolv.conf
```

### man

`man`コマンドでコマンドオプションや設定ファイルについて調べようとしたら、なんとデフォルトでは入っていなかった…！

```
$ sudo pacman -S man
```