Skip to main content

ログ取得ツール

Category: GNU/Linux

macのVM環境

VM環境っつーかLinux環境だ。これがないと何かと始まらないよね結局。

普段はdockerで間に合うんだけど、ごく稀にvagrant使いたくなることがあるでしょう。デプロイ先の、dockerとOSのバージョンに関する問題を手元で再現させたい時とかさ。でもApple Siliconでvagrantでうまく使えるVMシステムっていうのはあんまり気軽じゃない。UTMとかCLIはちょっとずつ出てきてるけど、まだvagrantを実現できるだけの機能はなく、プラグインも作られていない。limaもいまだvagrantからは使えないみたい。再現性のあるVM環境として便利なんだけどな、vagrant…

もうみんな(自分もだが)vagrantなんて使ってないし、仕方ないのかなーと思って漁っていたら、macOSにも仮想マシンのレイヤのAPIが出ていることもあって、割と良さそうな知らないやつがポロポロ出てきていたんだ。で、そのうちのorbstackってやつを試している。こいつが割といい感じだった。

docker有料プラン

かねてから儲け方が分からないままに便利すぎるソフトウェアを世に出していたdocker。もはやこれがなければほとんどの開発者は立ち行かないというレベルに達していると思うが、多くの人が使っているdocker desktopに有料プランの強制という話が出てきた。先週だったかな。朝dockerからメールが来て、ビビりつつ周りの様子を伺っていたが。多くの開発者がいる中〜大企業の開発者からはカネを取る、と。直接取る方向になったんですね。妥当な判断ではあるでしょう。

IntelliJ IDEAとかと比べてもdockerの利用を回避するのは難しそうですね。IntelliJはJavaの開発をしていたときは部署で買ってもらったライセンスを使って便利に使わせてもらいましたが、Javaの開発とオサラバできたので今はvscodeの住民になりました。dockerも個人利用は無料のままみたいですけど、会社では有料で使うとして、個人ではリモートのLinuxに上げたdocker-ceを使おうかなと思って少し検討してます。このまま行っても個人側の課金はなさそうだけど一応、借りてるサーバも少しはあるのでモッタイナイ精神がね。

zshのcompletionの罠

zshのcompletionで不便なのは、_shが変なふうに定義されているところ。PATHから実行ファイルを探してきて補完しようとする。で、実行ファイルがシェルスクリプトじゃなくてバイナリとかだったら実行できないわけだ。

私がわざわざ「sh xxx.sh」とするとき、xxx.shはPATHから探してきてほしいわけではなくて、カレントディレクトリにあるファイルを実行して欲しい。なのだが、TABで補完すると知らんコマンドがたくさん引っかかる。これは不便だ。

というわけで、以下の内容のファイルを/usr/local/share/zsh-completions/_shに配置する。

#compdef sh ksh bash
_default

これで平穏は保たれた。しかしsh xxxでxxxをPATHから探してくる動作は酷くないか? Unixの歴史の闇…しかも、普通のコマンド実行と違って、カレントディレクトリが優先だ。

sh-3.2$ cd $(mktemp -d)
sh-3.2$ ls -a
. ..
sh-3.2$ sh ls
/bin/ls: /bin/ls: cannot execute binary file
sh-3.2$ vi ls
sh-3.2$ chmod +x ls
sh-3.2$ ls      ← /bin/lsが実行される
ls
sh-3.2$ sh ls   ← ./lsが実行される
hello

PATHから探して欲しけりゃ、わざわざ「sh」つけないでしょ、っていう。普通のインタプリタで実行するファイル名を指定する時は、そうだよ?

Raspberry Piを使ってAirPrintされたものをPDFにする

えー、

  • iPadとかからAirPrintで印刷
  • Raspberry PiがそいつをPDFに変換
  • PCからそのPDFを読み込んでUSBメモリかなんかにコピー
  • コンビニに持って行って紙に出す

というワークフローがあったとして、Raspberry Pi側の設定。私は常識人なので、Raspbian(Lite)を使ってます。そして自宅にプリンタを置くつもりはありません。

