Puncte:8

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

drapel 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
drapel cn
Presupunând că nu te deranjează să-ți asumi un risc...de ce să nu faci o copie de rezervă a folderului `/var/.../snaps/` undeva în siguranță, eliminând versiunile vechi, repornind și văzând dacă funcționează? Îți poți restabili oricând backup-ul și apoi poți răspunde la întrebarea ta.
Someone avatar
drapel my
BTW, dacă rămâneți fără spațiu, luați în considerare instalarea versiunilor `apt` ale acestor software-uri. Sunt mai ușoare și mai bune în orice.
Sun Bear avatar
drapel cn
@cocomac Sper că nu trebuie să experimentez pentru a afla răspunsul la întrebările mele, deoarece pachetele SNAP sunt în practică de ceva timp. Ar trebui să existe ceva SOP sau cunoștințe standard până acum în această chestiune.
guiverc avatar
drapel cn
Snaps-urile se schimbă din nou (de ex. https://ubuntu.com//blog/the-future-of-snapcraft), ceea ce ar putea fi ceea ce se gândea/vorbește @Cineva... reguli care se aplică unui singur snap, poate * *nu** se aplică altora create într-un mediu diferit (core16, core18, core20 și în curând core22), deci nu este un *unic* set de reguli; deși, desigur, multe reguli se aplică tuturor.
Sun Bear avatar
drapel cn
@Cineva `snap refresh` nu a eliminat pachetele duplicate.
Sun Bear avatar
drapel cn
@Cineva am descoperit că pachetele Snap sunt de obicei mai actualizate decât pachetele apt. Cu toate acestea, acestea pot fi uneori mai dificil de utilizat. Unele funcții necesită comenzi suplimentare pentru a le activa. Dar am auzit că sunt mai ușor de folosit. Vă mulțumim pentru multele dumneavoastră contribuții utile. :)
Sun Bear avatar
drapel cn
@Cineva pe care mi-am încorporat învățarea din intrările dvs., matigo și user535733 pentru a crea acest script python [remove_disabled_snap_pkgs.py](https://askubuntu.com/a/1386544/541417) pentru a face treaba.
Someone avatar
drapel my
@SunBear Bună treabă! Îmi place să folosesc scripturi pentru orice. V-am clonat git depozitul, dar nu l-am testat încă. Sa speram ca va functiona :D
Sun Bear avatar
drapel cn
@ Cineva Mulțumesc. Anunțați-mă dacă sunt necesare îmbunătățiri/corecții. A funcționat la capătul meu. :)
Sun Bear avatar
drapel cn
@Cineva am adăugat mai multe comentarii la scenariu.
Puncte:11
drapel in

Pentru a răspunde la întrebările dvs.:

De ce sunt duplicate?

⢠Sunt revizuiri (versiuni) diferite, nu dubluri.

Pot elimina pachetul mai vechi pentru a asigura o gestionare mai bună a spațiului pe disc?

⢠Da. este ta computer, la urma urmei.

Cum elimin pachetul mai vechi?

Puteți face acest lucru în Terminal astfel:

snap remove {snap} --revision={reviziune}

De asemenea, puteți spune sistemului la câte versiuni anterioare să se limiteze astfel:

sudo snap set system refresh.retain=2

Notă: Valoarea trebuie să fie între 2 și 20, și un număr ca 2 sau 3 este, în general, recomandat pentru a economisi spațiu de stocare și pentru a permite o retragere în cazul unei actualizări proaste.

Dacă doriți să enumerați toate snaps-urile și versiunile lor, puteți rula această comandă:

lista rapidă --toate

Ceea ce vă va oferi ceva de genul:

Nume Versiune Rev Tracking Note editorului
bare 1.0 5 cea mai recentă/stabilă bază canonică
canonical-livepatch 10.0.1 119 cel mai recent/stabil canonicalâ dezactivat
canonical-livepatch 10.1.2 126 cel mai recent/stabil canonicalâ -
nucleu 16-2,52 11798 cel mai recent/stabil canonicâ nucleu, dezactivat
core 16-2.52.1 11993 cel mai recent/stabil canonicâ core
core18 20211028 2253 cea mai recentă/stabilă bază canonicăâ
core18 20211015 2246 cel mai recent/stabil bază canonicăâ, dezactivat
core20 20211115 1242 cel mai recent/stabil bază canonicăâ, dezactivat
core20 20211129 1270 cel mai recent/stabil bază canonicăâ
gnome-3-28-1804 3.28.0-19-g98f9e67.98f9e67 145 cel mai recent/stabil canonicalâ dezactivat
gnome-3-28-1804 3.28.0-19-g98f9e67.98f9e67 161 cel mai recent/stabil canonicalâ -
gnome-3-34-1804 0+git.3556cb3 77 latest/stable/⦠canonicalâ -
gnome-3-34-1804 0+git.3556cb3 72 latest/stable/⦠canonicalâ dezactivat
gnome-3-38-2004 0+git.cd626d1 87 cel mai recent/stabil canonicalâ -
gnome-3-38-2004 0+git.6ba6040 76 cel mai recent/stabil canonicalâ dezactivat
gtk-common-themes 0.1-52-gb92ac40 1515 latest/stable/⦠canonicalâ dezactivat
gtk-common-themes 0.1-59-g7bca6ae 1519 latest/stable/⦠canonicalâ -
snap-store 3.38.0-66-gbd5b8f7 558 latest/stable/⦠canonicalâ -
snap-store 3.38.0-64-g23c4c77 547 latest/stable/⦠canonicalâ dezactivat
snapd 2.53.2 14066 cel mai recent/stabil canonicalâ snapd,dezactivat
snapd 2.53.4 14295 cel mai recent/stabil canonicalâ snapd

