distccでmakepkgの高速化を狙う

ビルドって結構時間かかる。最近telegram-desktop – aurがしょっちゅうバージョンアップするわけだが、これ、Qtのstatic版を手元で毎度ビルドするのだ。まぁそれを保持しておいてくれればいいんだけど、これの他にも色々ビルドすることはあるので、PKGBUILDからビルドしてくれるmakepkgを高速化してやりたい。

makeに手作業で-jとかつけて回っても良いが、せっかく手元にマシンが複数あるので、分散ビルドさせてみたほうが面白いのでは?つーわけで、distccをつかう。

 

基本的にはDistcc – ArchWikiの通りの作業でおk。

一応記しておこう。

 

状況は以下のとおり。

参加するホスト:マスター(192.168.0.55)、スレーブ(192.168.0.70)

マスターのCPU:Core i7 870(4C/8T)、スレーブのCPU:Celeron G550(2C/2T)

 

インストールはdistccパッケージを放り込めばおk、マスターにもスレーブにもインストールしよう。

 

スレーブの設定は/etc/conf.d/distccdを多少いじるのみ。

DISTCC_ARGS=”–allow 192.168.0.0/24″

の行をそれらしくしたら、systemctl start distccdすればおk

 

マスターでは/etc/makepkg.confをいじる。

・BUILDENVでdistccの前のビックリマークを切る

・DISTCC_HOSTSでジョブを実行するホストとそこのスレッド数を指定する(パワーが強い順にする)

・MAKEFLAGSで全スレッド数を合計したものを指定する

DISTCC_HOSTS=”localhost/8 192.168.0.70/2″
MAKEFLAGS=”-j10″

 

以上で設定はおしまい。パフォーマンス比較ということで、Linuxカーネルをビルドしてみよう。

$ cd
$ mkdir kernel_build && cd kernel_build
$ ABSROOT=. abs core/linux
$ cd ./core./linux
$ vim PKGBUILD
$ makepkg
$ sudo pacman -S xmlto
$ time makepkg

鍵の検証が出来ないとかなんとか言われたので、ひとまず.signをなかったことにしておいた。

先にmakepkgを実行してやれば、必要なもので今入っていないパッケージがどれかわかる。というわけでxmltoだけ手動でインストールした。

最後は実際のビルドと計測である。

 

distcc有効/無効でtimeの出力は以下の通り

# distcc無効
makepkg 10837.49s user 692.22s system 695% cpu 27:37.28 total
# distcc有効
makepkg  8178.88s user 584.70s system 560% cpu 26:02.75 total

多少早くなっているみたい(認識が雑)

 

ビルド中の様子はdistccmon-{text,gnome}で確認できる。gnomeだと様子が視覚的に見えておもしろい。

telegram-desktopビルド中

 

我が家にあるCPUは以下の通り

・Pentium DualCore E5300(自宅サーバ、Ubuntu16.04)
・Celeron G550(今回スレーブで使ったクソショボCPU、ArchLinux)
・Core i7 870(旧メインマシン、諸々作業所、ArchLinux)
・Core i7 6700K(現メインマシン、Windows10)
・AthlonII X2 250e(録画機、Windows7)

自宅サーバは違うディストロなのでコンパイラバージョンが食い違っていることが予想される(上にパワーが死ぬほど無い)ので組み込みにくい。あとはWindowsなので組み込むのダルい…メインマシンをArchLinuxにしちゃおうか悩むくらいだ。

計画では、そろそろ自宅サーバを新調する予定なので、それを参加するようにできれば、それでいいかな…

systemd-nspawnでコンテナをブリッジ接続する

2017/02/18 /var/lib/machinesの所在についてを追記

 

systemd-nspawnが何かはsystemd-nspawn – ArchWikiを見ていただくとして。

 

systemd-nspawnはネットワークに関して何も指定せず起動すると、ホストと共通のネットワークになる。同じIPアドレスを持つ、みたいな感じ。特に何も考えなくて済むので楽と言えば楽だけど、コンテナを仮想マシンみたいな感覚で触ろうと思うと、なかなかキツい。sshのポート変えれば区別出来るけど、みたいな状況になってしまう。

-n(–network-veth)オプションをつけると、ホスト・コンテナ双方に仮想イーサネットインターフェイスを作成して、これを接続する。ホストの下に新たにネットワークを作るようなものなので、お隣のパソコンからコンテナにアクセスしようとすると、きちんとルーティングしたりIPマスカレードしたりとかしないといけないっぽい。(それで出来るかは未確認)

