Ubuntu Core:制作包含私有 snap 的工廠鏡像

題圖:by ubuntu_os from Instagram

這篇帖子是有關(guān) 在 Ubuntu Core 開發(fā) ROS 原型到成品 系列的補充,用來回答我收到的一個問題: “我想做一個工廠鏡像,但我不想使我的 snap 公開” 當然,這個問題和回答都不只是針對于機器人技術(shù)。在這篇帖子中,我將會通過兩種方法來回答這個問題。

開始之前,你需要了解一些制作 Ubuntu Core 鏡像的背景知識,如果你已經(jīng)看過 [在 Ubuntu Core 開發(fā) ROS 原型到成品3 系列文章(具體是第 5 部分),你就已經(jīng)有了需要的背景知識,如果沒有看過的話,可以查看有關(guān) 制作你的 Ubuntu Core 鏡像 的教程。

如果你已經(jīng)了解了最新的情況,并且當我說 “模型定義” 或者 “模型斷言” 時知道我在談?wù)撌裁矗蔷妥屛覀冮_始通過不同的方法使用私有 sanps 來制作 Ubuntu Core 鏡像吧。

方法 1: 不要上傳你的 snap 到商店

這是最簡單的方法了。首先看一下這個有關(guān)模型定義的例子——amd64-model.json

{
    "type": "model",
    "series": "16",
    "model": "custom-amd64",
    "architecture": "amd64",
    "gadget": "pc",
    "kernel": "pc-kernel",
    "authority-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8",
    "brand-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8",
    "timestamp": "2017-06-23T21:03:24+00:00",
    "required-snaps": ["kyrofa-test-snap"]
}

讓我們將它轉(zhuǎn)換成模型斷言:

$ cat amd64-model.json | snap sign -k my-key-name > amd64.model
You need a passphrase to unlock the secret key for
user: "my-key-name"
4096-bit RSA key, ID 0B79B865, created 2016-01-01
...

獲得模型斷言:amd64.model 后,如果你現(xiàn)在就把它交給 ubuntu-image 使用,你將會碰釘子:

$ sudo ubuntu-image -c stable amd64.model 
Fetching core
Fetching pc-kernel
Fetching pc
Fetching kyrofa-test-snap
error: cannot find snap "kyrofa-test-snap": snap not found
COMMAND FAILED: snap prepare-image --channel=stable amd64.model /tmp/tmp6p453gk9/unpack

實際上商店中并沒有名為 kyrofa-test-snap 的 snap。這里需要重點說明的是:模型定義(以及轉(zhuǎn)換后的斷言)只包含了一系列的 snap 的名字。如果你在本地有個那個名字的 snap,即使它沒有存在于商店中,你也可以通過 --extra-snaps 選項告訴 ubuntu-image 在斷言中匹配這個名字來使用它:

$ sudo ubuntu-image -c stable \
         --extra-snaps /path/to/kyrofa-test-snap_0.1_amd64.snap \
         amd64.model
Fetching core
Fetching pc-kernel
Fetching pc
Copying "/path/to/kyrofa-test-snap_0.1_amd64.snap" (kyrofa-test-snap)
kyrofa-test-snap already prepared, skipping
WARNING: "kyrofa-test-snap" were installed from local snaps
disconnected from a store and cannot be refreshed subsequently!
Partition size/offset need to be a multiple of sector size (512).
The size/offset will be rounded up to the nearest sector.

現(xiàn)在,在 snap 并沒有上傳到商店的情況下,你已經(jīng)獲得一個預(yù)裝了私有 snap 的 Ubuntu Core 鏡像(名為 pc.img)。但是這樣做有一個很大的問題,ubuntu-image 會提示一個警告:不通過連接商店預(yù)裝 snap 意味著你沒有辦法在燒錄了這些鏡像的設(shè)備上更新它。你只能通過制作新的鏡像并重新燒錄到設(shè)備的方式來更新它。

方法 2: 使用品牌商店

當你注冊了一個商店賬號并訪問 dashboard.snapcraft.io 時,你其實是在標準的 Ubuntu 商店中查看你的 snap。如果你是在系統(tǒng)中新安裝的 snapd,默認會從這個商店下載。雖然你可以在 Ubuntu 商店中發(fā)布私有的 snap,但是你不能將它們預(yù)裝到鏡像中,因為只有你(以及你添加的合作者)才有權(quán)限去使用它。在這種情況下制作鏡像的唯一方式就是公開發(fā)布你的 snap,然而這并不符合這篇帖子的目的。

對于這種用例,我們有所謂的 品牌商店。品牌商店仍然托管在 Ubuntu 商店里,但是它們是針對于某一特定公司或設(shè)備的一個定制的、專門的版本。品牌商店可以繼承或者不繼承標準的 Ubuntu 商店,品牌商店也可以選擇開放給所有的開發(fā)者或者將其限制在一個特定的組內(nèi)(保持私有正是我們想要的)。

