Ubuntu สามารถเขียนข้อมูลได้ที่ไหน


30

แอปพลิเคชั่นที่บรรจุในรูปถ่ายใน Ubuntu นั้นได้รับการติดตั้ง (ติดตั้ง) ภายใต้/snap/$SNAPPNAMEตำแหน่ง ทุกอย่างที่อยู่ภายใต้/snapถูกเมาท์เป็นระบบไฟล์แบบอ่านอย่างเดียวดังนั้นแอปพลิเคชันไม่สามารถเขียนลงในพื้นที่นั้นได้ไม่ว่าจะอยู่ในไดเรกทอรีของแอปอื่นหรือในตัวของมันเอง

ในขณะที่มีhome อินเตอร์เฟสที่ snaps สามารถระบุให้อ่าน / เขียนโฮมไดเร็กตอรี่ของผู้ใช้, มันถูกสงวนไว้สำหรับเหตุผลด้านความปลอดภัยและจำเป็นต้องเชื่อมต่อด้วยตนเอง (เปิดใช้งาน) โดยผู้ใช้

ดังนั้นแอปพลิเคชั่นภายใน snap สามารถเขียน config, data และไฟล์อื่น ๆ ได้ที่ไหน? มี API เพื่อเข้าถึงตำแหน่งที่เขียนได้พิเศษหรือไม่

คำตอบ:


41

ฉันมีปัญหาในการอ้างถึงเอกสารซึ่งหมายความว่าฉันยังไม่มีกาแฟ (จริง) หรือเราไม่มีเอกสาร ( อัปเดต : เอกสารบางอย่างที่นี่ )

เมื่อคุณประกาศแอปในของคุณsnapcraft.yamlมันจะส่งผลให้เกิด wrapper แบบไบนารีที่สร้างขึ้นเมื่อติดตั้งและ/snap/bin/ตั้งชื่อตามแพ็คเกจและชื่อแอปของคุณ (โปรดทราบว่าหากแอปเป็นบริการแล้ว wrapper นี้จะเป็นไฟล์ systemd .service

wrapper นั้นมีสภาพแวดล้อมส่วนใหญ่ที่แอพพลิเคชั่นจะทำงาน ทั้งสองตัวแปรสภาพแวดล้อมที่มีความเกี่ยวข้องมากที่สุดกับคำถามนี้และSNAP_DATASNAP_USER_DATA

  • SNAP_DATAเป็นพื้นที่ที่สามารถเขียนได้ทั้งระบบ (ใน/var/snap/) สิ่งนี้อาจถูกใช้เพื่อโฮสต์บันทึกสำหรับบริการตัวอย่างเช่น

  • SNAP_USER_DATAเป็นพื้นที่ที่ผู้ใช้สามารถเขียนได้เฉพาะในโฮมไดเร็กทอรีของผู้ใช้ที่เรียกใช้แอปพลิเคชัน (โดยเฉพาะ/home/<user>/snap/) อาจใช้สำหรับไฟล์การกำหนดค่าเฉพาะผู้ใช้เป็นต้น

ทั้งของไดเรกทอรีเหล่านี้เป็นสิ่งที่สำคัญมากในการอัพเกรด / ย้อนกลับเพราะทั้งสองของพวกเขาจะversioned นั่นคือแต่ละเวอร์ชันของ 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มันควรจะสังเกตเห็นว่ามันทำงานกับข้อมูลเก่าและบางทีมันอาจจะมีการโยกย้ายฐานข้อมูลบางอย่างที่จะทำงานกับฐานข้อมูลใน มันทำอย่างนั้นและไปมันไป

ตอนนี้พูดว่าการโยกย้ายเหล่านั้นล้มเหลวด้วยเหตุผลใดก็ตามและแอปพลิเคชันนี้จะต้องย้อนกลับ มันเริ่มต้นใช้รุ่นเก่า / สแน็ป application / 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แต่เฉพาะunversioned การแก้ไข snap เฉพาะทุกครั้งจะสามารถเข้าถึงไดเรกทอรีนี้ได้ดังนั้นจึงไม่ถูกคัดลอกเมื่ออัปเกรด / ย้อนกลับเป็นต้นซึ่งอาจใช้สำหรับไฟล์ขนาดใหญ่ที่ไม่มีการเปลี่ยนแปลง (เช่นข้อมูลดิบที่ไม่ใช่รุ่นเฉพาะ)

  • SNAP_USER_COMMONนั่งอยู่ข้างSNAP_USER_DATAแต่เป็นอีกครั้งโดยเฉพาะunversioned มันอาจจะใช้สำหรับการจัดเก็บข้อมูลที่ไม่เฉพาะรุ่นต่อผู้ใช้

อัปเดตสำหรับ v2.15:

ไฟล์ที่อยู่ภายใน/snap/binเป็นห่อไม่ที่กำหนดสภาพแวดล้อม แต่ symlinks /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_COMMONสร้าง dir โดยอัตโนมัติด้วย snapd? สคริปต์ตัวเรียกใช้งาน/snap/bin/ไม่ได้สร้างขึ้นและการสร้างด้วยตนเองภายในสแน็ปล้มเหลว (ปฏิเสธสิทธิ์) การเรียกใช้snap run appสร้างโฟลเดอร์นั้น (แต่คำสั่งล้มเหลวด้วยexecv failed: No such file or directory... ฉันไม่รู้ว่าจะใช้คำสั่งนั้นอย่างไร)

1
ใช่มันควรจะเป็น แต่ไม่ใช่ (ข้อผิดพลาดที่ได้รับการแก้ไขในรุ่นที่snap runกำลังจะมีการใช้งาน)
Kyle

1
โปรดทราบว่าการใช้ snap รันตั้งแต่วันที่ v2.15
Kyle

2
ดูเอกสารอัปเดตที่นี่หน้าอ้างอิงsnapcraft.io/docs/reference/env
user.dz

2
สองปีต่อมา - คุณทานกาแฟหรือยัง ยังคงไม่มีเอกสารเกี่ยวกับตำแหน่งที่แอปพลิเคชัน Snap สามารถเขียนข้อมูลในระบบไฟล์ (เสมือนหรือโฮสต์) นั่นไม่ได้ให้แรงบันดาลใจแก่ฉันเลยในขณะที่ฉันพยายามทำความเข้าใจรายละเอียดพื้นฐานที่ชัดเจนเกี่ยวกับสแนป
Dan Nissenbaum
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.