paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

ubuntuでsnap操作を一通り触ってみる

サブPCとしてubuntuを使っているのですが、最近パッケージ管理としてsnap経由になってきています。

masashi@PC-ubuntu:~$ nethack

コマンド 'nethack' が見つかりません。次の方法でインストールできます:

sudo snap install nethack          # version 3.6.6, or
sudo apt  install nethack-console  # version 3.6.1-1
sudo apt  install nethack-x11      # version 3.6.1-1

他のバージョンについては 'snap info nethack' を確認してください。

masashi@PC-ubuntu:~$ microk8s

コマンド 'microk8s' が見つかりません。次の方法でインストールできます:

sudo snap install microk8s

debian系のパッケージ管理と言ったらずっとaptでやってきましたが、osからも勧められるくらいですから新しい管理システムにも慣れようということでsnap操作を一通り触ってみようと思います。

snapのバージョン。

masashi@PC-ubuntu:~$ snap version
snap    2.56.2
snapd   2.56.2
series  16
ubuntu  20.04
kernel  5.4.0-122-generic

練習パッケージ

現行で使っているパッケージに影響が出ると困りますので

  • 未インストール
  • バージョンが複数あるもの
  • サイズが大きくなさそうなやつ

を使用します。

いろいろ調べたらjujuが良さそうだったのでこちらを使います。

  • juju

インフラ自動化系のツールらしいです。
そろそろ一個くらい家でも自動化ツール使いたいですね。(規模的にいらないけど)

ubuntu.com

  • snap

snapcraft.io

今回はドキュメントの通りちょっとなぞってみるだけです。

find

パッケージの検索。
パッケージ名に関するものがずらーっと出てきます。

masashi@PC-ubuntu:~$ snap find juju
Name                      Version               Publisher       Notes    Summary
juju                      2.9.32                canonical✓      classic  Juju - a model-driven operator lifecycle manager for K8s and machines
juju-db                   4.0.27                juju-qa         -        MongoDB object/document oriented database used internally by Juju.
juju-act                  1.0.3                 stub            classic  Improve the command line user experience of Juju Action
juju-verify               1.0                   aluria          -        Juju plugin to verify if it's safe to perform an operation on juju units
juju-wait                 2.8.4~2.8.4           stub            classic  Juju plugin to wait for environment steady state.
juju-bmc                  0.1.2                 jfguedez        -        juju plugin that adds a command to access a server out band management
juju-crashdump            1.0.2+git120.a838717  jason-hobbs     classic  Gather logs and other debugging info from a Juju model
juju-axw                  2.3-aardvark          axw             classic  juju client
・・・

list

現在のパッケージの状態です。
この時点で未インストール。

masashi@PC-ubuntu:~$ snap list juju
error: no matching snaps installed

info

パッケージの情報がずらずらっと出てきます。

masashi@PC-ubuntu:~$ snap info juju
name:      juju
summary:   Juju - a model-driven operator lifecycle manager for K8s and machines
publisher: Canonical✓
store-url: https://snapcraft.io/juju
contact:   https://canonical.com/
license:   AGPL-3.0
description: |
  A model-driven **universal operator lifecycle manager** for multi cloud and hybrid cloud
  application management on K8s and machines.
  ・・・
snap-id: e2CPHpB1fUxcKtCyJTsm5t3hN9axJ0yj
channels:
  2.9/stable:       2.9.32          2022-06-24 (19681) 97MB classic
  2.9/candidate:    ↑                                       
  2.9/beta:         ↑                                       
  2.9/edge:         2.9.33-ce7090f  2022-08-03 (20248) 95MB classic
  latest/stable:    2.9.32          2022-06-24 (19681) 97MB classic
  latest/candidate: ↑                                       
  latest/beta:      3.0-beta3       2022-07-29 (20184) 73MB -
  latest/edge:      3.0-rc1-027f450 2022-08-03 (20244) 73MB -
  3.0/stable:       –                                       
  3.0/candidate:    –                                       
  3.0/beta:         3.0-beta3       2022-07-29 (20184) 73MB -
  3.0/edge:         3.0-rc1-027f450 2022-08-03 (20244) 73MB -
  2.8/stable:       2.8.13          2021-11-11 (17665) 74MB classic
  2.8/candidate:    ↑                                       
  2.8/beta:         ↑                                       
  2.8/edge:         ↑                                       
  2.7/stable:       2.7.8           2020-07-22 (13563) 77MB classic
・・・

snapのChannels

バージョン情報的なニュアンスですが、Trasks、Risk-levelという概念で管理されるようです。

Tracks/Risk-levels/(Branches)

  • Tracks: パッケージの実質的なバージョン
  • Risk-levels: 安定版と新機能の間
  • Branches: オプションで、一時的なリリースバージョン(バグ修正とかに使う)

install

この辺は他のパッケージマネージャと一緒ですね。