Ai nevoie de un script?

IMPORTANT: Veți dori să verificați rezultatul lista rapidă --toate pe computer înainte de a continua, iar următorul este un script care nu ar trebui să fie copiat/lipit fără verificarea corectă dacă utilizați o locație care nu este ro_US.UTF-8.

Scenariul:

#!/bin/bash
# Acest script va elimina revizuirile snap dezactivate.
set -eu

LANG=C snap list --all | awk '/disabled/{print $1, $3}' |
    în timp ce citește numele rev; do
        snap remove "$name" --revision="$rev"
    Terminat

Aceasta va rula snap list -all și extrageți rândurile care conțin cuvântul dezactivat. Acest lucru va fi diferit în funcție de localitatea dvs., deci verificați rezultatul funcției primul, apoi actualizați awk '/dezactivat/ a inlocui dezactivat cu eticheta care se găsește în rezultatul dvs.

Salvați scriptul într-un fișier (de exemplu scrub-snaps.sh) și apoi setați-l ca fiind executabil:

sudo chmod +x scrub-snaps.sh

Acum îl puteți rula, amintindu-vă să îl utilizați sudo:

sudo ./scrub-snaps.sh

Notă: sudo nu a făcut parte din script, dar poate fi adăugat dacă preferați să îl aveți acolo. În orice caz, vi se va solicita o parolă dacă este necesar.

