ArchLinuxにHyprlandを入れる

# 𝑨𝒓𝒄𝒉 𝑳𝒊𝒏𝒖𝒙 𝑯𝒚𝒑𝒓𝒍𝒂𝒏𝒅 𝑰𝒏𝒔𝒕𝒂𝒍𝒍 𝑩𝒂𝒕𝒕𝒍𝒆

https://x.com/mcbeeringi/status/1748754240456282180

# 目的
- デュアルブート
    - Arch Linux
    - Windows11
- Hyprland
    - Wayland縛り
- メイン機として実用可能な設定をする

# 環境
```
CHUWI MiniBook X N100
     OS: Windows11
    CPU: Intel N100
    RAM: 12GB
    ROM: 512GB
    KEY: jp106
```


機種固有の問題として`6.7.3 ~ 6.8.2`はカーネルのバグで画面が正しく表示されない
- OK: 2024.02.01 (6.7.2)
- NG: 2024.03.29 (6.?.?)
- NG: 2024.04.01 (6.8.2)

https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10334

# 概要
## Arch Linux

https://archlinux.org

ミニマルで軽快なLinuxディストリビューション
欲しいものだけ入れられる
コミュニティ製含めて膨大な数のパッケージがインストール可能

## Hyprland

https://hyprland.org

Waylandタイリングウィンドウマネージャ
自動でウィンドウを配置してくれる
アニメーションぬるぬる見た目良し
デスクトップ環境一式入れるより軽快に動作
GNOME, KDE Plasma, に次いで使われているらしい

# 𝑰𝒏𝒔𝒕𝒂𝒍𝒍 𝑩𝒂𝒕𝒕𝒍𝒆
## ブートメディア準備
1GB程度以上の空のSDやUSBメモリ等を用意

https://archlinux.org/download/

からisoをダウンロード
Windowsなら
```sh
scoop install extras/rufus
# 等でrufusを入手、メディアに書き込み
```
Linuxなら
```sh
dd bs=4M if=archlinux-x.y.z-x86_64.iso of=/dev/sdx conv=fsync oflag=direct status=progress
```

## Windows準備
### パーティション縮小
ディスクの管理(Win+X K)を開く
CとかDとかNTFSとか書いてあるパーティション
右クリック>ボリュームの縮小

### Bitlockerの解除
時間がかかるので注意
設定>検索>Bitlocker>暗号化を解除

### RTCのUTC化
```winbatch
reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f
```
### 高速起動無効化
コントロールセンター > 電源 > 電源ボタンの動作を変更する
高速起動のチェックボックスを外す

### then
- シャットダウン
- ブートメディアを接続
- 起動時にF2等でBIOSに入る

## BIOS準備
### 高速起動 & セキュアブート無効化
Bootセクションにある
### then
- Boot Override等でブートメディアから起動
    - 同じ端末が複数ある場合はUEFIの記述がある方
- 黒地に白のメニューが出たらEnter
- コピー中のバーが伸び切ったらブートメディア抜いてOK

## Arch Linuxインストール
### 最低限準備
```zsh
loadkeys jp106 # 日本語配列キーボード
# echo 1 | tee /sys/class/graphics/fbcon/rotate_all # 必要であれば画面回転
```
### ネットワーク準備
有線の場合既に接続されているはず
無線の場合はiwctlする
```zsh
iwctl
    station wlan0 connect SSID
    station wlan0 status # 確認したかったら

ping archlinux.org # 確認
timedatectl # NTPで時刻同期
```

### (pacman準備)
通常は不要だが署名関係のエラーが出たらこれ
```zsh
rm -rf /etc/pacman.d/gnupg
pkill gpg-agent
pacman-key --init
pacman-key --populate archlinux
```
さらに転けたら
```zsh
pacman-key --refresh-keys
```

### (画面暗くしたい)
```zsh
pacman -Sy brightnessctl
brightnessctl s 10%
```

