普段使いのArchLinux

大晦日の終末感が好きです.2016年が終わります.

人の心理的な時間の長さは年齢の逆数に比例する,っていう有名な話があります.この考えに基づくと,4歳から80歳までを一生としたとき,心理的な人生の「残量」は調和数を使って次のように表現できます.

$$ \frac{H_{80} - H_n}{H_{80} - H_4} $$
具体的には,4歳で100%,12歳(小学校卒業)で64.6%,15歳(中学校卒業)で57.2%,18歳(高校卒業)で51.0%,そして19歳で49.2%まで下る計算です.さらに30歳(而立)で33.7%,40歳(不惑)で23.8%,50歳(知命)で16.2%,60歳(耳順)で9.9%,70歳(従心)で4.6%になります.

僕にとって2016年は20歳という節目の年でした.小学校4年生のときに「二分の一成人式」というのをやって(早生まれの僕は当時まだ9歳でしたが),今から10年後,20歳というのは本当に大人で,何でもできるようになるのだと漠然と思っていました.ところが実際は,小学校を出て中学・高校を出て,大学に入り,誕生日を迎えて数字が繰り上がっただけ,昨日までと何ら変わりのない20歳初日が始まったのです.それはそうって感じですが,でも少しだけ残念に思いました.

大人って何なんでしょうね?

ArchLinux on MacBookPro

MBPにArchLinuxをインストールして普段使いしています.家では2560x1600のMBPに1980x1020のHDMIディスプレイを外付けして,デュアルディスプレイ環境で作業しています.

ArchLinuxはGentoo同様非常に自由度の高いディストリビューションで,付属のインストーラなんてものは存在しないため,100人いれば100通りのシステムがあるわけです.最小構成から自分好みにシステムを組み上げていく,LEGOブロックのような楽しさを理解していただければ幸いです.

パーティショニング

OSX用に60GB割いて,残りの196GBをArch用にしました.起動用EFIアプリケーションboot.efiを/dev/sda4に配置,blessすることでLinux用パーティションが自動的に選択されます.

/のファイルシステムはbtrfsにしました.とりあえず/homeと/var/log,あと/var/cacheをサブボリューム上に配置してありますが,将来的には/全体を載せるつもりです.

デスクトップ

壁紙はWiredの神様,Lainです.僕も肉体を捨ててWiredに遍在する存在となりたい.fehを使ってランダム再生させてます.Conkyはシステムの状態をざっくり把握できるので便利です.
~/.conkyrc https://github.com/mi2428/dotfiles/blob/master/etc/hosts/linux/conky/conkyrc

ウィンドウマネージャはi3wmを使っています.ラップトップのLinuxは,解像度を無駄なく利用できるタイル型ウィンドウマネージャが一番って結論に達しました.i3barはデフォルトのi3statusではなくi3blocksに置き換えています.i3configでブラウザ・ファイラ起動やX強制終了,ハイバネーション等の基本操作はキーバインドしてあるので,GUIなメニューに頼らずとも十分快適に操作できます.ディスプレイマネージャ・デスクトップ環境は使っていませんが,個人的にはXfceとMATE(GNOME2)が好きです.
~/.i3/config https://github.com/mi2428/dotfiles/blob/master/etc/hosts/linux/i3/i3/config
~/.i3/i3blocks https://github.com/mi2428/dotfiles/blob/master/etc/hosts/linux/i3/i3/i3blocks

また,i3wmはcompositingでないので,comptonを併せて使用しています.これでブラウザやVLCの上にmltermを重ねてアニメを見ながら進捗できるようになります.カレンちゃんの「デスデス〜!」って笑顔が見えるんデス!
~/.config/compton/compton.conf https://github.com/mi2428/dotfiles/blob/master/etc/hosts/linux/compton/compton.conf