Sun Bear avatar
drapel cn
Aveți o comandă pentru a elimina toate versiunile mai vechi ale tuturor pachetelor Snap instalate? Ștergerea lor una câte una este într-adevăr o durere.
Sun Bear avatar
drapel cn
Mulțumiri. De asemenea, am distribuit un răspuns [aici](https://askubuntu.com/a/1386544/541417) pentru a facilita o verificare vizuală a pachetelor Snap înainte de a executa orice eliminare a pachetelor Snap dezactivate.
drapel vn
Puteți crea un alias pentru [acest onliner](https://askubuntu.com/a/1141683/349837) pentru a face acest lucru
Puncte:7
drapel cn

Păstrarea a cel puțin unei versiuni mai vechi a unui snap este inerentă designului.

Pachetele Snap au fost concepute inițial pentru o varietate de medii în care adesea nu există un administrator uman și/sau nicio modalitate de a atașa o tastatură și un monitor... cum ar fi telefoanele sau dispozitivele IOT. Reziliența este o cerință critică pentru aceste sisteme: dacă o aplicație se blochează sau o actualizare este coruptă, este nevoie de o formă de rollback garantat fără intervenție umană. De aici și cerința pentru cel puțin o versiune mai veche la îndemână.

Oamenilor de pe desktop-uri și servere clasice nu le pasă prea mult de această capacitate de rollback. Le plac diferitele elemente de design snap: upgrade-urile automate securizate care sunt independente de sistemul de operare, prevenirea falsificării squashfs numai în citire, limitarea procesului etc.

Dar totul este un singur standard, așa că obțineți și capacitatea de rollback. Chiar dacă crezi că nu o vei folosi.

Nu puteți „dezactiva” capacitatea de rollback a snaps-urilor – nu este cu adevărat o „funcție”, ci un element cheie de design.

Sun Bear avatar
drapel cn
Mulțumesc pentru explicație. În sistemul la care m-am uitat, am descoperit că costul caracteristicii de redundanță minimă a Snap este de cel puțin 34% din spațiul total pe disc al tuturor pachetelor Snap.
Sun Bear avatar
drapel cn
În ciuda intenției de proiectare pentru redundanță, echipa de dezvoltare Snap a oferit și o comandă pentru a elimina toate versiunile mai vechi ale tuturor pachetelor snap? Această capacitate este de a servi mai bine oamenilor de pe desktop-uri și servere clasice, cărora nu le pasă prea mult de această capacitate de rollback.
user535733 avatar
drapel cn
Sigur, răspunsul lui @matigo explică *cum*. Acest răspuns completează explicând *de ce*.
Puncte:2
drapel cn

Pe baza răspunsului @matigo, am scris un script python pentru a automatiza eliminarea pachetelor SNAP dezactivate. Permite unui utilizator să verifice vizual pachetele snap înainte de a continua (sau nu) procesul de eliminare. Un exemplu de ceea ce face scriptul executat este afișat în link.

remove_disabled_snap_pkgs.py

#!/bin/python3
''' Acest script Python automatizează eliminarea tuturor pachetelor SNAP dezactivate din
un sistem. Acest lucru ajută la eliberarea spațiului pe disc al sistemului. Acest rezultat poate fi
semnificativ în situația în care sunt reținute multe pachete SNAP dezactivate
sistemul.
'''
din executarea importului subprocesului, PIPE, CalledProcessError
din calea de import pathlib
import sys

# Ipoteze
SNAP_PKGS_PATH = Cale('/var/lib/snapd/snaps/')
# De asemenea, cel puțin, acest director are cel puțin un fișier xxx.snap acolo. 


def snap_list():
    '''Funcție pentru a executa un cmd bash 'snap list' și returnează un Python
    dicționar de informații despre pachetele ACTIVE SNAPCRAFT din sistem.

    pkgs_dict = {Nume: {'Versiune':'xxx', 'Rev':'xxx', 'Urmărire':'xxx',
                         „Editor”: „xxx”, „Note”: „xxx”}
                }
    '''
    încerca:
        cmd = ['snap', 'list']
        finalizat = run(cmd, check=True, stdout=PIPE)
    cu excepția CalledProcessError ca err:
        print('EROARE:', err)
    altceva:
        anteturi = completed.stdout.decode('utf-8').splitlines()[0].split()
        pkgs=[line.split() pentru line in
              completed.stdout.decode('utf-8').splitlines()[1:]]
        pkgs_dict = {}
        pentru pachet în pachete:
            pkgs_dict[pkg[0]] = {i:pkg[n+1] pentru n, i în enumerate(headers[1:])}
        returnează pkgs_dict


# 1. Obțineți toate pachetele SNAPCRAFT în sistem
all_path = sortat(SNAP_PKGS_PATH.glob('*.snap'))
all_size = sum([p.stat().st_size pentru p în all_path])

# 2. Obțineți pachete SNAPCRAFT active în sistem
active_snap_pkgs = snap_list()
cale_activă = [SNAP_PKGS_PATH / Cale(k+'_'+v['Rev']+'.snap')
               pentru k, v în active_snap_pkgs.items()]
active_size = sum([p.stat().st_size for p in active_path])

# 3. Afișează informații și instrucțiuni în terminal
print(f'TOATE PACHETELE (ACTIVE ȘI DEZACTIVATE) SNAP DIN SISTEM:')
pentru n, i în enumerate(all_path):
    dimensiune = i.stat().st_size
    dacă sunt în calea_activă:
        print(f'Activ\t{dimensiune:>12}\t{i}')
    altceva:
        print(f' \t{dimensiune:>12}\t{i}')

# 4. Afișați statistici privind dimensiunea totală a pachetelor SNAPCRAFT Toate, Active și Dezactivate 
latime = 12
disabled_size = all_size - active_size
print('\nDIMENSIUNEA PACHETELOR SNAP:')
print(f'1. Toate: {all_size:>{width}} bytes')
print(f'2. Activ: {activ_size:>{width}} bytes')
print(f'2. Disabled: {disabled_size:>{width}} bytes sau '
      f'{(disabled_size/all_size):.2%} of All')

# 5. Luați decizia de a elimina sau nu pachetele SNAPCRAFT dezactivate 
dacă disabled_size > 0:
    print(f'\nELIMINĂ TOATE PACHELELE SNAP DEZACTIVATE? [da/n]')
    în timp ce este adevărat:
        decizie = input()
        dacă decizia în [„y”, „Y”, „da”, „Da”, „DA”]:
            print('Înlăturarea în curs... vă rugăm să așteptați')
            pentru p în all_path:
                dacă p nu este în calea_activă:
                    stem = p.stem
                    bar_index = stem.index('_')
                    nume = tulpină[:bar_index]
                    revizuire = stem[bar_index+1:]
                    cmd = ['sudo', 'snap', 'remove', name,
                           '--revision='+revizuire]
                    print(f"\n{' '.join(cmd)}")
                    run(cmd, stdout=sys.stdout, stderr=sys.stderr,
                        codificare = 'utf8')
            print(f'\nELIMINĂ TOATE PACHELELE SNAP DEZACTIVATE? TERMINAT.')
            pauză
        decizia elif în ['n', 'N', 'nu', 'Nu', 'NU']:
            print(f'\nNU SE Efectuează NU SE ÎNCĂRTAREA.')
            pauză
        altceva:
            print('Vă rugăm să introduceți doar „y” sau „n”:’)
altceva:
    print(f'\nNU ESTE NECESARĂ ȘTERARE.')

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.