### パーティション準備
EFIとswapとroot用に3つパーティションを作成
```zsh
lsblk # 確認
#NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
#nvme0n1     259:0    0 476.9G  0 disk 
#├─nvme0n1p1 259:1    0   100M  0 part 
#├─nvme0n1p2 259:2    0   128M  0 part 
#├─nvme0n1p3 259:3    0  88.9G  0 part 
#└─nvme0n1p4 259:4    0   1.7G  0 part 

cfdisk /dev/nvme0n1 # パーティションを切る
# [New] 550M (/dev/nvme0n1p4)
# [Type] EFI system
# [New] 16G (/dev/nvme0n1p5)
#   大体RAMの1.5倍の容量にする
# [Type] Linux swap
# [New] 好きなだけ (/dev/nvme0n1p6)
# [Write] yes

lsblk # 確認
#NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
#nvme0n1     259:0    0 476.9G  0 disk 
#├─nvme0n1p1 259:1    0   100M  0 part 
#├─nvme0n1p2 259:2    0   128M  0 part 
#├─nvme0n1p3 259:3    0  88.9G  0 part 
#├─nvme0n1p4 259:4    0   550M  0 part 
#├─nvme0n1p5 259:5    0    16G  0 part 
#├─nvme0n1p6 259:6    0 369.6G  0 part 
#└─nvme0n1p7 259:7    0   1.7G  0 part 

# フォーマット
mkfs.fat -F 32 /dev/nvme0n1p4
mkswap /dev/nvme0n1p5
mkfs.ext4 /dev/nvme0n1p6

# マウント
mount /dev/nvme0n1p6 /mnt
mount --mkdir /dev/nvme0n1p4 /mnt/boot
swapon /dev/nvme0n1p5

lsblk # 確認
#NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
#nvme0n1     259:0    0 476.9G  0 disk 
#├─nvme0n1p1 259:1    0   100M  0 part 
#├─nvme0n1p2 259:2    0   128M  0 part 
#├─nvme0n1p3 259:3    0  88.9G  0 part 
#├─nvme0n1p4 259:4    0   550M  0 part /mnt/boot
#├─nvme0n1p5 259:5    0    16G  0 part [SWAP]
#├─nvme0n1p6 259:6    0 369.6G  0 part /mnt
#└─nvme0n1p7 259:7    0   1.7G  0 part 

```

### インストール
```zsh
pacman -Sy archlinux-keyring # 古いiso対策
pacstrap -K /mnt base linux linux-firmware intel-ucode intel-media-driver efibootmgr sudo nano git base-devel iwd bluez bluez-utils
```

### 設定
```zsh
genfstab -U /mnt >> /mnt/etc/fstab # マウント構成を保存
cp /etc/systemd/network/* /mnt/etc/systemd/network # ネットワーク構成を複製
arch-chroot /mnt # インストール先に入る (chroot)

# ロケール設定
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
hwclock --systohc # 時刻同期 システム→PC本体
nano /etc/locale.gen # en_US.UTF8とja_JP.UTF8の行の#を外す
locale-gen
echo LANG=ja_JP.UTF-8 >> /etc/locale.conf
echo KEYMAP=jp106 >> /etc/vconsole.conf
echo ホスト名 >> /etc/hostname # 好きな名前

# ユーザー設定
passwd # rootのパスワードを設定
useradd -m -g wheel ユーザー名 # sudoが使えるユーザーを作成
passwd ユーザー名 # ユーザー名 のパスワードを設定
nano /etc/sudoers  # Defaults env_keep += "HOME"　と　%wheel ALL=(ALL:ALL) ALL の#を外す

# ブートローダのインストールと設定, ハイバネートと起動画面の設定
bootctl install
nano /boot/loader/loader.conf
# default arch.conf
# timeout 3
# console-mode keep
# editor no
cp /etc/fstab /boot/loader/entries/arch.conf
nano /boot/loader/entries/arch.conf
# title   Arch Linux
# linux   /vmlinuz-linux
# initrd  /intel-ucode.img
# initrd  /initramfs-linux.img
# options quiet splash
# options resume=UUID=f724f97e-dd4d-4a90-9f20-b55fab378786 # swapパーティションのUUID
# options root=UUID=982b66f8-a687-4711-a36b-e0817456019f rw # rootパーティションのUUID
# # options video=DSI-1:panel_orientation=right_side_up # 必要であれば画面回転
nano /etc/mkinitcpio.conf
# HOOKSにplymouthとresumeを追記
# HOOKS=(base plymouth udev ... filesystems resume fsck)
pacman -S plymouth

# その他
nano /etc/pacman.conf
# Color と VerbosePkgLists と ParallelDownloads=5 の行の # を外す
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf # DNS設定
# echo nameserver 1.1.1.1 >> /etc/resolv.conf # あんまり良くない設定?
systemctl enable systemd-networkd systemd-resolved iwd systemd-timesyncd bluetooth # 次回起動時からネットワーク等を有効化

exit # インストール先から抜ける (chroot)
```

