3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2020-12-05

前置き

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

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

Arch Linuxは公式Wikiがしっかりしていますし、調べればいっぱい情報は出てきます。
ただ、それでも自分の環境に合わせるためには、相当調べ回って色々と試行錯誤しました。
自分の備忘録としても、これから同じような環境でArch Linuxのインストールに挑む人のためにも、ここに手順を残しておくことにします。

Arch Linux インストール

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

インストールの準備

インストールメディアの作成

まずは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
/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
/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
/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

ブートローダー

使用している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
/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
~/.xinitrc
export XDG_CURRENT_DESKTOP=Budgie:GNOME
exec budgie-desktop
sudo reboot now

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

日本語環境

日本語フォントには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が有効にならなかった

$ 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
/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 -

ブラウザ

ウェブブラウザ - ArchWiki

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
/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
/etc/dhcpcd.conf
### ファイル末尾に追加

nohook resolv.conf

man

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

$ sudo pacman -S man
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?