しばたテックブログ

気分で書いている技術ブログです。

PowerShell CoreのSnapパッケージが提供されました

既に各所で報じられ日本語情報も多いですが、思っていた以上にニュースになっている様なので本ブログでもとりあげてみます。

公式情報

細かい話についてはPowerShell Teamのこちらのブログエントリをご覧ください。

blogs.msdn.microsoft.com

Snapsについて

Snapsの公式サイトはコチラ。

snapcraft.io

Wikipediaによれば、

Snappyとはカノニカルが設計・開発したソフトウェアデプロイメントシステムかつパッケージ管理システムであり、元々はUbuntu Phoneオペレーティングシステム用に設計・開発された。
Snappyのパッケージは 'Snap' と呼ばれ、Snapを使うツールは 'Snapd' と呼ばれる。Snapは様々なLinuxディストリビューションで動作するので、ディストリビューションの上流のソフトウェアデプロイメントに依存しない。Snappyのシステムは携帯電話、クラウド、IoTやデスクトップパソコン向けに設計されている。

とあり、ディストリビューションに依存しない新しいパッケージマネージャーだそうです。

正直アーキテクチャなどでわからない部分は多いのですが、ざっと試した限りだとMicrosoft StoreとDesktop Bridgeの組み合わせに近い様に感じました。
(実際この例えが適切なのかは自信がありません...)

また、呼称について、今はSnappyでなくSnapsと呼ばれている?*1様です。
このあたりの事情については調べてみてもあまり情報を得ることができませんでした...

インストール方法

実際にSnapパッケージをインストールする手順を紹介します。

1. snapdのインストール

最初にsnapdをインストールする必要があります。

docs.snapcraft.io

に各ディストリビューション毎のインストール手順が紹介されています。
おおむね各パッケージマネージャーからのインストールに対応している様です。

今回はUbuntu 18.04の環境で動作確認をしたため、デフォルトでsnapdがインストール済みでありこの手順を行うことはありませんでした。

2. PowerShell Coreのインストール

Snapパッケージの管理はsnapコマンドから行います。
以下の様に--classicオプションを付けてsnap installコマンドを実行します。

# Stableバージョンのインストール
snap install powershell --classic

# Previewバージョンのインストール
snap install powershell-preview --classic

Ubuntu 18.04の環境で試すと下図の様になります。

f:id:stknohg:20180806163506p:plain

インストール時だけルート権限を要求されます。

f:id:stknohg:20180806163534p:plain

インストールが終わるとこんな感じです。

f:id:stknohg:20180806163556p:plain

現時点でUbuntu 18.04向けのdebパッケージが提供されていないPowerShell Core 6.0.3ですが、Snapパッケージであればこの様にインストール可能です。

f:id:stknohg:20180806163620p:plain

なお、--classicパラメーターを付けないとエラーとなります。

# --classic無しだとエラー
~$ snap install powershell
error: This revision of snap "powershell" 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.

この--classicパラメーターは、classic confinement policyと呼ばれる方式で公開されたアプリケーションをインストールするのに必要なパラメーターです。
Snapパッケージはデフォルトでファイルパスなどが分離された環境で動作する方式(strict confinement policy)となっているのですが、classic confinement policyではファイルシステムのルートが/になる等システム全体へのアクセスが許可されたモードになるそうです。
PowerShell Coreはシェルとしてシステム全体にアクセスする必要があるためclassic confinement policyで公開されています。

confinement policyについては

に詳しい説明があります。

従来のパッケージについて

最初のPowerShell Team Blogに記載されていますが、Snapパッケージが提供されたからといって従来のパッケージマネージャー向けのパッケージの提供を止めるといった事は無いそうです。
PowerShellを利用するための選択肢を増やし、利用者がより簡易にアプリケーションを管理できる様にするためのサポートといったところの様です。

設定情報など

最後に補足としてSnapパッケージとしてインストールされたPowerShell Coreの情報を幾つかか確認して終わりにします。

検証環境

先ほどと同じUbuntu 18.04の環境です。

パス情報

実行バイナリであるpwsh/snap/bin/pwshにありました。

~$ which pwsh
/snap/bin/pwsh

環境変数

PowerShell Coreを起動した後に見える環境変数には、以下の様にSNAP_で始まるSnapパッケージ情報を持つものが追加されています。

PS /> dir env:\SNAP*

Name                           Value
----                           -----
SNAP_USER_DATA                 /home/shiba/snap/powershell/7
SNAP                           /snap/powershell/7
SNAP_REEXEC
SNAP_NAME                      powershell
SNAP_VERSION                   6.0.3
SNAP_COOKIE                    HkSK6dTCpnVqHy4D9fY3WbPWwK1GdMmgC1rYHpnn076t
SNAP_ARCH                      amd64
SNAP_DATA                      /var/snap/powershell/7
SNAP_COMMON                    /var/snap/powershell/common
SNAP_CONTEXT                   HkSK6dTCpnVqHy4D9fY3WbPWwK1GdMmgC1rYHpnn076t
SNAP_REVISION                  7
SNAP_USER_COMMON               /home/shiba/snap/powershell/common
SNAP_LIBRARY_PATH              /var/lib/snapd/lib/gl:/var/lib/snapd/lib/gl32:/var/lib/snapd/void

PATH絡みの環境変数はこんな感じ。

PS /> $env:PATH -split ':'
/snap/powershell/7/opt/powershell
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

PS /> $env:PSModulePath -split ':'
/home/shiba/.local/share/powershell/Modules
/usr/local/share/powershell/Modules
/snap/powershell/7/opt/powershell/Modules

PowerShell Coreの実体は/snap/powershell/[パッケージのバージョン番号]/opt/配下にあり、モジュールパスは他のパッケージ版と同じになっています。

/snap/powershell/配下の構成

treeコマンドで/snap/powershell/配下を確認するとこんな感じでした。
必要なライブラリなどがバージョンごとに分離された環境にまとめられていることがわかります。

~$ sudo tree -d -L 5 /snap/powershell/
/snap/powershell/
├── 7
│   ├── etc
│   │   ├── gss
│   │   │   └── mech.d
│   │   └── ldap
│   ├── lib
│   │   └── x86_64-linux-gnu
│   ├── meta
│   │   └── gui
│   ├── opt
│   │   └── powershell
│   │       ├── Modules
│   │       │   ├── Microsoft.PowerShell.Archive
│   │       │   ├── Microsoft.PowerShell.Host
│   │       │   ├── Microsoft.PowerShell.Management
│   │       │   ├── Microsoft.PowerShell.Security
│   │       │   ├── Microsoft.PowerShell.Utility
│   │       │   ├── PSDesiredStateConfiguration
│   │       │   ├── PSReadLine
│   │       │   ├── PackageManagement
│   │       │   └── PowerShellGet
│   │       ├── en-US
│   │       │  
│   │      (├── ※ pwsh はココ)
│   │       │  
│   │       └── ref
│   ├── snap
│   │   └── gui
│   └── usr
│       ├── lib
│       │   ├── sasl2
│       │   └── x86_64-linux-gnu
│       │       ├── krb5
│       │       ├── openssl-1.0.0
│       │       └── sasl2
│       └── share
│           ├── doc
│           │   ├── libasn1-8-heimdal
│           │   
│           │   ・・・ (中略) ・・・
│           │   
│           │   └── zlib1g
│           ├── lintian
│           │   └── overrides
│           └── man
│               └── man5
└── current -> 7

*1:Snappyの呼称はSnappy Ubuntu Coreのディストリビューション全体を指すように推移している様に見受けられたのですがいまいちわかりませんでした。