Ubuntu에서 스냅으로 패키지 된 응용 프로그램은 해당 /snap/$SNAPPNAME
위치 아래에 설치 (장착)됩니다 . 아래의 모든 것은 /snap
읽기 전용 파일 시스템으로 마운트되므로 응용 프로그램은 다른 응용 프로그램의 디렉토리 나 자체의 공간에서 해당 공간에 쓸 수 없습니다.
스냅은 사용자의 홈 디렉토리를 읽고 쓰도록 지정할 수 있는 home
인터페이스 가 있지만 보안상의 이유로 예약되어 있으며 사용자가 수동으로 연결 (활성화)해야합니다.
그렇다면 스냅 내부의 앱은 구성, 데이터 및 기타 파일을 어디에 쓸 수 있습니까? 쓰기 가능한 특수 위치에 액세스하는 API가 있습니까?
답변
문서를 참조하는 데 문제가 있습니다. 아직 커피를 먹지 않았거나 (참) 문서가 누락되었습니다 ( 업데이트 : 여기에서 일부 문서 )
에서 앱을 선언하면 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/1
및 SNAP_USER_DATA
가리키는했다 /home/<user>/snap/foo/1
. 이 작업은 데이터 복사본에서 실행되었으므로 마이그레이션이 실행되기 전 시점에서 이전 버전의 항목을 선택합니다.
간단히 말해 : 업그레이드 / 롤백 전략의 중요한 부분이기 때문에 또는에 home
저장할 수있는 데이터를 저장 하기 위해 인터페이스를 사용하지 마십시오 . 그들을 활용하십시오!SNAP_DATA
SNAP_USER_DATA
v2.0.10 업데이트 :
두 개의 새로운 데이터 디렉토리도 도입되었습니다.
-
SNAP_COMMON
옆SNAP_DATA
에 앉아 있지만 구체적으로 버전이 없습니다 . 특정 스냅의 모든 개정판은이 디렉토리에 액세스 할 수 있으므로 업그레이드 / 롤백 등에 복사되지 않습니다. 특히 버전이 지정되지 않은 큰 파일 (예 : 실제 버전에 맞지 않는 원시 데이터)에 사용될 수 있습니다. -
SNAP_USER_COMMON
옆SNAP_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