Рейтинг: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
Предположим, вы не против рискнуть...почему бы не сделать резервную копию папки `/var/.../snaps/` в безопасном месте, удалить старые версии, перезагрузить компьютер и посмотреть, работает ли он? Вы всегда можете восстановить свою резервную копию, а затем вы можете ответить на свой вопрос.
Someone avatar
флаг my
Кстати, если у вас мало места, рассмотрите возможность установки «подходящих» версий этих программ. Они легче и лучше во всем.
Sun Bear avatar
флаг cn
@cocomac Я надеюсь, что мне не придется экспериментировать, чтобы узнать ответы на свои вопросы, поскольку пакеты SNAP используются на практике уже довольно давно. К настоящему времени должны быть какие-то СОП или стандартные знания по этому вопросу.
guiverc avatar
флаг cn
Снимки снова меняются (например, https://ubuntu.com//blog/the-future-of-snapcraft), что может быть тем, о чем @Someone думал/говорил... правила, применимые к одному снимку, могут * *не** применяются к другим, созданным в другой среде (core16, core18, core20 и вскоре core22), поэтому это не *единый* набор правил; хотя, конечно, многие правила применимы ко всем.
Sun Bear avatar
флаг cn
@ Кто-то `Snap Refresh` не удалил дубликаты пакетов.
Sun Bear avatar
флаг cn
@Someone Я обнаружил, что пакеты Snap обычно более актуальны, чем пакеты apt. Тем не менее, они могут быть временами более хлопотными в использовании. Для включения некоторых функций требуются дополнительные команды. Но я слышал, что они легче в использовании. Спасибо за ваши многочисленные полезные материалы. :)
Sun Bear avatar
флаг cn
@Someone Я включил свои знания из ваших материалов, матиго и user535733, чтобы создать этот [remove_disabled_snap_pkgs.py](https://askubuntu.com/a/1386544/541417) скрипт Python для выполнения этой работы.
Someone avatar
флаг my
@SunBear Хорошая работа! Мне нравится использовать скрипты для всего. Я клонировал ваш репозиторий, но еще не тестировал его. Надеюсь, это сработает :D
Sun Bear avatar
флаг cn
@Кто-то Спасибо. Дайте мне знать, если необходимы улучшения/исправления. Это сработало в моем конце. :)
Sun Bear avatar
флаг cn
@Someone Я добавил больше комментариев к сценарию.
Рейтинг:11
флаг in

Чтобы ответить на ваши вопросы:

Почему они дублируются?

• Это разные ревизии (версии), а не дубликаты.

Могу ли я удалить старый пакет, чтобы обеспечить лучшее управление дисковым пространством?

• Да. Это твой компьютер, в конце концов.

Как удалить старый пакет?

Вы можете сделать это в Терминале следующим образом:

оснастка удалить {привязка} --revision={редакция}

Вы также можете указать системе, сколько прошлых версий ограничить себя следующим образом:

sudo snap set system refresh.retain=2

Примечание: Значение должно быть между 2 и 20, и число вроде 2 или же 3 обычно рекомендуется для экономии места на диске и обеспечения возможности отката в случае неудачного обновления.

Если вы хотите перечислить все снимки и их версии, вы можете запустить эту команду:

список моментальных снимков --все

Что даст вам что-то вроде:

Название Версия Отслеживание оборотов Примечания издателя
bare 1.0 5 последняя/стабильная каноническая база
canonical-livepatch 10.0.1 119 последняя/стабильная версия canonical отключена
canonical-livepatch 10.1.2 126 последняя/стабильная версия canonical™ -
ядро 16-2.52 11798 последнее/стабильное каноническое ядро, отключено
ядро 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 последняя/стабильная каноническая версия отключена
gnome-3-28-1804 3.28.0-19-g98f9e67.98f9e67 161 последняя/стабильная каноническая версия -
gnome-3-34-1804 0+git.3556cb3 77 последний/стабильный/… канонический… —
gnome-3-34-1804 0+git.3556cb3 72 последний/стабильный/… канонический… отключен
gnome-3-38-2004 0+git.cd626d1 87 последняя/стабильная каноническая версия –
gnome-3-38-2004 0+git.6ba6040 76 последняя/стабильная каноническая версия отключена
gtk-common-themes 0.1-52-gb92ac40 1515 последний/стабильный/… канонический… отключен
gtk-common-themes 0.1-59-g7bca6ae 1519 последняя/стабильная/… каноническая… —
snap-store 3.38.0-66-gbd5b8f7 558 последний/стабильный/… канонический… —
snap-store 3.38.0-64-g23c4c77 547 последний/стабильный/… канонический… отключен
snapd 2.53.2 14066 последняя/стабильная каноническая версия — snapd, отключено
snapd 2.53.4 14295 последняя/стабильная каноническая версия — snapd

