3月 272017
 

Varnishのリリースは少し前に半年に一回行う様になりました。
もちろんその間にBugfixなどがされたりするのですが、その場合でも半年待つ必要があります。(クリティカルなバグについてはその限りではないはず)
では、どうしてもすぐに修正されたものを使いたかったりする場合はどうすればよいでしょうか?
今回はpkg-varnishcacheを利用してパッケージを作成する方法を紹介します。

今回の環境はUbuntu16.04LTS(Xenial)で作成するパッケージの対象はXenialとしてます

(2017-08-09追記)なお、記事中で修正箇所の記載がありますが、masterのものを使用する場合はまだpkg-varnish-cacheが追い付いてないことが多く当時は修正が必要だったということです。
バージョンにより修正が不要になったり、また別の修正が必要になったりするので注意が必要です。

sbuild環境の準備
最初にpkg-varnishcacheはsbuildを利用しているので環境を作ります。


ubuntu@xa:~$ sudo apt-get update
ubuntu@xa:~$ sudo apt-get install -y sbuild schroot ubuntu-dev-tools
ubuntu@xa:~$ sudo adduser ubuntu sbuild #ubuntu userの場合

adduserしたので一度セッションを切って再度ログインします。

buildに必要なパッケージをインストールします


ubuntu@xa:~$ sudo apt-get install -y git debhelper automake autotools-dev libtool pkg-config python-docutils libedit-dev libjemalloc-dev libncurses-dev libpcre3-dev python-sphinx

次にxenialのイメージを作成します。
やっているのはsources.listを日本のミラー(jp.archive.ubuntu.com)に向けているのとビルドに必要なパッケージのインストールです。
この作業をやっておくとビルドが早くなるのでお勧めです。
当然ながらパッケージはどんどん更新されているので、たまにupgradeしておくと良いと思います。
また、今回はxenialとしてますが、ここをtrustyにしたりすることで別のディストリビューション向けに作ることも可能です。


ubuntu@xa:~$ mk-sbuild xenial --arch=amd64
#↑で通らないときはmk-sbuild --distro=ubuntu xenial --arch=amd64で試してみてください
ubuntu@xa:~$ sudo schroot -c source:xenial-amd64 -u root
(xenial-amd64)root@xa:~# sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu%http://jp.archive.ubuntu.com/ubuntu%g" /etc/apt/sources.list
(xenial-amd64)root@xa:~# apt-get update
(xenial-amd64)root@xa:~# apt-get upgrade -y
(xenial-amd64)root@xa:~# apt-get install -y automake autotools-dev libedit-dev libjemalloc-dev libncurses-dev libpcre3-dev libtool pkg-config python-docutils python-sphinx git
(xenial-amd64)root@xa:~# apt-get install -y debhelper dh-systemd 
(xenial-amd64)root@xa:~# logout

pkg-varnish-cacheの修正
次にpkg-varnish-cacheの取得と修正です。
そのままのものだとtrusty向けしかビルドできないので少し修正します。


ubuntu@xa:~$ git clone https://github.com/varnishcache/pkg-varnish-cache.git
ubuntu@xa:~$ cd pkg-varnish-cache
ubuntu@xa:~/pkg-varnish-cache$ vi package-deb

修正箇所は以下です。


ubuntu@xa:~/pkg-varnish-cache$ git diff
diff --git a/package-deb b/package-deb
index 2b5e9fc..7c68a1a 100755
--- a/package-deb
+++ b/package-deb
@@ -68,7 +68,7 @@ cd ..

 # By now we are done setting up and building the source package.

-if [ "$V" = "3.0" ] || [ "$V" = "4.0" ] || [ "$V" = "4.1" ]; then
+if [ "$V" = "3.0" ] || [ "$V" = "4.0" ] || [ "$V" = "4.1" ] || [ "$V" = "5.1" ]; then
        # Build binary packages for the requested releases inside chroots.
        for dist in $BINDISTS; do
                # Legacy packages embedded the release into the package version.

パッケージビルド
まずは公式で提供されているソースからパッケージを作ってみましょう。


ubuntu@xa:~$ curl http://repo.varnish-cache.org/source/varnish-5.1.1.tar.gz > sources/varnish-5.1.1.tar.gz
ubuntu@xa:~$ BINDISTS=xenial ./package-deb

するとこんな感じでパッケージができます。


ubuntu@xa:~/pkg-varnish-cache$ BINDISTS=xenial ./package-deb
...
+------------------------------------------------------------------------------+
| Summary                                                                      |
+------------------------------------------------------------------------------+

