
前回作成したSnappyのパッケージはどういう仕組みで動いているのでしょうか?
$ which talker-listener.listener /snap/bin/talker-listener.listener
$ ls -l /snap/bin/talker-listener.listener lrwxrwxrwx 1 root root 13 Jul 21 16:04 /snap/bin/talker-listener.listener -> /usr/bin/snap
となっています.これは,以下を実行するのと等価になるようです.
$ snap run talker-listener.listener
snapファイルは,単に/snap/に展開されるだけです.currentというのが最新版ですが,これはx1へのシンボリックリンクになっています.容易にロールバックできるようにするためなのでしょう.
$ ls -l /snap/talker-listener/ total 0 lrwxrwxrwx 1 root root 2 Jul 21 16:04 current -> x1 drwxrwxr-x 10 root root 222 Jul 21 16:00 x1
$ ls /snap/talker-listener/current bin command-roscore.wrapper etc meta snap var command-listener.wrapper command-talker.wrapper lib opt usr
command-listener.wrapperというのが目に付きます.中身を見ると,
#!/bin/sh
export PATH="$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu"
export ROS_MASTER_URI=http://localhost:11311
export ROS_HOME=${SNAP_USER_DATA:-/tmp}/ros
export LC_ALL=C.UTF-8
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu
export PYTHONPATH=$SNAP/usr/lib/python2.7/dist-packages:$PYTHONPATH
export PATH=$PATH:$SNAP/usr/bin
# Shell quote arbitrary string by replacing every occurrence of '
# with '\'', then put ' at the beginning and end of the string.
# Prepare yourself, fun regex ahead.
quote()
{
for i; do
printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/"
done
echo " "
}
BACKUP_ARGS=$(quote "$@")
set --
if [ -f $SNAP/opt/ros/kinetic/setup.sh ]; then
_CATKIN_SETUP_DIR=$SNAP/opt/ros/kinetic . $SNAP/opt/ros/kinetic/setup.sh
fi
eval "set -- $BACKUP_ARGS"
export LD_LIBRARY_PATH="$SNAP/opt/ros/kinetic/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH=$SNAP_LIBRARY_PATH:$LD_LIBRARY_PATH
exec "rosrun" roscpp_tutorials listener "$@"
となっており,ROSの環境設定などはこのラッパーファイルで行われた上で,コマンドが実行されるようです.つまり,いつもROSでやっているような”source setup.bash”などは必要ないことになります.楽になりそうですね.
snapパッケージにはほかに何が含まれているのでしょうか.
$ tree -L 3 -d /snap/talker-listener/current/
/snap/talker-listener/current/
├── bin
├── etc
│ ├── ca-certificates
│ │ └── update.d
│ ├── dpkg
│ │ └── dpkg.cfg.d
│ ├── emacs
│ │ └── site-start.d
│ ├── gss
│ │ └── mech.d
│ ├── ldap
│ ├── openmpi
│ ├── perl
│ │ ├── CPAN
│ │ └── Net
│ ├── python2.7
│ ├── python3.5
│ ├── sgml
│ ├── ssl
│ │ ├── certs
│ │ └── private
│ ├── systemd
│ │ └── system
│ └── xml
├── lib
│ └── x86_64-linux-gnu
├── meta
│ └── gui
├── opt
│ └── ros
│ └── kinetic
├── snap
├── usr
│ ├── bin
│ ├── include
│ │ ├── apr-1.0
│ │ ├── arpa
│ │ ├── asm-generic
│ │ ├── boost
│ │ ├── c++
│ │ ├── console_bridge
│ │ ├── drm
│ │ ├── gtest
│ │ ├── hwloc
│ │ ├── infiniband
│ │ ├── libltdl
│ │ ├── linux
│ │ ├── log4cxx
│ │ ├── misc
│ │ ├── mtd
│ │ ├── net
│ │ ├── netash
│ │ ├── netatalk
│ │ ├── netax25
│ │ ├── neteconet
│ │ ├── netinet
│ │ ├── netipx
│ │ ├── netiucv
│ │ ├── netpacket
│ │ ├── netrom
│ │ ├── netrose
│ │ ├── nfs
│ │ ├── numpy -> ../lib/python2.7/dist-packages/numpy/core/include/numpy
│ │ ├── openmpi -> ../lib/openmpi/include
│ │ ├── protocols
│ │ ├── python2.7
│ │ ├── rdma
│ │ ├── rpc
│ │ ├── rpcsvc
│ │ ├── scsi
│ │ ├── sound
│ │ ├── uapi
│ │ ├── uuid
│ │ ├── video
│ │ ├── x86_64-linux-gnu
│ │ └── xen
│ ├── lib
│ │ ├── compat-ld
│ │ ├── dpkg
│ │ ├── emacsen-common
│ │ ├── gcc
│ │ ├── gold-ld
│ │ ├── lapack
│ │ ├── ldscripts
│ │ ├── libblas
│ │ ├── mime
│ │ ├── openmpi
│ │ ├── pkgconfig
│ │ ├── python2.7
│ │ ├── python3
│ │ ├── python3.5
│ │ ├── sasl2
│ │ ├── sbcl
│ │ ├── ssl
│ │ ├── valgrind
│ │ └── x86_64-linux-gnu
│ ├── sbin
│ ├── share
│ │ ├── aclocal
│ │ ├── applications
│ │ ├── apps
│ │ ├── apr-1.0
│ │ ├── bash-completion
│ │ ├── binfmts
│ │ ├── boostbook
│ │ ├── boost-build
│ │ ├── bug
│ │ ├── ca-certificates
│ │ ├── cmake-3.5
│ │ ├── debhelper
│ │ ├── dh-python
│ │ ├── distro-info
│ │ ├── doc
│ │ ├── doc-base
│ │ ├── docutils
│ │ ├── dpkg
│ │ ├── emacs
│ │ ├── glib-2.0
│ │ ├── icu
│ │ ├── libtool
│ │ ├── lintian
│ │ ├── man
│ │ ├── mime
│ │ ├── mpi-default-dev
│ │ ├── numpy
│ │ ├── openmpi
│ │ ├── perl
│ │ ├── perl5
│ │ ├── pixmaps
│ │ ├── pkgconfig
│ │ ├── pyshared
│ │ ├── python
│ │ ├── python3
│ │ ├── sgml
│ │ ├── sgml-base
│ │ ├── xml
│ │ └── xml-core
│ └── src
│ └── gtest
└── var
└── lib
├── sgml-base
├── systemd
└── xml-core
144 directories
ワオ! talker-listenerのsnapパッケージには,ROSはもちろん,必要なLinuxシステムのディレクトリ構造がまるごと含まれています.ちょっと無駄な気がしますね…しかし,これがdockerなどで最近の流行りの,アプリごとに1つのコンテナを持つ(コンテナ仮想化),というやり方なのですね.
ちなみに,生成されたsnapファイルは,
$ ls -sh talker-listener_0.1_amd64.snap 154M talker-listener_0.1_amd64.snap
なんと154Mbyteもあります.こんなに大きくて,パッケージが増えた時には大丈夫なんでしょうか…どう見ても必要のないファイルがパッケージにたくさん含まれているので,このへんはおそらく解決する方法があるのでしょう.
次回は,より具体的なSnappyの活用例としてRaspberry Pi 3へのUbuntu Coreのインストール方法を見ていきましょう.
著者について