Tôi gặp khó khăn khi giới thiệu bạn đến tài liệu, điều đó có nghĩa là tôi chưa uống cà phê (đúng) hoặc chúng tôi đang thiếu một số tài liệu ( cập nhật : một số tài liệu ở đây )
Khi bạn khai báo các ứng dụng trong snapcraft.yaml
đó, kết quả là trình bao bọc nhị phân được tạo khi cài đặt và đặt vào /snap/bin/
, được đặt tên theo gói và tên ứng dụng của bạn (lưu ý rằng nếu ứng dụng là một dịch vụ, thì trình bao bọc này thay vì tệp systemd .service).
Trình bao bọc đó chứa hầu hết môi trường mà ứng dụng sẽ chạy. Hai biến môi trường có liên quan nhất đến câu hỏi này là SNAP_DATA
và SNAP_USER_DATA
.
SNAP_DATA
là một khu vực có thể ghi trên toàn hệ thống (in /var/snap/
). Điều này có thể được sử dụng để lưu trữ nhật ký cho các dịch vụ, ví dụ.
SNAP_USER_DATA
là một vùng ghi cụ thể của người dùng trong thư mục chính của người dùng đang chạy ứng dụng (cụ thể /home/<user>/snap/
). Điều này có thể được sử dụng cho các tập tin cấu hình người dùng cụ thể, vv
Cả hai thư mục này đều rất quan trọng đối với chức năng nâng cấp / rollback, vì cả hai đều được phiên bản . Đó là, mỗi phiên bản của một snap nhất định có bản sao riêng của các thư mục này. Hãy để tôi giải thích với một ví dụ.
Giả sử bạn cài đặt phiên bản 1 của snap "foo". Điều đó sẽ tạo ra hai thư mục:
/var/snap/foo/1
( SNAP_DATA
)
/home/<user>/snap/foo/1
( SNAP_USER_DATA
)
Bây giờ nói "foo" sử dụng cả hai. Có thể nó có một dịch vụ lưu trữ cơ sở dữ liệu SNAP_DATA
và tệp nhị phân sử dụng tệp cấu hình SNAP_USER_DATA
.
Bây giờ phiên bản 2 của "foo" đã được phát hành và nó tự động được cập nhật. Điều đầu tiên xảy ra là /var/snap/foo/1
được sao chép vào /var/snap/foo/2
và /home/<user>/snap/foo/1
được sao chép vào /home/<user>/snap/foo/2
. Sau đó, phiên bản mới được kích hoạt. Cần lưu ý rằng nó đang chạy trên dữ liệu cũ và có thể nó có một số di chuyển cơ sở dữ liệu để chạy đến cơ sở dữ liệu SNAP_DATA
. Nó làm điều đó, và nó đi.
Bây giờ nói rằng những lần di chuyển đó thất bại vì bất kỳ lý do gì, và ứng dụng này cần phải được khôi phục. Nó bắt đầu sử dụng phiên bản cũ của ứng dụng / snap / foo, nơi SNAP_DATA
được trỏ đến /var/snap/foo/1
và SNAP_USER_DATA
đang trỏ đến /home/<user>/snap/foo/1
. Điều này chọn mọi thứ trên phiên bản cũ tại thời điểm trước khi di chuyển được chạy, vì các hoạt động đó được chạy trên một bản sao của dữ liệu.
Câu chuyện dài: không sử dụng home
giao diện để lưu trữ dữ liệu bạn có thể lưu trữ SNAP_DATA
hoặc SNAP_USER_DATA
, vì chúng là một phần không thể thiếu trong chiến lược nâng cấp / khôi phục. Hãy tận dụng chúng!
CẬP NHẬT cho v2.0.10:
Hai thư mục dữ liệu mới cũng được giới thiệu:
SNAP_COMMON
ngồi bên cạnh SNAP_DATA
, nhưng đặc biệt không đảo ngược . Mọi sửa đổi của snap cụ thể đều có quyền truy cập vào thư mục này, vì vậy nó không được sao chép khi nâng cấp / rollback, v.v. Điều này có thể được sử dụng cho các tệp đặc biệt lớn, không đảo ngược (ví dụ: dữ liệu thô không thực sự cụ thể theo phiên bản).
SNAP_USER_COMMON
ngồi bên cạnh SNAP_USER_DATA
, nhưng một lần nữa đặc biệt không đảo ngược . Nó có thể được sử dụng để lưu trữ dữ liệu không theo phiên bản cho mỗi người dùng.
CẬP NHẬT cho v2.15:
Các tệp được đặt bên trong /snap/bin
không còn là các trình bao bọc xác định môi trường, mà là các liên kết tượng trưng đến /usr/bin/snap
. Vì vậy, cách để xác định môi trường mà ứng dụng chạy sẽ được sử dụng snap run --shell <snap>.<app>
, ví dụ:
$ sudo snap install hello-world
$ snap run --shell hello-world
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
$ env | grep SNAP
SNAP_USER_COMMON=/home/kyrofa/snap/hello-world/common
SNAP_REEXEC=
SNAP_LIBRARY_PATH=/var/lib/snapd/lib/gl:
SNAP_COMMON=/var/snap/hello-world/common
SNAP_USER_DATA=/home/kyrofa/snap/hello-world/27
SNAP_DATA=/var/snap/hello-world/27
SNAP_REVISION=27
SNAP_NAME=hello-world
SNAP_ARCH=amd64
SNAP_VERSION=6.3
SNAP=/snap/hello-world/27
SNAP_USER_COMMON
dir được tạo tự động bởi snapd sao? Tập lệnh launcher/snap/bin/
không tạo ra nó và việc tạo nó theo cách thủ công bên trong snap không thành công (quyền bị từ chối). Chạysnap run app
tạo thư mục đó, mặc dù (nhưng lệnh thất bại vớiexecv failed: No such file or directory
... Tôi không biết làm thế nào để sử dụng lệnh đó).