序
私は先日、半月ほど入院した。
入院時の状態は悪かったが、あまり体の不自由はなかった。 点滴も最初の2日だけで、検査等は多かったがそれなりに自由に動けた。
緊急入院ではなく半日ほど用意に使える時間があったので、それを活用して準備していたシステムを最大限活用するようにした。 そして結果的にそれらは非常にうまく機能したので、ちゃんとうまく機能した報告として残しておこうと思う。
なお、本稿ではコンピュータ関連に限って述べる。
また、用意に関してはいままでちょっとずつ述べてきたものであり、全部を述べるのは困難なのでそこの解説はしない。 本文で登場したら「あ、そんなことしてたんだな」と思ってほしい。気になるものがあれば、Chineomi内で検索すれば記事が出てくるはずだ。
持ち込んだもの
- ThinkPad X1 Carbon (Gen5, Core i5-7200U)
- USBメモリー (USB 2.0, 16GB)
- USB充電器 45W
- USB充電器 60W
- USBケーブル Type-C - Type-C 2.0 100W 3m
- USBケーブル Type-C - Type-C 2.0 100W 0.3m
入院直前の用意
ハブサーバーのSSH接続維持
「ラップトップを持ち出して端末として使う」上で最も重要になるのが「自宅への経路」だ。
これは基本的にハブサーバーがVPSに対してssh -Rしていることで実現している。
これ自体はSystemd Service Unitにしてあって、出かける前にstartするだけで良い。
が、実は懸念がないわけではない。
なんらかの理由でsshプロセスが終了した場合、Serviceユニットのrestartに従ってユニットは再起動される。
このため、単に終了した場合は問題なく接続を復帰させることができる。
また、困るのはsshプロセスがフリーズした場合だが、これに関してはServerAlive*の設定により切断させることができるので、これも問題ない。
だが、再起動に失敗した場合は困る。
Systemdはrestartに従って再起動を試みるが、これには制限がある。
無限に試行してもらうように調整すれば良いのだけど、今回はその手間を惜しんでもっと乱暴な方法を取った。
それがこれだ。
#!/bin/zsh
result=$(ssh sshproxy)
if [[ $result != pong ]]
then
print "Restart Proxy"
systemctl restart sshproxy.service
fi鍵コマンドでecho pongするようにしてある。
ユニット側で調整しろよ、ではあるのだが、入院前で頭を使う時間がなかったのだ。 本当にそのパラメータでちゃんと最終的に再起動するかの検証も必要だったし。
これをTimerユニットで起動するようにして、力技で解決。
PCの起動
自宅環境へのアクセスはハブサーバーを経由するのだが、当然そこから先にアクセスしたいホストについては起動しておく必要がある。
私はサーバー以外にメインPCと会社PCを起動した状態にしておいた。 寝室PCとファイルサーバーは起動しなかった。
ファイルサーバーを起動しなかった理由は、ファイルサーバーが起動可能な状態にしてあると、オフライン攻撃としてはデータにアクセスできてしまうからだ。 入院という状況で何があるかわからないので、オフラインで復元処理をしないと起動できない状態にする必要があり、そうなると起動状態で放置することができなかった。
寝室PCに関しては、寝室PCのデータにアクセスしたいことはないだろうという判断だった。 結果的には失敗だった。
これは、一部USBエンクロージャのSSDはサーバーにマウントした状態で出かけていてアクセスできたのだが、それなりに厳選した。 ところが、実際は寝室PC内のデータに加えて、寝室PCにつけたままになっているUSB-SSDのデータも触りたい機会があり、寝室PCを起動した状態のほうがよかった。
あとついでに、各ホストには頻繁に使うSSH鍵をエージェント(gcr)に入れておいた。
シャットダウン
ハブサーバーへのログインをチェックし、入院期間よりも長くハブサーバーにアクセスされていない状態が継続する場合は各ホストは自律的にシャットダウンするようにした。
ちなみに、シャットダウンしなかったとしても、状態としてはLUKS解錠されている状態なのでコールドよりも非セキュアな状態ではあるのだが、そのデータにアクセスする方法としていずれかのホストへのログインが絶対に必要であるため、言うほどオフライン攻撃に対して脅威を持っているわけではない。
ただ、シャットダウンしてしまえばそもそものデータアクセスにLUKS解錠を要求することができるため、シャットダウンできたほうが安全だ。
なお、事前の話としてモバイルからサーバーにメッセージを送信、そこからシャットダウンする、というようなことはできるようになっている。 しかし、今回の場合突然何にも触れなくなるということも考えられたので、別の方式を急遽用意した。
各機能へのアクセス
SSH
まず前提として自宅PCには前述したようにVPSを経由したSSHでログインできる。
VPSにはハブサーバーの鍵がないため、この部分は必ずProxyJumpを用いる必要がある。
ハブサーバーは自宅サイト内向けの鍵を持っているので、「ハブサーバーに入ってsshを叩く」で良い。
ただ、ここまでできていれば~/.ssh/configに書くだけで1もう1段ProxyJumpを重ねて直接ログインすることもできる。
単にSSHログインしたい場合はハブサーバーから叩けば良いのだが、SSHFSを使いたい場合やgvfsでマウントしたい場合、rsyncでファイルをもってきたい場合は直接ログインできるようにしておきたい。
メインPCが固有でもっている作業あるいは作業環境はそれなりにあるので、SSHでメインPCにログインした状態で作業することはそれなりに多かった。
Seafile
Seafileでの同期部分は非常に単純。
インターネットにつながっている前提であればSeafile Appletが起動されているだけで同期される。
ラップトップはインターネットにつながっている保証がないのでSeafileは自動起動していない。 が、インターネット接続がある状態でSeafileを起動するだけで同期できる。
自宅側では出かける前に同期を済ませてあった。
Unison
Unisonに関してはめんどくさい要素が複数あるので、入院中の同期はしなかった。
出かける前にちゃんと同期して出てきただけだ。
Git
Gitリポジトリはハブサーバーにある。 少しややこしい部分だが、ハブサーバーがupstreamではあるものの、そのリポジトリを展開するのはメインPCである。
メインPCから見てもハブサーバーのリポジトリがupstream (origin)なのだが、ビルド等を行うのはメインPCの役割だ。
ThinkPadの作業を自宅に反映することについては、Piecesの「持ち運ぶラップトップでgit pushする経路を自動で使い分ける」で述べた方法を使用した。
また、この仮定でプロキシ経由でハブサーバーのリポジトリを登録しているので、自宅側で作業した(主にメインPCで計算力を使った処理をした)ものを手元に持ってくる場合は単純に
git pull proxyすればよく、これでやりとりが可能になっている。
なおPiecesの記事が入院中に更新されているが、この方法を使った。
手元作業 (エディタ)
手元作業は大部分をNeoVimを使った。
別にVSCodeも使えるのだけど、性能的に余裕がなくて変換がかったるいことになりやすかったので、NeoVimのほうが快適に作業できることが多かったのだ。 最近NeoVim環境を整備したのが役立った。
ウェブ
ウェブアクセスは普通にThinkPad内で行った。
ただ、ネットワークは多くの時間は病院内のWi-Fiを使用したため、セキュリティ面に不安があった。 SSHアクセスはSSHなので不安がないのだが、ウェブ部分はHTTPSを使用していても万全ではない。
幸いにも先日のWindscribeのセールでWindscribeを契約していたことが役に立った。 ただ、単純にWindscribeを有効にするとSSH経路が利用できなくなる。 「接続→スプリットトンネリング」を使ってVPSを除外することでこの部分をWindscribe有効のまま機能するようにした。
ThinkPadが非力なので非常に辛い部分。
サーバーメンテナンス
ThinkPadはサーバーの鍵を持っているのだが、想定外の問題として「サーバーのSSHはIPv6しかlistenしてない」があった。 利用可能なネットワーク接続のすべてがIPv6を持っていなかったのだ。
これはIPv6とうプロトコルの問題なので、IPv6を持っているVPS(SSHのプロキシとして使っているやつ)を経由すればアクセス可能だ。
しかし、ここはもっと単純に、メインPCからサーバーログインを行うようにした。 つまり、
ThinkPad -> VPS => ハブサーバー -> メインPC -> サーバー
である。
手元作業 (Inkscape)
KIAI。
メディアデータの提示
病院内でメディアデータを見せる機会があった。
こういうときのためにXXWMPが存在しているのだが、そもそもSeafileで同期しているデータはThinkPadが持っているので、普通にThinkPadのローカルファイルを見せるだけであった。
資料の提示
画面を見せるのではなく資料を渡したいときもあった。
資料はHTMLで作成、Printing CSSを書いてPDFを生成、これを持ち込んだUSBメモリの保存し、病院内のコンビニのマルチコピー機で印刷した。
より正確にはThinkPad側がサイト内向けの鍵を持っていて、サイト内のホストに登録されている必要があるのだが、当然ながらサイト内のGitリポジトリ等にアクセスできるようになっているのでThinkPadもそうなっている。↩︎