Systemd-nspawnでの開発環境構築

まあArch Wikiとか見て頑張ってくださいで終わりたいんですが、一応備忘録

開発環境のコンテナつくる

$ mkdir ./target-dir
$ pacstrap -i -c -d ./target-dir base --ignore linux php mysql composer

的な感じでやります。btrfs向けの機能もsystemd-nspawnにはあるらしいのでそのへん参照するといい感じになりそう。

btrfsのスナップショットを使ってコンテナ作るときは--templateオプションを使うらしいです。しかしこのあたりよくわからんし試してないので今回はスルー

起動する

$ sudo systemd-nspawn -bD ./target-dir

これでなんかコンテナが起動する。-bオプションで普通にchrootする代わりにマシンとして起動しているみたいですね

この後よしなにcomposer installとかしたりいろいろしてやるといい感じに出来ます

やりたいこと

本当はmysql用のコンテナをシュッと1個生やしておいて、複数の環境に対してそのコンテナを動かしてDBを参照させるみたいな方法をとりたい。しかしよくわからなかった

仮想ブリッジをたててうだうだするといいらしいんですが、仮想ブリッジを作るとルーティングが崩壊して全てが終わってしまったりするし、systemd-networkdがなんもわからんとなりました。

コンテナとホストのネットワークは通ってるんですけど、コンテナから外に通信できないし、コンテナから他のコンテナに通信するのもうまくいかなかった。この当たりはネットワーク詳しい人はどうにか出来るんだろうけども、そうじゃない人にとってはちょっと重いですかね。 そのへんはDockerのほうが楽っぽいですね

気持ち

Dockerが無限にbtrfsのスナップショット作成しまくったりコンテナの中間イメージをためまくって最悪なのが最近嫌なのでなんとかしたくて、そういう意味では一個にまとめて開発環境作るならまあ悪くはなさそう。

もともとDockerならデプロイが楽〜みたいなのも幻想っぽいというか、それを実現するのって結構大変だし、雑に使う分にはSystemd-nspawnのほうが好きかなという感じです。

それこそ依存関係とか汚したくないときに適当にpacstrapすれば簡単に環境作れるので、そういう意味では手軽で嬉しい。

面白いのは、Gentooのstage3のtarballをばらまいてその上でSystemd-nspawn起動するとGentoo環境が簡単に動くわけで、これをbtrfsのサブボリュームの上にtarballばらまいてemerge --syncとかしてゴチャゴチャやるとGentoo環境が出来る。 このままブートローダにrootflags=subvol=/gentooとかってサブボリューム指定すれば簡単にGentooとのマルチブート環境が作れるわけですよ。嬉しいかはともかく。試してないけど多分出来ると思います*1

まあ機能がもうすこしいろいろやってくれると嬉しいけどSystemd-networkdとかSystemd-resolvedとかをラップしてしまうのは微妙っぽいしこんなもんかなあ

*1:しかしkernelはもともと動いてたやつなのであんまり旨味はなさそう?

Arch Linuxで充電中のiPhoneを再接続すると充電が再開されない問題がわかった

なんかよく考えればすぐわかったんですが、usbmuxdサービスが悪いっぽくて、コイツを再起動すると充電再開してくれます。

一度切断するとデバイスの各種属性などが神隠しにあったりするんですが、いい感じのudevルールを書いてsystemctl restart usbmuxd.serviceするとよさそう

Twitterでツイートが伸びた結果著作権や肖像権などを侵害された話

まあツイートが伸びたのはどうでもいいです

はい、私の自撮り画像が無断で利用されていますね。著作権侵害及び肖像権の侵害、ツイートの内容は人格権を侵害してるのかもしれませんね。*1

どうでもいいけど自我のあるなしと自撮りを自称かわいいだの自称美人大学生だのって関係あるんですかね?*2

これは archive.isです。 経緯が書かれているが「自我について取り扱ったツイートで、自我がなさそうな人がたくさん来るの皮肉か?」というツイートを見てブーメランだと思ってわざわざ自撮り探してきて著作権・肖像権侵害を行うの言ってることとやってることと思いついた順序が何もかも違っていてすごい。自然言語の私の知らない画期的な使い方してるようで感動している。

面倒だったので、すぐツイートを報告してブロックしたんですが、これ普通にDMCAの申請できるなと思い、やろうとしたんですが。

