Arch Linux快適デスクトップ環境の構築

**2019年5月追記**
この記事は2013年に書かれた内容をベースにしており情報が古いです。
2019年版の Arch Linux 記事を書いたので、そちらを参照してください。
https://qiita.com/xorphitus/items/d543931ecd2c441e462f
編集リクエストの受付けもこれに伴い凍結いたします。

---

数年前、別の方がさらに数年前に買ったPCパーツを譲ってもらい、Arch Linuxを軽ーく入れて愛用していたのだが、とうとうお亡くなりに。

やけになって、今どき(?)なPCパーツを買ってやった。初UEFI。  
SSDも初だと思ったら、手持ちのMacBook Airに載っていた。

せっかくだから初LVMもしよう。

買ったもの

* CPU: Intel Core i7-4470K BOX / 34,980yen
* M/B: ASRock H87 Performance / 10,980yen
* Mem: ADATA AD3U1600W8G11-2 (Bulk) / 9,980yen
* SSD: Intel 520 SSDSC2CW120A3K5 / 14,980yen
* DVD Drive: LG GH24NS95+S (Bulk) / 1,980yen
* 電源ユニット: 玄人志向 KRPW-PT500W/92+ / 8,980yen
* ケース: ZALMAN Z9U3 / 5,800yen

total: 87,590yen (including tax, 2013/8/11)

メディアに`archlinux-2013.08.01-dual.iso`を焼いてそれをBoot。USBメモリではなく、CDやDVDを使うのがおすすめ。理由はこの後。

起動したら`Boot Arch Linux (x86_64)`を選択してインストール開始。


# キーボードレイアウト

個人的には不要。英語のままで十分。


# インターネット接続の確立

ping打ってみたら返ってきたので何もしなかった。


# ディスク周りのスタンバイ

## パーティション

ここからが本番。いくつか条件がある。

* UEFIなので`/boot`は512MB以上のVFat
* SSDでTrimを使うため、`/`は`Ext4`、`Btrfs`、`JFS`、`XFS`のいずれか

https://wiki.archlinux.org/index.php/Solid_State_Drives#TRIM

今回は

* `sda1`を512MBの`VFat`
* `sda2`を残り全容量の`Ext4` (おまけにLVM) とすることとした

まずは新規のディスクなので`o`をタイプし ( create a new empty GPT partition table) GUIDパーティションテーブルを作成する。

次いで`n` (add a new partition) をタイプする。ここでは

* Partition number 1 に 512MB
* Typeは、ef00 EFI System

を選択する。

再び`n`をタイプして

* partition number 2 に残り全部
* Type は 8e00 Linux LVM を選択

swapパーティションは不要。必要ならswapfileを使うし、またせっかくメモリが16GBもあるのでswapinessも下げる。

ここで`p` (print the partiotion table) で確認をする。

最後に`w` (write table to disk and exit) にてパーティショニング完了。


## LVM設定

https://wiki.archlinux.org/index.php/LVM

まずはLVMの物理ボリュームを作成する。

```
# pvcreate /dev/sda2
```

確認は

```
# pvdisplay
```

次にLVMのボリュームグループを作成する。

```
# vgcreate VolGroup00 /dev/sda2
```

確認は

```
# vgdisplay
```

全て`/`に割当てる。

```
# lvcreate -l +100%FREE VolGroup00 -n lvolroot
```

`-l`が割当量、`-n`が名前を指定するオプション。

ちなみにこれに失敗する場合は`modprov dm-mod`せよとArch Wikiにあったが、不要だった。

再度確認。

```
# lvdisplay
```

## ファイルシステムの構築

```
# mkfs.vfat -F32 /dev/sda1
# mkfs.ext4 /dev/mapper/VolGroup00-lvolroot
```


# ベースシステムのインストール

まずはマウントする。

```
# mount /dev/mapper/VolGroup00-lvolroot /mnt
# mkdir -p /mnt/boot
# mount /dev/sda1 /mnt/boot
```

なお、`sda1`は`/boot`ではなく`/boot/efi`にマウントするような話もちらほら出ているが

* https://bbs.archlinux.org/viewtopic.php?id=155030
* https://wiki.archlinux.org/index.php/UEFI_Bootloaders

`/boot/efi`はGRUB2の場合の模様。

ではインストール。まずは

```
# vi /etc/pacman.d/mirrorlist
```

にて

```
Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
```

をServerのリストの先頭行に配置する。その上で

```
pacstrap -i /mnt base base-devel
```

とする。

なお、インストール対象パッケージを選別したい場合は`-i`オプションは外すこと。

# システムの設定

## fstabの生成

```
# genfstab -U -p /mnt >> /mnt/etc/fstab
```

