2021年5月8日土曜日

Ubuntu 18.04 で nbdkit

「いまさら18.04かよ!」って、思う人も多いだろう。
OSの入れ替えはなるべくやりたくないので、ギリギリまで使い続ける。

zestiyでもdiscoでも nbdkitはオフィシャルのパッケージがあるのに、bionicだけは無いのだ。
そのため、nbdkitを手っ取り早く、簡単に使いたいなら、今ならbionic(18.04)ではなく、focal(20.04)を使うのが良い

私は、12.04のサポート終了後、1年ぐらい16.04を使ったが、すぐに18.04に移った。
Precise(12.04)のころも nbdkitのオフィシャルパッケージが無く、ソースを入手して、ビルドして使っていた。 そのためnbdkitは自分でビルドすると、私は自然に考えていたので、18.04に移行した後もすぐに自分でビルドした。
(うっかりこのBudgieでも、最初は自分でビルドしてしまっていた)

もう一度いうが、nbdkitを簡単に使いたいなら、自分でbionic(18.04)でビルドせずに、focal(20.04)に移行するのがいい。
focalもだいぶ安定してきているだろうから。

bionicを使い続けなければならない人もいるだろうし、私のような馬鹿野郎も少なからずいるだろう。
今年の3月に、M.2 SSDに移行&インストールし直したこのPC用にもビルドし直したので、ついでにメモを書いておく。

最後にビルドしたのはもう1ヶ月以上前なので細かいことは忘れている。
何か足りないものもあるかもしれない。面倒なことになるかもしれない。それが嫌ならfocalに移行せよ。

まずは、ビルドに必要なものをインストールする。
gitやbuild-essential等の最低限のツール類は入っているものとする。

いきなりビルドに必要なものと言われても、さっぱりわからない。
後でgit cloneするが、その中のreadmeを読んでも必要なものの雰囲気ぐらいしか解らない。
そもそもnbdはどっちかっていうとRedHat系が中心で、Debian系ではない。そのためDebian系のパッケージで何を用意すれば良いのかがよくわからないのだ。
しかし、今ならお手本がある。focalのBuild-Dependsを見れば良いのだ。
ソースパッケージの一部である.dscファイルを入手して、その中の "Build-Depends:"にかかれているパッケージをinstallすればいい。
実際には、bionicには存在しないものなども含まれていたりして調整も必要だが、大変参考になる。
まずは、.dscファイルをダウンロードしておこう。
wget http://archive.ubuntu.com/ubuntu/pool/universe/n/nbdkit/nbdkit_1.16.2-1ubuntu3.dsc
以下のようにすると、Build-Dependsのパッケージがわかる。
$ cat nbdkit_1.16.2-1ubuntu3.dsc | grep '^Build-Depends:' | sed -e 's/^Build-Depends: \+//g' | sed -e 's/, \+/\n/g'
debhelper (>= 12)
dh-python
perl
pkg-config
bash-completion
genisoimage
comerr-dev
libcurl4-gnutls-dev | libcurl-dev
libext2fs-dev
libgnutls28-dev (>= 3.3)
gnutls-bin
libguestfs-dev (>= 1:1.36.11-3)
liblzma-dev
liblua5.3-dev
libperl-dev
python3-dev
ruby
ruby-dev
tcl-dev
libselinux1-dev
libssh-dev
libvirt-dev
zlib1g-dev
busybox <!nocheck>
iproute2 <!nocheck>
jq <!nocheck>
socat <!nocheck>
libguestfs-tools <!nocheck>
libnbd-dev
python3-libnbd <!nocheck>
このうち、<!nocheck> はテストで必要としているものだ。
テストは重要ではあるが、解決が難しくなるかもしれないので、とりあえず除去しておく(「まずはビルド」を優先する)。
また、バージョン番号も邪魔だし、libcurlは2つ(libcurl4-gnutls-dev か libcurl-dev)のうちどちらかが入っていればいい。
さらに、libnbd-devはbionicには存在しないので、除外する。