まず、著作権を侵害している疑いがあるコンテンツを投稿した利用者に、申し立てに含まれるすべての情報(報告者の氏名、住所、電話番号、メールアドレスを含む)を送付します。

著作権に関するポリシー

と書いてありかなり厳しい気持ちになりました*3

とりあえず卒研の進捗がヤバいので余裕があればですが、法律系の然るべき機関に代理をお願いしてDMCA申請なり削除要求なりやってみたい気持ちはあります。しかし貧乏学生なのでお金がない…

誰か面白がって代理人やってくれる信用できる人*4あるいはかかる費用など負担してくれる優しい方*5*6がいればすぐ解決するが、まあ申し訳ないし代理人を立てるとどのくらいの費用がかかるのかだけ知りたいですね…

*1:disられてる内容についてはまあわかるけどムカつくもんはムカつく

*2:異常者ムーヴという自覚はあるしむしろその情報だけだと自我や自意識がクソデカそうに思えるが…

*3:私個人の名前や所属などの情報はともかくとして、住所や電話番号が相手の人間に伝わるのはまずい

*4:面白がってる人を信用していいかは別っぽい

*5:もちろんあまりに高そうなら遠慮するが…

*6:お金に余裕ができたら返すつもりですが

dcodeIO/WebAssembly つらい

なんでつらいかというと、クソだからですね。

なんでこんなパッケージを使おうと思うかと言うと、stdlibやらstdioやらの関連ヘッダーファイルをWebAssembly用に再定義してくれているからです。

ご存知の通りWebAssemblyにはmallocなどは無いというか、普通に/usr/include/とかのヘッダーをとってくるとWebAssemblyではmalloc関数が解決されずimportして使うことになるわけなんですが、そうなるとmallocの実装をどうとってくんねんみたいなお気持ちが発生しお気持ちということです。

$ npm i webassembly
$ ./node_modules/.bin/wa-compile hoge.c

とかやるとpost-installでdcodeIO謹製のビルド済みLLVMが落っこちてきてそれを使ってやっていきが開始するわけですが、libtinfo.so.5がねえって言われて死にます。クソ。

共有ライブラリにシンボリックリンクはやしてうんぬんとかやると破滅しがちなのでやりたくないし、結局自分でビルドしていたllvmツールたちにシンボリックリンクをはやすことになり…

とにかく厳しい状態になっています

Twitterアカウントがロックされた

Twitterから解脱できるという意味では良いような気もしますが、違反行為と書いてあるような内容に該当するような感じが自分には感じ取れないんですがどうなんでしょうか? いやまあこれが該当するならただすいませんとなるだけなんですが…

著名な皆さんと違い私はアカウント新設しても誰もついてきてくれなさそうな感じがしますが、ロック解除されたらいい感じに移行先用意とか死や殺が含まれるツイートを削除して行くのが良さそうな気がします。というかTwitterやめたほうがよさそう

というか誤凍結やらが多発してるのを認識しながら明らかにワードマッチングでやり続けるの馬鹿っぽいし、Twitter社はまともな審査制度を用意しろ

私への連絡はkeybaseやmstdn.maud.ioやsocial.mikutter.hachune.netのMysticDoll宛にシュッとしてください

Arch Linuxのパーティショニングをやり直した備忘録

3月くらいにArch Linuxを常用しはじめたんですが、完全に馬鹿なので、/, /var, /homeをパーティション用意していてかつすべてbtrfsにしていました。

通常Linuxをデスクトップ用途で使う場合パーティション分ける必要ないというのを知らなかった*1ので非常に厳しい感じにDockerがイメージを無駄遣いしている状態でした。

まあそういうわけでパーティショニングをやりなおすという作業をしました。環境自体はそのまま生き残っています。

そういうわけでいろいろちょっと前にTwitterで騒いでいたら老師おるみんさん@kotatsu_miからこんな感じのリプライを頂いた。

また、btrfsのプロからもこんなリプライをもらった

まあそういうわけでおるみんさんからHDDを借りてbtrfs sendを使ってグッとまとめてfstabとブートローダーだけ書き換えてなんとかしました*2

スナップショットの作成

とりあえずスナップショットを作成します。

$ btrfs subvolume snapshot -r / /root_backup
$ btrfs subvolume snapshot -r /home /home/home_backup
$ btrfs subvolume snapshot -r /var /var/var_backup

みたいな感じにします。-rをつけてるのはsendできるのはRead Onlyなスナップショットやサブボリュームだけだからですね。

