memo

2015-07-12

root filesystem 上に overlayfs 作って nspawn 走らせるようなの書いた

https://github.com/nakamuray/overrun

書きました。


インターネット上から落としてきたツールやらインストーラーやら、 どこにどんなファイル勝手に置くのか分からなくて不安だったりとか、 ちょっと試してみたいだけなのにあちこちにファイルばらまかれるのウザいとかがある。

とはいえ、そんなちょっと試してみようくらいのもののために、専用で VM やら container やらセットアップするのはめんどい。

ということで、普段使いの環境の上に overlayfs をかぶせて、その上で nspawn container を走らせる。 これなら VM を一から作る必要なく普段の環境が使えるし、ホスト環境自体が書き換えられることもないし、 upper ディレクトリを見ればどんなファイルが書き換えられたのか分かる。

curl install.sh でぐぐって最初に出てきた npm をインストールしてみる。

$ sudo overrun
Spawning container AVY9gwqwxx on /tmp/tmp.AVY9gwqwxx/root.
Press ^] three times within 1s to kill container.
AVY9gwqwxx# dhcpcd -C resolv.conf host0
write_path: /proc/sys/net/ipv6/conf/host0/autoconf: Read-only file system
host0: adding address fe80::ac07:68c4:b517:567c
DUID 00:01:00:01:1d:34:d1:21:2a:8f:30:91:f7:12
host0: IAID 30:91:f7:12
host0: soliciting a DHCP lease
host0: offered 10.0.0.18 from 10.0.0.17
host0: leased 10.0.0.18 for 3600 seconds
host0: adding route to 10.0.0.16/28
host0: adding default route via 10.0.0.17
forked to background, child pid 48
AVY9gwqwxx# curl -L https://www.npmjs.com/install.sh | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6239  100  6239    0     0  11576      0 --:--:-- --:--:-- --:--:-- 11596
tar=/usr/sbin/tar
version:
tar (GNU tar) 1.28
Copyright (C) 2014 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.

Written by John Gilmore and Jay Fenlason.
install npm@latest
fetching: http://registry.npmjs.org/npm/-/npm-2.13.0.tgz
unbuild npm@2.11.3
/usr/bin/npm -> /usr/lib/node_modules/npm/bin/npm-cli.js
npm@2.13.0 /usr/lib/node_modules/npm
It worked
AVY9gwqwxx#

インストールされた。

さて、実際どこに何が置かれたのか、この出力からでは全然分からんので、 upper ディレクトリを参照してみる。

$ find /tmp/tmp.AVY9gwqwxx/upper/
/tmp/tmp.AVY9gwqwxx/upper/root
/tmp/tmp.AVY9gwqwxx/upper/usr
/tmp/tmp.AVY9gwqwxx/upper/usr/share
/tmp/tmp.AVY9gwqwxx/upper/usr/share/man
/tmp/tmp.AVY9gwqwxx/upper/usr/share/man/man7
/tmp/tmp.AVY9gwqwxx/upper/usr/share/man/man7/semver.7
/tmp/tmp.AVY9gwqwxx/upper/usr/share/man/man7/removing-npm.7
/tmp/tmp.AVY9gwqwxx/upper/usr/share/man/man7/npm-scripts.7
/tmp/tmp.AVY9gwqwxx/upper/usr/share/man/man7/npm-scope.7
... snip ...

ということで、 container 内で書き換えられたファイルがどれか、全て確認することができる。

あとはまあ、 container 環境内で一通り使ってみて終わりにするなり、 ホスト側で改めてインストーラーを実行しなおすなり、 upper ディレクトリ内をディストリのパッケージとして固めてホストにインストールするなり、 好きなように。