Score:8

Can I remove the older revision package of duplicated snap packages?

ธง cn

While examining the snap packages that are installed in a system, I noticed that some packages have a duplicate, one having an over revision number while the other having a newer revision number. For such duplicated packages, my questions are:

  1. Why are they duplicated?
  2. Can I remove the older package to ensure better disk space management?
  3. How do I remove the older package?

Below are examples of packages that do and do not have duplicates:

$ du -hcs /var/lib/snapd/snaps/*
31M /var/lib/snapd/snaps/2048x_3.snap
286M    /var/lib/snapd/snaps/atom_282.snap
4.0K    /var/lib/snapd/snaps/bare_5.snap
72M /var/lib/snapd/snaps/bitwarden_58.snap
72M /var/lib/snapd/snaps/bitwarden_59.snap
196M    /var/lib/snapd/snaps/blender_1113.snap
214M    /var/lib/snapd/snaps/blender_1237.snap
9.1M    /var/lib/snapd/snaps/canonical-livepatch_119.snap
9.1M    /var/lib/snapd/snaps/canonical-livepatch_126.snap
148M    /var/lib/snapd/snaps/chromium_1854.snap
148M    /var/lib/snapd/snaps/chromium_1864.snap
17M /var/lib/snapd/snaps/chromium-ffmpeg_23.snap
18M /var/lib/snapd/snaps/chromium-ffmpeg_24.snap
....

~$ ls -lh /var/lib/snapd/snaps/
total 12G
-rw------- 2 root root  31M Aug  5 06:23 2048x_3.snap
-rw------- 2 root root 286M Aug  5 08:35 atom_282.snap
-rw------- 2 root root 4.0K Sep 22 18:17 bare_5.snap
-rw------- 1 root root  72M Oct 30 00:20 bitwarden_58.snap
-rw------- 1 root root  72M Dec  9 04:28 bitwarden_59.snap
-rw------- 1 root root 196M Nov 18 04:06 blender_1113.snap
-rw------- 1 root root 214M Dec  4 09:39 blender_1237.snap
-rw------- 2 root root 9.1M Nov 17 21:06 canonical-livepatch_119.snap
-rw------- 2 root root 9.1M Nov 22 22:39 canonical-livepatch_126.snap
-rw------- 1 root root 148M Dec 16 04:28 chromium_1854.snap
-rw------- 1 root root 148M Jan  8 08:33 chromium_1864.snap
-rw------- 1 root root  17M Sep  3 06:29 chromium-ffmpeg_23.snap
-rw------- 2 root root  18M Nov 29 14:23 chromium-ffmpeg_24.snap
....

On the system that I am looking at, the total disk space utilized by /var/lib/snapd/snaps/* is 12,180.248 MB. The disk space of all the duplicated packages(i.e. older revision of the same package) is 4,163.1 MB. In short, the older revision packages currently takes up 34.18% of the 12,180.248 MB. This appears to be a cost to using SNAP apps that I had not realised before.

cocomac avatar
cn flag
สมมติว่าคุณไม่คิดจะเสี่ยง...ทำไมไม่สำรองข้อมูลของโฟลเดอร์ `/var/.../snaps/` ไว้ในที่ที่ปลอดภัย ลบเวอร์ชันเก่าออก รีบูต และดูว่าใช้งานได้หรือไม่ คุณสามารถคืนค่าข้อมูลสำรองได้ตลอดเวลา จากนั้นคุณสามารถตอบคำถามของคุณเองได้
Someone avatar
my flag
BTW หากคุณมีพื้นที่เหลือน้อย ให้ลองติดตั้งซอฟต์แวร์เหล่านี้ในเวอร์ชัน `apt` เบากว่าและดีกว่าในทุกสิ่ง
Sun Bear avatar
cn flag
@cocomac ฉันหวังว่าฉันจะไม่ต้องทดลองเพื่อเรียนรู้คำตอบสำหรับคำถามของฉันเนื่องจากแพ็คเกจ SNAP นั้นใช้งานได้จริงมาระยะหนึ่งแล้ว ควรมี SOP หรือความรู้มาตรฐานในเรื่องนี้อยู่แล้ว
guiverc avatar
cn flag
Snaps กำลังเปลี่ยนแปลงอีกครั้ง (เช่น https://ubuntu.com//blog/the-future-of-snapcraft) ซึ่งอาจเป็นสิ่งที่ @Someone กำลังคิด/พูดถึง... กฎที่ใช้กับ snap เดียว อาจ * *ไม่** นำไปใช้กับผู้อื่นที่สร้างขึ้นภายใต้สภาพแวดล้อมที่แตกต่างกัน (core16, core18, core20 และเร็วๆ นี้ core22) ดังนั้นจึงไม่ใช่ชุดกฎ *ชุดเดียว* แม้ว่าจะมีกฎมากมายที่ใช้กับทุกคน
Sun Bear avatar
cn flag
@ มีคน `snap รีเฟรช` ไม่ได้ลบแพ็คเกจที่ซ้ำกัน
Sun Bear avatar
cn flag
@ มีคนพบว่าแพ็คเกจ Snap นั้นทันสมัยกว่าแพ็คเกจ apt อย่างไรก็ตาม พวกมันอาจใช้งานลำบากกว่าในบางครั้ง คุณสมบัติบางอย่างต้องการคำสั่งพิเศษเพื่อเปิดใช้งาน แต่ฉันได้ยินมาว่าพวกมันเบากว่าที่จะใช้ ขอบคุณสำหรับข้อมูลที่เป็นประโยชน์มากมายของคุณ :)
Sun Bear avatar
cn flag
@ คนที่ฉันได้รวมการเรียนรู้ของฉันจากอินพุตโดยคุณ matigo และ user535733 เพื่อสร้าง [remove_disabled_snap_pkgs.py](https://askubuntu.com/a/1386544/541417) สคริปต์หลามนี้เพื่อทำงาน
Someone avatar
my flag
@ซันแบร์ งานดีมาก! ฉันชอบใช้สคริปต์สำหรับทุกสิ่ง ฉันได้โคลนพื้นที่เก็บข้อมูลของคุณแล้ว แต่ยังไม่ได้ทดสอบ หวังว่าคงจะใช้ได้นะครับ :D
Sun Bear avatar
cn flag
@บางคนขอบคุณ โปรดแจ้งให้เราทราบหากจำเป็นต้องปรับปรุง/แก้ไข มันทำงานในตอนท้ายของฉัน :)
Sun Bear avatar
cn flag
@ คนที่ฉันได้เพิ่มความคิดเห็นเพิ่มเติมในสคริปต์
Score:11
ธง in

เพื่อตอบคำถามของคุณ:

ทำไมพวกเขาถึงซ้ำกัน?

⢠เป็นการแก้ไข (เวอร์ชัน) ที่แตกต่างกัน ไม่ใช่การทำซ้ำ

ฉันสามารถลบแพ็คเกจที่เก่ากว่าเพื่อให้แน่ใจว่ามีการจัดการพื้นที่ดิสก์ที่ดีขึ้นได้หรือไม่?

ใช่ มันคือ ของคุณ คอมพิวเตอร์หลังจากทั้งหมด

ฉันจะลบแพ็คเกจที่เก่ากว่าได้อย่างไร

คุณสามารถทำได้ใน Terminal ดังนี้:

สแนปลบ {snap} --revision={revision}

คุณยังสามารถบอกระบบได้ว่าจะจำกัดเวอร์ชันที่ผ่านมากี่เวอร์ชันดังนี้:

sudo snap set system refresh.retain=2

บันทึก: ค่าต้องอยู่ระหว่าง 2 และ 20, และเลขไลค์ 2 หรือ 3 แนะนำให้ใช้โดยทั่วไปเพื่อประหยัดพื้นที่จัดเก็บและอนุญาตให้ย้อนกลับในกรณีที่มีการอัปเดตที่ไม่ถูกต้อง

หากคุณต้องการแสดงรายการสแนปทั้งหมด และเวอร์ชันของพวกเขาคุณสามารถเรียกใช้คำสั่งนี้:

รายการ snap -- ทั้งหมด

ซึ่งจะให้สิ่งที่ต้องการ:

ชื่อ เวอร์ชัน การติดตาม Rev หมายเหตุผู้เผยแพร่
เปล่า 1.0 5 ล่าสุด/ฐานมาตรฐานที่เสถียร
canonical-livepatch 10.0.1 119 ล่าสุด/เสถียร canonicalâ ปิดใช้งาน
canonical-livepatch 10.1.2 126 ล่าสุด/เสถียร canonicalâ -
core 16-2.52 11798 ล่าสุด/เสถียร canonicalâ core,disabled
แกนหลัก 16-2.52.1 11993 ล่าสุด/เสถียร แกนมาตรฐานตามรูปแบบบัญญัติ
core18 20211028 2253 ฐานมาตรฐานล่าสุด/เสถียร
core18 20211015 2246 ฐานบัญญัติล่าสุด/เสถียร ปิดใช้งาน
core20 20211115 1242 ฐานบัญญัติล่าสุด/เสถียร ปิดใช้งาน
core20 20211129 1270 ฐานมาตรฐานล่าสุด/เสถียร
gnome-3-28-1804 3.28.0-19-g98f9e67.98f9e67 145 ล่าสุด/เสถียร canonicalâ ปิดใช้งาน
gnome-3-28-1804 3.28.0-19-g98f9e67.98f9e67 161 ล่าสุด/เสถียรตามรูปแบบบัญญัติâ -
gnome-3-34-1804 0+git.3556cb3 77 ล่าสุด/เสถียร/⦠canonicalâ -
gnome-3-34-1804 0+git.3556cb3 72 ล่าสุด/เสถียร/⦠canonicalâ ปิดใช้งาน
gnome-3-38-2004 0+git.cd626d1 87 ล่าสุด/เสถียร ตามรูปแบบบัญญัติâ -
gnome-3-38-2004 0+git.6ba6040 76 canonicalâ ล่าสุด/เสถียร ปิดใช้งาน
gtk-common-themes 0.1-52-gb92ac40 1515 ล่าสุด/เสถียร/⦠canonicalâ ปิดใช้งาน
gtk-common-themes 0.1-59-g7bca6ae 1519 ล่าสุด/เสถียร/⦠canonicalâ -
snap-store 3.38.0-66-gbd5b8f7 558 ล่าสุด/เสถียร/⦠canonicalâ -
snap-store 3.38.0-64-g23c4c77 547 ล่าสุด/เสถียร/⦠canonicalâ ปิดใช้งาน
snapd 2.53.2 14066 ล่าสุด/เสถียร canonicalâ snapd ปิดใช้งาน
snapd 2.53.4 14295 ล่าสุด/เสถียร canonicalâ snapd

ต้องการสคริปต์หรือไม่

สิ่งสำคัญ: คุณจะต้องตรวจสอบผลลัพธ์ของ รายการ snap -- ทั้งหมด ในคอมพิวเตอร์ของคุณก่อนดำเนินการต่อ และต่อไปนี้เป็นสคริปต์ที่ไม่ควรคัดลอก/วางโดยไม่ตรวจสอบความถูกต้องหากคุณใช้ภาษาที่ ไม่ใช่ เอ็น_US.UTF-8.

สคริปต์:

#!/bin/bash
# สคริปต์นี้จะลบการแก้ไข snap ที่ปิดใช้งาน
ตั้ง -eu

LANG=C รายการสแน็ป --ทั้งหมด | awk '/disabled/{พิมพ์ $1, $3}' |
    ในขณะที่อ่านชื่อ rev; ทำ
        snap ลบ "$name" --revision="$rev"
    เสร็จแล้ว

สิ่งนี้จะทำงาน รายการ snap -ทั้งหมด และแยกบรรทัดที่มีคำนั้นออก พิการ. ซึ่งจะแตกต่างกันไปตามสถานที่ของคุณ ดังนั้นให้ตรวจสอบผลลัพธ์ของฟังก์ชัน แรกแล้วอัปเดต awk '/ปิดการใช้งาน/ จะเข้ามาแทนที่ พิการ ด้วยป้ายกำกับที่พบในผลลัพธ์ของคุณ

บันทึกสคริปต์ลงในไฟล์ (เช่น สครับ-snaps.sh) จากนั้นตั้งค่าเป็นปฏิบัติการ:

sudo chmod +x สครับ-snaps.sh

ตอนนี้คุณสามารถเรียกใช้ได้โดยจดจำการใช้งาน ซูโด:

sudo ./scrub-snaps.sh

บันทึก: ซูโด ไม่ได้เป็นส่วนหนึ่งของสคริปต์ แต่สามารถเพิ่มได้หากต้องการให้อยู่ในนั้น ไม่ว่าจะด้วยวิธีใด คุณจะต้องป้อนรหัสผ่านหากจำเป็น

Sun Bear avatar
cn flag
คุณมีคำสั่งให้ลบการแก้ไขที่เก่ากว่าของแพ็คเกจ Snap ที่ติดตั้งทั้งหมดหรือไม่ การลบทีละรายการเป็นเรื่องที่เจ็บปวดจริงๆ
Sun Bear avatar
cn flag
ขอบคุณ. ฉันได้แชร์คำตอบด้วย [ที่นี่](https://askubuntu.com/a/1386544/541417) เพื่ออำนวยความสะดวกในการตรวจสอบแพ็คเกจ Snap ก่อนดำเนินการลบแพ็คเกจ Snap ที่ปิดใช้งาน
vn flag
คุณสามารถสร้างนามแฝงเป็น [ออนไลน์นี้] (https://askubuntu.com/a/1141683/349837) เพื่อดำเนินการนี้
Score:7
ธง cn

การเก็บ snap เวอร์ชันเก่าอย่างน้อยหนึ่งเวอร์ชันนั้นมีอยู่ในการออกแบบ

เดิมทีแพ็คเกจ Snap ได้รับการออกแบบมาสำหรับสภาพแวดล้อมที่หลากหลายซึ่งมักไม่มีผู้ดูแลระบบที่เป็นมนุษย์และ/หรือไม่มีวิธีใดที่จะแนบแป้นพิมพ์และจอภาพ...เช่น โทรศัพท์หรืออุปกรณ์ IOT ความยืดหยุ่นเป็นข้อกำหนดที่สำคัญสำหรับระบบเหล่านี้: หากแอปพลิเคชันขัดข้องหรือการอัปเกรดเสียหาย จำเป็นต้องมีการรับประกันการย้อนกลับบางรูปแบบโดยไม่ต้องมีการแทรกแซงของมนุษย์ ดังนั้นข้อกำหนดสำหรับเวอร์ชันเก่าอย่างน้อยหนึ่งเวอร์ชันในมือ

ผู้คนบนเดสก์ท็อปและเซิร์ฟเวอร์แบบคลาสสิกไม่สนใจความสามารถในการย้อนกลับนั้นมากนัก พวกเขาชอบองค์ประกอบการออกแบบสแน็ปที่แตกต่างกัน: การอัปเกรดอัตโนมัติที่ปลอดภัยซึ่งไม่ขึ้นกับระบบปฏิบัติการ การป้องกันการงัดแงะของสควอชแบบอ่านอย่างเดียว การจำกัดกระบวนการ ฯลฯ

แต่ทั้งหมดนี้เป็นมาตรฐานเดียว คุณจึงได้รับความสามารถในการย้อนกลับด้วยเช่นกัน แม้จะคิดว่าจะไม่ใช้ก็ตาม

คุณไม่สามารถ "ปิดใช้งาน" ความสามารถในการย้อนกลับของ snaps ได้ - มันไม่ใช่ "คุณสมบัติ" แต่เป็นองค์ประกอบการออกแบบที่สำคัญ

Sun Bear avatar
cn flag
ขอบคุณที่อธิบาย ในระบบที่ฉันตรวจสอบ ฉันค้นพบว่าค่าใช้จ่ายของคุณสมบัติสำรองขั้นต่ำของ Snap คืออย่างน้อย 34% ของพื้นที่ดิสก์ทั้งหมดของแพ็คเกจ Snap ทั้งหมด
Sun Bear avatar
cn flag
แม้จะมีความตั้งใจในการออกแบบเพื่อความซ้ำซ้อน แต่ทีมพัฒนาของ Snap ยังมีคำสั่งให้ลบการแก้ไขที่เก่ากว่าของแพ็คเกจ snap ทั้งหมดหรือไม่ ความสามารถนี้มีไว้เพื่อให้บริการผู้คนบนเดสก์ท็อปและเซิร์ฟเวอร์แบบคลาสสิกที่ไม่สนใจความสามารถในการย้อนกลับนั้นมากนัก
user535733 avatar
cn flag
แน่นอน คำตอบจาก @matigo อธิบายว่า *อย่างไร* คำตอบนี้เติมเต็มด้วยการอธิบายว่า *ทำไม*
Score:2
ธง cn

จากคำตอบ @matigo ฉันเขียน สคริปต์หลาม เพื่อทำการลบแพ็คเกจ SNAP ที่ปิดใช้งานโดยอัตโนมัติ ช่วยให้ผู้ใช้สามารถตรวจสอบแพ็คเกจ snap ก่อนดำเนินการ (หรือไม่) กระบวนการลบ ตัวอย่างของสิ่งที่สคริปต์เรียกใช้งานแสดงในลิงก์

remove_disabled_snap_pkgs.py

#!/bin/python3
''' สคริปต์ไพ ธ อนนี้จะทำการลบแพ็คเกจ SNAP ที่ปิดใช้งานโดยอัตโนมัติใน
ระบบ การทำเช่นนี้จะช่วยเพิ่มพื้นที่ว่างในดิสก์ของระบบ ผลลัพธ์ที่ได้นี้
สำคัญในสถานการณ์ที่แพ็คเกจ SNAP ที่ปิดใช้งานจำนวนมากยังคงอยู่
ระบบ.
'''
จากการเรียกใช้การนำเข้ากระบวนการย่อย PIPE, CalledProcessError
จากเส้นทางนำเข้า pathlib
นำเข้าระบบ

#สมมติฐาน
SNAP_PKGS_PATH = เส้นทาง('/var/lib/snapd/snaps/')
# นอกจากนี้ อย่างน้อยไดเร็กทอรีนี้มีไฟล์ xxx.snap อย่างน้อยหนึ่งไฟล์อยู่ที่นั่น 


def snap_list():
    '''ฟังก์ชั่นเพื่อดำเนินการ bash 'snap list' cmd และส่งคืน Python
    พจนานุกรมข้อมูลของ ACTIVE SNAPCRAFT pkgs ในระบบ

    pkgs_dict = {ชื่อ : {'เวอร์ชัน':'xxx', 'รายได้':'xxx', 'การติดตาม':'xxx',
                         'ผู้เผยแพร่':'xxx', 'หมายเหตุ':'xxx'}
                }
    '''
    พยายาม:
        cmd = ['snap', 'รายการ']
        เสร็จสิ้น = เรียกใช้ (cmd, ตรวจสอบ = True, stdout = PIPE)
    ยกเว้น CalledProcessError เป็นข้อผิดพลาด:
        พิมพ์ ('ข้อผิดพลาด:', ข้อผิดพลาด)
    อื่น:
        ส่วนหัว = Complete.stdout.decode('utf-8').splitlines()[0].split()
        pkgs=[line.split() สำหรับบรรทัดใน
              Complete.stdout.decode('utf-8').splitlines()[1:]]
        pkgs_dict = {}
        สำหรับ pkg ใน pkgs:
            pkgs_dict[pkg[0]] = {i:pkg[n+1] for n, i in enumerate(headers[1:])}
        ส่งคืน pkgs_dict


# 1 รับ pkgs SNAPCRAFT ทั้งหมดในระบบ
all_path = เรียงลำดับ (SNAP_PKGS_PATH.glob ('*.snap'))
all_size = ผลรวม ([p.stat().st_size สำหรับ p ใน all_path])

# 2 รับ SNAPCRAFT pkgs ที่ใช้งานอยู่ในระบบ
active_snap_pkgs = snap_list()
active_path = [SNAP_PKGS_PATH / เส้นทาง(k+'_'+v['Rev']+'.snap')
               สำหรับ k, v ใน active_snap_pkgs.items()]
active_size = ผลรวม ([p.stat().st_size สำหรับ p ใน active_path])

# 3 แสดงข้อมูลและคำแนะนำในเทอร์มินัล
พิมพ์ (f'ALL (ใช้งานอยู่ & ปิดใช้งาน) แพ็คเกจ SNAP ในระบบ:')
สำหรับ n ฉันในการแจกแจง (all_path):
    ขนาด = i.stat().st_size
    ถ้าฉันอยู่ใน active_path:
        พิมพ์ (f'Active\t{size:>12}\t{i}')
    อื่น:
        พิมพ์(f' \t{ขนาด:>12}\t{i}')

# 4 แสดงสถิติขนาดรวมของแพ็คเกจ SNAPCRAFT ทั้งหมดที่ใช้งานอยู่และปิดใช้งาน 
ความกว้าง = 12
disabled_size = all_size - active_size
พิมพ์('\nขนาดของแพ็คเกจ SNAP:')
พิมพ์(f'1. ทั้งหมด : {all_size:>{width}} ไบต์')
พิมพ์(f'2. ใช้งาน : {active_size:>{width}} ไบต์')
พิมพ์(f'2. ปิดใช้งาน : {disabled_size:>{width}} ไบต์ หรือ '
      f'{(disabled_size/all_size):.2%} จากทั้งหมด')

# 5 ตัดสินใจลบหรือไม่ลบแพ็คเกจ SNAPCRAFT ที่ปิดใช้งาน 
หากปิดใช้งาน_ขนาด > 0:
    พิมพ์ (f'\nลบแพ็คเกจ SNAP ที่ปิดใช้งานทั้งหมดหรือไม่ [y/n]')
    ในขณะที่ทรู:
        การตัดสินใจ = การป้อนข้อมูล ()
        ถ้าการตัดสินใจใน ['y', 'Y', 'yes', 'Yes', 'YES']:
            พิมพ์('กำลังดำเนินการลบ...โปรดรอสักครู่')
            สำหรับ p ใน all_path:
                ถ้า p ไม่อยู่ใน active_path:
                    สเต็ม = p.stem
                    bar_index = stem.index('_')
                    ชื่อ = ต้นกำเนิด [:bar_index]
                    การแก้ไข = ต้นกำเนิด [bar_index+1:]
                    cmd = ['sudo', 'snap', 'remove', ชื่อ,
                           '--revision='+revision]
                    พิมพ์ (f"\n{' '.join(cmd)}")
                    เรียกใช้ (cmd, stdout=sys.stdout, stderr=sys.stderr,
                        การเข้ารหัส='utf8')
            พิมพ์ (f'\nลบแพ็คเกจ SNAP ที่ปิดใช้งานทั้งหมดหรือไม่ เสร็จสมบูรณ์')
            หยุดพัก
        การตัดสินใจ elif ใน ['n', 'N', 'no', 'No', 'NO']:
            พิมพ์(f'\nไม่มีการลบใดๆ')
            หยุดพัก
        อื่น:
            print('กรุณาใส่เฉพาะ "y" หรือ "n" เท่านั้น:')
อื่น:
    พิมพ์(f'\nไม่จำเป็นต้องลบ')

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา