2017年12月9日土曜日

Lubuntu 16.04 でxz圧縮イメージをマウントする

Ubuntu 18.04では、この記事を参照。

最近ライフハック的な記事が多かったので、Linuxネタも入れておく。

Ubuntu12.04を使っている頃、「圧縮イメージをマウントする」で、xz圧縮されたHDDイメージをマウントする方法を書いていた。
しかしながら、この方法はLubuntu16.04では使えない(もちろんUbuntu16.04でも)。使えない理由は、
  • nbdの仕様が変更になり使い方が変わった。
  • Lubuntu16.04 xenial の nbdkitには(自分が見た限りでは)bugがあるようで動作しない。
ということだ。
これについて調べたのは、今年の1月だった。そのため、上記の「自分が見た限り」というのは、その時点のことだ。今は普通に動くのかもしれない。もし動かなかったら以下の方法に従え。

Lubuntu16.04でnbdkitを使って、xz圧縮イメージをマウントする方法を以下に示す(おそらくUbuntu16.04でも使える)。


新しいnbdkitをインストールする
Xenialのnbdkitにはbugがあるようで、どうしても動かなかった。
ネット上を探すと、開発者が英語で「とにかく動く!変な文句を言うな。」のような、かなり強い言い方で書いているのを見つけた(URLは失念 2018年1月再発見した)。そのnbdkitのバージョンがXenialのものよりも新しかったので、新しい物なら動くのではと考えた。
というわけで、試しにZestyのnbdkit、nbdkit-1.1.12-1build2をダウンロードしてインストールした。

以下のパッケージをダウンロードする。
nbdkit-plugin-dev_1.1.12-1build1_i386.deb
nbdkit-plugin-guestfs_1.1.12-1build1_i386.deb
nbdkit-plugin-libvirt_1.1.12-1build1_i386.deb
nbdkit-plugin-perl_1.1.12-1build1_i386.deb
nbdkit-plugin-python_1.1.12-1build1_i386.deb
nbdkit-plugin-ruby_1.1.12-1build1_i386.deb
nbdkit_1.1.12-1build1_i386.deb
適切なアーキテクチャ、適切なダウンロードサイトを選択してダウンロードせよ。
アーキテクチャ:amd64、山形大学のサイトからダウンロードするなら、以下のようにすると良い。
(山形大学は最近出来たミラーサイトで、速い。ありがたいことだ。)
mkdir nbdkit
cd nbdkit
wget http://linux.yz.yamagata-u.ac.jp/pub/linux/ubuntu-archive/pool/universe/n/nbdkit/nbdkit-plugin-dev_1.1.12-1build2_amd64.deb
wget http://linux.yz.yamagata-u.ac.jp/pub/linux/ubuntu-archive/pool/universe/n/nbdkit/nbdkit-plugin-guestfs_1.1.12-1build2_amd64.deb
wget http://linux.yz.yamagata-u.ac.jp/pub/linux/ubuntu-archive/pool/universe/n/nbdkit/nbdkit-plugin-libvirt_1.1.12-1build2_amd64.deb
wget http://linux.yz.yamagata-u.ac.jp/pub/linux/ubuntu-archive/pool/universe/n/nbdkit/nbdkit-plugin-perl_1.1.12-1build2_amd64.deb
wget http://linux.yz.yamagata-u.ac.jp/pub/linux/ubuntu-archive/pool/universe/n/nbdkit/nbdkit-plugin-python_1.1.12-1build2_amd64.deb
wget http://linux.yz.yamagata-u.ac.jp/pub/linux/ubuntu-archive/pool/universe/n/nbdkit/nbdkit-plugin-ruby_1.1.12-1build2_amd64.deb
wget http://linux.yz.yamagata-u.ac.jp/pub/linux/ubuntu-archive/pool/universe/n/nbdkit/nbdkit_1.1.12-1build2_amd64.deb
ダウンロード後、それらをinstallする。
sudo dpkg -i *.deb

nbdをexportする
以下のようにして、localhost(127.0.0.1)で、xzファイル SD8GB.img.xz をexport名 sd8g でexportする。
$ sudo nbdkit -n -e sd8g -i 127.0.0.1  xz file=SD8GB.img.xz
新しいnbdkitのexport方法は、oldstyle(昔ながらの方法)に加え、新しい方法newstyleがある。
newstyleでは、名前で公開を選択する使い方が提唱されている(と感じる)ので名前をつけて公開した。

長いオプション名--newstyle は、何故か正常に動作しなかった。
短い名前のオプションのほうが、デバッグを含め多く利用されているであろうと考えて、短いオプションを使ったら動作した。

2020/08/01 追記: より新しいnbdkit(少なくともVersion 1.15.1)は、少しオプションが違う。上と同じことをするなら、以下のようになる。
$ sudo nbdkit -n -e sd8g -i 127.0.0.1  --filter=xz file SD8GB.img.xz
bionicではnbdkitが提供されていないので、 https://github.com/libguestfs/nbdkit.git からソースを得て、自分でビルドして使う。ビルドの際にテスト段階でエラーになるが、ビルドはできておりxzマウントは正常に動作するので、そのままinstallすればとりあえず使える。
そういうのが嫌なら、focalではオフィシャルで提供されているので、bionicからfocalに移行してしまうのも良いかもしれない。