これらを整理するには、以下のようにする。
$ cat nbdkit_1.16.2-1ubuntu3.dsc | grep '^Build-Depends:' | sed -e 's/^Build-Depends: \+//g' | sed -e 's/, \+/\n/g' | grep -v -e '<!nocheck>' -e 'libcurl-dev' | sed -e 's/ \+([^)].\+) *$//g'
debhelper
dh-python
perl
pkg-config
bash-completion
genisoimage
comerr-dev
libext2fs-dev
libgnutls28-dev
gnutls-bin
libguestfs-dev
liblzma-dev
liblua5.3-dev
libperl-dev
python3-dev
ruby
ruby-dev
tcl-dev
libselinux1-dev
libssh-dev
libvirt-dev
zlib1g-dev
libnbd-dev
これらのうちまだinstallされていないものをinstallする。
以下のようにして、installされていないパッケージ(すでにインストールされているパッケージ)を確認する。
$ dpkg -l $(cat nbdkit_1.16.2-1ubuntu3.dsc | grep '^Build-Depends:' | sed -e 's/^Build-Depends: \+//g' | sed -e 's/, \+/\n/g' | grep -v -e '<!nocheck>' -e 'libcurl-dev' -e 'libnbd-dev'| sed -e 's/ \+([^)].\+) *$//g')
18.04を今まで使い続けていたのなら、すでにいろいろなパッケージが入っているだろう。
何が足りないかは人それぞれだ。
表示された内容のうち足りないものを、"sudo apt-get install"の後ろにコピペしてinstallしよう。

次にソースを入手する。
以前はtar.gzを使っていたが、gitで入手すれば更新も簡単なのでgitで入手しよう。
リポジトリはhttps://github.com/libguestfs/nbdkit にある。
git clone https://github.com/libguestfs/nbdkit
cloneしたら、nbdkitに移動して作業する。

gitで入手した場合、最初に"autoreconf -i"を行わなければならない。
$ cd nbdkit
$ autoreconf -i
(なんか色々表示される)
次に"./configure"を実行するのだが、なんかオプションを付けた記憶がある。
config.logを見直してみたら、ウチの場合は以下のようになっていた。
$ ./configure --no-create --no-recursion
"git pull"で更新して、改めて上記configure後にmakeを実行してみるとエラーになった。
make[3]: ディレクトリ '/home/shin/dvlp/nbdkit/nbdkit/plugins/ssh' に入ります
/bin/bash ../../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I../..  -I../../include -I../../common/include -I../../common/utils      -g -O2 -MT nbdkit_ssh_plugin_la-ssh.lo -MD -MP -MF .deps/nbdkit_ssh_plugin_la-ssh.Tpo -c -o nbdkit_ssh_plugin_la-ssh.lo `test -f 'ssh.c' || echo './'`ssh.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I../.. -I../../include -I../../common/include -I../../common/utils -g -O2 -MT nbdkit_ssh_plugin_la-ssh.lo -MD -MP -MF .deps/nbdkit_ssh_plugin_la-ssh.Tpo -c ssh.c  -fPIC -DPIC -o .libs/nbdkit_ssh_plugin_la-ssh.o
ssh.c: In function ‘do_verify_remote_host’:
ssh.c:220:26: error: storage size of ‘state’ isn’t known
   enum ssh_known_hosts_e state;
                          ^~~~~
ssh.c:240:11: warning: implicit declaration of function ‘ssh_session_is_known_server’ [-Wimplicit-function-declaration]
   state = ssh_session_is_known_server (h->session);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~
ssh.c:242:8: error: SSH_KNOWN_HOSTS_OK’ undeclared (first use in this function); did you mean ‘SSH_OPTIONS_HOSTKEYS’?
   case SSH_KNOWN_HOSTS_OK:
        ^~~~~~~~~~~~~~~~~~
        SSH_OPTIONS_HOSTKEYS
ssh.c:242:8: note: each undeclared identifier is reported only once for each function it appears in
ssh.c:246:8: error: SSH_KNOWN_HOSTS_CHANGED’ undeclared (first use in this function); did you mean ‘SSH_KNOWN_HOSTS_OK’?
   case SSH_KNOWN_HOSTS_CHANGED:
        ^~~~~~~~~~~~~~~~~~~~~~~
        SSH_KNOWN_HOSTS_OK