Build Architecture: amd64
Build-Space: 61528
Build-Time: 79
Distribution: xenial
Host Architecture: amd64
Install-Time: 6
Job: varnish_5.1.1-0+daily+20170322.012214.dsc
Machine Architecture: amd64
Package: varnish
Package-Time: 88
Source-Version: 5.1.1-0+daily+20170322.012214
Space: 61528
Status: successful
Version: 5.1.1-0+daily+20170322.012214
--------------------------------------------------------------------------------
Finished at 20170322-0123
Build needed 00:01:28, 61528k disc space
You have new mail in /var/mail/ubuntu
ubuntu@xa:~/pkg-varnish-cache$ ls build/
varnish-5.1.1                                        varnish_5.1.1-0+daily+20170322.012214.dsc               varnish-dbgsym_5.1.1-0+daily+20170322.012214~xenial_amd64.ddeb
varnish_5.1.1-0+daily+20170322.012214_amd64.build    varnish_5.1.1-0+daily+20170322.012214_source.changes    varnish-dev_5.1.1-0+daily+20170322.012214~xenial_amd64.deb
varnish_5.1.1-0+daily+20170322.012214_amd64.changes  varnish_5.1.1-0+daily+20170322.012214~xenial_amd64.deb
varnish_5.1.1-0+daily+20170322.012214.diff.gz        varnish_5.1.1.orig.tar.gz
ubuntu@xa:~/pkg-varnish-cache$

次はgithubのコードからパッケージを作成してみましょう。
まずはソースを持ってきて、足りないディレクトリ(doc/html)を作成します。


ubuntu@xa:~$ git clone https://github.com/varnishcache/varnish-cache.git
ubuntu@xa:~$ cd varnish-cache
ubuntu@xa:~/varnish-cache$ mkdir doc/html

後はautogen.shを走らせた後に圧縮してビルドします。


ubuntu@xa:~$ cd varnish-cache
ubuntu@xa:~/varnish-cache$ git pull
ubuntu@xa:~/varnish-cache$ ./autogen.sh
ubuntu@xa:~/varnish-cache$ cd ..
ubuntu@xa:~$ rm pkg-varnish-cache/sources/varnish-trunk.tar.gz
ubuntu@xa:~$ tar cfz pkg-varnish-cache/sources/varnish-trunk.tar.gz varnish-cache
ubuntu@xa:~$ cd pkg-varnish-cache/
ubuntu@xa:~/pkg-varnish-cache$ BINDISTS=xenial ./package-deb

これでパッケージができると思います。
自分は環境がないので試していませんがrpmも作成できるはずなので、
RHEL/CentOSな人はpackage-rpmを使うとよいと思います。(多少必要なパッケージが変わると思います)

ddebをインストールしたいとき
ビルドの指定でkeep-debugがあるので通常の場合は不要なのですが、入れたいひとは以下のようにすると入ります。
そのままだとkeep-debugで入る.debugとConflictとするのでそれを削る感じです。


diff --git a/debian/rules b/debian/rules
index c9e6246..b1203e8 100755
--- a/debian/rules
+++ b/debian/rules
@@ -79,4 +79,5 @@ override_dh_compress:
        dh_compress -X/usr/share/doc/varnish-doc/html

 override_dh_strip:
-       dh_strip --keep-debug
+       dh_strip


#with --keep-debug
ubuntu@xa:~/pkg-varnish-cache/build$ sudo dpkg -i *ddeb
(Reading database ... 76080 files and directories currently installed.)
Preparing to unpack varnish-dbgsym_5.1.1-0+daily+20170325.112955~xenial_amd64.ddeb ...
Unpacking varnish-dbgsym (5.1.1-0+daily+20170325.112955~xenial) over (5.1.1-0+daily+20170325.110252~xenial) ...
dpkg: error processing archive varnish-dbgsym_5.1.1-0+daily+20170325.112955~xenial_amd64.ddeb (--install):
 trying to overwrite '/usr/lib/debug/.build-id/a0/654ed2469d729bc1c9652860fe3243c6c84358.debug', which is also in package varnish 5.1.1-0+daily+20170325.112955~xenial
dpkg-deb: error: subprocess paste was killed by signal (Broken pipe)
Errors were encountered while processing:
 varnish-dbgsym_5.1.1-0+daily+20170325.112955~xenial_amd64.ddeb

