依返饋, 重新整理下方案, 用語跟 xdg-app 同步, 以免造成解讀上的問題, 官方設計請見

xdg-app 官方設計的目錄放置範例如下

.local/share/xdg-app/
├── repo
│   ├── config
│   ├── objects
│   │   ├── 00
│   │   ┊
│   │   └── ff
│   ├── refs
│   │   ├── heads
│   │   └── remotes
│   │       └── test-repo
│   └── state
├── runtime
│   └── org.gnome.Platform
│       └── x86_64
│           └── 3.14
│               ├── 71885e962e0daa8635cc7f33…
│               │   └── files
│               │       └┈
│               ├── active -> 71885e962e0daa8635cc7f33…
│               └── origin
├── app
│   └── org.gnome.GEdit
│       └── x86_64
│           └── master
│               ├── active -> cf22ec5c375bba629b33385a…
│               ├── cf22ec5c375bba629b33385a…
│               │   ├── export
│               │   ├── files
│               │   │   └┈
│               │   └── metadata
│               └── origin
└── exports
    └── share
        ├── applications
        ├── dbus-1
        └── icons
.var/
└── app
    └── org.gnome.GEdit
        ├── data
        ├── config
        └── cache

原來內文用到的詞彙對應關係為

  • framework => runtime: 一個大而全的特定桌面環境依賴集合
  • application => app: 應用本身
  • exports => exports: 放置 app 中要曝露給 host 看的如 icon, .service file, ...
  • container => bundle (非 xdg-app 術語), 代表 runtime + app 的集合

週六 (2015/12/12) 討論重點是, 如何減少導入 xdg-app 後產生的工作量. 因為 xdg-app 要求 app 在執行時 bind mount 到 /App, 而放置位置的變更, 會帶來額外的工作量, 至少, 會有更新 configure 參數並重 build 的需要.

所以, 此方案的重點在, 如何配合 xdg-app 但變更 app 安裝 & 執行位置, 同時避免 unionfs/aufs/overlayfs 的導入, 減少 I/O 效能受影響的程度.

其他如下載, 版本管理, 更新, 卸載等功能, 延用目前 xdg-app 的實現.

做法概述如下

  1. 產生一個 image file
  2. 在其上建立 btrfs file system
    • xdg-app 所述的目錄結構會放在這個 btrfs file system 中
  3. 接著, 以 xdg-app 下載 runtime
  4. 以 xdg-app 下載 app
  5. 為了讓 runtime + app 能合成一塊
    0. 對 app 依賴的 runtime 做一份 copy, 用做 bundle
    0. 將 app 中的檔案以 hardlink 的方式加到新產生的 bundle 中
    0. 執行時, 不需要再將 app 的內容 bind mount 到 /App, 一個 bundle 搞定
  6. 如果 app 或是 runtime 更新時, 刪了相應的 bundle, 然後執行步驟 5
  7. 如果 app 卸載, 要將相應的 app 及 bundle 刪除

步驟 5 是為什麼導入 btrfs 的原因. 產生 runtime 的 copy 時, 可以 btrfs 的 snapshot 完成, 這樣, 雖然產生了一份 runtime 的 copy, 但並不會有多份實際的 copy, 只是內容的 reference, 所以產生的速度也相當快. 另外, 因為要將 app 的檔案 hardlink 進 bundle 中, 所以 bundle 中的內容會被改變, 這時候 readable/writable 的 snapshot 就相當合乎我們的需求.

因為加入了 bundle 的綠故, 目錄結構變更如下 (主要加上了 bundle 目錄)

.local/share/xdg-app/
├── repo
│   ├── config
│   ├── objects
│   │   ├── 00
│   │   ┊
│   │   └── ff
│   ├── refs
│   │   ├── heads
│   │   └── remotes
│   │       └── test-repo
│   └── state
├── runtime
│   └── org.gnome.Platform
│       └── x86_64
│           └── 3.14
│               ├── 71885e962e0daa8635cc7f33…
│               │   └── files
│               │       └┈
│               ├── active -> 71885e962e0daa8635cc7f33…
│               └── origin
├── app
│   └── org.gnome.GEdit
│       └── x86_64
│           └── master
│               ├── active -> cf22ec5c375bba629b33385a…
│               ├── cf22ec5c375bba629b33385a…
│               │   ├── export
│               │   ├── files
│               │   │   └┈
│               │   └── metadata
│               └── origin
├── bundle
│   └── org.gnome.GEdit
│       ├── files
│       │   └┈
│       └── metadata
└── exports
    └── share
        ├── applications
        ├── dbus-1
        └── icons
.var/
└── app
    └── org.gnome.GEdit
        ├── data
        ├── config
        └── cache

其中

  • files 目錄放置 runtime + app 合併後的內容
  • metadata 描述跟這個 bundle 相關的 runtime & app 資訊