既存のLANにコンテナが参加出来れば、つまりホストを通してブリッジ接続出来れば、まさしく仮想的に新たなマシンを起こした感覚で操作出来る。これが一番従来通りの感覚で操作できて、お話が簡単なはずだ。

 

 

ネットワークは、
ホームルータ(ゲートウェイ、DNS):192.168.0.1
ホスト:192.168.0.3
コンテナ:192.168.0.10
ホストに接続されてるインターフェイス:enp6s0
という事にしてみよう。

 

参考サイト:

まとめて面倒見てくれる勢いのsystemd(隔離とネットワーク) – GeeksDev [archive]

systemd-nspawn – ArchWiki

systemd-networkd – ArchWiki

 

さて実際の操作。

まずコンテナをつくる。

$ sudo pacman -S arch-install-scripts
$ mkdir cont
$ sudo pacstrap -i -c -d ./cont base --ignore linux
$ sudo systemd-nspawn -bnD ./cont

最後は一応の動作チェック。root(パスワード無し)でログインする。

systemd-nspawnからログインした場合はいいけど、後でさわるmachinectlからloginしようとすると、Login incorrectで怒られる。で、journalctl -xe -M contみたいな感じで当該コンテナのメッセージを見て、access denied: tty ‘pts/0’ is not secure!みたいに書いてあったら、コンテナ内の/etc/securettyにpts/0を追加すればイケるはず。

問題なさそうならpoweroffで帰ってこよう。

次にmachinectlでいじれるようにする。このままだと、

$ machinectl start cont
Machine image 'cont' does not exist.

はい。所定の場所にmvします。machinectl image-statusあたりで調べられる。

$ machinectl image-status
Path: /var/lib/machines
$ sudo mv ./cont /var/lib/machines/cont
$ machinectl list-images
NAME TYPE      RO USAGE CREATED MODIFIED
cont directory no n/a   n/a     n/a
$ machinectl start cont
$ machinectl login cont

正しく起動出来てログイン出来ていればおk。systemctl status systemd-nspawn@contを見れば正常に起動しているのが見えてくるはず。

 

 

つぎ、仮想ブリッジをつくるぞ~。

ホスト、コンテナ両方で以下をやっておいて、余計な接続をしないようにしておく。

$ sudo ln -sf /dev/null /etc/systemd/network/80-container-host0.network

ホスト側:

$ cat /etc/systemd/network/br0.netdev
[NetDev]
Name=br0
Kind=bridge

$ cat /etc/systemd/network/br0.network
[Match]
Name=br0

[Network]
DNS=192.168.0.1
Address=192.168.0.3/24
Gateway=192.168.0.1

$ cat /etc/systemd/network/eth.network
[Match]
Name=enp6s0

[Network]
Bridge=br0

次にコンテナにブリッジbr0を利用するように設定する。よくわかんなかったのでsystemctl status systemd-nspawn@contしたら見えたファイルをいじったのであった。

$ cat /usr/lib/systemd/system/systemd-nspawn@.service | grep ExecStart
#ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --network-veth -U --settings=override --machine=%i
ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --network-bridge=br0 -U --settings=override --machine=%i

1行目はもとあったもので、–network-vethがついている。(コメントアウトした)

2行目は–network-vethを–network-bridge=br0に差し替えたもの。

 

最後にコンテナ内をいじる。

$ cat /etc/systemd/network/host0.network
[Match]
Name=host0

[Network]
DNS=192.168.0.1
Address=192.168.0.10/24
Gateway=192.168.0.1

最後に、てきとうにsystemd-networkdをstartしたりenableしたりしておく。

以上まででブリッジ接続出来ているはず。コンテナ、ホスト、お隣のパソコンの3者からお互いにアクセス出来る。

 

これで鯖を新調して仮想化ドヤァ出来るようになったぞ!あとはお金を貯めるだけだ(しろめ)

鯖の構成見直し

昨日勢い余っておニューなサーバー構成検討と称して構成例を考えた。

ケースにRAIJINTEKのSTYXを選んだが、今日実物を見に行ったら気が変わった。

METISをほぼそのまま相似形に大きくしたのがSTYXだと思っていたが、上面に通気口が追加されているのであった。(側面にストレージスペースが追加されてるとかもあったけど、上面通気口と比べれば些事)

 

あまり掃除をしない人間なので(掃除すればいいんだけど)、上面の通気口はあまりうれしくない。ホコリが中に入る。上面から排気するようケースファンを追加すればある程度防げるような気もするけど、常時稼働を目指すので騒音源はなるたけ少なくしておきたい。件の通気口は公式サイトによれば240mmのラジエータをサポートするスペースのようなので、要は120mmファンを2つ装備しないと塞げない。

 