やることは、

  • avahi daemonを上げる
  • cups daemonを上げる
  • cups-pdf関連の設定
  • sambaの設定

といったメニュー。

まずはcupsとcups-pdfを設定していく。

  • sudo apt install -y cups cups-pdf python-cups avahi-discover
  • sudo usermod -aG lpadmin pi
  • sudo vi /etc/cups/cupsd.conf
    • 「Listen localhost:631」を「Port 631」に書き換え
    • 全てのLocationに「Allow @Local」を追加
  • sudo mkdir -p /var/spool/PDF
  • sudo chmod 777 /var/spool/PDF
  • sudo vi /etc/cups/cups-pdf.conf
    • Out /var/spool/PDF
    • AnonDirName /var/spool/PDF
    • Label 2
    • Grp lpadmin
    • DecodeHexStrings 1
  • sudo systemctl start cups
  • sudo systemctl enable cups
  • sudo systemctl start avahi-daemon
  • sudo systemctl enable avahi-daemon
  • sudo lpadmin -p CUPS-PDF -v cups-pdf:/ -P /usr/share/ppd/cups-pdf/CUPS-PDF.ppd -E
  • sudo lpadmin -d CUPS-PDF

次に、Sambaの設定。

  • sudo apt install -y samba
  • sudo vi /etc/samba/smb.conf
    • [PDF]
      • path = /var/spool/PDF
      • read only = no
      • browseable = yes
      • guest ok = yes
      • force user = nobody
  • sudo systemctl start smbd
  • sudo systemctl enable smbd
  • sudo systemctl start nmbd
  • sudo systemctl enable nmbd
    • samba.serviceはmaskedというロック状態になっている。これを起動しようとして色々苦労したが、無駄だった

あとは、/var/spool/PDFに入った古いファイルを削除して回る設定をする。Debianなのでtmpwatchではなくsystemdのsystemd-tmpfiles-cleanを使う。

docker hubのautomated buildに問題が…

みんな使っているdocker hub(イメージのリポジトリ)。これは非常に便利で、Dockerfileをgithubに置いて連携させると、勝手にビルドが走る。設定したベースイメージの更新やgithubへのpush/mergeでトリガが走り、勝手にイメージをビルドしてくれるわけだ。最新に保てるし、automated buildの印がついてそこはかとない安心感を与えるし、とても良い。 ただ問題があって、ちょっと前(17.05あたり)からdockerにはmulti stage buildという機能が入ったんだけど、docker hubのイメージのビルドに使われているdockerが少し古くて(現在17.03.1-ee-2)、multi stage buildで書いたDockerfileを処理できないのだ。 multi stage buildというのは便利な機能で、例えばubuntuやcentosのイメージでビルドしたソフトウェアをalpineに持って行って小さいイメージで実行する、といったようなことが簡単にできるのです。これが来るまではalpineでビルドツールを入れる〜ビルドする〜ビルドツールを削除する、という一連の作業を一つのコマンドで実行しなければならなかった。multi stage buildはそういう煩わしさがないんですね。 まあalpineはlibcもglibcじゃないから単に持っていっただけだとダメなことがほとんどです。ライブラリも含めて根こそぎ持っていけばなんとかなるってケースも多い。 (追記) 2017-08-20 docker 17.06のEEが出てからちょっと経過したが、まだ17.03が使われている。この間、ずっと見ていたissueはこれ。 https://github.com/docker/hub-feedback/issues/1039 もうすぐだと思われる。あー待ち遠しい。

dockerホスト環境メモ

boot2docker

  • docker-machine + virtualboxのデフォルト
  • 基本はdocker-machineで管理するのが楽
  • アップデートが超簡単
  • dockerは常に新しい
    • docker本体がリリースされてすぐにdocker-machine upgradeすると新しくなる
  • カーネルは若干古い(4.4)
  • aufs

