#chiroito ’s blog

Java を中心とした趣味の技術について

Docker でZFS をストレージとして使う

Docker のストレージドライバに ZFS 用のドライバがあると知り、家にある ZFS サーバを ZFS 兼 Docker サーバにしてみました。

参考:
docs.docker.com

環境

既存の環境の確認

ZFS は以下の通り storage という名前のプールで構築してあります。

[root ~]# zpool list
NAME      SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
storage   476G   20.0G   456G         -      -    4%  1.00x  ONLINE  -

[root ~]# zfs list
NAME             USED  AVAIL  REFER  MOUNTPOINT
storage         20.0G   441G   336K  /storage
storage/data    20.0G   441G  20.0G  /storage/data

Docker Machine を使ってインストールしたままなので、Docker のストレージドライバは devicemapper になっています。

[root ~]# docker info | grep "Storage Driver" | grep -v grep
Storage Driver: devicemapper

ZFS ドライバへの変更

Docker を止めてから作業をします。既に ZFS のマウント先のディレクトリがある場合は削除します。storage/dockerと言う名前で ZFSファイルシステムを作成し、/var/lib/docker へマウントします。Docker の実行時引数にある ---storage-driverdevicemapper から zfs へ変更すると作業は完了です。docker を起動しましょう。

[root ~]# systemctl stop docker
[root ~]# rm -fr /var/lib/docker
[root ~]# zfs create -o mountpoint=/var/lib/docker storage/docker
[root ~]# sed s/devicemapper/zfs/ /etc/systemd/system/docker.service > /etc/systemd/system/docker.service.new
[root ~]# mv -f /etc/systemd/system/docker.service.new /etc/systemd/system/docker.service
[root ~]# systemctl daemon-reload
[root ~]# systemctl start docker

ZFS ドライバを使っている確認

---storage-driverdevicemapper から zfs へ変更されたことを確認しましょう。

[root@home ~]# docker info | grep "Storage Driver" | grep -v grep
Storage Driver: zfs

以上で Docker から ZFS が使用できるようになります。

ダメだったこと

ZFS ファイルシステムのマウント先となる /var/lib/docker が空ではないのに消すのを忘れてしまいました。そのため、ファイルシステムは作成できましたがマウントできませんでした。 /var/lib/docker を削除し、マウントポンとが正しく設定されていることを確認してからマウントしましょう。

[root ~]# zfs create -o mountpoint=/var/lib/docker storage/docker
cannot mount '/var/lib/docker': directory is not empty
filesystem successfully created, but not mounted

[root ~]# rm -fr /var/lib/docker

[root ~]# zfs get mountpoint storage/docker
NAME            PROPERTY    VALUE            SOURCE
storage/docker  mountpoint  /var/lib/docker  local

[root ~]# zfs mount storage/docker



    
    
  

Github で楕円曲線暗号の GPG Key を使う

概要

Github ではデジタル署名したコミットに対して [Verified] というものが表示されるようになっています。デジタル署名をする事で人を証明し、内容が改ざんされていないことを保証するものなので、できるだけ導入しましょう。 f:id:chiroito:20161125232043p:plain