それから、寸法は数字としてはわかっていたけど、やっぱり実物で見るとMETISがとっても小さいしそれと比べるとSTYXは思ったより大きい。

 

つーわけで、METISに戻します

 

それに伴ってマザーボードをmini-ITXのものにしなければならないのだけど、価格.comの検索条件をSocketFM2+だけにするのではなく、SocketFM2/FM2+にすると多少検索ヒット件数が増える。

無線通信機能を持つものが殆どだが(8件中7件)、正直不要である。801.11ac対応するらしいけど、我が家の無線LANアクセスポイントはNECの普通の(ふるい)ホームルータであるので対応しない。そんな状況でサーバ用途で使うのはちょっとねぇ…というわけで不要。

無線通信をサポートしないのはBIOSTARのHi-Fi A88ZNのみ。BIOSTARマザーはむか〜し(恐らく現サーバ機より2世代前に)使ったのみで、しかも全く記憶に残っていない…今までずっと生きているという意味では、きっと確かなものがあるのであろうが、他メーカーより勢いがあるとは言いにくい状況という印象。

つーわけで無線は取り敢えず置いとくことにして、最近ずっと選んでいるASRockニキ…と思って、A88M-ITX/ac R2.0にしてみようかと。値段は9k程度なので、少しの増額分はSTYX→METISの減額分で賄ってなおお釣りが返ってくる。普通に全体予算が安くなった。

 

構成を再度示すとこんな感じ。右端にTSUKUMOないしAmazonでの値段を付している。

CPU : AMD A8-7670K (9686JPY)
M/B : ASRock A88M-ITX/ac R2.0 (9158JPY)
RAM : Crucial W3U1600CM-4G (6667JPY)
CAS : RAIJINTEK METIS (5280JPY)
PSU : KRPW-SXP400W/90+ (7084JPY)
SSD : Intel 540s SSDSC2KW180H6X1 (8154JPY)

さり気なく電源をFSPから玄人志向に変えました、ケースが小さくなったのでスペースが切実な問題となる。当然プラグインタイプ(セミだけど)。