### then
無事に起動することを祈って
```zsh
reboot
```
設定したユーザーでログイン
`iwctl`でネットに接続
```zsh
export LANG=C # 英語に戻す
```

## Hyprlandインストール
### yayインストール
コミュニティパッケージ(AUR)を入れるのが楽になる
```zsh
git clone https://aur.archlinux.org/yay-bin
cd yay-bin
makepkg -si # インストール
cd ..
rm -rf yay-bin
yay -Sy # パッケージ情報を最新のものに更新
``` 

### Hyprlandのインストールと設定
```zsh
yay -S hyprland mako pipewire pipewire-pulse pipewire-jack xdg-desktop-portal-hyprland xfce-polkit qt5-wayland qt6-wayland
yay -S waybar hyprpaper wofi cliphist grimblast brightnessctl

yay -S greetd greetd-tuigreet-bin # ログイン画面
yay -S thunar gvfs tumbler ffmpegthumbnailer # ファイルマネージャ
yay -S foot # ターミナル
yay -S gnome-keyring # キーリング
yay -S htop btop powertop smartmontools wlsunset wl-mirror # ユーティリティ
yay -S noto-fonts noto-fonts-cjk noto-fonts-emoji otf-monaspace # フォント
yay -S hyprlock hypridle # ロック画面 自動ロック
yay -S iwgtk pavucontrol nwg-look-bin gnome-themes-extra qt5ct qt6ct # GUI関係
yay -S fcitx5-im fcitx5-mozc # 日本語入力

Hyprland
# Meta(Win)+Mで終了 戻らない場合はカーソル動かす
nano .config/hypr/hyprland.conf
# $terminal = foot
# $fileManager = thunar
# exec-once = fcitx5 -d & mako & /usr/lib/xfce-polkit/xfce-polkit
# exec-once = hyprpaper & hypridle & waybar & wlsunset -l 35.7 -L 139.7 # 東京の座標
# exec-once = wl-paste --watch cliphist store
# input {
#   kb_layout = jp
# }

sudo nano /etc/greetd/config.toml
# [default_session]
# command = "tuigreet"
systemctl enable greetd # pipewire-pulse
reboot
```
fcitxの設定でjp106キーボードとmozcを選択しておく

### pamの設定
```zsh
sudo nano /etc/pam.d/greetd
# #%PAM-1.0

# auth       required     pam_securetty.so
# auth       requisite    pam_nologin.so
# auth       include      system-local-login
# auth       optional     pam_gnome_keyring.so # 追加
# account    include      system-local-login
# session    include      system-local-login
# session    optional     pam_gnome_keyring.so auto_start # 追加

sudo nano /etc/pam.d/passwd
# ...
# password	optional	pam_gnome_keyring.so
```