#without --keep-debug
ubuntu@xa:~/pkg-varnish-cache/build$ sudo dpkg -i *ddeb
Selecting previously unselected package varnish-dbgsym.
(Reading database ... 76038 files and directories currently installed.)
Preparing to unpack varnish-dbgsym_5.1.1-0+daily+20170325.113630~xenial_amd64.ddeb ...
Unpacking varnish-dbgsym (5.1.1-0+daily+20170325.113630~xenial) ...
Setting up varnish-dbgsym (5.1.1-0+daily+20170325.113630~xenial) ...

多分必要なケースはほぼないと思います・・

[tips]panicメッセージでシンボルが表示されないものが何かを調べる
直接はpkg-varnishcacheとは関係ないのですが、これを使ってパッケージを作ってる人は
基本的に最新のものを使っていたりしてバグを踏んだりすることが多いと思いますのでtips的な・・・


Panic at: Wed, 22 Mar 2017 14:05:23 GMT
Assert error in vrt_priv_dynamic(), cache/cache_vrt_priv.c line 114:
  Condition((vp)->magic == 0x24157a52) not true.
version = varnish-5.1.1 revision 4d3037a, vrt api = 6.0
ident = Linux,4.4.0-24-generic,x86_64,-junix,-smalloc,-sfile,-sfile,-smalloc,-hcritbit,epoll
now = 2149357.291496 (mono), 1490191522.571085 (real)
Backtrace:
  0x438945: /usr/sbin/varnishd() [0x438945]
  0x44ac28: /usr/sbin/varnishd() [0x44ac28]
  0x7f3eb15411ce: vcl_boot.1490188582.198924065/vgc.so(VGC_function_verificationCookie+0x9e) [0x7f3eb15411ce]
  0x7f3eb15424ef: vcl_boot.1490188582.198924065/vgc.so(VGC_function_***_recv+0x1f) [0x7f3eb15424ef]
  0x7f3eb1544d32: vcl_boot.1490188582.198924065/vgc.so(VGC_function_vcl_recv+0x13b2) [0x7f3eb1544d32]
  0x4464f0: /usr/sbin/varnishd() [0x4464f0]
  0x448d0a: /usr/sbin/varnishd(VCL_recv_method+0x5a) [0x448d0a]
  0x43ccd9: /usr/sbin/varnishd(CNT_Request+0xd89) [0x43ccd9]
  0x46130f: /usr/sbin/varnishd(h2_do_req+0x4f) [0x46130f]
  0x451d72: /usr/sbin/varnishd() [0x451d72]
thread = (cache-worker)
...

例えば上記のようなvarnishadm panic.showで表示されたbacktraceがあったとして


  0x438945: /usr/sbin/varnishd() [0x438945]
  0x44ac28: /usr/sbin/varnishd() [0x44ac28]
  0x4464f0: /usr/sbin/varnishd() [0x4464f0]
  0x451d72: /usr/sbin/varnishd() [0x451d72]

このシンボルが出ていないのが何かを調べるにはgdbを使います。


ubuntu@xa:~$ gdb /usr/sbin/varnishd
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/sbin/varnishd...done.
(gdb) info symbol 0x438945
pan_ic + 373 in section .text
(gdb)

こんな感じで0x438945はpan_ic+373(0x175)だということがわかりました。
同じ様な感じで解決していくと


Backtrace:
  0x438945: /usr/sbin/varnishd(pan_ic+0x175) [0x438945]
  0x44ac28: /usr/sbin/varnishd(vrt_priv_dynamic+0x1b8) [0x44ac28]
  0x7f3eb15411ce: vcl_boot.1490188582.198924065/vgc.so(VGC_function_verificationCookie+0x9e) [0x7f3eb15411ce]
  0x7f3eb15424ef: vcl_boot.1490188582.198924065/vgc.so(VGC_function_***_recv+0x1f) [0x7f3eb15424ef]
  0x7f3eb1544d32: vcl_boot.1490188582.198924065/vgc.so(VGC_function_vcl_recv+0x13b2) [0x7f3eb1544d32]
  0x4464f0: /usr/sbin/varnishd(vcl_call_method+0x210) [0x4464f0]
  0x448d0a: /usr/sbin/varnishd(VCL_recv_method+0x5a) [0x448d0a]
  0x43ccd9: /usr/sbin/varnishd(CNT_Request+0xd89) [0x43ccd9]
  0x46130f: /usr/sbin/varnishd(h2_do_req+0x4f) [0x46130f]
  0x451d72: /usr/sbin/varnishd(WRK_Thread+0x4c2) [0x451d72]

わかりやすいバックトレースが得られるのでデバッグには便利かと思います。

まとめ
HTTP/2関連のコードの修正は活発なため最新のものを使うと良いと思います。
また、Varnish自体のリリース手順はこんな感じです。