総計は46029円。昨日の構成では48231円だったので、2kとちょっと安くなっている。より揃えやすくなったね、やったねたえち(ry

 

ケースだけ先に買っちゃおうかな、引っ込みつかなくなればちゃんと行動するでしょ

おニューなサーバー構成検討

現在の自宅鯖、とてもひどい事になっている。画面が一切出力されない(恐らく死んだ)。画面が出力されないが、それ以外はどうも生きているようなので、ギリギリ鯖として使えている…という状況。

さすがにこのまま使い続けるのは心がキツいし、10年も頑張っていただいたマシン、そろそろ引退させてあげたい(ただいきなり死ぬのが怖いだけ)。

 

というわけで、新しい構成を考えた……の前に、現在のものを主要なとこだけ。

CPU : Intel Pentium DualCore E5300
M/B : GIGABYTE GA-E7AUM-DS2H
RAM : 4GBx2(メーカーとか何も覚えてません)
HDD : 640GBくらい

10年くらい前に組んだので、ふるい。

 

さて、新構成はこんな感じ。

CPU : AMD A8-7670K
M/B : ASUS A88XM-A/USB3.1
RAM : Crucial W3U1600CM-4G
CAS : RAIJINTEK STYX
PSU : FSP AURUM S 400 AS-400
SSD : Intel 540s SSDSC2KW180H6X1

コストはAmazon価格で計5万円を切る。2月9日時点で48231円らしい。どれも在庫あり。

 

ほんとはRyzenが来てから考えたかったけど、構成考える欲求を抑えられなかった(金が入ったら即座に購入できる)(金が入るとは言ってない)

そんなに予算が無いのでCPUはIntelでなくAMDにしましょうっていうのは最初から考えていたが、もともとはケースにRAIJINTEKのMETISを使って組みたかった。これとてもコンパクトで6000円程度の手頃なmini-ITXケース。ケース内の向きが面白い、電源がスポッと立っててマザーは逆さ(詳しくは画像検索してください)

ただ、そんなに手頃なmini-ITXマザーが見当たらなくて、FM2+なmini-ITXマザーが価格.comに1件しか料金登録が無い、あまりにもひどい…

しょうがないので、METISの姉妹製品であるSTYXに方針変更。これはMETISに+3000円程度して、micro-ATXが使えるって感じ(デザインと内部のパーツ向きは同じっぽい)。

 

CPUについては、詳細な検討ではないけど、前のが前のだけに、(cpubenchmark.netのスコアによると)15475015と十分な伸び(ちょっと前までメインで使っていたCore i7 870が5424らしいので十分)

メモリは8GBもあれば十分かなと思うし、不足しそうだったら追加すればいいかなとてきとうに思っている。マザーにはスロット4本あるし

 

マザー選びはいつも困るんだけど、大抵は値段で決める(今までそれでハズレを引いたことがないので)

オーディオは基板上で分離してるやで、と公式サイトではアピールしてるけど、実際あんまこだわらないし、鯖だしなぁ…と思ったりもする。気分が乗ったらアニソン垂れ流しシステムでも作ろうかな?

ネットワークはいつもの蟹さんが載ってるよう(RTL8111H)なのだが、一先ずはこれをそのまま使おうかな

 

電源も実はいつも困っている…が、そんなに電力必要じゃないので上限400W、一応常時稼働なので80PLUSはSilver以上で検索したら、玄人志向のKRPW-SX400W/90+, KRPW-SXP400W/90+か、FSPのAURUM S 400 AS-400しか出てこなかった。玄人志向の方はSFX電源で、後者は前者のプラグイン版っぽい。FSPのはATX電源。

FSPの電源は6900円なのに対して、玄人志向のプラグイン版が7000円なので、プラグインに惹かれてこっちを選んでもいいかなっていう気もする。ただ、ケースをMETISじゃなくてしたので、別にスペース気にしなくても良さそう…というわけでめっちゃケーブル余らせてもいいかな〜とは思う(アクリルで中身見えるやつなのでスッキリさせるに越したことはないかな)

 

ストレージはもうてきとうに。取り敢えずIntel選んどけばいいじゃろってくらい。マザーが対応してたとしても(してないけど)、鯖機にM.2はつけなくていいかな、などと思いこんでいるので普通の。容量はお財布と相談で180GBにしておいた。

そんなに大容量が必要なわけじゃない気がするので取り敢えずシステム用SSDだけでいいけど、ダメそうになったらてきとうにHDD1つ追加する心積もり。500GBくらいなら安く手に入るでしょ

 

さて、OSについては、今までUbuntuDesktop(なぜServerではないのか…)使ってたけど、それなりに慣れてきたしということでArchLinuxでもいいかなと思っている。鯖として使うには不安定なのではとも言うけど、個人宅内鯖でとやかく言うことでもない。

そんで、その上にsystemd-nspawnでコンテナ立てて、てきとうにサーバソフトウェア起こせばそれでいいかな?と。どうしてもUbuntuほしければコンテナの上に立てれば良いので。

 

 

以上、実際の構築は棚の上に上げておいて、てきとうに検討だけしました。お金が用意出来たら組むぞ〜〜

 

LAN内にいるIPアドレスを一覧したい nmap,arp-scan

DHCPで繋いだ時のIPアドレスがわからなくてこまる事がある。例えば何もいじってない状態の玄箱にtelnetしたいとか。そういえば玄箱全然いじってないな。

という訳でLANの中にいるIPアドレスを調べる。

nmapは-sPとか-PRとかつけて目的ネットワークを指定すればおk

sudoつけないと色々面倒なお話があるのだが、ネットワークのお話をちゃんと勉強しないとわからないっぽいので後日。(sudoつけなくても使えるが機能が制限される)

 

次、arp-scanは-I(–interface)でインターフェイスを指定して、-l(–localnet)オプション付ける

localnetオプションは検索対象をローカルの全てのアドレスにする。インターフェイスのアドレスが192.168.0.3/24とかだったりすると、192.168.0.0〜192.168.0.255を探索するようだ

こっちはそもそもsudoつけないと怒られる(パケットを読み書きするのにroot privilegeが必要)

 

$ nmap -sP 192.168.0.0/24
$ sudo nmap -PR 192.168.0.0/24  # ポートスキャンやってくれる
$ sudo arp-scan -I wlp2s0 -l

dnsmasqで内向きDNS

今更なネタではあるような気がするけど、dnsmasqで内向きDNSを立てた。

以前、ArchLinuxのリポジトリミラーをローカルに立てるという事で、ローカルにミラーを立てたのは良いけれど、家にいるときはローカルミラー、外にいるときは他のミラー…というように接続先を変えるのが面倒くさい。

実はネットワークに接続するたびに毎度毎度mirrorlistを手作業でいじっていたのだ。アホ。

これ自動化する手があるのかもしれないけど、それよりも、ドメイン登録して外からローカルミラーにアクセス出来るようにして、自宅からは内向きDNSで解決するようにして、mirrorlistにはいつも同じドメイン名書いておけばよいのでは?という結論にいたった。しょーもな。

という訳でそういうお話。

 

dnsmasqは/etc/hostsをもとに名前解決してくれるDNSサーバとして使う事が出来る(BINDみたいに面倒な設定書かずに済んで楽ちんなのだ)

 

 

やることをまとめると、

・それらしいドメイン名で自宅外から自宅内のマシンにアクセス出来る

・自宅内でも同じドメイン名でローカルマシンにアクセス出来る

 

今回は、repo.hoge.comを192.168.0.3とかにあててみようと思う。

 

まずはdnsmasqを導入する。

$ sudo pacman -S dnsmasq

何も考える必要ないっすね。で、設定をいじる。/etc/dnsmasq.confにいる。

domain-needed
bogus-priv
local=/hoge.com/
no-dhcp-interface=enp6s0
expand-hosts
domain=hoge.com

次、/etc/hosts

$ cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
::1 localhost.localdomain localhost
192.168.0.3 repo.hoge.com

サーバの設定はおしまいなので起動設定(と起動)

$ sudo systemctl enable dnsmasq
$ sudo systemctl start dnsmasq

気になるようだったらサーバでrepo.hoge.comにpingとかしましょう

/etc/hostsを設定した時点でサーバ内では名前解決出来るけど、ローカルネットワークの他のマシンからは名前解決出来ない。DNSにサーバを指定すればともかく、それをしたら他のネットワークに参加した時にまた対応せにゃならんでしょう(プロファイル作ってわけるってのもあるけど、手作業が面倒なのが根本なのでなしの方向で)

つー訳で、ルータから特定ドメインの名前解決リクエストだけサーバに飛ばすように設定する(たぶん)。我が家のルータはAterm WR8370Nなので、他の機種他のメーカーは知りません(

設定Web→詳細設定→DNSルーティング設定にルーティングエントリとして追加する

宛先ドメイン:repo.hoge.com
ゲートウェイ:192.168.0.3
プライマリDNS:192.168.0.3

あとは設定を保存して動作チェックだ。

 

最終的な状況は、

自宅LAN外からアクセス→おなまえどっとこむのDNSを使って名前解決→通常のサーバのようにポートマッピングでサーバへ接続

自宅LAN内からアクセス→LAN内メインDNSサーバたるルータへ要求→ルータは設定されたドメインなので192.168.0.3へ転送→192.168.0.3のdnsmasqが解決してくれる

という感じかしら?

 

これ、別にリポジトリミラーの話に限る必要は無くて、自宅鯖とかに普通に使えるんすよね…

自宅にあるマシンはどれも手作業でhostsいじってたけど、これからはこれ使って楽ちん設定だー。

特定コマンドが含まれているパッケージを探す

ArchLinuxって最小限のインストール構成だと(最小限なので当然なんだけど)使いにくいレベルで何も入ってない。

そこから好きなもの、必要なものだけに絞ってインストールしていけるので、大変そういう意味では良いんだけど、まともに環境構築するつもりはなくて、とにかく実験環境とか遊び環境として一つ欲しいときに、「あのコマンドだけ欲しい」とかあるんすよ

最近研究室に新しいサーバ機が届きまして、早速諸々の構築をしていきたいんだけど、教授からは「Windows Serverにしような」と言われてしまい、しかしそのインストールメディアは先生が持っていて、更に言うとストレージも実は用意してないので、やっぱり何も出来ない状況なのだ…

とは言え、こんな格好のおもちゃ、放置しておくのは勿体無いよねって事で、USBメモリにOSをインストールしてそこから起動して色々遊べばいいじゃん〜と。

要はまともに環境構築する気が無い環境で、アレ欲しいコレ欲しいって単発で欲しくなったときに、具体的にどのパッケージをインストールすれば良いのかを探す。

 

今回欲しかったのはifconfig。NICの名前とかIPアドレスとか知りたいとふと思ったときに無意識に打ち込んじゃうけれど、これ最初は入ってないんでした……

pacmanにオプションQoをつけて目的バイナリを探してきてねってお願いすると、パッケージ名出してくれます。

 

$ which ifconfig
/usr/bin/ifconfig
$ pacman -Qo /usr/bin/ifconfig
/usr/bin/ifconfig は net-tools 1.60.20160710git-1 によって保有されています

2行にわたったり入力したりめんどいので以下みたいなノリで短縮も可

$ which ifconfig | pacman -Qo -

aliasなコマンド(lsなんかはls –color=autoになっている場合をよく見る)の場合には一度unaliasする以外方法見つかりませんでした(まがお)