Ubuntu snaps có thể ghi dữ liệu ở đâu?


30

Các ứng dụng được đóng gói dưới dạng snaps trong Ubuntu được cài đặt (gắn kết) dưới /snap/$SNAPPNAMEvị trí. Mọi thứ bên dưới /snapđược gắn kết như một hệ thống tệp chỉ đọc, do đó, các ứng dụng không thể ghi vào không gian đó, trong các thư mục của ứng dụng khác cũng như trong thư mục của chúng.

Mặc dù có một home giao diện mà snaps có thể chỉ định để đọc / ghi thư mục chính của người dùng, nhưng nó được dành riêng vì lý do bảo mật và cần được người dùng kết nối (bật) theo cách thủ công.

Vì vậy, một ứng dụng trong snap có thể ghi cấu hình, dữ liệu và các tệp khác của nó ở đâu? Có API để truy cập các vị trí có thể ghi đặc biệt không?

Câu trả lời:


41

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_DATASNAP_USER_DATA.

  • SNAP_DATAlà 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_DATAlà 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_DATAvà 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/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/1SNAP_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 homegiao diện để lưu trữ dữ liệu bạn có thể lưu trữ SNAP_DATAhoặ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_COMMONngồ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_COMMONngồ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/binkhô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

1
Không phải SNAP_USER_COMMONdir đượ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ạy snap run apptạo thư mục đó, mặc dù (nhưng lệnh thất bại với execv failed: No such file or directory... Tôi không biết làm thế nào để sử dụng lệnh đó).

1
Có, nó nên như vậy, nhưng nó không phải (một lỗi đã được sửa trong bản phát hành sắp tới snap runđược sử dụng).
Kyle

1
Lưu ý rằng snap run được sử dụng kể từ v2.15.
Kyle

2
Có vẻ như tài liệu được cập nhật, ở đây trang ref snapcraft.io/docs/reference/env
user.dz

2
Hai năm sau - bạn đã uống cà phê chưa? Vẫn không có tài liệu nào về nơi các ứng dụng Snap có thể ghi dữ liệu trong hệ thống tệp (ảo hoặc máy chủ). Điều đó không mang lại cho tôi nguồn cảm hứng tuyệt vời khi tôi cố gắng hiểu các chi tiết rõ ràng cơ bản về snaps.
Dan Nissenbaum
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.