ここでSSDのために

```
# vi /mnt/etc/fstab
```

にて、各パーティションに`noatime`、`discard`のフラグをそれぞれ立てる。前者はジャーナルの無効化による書き込み回数減、後者はTrimの有効化による書き込みの性能劣化防止。

## ルート変更

```
# arch-chroot /mnt
```

## Localeの設定

```
# vi /etc/locale.gen
```

にて、次の2行のコメントアウトをそれぞれ外す。

```
en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8
```

続いて

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

## コンソールフォントとキーマップ

最初の時点で変えてないから不要

## タイムゾーン

```
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

## ハードウェアクロック

```
hwclock --systohc --utc
```

## ホストネーム

```
echo お好みのほすとねーむ > /etc/hostname
```

## ネットワーク設定

```
systemctl enable dhcpcd.service
```

## pacmanの設定

まずは

```
# vi /etc/pacman.conf
```

にて multilib のコメントアウトを外して32bitパッケージを利用可能にする。

```
# pacman -Sy
```

## initial ramdisk環境の作成

LVMでは必須の様子。

LVMを使っている場合にはrootファイルシステムを読み込もうにも、先にLVMの設定を読み込んでる必要がある。それをやるのがこの`initrd`の役割。

```
# vi /etc/mkinitcpio.conf
```

にて、`lvm2`を`HOOK`の`block`、`filesystems`の間に追加。順序に意味があるかは未調査だが、Arch Wikiに倣った。
https://wiki.archlinux.org/index.php/LVM#Add_lvm_hook_to_mkinitcpio.conf

最後に

```
# mkinitcpio -p linux
```

## rootパスワードの設定

```
# passwd
```

## ブートローダのインストールと設定

https://wiki.archlinux.org/index.php/UEFI_Bootloaders

デュアルブート対策で`Gummiboot`にしたが、冷静に考えたらArch以外のOSをこのマシンで起動する機会は自分にはなさそうだ…。
https://wiki.archlinux.org/index.php/Gummiboot

```
# pacman -S gummiboot
# umount /sys/firmware/efi/efivars
# modprove -r efivars
# modprove efivarfs
# mount -t efivarfs efivarfs /sys/firmware/efi/efivars
# gummiboot install
```

ちなみに`umount`はArch Wikiに合わせて行ったものの

```
umount: /sys/firmware/efi/efivars/: not mounted
```
と出てきたので、不要なステップだった。

```
# vi /boot/loader/loader.conf
```

にて、設定を変更。

```
default arch
timeout 4
```

続いて

```
# vi /boot/loader/entries/arch.conf
```

にて

```
title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options root=/dev/mapper/VolGroup00-lvolroot rw
```

## Gummibootインストール トラブルシュート記録 1

```
# gummiboot install
```

の時に

```
File system /boot is not an EFI ystem Partition (ESP)
```

と出てきた場合、パーティションのTypeの指定が誤っている。

`exit`、`umount`して、`gdisk`で`Partition number 1`のTypeを`ef00`で作りなおすこと。


## Gummibootインストール トラブルシュート記録 2

```
Not booted with EFI, skipping EFI variable setup.
```

と出てくる、または`/sys/firmware/efi/efivars`が存在してない場合。

結論から言うと、インストールメディアにUSBメモリはなくCD, DVDを使うことで回避可能。

こちらがヒントっぽい。
http://boronology.blogspot.jp/2012/10/arch-linux-on-uefi-arch201210.html

恐らくUEFIではなくBIOSから起動している扱いになっていることで`/sys/firmware/efi`が作成されていない？？？

MacBook AirでUSBメモリにisoを焼いて作業していたこともあり、上記エントリにならってUNetBootInを使うことにしたのだが、これが罠だっだ。起動しない。

```
Missing operating system.