masashi@PC-ubuntu:~$ sudo snap install juju --classic
juju (2.9/stable) 2.9.32 from Canonical✓ installed

masashi@PC-ubuntu:~$ snap list juju
Name  Version  Rev    Tracking    Publisher   Notes
juju  2.9.32   19681  2.9/stable  canonical✓  classic

switch

Channelの切り替えの様です。
refreshしなくても切り替えられると書いてありましたが、バージョン変わってないよね?

masashi@PC-ubuntu:~$ snap list juju
Name  Version  Rev    Tracking    Publisher   Notes
juju  2.9.32   19681  2.9/stable  canonical✓  classic

masashi@PC-ubuntu:~$ sudo snap switch juju --edge
"juju" switched to the "2.9/edge" channel

masashi@PC-ubuntu:~$ snap list juju
Name  Version  Rev    Tracking  Publisher   Notes
juju  2.9.32   19681  2.9/edge  canonical✓  classic
masashi@PC-ubuntu:~$ juju --version
2.9.32-ubuntu-amd64

後述で2.7を追加してswitchを試しました。
Trackingは変更になりますが、使用するバージョンを変更するにはrefreshをしないとダメそうです。(revertでもよかったかも)
2.9->2.7

masashi@PC-ubuntu:~$ sudo snap switch juju --channel=2.7
"juju" switched to the "2.7/stable" channel

masashi@PC-ubuntu:~$ snap list juju --all
Name  Version  Rev    Tracking    Publisher   Notes
juju  2.7.8    13563  2.7/stable  canonical✓  disabled,classic
juju  2.9.32   19681  2.7/stable  canonical✓  classic
masashi@PC-ubuntu:~$ juju --version
2.9.32-ubuntu-amd64

masashi@PC-ubuntu:~$ sudo snap refresh juju
juju (2.7/stable) 2.7.8 from Canonical✓ refreshed
masashi@PC-ubuntu:~$ sudo snap refresh juju
juju (2.7/stable) 2.7.8 from Canonical✓ refreshed
masashi@PC-ubuntu:~$ juju --version
2.7.8-focal-amd64

refresh

パッケージ更新です。

masashi@PC-ubuntu:~$ snap list --all
Name                  Version                     Rev    Tracking         Publisher   Notes
・・・
juju                  2.9.32                      19681  2.9/edge         canonical✓  classic
・・・

すでにインストール済みのパッケージはrefreshで更新や前のバージョンのインストールができます。

masashi@PC-ubuntu:~$ sudo snap install juju --channel=2.7  --classic
snap "juju" is already installed, see 'snap help refresh'

masashi@PC-ubuntu:~$ sudo snap refresh juju --channel=2.7 
juju (2.7/stable) 2.7.8 from Canonical✓ refreshed

masashi@PC-ubuntu:~$ snap list juju --all
Name  Version  Rev    Tracking    Publisher   Notes
juju  2.9.32   19681  2.7/stable  canonical✓  disabled,classic
juju  2.7.8    13563  2.7/stable  canonical✓  classic
masashi@PC-ubuntu:~$ 
masashi@PC-ubuntu:~$ juju --version
2.7.8-focal-amd64

revert

バージョン切り替えのコマンド。
複数バージョンインストール済みならこのコマンドで切り替えられるようです。
これはrevision番号を使います。

masashi@PC-ubuntu:~$ snap list juju --all
Name  Version  Rev    Tracking    Publisher   Notes
juju  2.9.32   19681  2.7/stable  canonical✓  disabled,classic
juju  2.7.8    13563  2.7/stable  canonical✓  classic
masashi@PC-ubuntu:~$ 
masashi@PC-ubuntu:~$ sudo snap revert juju --revision=19681
juju reverted to 2.9.32

snapは自動Updateですが、install時にChannelを指定してインストールするとセキュリティパッチ以外のUpdateはしなくなるそうです。
こちらの動作未確認です。revertでも有効なのでしょうか。

Snap confinement

通常snapをインストールする際はパッケージはシステムへのアクセスが最低限に分離されているようです。

今回jujuをインストールする際にclassicモードを使えと警告が出ました。
classicはアクセス制限をセず、普段のパッケージマネージャのインストールと同じアクセス権となるようです。

masashi@PC-ubuntu:~$ sudo snap install juju
error: This revision of snap "juju" was published using classic confinement and thus may perform
       arbitrary system changes outside of the security sandbox that snaps are usually confined to,
       which may put your system at risk.

       If you understand and want to proceed repeat the command including --classic.

connectionsでアクセスするインターフェースが見えますがよくわかりません。