十分親切なマニュアルが Github から公開されていますが(https://help.github.com/categories/gpg/)、英語しかないようですし、日本語の情報は RSA を使ったサンプルばっかりだったので、521bit の楕円曲線暗号を使用した方法をまとめておきます。521bit の楕円曲線暗号は 15,360 bit の RSA と同等と言われています。

  1. 楕円曲線暗号(ECC)の GPG キーを作成

  2. Github へ GPG キーを登録

  3. git コマンドで GPG キーを使うように設定

環境

GnuPG楕円曲線暗号を使えるのは 2.1 以降とのことなので、今回は modern を使用しています。stable は 2.0.xです。

1. 楕円曲線暗号(ECC)のGPGキーを作成

Github の ID と Email で GPG のキーを作ります。作成方法はこちらをご参照下さい。

chiroito.hatenablog.jp

作成した GPG キーの ID を確認します。ID は sec の右側にあるnistp521/移行の空白までの文字列です。今回の例では GPG キーの ID はC450FBAF723F1D25になります。
gpg --list-secret-keys --keyid-format LONG

gpg: 信用データベースの検査
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
C:/Users/chito/AppData/Roaming/gnupg/pubring.kbx
------------------------------------------------
sec   nistp521/C450FBAF723F1D25 2016-11-25 [SC]
      6DF4C433A441A4AFE10DE884C450FBAF723F1D25
uid                 [  究極  ] GithubId <Githubメール>
ssb   nistp521/3FD75CD4EA94BB66 2016-11-25 [E]

2. Github へ GPG キーを登録

先ほど調べた GPG キーの ID を使用してgpg --armor --exportコマンドで GPG キーを出力します。この出力結果を Github の設定ページへコピペして GPG キーを登録します。

コマンドの引数に GPG キーの ID を与えて GPG キーを出力します。
gpg --armor --export C450FBAF723F1D25

-----BEGIN PGP PUBLIC KEY BLOCK-----

(ここに文字がいっぱい表示されます)
-----END PGP PUBLIC KEY BLOCK-----

-----BEGIN PGP PUBLIC KEY BLOCK----------END PGP PUBLIC KEY BLOCK-----も含めて出力結果を全てコピーします。

次に、Github の設定ページに GPG キーを登録します。
[Personal settings] の [SSH and GPG keys] 画面で設定します。(https://github.com/settings/keys) [New GPG Key] というボタンを押すと Key を入力するテキストエリアが表示されますので、先ほどコピーした GPG キーをペーストします。

f:id:chiroito:20161125222618p:plain

3. git コマンドで GPG を使うように設定

git で GPG を常に有効化し、git で使用する GPG のプログラムと使用する GPG キーのIDを指定します。今回の例にはグローバルレベルで設定しています。

git で GPG を常に有効化します。
git config --global commit.gpgsign true

git で使用する GPG のプログラムを指定します。
git config --global gpg.program "c:\Program Files (x86)\GnuPG\bin\gpg"

git で使用する GPG キーのIDを指定します。
git config --global user.signingkey C450FBAF723F1D25

注意点

Verified があるなら、どうやったら Unverified になるんだろうと思っていくつか試してみました。 f:id:chiroito:20161125232059p:plain

Github に登録した GPG キーを消すと Unverified になります。もう一度同じ GPG キーを登録すると Verified に戻りました。

GPG キーの本名とメールが Github のアカウント名と登録しているメールアドレスの両方と一致同一でないと Unverified になります。ちゃんと登録してるのに Unverified になる場合は gpg --list-secret-keys --keyid-format LONG の出力結果に出る本名とメールアドレスが正しいか確認しましょう。

楕円曲線暗号を使った GPG キーの作成

概要

GnuPG を使用して 楕円曲線暗号(ECC)を使った GPG キーを作成します。

  1. GnuPG をダウンロード
  2. GPG キーを作成

環境

GnuPG をダウンロード

GnuPG はこちらからダウンロードします。(GnuPG - Download) Windows 版は 3 種類あります。現時点では stable は 2.0.30 、modern は 2.1.16 でした。GnuPG楕円曲線暗号を使えるのは 2.1 以降とのことなので、今回は modern を使用しています。

f:id:chiroito:20161126001751p:plain

赤枠のdownload リンクを押して、ダウンロードした後はインストールをします。ウィザードに従うだけです。

GPG キーを作成

RSA のキー同様 gpg --full-gen-key で GPG キーを作成しますが、楕円曲線暗号を使うには--expertオプションがさらに必要です。

今回は楕円曲線暗号(ECC)のうち Github でも使用できる NIST P-521 を使用して無期限のキーを作成します。

gpg --full-gen-key --expert

gpg (GnuPG) 2.1.16; Copyright (C) 2016 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

ご希望の鍵の種類を選択してください:
   (1) RSA と RSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
   (7) DSA (機能をあなた自身で設定)
   (8) RSA (機能をあなた自身で設定)
   (9) ECC と ECC
  (10) ECC (署名のみ)
  (11) ECC (機能をあなた自身で設定)
あなたの選択は? 9
ご希望の楕円曲線を選択してください:
   (1) Curve 25519
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
あなたの選択は? 5
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)
鍵の有効期間は? (0)は無期限です
これで正しいですか? (y/N) y

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: <適宜入力してください>
電子メール・アドレス: <適宜入力してください>
コメント:
次のユーザIDを選択しました:
    "本名 <メールアドレス>"

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
gpg: 鍵C450FBAF723F1D25を究極的に信用するよう記録しました
gpg: ディレクトリ'C:/Users/xxx/AppData/Roaming/gnupg/openpgp-revocs.d'が作成されました
gpg: 失効証明書を 'C:/Users/xxx/AppData/Roaming/gnupg/openpgp-revocs.d\6DF4C433A441A4AFE10DE884C450FBAF723F1D25.rev' に保管しました。
公開鍵と秘密鍵を作成し、署名しました。

pub   nistp521 2016-11-25 [SC]
      6DF4C433A441A4AFE10DE884C450FBAF723F1D25
      6DF4C433A441A4AFE10DE884C450FBAF723F1D25
uid                      本名 <メールアドレス>
sub   nistp521 2016-11-25 [E]

細かい出力結果は異なると思いますが、上記のような結果になればOKです。
※上記の結果は実際に使っている物とは異なります。