Điểm:8

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

lá cờ 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
lá cờ cn
Giả sử bạn không ngại mạo hiểm...tại sao không tạo bản sao lưu của thư mục `/var/.../snaps/` ở một nơi an toàn, xóa các phiên bản cũ, khởi động lại và xem nó có hoạt động không? Bạn luôn có thể khôi phục bản sao lưu của mình và sau đó bạn có thể trả lời câu hỏi của riêng mình.
Someone avatar
lá cờ my
Nhân tiện, nếu bạn sắp hết dung lượng thì hãy cân nhắc cài đặt các phiên bản `apt` của những phần mềm này. Họ nhẹ hơn và tốt hơn trong mọi thứ.
Sun Bear avatar
lá cờ cn
@cocomac Tôi hy vọng rằng tôi không phải thử nghiệm để tìm hiểu câu trả lời cho câu hỏi của mình vì các gói SNAP đã được sử dụng trong một thời gian khá dài. Bây giờ nên có một số SOP hoặc kiến ​​thức tiêu chuẩn về vấn đề này.
guiverc avatar
lá cờ cn
Snaps đang thay đổi một lần nữa (ví dụ: https://ubuntu.com//blog/the-future-of-snapcraft) có thể là những gì @Ai đó đang nghĩ/nói về... các quy tắc áp dụng cho một lần chụp nhanh, có thể * *không** áp dụng cho những người khác được tạo trong một môi trường khác (core16, core18, core20 và sắp tới là core22), vì vậy đây không phải là một bộ quy tắc *duy nhất*; mặc dù tất nhiên nhiều quy tắc áp dụng cho tất cả.
Sun Bear avatar
lá cờ cn
@Ai đó `snap refresh` đã không xóa các gói trùng lặp.
Sun Bear avatar
lá cờ cn
@Ai đó Tôi thấy rằng các gói Snap thường cập nhật hơn các gói apt. Tuy nhiên, đôi khi chúng có thể gây rắc rối hơn khi sử dụng. Một số tính năng cần thêm lệnh để kích hoạt. Nhưng tôi nghe bạn nói rằng chúng nhẹ hơn để sử dụng. Cảm ơn cho nhiều đầu vào hữu ích của bạn. :)
Sun Bear avatar
lá cờ cn
@Ai đó Tôi đã kết hợp việc học của mình từ các đầu vào của bạn, matigo và user535733 để tạo tập lệnh python [remove_disabled_snap_pkgs.py](https://askubuntu.com/a/1386544/541417) này để thực hiện công việc.
Someone avatar
lá cờ my
@SunBear Làm tốt lắm! Tôi thích sử dụng kịch bản cho mọi thứ. Tôi đã git clone kho lưu trữ của bạn nhưng chưa kiểm tra nó. Hi vọng sẽ thành công :D
Sun Bear avatar
lá cờ cn
@Ai đó Cảm ơn. Hãy cho tôi biết nếu cần cải tiến/chỉnh sửa. Nó hoạt động ở cuối của tôi. :)
Sun Bear avatar
lá cờ cn
@Ai đó Tôi đã thêm nhiều nhận xét vào tập lệnh.
Điểm:11
lá cờ in

Để trả lời câu hỏi của bạn:

Tại sao chúng lại bị trùng lặp?

• Chúng là các phiên bản (phiên bản) khác nhau, không phải bản sao.

Tôi có thể xóa gói cũ hơn để đảm bảo quản lý dung lượng ổ đĩa tốt hơn không?

¢ Có. Của nó của bạn máy tính, sau khi tất cả.

Làm cách nào để xóa gói cũ hơn?

Bạn có thể làm điều này trong Terminal như thế này:

xóa nhanh {snap} --revision={revision}

Bạn cũng có thể cho hệ thống biết có bao nhiêu phiên bản trước đây để tự giới hạn như thế này:

Sudo snap set system refresh.retain=2

Ghi chú: Giá trị phải nằm giữa 220, và một số như 2 hoặc 3 thường được khuyến nghị để tiết kiệm dung lượng lưu trữ và cho phép khôi phục trong trường hợp có bản cập nhật xấu.

Nếu bạn muốn liệt kê tất cả các snaps và các phiên bản của họ, bạn có thể chạy lệnh này:

danh sách snap --all

Mà sẽ cung cấp cho bạn một cái gì đó như:

Tên Phiên bản Theo dõi Rev Nhà xuất bản Ghi chú
bare 1.0 5 cơ sở canonicalâ mới nhất/ổn định
canonical-livepatch 10.0.1 119 canonical mới nhất/ổn định bị vô hiệu hóa
canonical-livepatch 10.1.2 126 canonical ổn định/mới nhấtâ -
lõi 16-2,52 11798 lõi canonicalâ mới nhất/ổn định, bị vô hiệu hóa
lõi 16-2.52.1 11993 lõi canonicalâ mới nhất/ổn định
core18 20211028 2253 cơ sở canonicalâ mới nhất/ổn định
core18 20211015 2246 cơ sở canonicalâ mới nhất/ổn định, bị vô hiệu hóa
core20 20211115 1242 cơ sở canonicalâ mới nhất/ổn định, bị vô hiệu hóa
core20 20211129 1270 cơ sở canonicalâ mới nhất/ổn định
gnome-3-28-1804 3.28.0-19-g98f9e67.98f9e67 145 chuẩn mới nhất/ổn địnhâ bị vô hiệu hóa
gnome-3-28-1804 3.28.0-19-g98f9e67.98f9e67 161 chuẩn mới nhất/ổn địnhâ -
gnome-3-34-1804 0+git.3556cb3 77 mới nhất/ổn định/⦠chính tắcâ -
gnome-3-34-1804 0+git.3556cb3 72 mới nhất/ổn định/⦠canonicalâ bị vô hiệu hóa
gnome-3-38-2004 0+git.cd626d1 87 chuẩn mới nhất/ổn địnhâ -
gnome-3-38-2004 0+git.6ba6040 76 canonical ổn định/mới nhấtâ bị vô hiệu hóa
gtk-common-themes 0.1-52-gb92ac40 1515 mới nhất/ổn định/⦠canonicalâ bị vô hiệu hóa
gtk-common-themes 0.1-59-g7bca6ae 1519 mới nhất/ổn định/⦠chuẩnâ -
snap-store 3.38.0-66-gbd5b8f7 558 mới nhất/ổn định/⦠canonicalâ -
snap-store 3.38.0-64-g23c4c77 547 mới nhất/ổn định/⦠canonicalâ bị vô hiệu hóa
snapd 2.53.2 14066 chuẩn mới nhất/ổn địnhâ snapd,bị vô hiệu hóa
snapd 2.53.4 14295 chuẩn mới nhất/ổn địnhâ snapd

Cần một kịch bản?

QUAN TRỌNG: Bạn sẽ muốn kiểm tra đầu ra của danh sách snap --all trên máy tính của bạn trước khi tiếp tục và sau đây là tập lệnh không được sao chép/dán mà không kiểm tra xem bạn có đang sử dụng ngôn ngữ không không phải vi_US.UTF-8.

Kịch bản:

#!/bin/bash
# Tập lệnh này sẽ xóa các bản sửa đổi chụp nhanh bị vô hiệu hóa.
đặt -eu

LANG=C danh sách nhanh --all | awk '/disabled/{print $1, $3}' |
    trong khi đọc tên rev; làm
        xóa nhanh "$name" --revision="$rev"
    xong

Điều này sẽ chạy danh sách snap-all và trích xuất các dòng có chứa từ Vô hiệu hóa. Điều này sẽ khác tùy thuộc vào ngôn ngữ của bạn, vì vậy hãy kiểm tra đầu ra của hàm đầu tiên, sau đó cập nhật awk '/đã tắt/ thay thế Vô hiệu hóa với nhãn được tìm thấy trong đầu ra của bạn.

Lưu tập lệnh vào một tệp (ví dụ: chà-snaps.sh) và sau đó đặt nó ở dạng có thể thực thi được:

Sudo chmod +x chà-snaps.sh

Bây giờ bạn có thể chạy nó, nhớ sử dụng sudo:

sudo ./scrub-snaps.sh

Ghi chú: sudo không phải là một phần của kịch bản, nhưng có thể được thêm vào nếu bạn muốn có nó trong đó. Dù bằng cách nào, bạn sẽ được nhắc nhập mật khẩu nếu được yêu cầu.