rancheros

  • docker-machine + virtualboxで使える
    • ただしアップデートできない
  • dockerは若干古い
  • カーネルはboot2dockerよりは新しい(4.9)
  • overlay2
  • boot2dockerより少しでかい

coreos

  • カーネル、dockerともに新しい(alpha channelの場合)
  • overlay2
  • 本体にgitとかも入っていて、多少は操作に耐えうる
    • git-lfsは入ってない
  • 割とでかい

alpine linux

  • 無理やりdockerを入れることができる
  • overlay2
  • カーネルはboot2dockerと同じくらい(4.4)
  • apkで色々なソフトを入れられる。dockerもedgeを有効にすればapkで入る
  • dockerは新しい

fedora25 atomic

  • atomicと言いつつ、でかい
  • カーネルは新しい(4.11)
  • dockerはとても古い
  • devicemapper
  • dnfで色々入る…と思いきやdnfが入ってない

いつも使っているのはdocker-machineなのでboot2docker。この構成は鉄板なのだが、boot2dockerはaufsにこだわっているせいかカーネルが古いのが気になるところ。設定だけならboot2dockerでもoverlayfsを使えないことはない。全体的に、新しさとして問題ないのはcoreosのalphaだが…

気づけば僕の手元のVMはdocker-machineだけになっていた…

会社の手元マシンにも自宅の手元マシンにもVirtualBoxを入れているんですが、気づけばVirtualBoxの中にいるVMはいずれも一つだけになっていた。

その正体はdocker-machineのboot2docker。結局dockerだけで済むから他にVMなんて作る必要はなかったんだ。

確かに、時にはdockerではどうにもならないこともあって、vagrant使うこともあるんだけどね。でも大抵はdockerでどうにかなる範囲なんだわ。boot2dockerは割と良くできていると思う。他にもRancherOSとかその他いろいろと競合はあると思いますが、まあ簡単だし、そこはあんまり重要じゃないところ。VirtualBoxである必然性もなくなっている。

dockerイメージはalpine無双の時代が長かったですが、そろそろ過ぎつつあるのかな。自分は今でもdebian:jessieとかubuntuとかcentos:centos7とかopensuseとか使うことが多いですけど、今のメインストリームは、成果物のバイナリのみを/に置いてentrypointにする、というもの。あと必要であればroot CAの証明書も配置する。busyboxもshもない。scratchからCOPYで置く。確かにそれが最強だよな…

Android用のVPN

ついに個人用の最短手順を見つけたぞ。L2TP/PSKのVPNをレンタルサーバに立てて、フリーWiFiを使うときの足しにしようと思っていたんだが、L2TPサーバの設定ってけっこう面倒じゃん。 その手順がこれだ! dockerが使えているLinuxホストであることが前提です。CentOS7のホストでも問題ないみたいです。VMのVPSでもチョチョイと借りとけばサーバはどうにでもなる時代。

  • docker pull hwdsl2/ipsec-vpn-server
  • mkdir vpn
  • cd vpn
  • vi env
    • VPN_IPSEC_PSK=
    • VPN_USER=
    • VPN_PASSWORD=
    • スペースやクォートに注意。余計なものが入ってるとダメです
  • sudo modprobe af_key
  • docker run –name ipsec-vpn-server –env-file ./env -p 500:500/udp -p 4500:4500/udp -v /lib/modules:/lib/modules:ro -d –privileged –restart=always hwdsl2/ipsec-vpn-server

以上です。なんて簡単な! 誰だか知らないけど、ありがとうhwdsl2(←気に入った人はdocker hubにログインして☆をつけよう)。 あとは手持ちのAndroid機のVPN設定でクライアント側を設定していく。

  • 名前→適当につける
  • L2TP/IPSec PSK
  • サーバーアドレス→立てたサーバについてるグローバルIPアドレス
  • L2TPセキュリティ保護→(未使用)のまま
  • IPSec ID→(未使用)のまま
  • IPSec事前共有鍵→VPN_IPSEC_PSKの値
  • 詳細オプションを表示する→どっちでもいい
  • ユーザー名→VPN_USERの値
  • パスワード→VPN_PASSWORDの値
  • 常時接続VPN→どっちでもいい / つなぐ時にも選べる