masashi@PC-ubuntu:~$ snap connections juju
Interface        Plug                       Slot              Notes
content          juju:peers                 -                 -
desktop          juju:desktop               :desktop          -
home             juju:home                  :home             -
lxd              juju:lxd                   lxd:lxd           -
network          juju:network               :network          -
network-bind     juju:network-bind          :network-bind     -
personal-files   juju:config-lxd            :personal-files   -
personal-files   juju:dot-aws               :personal-files   -
personal-files   juju:dot-azure             :personal-files   -
personal-files   juju:dot-google            :personal-files   -
personal-files   juju:dot-kubernetes        :personal-files   -
personal-files   juju:dot-local-share-juju  :personal-files   -
personal-files   juju:dot-maas              :personal-files   -
personal-files   juju:dot-openstack         :personal-files   -
personal-files   juju:dot-oracle            :personal-files   -
ssh-public-keys  juju:ssh-public-keys       :ssh-public-keys  -

Snapshot

現在インストール済みのバージョンのsnapshotが取れるらしい。

saveコマンド。

masashi@PC-ubuntu:~$ sudo snap save juju
Set  Snap  Age    Version  Rev    Size    Notes
5    juju  314ms  2.9.32   19681    500B  -

savedでsnapshot状態が確認できます。

masashi@PC-ubuntu:~$ snap saved
Set  Snap  Age    Version  Rev    Size    Notes
5    juju  6m44s  2.9.32   19681    500B  -

使用バージョンを変更してみます。
2.9 -> 2.7

masashi@PC-ubuntu:~$ sudo snap revert juju --revision=13563
juju reverted to 2.7.8
masashi@PC-ubuntu:~$ snap list juju --all
Name  Version  Rev    Tracking    Publisher   Notes
juju  2.9.32   19681  2.7/stable  canonical✓  disabled,classic
juju  2.7.8    13563  2.7/stable  canonical✓  classic

restoreコマンドを打ってみます。(2.9に戻す)

masashi@PC-ubuntu:~$ sudo snap restore 5 juju
Restored snapshot #5 of snaps "juju".
masashi@PC-ubuntu:~$ snap list juju --all
Name  Version  Rev    Tracking    Publisher   Notes
juju  2.9.32   19681  2.7/stable  canonical✓  disabled,classic
juju  2.7.8    13563  2.7/stable  canonical✓  classic

2.7のままですね。
使用バージョンが変わるわけでは無い様です。
あくまでもパッケージ自体の保存と修復の様ですね。

パッケージのディレクト

/var/snap配下に各パッケージが保存されています。

masashi@PC-ubuntu:~$ ls -l /var/snap/juju/
合計 12
drwxr-xr-x 2 root root 4096  84 10:08 13563
drwxr-xr-x 2 root root 4096  84 10:08 19681
drwxr-xr-x 2 root root 4096  84 10:36 common
lrwxrwxrwx 1 root root    5  84 15:09 current -> 13563

数字のディレクトリはリビジョン番号っぽい。
currentが今のバージョンに向いているのね。

masashi@PC-ubuntu:~$ ls -l /var/snap/juju/current
lrwxrwxrwx 1 root root 5  84 15:09 /var/snap/juju/current -> 13563
masashi@PC-ubuntu:~$ 
masashi@PC-ubuntu:~$ ls -l /var/snap/juju/13563/
合計 0

しかしリビジョンのディレクトリ内は空でした。
ただの管理のために存在しているんでしょうか。

masashi@PC-ubuntu:~$ ls -l /var/snap/juju/1*
/var/snap/juju/13563:
合計 0

/var/snap/juju/19681:
合計 0

uninstall

アンインストールはremoveです。

masashi@PC-ubuntu:~$ sudo snap remove juju
juju removed

リスト、ディレクトリから消えました。

masashi@PC-ubuntu:~$ snap list juju --all
error: no matching snaps installed
masashi@PC-ubuntu:~$ ls -l /var/snap/juju
ls: '/var/snap/juju' にアクセスできません: そのようなファイルやディレクトリはありません

snapshotには残っているみたいなので間違って消えてもここから戻せそう。
remove時のバージョンも残るようです。

masashi@PC-ubuntu:~$ snap saved
Set  Snap  Age    Version  Rev    Size    Notes
5    juju  17.4m  2.9.32   19681    500B  -
6    juju  1m24s  2.7.8    13563    501B  auto

と思いきやrestoreだけではダメでした。
この機能は自作snapを作る時に使う感じでしょうか。

masashi@PC-ubuntu:~$ sudo snap restore 5 juju
Restored snapshot #5 of snaps "juju".
masashi@PC-ubuntu:~$ snap list juju --all
error: no matching snaps installed

まとめ

snapの操作を一通り行いました。
使い勝手としては各ディレクトリビューションのパッケージマネージャと変わりませんが、 ディストロ問わず同じコマンドを使えるのは意外と便利かもしれません。

パッケージのバージョンの行き来も簡単で、実際の運用で使う機会はそんなになさそうですが、
最新版にあげたらバグがあったのでちょっと戻したい、となった時に便利そうです。