exportを確認する
newstyleでexportされていれば、ポート番号だけではなく名前でも見えるはずだ。
nbd-clientには、サーバがexportしている名前をリストすることができる。
以下のようにして行う。
$ nbd-client -l 127.0.0.1
Negotiation: ..
sd8g

nbdモジュールの読み込み
nbdはカーネルの機能であり、Lubuntu16.04(おそらくUbuntu16.04でも)では、モジュールとして提供されてる。しかし、デフォルトでは読み込まないので、読み込む必要がある。
さもなくば、nbd-client起動時に以下のようなエラーになる。
$ sudo nbd-client 127.0.0.1 /dev/nbd0 -name sd8g -b 512
Negotiation: ..size = 7671MB
Error: Cannot open NBD: No such file or directory
Please ensure the 'nbd' module is loaded.
Exiting.
以下のようにして、カーネルモジュール nbd.koを読み込む。
$ sudo modprobe nbd

nbd-clientでデバイスノードを作成
上でも少し触れているが、以下のようにしてデバイスノードを作成する。
$ sudo nbd-client 127.0.0.1 /dev/nbd0 -name sd8g -b 512
Negotiation: ..size = 7671MB
bs=512, sz=8043626496 bytes

これで、デバイスノードができているはずだ。一応、確認する。
$ ls -l /dev/nbd0*
brw-rw---- 1 root disk 43, 0  1月 27 14:33 /dev/nbd0
brw-rw---- 1 root disk 43, 1  1月 27 14:33 /dev/nbd0p1
ブロックデバイス全体を示すnbd0と、その中のパーティションnbd0p1ができている。
マウントする
ブロックデバイスができたのなら、後は普通に(とはいえreadonlyで)マウントすればいい。
$ mkdir xxx          <--- マウントポイント作成
$ sudo mount /dev/nbd0p1 xxx -o ro,uid=$USER,gid=$USER

マウントできるのだが、実は問題がある。
newstyleならば、本来は複数のイメージをexportできるはずなのだが、それができない。
また、--newstyle、--user、--group のような長いオプションも使えない。まだ実装の途中のように感じる。
そのため、約1年前に調べていたのに、blogでの公表はしなかった。

しばらく待てば、動くようになるかな?というような、希望的観測でいた。
しかし、ついさっき最新であるBionicのchangelogを見てみたが、何も変わっていないようだった。
以下は、その抜粋。
nbdkit (1.1.12-1build3) artful; urgency=medium

  * No-change rebuild for perl 5.26.0.

 -- Matthias Klose <doko@ubuntu.com>  Wed, 26 Jul 2017 20:11:33 +0000

nbdkit (1.1.12-1build2) zesty; urgency=medium

  * No-change rebuild for perl 5.24 transition

 -- Iain Lane <iain@orangesquash.org.uk>  Mon, 24 Oct 2016 10:35:54 +0100

nbdkit (1.1.12-1build1) yakkety; urgency=medium

  * Rebuild against libsystemd

 -- Gianfranco Costamagna <locutusofborg@debian.org>  Thu, 28 Jul 2016 15:56:37 +0200

nbdkit (1.1.12-1) unstable; urgency=medium

  * New upstream version
  * Bump Standards-Version
  * Add Vcs-* headers
  * Add nbdkit-plugin-ruby package

 -- Hilko Bengen <bengen@debian.org>  Tue, 21 Jun 2016 23:18:59 +0200

nbdkit (1.1.11-1) unstable; urgency=medium

  * New upstream version

 -- Hilko Bengen <bengen@debian.org>  Sun, 01 Nov 2015 11:46:37 +0100
:(以下省略)
待っているだけでは、だめかな…

おまけ:nbdkit-1.1.12のmanを自分なりに訳したものをgoogleドライブに置いた。
2017/12/10 マウント時のユーザ名の指定方法を、環境変数を使って行うようにした。ついでに解りにくい表現を整理した。「おまけ」を追加した。
2018/01/16 Linux kernel 4.13.0(Lubuntu1604 LTS enablement stackでの現在の最新カーネル)では、nbd-clientの引数に"-b 512"を追加する必要がある。
上記動作確認は、2017年1月ごろ、ポイントリリース前のLubuntu16.04のKernel 4.4.0で行っていた。SDカードは1セクタ=512Byteなので"-b 512"を指定する必要があることは解っていたが、実際には省略しても動作していたため、なるべく短い最低限の指定で動かす方法を書いた。多くのHDDやSDカードのブロックサイズは512(CD-ROMは違う)であり、そのように指定せずに動作していた事が間違いであり、以降のバージョンで逆戻りすることはないだろう。
また「とにかく動く!」的なことを言っていた文書も再発見したので、リンクを張った。見直すと書き込みが増えていた。1年前はホカホカの話題だったようだ。

0 件のコメント:

コメントを投稿