Ubuntu enstantane verileri nerede yazabilir?


30

Ubuntu'da enstantane olarak paketlenmiş uygulamalar /snap/$SNAPPNAMEkonum altına kurulur (monte edilir) . Altındaki her şey /snapsalt okunur bir dosya sistemi olarak monte edilir, bu nedenle uygulamalar o alana, ne diğer uygulamaların dizinlerinde ve kendi başlarına yazamazlar.

Anlık bir kullanıcının ana dizini okumak / yazmak için belirleyebilecek bir home arabirim olsa da, güvenlik nedeniyle ayrılmıştır ve kullanıcı tarafından elle bağlanması (etkin) gerekir.

Öyleyse, bir çırpıda içindeki bir uygulama config, verilerini ve diğer dosyalarını nerede yazabilir? Özel yazılabilir yerlere erişmek için API'ler var mı?

Yanıtlar:


41

Sizi dokümantasyona yönlendirmekte sorun yaşıyorum, bu da kahvemi henüz almadım (doğru) veya bazı dokümantasyonu kaçırıyoruz ( güncelleme : burada bazı dokümantasyon )

Uygulamanızın içindeki uygulamaları bildirdiğinizde , paketiniz ve uygulama adınızdan sonra adlandırılan snapcraft.yamlve yüklendikten /snap/bin/sonra yerleştirilen ve yerleştirildikten sonra bir ikili sarmalayıcı ortaya çıkar (sonuç, uygulama bir hizmet ise, bu paketleyicinin bir sistem. Hizmet dosyası olduğunu unutmayın).

Bu sarıcı, uygulamanın çalışacağı ortamın çoğunu içerir. Bu soruyla en alakalı iki ortam değişkeni SNAP_DATAve SNAP_USER_DATA.

  • SNAP_DATAsistem genelinde yazılabilir bir alandır (in /var/snap/). Bu, örneğin hizmetler için günlükleri barındırmak için kullanılabilir.

  • SNAP_USER_DATA(özellikle /home/<user>/snap/) uygulamayı çalıştıran kullanıcının giriş dizinindeki kullanıcıya özgü bir yazılabilir alandır . Bu, kullanıcıya özel yapılandırma dosyaları vb. İçin kullanılabilir.

Bunların her ikisi de, çünkü bu dizinlerin Hem yükseltme / geri alma işlevselliği için çok önemli sürüm . Başka bir deyişle, belirli bir ekin her sürümünün bu dizinlerin kendi kopyası vardır. Bir örnekle açıklayayım.

Diyelim ki "foo" ekinin 1. sürümünü yükleyin. Bu iki dizin yaratacaktır:

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

Şimdi "foo" nun ikisini de kullandığını söyleyin. Belki bir veritabanını barındıran bir servisi SNAP_DATAve config dosyalarını kullanan bir ikiliyi vardır SNAP_USER_DATA.

Şimdi "foo" nin 2. sürümü yayınlandı ve otomatik olarak güncelleniyor. Olan ilk şey /var/snap/foo/1, kopyalanacak /var/snap/foo/2ve /home/<user>/snap/foo/1kopyalanacak /home/<user>/snap/foo/2. Sonra yeni sürüm ateşlenir. Eski veriler üzerinde çalıştığını fark etmeli ve belki de veritabanında çalıştırılacak bazı veritabanı taşıma işlemlerine sahip SNAP_DATA. Bunu yapar ve uzaklara gider.

Şimdi, bu göçlerin ne nedenle olursa olsun başarısız olduğunu ve bu uygulamanın geri alınması gerektiğini söyleyin. Bu / geçmeli / foo uygulamasının, eski bir sürümünü kullanıyor başlar SNAP_DATAişaret edildi /var/snap/foo/1ve SNAP_USER_DATAişaret edildi /home/<user>/snap/foo/1. Bu işlem, geçişlerin çalıştırılmasından önceki noktada eski sürümden bir şeyler alır, çünkü bu işlemler verilerin bir kopyası üzerinde gerçekleştirilir.

Kısa Uzun hikaye: kullanmayan homeveri depolamak sen saklamak olabilir arayüzü SNAP_DATAya SNAP_USER_DATAda yükseltme / geri alma stratejisinin ayrılmaz bir parçası olduğuna göre,. Onlardan yararlanın!

V2.0.10 için GÜNCELLEME:

İki yeni veri dizini de tanıtıldı:

  • SNAP_COMMONyanına oturur SNAP_DATA, ancak özellikle terstir . Özel ekin her revizyonu bu dizine erişebilir, bu nedenle yükseltme / geri alma vb. İşlemlerde kopyalanmaz. Bu, özellikle büyük, çevrilmemiş dosyalar için (örneğin, gerçekten sürüme özgü olmayan ham veriler) kullanılabilir.

  • SNAP_USER_COMMONyanına oturur SNAP_USER_DATA, ancak yine spesifik olarak ele alınmaz . Kullanıcı başına sürüme özgü olmayan verileri depolamak için kullanılabilir.

V2.15 için GÜNCELLEME:

/snap/binİçine yerleştirilen dosyalar artık çevreyi tanımlayan sarmalayıcılar değil, aynı zamanda işaretler /usr/bin/snap. Dolayısıyla, bir uygulamanın çalıştığı ortamı belirleme yöntemi snap run --shell <snap>.<app>örneğin;

$ 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
Is not SNAP_USER_COMMONdir snapd tarafından otomatik oluşturulan? İçindeki başlatıcı betiği /snap/bin/onu oluşturmaz ve bunu çırpıda içinde el ile oluşturmak başarısız olur (izin reddedildi). Çalıştırmak snap run appbu klasörü yaratıyor, ancak (ancak komut başarısız oluyor execv failed: No such file or directory... Bu komutu nasıl kullanacağımı bilmiyorum).

1
Evet, öyle olmalı, ama değil ( snap runkullanılmakta olan sürümde düzeltilen bir hata ).
Kyle,

1
Snap-run'ın v2.15'ten itibaren kullanıldığını unutmayın.
Kyle,

2
Dokümanın güncellendiğini görün, burada ref sayfası snapcraft.io/docs/reference/env
user.dz

2
İki yıl sonra - kahve aldın mı? Snap uygulamalarının (sanal veya ana bilgisayar) dosya sisteminde verileri nerede yazabileceği hakkında hala hiçbir belge yok. Bu enstantane hakkında temel bariz detayları anlamaya çalışırken bana büyük bir ilham kaynağı değil.
Dan Nissenbaum,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.