最近ライフハック的な記事が多かったので、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は
というわけで、試しに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起動時に以下のようなエラーになる。
以下のようにして、カーネルモジュール nbd.koを読み込む。$ 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.
$ 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ドライブに置いた。
マウント時のユーザ名の指定方法を、環境変数を使って行うようにした。ついでに解りにくい表現を整理した。「おまけ」を追加した。 | |
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 件のコメント:
コメントを投稿