Reboot and Select proper Boot device
or Insert Boot Media in selected Boot device and press a key
```

https://wiki.archlinux.org/index.php/USB_Installation_Media_(%E6%97%A5%E6%9C%AC%E8%AA%9E)#UNetbootin_.E3.82.92.E4.BD.BF.E3.81.86
によるとsyslinux.cfgを修正すればOKらしいので、その方針で進めてみたが結果は変わらず。

なお、最終的に自分はArchをUSBメモリから起動し、その環境でCDを焼き、そのCDをインストール用のメディアとして使うことで解決した。

```
# wget http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/2013.08.01/archlinux-2013.08.01-dual.iso
# pacman -Sy
# pacman -S cdrkit
# wodim -v -sao dev=/dev/cdrw archlinux-2013.08.01-dual.iso
```

## アンマウントとリブート

```
# exit
# umount /mnt/boot
# umount /mnt
# reboot
```

ここでCD、USBメモリを取り出す。

ちゃんと起動できることを確認

# デスクトップ機化への道のり

起動したらrootでログイン。

`LANG`に`ja_JP.UTF-8`を指定しているのためXが起動していないとコンソールが日本語を表示できずによく化ける。そこで

```
# export LANG=en_US.UTF-8
```

により、ASCIIだけの世界にしておく。

## パッケージの最新化

```
# pacman -Syu
```

## 個人ユーザ作成

```
# useradd -m {username}
# passwd {username}
# pacman -S sudo
# visudo
```

個人ユーザが`sudo`で色々できるようにするため、以下を記述する。

```
{username} ALL=(ALL) ALL
```

## Xの導入

```
# pacman -S xorg-server
```

~~Window Managerには軽量なOpenboxを採用。マシンスペックがよくなったというのに、あまり無駄な豪華さは求めていない。~~
-> Xmonad (Haskellで設定を記述するタイル型WM) に移行しました。

一応、Openbox導入のパッケージインストールコマンドを記述しておく。

```
# pacman -S openbox
```

最初に`libgl`に何を使うか質問されるが、`1) mesa-libgl`を選んでみた。

お守り的にxtermも入れておく。

```
# pacman -S xterm
```

## ドライバの導入

```
# lspci | grep VGA
```
とすると

```
00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06)
```

Intelの文字発見。というわけで

```
# pacman -S xf86-video-intel
```

ここで`pacman`後に出たメッセージに`/etc/X11/xorg.conf/20-intel.conf`がどうとかって出るけれど、このファイルは不要。
https://wiki.archlinux.org/index.php/Intel_Graphics_(%E6%97%A5%E6%9C%AC%E8%AA%9E)

## SLiMの導入

SLiMによって`startx`コマンドなしで起動時にXが立ち上がるようにする。

```
# pacman -S slim
# systemctrl enable slim.service
```

## SLiM トラブルシュート

`slim`コマンドを実行した時に

```
Faliled to execute loggin command
```

と出るのは、.xinitrc が書いてないことが原因なので、`/home/{username}/.xinitrc`に

```
#!/bin/sh
exec openbox-session
```

くらいを記述しておく。

## X トラブルシュート マウスとキーボードが利かない

`.xinitrc`にて、`exec openbox-session`の前に`exec xterm`とうっかり書いたのが問題だった。Shellの勉強足りてない…。
それを消したら上手くいった。

## 最低限必要な武器を導入

```
# pacman -S emacs zsh tmux openssl git vim
```

Githubから設定ファイル群をcloneする。

```
# git clone http://github.com/xxxxx/xxxxx.git
# dotfiles/setup.sh
```

## zshの導入

前項でインストールだけは終えているので、設定の変更。

```
$ chsh
```

対話でどのシェルにするか聞かれるので、`/bin/zsh` とする

加えてSLiMのzsh設定として、`/etc/slim.conf`に以下を編集をする。  

**コメントアウト**

```
login_cmd           exec /bin/sh - ~/.xinitrc %session
```

**追記**

```
login_cmd exec /bin/zsh -l ~/.xinitrc %session
```

## まっとうな日本語フォント

```
# yarourt -S ttf-ricty
```

## yaourt導入

**yaourtは開発が終了しています。**([Requesting official statement from developers · Issue #382 · archlinuxfr/yaourt](https://github.com/archlinuxfr/yaourt/issues/382))
下記から開発が継続しているパッケージマネージャーを使用してください。
[AUR ヘルパー - ArchWiki](https://wiki.archlinux.jp/index.php/AUR_%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC)

`/etc/pacman.conf`以下を追記

```
[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/$arch
```

そして

```
# pacman --sync --refresh yaourt
```

## 日本語入力

mozcを導入する。

`/etc/pacman.conf`以下を追記

```
[pnsft-pur]
SigLevel = Optional TrustAll
Server = https://osdn.net/projects/ponsfoot-aur/storage/pur/$arch
```

そして

```
# sudo pacman -Syy
# sudo pacman -S mozc ibus-mozc emacs-mozc
```

`~/.xinitrc`に以下を追記

```
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
ibus-daemon  --xim -d &
```

ここでIBusの設定をする。

```
$ ibus-setup
```

として、

* 「一般」タブからショートカットに「<Control>backslash」を設定
* 「インプットメソッド」タブからインプットメソッドに「Mozc」「English (US)」を追加

再起動する。

```
# sudo reboot
```

## 音の設定

```
# pacman -S alsa-utils
$ alsamixer
```

ここで`master`を1以上にする。

### alsaトラブルシュート

`alsamixer`を設定しても音が出ない場合。

参考

https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture#HDMI_output_does_not_work

```
$ aplay -l
```

にてカードとデバイスの番号を特定する。その番号が正しいかどうかは

```
$ aplay -D plughw:{card_id},{device_id} /usr/share/sounds/alsa/Front_Center.wav
```

で音が出るかどうかで判断する。

音の出る`car_id`、`device_id`を特定できたら、`~/.asoundrc`に以下を記述する。

```
pcm.!default {
  type hw
  card {card_id}
  device {device_id}
}
```

ちなみに、以下も試したがこの環境では効果がなかった。

オンボードのIntelサウンドカードで音が出ない  
https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture#No_sound_with_onboard_Intel_sound_card

```
echo blacklist snd_intel8x0m | sudo tee /etc/modprobe.d/modprobe.conf
```

## 必要なツールを導入

### コマンドライン充実系

**pacman**

* tree
* tig
* the_silver_searcher
* lsof
* source-highlight
* unzip
* xorg-xmodmap
* htop
* dstat
* iotop

**yaourt**

* jq

### GUI系ツール系

**pacman**

* terminator
* xpdf-japanese
* gpicview
* libreoffice
* libreoffice-ja
* gimp
* vlc
* hardinfo
* skype
* flashplugin
* tint2
* conky
* ~~obconf~~ -> xmonad移行に伴い不要に
* ~~obkey~~ -> xmonad移行に伴い不要に
* ~~obmenu~~ -> xmonad移行に伴い不要に
* firefox-i18n-ja

**yaourt**

* googe-chrome-beta
* dropbox-cli

`~/.xinitirc`に以下を追記。

```
dropboxd &
skype &
```

## デスクトップ通知

設定ファイルでいろいろ変更でき、かつシンプルな`dunst`にした。

```
# pacman -S dunst
$ mkdir ~/.config/dunst
$ cp /usr/share/dunstrc ~/.config/dunst/
```

`~/.xinitrc`には以下を記述。

```
dunst &
```

## 時計がおかしいので修正

```
# pacman -S ntp
# ntpd ntp.nict.jp
```

## 視覚効果

### 透過と壁紙設定

```
# yarourt -S compton
# pacman -S nitrogen
$ nitrogen {wallpapers_path}
```

`nitrogen`は壁紙設定のツールで、GUIが立ち上がる。

その上で`~/.xinitirc`に

```
nitrogen --restore &
compton &
```

を記述。

> transset-dfでterminator等の透過設定をする例もあるが使わない  
> terminatorの透過設定を使わないと、フォントも透過するため  
> ちなみにcomptonが入ってないとterminatorの透過設定が効かない

### テーマの設定

http://box-look.org/index.php  
からopenboxのテーマを落とす。NightLifeの3にした。

http://gnome-look.org/  
からgtk 2.xのテーマを落としてzip解凍して ~/.theme に設置。Paranoidにした。

http://gnome-look.org/  
から続いてアイコンと思ったら欲しいの (`faenza`) がレポジトリにあったので`pacman`で導入。

```
# pacman -S faenza-icon-theme
```

http://gnome-look.org/  
から続いてマウスのテーマを落とす。Obsidian Cursorにした。

GUIツール経由で設定をする。

```
# pacman -S lxappearance lxappearance-obconf
$ lxappearance &
```

これでウィジェット、アイコンテーマ、マウスカーソル、ウィンドウ境界を先ほど導入したものに設定。  
フォントの設定は全部一律で`Migu 1C 10`とそのBoldとした。

> ちなみに、Obsidian Cursorを設定しようとするとcoreを吐いて落ちたが
> その後は問題なく動作した

この時theme engineがないとエラーが出るので

```
# yaourt -S gtk-engine-murrine gtk-engine-equinox gtk-engines
```

で導入した。

ついでに`IBus`の設定でもフォントを`Migu 1C`にしておく。

> もともとはマウスカーソルを xcursor-silver-3d にしようと思っていたので  
> \# yaourt -S xcursor-silver-3d  
> としたのだがlxappearanceの画面に出てこなかった
> そこで gnome-look から tar.gz を落として lxappearance で食わせてみたがObsidian Cursor同様coreを吐いて落ちた  
> Obsidian Cursorとの違いは、その後の動作に支障が出た(選択画面に現れなかった)ことである


# おまけ

## SSDでパフォーマンスを出すために

こちらを参考

https://wiki.archlinux.org/index.php/Solid_State_Drives


## RealforceのDIPスイッチが効かない

全然関係ないけおど、RealforceのDIPスイッチ (1番)をONにしても、Ctrl, CapsLockが逆にならなかった。
試しに別のUSBポートに刺しかえたら上手くいった。何だったんだ…。