Нужен сценарий?

ВАЖНЫЙ: Вы захотите проверить вывод список моментальных снимков --все на вашем компьютере, прежде чем продолжить, и ниже приведен сценарий, который не следует копировать/вставлять без проверки работоспособности, если вы используете локаль, которая не является en_US.UTF-8.

Сценарий:

#!/бин/баш
# Этот скрипт удалит отключенные версии оснастки.
установить -eu

LANG=C список оснастки --all | awk '/disabled/{print $1, $3}' |
    при чтении имени rev; делать
        мгновенное удаление «$ name» --revision = «$ rev»
    сделано

Это будет работать список оснастки - все и извлеките строки, содержащие слово Отключено. Это будет отличаться в зависимости от вашей локали, поэтому проверьте вывод функции первый, затем обновите авк '/отключено/ заменить Отключено с меткой, найденной в вашем выводе.

Сохраните скрипт в файл (например скраб-Snaps.sh), а затем установите его как исполняемый:

sudo chmod +x скраб-snaps.sh

Теперь вы можете запустить его, не забывая использовать судо:

судо ./scrub-snaps.sh

Примечание: судо не был частью сценария, но может быть добавлен, если вы предпочитаете, чтобы он был там. В любом случае вам будет предложено ввести пароль, если это необходимо.