Sun Bear avatar
lá cờ cn
Bạn có lệnh xóa tất cả các phiên bản cũ hơn của tất cả các gói Snap đã cài đặt không? Xóa từng cái một thực sự là một nỗi đau.
Sun Bear avatar
lá cờ cn
Cảm ơn. Tôi cũng đã chia sẻ câu trả lời [tại đây](https://askubuntu.com/a/1386544/541417) để tạo điều kiện kiểm tra trực quan các gói Snap trước khi thực hiện bất kỳ thao tác xóa gói Snap nào bị vô hiệu hóa.
lá cờ vn
Bạn có thể tạo bí danh cho [người trực tuyến này](https://askubuntu.com/a/1141683/349837) để thực hiện việc này
Điểm:7
lá cờ cn

Giữ ít nhất một phiên bản snap cũ hơn vốn có trong thiết kế.

Các gói Snap ban đầu được thiết kế cho nhiều môi trường thường không có người quản trị và/hoặc không có cách nào để gắn bàn phím và màn hình...như điện thoại hoặc thiết bị IOT. Khả năng phục hồi là một yêu cầu quan trọng đối với các hệ thống này: Nếu một ứng dụng gặp sự cố hoặc bản nâng cấp bị hỏng, thì cần có một số hình thức khôi phục được đảm bảo mà không cần sự can thiệp của con người. Do đó, yêu cầu phải có ít nhất một phiên bản cũ hơn.

Những người sử dụng máy tính để bàn và máy chủ cổ điển không quan tâm nhiều đến khả năng khôi phục đó. Họ thích các yếu tố thiết kế snap khác nhau: Nâng cấp tự động an toàn độc lập với HĐH, ngăn chặn giả mạo squashfs chỉ đọc, quá trình giam cầm, v.v.

Nhưng tất cả đều là một tiêu chuẩn duy nhất, vì vậy bạn cũng có khả năng khôi phục. Ngay cả khi bạn nghĩ rằng bạn sẽ không sử dụng nó.

Bạn không thể "tắt" khả năng khôi phục của snaps - nó không thực sự là một "tính năng" mà là một yếu tố thiết kế chính.

Sun Bear avatar
lá cờ cn
Cảm ơn vì đã giải thích. Trong hệ thống mà tôi đã xem xét, tôi phát hiện ra rằng chi phí của tính năng dự phòng tối thiểu của Snap chiếm ít nhất 34% tổng dung lượng ổ đĩa của tất cả các gói Snap.
Sun Bear avatar
lá cờ cn
Mặc dù mục đích thiết kế là dự phòng, nhóm phát triển Snap có cung cấp lệnh xóa tất cả các bản sửa đổi cũ hơn của tất cả các gói snap không? Khả năng này là để phục vụ tốt hơn cho những người sử dụng máy tính để bàn và máy chủ cổ điển, những người không quan tâm nhiều đến khả năng khôi phục đó.
user535733 avatar
lá cờ cn
Chắc chắn, câu trả lời của @matigo giải thích *làm thế nào*. Câu trả lời này bổ sung bằng cách giải thích *tại sao*.
Điểm:2
lá cờ cn

Dựa trên câu trả lời @matigo, tôi đã viết một tập lệnh python để tự động loại bỏ các gói SNAP bị vô hiệu hóa. Nó cho phép người dùng kiểm tra trực quan các gói snap trước khi tiến hành (hoặc không) quá trình gỡ bỏ. Một ví dụ về chức năng của tập lệnh đã thực thi được hiển thị trong liên kết.

remove_disabled_snap_pkgs.py

#!/bin/python3
''' Tập lệnh python này tự động xóa tất cả các gói SNAP bị vô hiệu hóa trong
hệ thống. Làm như vậy sẽ giúp giải phóng không gian đĩa của hệ thống. Kết quả này có thể được
đáng kể trong trường hợp nhiều gói SNAP bị vô hiệu hóa được giữ lại trong
hệ thống.
'''
từ lần chạy nhập quy trình con, PIPE, CalledProcessError
từ đường dẫn nhập pathlib
nhập khẩu hệ thống

# giả định
SNAP_PKGS_PATH = Đường dẫn('/var/lib/snapd/snaps/')
# Ngoài ra, ở mức tối thiểu, thư mục này có ít nhất một tệp xxx.snap ở đó. 


chắc chắn snap_list():
    '''Chức năng thực thi lệnh bash 'snap list' cmd và trả về Python
    từ điển thông tin của pkg SNAPCRAFT HOẠT ĐỘNG trong hệ thống.

    pkgs_dict = {Tên : {'Phiên bản':'xxx', 'Rev':'xxx', 'Theo dõi':'xxx',
                         'Nhà xuất bản':'xxx', 'Ghi chú':'xxx'}
                }
    '''
    cố gắng:
        cmd = ['snap', 'list']
        đã hoàn thành = run(cmd, check=True, stdout=PIPE)
    ngoại trừ CalledProcessError là lỗi:
        in ('LỖI:', lỗi)
    khác:
        tiêu đề = hoàn thành.stdout.decode('utf-8').splitlines()[0].split()
        pkgs=[line.split() cho dòng vào
              hoàn thành.stdout.decode('utf-8').splitlines()[1:]]
        pkgs_dict = {}
        cho pkg trong pkgs:
            pkgs_dict[pkg[0]] = {i:pkg[n+1] for n, i in enumerate(headers[1:])}
        trả lại pkgs_dict


# 1. Nhận tất cả pkg SNAPCRAFT trong hệ thống
all_path = đã sắp xếp(SNAP_PKGS_PATH.glob('*.snap'))
all_size = sum([p.stat().st_size cho p trong all_path])

# 2. Nhận pkg SNAPCRAFT đang hoạt động trong hệ thống
active_snap_pkgs = snap_list()
active_path = [SNAP_PKGS_PATH / Đường dẫn(k+'_'+v['Rev']+'.snap')
               cho k, v trong active_snap_pkgs.items()]
active_size = sum([p.stat().st_size cho p trong active_path])

#3. Hiển thị thông tin và hướng dẫn trong terminal
print(f'TẤT CẢ CÁC GÓI SNAP (KÍCH HOẠT & ĐÃ TẮT) TRONG HỆ THỐNG:')
cho n, i trong liệt kê (all_path):
    kích thước = i.stat().st_size
    nếu tôi ở active_path:
        in(f'Active\t{size:>12}\t{i}')
    khác:
        in(f' \t{size:>12}\t{i}')

# 4. Hiển thị số liệu thống kê về tổng kích thước của các gói SNAPCRAFT Tất cả, Đang hoạt động và Đã tắt 
chiều rộng = 12
bị vô hiệu hóa = all_size - active_size
print('\nKÍCH THƯỚC CÁC GÓI SNAP:')
print(f'1. Tất cả : {all_size:>{width}} byte')
print(f'2. Active : {active_size:>{width}} byte')
print(f'2. Đã tắt : {disabled_size:>{width}} byte hoặc '
      f'{(disabled_size/all_size):.2%} của tất cả')

# 5. Đưa ra quyết định xóa hay không xóa các gói SNAPCRAFT bị vô hiệu hóa 
nếu bị vô hiệu hóa> 0:
    print(f'\nXÓA TẤT CẢ CÁC GÓI SNAP ĐÃ TẮT? [y/n]')
    trong khi Đúng:
        quyết định = đầu vào()
        nếu quyết định trong ['y', 'Y', 'yes', 'Yes', 'YES']:
            print('Đang xóa... vui lòng đợi')
            cho p trong all_path:
                nếu p không có trong active_path:
                    gốc = p.stem
                    bar_index = gốc.index('_')
                    tên = gốc[:bar_index]
                    bản sửa đổi = gốc[bar_index+1:]
                    cmd = ['sudo', 'snap', 'remove', tên,
                           '--bản sửa đổi='+bản sửa đổi]
                    in(f"\n{' '.join(cmd)}")
                    chạy (cmd, thiết bị xuất chuẩn = sys.stdout, thiết bị xuất chuẩn = sys.stderr,
                        mã hóa = 'utf8')
            print(f'\nXÓA TẤT CẢ CÁC GÓI SNAP ĐÃ TẮT? ĐÃ HOÀN THÀNH.')
            nghỉ
        elif quyết định trong ['n', 'N', 'no', 'No', 'NO']:
            print(f'\nKHÔNG LOẠI BỎ ĐƯỢC THỰC HIỆN.')
            nghỉ
        khác:
            print('Vui lòng chỉ nhập "y" hoặc "n":')
khác:
    print(f'\nKHÔNG CẦN LOẠI BỎ.')

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.