VMwareにArch Linuxをインストールしよう

# はじめに
仮想環境にさくっとArch Linuxをインストールしてみようという記事です。

# 準備
以下の2つは必ず用意しましょう。インストールディスクは多少古くてもどうせ最新版がインストールできるのでいちいち落とし直さなくてもいいかもしれません。

- [VMware Workstation Player](https://www.vmware.com/jp/products/player)
    - あるいはVMware Fusionなど
- [archlinux-20xx.xx.xx-dual.iso](https://jpn.mirror.pkgbuild.com/iso/latest/)

# 仮想マシンの作成
マシンスペックと相談して適当な仮想マシンを用意してください。今回は以下のような構成で作ってみました。

- HDD : 48GB
- RAM : 4GB
- CPU : 8 cores

# EFIモードへの切り替え
仮想マシンの設定ファイル`hoge.vmx`をテキストエディタで開いて、最終行に以下を付け足します。

```ini
firmware = "efi"
```


# リモートインストールの準備
仮想マシンにぽちぽちコマンドを打っていくのはつらいのでSSH経由でインストールします。rootのパスワードを設定し、sshdを起動して、ipアドレスを確認します。
 
```shell-session
# passwd
# systemctl start sshd
# ip a
```

以降はSSHクライアント側から作業をします。

# 時刻の設定
公式マニュアルではまず時刻を設定することを推奨しているので、ここで実施します。

```shell-session
# timedatectl set-ntp true
```

# ディスクの準備
EFI環境なので、EFI領域をまずは確保します。なお、RAMを4GB確保してあるので今回はSwapを作成しません。550MiBだけEFI領域を確保して、残りは全部rootパーティションにしてしまいます。

```shell-session
# parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
(parted) mkpart ESP fat32 1MiB 551MiB
(parted) set 1 boot on
(parted) mkpart primary btrfs 551MiB 100%
(parted) quit
Information: You may need to update /etc/fstab.
```

続いてディスクのフォーマットを行います。

```shell-session
# mkfs.vfat -F32 /dev/sda1
# mkfs.btrfs /dev/sda2
```

ディスクのマウントも行いましょう。


```shell-session
# mount /dev/sda2 /mnt
# mkdir /mnt/boot
# mount /dev/sda1 /mnt/boot
```

# ベースシステムのインストール
ミラーサイトの優先順位を変更して、日本のサーバーを優先的に見に行くようにします。Japanと書かれている行を先頭に移動させます。

```shell-session
# vim /etc/pacman.d/mirrorlist
```

また、pkgbuildのミラーが比較的速めなので、追加しておくと便利かもしれません。

```
Server = https://jpn.mirror.pkgbuild.com/$repo/os/$arch
```

続いてインストールに必要なものを全てインストールしてしまいます。

```shell-session
# pacstrap /mnt base base-devel linux linux-firmware btrfs-progs intel-ucode neovim dosfstools openssh ccache zsh zsh-completions zsh-syntax-highlighting
```

# 各種設定
起動に必要な設定を行っていきます。

まずはfstabを自動生成します。
 
```shell-session
# genfstab -U /mnt >> /mnt/etc/fstab
```

chroot環境に入りましょう。

```shell-session
# arch-chroot /mnt
```

`vim`コマンドでneovimが起動するようにエイリアスを貼っておきます。

```shell-session
# alias vim=nvim
```

日本時間でタイムゾーンをセットしておきます。
 
```shell-session
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# hwclock --systohc
```

ロケールを設定します。`en_US.UTF-8`と`ja_JP.UTF-8`の部分のコメントを外しておきます。

```shell-session
# vim /etc/locale.gen
```

locale-genを実行して反映させます。

```shell-session
# locale-gen
```

システムで使う言語を日本語に設定します。

```shell-session
# echo LANG=ja_JP.UTF-8 >> /etc/locale.conf
```

HostNameを設定します。`YOUR_HOSTNAME`の部分は自由に変えてください。

```shell-session
# echo YOUR_HOSTNAME >> /etc/hostname
```

`/etc/hosts`も編集してください。

```:/etc/hosts
127.0.0.1	localhost
::1		localhost
127.0.1.1	YOUR_HOSTNAME.localdomain	YOUR_HOSTNAME
```

rootのパスワードを設定します。

```shell-session
# passwd
```

ネットワーク起動を自動化します。

まずアダプタ名を調べます。`ip a`コマンドで調べてください。僕の環境ではens33でした。

その情報を元に設定ファイルを書きます。`/etc/systemd/network/wired.network`に以下のように記述してください。

```ini
[Match]
Name=ens33

[Network]
DHCP=yes
```

最後にsystems-netowrkdとsystemd-resolvedを有効にします。

```shell-session
# systemctl enable systemd-networkd
# systemctl enable systemd-resolved
```

# AUR周りの設定
後々使うことになるのでこれも最適な感じに設定しておきます。設定ファイルを開きましょう。

```shell-session
# vim /etc/makepkg.conf
```

CFLAGSとCXXFLAGSを以下のように変更します。

```bash
CFLAGS="-march=native -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
CXXFLAGS="${CFLAGS}"
```

MAKEFLAGSのコメントを外し、コンパイル時に用いるコア数を指定します。実コア数+1ぐらいがいいかも。

```bash
MAKEFLAGS="j9"
```

BUILDENVで「!」をつけて無効にされているccacheを有効にしておきます。

```bash
BUILDENV=(!distcc color ccache check !sign)
```

COMPRESSXZも並列で圧縮できるよう`-T 0`を加えておきます。

```bash
COMPRESSXZ=(xz -c -z - -T 0)
```

# ブートローダーの書き込み
EFI環境であることに留意して、作業します。といってもsystemd-bootを使うだけなので簡単です。以下のコマンドでインストール可能です。

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

起動のための設定ファイルを書きます。その前にまず`rootパーティション`のUUIDを調べましょう。

```shell-session
# blkid -s PARTUUID -o value /dev/sdxY
```

`<UUID>`の部分に↑のコマンドで調べた結果を記述してください。

```shell-session
# vim /boot/loader/entries/arch.conf
```

```
title          Arch Linux
linux          /vmlinuz-linux
initrd         /initramfs-linux.img
options        root=PARTUUID=<UUID> rw
```

選択画面の設定を書きます。既に何か書いてあるファイルですが、内容を消してしまっても大丈夫です。

```shell-session
# vim /boot/loader/loader.conf
```

```
default  arch
timeout  3
```

# ユーザーの作成
インストール後に使う一般ユーザーを作成します。`USER_NAME`の部分をお好きなものに変更してください。

```shell-session
# useradd -m -G wheel -s /bin/zsh USER_NAME
# passwd USER_NAME
```

sudoが使えるように設定しておきます。nvimで編集したいので環境変数を一時的に与えます。

```shell-session
# EDITOR=nvim visudo
```

以下の行のコメントを外すだけでOKです。

```bash
%wheel ALL=(ALL) ALL
```

# インストールの完了
chroot環境を抜けて再起動すれば終了です。リブート時に勝手にアンマウントしてくれるのでその辺は心配しなくて大丈夫です。

```shell-session
# exit
# reboot
```

再起動したらGUIが動くように設定していきます。

# リモート接続の確立
まずは仮想マシン側で先ほど作成した一般ユーザーでログインし、sshdを起動してIPアドレスを確認します。初回のsudoは説明が日本語で表示されるため文字化けしますが、気にせずパスワードを入力してください。

```bash
$ sudo systemctl start sshd
$ ip a
```

# systemd-resolvedの設定
このままだとDNS解決ができないので、設定していきます。

まずは`/etc/resolve.conf`をsystemdで用意した物に差し替えます。

```bash
$ sudo mv /etc/resolv.conf /etc/resolv.conf.orig
$ sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
```

続いて`/etc/nsswitch.conf`のdnsをresolvに書き換えます。

```bash
$ sudo sed -i -e 's/hosts: files dns/hosts: files resolve/g' /etc/nsswitch.conf
```

# .zshrcを仕込む
ちょっと作業がもたつくので自作の物にすり替えておきます。

```bash
$ curl -o ~/.zshrc https://raw.githubusercontent.com/aruneko/dotfiles/master/.zshrc
$ source ~/.zshrc
```

# リポジトリの編集
multilibが利用できるようにしましょう。設定ファイルを開きます。

```bash
$ sudo vim /etc/pacman.conf
```

multilibのコメントを外します。

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

あとはリポジトリを再読込しましょう。

```bash
$ sudo pacman -Syu
```

# yayの導入
今回はAURヘルパーとしてyeyを使いたいと思います。以下の手順で簡単に導入できます。最後にディレクトリを消していますが、この操作は任意です。

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

# VMware Toolsのインストール
とりあえず公式リポジトリのものを入れておけばOKです。X11と一緒に入れておきます。

```bash
$ yay -S xorg-server xorg-xinit open-vm-tools xf86-input-vmmouse xf86-video-vmware gtkmm3
```

バージョン情報を読み取れるようにしておきます。

```bash
$ su -c "cat /proc/version > /etc/arch-release"
```

関連サービスが起動時に立ち上がるように設定しましょう。

```bash
$ sudo systemctl enable vmtoolsd
$ sudo systemctl enable vmware-vmblock-fuse
```

時計はsystemdで同期します。
`/etc/systemd/timesyncd.conf`で、ntpサーバーのアドレスが指定可能です。各ネットワーク網に適したサーバーを指定してください。

```bash
$ sudo timedatectl set-ntp true
```

# デスクトップ環境のインストール
今回はCinnamonを使ってみることにします。端末エミュレーターにはsakuraを利用します。フォントも文字化けしないように日本語対応のものを入れておきましょう。

```bash
$ yay -S cinnamon cinnamon-translations lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings adobe-source-han-sans-jp-fonts adobe-source-han-serif-jp-fonts sakura
```

好みに応じて、下記記事を参考にCicaを入れても良いと思います。

[[For Archilinux] 手っ取り早く Cica v2 を使いたかったので AUR の PKGBUILD を以下のように編集して突っ込んだ。 ](https://gist.github.com/laughk/4ab42d1c6ac40af9fab063a07924f1ba)

lightdmが起動時に有効になるようにしておきます。
ついでにビットマップフォントも無効化します。残念な見た目になりますので。

```bash
$ sudo systemctl enable lightdm
$ sudo ln -s /etc/fonts/conf.avail/70-no-bitmaps.conf /etc/fonts/conf.d/
```

# GTKテーマの導入
お気に入りのテーマを入れておきます。今回はmateriaとpapirusと壁紙を導入します。

```bash
$ yay -S materia-gtk-theme papirus-icon-theme archlinux-wallpaper
```

# Fcitxの導入
日本語入力ができるようにしておきましょう。とりあえず関連ソフトウェアを導入します。

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

また、GTKやQtなどで有効になるように.xprofileを作成して以下の内容を書き込みます。

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

# その他必要なソフトウェアの導入
Firefoxとかjdkとかよく使うものをここで入れておきます。

```bash
$ yay -S firefox-i18n-ja alsa-utils
```

# おしまい
とりあえずこれで一通りは使えるようになります。

この後この環境をどう育てていくかはユーザー次第ですので、各自楽しみながら環境構築にいそしみましょう。