Sun Bear avatar
флаг cn
У вас есть команда для удаления всех старых версий всех установленных пакетов Snap? Удалять их по одному действительно больно.
Sun Bear avatar
флаг cn
Спасибо. Я также поделился ответом [здесь] (https://askubuntu.com/a/1386544/541417), чтобы облегчить визуальную проверку пакетов Snap перед выполнением любого удаления отключенных пакетов Snap.
флаг vn
Для этого вы можете создать псевдоним для [этого онлайн-пользователя](https://askubuntu.com/a/1141683/349837).
Рейтинг:7
флаг cn

Сохранение по крайней мере одной старой версии Snap предусмотрено дизайном.

Пакеты Snap изначально были разработаны для различных сред, где часто нет администратора-человека и/или нет возможности подключить клавиатуру и монитор... например, телефоны или устройства IOT. Отказоустойчивость является важнейшим требованием для этих систем: в случае сбоя приложения или повреждения обновления требуется какая-либо форма гарантированного отката без вмешательства человека. Отсюда требование наличия по крайней мере одной старой версии.

Людей с классическими настольными компьютерами и серверами эта возможность отката не слишком волнует. Им нравятся различные элементы быстрого дизайна: безопасные автоматические обновления, независимые от ОС, защита от несанкционированного доступа только для чтения, ограничение процесса и т. д.

Но это все единый стандарт, поэтому вы также получаете возможность отката. Даже если вы думаете, что не будете его использовать.

Вы не можете «отключить» возможность отката снимков — на самом деле это не «функция», а ключевой элемент дизайна.

Sun Bear avatar
флаг cn
Спасибо за объяснение. В системе, на которую я смотрел, я обнаружил, что стоимость функции минимальной избыточности Snap составляет не менее 34% от общего дискового пространства всех пакетов Snap.
Sun Bear avatar
флаг cn
Несмотря на замысел дизайна для избыточности, предоставила ли команда разработчиков Snap также команду для удаления всех старых версий всех пакетов Snap? Эта возможность предназначена для того, чтобы лучше обслуживать пользователей классических настольных компьютеров и серверов, которым не очень важна возможность отката.
user535733 avatar
флаг cn
Конечно, ответ @matigo объясняет *как*. Этот ответ дополняется объяснением *почему*.
Рейтинг:2
флаг cn

Основываясь на ответе @matigo, я написал скрипт питона для автоматизации удаления отключенных пакетов SNAP. Это позволяет пользователю визуально проверить пакеты моментальных снимков, прежде чем приступить к процессу удаления (или нет). Пример того, что делает исполняемый скрипт, показан по ссылке.

remove_disabled_snap_pkgs.py

#!/бин/python3
''' Этот скрипт Python автоматизирует удаление всех отключенных пакетов SNAP в
система. Это поможет освободить дисковое пространство системы. Этот результат может быть
важно в ситуации, когда многие отключенные пакеты SNAP сохраняются в
система.
'''
из запуска импорта подпроцесса, PIPE, CalledProcessError
из пути импорта pathlib
импорт системы

# Предположения
SNAP_PKGS_PATH = Путь ('/var/lib/snapd/snaps/')
# Также, как минимум, в этом каталоге есть хотя бы один файл xxx.snap. 


защита snap_list():
    '''Функция для выполнения команды bash 'snap list' и возврата Python
    словарь информации о пакетах ACTIVE SNAPCRAF в системе.

    pkgs_dict = {Имя: {'Версия':'xxx', 'Ред.':'xxx', 'Отслеживание':'xxx',
                         «Издатель»: «xxx», «Примечания»: «xxx»}
                }
    '''
    пытаться:
        cmd = ['привязка', 'список']
        завершено = запустить (cmd, check = True, стандартный вывод = PIPE)
    кроме CalledProcessError как ошибка:
        print('ОШИБКА:', ошибка)
    еще:
        заголовки = завершено.stdout.decode('utf-8').splitlines()[0].split()
        pkgs=[line.split() для строки
              завершено.stdout.decode('utf-8').splitlines()[1:]]
        pkgs_dict = {}
        для упаковок в упаковках:
            pkgs_dict[pkg[0]] = {i:pkg[n+1] для n, i в enumerate(headers[1:])}
        вернуть pkgs_dict


# 1. Получить все пакеты SNAPCRAFT в системе
all_path = отсортировано (SNAP_PKGS_PATH.glob('*.snap'))
all_size = sum([p.stat().st_size для p в all_path])

# 2. Получить активные пакеты SNAPCRAFT в системе
active_snap_pkgs = snap_list()
active_path = [SNAP_PKGS_PATH / Путь (k+'_'+v['Rev']+'.snap')
               для k, v в active_snap_pkgs.items()]
active_size = sum([p.stat().st_size для p в active_path])

# 3. Отображать информацию и инструкции в терминале
print(f'ВСЕ (АКТИВНЫЕ И ОТКЛЮЧЕННЫЕ) ПАКЕТЫ SNAP В СИСТЕМЕ:')
для n, i в перечислении (all_path):
    размер = i.stat().st_size
    если я в active_path:
        print(f'Активный\t{размер:>12}\t{i}')
    еще:
        печать (f' \ t {размер:> 12} \ t {i}')

# 4. Показать статистику по общему размеру всех, активных и отключенных пакетов SNAPCRAFT. 
ширина = 12
disabled_size = all_size - active_size
print('\nРАЗМЕР ПАКЕТОВ SNAP:')
print(f'1. All: {all_size:>{width}} байт')
print(f'2. Active: {active_size:>{width}} байт')
print(f'2. Отключено: {disabled_size:>{width}} байт или '
      f'{(disabled_size/all_size):.2%} всех')

# 5. Примите решение удалять или не удалять пакеты Disabled SNAPCRAFT 
если disabled_size > 0:
    print(f'\nУДАЛИТЬ ВСЕ ОТКЛЮЧЕННЫЕ ПАКЕТЫ SNAP? [y/n]')
    пока верно:
        решение = ввод ()
        если решение в ['y', 'Y', 'да', 'Да', 'ДА']:
            print('Выполняется удаление... пожалуйста, подождите')
            для p в all_path:
                если p не в active_path:
                    ствол = п.стебель
                    bar_index = стебель.index('_')
                    имя = ствол[:bar_index]
                    ревизия = основа[bar_index+1:]
                    cmd = ['sudo', 'привязать', 'удалить', имя,
                           '--revision='+revision]
                    печать (f"\n{' '.join(cmd)}")
                    запустить (cmd, стандартный вывод = sys.stdout, стандартный вывод = sys.stderr,
                        кодировка = 'utf8')
            print(f'\nУДАЛИТЬ ВСЕ ОТКЛЮЧЕННЫЕ ПАКЕТЫ SNAP? ЗАВЕРШЕНО.')
            сломать
        elif решение в ['n', 'N', 'нет', 'Нет', 'НЕТ']:
            print(f'\nУДАЛЕНИЕ НЕ ВЫПОЛНЯЕТСЯ.')
            сломать
        еще:
            print('Пожалуйста, введите только "y" или "n":')
еще:
    print(f'\nНИКАКОЕ УДАЛЕНИЕ НЕ ТРЕБУЕТСЯ.')

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.