アプリケーションランチャはdmenuの代わりにrofiを入れています.ウィンドウスイッチャとして機能するほか,.ssh/configをパースして接続先を選択できたり,ユーザスクリプトで機能拡張できたりと非常に便利です.僕はNumixライクなカラースキーム,tmuxセッションアタッチ用スクリプト,netctlプロファイル選択用スクリプトを書いて活用してます.
~/.Xdefaults https://github.com/mi2428/dotfiles/blob/master/etc/hosts/linux/x11/Xdefaults#L7-L35
~/.rofi https://github.com/mi2428/dotfiles/tree/master/etc/hosts/linux/rofi/rofi

デスクトップ通知はdunstを使いました.
~/.config/dunst/dunstrc https://github.com/mi2428/dotfiles/blob/master/etc/hosts/linux/dunst/dunstrc

そうそう,GTKテーマはNumixでアイコンはNumix-Circle,フォントはUbuntuRegular:10をつかっています.
~/.gtkrc-3.0 https://github.com/mi2428/dotfiles/blob/master/etc/hosts/linux/gtk/gtkrc-3.0

端末エミュレータ

普段はmltermを使っています.mltermを使う場合は(少なくとも僕の環境では),x86-video-intelをインストールすると端末上の文字が滲む原因になるので注意が必要です.また,x86-video-intelがないとxbacklightが使えなくなるので,画面の輝度調節は別の方法で対処する必要があります.僕は/sys/class/backlight以下を直接書き換えるシェルスクリプトを書いて,visudoでパスワードなしで特権実行できるようにしました.この対応によるパフォーマンスへの影響は現在までのところ確認できていません.
~/.mlterm https://github.com/mi2428/dotfiles/tree/master/etc/hosts/linux/mlterm/mlterm

アップデートによる破損等でmltermが利用できなくなった場合に備えて,urxvtもインストールしてあります.こちらもmlterm同様EAWに対応しています.
~/.Xdefaults https://github.com/mi2428/dotfiles/blob/master/etc/hosts/linux/x11/Xdefaults

カラースキームはsolarized-darkを使っています.黒背景より青背景のほうが眼に優しい感じがして好きです.実はマシンに設定している壁紙はすべてGIMPで青っぽく調整してあるんです.こうすることで端末の擬似透明で壁紙が透けて見えたとしても,カラースキームといい感じにマッチさせ,文字が読みにくくなるのを防いでいます.

tmux + zsh + neovim で作業しています.
~/.tmux.conf https://github.com/mi2428/dotfiles/tree/master/etc/tmux
~/.zshenv https://github.com/mi2428/dotfiles/blob/master/etc/zsh/zshenv
~/.zlogin https://github.com/mi2428/dotfiles/blob/master/etc/hosts/linux/zsh/zlogin
~/.zshrc https://github.com/mi2428/dotfiles/blob/master/etc/zsh/zshrc
~/.zsh/conf.d https://github.com/mi2428/dotfiles/tree/master/etc/hosts/linux/zsh/zsh/conf.d
~/.config/nvim https://github.com/mi2428/dotfiles/tree/master/etc/nvim

日本語環境

インプットメソッドはfcitxで,辞書が強化されたfcitx-mozc-ut2を使っています.いくつかのフォントを追加でインストールしました.

  • ttf-ubuntu-font-family
  • adobe-source-code-pro-fonts
  • otf-ipafont
  • ttf-vlgothic
  • ttf-bitstream-vera

Webブラウザ

もともとChrome派だったのですが,最近のアップデートを見ているとオワコンな感じに仕上がってきたので,仕方なしにFirefoxに鞍替えしました.vimperatorのNumixカラースキームを自作しました.
~/.vimperatorrc https://github.com/mi2428/dotfiles/blob/master/etc/hosts/linux/vimperator/vimperatorrc
~/.vimperator/colors/numix.vimp https://github.com/mi2428/vimperator_numix_colorscheme/blob/master/colors/numix.vimp

Firefoxはデフォルトの状態だと英語・日本語フォントともにキモいので,こんな感じに設定して使っています.