Dockerが/var/lib/docker/btrfs/subvolumesにたくさんサブボリュームを作ってるんですが、色々やってたら/varの容量(10GBしかとってなかった)が無くなって破滅したので面倒になって全部消しました。

スナップショットは再帰的にとってもらえないので、そのへんをちゃんとやりたければ、

$ btrfs subvolume list (mount point) | cut -d' ' -f8 | xargs -I$ btrfs subvolume snapshot -r (mount point)$ (mount point)/$_backup

みたいな感じでスナップショットをとるか、(検証してないけど)

$ btrfs subvolume list (mount point) | cut -d' ' -f8 | xargs -I$ btrfs property set (mount point)$ ro true

とかすればサブボリュームがRead Onlyになるはずなのでおそらくbtrfs sendでおくれるはず

スナップショットを外のハードディスクに逃がす

逃します。とりあえずおるみんさんからかりたHDDをbtrfsでフォーマットしてマウントします。

$ mkfs.btrfs /dev/sdb1
$ mkdir /orumin
$ mount /dev/sdb1 /orumin

んでもってbtrfs sendします

$ btrfs send -v /root_backup | btrfs receive /orumin/

他のサブボリュームも同様にぶん投げます

パーティションを切り直してサブボリュームをリストアする

とりあえず順番にもどしていきます。このときroot_backupとかいう名前のままだとだるいのでリストア前なり後なりでサブボリュームの名称を変更しておきましょう。 切り直したパーティション/mntにマウントしておきます。この作業はArchのLive Imageでやっています。

$ btrfs send /orumin/root_backup | btrfs receive /mnt/
$ mv /mnt/root_backup /mnt/root

このまま/mnt/root/homeなどを戻していくんですが、先にスナップショットの名称を変更している場合は同一名称のディレクトリがあるとsend/receiveできないので、いろいろします。

$ btrfs property set /mnt/root ro false
$ rm -r /home
$ btrfs send /orumin/home | btrfs receive /mnt/root/
$ btrfs property set /mnt/root/home ro false

という感じでやります。/varの中身とかに既になんか入ってたらいい感じにしてください。何にしても最終的にはRead Onlyだとこまるので最後には全部Read Onlyを外します。

fstabの書き換え

一応全部移し終えてRead Only外せたらarch-chrootとかしてちゃんと動くかを確認しておきましょう。んで、fstabの書き換え。

どうせUUIDとか覚えられないので、

$ ls -l /dev/disk/by-uuid/ | vim -

とかしてバッファに一覧を表示した状態でfstabに書くUUIDを書き換えます。

このままだと/をマウントできないのでオプションでsubvol=/rootを追加しておきます。お好みでcompress=lzo

ブートローダの書き換え

ブートローダのオプションも書き換えます。

ブートローダのオプションにはroot=PARTUUID=<Partition UUID>みたいなのを書くのでさっきみたいにして

$ ls -l /dev/disk/by-partuuid | vim -

で見ながらブートローダを書き換えます。自分はSystemd-Bootを使ってるのでoptionsのパラメータを書き換えればOKでした。例によってこのときオプションにrootflags=subvol=/rootをくっつけないと起動失敗するので注意、ブートローダは生きてるので焦らずやっていきをすれば大丈夫。

おわりに

こんなことをしなくても良いようにみなさんはちゃんとArch Linux Wikiを読みましょう。

*1:ちゃんと読んでなかった

*2:UEFIなので割とかんたんにできた

内定式が近づいて来た

来年度からは紀尾井町のクソデカビルで戦うんだな、と思うと不安でいっぱいです。

学部新卒で年収をあの会社であげるのは結構難しいと思うので、そういう部分を覆せるくらいのやっていきができると最高だなと思っています。

まあそもそもそこそこの金がもらえて技術で遊ぶ余裕があって、使える技術が増やせればいいなと思っているだけなので不安もクソもとりあえず理不尽な部署とかに配属されないで欲しいくらいしかないんですが。

ブログで内定出た話は多少あったが、結局どこにするとかは書いてなかったのですが、目黒のドリ社と表参道の?社と紀尾井町のY社の内定をもらって最終的にYにすることになりました。

そこそこSNSでの発言に問題がある自覚もあるし、社会人になるにあたってその辺りをドデカ企業でシュピッとできると良さそうだなと思っていますが、御社の人間で邪悪なフォロワーがいるので不安です。

絶対に生き残って年収無限にあげてえ…