🐇

そうだ、ArchLinuxを使おう

2025/01/02に公開

はじめに

この記事は、UEC Advent Calendar 2024 の 21 日目の記事です。
なお書いているのは、2025 年です。(なぜでしょうね...)

昨日はアルカリオスさんの 神奈川男子校御三家と算数入試問題 でした。

さて、この記事は

  • Linux 布教大会
  • ArchLinux 布教大会
  • 勢い余って zshrc 布教大会

の 3 本仕立てでお送りします。Linux に手を出して見ようと思っている人のきっかけ・参考になれば嬉しいです。

Linux を使おう

そもそも Linux って?

誤解と過激派を恐れずに言えば、この世界の OS は Windows 系と Unix 系に分類することができます。
Windows 系はみなさんご存知 Windows シリーズのことですね。(7 あたりまでは好きだったんですが、11 になって本当に嫌いになった
一方、Unix 系には macOS 、Linux や BSD などがあります。

今回擦っていく Linux は Unix をベースとし、世界中の開発者たちによって開発や修正が行われているオープンソースのオペレーティングシステムです。
The Linux Foundation という団体が開発を主導しています。

https://www.linuxfoundation.org/

Linux はいいぞ

読者の皆さんは少なからず開発をされる方だと思いますが、環境構築に苦しめられたという経験を多くの方がお持ちではないでしょうか?
特に Windows を使っていると、苦行でしかないはずです。

例えば Windows で C 言語の環境構築を行うことを考えましょう。

  • まず、MinGW とかいうソフトウェアをインストール
  • MinGW に含まれる gcc にパスを通す
  • シェルで文字化けが起きるので修正し...

のように、一つの言語の環境を構築するだけでも一苦労です。(これを何言語分も行わなければいけないなんて、まさに地獄です
私は中学生の時、Windows でひたすら開発していたので環境構築が大嫌いでした。(手順通りにやってもうまくいかないなんてこともザラ)

一方、Linux で C 言語の環境構築をして m...なんともう入ってます(Linux は C 言語で作られているのでデフォルトで C 言語が動きます)。
あら便利。C 言語以外で、入っていないパッケージをインストールする際も、

debian系の場合
$ apt install hoge

のように一瞬で終わらせることができます。パスとかも勝手に通してくれる。

これからわかるようにエンジニアにとって Linux はとても優しい OS なんです。

WSL という選択肢はある。

さて、いきなりパソコンに Linux を入れる、というのはハードルが高いかもしれません。
そんな場合は、WSL(Windows Subsystem for Linux)なんかを使うと良いかもしれません。

WSL は「謎の技術」を使って Windows 上で Linux を使えるようにしてくれている、割と神機能です。
WSL の初代は結構不自由なところが多かったり不安定でしたが、最近の WSL 2 になって、ネイティブの Linux と比べても遜色がないレベルまで安定してきています。

https://learn.microsoft.com/ja-jp/windows/wsl/install

ArchLinux はいいぞ

本題に入りましょう、ArchLinux についての話です。
ArchLinux は Linux のディストリビューション(ディストロ)の一つです。

ディストロというのは、Linux カーネル(Linux の素)とさまざまなソフトウェアやツールなどをまとめて配布しているものです。
有名なものだと Ubuntu などがあります。WSL にデフォルトで入ってくるのは Ubuntu ですね。

数多くあるディストロの中でも Arch

  • 最初の状態でほとんどパッケージが入っていないため、自分が欲しいものを取捨選択しながら入れやすい
  • ローリングリリースという小規模なアップデートを繰り返していくため、大型アップデートで OS を入れ直すようなことがない

のような特徴があります。

https://archlinux.org/

では、私の特に Arch をおすすめする理由を見ていきましょう。

インストールするだけで色々学べる

ArchLinux をインストールしようとすると気づくのですが、全てのインストールの手順を自分で踏まなければなりません。

  • インストールメディアを作成
  • ライブ環境で入る
  • インターネットに接続
  • パーティションを作成してフォーマット
  • pacstrap でカーネルやその他のツールをインストール
  • chroot して各種設定を行い reboot

のように、他のディストロであればインストーラーが自動でやってくれることを自分で全てやる必要があります。(archinstall とかいう悪のコマンドを使うという選択肢はありますが...)
これだけではなく、ブートローダーやディスプレイマネージャ、デスクトップ環境なども自分でセットアップしなければなりません。

ArchLinux をインストールするだけで、パソコンに関する知識に多方面から触れることができ勉強になるので非常におすすめです。また、わからないことは調べてみないとインストールがなにも進まないので、とにかく調べる、という癖もつくと思います。

そんな時に、ArchWiki が非常に便利です。

https://wiki.archlinux.org/title/Main_page

基本的に ArchLinux のことで何か詰まったらここに解決策が載っているし、別のディストロを使っていてもパッケージの情報などが非常に豊富なのでとても重宝します。控えめに言って人類の宝です。
わからないことがあればとりあえず ArchWiki を見てみて、それでも解決しないなら Stack Overflow のようなところを漁ってみるみたいな立ち回りは結構おすすめできます。

AUR が優秀

Linux のディストロにはパッケージマネージャという、パッケージ(ソフトウェアなど)を管理してくれるツールが付いています。
人力でやってもいいように見えますが、依存関係という「A というパッケージでは B のバージョン〇〇以上が必要」みたいなちょっとめんどくさいことを、自動で解決してくれたりする優れものです。
Linux でパッケージを入れるときは、基本的にパッケージマネージャを使って入れます(そうじゃない人もたまにいますが...)

しかし、一般的なディストロのパッケージマネージャで入れられるのは、公式のリポジトリに登録されているパッケージのみなんです。困りました。公式リポジトリに登録されていないパッケージを入れたい時はどうしたら良いんでしょうか。
もちろんパッケージマネージャを使わずに入れることもできますが、依存関係の解消がめんどくさいです。
Debian 系の apt というパッケージマネージャを使っている場合、リポジトリを手動で追加してインストールすることで事なきを得られます。でも、手動でリポジトリを追加するのはちょっと手間です。

さて、Arch を見てみましょう。Arch には、Archlinux User Repository(AUR) というとんでもなく便利なものがあります。これは Arch Linux のコミュニティーによって管理されているリポジトリで、基本的に我々が普段使うようなパッケージは全てここに載っています。素晴らしいですね。
さらに、この AUR からパッケージをインストールしてきてくれる、AUR ヘルパーというものがあります。有名なものだと、yay や paru があげられます。

AUR ヘルパーで Google Chrome をインストールする場合

$ yay -S google-chrome

のようにコマンドを一つ叩くだけで完了です。

各種パッケージを入れる際、「Installation」の「Arch」の欄だけすごく短いのをみると優越感に浸ることができます(?)

さらにパッケージのアップデートなんかも全て AUR ヘルパーで管理していると簡単に行えます。
巷では、「今日の yay」なんて言葉があるくらいです。(毎日アップデートをしている)

$ yay

# 今日のyay、これだけでアップデートが必要なパッケージがアップデートされる

ナンカカッコイイ

さて、一番大事な(?)ポイントです。「なぜ Arch を使うのか?」という問いに対して最も強い回答は「なんかかっこいいから」だと思います。

「は?」と思いましたよね?私も思います。

でも、「なんかかっこいい」というモチベーションで ArchLinux を使ってみるのは案外悪くないと思います。
Linux について少しだけ詳しくなりますし、自分で取捨選択しながらパッケージを入れて環境を作り上げていくのでパッケージに関する知識もついてくるので。

突如始まる zshrc 布教大会

ところで、ArchLinux もとい Linux を使っていると、シェル(bash や zsh などの黒い画面)と向き合うことが非常に多くなると思います。
そうすると、シェル周りをカスタマイズしたくなってくるわけです。

...え?そんなことはない?
ウルセェ!!!俺がしたいんだよ!!!!!

この章では私の zshrc を一部紹介しながらおすすめのパッケージについてみていこうと思います。

zinit

zsh のプラグインを管理するツールです。軽いという理由だけで使っています。それだけです。

https://github.com/zdharma-continuum/zinit

zinit を使って、シンタックスハイライトをしてくれるプラグインだったり

$ zinit light zsh-users/zsh-syntax-highlighting

補完をしてくれるプラグインを入れていたりします。

$ zinit light zsh-users/zsh-autosuggestion

powerlevel10k

ガキなので、ターミナルはいっぱいで凝りたいんですよね。そんな人に powerlevel10k というプラグインをおすすめしています。

p10k

こんな感じでカーソル周りをオシャレにしてくれます。

https://github.com/romkatv/powerlevel10k

これももちろん zinit で入れています。

$ p10k configure

とすることで、対話形式で見た目のカスタマイズを簡単にすることができます。

eza

ls コマンドをちょっと高機能にしてくれるやつです。rust 製です。
ちょっと前まで、exaというパッケージがあったのですが、色々あって終了したのでフォーク版の eza を使いましょう。

alias ls = eza --icons --git --time-style relative

のように設定することで、カラフルでアイコンもついたちょっとオシャレな ls にしています。

eza

こんな感じ。

履歴周り

export HISTFILE=${HOME}/.config/zsh/.zsh_history
export HISTSIZE=1000
export SAVEHIST=100000
setopt hist_ignore_dups

setopt inc_append_history
setopt share_history

setopt hist_ignore_all_dups
setopt hist_save_no_dups
setopt hist_expire_dups_first
setopt extended_history

履歴をファイルに保存しておくことで、シェルを終了した後やシェル同士で履歴をやり取りすることができます。
補完と一緒に使うと結構便利です。

その他適当なオプション

脳死で setopt しています。何個かわかんないやつもありますが...(よくない)

setopt auto_param_slash

setopt auto_cd
setopt auto_param_keys

setopt mark_dirs
setopt auto_menu

setopt correct

setopt interactive_comments
setopt magic_equal_subst

setopt complete_in_word

setopt print_eight_bit

setopt no_beep
全設定を見たい人はどうぞ

汚くてすいません。
変なエイリアスとかパッケージとかの設定もありますが無視してください。

#  ---
# Homebrew
# ---
eval "$(/opt/homebrew/bin/brew shellenv)"

# ---
# p10k config
# ---
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
source ~/.config/p10k/powerlevel10k.zsh-theme
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
typeset -g POWERLEVEL9K_INSTANT_PROMPT=quiet
typeset -g POWERLEVEL9K_INSTANT_PROMPT=off

# ---
# zinit config
# ---
# Created by newuser for 5.9

### Added by Zinit's installer
if [[ ! -f $HOME/.local/share/zinit/zinit.git/zinit.zsh ]]; then
    command mkdir -p "$HOME/.local/share/zinit" && command chmod g-rwX "$HOME/.local/share/zinit"
    command git clone https://github.com/zdharma-continuum/zinit "$HOME/.local/share/zinit/zinit.git" && \
fi

source "$HOME/.local/share/zinit/zinit.git/zinit.zsh"
autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit

# Load a few important annexes, without Turbo
# (this is currently required for annexes)
zinit light-mode for \
    zdharma-continuum/zinit-annex-as-monitor \
    zdharma-continuum/zinit-annex-bin-gem-node \
    zdharma-continuum/zinit-annex-patch-dl \
    zdharma-continuum/zinit-annex-rust

### End of Zinit's installer chunk

# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

# zinit ice wait'0'; zinit light zsh-users/zsh-completions
autoload -Uz compinit && compinit

zstyle ':completion:*:default' menu select=2
zstyle ':completion:*' matcher-list '' 'm:{[:lower:]}={[:upper:]}'

zstyle ':completion:*' format '%B%F{blue}%d%f%b'
zstyle ':completion:*' group-name ''

zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}

setopt auto_param_slash

setopt auto_cd
setopt auto_param_keys

setopt mark_dirs
setopt auto_menu

setopt correct

setopt interactive_comments
setopt magic_equal_subst

setopt complete_in_word

setopt print_eight_bit

setopt no_beep

autoload -Uz history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end

# ---
# zinit plugins
# ---
zinit light zsh-users/zsh-syntax-highlighting
zinit light zsh-users/zsh-autosuggestions

# ---
# history
# ---
export HISTFILE=${HOME}/.config/zsh/.zsh_history
export HISTSIZE=1000
export SAVEHIST=100000
setopt hist_ignore_dups

setopt inc_append_history
setopt share_history

setopt hist_ignore_all_dups
setopt hist_save_no_dups
setopt hist_expire_dups_first
setopt extended_history


# ---
# grc config
# ---
[[ -s "/usr/local/etc/grc.zsh" ]] && source /usr/local/etc/grc.zsh

# ---
# alias
# ---
alias python=python3

alias vim=nvim
alias v=nvim

alias zshrc='v ~/.zshrc'

alias ls='eza --icons --git --time-style relative'
alias ll='eza -l --icons --git --time-style relative'
alias la='eza -a --icons --git --time-style relative'
alias lla='eza -la --icons --git --time-style relative'
alias lal='eza -la --icons --git --time-style relative'

alias nw='sudo systemctl restart NetworkManager'

alias mips='spim -file'

alias dev="cd ~/Documents/develop"

alias annet="~/.windows/annet.sh"

# for C lang alias
alias a=./a.out

alias ssh="TERM=xterm /usr/bin/ssh"

alias "?"="ghcs"

# volta path
export VOLTA_HOME="$HOME/.volta"
export PATH="$VOLTA_HOME/bin:$PATH"
export PATH="$VOLTA_HOME/bin/yarn:$PATH"
export PATH="$VOLTA_HOME/bin:$PATH"

# proto path
export PROTO_HOME="$HOME/.proto"
export PATH="$PROTO_HOME:$PROTO_HOME/shims:$PROTO_HOME/bin:$PATH"

# perl path
PATH="$HOME/perl5/bin${PATH:+:${PATH}}"; export PATH;

PERL5LIB="$HOME/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5LIB;
PERL_LOCAL_LIB_ROOT="$HOME/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}"; export PERL_LOCAL_LIB_ROOT;
PERL_MB_OPT="--install_base \"$HOME/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=$HOME/perl5"; export PERL_MM_OPT;

# pyenv/virtualenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init --path)"
fi

# fzf
export FZF_LEGACY_KEYBINDINGS=0
eval "$(gh copilot alias -- zsh)"

# verylup
export PATH="$HOME/.cargo/bin:$PATH"

# ni for node package manager
source $HOME/Utilities/cli-tools/ni.zsh

export HOMEBREW_CASK_OPTS=--no-quarantine

おわり

スクショや zshrc から薄々気づいている方々もいらっしゃるかもしれませんが...

「あれ...?こいつ Mac 使ってね...?」

はいそうです、すいません。ArchLinux を偉そうに布教する記事を Mac で書いています。
この間まではメインで ArchLinux を使ってました。が、流石に古くて苦しかったので、処理能力・バッテーリの持ちその他諸々の理由により MacBook Pro M4 をつい最近買いました。

macbook

メイン機だった ThinkPad には ArchLinux+Hyprland を入れて遊ぶ予定ですので許してください。

...というわけで、ArchLinux を布教する記事でした。
この記事を読んでちょっとでも気になった方、ぜひ ArchLinux を始めてみてください!

明日はつまみさんの AI つまみアイコンを支える技術 AI 抜き (予定) です。AI 生成つまみアイコン、割とクオリティが高いので記事にも期待ですね!ぜひ読んでみてください!
ではまた。

GitHubで編集を提案

Discussion