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者からお互いにアクセス出来る。ソフトウェア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をつけて目的バイナリを探してきてねってお願いすると、パッケージ名出してくれます。ソフトウェアC++なら関数オブジェクト使えとかいう記述をどこかで見かけたんだけど、結局よくわからなかったので関数ポインタを使う事にした。(*関数ポインタ名)(その関数がとる引数の型)という形で宣言して使う。intで1つ引数をとって、5足したものを返してくれる関数を考えてみる。0;}細かいアレはともかくとして、fpが関数ポインタ。いう使い方だと今のとこあんま面白くないけど、関数ポインタを使えば関数の引数に関数を使える。与えられた関数から返ってきた値の正負を判定する関数pmを考える。0;}使いどころは、計算の一部分を利用者から与えてもらって、それを使って全体の計算をやるって場面。(ていうかそういう場面があったのでこうやって書きました)具体的に言うと、数値解析のときにつかうテクニックがあるんだけど、これを毎度書いてるとウザいので、オレオレライブラリにしてやろうという感じ。テクニックのアルゴリズム自体はライブラリ側で全部書いておいて、利用者は目的関数の定義だけしてあとはそれを放り込むだけ〜というやつ。ソフトウェア連番を頭につけたファイル群を取り扱う時、並び順を考えるとゼロパディングしておきたくなる。ソートしたときに、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スタイルなんですけど。ソフトウェアPDF結合?取り敢えずImageMagickやろwwwwwwとか思ってconvertバシバシ叩いてたんだけど、圧倒的メモリ不足で全然終わらない(RAM4GB+Swap4GBを全部食い潰していた)なんやこれと思って暫く悩んでいたんだけど、どうしようもないのでぐぐってみたら、一発目から「pdftk使っとけよw」って煽られたのでそういうことだ。FILE]処理もサクッと終わるとメモリも全然食わないわからなければ素直にぐぐりましょう。ソフトウェアWindows+Iの設定で普通に設定する事は出来るが、やりにくい。背景設定で、選択したい画像を右クリックすると、どのモニターに設定するか訪ねてくれる。この画面ではサムネイルしか見れず、またファイル名も見れない。waifu2xなどで拡大した場合など、非常にわかりにくい。参照ボタンから画像を追加出来るが5つまでしか履歴が保持されない。フォルダ内に壁紙ファイルを放り込んでおき、一覧されたサムネイルから選択する事が出来ない。画像が多い場合には不便だ。Windows10の設定アプリは諦めようかと思ってもダメ。コントロールパネルを利用しようとすると、デスクトップのカスタマイズ→個人設定で背景設定へ移動してもWindows10の設定アプリが湧いてきて無意味だ。コントロールパネルの中に壁紙を設定するUIや機能はそのまま残っているらしく、直接呼び出せばいけるらしい。世の中は不思議なことだらけコントロールパネルをそれらしい引数で起動する。・Windows+R(ファイル名を指定して実行)から実行する・cmd内で実行する・ショートカットのリンク先として指定するなどでも使える。てきとうなところにショートカットとして用意しておくのが便利で良い。ソフトウェア途中で変な状況になっているのを、考えるのが面倒になって強引に進めただけなんですけど。起動しなくなりました。unknown-block(0,0)rootのファイルシステムが見えませんぜと言われている気がしたので、grubの設定が合わなくなったのかなと思って、grub-installとかやればいいのかな?と思ったはいいものの、マザーボードが古いのかなんなのか(2008年頃のものなので10年近く前か)USBキーボードをgrubメニューの間(後からわかったけど、カーネルが起きてくるまで?)認識してくれない。過去のカーネルで起動して作業しようと思ったけど、これじゃダメだ。shellに入るようになりました(状況悪化)しょうがないので部屋のどこかにあるPS/2接続のキーボードをどうにか見つけて引っ張り出してきて、接続。Ubuntuで「update-initramfsしろよな、それからupdate-grub2しろよな!」って書いてあったのでそれを実行。bootここまでで新しいカーネル4.4.0-47じゃなくて、正常に動作していた過去のカーネル3.13.0-92で起動できる。pager=1で常にmoreみたいな状況にする。ちなみに、lsの結果のmsdos5がswap、msdos1がrootパーティション(/bootもこの中)。最近/bootを分ける構成ばかりだったので、つまり/dev/sda1が/、/dev/sda5が/bootだと勘違いしていた。容量もそれぞれ600GBくらいと4GBくらい。4番目の操作で間違った入力、つまりroot=/dev/sda5していると、当然起動には失敗する。非常に簡単な対話式の操作画面に入った。これに気付くまで割りと困ってた。linux-image-とかで調べましょう。あとは再起動してやれば完了。ソフトウェア発端はCinnamonがクラッシュしたところ。cinnamonすると、libreadline.so.6が無いよ、と。再起動しても状況は変わらない。そもそもCinnamonが起動しない。インストールされているのはreadlineの7らへんだったので、cinnamonがまだ対応出来てないのかなと思って、じゃあreadlineを6系統にダウングレードすれば良いのでは、という強引な発想をした。readlineしてローカルのパッケージキャッシュからインストール...したら起動しなくなりました。GUIが、とかじゃなくて、そもそもログイン画面まで届かない(CUIなログイン画面にも届かない)。しょうがないので、元に戻すことに。readlineしちゃえば良いのでは?と思っていたのもつかの間、arch-chrootがlibreadline.so.7を要求していて出来ない。ただのchrootだとpacmanとか出来ない(/etc/mtabが無いよ、とか言ってくる)ので、arch-chrootがいいんだけど。arch-chrootはシェルスクリプトなんですよ、というのをどこかで聞いた記憶があったので、じゃあそれの動作を一つ一つやればいいんちゃう?と思ったあたりで、archwikiを見に行くと、ズバリな記述を見つけたので、それを参考にchroot。engineと怒られて出来なかった。/etc/pacman.confそしたら起動するようになったこの起動はゴールではなく、最初の状況に戻ってきたってことだ。変わらずCinnamonはlibreadline.so.6を要求してクラッシュし続けるので、tty2に移動して、libreadline.soで検索、ダメ元だけど、そこにlibreadline.so.6という名前でシンボリックリンクを張って再起動してみた。ら、Cinnamon普通に起動しました。これでやっと普通に使える。