archLinux
adventcalendar2013


はじめに。そのまえに。

この記事は本来2013年のアドベントカレンダーとして公開されたものだった。このたび(2019年2月)この記事に編集リクエストがあったので(yaourtは開発が終了しているので他のPacmanヘルパを使うべきだという点。もちろんそのとおりだ)その部分はそのまま採用させてもらうことにした。

あわせてyaourtを使ったサンプルもすべて書き直すべきだったのかもしれないが、そもそもこの記事は5年も前のに書かれたものであって変化の激しいArchにおいては本来参照されるべきではないはずだ。そういう言い訳のもと、この記事の内容は歴史的な記述として残すことにした。決して以下の記述を今に通用するものと思わないようにお断りしておく。

この記事に限らず情報は常に陳腐化しているおそれがある。Archの情報は常に更新されるArch WikiやForumを参照するのが望ましい。


はじめに

Arch Linuxをお使いの皆様、こんにちは。そうでない皆様は今日からArch Linux使いになりましょう。ディストリビューションとパッケージマネージャのアドベントカレンダー、本日はArch Linuxとそのパッケージマネージャ「Pacman」について簡単にお話をしようとおもいます。Arch未経験者〜Arch初心者向けの記事となります。


あなたがArchを選ぶ理由


シンプルさと最小主義のバランス

Arch Linuxはシンプルさと最小主義を両立させた柔軟なディストリビューションです。インストールに必須なパッケージはほぼ最小限に絞りこまれ、そこから好みに応じてカスタマイズできます。カスタムロボみたいなディストロです。それでいて一度インストールしたあとの面倒臭さも抑えられています。


最新のパッケージ

おそらくどのディストリビューションより早く各種パッケージの更新がやってくるのはArchです。たとえばWineなどは公式リリース当日にパッケージ化されてリポジトリに上がっています。youtube-dlに至っては毎日のように更新されています。あ、また新しいのが落ちてきた。


ローリング・リリース

Archは一度インストールしたら通常のアップデートの繰り返しだけで常に最新に保てます。UbuntuやFedoraのような半年おきのバージョンアップというものはありません。Debian Sidでもいいんじゃない?


バニラ

Archのパッケージは原則としてパッチをあてないバニラのソースからビルドする方針になっています。Arch固有の問題が起きにくいということでもあります。ちなみにカーネルには3つパッチを当てていますが、ほんの小さなものですね。


充実したWiki

Linux界の『家庭の医学』、Arch Wikiがあります。Linuxの基本から応用まで、また様々なソフトウェアの解説とトラブルシューティングがまとめられた一大マニュアルです。Linuxで困ったことがあったらその状況にArch Wikiをくっつけてググりましょう。まあArch以外でも役立つんですけどね。


豊富なパッケージ

公式リポジトリで配布されるバイナリパッケージは約10000、それに加えてAUR(Arch User Repository)でビルドスクリプトが配布される非公式パッケージが45000程度あります。大抵のソフトウェアは見つかることでしょう。もし見つからないソフトウェアがあり、あなたがそれを使っているなら投稿することもできますし、投票が集まれば公式パッケージ入りすることもありえます。


シンプルなビルドシステム

パッケージがバイナリで配布されてるのはわかりました、でも自分でビルドしたいんです!という人も安心してください、ABS(Arch Build System)があります!ArchのビルドシステムはPKGBUILDというシェルスクリプトを基本とした(簡単な!)ファイルを元にソースのダウンロードから展開、コンパイルからパッケージ化までを1つのコマンドだけでさくっとやってくれます。公式のパッケージは全てこのPKGBUILDが同時に配布されています。


んじゃ欠点は?


破壊的変更

Archが「ちょっとコンビニ行ってくる」くらいのノリでシステムの変更をかけるのは有名な話です。最近だとこんな例がありますね。


  • 2013-09-17 /etc/sysctl.conf廃止

  • 2013-06-03 バイナリを全て/usr/binに移動

  • 2013-03-25 公式リポジトリで配布するDBをMySQLからMariaDBに置き換え(MySQLは非公式へ)

  • 2013-03-01 パッケージ名qtをqt4に変更(qt5に向けて)

  • 2012-11-04 initscriptsサポート終了

  • 2012-10-30 ConsoleKitをlogindに置き換え

こう見えて大したことはないので耐えましょう。その都度解説はしてくれています。


永遠の不安定版