ブラウザプロファイルをtmpfsに載せることで動作を高速化させています.プロファイルの同期にはpsdを使いました.
~/.config/psd/psd.conf https://github.com/mi2428/dotfiles/blob/master/etc/hosts/linux/psd/psd.conf

UIとかプロジェクト方針とかで一番好きなブラウザはVivaldiなんですけど,如何せんバグがひどくて常用には堪えない状況です.Operaも併せて使用しています.

ファイルマネージャ

シェル上で生活する人なんですけど,やっぱりファイルマネージャはあると便利です.個人的には軽くてタブ式のspacefmがお気に入りです.ただD&Dでまれにクラッシュすることがあります.

Ubuntuでお馴染みのnautilusも入れてあります.

ネットワーク

MacにはBroadcom製チップセットが使われているんですけど,これがLinuxと最悪の相性なんですね.僕が使ってるドライバはbroadcom-wl-dkms(broadcom-wl)ですが,有線無線どちらも長時間使っていると突発的にリンクダウン・リンクアップを繰り返したり,勝手にプロミスキャスモードに切り替わったりといろいろやらかしてくれます.なので有線LANが利用できる環境では防衛的な意味でUSB-NICを使ってネットワークに接続しています.

ちなみにMacユーザなLinuxユーザはBroadcomの他にNVIDIAという愉快なお友達とも仲良くしないといけません.

仮想化基盤

メモリ8Gなので本格的なVMを動かすことはありません.

  • QEMU/KVM
  • VirtualBox with Vagrant
  • Docker
  • systemd-nspawn

ハイパーバイザ仮想化の場合,ゲストOSがLinuxの場合は(それ以外仮想化したことないけど)KVMを使います.qcow2でディスクイメージを作って,必要とあれば他の物理マシンにマイグレーションする感じで.VirtualBoxはVagrantと一緒に使うことがほとんどです.
コンテナ仮想化の場合,コンテナ内で複数のサービスを稼働させたいときや,純粋に隔離環境を用意したいだけのときはnspawnを使ってます.Dockerを使うのはDockerでなければダメって場合だけですね.rktはもう使う機会はないでしょう,消しました.

バックアップ

snapperを使って/homeのスナップショットを自動作成,不慮の事故によるデータの喪失を予防しています.またbtrfsはサブボリュームの差分転送ができるので,定期的にNASにスナップショットを送信してSSDの物理故障に備えます.
将来的には/をサブボリュームに載せて,アップデート実行時に事前事後のスナップショットを作成するようにし,システムトラブルをファイルシステムレベルで回復できるようにするつもりです.

その他

最後に少しだけ小ネタを紹介してこのパートを終わりにします.

ネットワーク調査ツール

  • arping と hping
  • tcpdump と wireshark
  • nmap
  • nc
  • paris-traceroute

トポロジ調査の定番ツールであるtracerouteは,例えば経路中でロードバランシングが行われている場合,誤ったトポロジを報告してしまう問題があります.
Traceroute Anomalies - Semantic Scholar
Avoiding traceroute anomalies with Paris traceroute - SIGCOM
paris-traceroute(AURからPKGBUILDをダウンロード可)は複数の手段で戻りパケットをチェックするので,tracerouteの曖昧さを取り除くことができます.アルゴリズムを無効化することもでき,総じてtracerouteよりも高機能であることからインストールして損はないでしょう.

そうそう,digはextra/bind-toolsに含まれています.distroによってはdnsutilsってパッケージだったりするので…

MATLAB

MATLABはマシンのMACアドレスをMachineIDとしてライセンスに紐付け,起動時に検証しています.信じられなーいって感じですけど.MACアドレスをランダム化している場合は,/usr/loca/bin/matlabとか作ってmatlabコマンドを奪い,その中でインターフェイスにMACアドレスを再割当するなどの対応が必要です.

VMs on KVM on iMac

