前置き
特別定額給付金の使い道をどうしようかと考えていた折にYouTubeで以下の動画を見て、自作PCを組むことにしました。
前々からLinuxマシンが欲しかったのもあり、OSはLinuxを選択。
せっかくPCを組むならOSも自作感溢れるものが良かろうと、ディストリビューションはArch Linuxにすることにしました。
(Gentooはさすがに勇気が出ず。。あとはNixOSも面白そうで迷いました。)
使い始めてまだ数ヶ月ですが、とても快適で楽しいです。Arch Linuxを弄っているだけで無限に時間が溶けていく。。
Arch Linuxは公式Wikiがしっかりしていますし、調べればいっぱい情報は出てきます。
ただ、それでも自分の環境に合わせるためには、相当調べ回って色々と試行錯誤しました。
自分の備忘録としても、これから同じような環境でArch Linuxのインストールに挑む人のためにも、ここに手順を残しておくことにします。
Arch Linux インストール
主に以下の記事を参考にしました。
本記事の章立ては基本的にArchWikiのインストールガイドに沿って作成しています。
- インストールガイド - ArchWiki
- Arch Linuxをインストールする - クロの思考ノート
- [Arch Linuxインストール (OSインストール編)| UEFI, GPT, XFSを使用してインストール - 普段使いのArch Linux] (https://www.archlinux.site/2016/03/arch-linux-uefi-gpt-xfs.html)
- Arch Linux インストール俺々式完全版 - Qiita
- ArchLinuxのインストール(3つのブート方式ごとの設定) - Qiita
- arch linux + LVM + UEFI + GPT なインストール手順 - Qiita
- Arch Linuxインストール(無線LANで) : LUKS, LVM, UEFI - Qiita
インストールの準備
インストールメディアの作成
まずはArch Linuxをダウンロードし、USBに書き込む。
自分はWindowsだったので、Rufasを使用。パーティション構成はGPTを選択。
Live環境を起動
USBメモリからArch LinuxのLive環境を起動。この時点では有線LANで接続しておくのが良いかも。
本当はこの時点から無線LANで作業できれば良かったのですが、自分の場合はドライバの問題で接続できず。。
キーボードレイアウト
デフォルトはUS配列になっているため、使用しているキーボードによって設定変更を行う。
# ls /usr/share/kbd/keymaps/**/*.map.gz
# loadkeys jp106
起動モードの確認
UEFIで起動していることを確認
# ls /sys/firmware/
acpi devicetree dmi efi memmap
#
# efivar -l
インターネットへの接続
ネットワークインタフェースが有効になっていることを確認。
# ip link show
# ping -c 3 archlinux.jp
無線LANの設定
ドライバの確認。
自分の場合は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
#
ドライバに問題なければ、以下で接続できるはず。
# 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
#
パーティション
自分は以下のようにしてみました。
パーティション | 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
タイムゾーン
日本のタイムゾーンに設定し、ハードウェアクロックも合わせておく。
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# hwclock --systohc --utc
# timedatectl status
ロケール
システムロケールの設定を行う。後ほど日本語フォントを入れるので、一旦英語(en_US.UTF-8)にしておく。
# ls -l /etc/locale.gen
# cat /etc/locale.gen | grep -vE "^#|^$"
# vim /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
ネットワーク設定
ホスト名を設定する。
# echo myhostname > /etc/hostname
# vim /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
自分の場合は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
# 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
### どちらかのコメントアウトを解除する(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
ブートローダー
使用している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
環境設定
ここから先は主に以下を参考にしています。
ネットワーク
無線LANに接続する。
自分の場合はlinux-firmware
導入前はドライバでエラーが起きていたので、解消されたかを確認しています。
$ 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
を自動で上書きするため、気にする場合は事前にバックアップしておく。
# 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
### 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ヘルパー
色々便利なものを導入できるようにAURヘルパーを導入しておく。調べた感じだとyay
が人気みたい。
$ git clone https://aur.archlinux.org/yay
$ cd yay && makepkg -si --noconfirm && cd .. && rm -rf yay
Bash
入力補完の強化のためにパッケージを導入しておく。(すぐにzshやfishにする人の方が多そうではあるけど。。)
$ sudo pacman -S bash-completion
デスクトップ環境
GUIのデスクトップ環境を導入する。何となくBudgie Desktopにしてみた。
そのうちawesomeやxmonadなどのタイル型ウィンドウマネージャにしてみたい。。
あとはX Serverにしてしまっているけど、本当はWaylandの方がいいのかもしれないなとか思っていたり。。
まずはX Serverを導入。
CPUによってインストールするドライバが違うため、詳細は Xorg#ドライバーのインストール - ArchWiki を参照。
自分の場合は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
export XDG_CURRENT_DESKTOP=Budgie:GNOME
exec budgie-desktop
sudo reboot now
ユーザ選択後のパスワード入力画面で、右下の歯車(セッション設定)からBudgie Desktopを選択する。
(最初これがわからずドハマりしました。。。)
日本語環境
- Arch Linuxインストール (デスクトップ環境・日本語化編) | X, GNOME, 日本語フォント, 日本語入力の設定 - 普段使いのArch Linux
- Arch Linuxに日本語環境を構築する - クロの思考ノート
- 国際化 - ArchWiki
- IBus - ArchWiki
- Fcitx - ArchWiki
日本語フォントにはIPAフォントを導入。
$ sudo pacman -S otf-ipafont
インプットメソッドにはfcitxを導入。
$ sudo pacman -S fcitx-im fcitx-mozc fcitx-configtool
$ vim ~/.xprofile
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
fcitx
システムロケールを日本語(ja_JP.UTF-8)に変更する。
GNOMEだと以下のgsettings
コマンドを打たないとfcitxが有効にならなかった。
$ 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を選択。
$ sudo pacman -S chrony
$ sudo cp -p /etc/chrony.conf{,.org}
$ sudo vim /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を選択。そのままで大丈夫そうなので特に設定は弄ってない。
(SSHのポート22が空いてるので、必要に応じて閉じた方が良いかも)
$ sudo pacman -S nftables
$ sudo systemctl is-active nftables
$ sudo systemctl start nftables
$ sudo systemctl enable nftables
$ sudo nft list ruleset
アンチウィルス
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 -
ブラウザ
Firefox、Chromium、Vivaldiなどをお好みで。
### Firefox
$ sudo pacman -S firefox firefox-i18n-ja
### Chromium
$ sudo pacman -S chromium
### Vivaldi
$ sudo pacman -S vivaldi
DNSローカルキャッシュ
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
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
を上書きするので、設定を変えておく。
$ sudo cp -p /etc/dhcpcd.conf{,.org}
$ sudo vim /etc/dhcpcd.conf
### ファイル末尾に追加
nohook resolv.conf
man
man
コマンドでコマンドオプションや設定ファイルについて調べようとしたら、なんとデフォルトでは入っていなかった…!
$ sudo pacman -S man