Arch WikiにEnhancing Arch Linux Stabilityという項目があります。その程度には不安定であるという認識が広まっているわけですが、実の所個人で使う上で問題が起きることはそうそうありません。まともに動かないパッケージが落ちてきたことはここ1年で1回しかありません。サーバーなどに使うにはあまりにも早い更新間隔とシステムの変更は不便でしょうが、それでもarchlinux.orgのサーバーはArchで動いているそうです。


というわけで本題、パッケージマネージャとビルドシステムを見てみよう


pacmanとyaourt

Archのパッケージマネージャはpacmanです。インストール、アンインストール、検索、依存関係の解決など必要十分な機能がありますが、これ単体では非公式リポジトリのAURを直接扱うことができないので非公式のパッケージマネージャyaourtを導入してみましょう。これはpacmanのフロントエンドとして動作するもので、公式リポジトリと非公式リポジトリを一括して管理でき、また本来なら手動でビルドしなければならない非公式リポジトリのパッケージを自動でビルドすることもできます。基本的な使い方はmanを見てください。

まずはpacmanが見に行くリポジトリを追記しましょう。/etc/pacman.confに記述します。


/etc/pacman.conf

[archlinuxfr]

SigLevel = Optional
Server = http://repo.archlinux.fr/$arch

最低限記述するのは[]で囲まれたリポジトリ名、それからサーバーです。SigLevelは信頼性チェックのレベルで、Optionalは「署名があればチェックする」です。Neverにすると署名チェックはスルーされ、Requiredだと署名がないのはハネられます。

sudo pacman -Syy #ローカルのデータベースを強制的に更新します。

sudo pacman -S yaourt #yaourtをインストール

これでyaourtが使えるようになりました。なおpacman -Syyは「ローカルのデータベースを強制的に更新」します。通常は「リモートに更新があればローカルも更新する」pacman -Syで十分ですが、今回はリポジトリを追加したためSyyが必要です。


早速何かインストールしてみましょう。

そうですね、パッケージをビルドするのに最低限必須なのを入れてしまいましょう。base-develはパッケージをビルドするのに最小限必要とされるパッケージ群です。

yaourt -Syu #ローカルのデータベースを更新し、パッケージもアップグレードする

yaourt -S base-devel #base-develグループのパッケージをインストール

Archでは一部のパッケージだけを更新するというのは非推奨です。ちょくちょく最新にしていきましょう。ここで「あれ?さっきまでsudoつけてたけどいらないの?」と思う人がいるかもしれません。はい、不要です。yaourtは必要なときにだけパスワードを聞きに来てくれます。便利ですね。非公式だけど。


ビルドシステム

ではArchのシステムでパッケージを自前ビルドしてみましょう。まずわかりやすそうなパッケージで試してみます。nanoなんてどうでしょう。まずはビルドスクリプトを入手します。


ABS(Arch Build System)

まずはArchとして正しい方法から。ローカルにはABS Treeというビルドスクリプトの置き場所があります。これをリモートに合わせて更新しましょう。


/etc/abs.conf


……
$ REPOS=(core !extra !community !multilib !testing !community-testing !multilib-testing !staging !community-staging !gnome-unstable !kde-unstable)
……


何も考えずに更新するとリモートの全てのリポジトリのビルドスクリプトを取得してきてしまうので必要なものだけを選択します。/etc/abs.confを開きREPOSの項目を編集しましょう。!を先頭につけたリポジトリは無視されます。ここではnanoパッケージのぶんがほしいのでcoreリポジトリだけ!を外します。

$ sudo abs

これで/var/abs/core以下にcoreリポジトリのパッケージ全てのビルドスクリプトがダウンロードされました。ここで作業するのは怖いので適当な場所にコピーしてきましょう。

$ cp /var/abs/core/nano ~/abs/


それ、yaourtなら楽だよ

代わりにyaourtを使えば-Gでカレントディレクトリにビルドスクリプトを落としてこれます。絶対こっちのほうが楽です。

$ yaourt -G nano


ビルド、その前に

手元でビルドするからには最適化したバイナリを吐きたいですよね?CPU全部使い切りたいですよね?そのあたりを設定しましょう。/etc/makepkg.confで詳細な設定ができますが、とりあえずこのくらいを決めておけばいいでしょう。


/etc/makepkg.conf

CFLAGS="-march=native -mtune=native -O2 -pipe -fstack-protector --param=ssp-buffer-size=4"