iMac(21.5-inch, Late 2012)が家にあるのですが,こちらはOSX領域を完全削除しLinuxに換装,サーバ機として動かしています.つい数週間前に内蔵HDDが物理故障し,現在はUSB3.0外付けの3.5HDDケースにWesternDigital製3TBのディスクを入れてのオペレーションになっています.ディスクI/O的にむしろ前よりも快適になりました. 他にもRAID構成のNASが2台あり,インターネットゲートウェイのRTX1200,アクセスポイントのRT-AC1200HP(とBuffalo製のac非対応AP)も含め,すべてAPC製UPSで電源をバックアップしています.

iMac,以降はRingoServerと呼称します,はメモリが16GBあるので,DebianをKVMマネージャにしてUbuntuServer,ArchLinux等をゲストで動かしています.基本的に開発・検証用サーバですが,いくつか本番系が動いているので紹介します.ちなみに本番環境はすべてDockerを使って各サービスをコンテナ化しています.ネイティブでサービスを動かすやり方はデメリットばかりが目立ち前時代的と言わざるを得ません.時代はImmutableInfrastructureですよ.

内向けDNSコンテンツサーバ

i.mi2428.netというゾーンを宅内で運用,各クライアントの検索ドメインに設定しています.利用しているプロバイダでIP53Bが実施されている関係で,このゾーンの外向けコンテンツサーバは後に紹介するVPS上で稼働しています.
BindがWANからの問い合わせに応答しない… - Mi’s blog

コンテナも含めて仮想サーバが大量に存在するので,いちいちIPアドレスを覚えていられないという実際上の話と,たとえIPアドレスを変更しても(動的割当するような場合も含みます)ドメイン名で隠蔽できるので可搬性が高まるという話,つまり宅内にコンテンツサーバを立てるのは必定というわけです.

Web広告ブロック・DNSキャッシュサーバ

DNSキャッシュサーバに広告ブロック機能を付けて,DHCPで配布しています.これによりLANからWebブラウジングする場合ページに広告が表示されなくなるので,ロード時間の短縮を見込めるほか,スマホやタブレットなど画面の小さい端末では解像度を節約できます.時間を止めて女の子にイタズラしちゃう系の鬱陶しいエロバナーがでなくて済むのでQoL爆上げです.
mi2428/AdBlock-DNS https://github.com/mi2428/AdBlock-DNS

RADIUSサーバ

無線LANのWPA2-EAPで使うIEEE802.1x認証サーバです.普通の家庭用BBルータではWPA2エンタープライズに対応していないので,僕はASUSのRT-AC1200HPを購入しました.ルーティング機能を殺してAP専用で動かしています.

オンラインストレージ

もともとownCloudを使っていたのですが,まあいろいろあってnextCloudに乗り換えました.VPSでも動かしていていますが,ディスク容量を気にしながら使わなければならず,少し窮屈です.その点を宅内のncで補っています.画像・動画・自炊書籍やバイナリなど,ドラえもんの4次元ポケットよろしくとりあえず置いとけ的な場所として活用しています.

GitLab

プライベートリポジトリ,GitHubの学生無料枠だけだと足りないのでGitLabを使い始めました.重要度的にはVPSに引き上げたいのですが,最低でもメモリ2GBないと動いてくれないのでRingoServer上のVMで動かしています.Issueで課題の締め切りや残作業を管理できるので,学校の課題をこなすのに必須のサービスです.SnippetがGistみたいに複数ファイルをまとめられるようになったら嬉しいんですけどね.

Pacmanミラー

ローカルミラーを立てています.ほぼ毎日アップデートを適用しているので,パッケージのダウンロード時間を短縮できて非常に捗っています.同期スクリプトを編集すれば,一度ダウンロードされたパッケージのそれ以降のバージョンを破棄せずに保存するよう構成することも可能です.その場合任意のバージョンにダウングレードできるようになるだけでなく,ローカルにバイナリのキャッシュを残しておく必要がなくなるのでディスク容量を節約できます.
ローカルにPacmanミラーを立てた話 - Mi’s blog