## dotfiles
[`McbeEringi/dotfiles`](https://github.com/mcbeeringi/dotfiles)より要約して抜粋
```text:面倒だったらこれ
yay -S chezmoi
chezmoi init mcbeeringi
chezmoi apply
```

以下を書き足せば最低限使える状態にはなる


```sh:.profile
export PATH=$PATH:$HOME/.local/bin
export XMODIFIERS=@im=fcitx
```

```conf:.config/hypr/hypridle.conf
general {
	before_sleep_cmd = hyprlock --immediate
	ignore_dbus_inhibit = false
}

listener {
	timeout = 60
	on-timeout = brightnessctl -s --exponent=2 s 10%-
	on-resume = brightnessctl -r
}

listener {
	timeout = 300
	on-timeout = hyprlock
}

listener {
	timeout = 600
	on-timeout = systemctl suspend
}
```

```conf .config/hypr/hyprland.conf
# exit menu
bind = $mainMod, M, exec, eval $(echo -e "hyprlock --immediate ;: lock\nhyprctl dispatch exit ;: logout\nsystemctl poweroff ;: power\nreboot\nsystemctl suspend\nsystemctl hibernate"|wofi -d -k /dev/null -p "exit..." -r "echo '%s'|awk 'NF{printf \"%%s\",\$NF}'")
# cliphist menu
bind = $mainMod, V, exec, cliphist list | wofi -d -p "clipboard..." | cliphist decode | wl-copy
# wl-mirror menu
bind = $mainMod, P, exec, wl-mirror -F $(echo -e $(hyprctl -j monitors)|jq -r '.[].name'|wofi -d -k /dev/null -p "mirror..." -r "printf %s")

...

# media
$v_tgt = @DEFAULT_AUDIO_SINK@
$v_notify = && notify-send -u low -t 1000 -h string:x-canonical-private-synchronous:anything V "$(wpctl get-volume $v_tgt|awk '{print $2*100 "% " $3}')"
bindl  = , XF86AudioMute, exec, wpctl set-mute $v_tgt toggle $v_notify
bindle = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 $v_tgt 5%+ $v_notify
bindle = SHIFT, XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 $v_tgt 1%+ $v_notify
bindle = SHIFT, XF86AudioLowerVolume, exec, wpctl set-volume $v_tgt 1%- $v_notify
bindle = , XF86AudioLowerVolume, exec, wpctl set-volume $v_tgt 5%- $v_notify
bindle = , XF86MonBrightnessUp, exec, brightnessctl --exponent=2 s +5%
bindle = SHIFT, XF86MonBrightnessUp, exec, brightnessctl --exponent=2 s +1%
bindle = SHIFT, XF86MonBrightnessDown, exec, brightnessctl --exponent=2 s 1%-
bindle = , XF86MonBrightnessDown, exec, brightnessctl --exponent=2 s 5%-
bindl  = , XF86AudioNext, exec, playerctl next 
bindl  = , XF86AudioPlay, exec, playerctl play-pause 
bindl  = , XF86AudioPrev, exec, playerctl previous
bindl  = , print, exec, grimblast copy output
bindl  = SHIFT, print, exec, grimblast copy area
```

```conf:.config/hypr/hyprlock.conf
general {
	hide_cursor = true
	grace = 5
}

background {
	path = screenshot
	blur_size = 8
	blur_passes = 1
}
```

```jsonc:.config/waybar/config.jsonc
{
	"layer":"top","position":"top",

	"modules-left":["hyprland/workspaces","group/apps"],
	"modules-center":["clock"],
	"modules-right":["mpris","tray","network","wireplumber","backlight","cpu","memory","battery"],

	"group/apps":{
		"orientation":"inherit",
		"modules":["hyprland/window","wlr/taskbar"],
		"drawer":{"transition-left-to-right":false}
	},
	"hyprland/window":{"format":"{class}"},
	"wlr/taskbar":{
		"all-outputs":true,
		"on-click":"activate"
	},

	"clock":{
		"format":"{:%y-%m-%d %H:%M}",
		"locale":"C.UTF8",
		"tooltip-format":"{calendar}"
	},

	"battery":{
		"format":"<small>B</small>{icon}",
		"format-charging":"<small>C</small>{icon}",
		"format-notcharging":"<small>N</small>{icon}",
		"format-low":"{capacity}",
		"tooltip-format":"Battery: {capacity}%\n{timeTo}","format-time":"{H}:{m}",
		"states":{"high":100,"_":95,"low":15},
		"format-icons":["\u2800","⡀","⣀","⣄","⣤","⣦","⣶","⣷","⣿"]
	},
	"memory":{
		"format":"<small>M</small>{icon}","tooltip-format":"RAM: {percentage}%\n\nUsed: {used}G\nTotal: {total}G",
		"format-icons":["\u2800","⡀","⣀","⣄","⣤","⣦","⣶","⣷","⣿"]
	},
	"cpu":{
		"format":"<small>P</small>{icon}",
		"format-icons":["\u2800","⡀","⣀","⣄","⣤","⣦","⣶","⣷","⣿"]
	},
	"backlight":{
		"format":"<small>L</small>{icon}","tooltip-format":"Luminance: {percent}%","reverse-scrolling":true,
		"format-icons":["\u2800","⡀","⣀","⣄","⣤","⣦","⣶","⣷","⣿"]
	},
	"wireplumber":{
		"format":"<small>V</small>{icon}","tooltip-format":"Volume: {volume}%","reverse-scrolling":-1,
		"format-icons":["\u2800","⡀","⣀","⣄","⣤","⣦","⣶","⣷","⣿"],
		"on-click":"pavucontrol"
	},
	"network":{
		"format-wifi":"<small>W</small>{icon}",
		"format-ethernet":"<small>E</small>",
		"tooltip-format":"{ipaddr}",
		"tooltip-format-wifi":"{essid}\n{ipaddr}",
		"format-linked":"<small>?</small>",
		"format-disconnected":"<small>NC</small>",
		"on-click":"iwgtk",
		"format-icons":["\u2800","⡀","⣀","⣄","⣤","⣦","⣶","⣷","⣿"]
	},
	"mpris": {
		"format":"<small>{title}</small>",
		"tooltip-format":"{dynamic}",
		"dynamic-order":["title","artist","album"],
		"title-len":4,
		"ellipsis":""
	}
}

```

```css:.config/waybar/style.css
/*
https://docs.gtk.org/gtk3/css-properties.html
*/
@define-color k0 #222; /*背景*/
@define-color k2 alpha(@k0,.5);
@define-color k3 alpha(@k0,.2);

@define-color w0 #fff; /*文字色*/
@define-color w3 alpha(@w0,.2);
@define-color a alpha(#6ca,.5); /*アクセント*/
@define-color u alpha(#f44,.5); /*警告*/

*{
	font-family:monospace,sans-serif;font-size:16px;color:@w0;transition:.2s;
	margin:0;outline:none;border:none;padding:0;background:none;
	box-shadow:none;text-shadow:none;-gtk-icon-shadow:none;
}

#waybar>box,tooltip,menu{margin:{{.gap}}px;margin-bottom:0;border:{{.border_width}}px solid;border-radius:{{add .border_radius .border_width}}px;background-color:@k2;border-color:@k3;}
tooltip>*{margin:{{mul .border_width 2}}px;}menu{padding:{{.border_width}}px;}
#waybar.battery-low>box{background-color:@u;}

.module,button,menuitem,separator,#tray>*{border-radius:{{sub .border_radius 2}}px;}
.module,menuitem{margin:2px;}radio{margin:8px;}
menuitem{padding:2px;}separator{padding:1px;}
button,#tray image{padding:0 8px;}.module>label,label.module{padding:0 4px;}
:hover,separator,radio{background-color:@w3;}
button.active,button.focused,radio:checked{background-color:@a;}
#tray>.needs-attention{background-color:@u;}

#battery.high.charging,#battery.high.full{background-color:@a;}
.muted,.paused,.stopped{opacity:.5;}
#taskbar,#tray{background-color:@w3;}
#workspaces{background-color:@k3;}
```

```conf:.config/wofi/config
show=drun
width=480
height=480
prompt=launch...
normal_window=true
allow_images=true
insensitive=true
# single_click=true
```

```conf:.config/electronXX-flags.conf
# Code - OSSやDiscord を Waylandで起動する
# XXをElectronのバージョンで置換
--enable-features=WaylandWindowDecorations
--ozone-platform-hint=auto
--enable-wayland-ime
```

### トラブルシュート
- VSCode(Code - OSS)がキーリングを認識しない
  ```zsh
  sed -E 's/\/\/.*//'|jq '.+={"password-store":"gnome-libsecret"}'
  ```
- mp3のサムネイル(id3)が表示されない
  ```zsh
  cat <<EOF | sudo tee /usr/share/thumbnailers/custom_mpeg.thumbnailer
  [Thumbnailer Entry]
  TryExec=ffmpegthumbnailer
  Exec=ffmpegthumbnailer -i %i -o %o -s %s
  MimeType=audio/mpeg
  EOF
  ```
- thunarのこの場所でターミナルを開くがだめ
  `sudo nano .config/xfce4/helpers.rc`を編集
- wofiでCLIアプリを選んでも起動しない
  ```zsh
  sudo ln -s /usr/bin/foot /usr/bin/gnome-terminal
  ```