CXXFLAGS="-march=native -mtune=native -O2 -pipe -fstack-protector --param=ssp-buffer-size=4"
MAKEFLAGS="-j4"

もちろんdistccを使う人はnativeを使わないようにご注意ください。

ちなみに全くおすすめはできませんが


/etc/makepkg.conf

export CC=clang

export CXX=clang++

を記述することでClangでパッケージのビルドができるようです。挑戦者の方はお試しあれ。何が起きても責任はとれません。


PKGBUILD

先ほど用意した落としてきたnanoディレクトリに移動しましょう。すると2つのファイルがあります。


PKGBUILD

nano.install


重要なのはPKGBUILD、これを中心にしてパッケージが作られます。

pkgname=nano

pkgver=2.2.6
pkgrel=2
pkgdesc="Pico editor clone with enhancements"
arch=('i686' 'x86_64')
license=('GPL')
url="http://www.nano-editor.org"
groups=('base')
depends=('ncurses' 'sh')
backup=('etc/nanorc')
install=nano.install
source=(http://www.nano-editor.org/dist/v2.2/${pkgname}-${pkgver}.tar.gz)
md5sums=('03233ae480689a008eb98feb1b599807')

build() {
cd ${srcdir}/${pkgname}-${pkgver}
./configure --prefix=/usr \
--sysconfdir=/etc \
--enable-color \
--enable-nanorc \
--enable-multibuffer \
--disable-wrapping-as-root
make
}

package() {
cd ${srcdir}/${pkgname}-${pkgver}
make DESTDIR=${pkgdir} install
install -DTm644 ${srcdir}/${pkgname}-${pkgver}/doc/nanorc.sample ${pkgdir}/etc/nanorc
}

先頭部分はこんな感じになっています。まるっきりシェルスクリプトですね!

pkgnameはnano、そのままですね。続いてバージョン(開発元でのバージョン)とリリース(このビルドスクリプトが該当バージョンで何番目か)。dependsに指定するのは動作に必要なパッケージ、もしビルドにだけ必要で動作に必要のないパッケージならmakedependsに指定します。sourceは使用するソースコードのパスを指定します。ここに指定しておけばビルド時に自動でダウンロードから種類を判別して展開までしてくれます。md5sumは指定しておけば自動でsourceが正しいかのチェックを行います。md5チェックサムは既知の脆弱性があるためあんまり推奨されてはいないのですが、実際のところほとんどのパッケージはmd5を使ってます。

あとはbuild関数は見ての通りビルドするだけ、package関数はビルドされたバイナリを${pkgdir}以下の指定の場所にinstallするだけの関数ですね。うん、わかりやすいじゃないですか。ビルドオプションを変更したかったらここを書き換えましょう。

じゃあinstall=nano.installは?こちらのファイルを見てみましょう。


nano.install

infodir=/usr/share/info

filelist=(nano.info.gz)

post_install() {
[ -x usr/bin/install-info ] || return 0
for file in ${filelist[@]}; do
install-info $infodir/$file $infodir/dir 2> /dev/null
done
}

post_upgrade() {
post_install $1
}

pre_remove() {
[ -x usr/bin/install-info ] || return 0
for file in ${filelist[@]}; do
install-info --delete $infodir/$file $infodir/dir 2> /dev/null
done
}


こちらもシェルスクリプトですね。インストールやアップグレード後の処理、あるいはアンインストール時の手続きが記述されています。大抵はゴミを残さないようにお掃除をしたり設定ファイルを更新したりという処理が書かれており、これをもとにpacmanが始末を行います。


じゃあビルドしてみよう

$ makepkg

ぽちっとな。これであとはフルオートです。自動で依存関係が確認され→sourceで指定されたファイルをダウンロードし→md5で整合性をチェックし→(あれば)prepareで事前の処理を行い→(あれば)build関数が呼ばれ→package関数が呼ばれ→依存関係をまとめたファイルを作り→圧縮してパッケージの形にします。

package関数はfakerootで実行され、この場合${pkgdir}を~/abs/nano/pkgとしてここにインストールしたことにします。ビルドが終わったあとのディレクトリを見てみるとまるっきりそのままに~/abs/nano/pkg/usr/bin/nanoだとか~/abs/nano/pkg/usr/share/man/man1だとかが置かれていますね。

これにnano.installや依存関係を元にしたファイルを付け加えた上で圧縮されnano-2.2.6-2-x86_64.pkg.tar.xzというパッケージが出来上がるわけです。


インストールとアンインストール

$ yaourt -U nano-2.2.6-2-x86_64.pkg.tar.xz

これで手元でビルドしたパッケージをインストールできます。

アンインストールしたいときは

$ yaourt -R nano

するとインストールしたファイルを逆回しで削除したりアンインストール後の処理をしたり、はたまた依存でくっついてきたのを処理したりしてくれるわけです。言うならば「パッケージマネージャで管理できるようになった野良ビルド」といった感じですね。


発展編その一、カーネルをビルドしてみよう

nanoなんてあんまり使わないパッケージより、もっとビルドしたいという需要のありそうなものをやってみましょう。そう、カーネルです。

$ yaourt -G linux

スクリプトを落としてきてPKGBUILDを編集しましょう。

pkgbase=linux               # Build stock -ARCH kernel

#pkgbase=linux-custom # Build kernel with a different name
_srcname=linux-3.12
pkgver=3.12.1
pkgrel=3
……

まずリポジトリにあるカーネルのパッケージと衝突しないようにパッケージ名を変えましょう。pkgbaseをもとにpkgnameが生成されるのでpkgbase=linuxをpkgbase=linux-noraとでもしておきましょう。それからカーネルというとconfigを弄りたいですよね。PKGBUILDの下のほうを見ていくとbuild関数の中に……

build() {

cd "${srcdir}/${_srcname}"

# get kernel version
make prepare

# load configuration
# Configure the kernel. Replace the line below with one of your choice.
#make menuconfig # CLI menu for configuration
#make nconfig # new CLI menu for configuration
#make xconfig # X-based configuration
#make oldconfig # using old config from previous kernel version
# ... or manually edit .config
……

ありました。好きなののコメントアウトを外しましょう。僕はxconfigを使います。あとは特に変えることはないでしょう。保存してmakepkgを実行すればxconfigで設定を行う以外なにもしなくてもカーネル、ヘッダー、ドキュメントの3つのパッケージが出来上がります。あとはそれをインストールするだけでOK。簡単ですね。


発展編そのニ AURのパッケージをインストールしてみよう

AURのパッケージをインストールしてみましょう。ただしここに一つ注意があります。AURは非公式のパッケージ群です。保障はありませんし、Archのシステムの変更についていっていない可能性もあります。

まずはそういう心配のないフォントなんてどうですか?Archの公式リポジトリにある日本語フォントはさざなみ明朝と花園明朝しかありませんし綺麗なフォントはQOLの上昇に貢献します。


yaourtで全自動

まずはVL Gothicを入れてみましょう。パッケージ名はなんでしょうか。検索はpacmanでもyaourtでも-Ssですが、yaourtはAURのパッケージも横断検索してくれます。


$ yaourt -Ss vl gothic

aur/ttf-vlgothic 20130607-1 (197)

Japanese TrueType fonts from Vine Linux


ありました。ttf-vlgothicというパッケージ名のようです。

$ yaourt -S ttf-vlgothic

これでyaourtがビルドスクリプトを落としてきて、ユーザーにPKGBUILDほかを編集するか尋ね、そのあと自動でmakepkgを走らせたうえでインストールまで進めてくれます。


半手動

しかし全部をyaourtに任せる方法はちょくちょく失敗します。そういうときは公式リポジトリのパッケージの自前ビルドと同じ方法をとりましょう。今度はターミナルフォントの定番Rictyを入れてみます。

$ yaourt -G ttf-ricty

$ makepkg
$ yaourt -U ttf-ricty......

yaourtはAURのビルドスクリプトも-Gで持ってきてくれます。後は全く同じですね。makepkgした時に「依存するパッケージがないぞ」と怒られることがあります。そういう時はmakepkg -sを実行すればpacmanを呼び出して解決してくれます。ちなみにmakedependsにAURにしかないパッケージが指定されていることもありますが、この時はあきらめて手動で導入しましょう。


全手動

yaourtを使いたくない人もいるはずですし、それでもAURのパッケージを使いたいということもあるでしょう。もちろんAUR以外でPKGBUILDが公開されていてそれを使いたいということもあるでしょう。そういう時はどうすればいいのでしょうか?

要はPKGBUILDほかがあればいいのです。AURのサイトなりどこかなりから落としてきて、あとはmakepkgしてpacmanでインストールするだけです。


最後に

Archは素晴らしいLinuxディストリビューションです。「もうちょっとこうだったら」を叶えるディストロです。皆さん使ってみませんか?