coreとextraとcommunity,isoの4つをjaistと毎時同期しています.現在ディスクを47GB消費していますが,先に述べたことを実現するにしても100GBあれば十分だと思います.USB-HDDをマウントすれば非力なラズパイでもミラーは構築可能です.実際このミラーを動かしているVMのスペックはラズパイ並にしょぼいので.

その他

宅内サービスの紹介は以上です.小話をひとつして,このパートはおしまいです.

ホスト名

僕は仮想マシン(仮想サーバ)に固有名詞のホスト名をつけることはしません.マシンのスペックからsmall-1やmiddle-2といったホスト名を規則的に生成し,dev.i.mi2428.netなど所属するドメインのゾーンでマシンの役割(所属ネットワークや稼働コンテナの種類)を区別しています.管理上の都合からIPアドレスは静的に振っていますが,これすら本来は動的にすべきだと考えています.つまり動的IPアドレスと固定FQDNをプライベートなコンテンツサーバで解決させる,ってことです.

Dockerで仮想化された各コンテナは,設定ファイルを編集したとき,つまり例えばWebサーバコンテナであればnginx.confなどを編集したとき,あるいは中のプロセスがクラッシュしたときに自動で破棄・リビルドされます.コンテナはサービスを動かす器であって,サービスが動いていればコンテナがどれであれ構わないのです.Dockerでは各コンテナを区別するのにSHA256によるハッシュ値が使われています.

それと同様に,KVMで仮想化された各マシンは,サービスコンテナの実行環境を提供すればいいだけなのです.メモリやCPUといった計算機資源と,ストレージバックエンド等が利用するLinuxカーネルを提供すればそれでよく,(VagrantやAnsibleにより自動で作成された)均質で画一的なマシン同士を固有名詞で区別する必要はどこにもありません.

現代的な運用をしていればこの結論に達するはずなので,逆に仮想マシンを固有名詞で区別しているのなら,その運用方法は明らかに時代遅れだと思います.

VPS

前パートでiMacをサーバにする話を紹介しましたが,ブレーカが落ちたり,うさぎにケーブルを噛まれたり,ひょっとしたら地震で家が潰れたりなど自宅サーバは不安要素がいっぱいです.僕はそれら自宅サーバの持つ欠点や不安要素をさくらのVPS(1G)を契約することで補填しています.さくらのVPSを選んだ理由は,老舗であること(信頼できること)と安価であることの2点です.ConoHaやDigitalOceanも好きですが,高かったりリージョンが遠かったりするので… 機会があれば使ってみたいです.

RingoServer同様すべてコンテナ化しています.

VPNゲートウェイ

L2TP/IPsecを使っています.中国に旅行に行った友人に貸したりしました.これだけはsystemd-nspawnを使ってコンテナ化しています.

外向けDNSコンテンツサーバ

宅内で運用しているi.mi2428.netの権威サーバです.僕の家は動的IPアドレスが割り当てられているので,PPPセッション張り直しになった場合にキャッシュが素早く更新されるよう,TTLを短めに設定しています.ダイナミックDNSサービスを自前で用意している感じですね.

ちなみに*.i.mi2428.netはGooglePublicDNS(8.8.8.88.8.4.4)経由ではアクセスできません.偽のレコードをキャッシュさせているので,RingoServerではない別のサーバに誘導されます.

Web広告ブロック・DNSキャッシュサーバ

外出先からもアドブロックできたら便利ってことで,VPN上にも設置しています.

ちなみにさくらのVPSではオープンリゾルバの運用が禁止されています.僕は昔VPN上に設置したつもりだったフォワードプロキシがインターネットに露出していたためにオープンプロキシとなり,スパムの踏み台にされ,RBLにIPが登録され,さくらインターネットのAbuse対策チームからメールが飛んできたって経験があります.注意しましょう.