ssh.c:251:8: error: SSH_KNOWN_HOSTS_OTHER’ undeclared (first use in this function); did you mean ‘SSH_KNOWN_HOSTS_OK’?
   case SSH_KNOWN_HOSTS_OTHER:
        ^~~~~~~~~~~~~~~~~~~~~
        SSH_KNOWN_HOSTS_OK
ssh.c:257:8: error: SSH_KNOWN_HOSTS_NOT_FOUND’ undeclared (first use in this function); did you mean ‘SSH_KNOWN_HOSTS_OTHER’?
   case SSH_KNOWN_HOSTS_NOT_FOUND:
        ^~~~~~~~~~~~~~~~~~~~~~~~~
        SSH_KNOWN_HOSTS_OTHER
ssh.c:265:8: error: SSH_KNOWN_HOSTS_UNKNOWN’ undeclared (first use in this function); did you mean ‘SSH_KNOWN_HOSTS_CHANGED’?
   case SSH_KNOWN_HOSTS_UNKNOWN:
        ^~~~~~~~~~~~~~~~~~~~~~~
        SSH_KNOWN_HOSTS_CHANGED
ssh.c:271:8: error: SSH_KNOWN_HOSTS_ERROR’ undeclared (first use in this function); did you mean ‘SSH_KNOWN_HOSTS_OTHER’?
   case SSH_KNOWN_HOSTS_ERROR:
        ^~~~~~~~~~~~~~~~~~~~~
        SSH_KNOWN_HOSTS_OTHER
ssh.c: In function ‘ssh_open’:
ssh.c:388:32: error: SSH_OPTIONS_NODELAY’ undeclared (first use in this function); did you mean ‘SSH_OPTIONS_HOSTKEYS’?
   ssh_options_set (h->session, SSH_OPTIONS_NODELAY, &set);
                                ^~~~~~~~~~~~~~~~~~~
                                SSH_OPTIONS_HOSTKEYS
Makefile:639: recipe for target 'nbdkit_ssh_plugin_la-ssh.lo' failed
make[3]: *** [nbdkit_ssh_plugin_la-ssh.lo] Error 1
make[3]: ディレクトリ '/home/shin/dvlp/nbdkit/nbdkit/plugins/ssh' から出ます
Makefile:520: recipe for target 'all-recursive' failed
make[2]: *** [all-recursive] Error 1
make[2]: ディレクトリ '/home/shin/dvlp/nbdkit/nbdkit/plugins' から出ます
Makefile:708: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: ディレクトリ '/home/shin/dvlp/nbdkit/nbdkit' から出ます
Makefile:578: recipe for target 'all' failed
make: *** [all] Error 2
sshプラグインのビルド時にエラーになっているようだ。
nbdkitが新しくなりすぎたな?
私は、xzイメージのマウントがしたいだけなので、sshプラグインは必要ない。
使わないものは除外してしまおう。"./configure --help"で除外方法が解る。

結果的にconfigureの方法は、以下のようになった。
$ ./configure --no-create --no-recursion --without-ssh 
 : (色々表示される)
$ make
 : (色々表示される)
ビルドできたら、インストールする。
$ sudo make install
 : (色々表示される)
新しくなって(少なくともVersion 1.15.1では)、使い方も少し変わってしまった。
xz圧縮されたイメージをnbdで提供するには、元々はこんな感じだった。
sudo nbdkit -n -e <export_name> -u <user> -g <group> -i <ipaddr> xz file=<xz-filename>
新しいものでは、たとえば、以下のようになる。
sudo nbdkit -n -e <export_name> -u <user> -g <group> -i <ipaddr> --filter=xz file <xz-filename>

ビルドを通すためにsshプラグインを除外してしまったが、前のバージョンや別のブランチをcheckoutして試すのも良いかもしれない。
(私は使わないので、そこまではやらない)

git pullで更新も比較的簡単にできる。
しかし、上記のように時々ビルドできなくなることもある。
自分でソースコードを入手してビルドする行為は、自由がある反面、荒野を彷徨うようなものだ。

その覚悟が無いなら、やはりfocalに移行してnbdkitを使うのが良いだろう。

関連記事:
圧縮イメージをマウントする
Lubuntu 16.04でxz圧縮イメージをマウントする

0 件のコメント:

コメントを投稿