Di mana Ubuntu dapat menulis data?

30

Aplikasi yang dikemas sebagai terkunci di Ubuntu diinstal (dipasang) di bawah /snap/$SNAPPNAMElokasi. Semua yang ada di bawah di /snap-mount sebagai sistem file read-only, sehingga aplikasi tidak dapat menulis ke ruang itu, baik di direktori aplikasi lain maupun di mereka sendiri.

Meskipun ada home antarmuka yang terkunci dapat menentukan untuk membaca / menulis direktori home pengguna, itu dicadangkan untuk alasan keamanan dan perlu dihubungkan secara manual (diaktifkan) oleh pengguna.

Jadi di mana aplikasi di dalam snap dapat menulis konfigurasi, data, dan file lainnya? Apakah ada API untuk mengakses lokasi yang dapat ditulisi khusus?

David Planella
sumber

Jawaban:

41

Saya mengalami kesulitan mengarahkan Anda ke dokumentasi, yang berarti saya belum minum kopi (benar) atau kami kehilangan beberapa dokumentasi ( pembaruan : beberapa dokumentasi di sini )

Ketika Anda mendeklarasikan aplikasi di Anda snapcraft.yaml, itu menghasilkan pembungkus biner yang dihasilkan setelah menginstal dan ditempatkan ke dalam /snap/bin/, dinamai setelah paket dan nama aplikasi Anda (perhatikan bahwa jika aplikasi adalah layanan, pembungkus ini bukan file systemd .service).

Wrapper itu berisi sebagian besar lingkungan tempat aplikasi akan berjalan. Dua variabel lingkungan yang paling relevan dengan pertanyaan ini adalah SNAP_DATAdan SNAP_USER_DATA.

  • SNAP_DATAadalah area yang dapat ditulisi di seluruh sistem /var/snap/. Ini dapat digunakan untuk meng-host log untuk layanan, misalnya.

  • SNAP_USER_DATAadalah area yang dapat ditulis khusus pengguna di direktori home pengguna yang menjalankan aplikasi (khusus /home/<user>/snap/). Ini dapat digunakan untuk file konfigurasi khusus pengguna, dll.

Kedua direktori ini sangat penting untuk fungsi upgrade / rollback, karena keduanya versi . Artinya, setiap versi snap yang diberikan memiliki salinannya sendiri dari direktori ini. Izinkan saya menjelaskan dengan sebuah contoh.

Katakanlah Anda menginstal versi 1 dari snap "foo". Itu akan membuat dua direktori:

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

Sekarang katakan "foo" menggunakan keduanya. Mungkin ia memiliki layanan yang meng-host database SNAP_DATA, dan biner yang menggunakan file config SNAP_USER_DATA.

Sekarang versi 2 dari "foo" dirilis, dan secara otomatis diperbarui. Hal pertama yang terjadi adalah yang /var/snap/foo/1disalin ke /var/snap/foo/2dan /home/<user>/snap/foo/1disalin ke /home/<user>/snap/foo/2. Kemudian versi baru dinyalakan. Seharusnya memperhatikan bahwa itu berjalan pada data lama, dan mungkin ia memiliki beberapa migrasi basis data untuk dijalankan ke basis data SNAP_DATA. Itu melakukan itu, dan pergi begitu saja.

Sekarang katakanlah migrasi tersebut gagal karena alasan apa pun, dan aplikasi ini harus dibatalkan. Itu mulai menggunakan versi lama dari aplikasi / snap / foo, di mana SNAP_DATAmenunjuk /var/snap/foo/1dan SNAP_USER_DATAmenunjuk ke /home/<user>/snap/foo/1. Ini mengambil hal-hal pada versi lama pada titik sebelum migrasi dijalankan, karena operasi itu dijalankan pada salinan data.

Singkat cerita: jangan gunakan homeantarmuka untuk menyimpan data yang dapat Anda simpan SNAP_DATAatau SNAP_USER_DATA, karena mereka merupakan bagian integral dari strategi upgrade / rollback. Manfaatkan mereka!

PEMBARUAN untuk v2.0.10:

Dua direktori data baru juga diperkenalkan:

  • SNAP_COMMONduduk di samping SNAP_DATA, tetapi secara khusus tidak berversi . Setiap revisi snap spesifik memiliki akses ke direktori ini, jadi itu tidak disalin pada saat upgrade / rollback dll. Ini dapat digunakan untuk file besar yang tidak berversi (misalnya data mentah yang tidak benar-benar versi-spesifik).

  • SNAP_USER_COMMONduduk di samping SNAP_USER_DATA, tetapi sekali lagi khusus tidak berversi . Ini dapat digunakan untuk menyimpan data non-versi-spesifik per pengguna.

PEMBARUAN untuk v2.15:

File yang ditempatkan di dalamnya /snap/binbukan lagi pembungkus yang menentukan lingkungan, tetapi symlinks ke /usr/bin/snap. Jadi cara untuk menentukan lingkungan tempat aplikasi berjalan akan digunakan snap run --shell <snap>.<app>, misalnya:

$ 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
Kyle
sumber
1
Bukankah SNAP_USER_COMMONdir dibuat secara otomatis oleh snapd? Skrip peluncur di /snap/bin/tidak membuatnya, dan membuatnya secara manual di dalam snap gagal (izin ditolak). Menjalankan snap run appmenciptakan folder itu, meskipun (tetapi perintah gagal dengan execv failed: No such file or directory... Saya tidak tahu bagaimana menggunakan perintah itu).
1
Ya, memang seharusnya begitu, tetapi itu tidak (bug yang diperbaiki pada rilis yang akan datang di mana snap rundigunakan).
Kyle
1
Perhatikan bahwa snap run digunakan pada v2.15.
Kyle
2
Tampaknya dokumen diperbarui, di sini halaman ref snapcraft.io/docs/reference/env
user.dz
2
Dua tahun kemudian - apakah Anda sudah minum kopi? Masih belum ada dokumentasi tentang di mana aplikasi Snap dapat menulis data dalam sistem file (virtual atau host). Itu tidak memberi saya inspirasi hebat ketika saya mencoba memahami detail dasar yang jelas tentang buncis.
Dan Nissenbaum