オンラインストレージ

nextCloudを使っています.容量が最大でも100GBまでなので,主に重要ファイルのバックアップに使っています.

ExternalStorageっていう拡張機能を有効にすることで,サーバ上のディスク領域にSFTP経由でアクセスできるようになります.僕はこれを使ってブログの画像をアップロードしています.Webサーバのドキュメントルートにnc経由で直接ファイルを置きに行っているイメージですね.便利ですよ.

KeeWeb

keepassのWebクライアントです.最近プラグインとしてncに組み込めるようにったので,時間のあるときに移行作業したいと思います.kdbxファイルをオンラインに配置しているので,スマホやタブレットからもキーリングを参照できます.

Jenkinsによるブログの自動デプロイ

このブログのソースコードはGitHubでホストしています.CIツールはJenkinsで,Jenkinsはpushをhookしリポジトリをcloneしたあとhugoでソースコードをデプロイ,生成された静的ファイルを,ブログをホストしているコンテナにコピーします.

つまりですね,僕はmdで(本当はadocが使いたいんですけど)記事を書いて,それをGitHubにpushするだけでいいんです.必要とあればncに画像をアップロードする.これだけでブログが更新できるんです.

個人的にWordPressのようなDBを背後に持ってるCMSがあまり好きでないので,というかこの規模のサイトでCMSを使う必要はないだろうと思うので,静的サイトジェネレータ(このブログはHugoです)を使っています.本来この場合だと「記事を書いたあとにhugoを実行して生成ファイルをサーバにアップロード」っていうだるい作業が入ってしまうのですが,CIツールを利用しこの過程を自動化したため,記事執筆のポテンシャル障壁を上げずに済んだって話です.自動化は工学の真髄です.

その他

書くのに疲れてきたのでこれくらいで終わりにします.

固定IPアドレス

僕はさくらのVPSの他に友人のVPSにアカウントを作ってもらったり,あるいは一人暮らししている友人宅にラズパイを設置してもらったりと,複数のグローバルIPアドレスを選択して利用できる環境にあります.フォワードプロキシを経由して接続制限を回避したり,別ユーザとして振る舞ったり,あるいはサーバを冗長化したり,まあいろいろ遊べるわけです.

固定IPアドレスは1つあればいいかなって思います.自宅のプロバイダのIPが動的割当なんですけど,これも積極的理由によります.どこに繋げにいくにもいつも同じIPアドレスってのは嫌じゃないですか.ヘマやってBANされたときにPPPセッション張り直せばリベンジできるって方が嬉しいでしょ?サーバにしたってアドレスを変えて雲隠れできるわけです.まあそこら辺を論じ始めるとTorネットワーク(1年前くらいにHORNET論文出ましたね)とかの経路匿名化の話になってくるので切り上げますが.

固定IPのVPSと動的IPの自宅サーバ,この組み合わせが僕のたどり着いた最適解です.

おわりに

ArchLinuxは導入難易度が少し高いですが,軽量かつカスタマイズし放題なので使っていて非常に楽しいです.壊れやすいとかよく言われますが,大抵の場合はArchLinux(というかPacman)の性質を理解していない未熟な使用者に責任があります.そういう意味ではDebian/Ubuntuと違って上級者向けのディストリビューションってことになるかもしれません.

人に読んでもらうまともな記事はこれが初めてなので,書くのに結構時間がかかりました.年内に書き終わってよかったです.

そうそう,来年4月に公開予定のハリウッド実写版「攻殻機動隊」,すでに95年に押井守監督が同様の内容で映画化してるんですけど,人形使いが自分を「情報の海で発生した生命体だ」って主張するシーンがすごく好きなんです.攻殻機動隊のような硬派なSF(というか哲学)が非オタの一般人に広く知られることを,出来云々は別として嬉しく思います.

ではよい終末を.