G550(2C/2T)インストールはdistccパッケージを放り込めばおk、マスターにもスレーブにもインストールしよう。スレーブの設定は/etc/conf.d/distccdを多少いじるのみ。distccdすればおkマスターでは/etc/makepkg.confをいじる。以上で設定はおしまい。パフォーマンス比較ということで、Linuxカーネルをビルドしてみよう。makepkg鍵の検証が出来ないとかなんとか言われたので、ひとまず.signをなかったことにしておいた。先にmakepkgを実行してやれば、必要なもので今入っていないパッケージがどれかわかる。いうわけでxmltoだけ手動でインストールした。最後は実際のビルドと計測である。total多少早くなっているみたい(認識が雑)ビルド中の様子はdistccmon-{text,gnome}で確認できる。gnomeだと様子が視覚的に見えておもしろい。250e(録画機、Windows7)自宅サーバは違うディストロなのでコンパイラバージョンが食い違っていることが予想される(上にパワーが死ぬほど無い)ので組み込みにくい。あとはWindowsなので組み込むのダルい...メインマシンをArchLinuxにしちゃおうか悩むくらいだ。ArchWikiを見ていただくとして。systemd-nspawnはネットワークに関して何も指定せず起動すると、ホストと共通のネットワークになる。同じIPアドレスを持つ、みたいな感じ。何も考えなくて済むので楽と言えば楽だけど、コンテナを仮想マシンみたいな感覚で触ろうと思うと、なかなかキツい。sshのポート変えれば区別出来るけど、みたいな状況になってしまう。-n(–network-veth)オプションをつけると、ホスト・コンテナ双方に仮想イーサネットインターフェイスを作成して、これを接続する。ホストの下に新たにネットワークを作るようなものなので、お隣のパソコンからコンテナにアクセスしようとすると、きちんとルーティングしたりIPマスカレードしたりとかしないといけないっぽい。(それで出来るかは未確認)既存のLANにコンテナが参加出来れば、つまりホストを通してブリッジ接続出来れば、まさしく仮想的に新たなマシンを起こした感覚で操作出来る。これが一番従来通りの感覚で操作できて、お話が簡単なはずだ。ネットワークは、ホームルータ(ゲートウェイ、DNS):192.168.0.1ホスト:192.168.0.3コンテナ:192.168.0.10ホストに接続されてるインターフェイス:enp6s0という事にしてみよう。ArchWikiさて実際の操作。./cont最後は一応の動作チェック。root(パスワード無し)でログインする。incorrectで怒られる。secure!みたいに書いてあったら、コンテナ内の/etc/securettyにpts/0を追加すればイケるはず。問題なさそうならpoweroffで帰ってこよう。次にmachinectlでいじれるようにする。所定の場所にmvします。image-statusあたりで調べられる。cont正しく起動出来てログイン出来ていればおk。systemd-nspawn@contを見れば正常に起動しているのが見えてくるはず。つぎ、仮想ブリッジをつくるぞ~。ホスト、コンテナ両方で以下をやっておいて、余計な接続をしないようにしておく。/etc/systemd/network/eth.network[Match]Name=enp6s0[Network]Bridge=br0次にコンテナにブリッジbr0を利用するように設定する。systemd-nspawn@contしたら見えたファイルをいじったのであった。--machine=%i1行目はもとあったもので、–network-vethがついている。(コメントアウトした)2行目は–network-vethを–network-bridge=br0に差し替えたもの。最後にコンテナ内をいじる。/etc/systemd/network/host0.network[Match]Name=host0[Network]DNS=192.168.0.1Address=192.168.0.10/24Gateway=192.168.0.1最後に、てきとうにsystemd-networkdをstartしたりenableしたりしておく。以上まででブリッジ接続出来ているはず。コンテナ、ホスト、お隣のパソコンの3者からお互いにアクセス出来る。ハードウェア現在の自宅鯖、とてもひどい事になっている。画面が一切出力されない(恐らく死んだ)。画面が出力されないが、それ以外はどうも生きているようなので、ギリギリ鯖として使えている...という状況。このまま使い続けるのは心がキツいし、10年も頑張っていただいたマシン、そろそろ引退させてあげたい(ただいきなり死ぬのが怖いだけ)。いうわけで、新しい構成を考えた......の前に、現在のものを主要なとこだけ。640GBくらい10年くらい前に組んだので、ふるい。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が使えるって感じ(デザインと内部のパーツ向きは同じっぽい)。870が5424らしいので十分)メモリは8GBもあれば十分かなと思うし、不足しそうだったら追加すればいいかなとてきとうに思っている。マザーにはスロット4本あるしマザー選びはいつも困るんだけど、大抵は値段で決める(今までそれでハズレを引いたことがないので)オーディオは基板上で分離してるやで、と公式サイトではアピールしてるけど、実際あんまこだわらないし、鯖だしなぁ...と思ったりもする。AS-400しか出てこなかった。玄人志向の方はSFX電源で、後者は前者のプラグイン版っぽい。FSPのはATX電源。FSPの電源は6900円なのに対して、玄人志向のプラグイン版が7000円なので、プラグインに惹かれてこっちを選んでもいいかなっていう気もする。ケースをMETISじゃなくてしたので、別にスペース気にしなくても良さそう...というわけでめっちゃケーブル余らせてもいいかな〜とは思う(アクリルで中身見えるやつなのでスッキリさせるに越したことはないかな)ストレージはもうてきとうに。Intel選んどけばいいじゃろってくらい。マザーが対応してたとしても(してないけど)、鯖機にM.2はつけなくていいかな、などと思いこんでいるので普通の。容量はお財布と相談で180GBにしておいた。そんなに大容量が必要なわけじゃない気がするので取り敢えずシステム用SSDだけでいいけど、ダメそうになったらてきとうにHDD1つ追加する心積もり。500GBくらいなら安く手に入るでしょさて、OSについては、今までUbuntuDesktop(なぜServerではないのか...)使ってたけど、それなりに慣れてきたしということでArchLinuxでもいいかなと思っている。鯖として使うには不安定なのではとも言うけど、個人宅内鯖でとやかく言うことでもない。そんで、その上にsystemd-nspawnでコンテナ立てて、てきとうにサーバソフトウェア起こせばそれでいいかな?と。してもUbuntuほしければコンテナの上に立てれば良いので。以上、実際の構築は棚の上に上げておいて、てきとうに検討だけしました。ソフトウェアDHCPで繋いだ時のIPアドレスがわからなくてこまる事がある。何もいじってない状態の玄箱にtelnetしたいとか。いえば玄箱全然いじってないな。いう訳でLANの中にいるIPアドレスを調べる。nmapは-sPとか-PRとかつけて目的ネットワークを指定すればおksudoつけないと色々面倒なお話があるのだが、ネットワークのお話をちゃんと勉強しないとわからないっぽいので後日。(sudoつけなくても使えるが機能が制限される)次、arp-scanは-I(–interface)でインターフェイスを指定して、-l(–localnet)オプション付けるlocalnetオプションは検索対象をローカルの全てのアドレスにする。ソフトウェア今更なネタではあるような気がするけど、dnsmasqで内向きDNSを立てた。以前、ArchLinuxのリポジトリミラーをローカルに立てるという事で、ローカルにミラーを立てたのは良いけれど、家にいるときはローカルミラー、外にいるときは他のミラー...というように接続先を変えるのが面倒くさい。実はネットワークに接続するたびに毎度毎度mirrorlistを手作業でいじっていたのだ。これ自動化する手があるのかもしれないけど、それよりも、ドメイン登録して外からローカルミラーにアクセス出来るようにして、自宅からは内向きDNSで解決するようにして、mirrorlistにはいつも同じドメイン名書いておけばよいのでは?という結論にいたった。いう訳でそういうお話。・それらしいドメイン名で自宅外から自宅内のマシンにアクセス出来る・自宅内でも同じドメイン名でローカルマシンにアクセス出来る今回は、repo.hoge.comを192.168.0.3とかにあててみようと思う。dnsmasqを導入する。dnsmasq何も考える必要ないっすね。/etc/dnsmasq.confにいる。dnsmasq気になるようだったらサーバでrepo.hoge.comにpingとかしましょう/etc/hostsを設定した時点でサーバ内では名前解決出来るけど、ローカルネットワークの他のマシンからは名前解決出来ない。DNSにサーバを指定すればともかく、それをしたら他のネットワークに参加した時にまた対応せにゃならんでしょう(プロファイル作ってわけるってのもあるけど、手作業が面倒なのが根本なのでなしの方向で)つー訳で、ルータから特定ドメインの名前解決リクエストだけサーバに飛ばすように設定する(たぶん)。WR8370Nなので、他の機種他のメーカーは知りません(設定Web→詳細設定→DNSルーティング設定にルーティングエントリとして追加する宛先ドメイン:repo.hoge.comゲートウェイ:192.168.0.3プライマリDNS:192.168.0.3あとは設定を保存して動作チェックだ。自宅LAN内からアクセス→LAN内メインDNSサーバたるルータへ要求→ルータは設定されたドメインなので192.168.0.3へ転送→192.168.0.3のdnsmasqが解決してくれるという感じかしら?これ、別にリポジトリミラーの話に限る必要は無くて、自宅鯖とかに普通に使えるんすよね...自宅にあるマシンはどれも手作業でhostsいじってたけど、これからはこれ使って楽ちん設定だー。ソフトウェアArchLinuxって最小限のインストール構成だと(最小限なので当然なんだけど)使いにくいレベルで何も入ってない。Serverにしような」と言われてしまい、しかしそのインストールメディアは先生が持っていて、更に言うとストレージも実は用意してないので、やっぱり何も出来ない状況なのだ...とは言え、こんな格好のおもちゃ、放置しておくのは勿体無いよねって事で、USBメモリにOSをインストールしてそこから起動して色々遊べばいいじゃん〜と。要はまともに環境構築する気が無い環境で、アレ欲しいコレ欲しいって単発で欲しくなったときに、具体的にどのパッケージをインストールすれば良いのかを探す。今回欲しかったのはifconfig。NICの名前とかIPアドレスとか知りたいとふと思ったときに無意識に打ち込んじゃうけれど、これ最初は入ってないんでした......pacmanにオプションQoをつけて目的バイナリを探してきてねってお願いすると、パッケージ名出してくれます。ソフトウェア連番を頭につけたファイル群を取り扱う時、並び順を考えるとゼロパディングしておきたくなる。ソートしたときに、11011~略~22021~略~みたいな事されると、理想の並び順ではない。理想は勿論、12~略~1011~略~というような状況。最大桁数をカバー出来る桁数でゼロパディングしておけばこういう事故も起こらないはず...という訳でゼロパディングする手法2つ。話を簡単にするために8~12の5つを作ってみる。$str;done0080090100110122行目では008~0012までを単純に作る。後にこれを${str:(-3)}で、末尾から3文字だけ取り出す事によってゼロパディングをする。$str;done008009010011012C言語のprintfでゼロパディングするときと同じ感覚。その1の方がすっきりと言えばすっきりだけど、2行にまたがるのが微妙な気持ち(1行にまとめる方法は勿論ありそうだけど)その2なら新たな記法を覚えなくて済むし簡単に1行にまとまるから良い...けれどbashで、という気持ちのくせになぁ、みたいな...そもそもforの中身がCスタイルなんですけど。プログラミングC++でマルチスレッドにプログラムを書いた事はあったので、並列動作の基本はOKだぜ!と思っていた。ネットで拾ったコードを特に意識せずいじっていたらどうしてもうまくいかなくて、途中で気づいた。これマルチスレッドじゃなくてマルチプロセスだ。いうわけで区別しましょう。マルチプロセスまずはマルチプロセス。fork()関数で子プロセスを作るんだけど、これ、状態を全部コピーした上で子プロセスが動く。0;}fork()は、プロセスをフォークしてくれる関数だが、この戻り値をうまく使う。戻り値は、当人が(?)子プロセスの場合には0、親プロセスの場合には子プロセスのPIDを与える。deadi:0のようになる。単純に考えると、6.では1を出力しそうなもんだが、別プロセスであり、(マルチスレッドの時のように)共有していないので、インクリメントされる前のiを子プロセスは持っており、インクリメントされないまま出力を迎える。それから、親プロセスが終了した時点で、制御が帰ってくるみたい。(親プロセスが終了しても子プロセスは生き残る)それからマルチスレッドこちらはプロセスの中で処理スレッドを増やすものなので、メモリ空間は共有。0;}コンパイル時には忘れずライブラリくっつけておく。-lpthreadみたいな感じ。メインスレッドが最後のスリープをして終了これ、最後のスリープをしないと、メインスレッドが5秒経過後インクリメントした直後にプロセスが終了する。サブスレッドは6秒たたないと2回めの表示をしないので、つまり、1回目の表示しか実行されない。まとめマルチプロセス:fork()とかでうまくやる。メモリの状況はコピーされ、共有されない。親プロセスが終了しても子プロセスは生き残る。親子プロセスで何かやりとりしたければプロセス間通信の手を考える必要がある?(名前付きパイプとか?)マルチスレッド:threadでうまくやる。メモリの状況は共有される。メインスレッドが終了すると派生した方のスレッドも終了する。