請注意,這是一個付費功能。你需要 申請一個品牌商店。請求通過后,你將可以通過訪問用戶名下的 “stores you can access” 看到你的新商店。

在那里你可以看到多個有權(quán)使用的商店。最少的情況下也會有兩個:標準的 Ubuntu 商店以及你的新的品牌商店。選擇品牌商店(紅框),進去后記錄下你的商店 ID(藍框):等下你將會用到它。

在品牌商店里注冊名字或者上傳 snap 和標準的商店使用的方法是一樣的,只是它們現(xiàn)在是上傳到你的品牌商店而不是標準的那個。如果你將品牌商店放在 unlisted 里面,那么這些 snap 對外部用戶是不可見。但是這里需要注意的是第一次上傳 snap 的時候需要通過 web 界面來操作。在那之后,你可以繼續(xù)像往常一樣使用 Snapcraft 來操作。

那么這些是如何改變的呢?我的 “kyrofal-store” 從 Ubuntu 商店繼承了 snap,并且還包含一個發(fā)布在穩(wěn)定通道中的 “kyrofa-bran-test-snap” 。這個 snap 在 Ubuntu 商店里是使用不了的,如果你去搜索它,你是找不到的:

$ snap find kyrofa-branded
The search "kyrofa-branded" returned 0 snaps

但是使用我們前面記錄的商店 ID,我們可以創(chuàng)建一個從品牌商店而不是 Ubuntu 商店下載 snap 的模型斷言。我們只需要將 “store” 鍵添加到 JSON 文件中,就像這樣:

{
    "type": "model",
    "series": "16",
    "model": "custom-amd64",
    "architecture": "amd64",
    "gadget": "pc",
    "kernel": "pc-kernel",
    "authority-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8",
    "brand-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8",
    "timestamp": "2017-06-23T21:03:24+00:00",
    "required-snaps": ["kyrofa-branded-test-snap"],
    "store": "ky<secret>ek"
}

使用方法 1 中的方式對它簽名,然后我們就可以像這樣很簡單的制作一個預(yù)裝有我們品牌商店私有 snap 的 Ubuntu Core 鏡像:

$ sudo ubuntu-image -c stable amd64.model
Fetching core
Fetching pc-kernel
Fetching pc
Fetching kyrofa-branded-test-snap
Partition size/offset need to be a multiple of sector size (512).
The size/offset will be rounded up to the nearest sector.

現(xiàn)在,和方法 1 的最后一樣,你獲得了一個為工廠準備的 pc.img。并且使用這種方法制作的鏡像中的所有 snap 都從商店下載的,這意味著它們將能像平常一樣自動更新。

結(jié)論

到目前為止,做這個只有兩種方法。當我開始寫這篇帖子的時候,我想過可能還有第三種(將 snap 設(shè)置為私有然后使用它制作鏡像),但最后證明是不行的

另外,我們也收到很多內(nèi)部部署或者企業(yè)商店的請求,雖然這樣的產(chǎn)品還沒有公布,但是商店團隊正在從事這項工作。一旦可用,我將會寫一篇有關(guān)它的文章。

希望能幫助到您!


關(guān)于作者:

Kyle 是 Snapcraft 團隊的一員,也是 Canonical 公司的常駐機器人專家,他專注于 snaps 和 snap 開發(fā)實踐,以及 snaps 和 Ubuntu Core 的機器人技術(shù)實現(xiàn)。

譯者簡介:

常年混跡于 snapcraft.io,對 Ubuntu Core、snaps 和 snapcraft 有濃厚的興趣,并致力于將這些還在快速發(fā)展的新技術(shù)通過翻譯或原創(chuàng)的方式介紹到中文世界。有興趣的小伙伴也可以關(guān)注譯者個人的公眾號: Snapcraft


via: https://insights.ubuntu.com/2017/07/11/ubuntu-core-making-a-factory-image-with-private-snaps/

作者:Kyle Fazzari
譯者:Snapcrafter
校對:wxy

本文由 LCTT 原創(chuàng)編譯,Linux中國 榮譽推出

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • OpenStack 非常復(fù)雜,許多社區(qū)成員都在努力使 OpenStack 的部署和操作更加容易。其中大部分時間都用...
    Snapcraft閱讀 829評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,556評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 八月,熱氣蒸騰。大多數(shù)人都想著拼搏向上,只能說,太心急了。看好時機,再壓榨自己。(文@云意三千) 選出以下最有感覺...
    貓七七四十九閱讀 713評論 0 0
  • 唇膏是女人必不可少的神器,那一抹色彩,時而濃郁,時而清淡,在唇膏的妝點下,一抹大紅,你可以化身為氣場強大的職場御姐...
    wuli愛美控閱讀 524評論 0 0