우분투 스냅은 어디에서 데이터를 쓸 수 있습니까?


30

Ubuntu에서 스냅으로 패키지 된 응용 프로그램은 해당 /snap/$SNAPPNAME위치 아래에 설치 (장착)됩니다 . 아래의 모든 것은 /snap읽기 전용 파일 시스템으로 마운트되므로 응용 프로그램은 다른 응용 프로그램의 디렉토리 나 자체의 공간에서 해당 공간에 쓸 수 없습니다.

스냅은 사용자의 홈 디렉토리를 읽고 쓰도록 지정할 수 있는 home 인터페이스 가 있지만 보안상의 이유로 예약되어 있으며 사용자가 수동으로 연결 (활성화)해야합니다.

그렇다면 스냅 내부의 앱은 구성, 데이터 및 기타 파일을 어디에 쓸 수 있습니까? 쓰기 가능한 특수 위치에 액세스하는 API가 있습니까?

답변:


41

문서를 참조하는 데 문제가 있습니다. 아직 커피를 먹지 않았거나 (참) 문서가 누락되었습니다 ( 업데이트 : 여기에서 일부 문서 )

에서 앱을 선언하면 snapcraft.yaml설치시 바이너리 래퍼가 생성되어 /snap/bin/패키지 및 앱 이름에 따라 이름이 지정됩니다 (앱이 서비스 인 경우이 래퍼는 시스템화 된 .service 파일입니다).

해당 랩퍼에는 응용 프로그램이 실행될 환경이 대부분 포함되어 있습니다. 이 질문 SNAP_DATA과 가장 관련이있는 두 가지 환경 변수는 및 SNAP_USER_DATA입니다.

  • SNAP_DATA시스템 전체의 쓰기 가능 영역 ( /var/snap/)입니다. 예를 들어 서비스의 로그를 호스팅하는 데 사용될 수 있습니다.

  • SNAP_USER_DATA응용 프로그램을 실행하는 사용자의 홈 디렉토리 (특히 /home/<user>/snap/) 에있는 사용자 별 쓰기 가능 영역입니다 . 사용자 별 구성 파일 등에 사용될 수 있습니다.

이 두 디렉토리는 모두 버전 화 되므로 업그레이드 / 롤백 기능에 매우 중요합니다 . 즉, 주어진 스냅의 각 버전에는 이러한 디렉토리의 자체 사본이 있습니다. 예를 들어 설명하겠습니다.

"foo"스냅 버전 1을 설치한다고 가정 해보십시오. 그러면 두 개의 디렉토리가 생성됩니다.

  • /var/snap/foo/1( SNAP_DATA)
  • /home/<user>/snap/foo/1( SNAP_USER_DATA)

이제 "foo"는이 두 가지를 모두 사용합니다. 데이터베이스를에 호스팅하는 서비스 SNAP_DATA와에 구성 파일을 사용하는 바이너리가있을 수 있습니다 SNAP_USER_DATA.

이제 "foo"버전 2가 릴리스되고 자동으로 업데이트됩니다. 일이 우선 즉 /var/snap/foo/1에 복사 /var/snap/foo/2하고 /home/<user>/snap/foo/1복사됩니다 /home/<user>/snap/foo/2. 그런 다음 새 버전이 시작됩니다. 이전 데이터에서 실행 중이며의 데이터베이스로 실행할 데이터베이스 마이그레이션이있을 수 있습니다 SNAP_DATA. 그렇게하고 사라집니다.

이제 이러한 마이그레이션이 어떤 이유로 든 실패한다고 말하면이 애플리케이션을 롤백해야합니다. 그것은 / 스냅 / foo는 응용 프로그램의 이전 버전 사용하기 시작 SNAP_DATA가리키는되었다 /var/snap/foo/1SNAP_USER_DATA가리키는했다 /home/<user>/snap/foo/1. 이 작업은 데이터 복사본에서 실행되었으므로 마이그레이션이 실행되기 전 시점에서 이전 버전의 항목을 선택합니다.

간단히 말해 : 업그레이드 / 롤백 전략의 중요한 부분이기 때문에 또는에 home저장할 수있는 데이터를 저장 하기 위해 인터페이스를 사용하지 마십시오 . 그들을 활용하십시오!SNAP_DATASNAP_USER_DATA

v2.0.10 업데이트 :

두 개의 새로운 데이터 디렉토리도 도입되었습니다.

  • SNAP_COMMONSNAP_DATA에 앉아 있지만 구체적으로 버전이 없습니다 . 특정 스냅의 모든 개정판은이 디렉토리에 액세스 할 수 있으므로 업그레이드 / 롤백 등에 복사되지 않습니다. 특히 버전이 지정되지 않은 큰 파일 (예 : 실제 버전에 맞지 않는 원시 데이터)에 사용될 수 있습니다.

  • SNAP_USER_COMMONSNAP_USER_DATA에 앉아 있지만 다시 구체적으로 버전이 없습니다 . 사용자별로 비 버전 별 데이터를 저장하는 데 사용될 수 있습니다.

v2.15 업데이트 :

그 안에 위치한 파일 /snap/bin은 더 이상 환경을 정의하는 래퍼가 아니라에 대한 심볼릭 링크 /usr/bin/snap입니다. 따라서 응용 프로그램이 실행되는 환경을 결정하는 방법은 다음과 snap run --shell <snap>.<app>같습니다.

$ 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
SNAP_USER_COMMONsnap에 의해 dir이 자동으로 생성 되지 않습니까? 런처 스크립트는 스크립트를 /snap/bin/작성하지 않으며 스냅 내부에서 수동으로 작성하는 데 실패합니다 (권한 거부). 그러나 실행 snap run app하면 해당 폴더가 만들어집니다 (그러나 명령이 실패합니다 execv failed: No such file or directory... 해당 명령을 사용하는 방법을 모릅니다).

1
그렇습니다. 그러나 그렇지 않습니다 ( snap run사용되는 다음 릴리스에서 수정 된 버그 ).
Kyle

1
스냅 런은 v2.15부터 사용됩니다.
Kyle

2
문서가 업데이트 된 것 같습니다. 여기 참조 페이지 snapcraft.io/docs/reference/env
user.dz

2
2 년 후-커피를 마 셨나요? Snap 애플리케이션이 (가상 또는 호스트) 파일 시스템에서 데이터를 쓸 수있는 위치에 대한 문서는 아직 없습니다. 스냅에 대한 기본 명백한 세부 사항을 이해하려고 시도해도 큰 영감을 얻지 못합니다.
Dan Nissenbaum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.