Macからもつながりましたが、元のdefault routeが残るみたいな感じで、WebアクセスしてみてもソースアドレスがVPN先のIPアドレスにならないんだよなぁ…何かが間違ってるかもしれない。そのへんAndroidは問題ない。この環境固有の問題なのか、Macの問題なのか?? この暗号化セッションってどのくらいの強さなんでしょうね。あまり知識がないのでわからない。最近のTLSのPFSみたいに後で鍵がバレても大丈夫なんだろうか? On/Offは、ホーム画面にウィジットを追加すると楽チンだと思います。

迷い

最近迷っているのが、このサイトをdockerベースにするかどうか、というところ。 ansibleにはしてあるんだよね。で、細かいところとかデフォルト設定の違いとかはあるにしても、別のVPSとかクラウドサービスに乗り換えることは可能なようになっている。今借りてるところは安いけどAPIで操作できなかったりするからな。 dockerならdocker-machineでホストを操作できるじゃん。で、registry立てといてバックエンドをS3か何かにする、あるいはDockerfileを手元に持っとけばいいじゃん? リソース足りなくなったらswarm立てて複数台で回していくというやり方も。 実際はansibleでポ〜ン、ってのでも特に問題があるわけじゃないんだけど。

nexus 5X

233153先代nexus5を駅で落として壊れたから買うハメに…べつにLG Nexusを愛しているわけではないんだけど、計画外で突発的なことだと、あんまり熟慮することもなく後継機を買うことになるんだよな。買い換えるつもりがなかったタイミング。後から考えればiPhoneにするべきだったかも。 それにしても油断が過ぎたな。胸ポケットに入れて靴ひもを結ぼうとするという、暴挙ね。まあ、これまでよく頑張ったと思う。子供に投げられたり(文字通り放り投げてた)して、若干傷だらけになってたんで、駅で落としたのがトドメになったのかな。 実際まだ使えるんだけど、このまま使うと指を切りそうなんで… 5Xのいいところは…指紋認証くらいか。他は不満も多い。サイズが長くなって持ちにくくなった。無駄にSIMがnanoSIMになったりmicroUSBじゃなくてType-Cになったりして不便を強制された感が。Type-Cなんてケーブル持ってないから買わなきゃいけなかったじゃないか。nanoSIMへの変更のせいで一時的に不通になるし。 ただ指紋認証は非常に良い。 指紋認証があれば子供に勝手に使われずに済む。子供としては音声認識で遊ぶか(裏で検索されて「半径○○キロ以内の○○を検索しました」音声が鳴るが検索結果の画面はロックを外さないと映らない)、カメラで遊ぶかくらいになる。カメラは映っちゃうんだよなこれ。スローとかがあるから微妙な感じのスロー動画が溜まることになる。 よくできてると思ったのは、移行ですね。最初にアカウントを入れて、同期するかどうかみたいなのを選ぶと、アプリやホーム画面のアイコンの配置とかをそのままに引き継いでくれる。いろいろちゃんと引き継いでくれたからだいぶ楽だった。こういうのはありがたい。一部、よく使うアプリでデータが引き継がれなかったのでいろいろやって引き継いだ。 あとは例えば、ConnectBotの鍵ペアとかは引き継がずに再度生成した。最近はもう楕円曲線暗号が常識なんだね。ビット数が短いだけあって公開鍵も短くて済む。どっちにしろ手入力や暗記ができるわけではないが。 最後に先代の端末を初期化して作業終了。初期化はだいぶ時間がかかったけどストレージの中のファイルもちゃんと消えていた。まあ本当に「ちゃんと」消えたかどうかはわからないけどね。Flashだから、チップの中にはデータが残っちゃってるんだろうな。ブロックマップからたどれない状態になっただけで、全面Eraseとかしてないだろうな、たぶん。