موقع کار با کامپیوتر یک دسته از پیغام‌هایی که بارها و بارها با اونها مواجه شدیم، انواع اخطارهای فضای ذخیره سازی هستن که یادآوری میکنن فضای دیسک در حال پر شدنه و دیگه جایی برای ذخیره کرن اطلاعات یا نصب برنامه‌های جدید وجود نداره.
خوب یک روز که اصلا انتظار و توقعش رو هم نداشتم، من با یکی از همین اخطارها روبرو شدم که بهم میگفت روی درایوی که دایرکتوری root یا همون / رو پیکربندی کرده بودم جای خالی دیگه وجود نداره، و این در حالی بود که مدت‌ها بود برنامه یا کتابخونه‌ی جدیدی رو نصب نکرده بودم و log ها هم مرتب تمیزکاری شده بودند و آخرین باری هم که چک کرده بودم نزدیک به ۶۰درصد فضای درایو خالی بود، پس منطقا نباید همچین پیغامی از ناکجا ظاهر میشد.

خوب اولین کاری که کردم چک کردن فضای هارد با کمک نرم‌افزار Baobab یا همون 'disk usage analyzer' معروف که به شکل پیش‌فرض همراه میز کار گنوم نصب میشه، بود و با یک موضوع خیلی جالب روبرو شدم، حجم بالای دایرکتوری اسنپ(snap)
/var/lib/snapd/snaps/

با یک جستجوی سریع متوجه شدم که اسنپ ۳ نسخه‌ی آخر هر برنامه‌ای که نصب کرده رو نگه میداره و حذفشون نمیکنه. یعنی تا ۲ بار بعد از آپدیت، ورژن قبلی برنامه رو همچنان به شکل کامل نگهداری میکنه و میتونید به جز آخرین ورژن به ۲نسخه‌ی قبلش هم دسترسی داشته باشید.

دونکته در مورد نگهداری ورژن‌های قبلی:

  • نگهداری نسخه‌های قدیمی شامل نصب برنامه‌های جدید نمیشه، یعنی موقع نصب کردن فقط همون آخرین نسخه رو نصب میکنه، اما وقتی به آپدیت کردن میرسه، به شکل پیش‌فرض از این قانون پیروی میکنه و تا سقف ۳نسخه رو نگهداری میکنه
  • دوم هم اینکه از نسخه‌ی 2.34 به بعد خیلی راحت میشه این پیش‌فرض رو تغییر داد.

پس اولین کاری که کردم اصلاح این موضوع بود، از نسخه ۲/۳۴ به بعد، خیلی راحت با تغییر مقدار refresh.retain میشه تعداد نسخه‌هایی که قراره نگهداری بشه رو کم یا زیاد کرد.

sudo snap set system refresh.retain=2

من این گزینه رو از ۳ به ۲ تغییر دادم، یعنی آخرین نسخه و یک نسخه قبل از اون رو داشته باشم، به هرحال پیش اومده بعد از آپدیت کردن بعضی از برنامه‌ها مشکلاتی پیش بیاد، مثلا برنامه درست کار نکنه، یا از تغییرات ورژن جدید خوشتون نیومده باشه یا به هر دلیل دیگه‌ای بخواید به نسخه‌ی قبلی سوییچ کنید.


خوب تا الان مشکلات پیش نیومده و احتمال پر شدن هارد دیسکم در آینده رو حل کردم، اما خوب هنوز ورژن‌های قبلی هم روی هارد هستند و من همچنان با اخطار کم بودن فضای دیسک درگیرم، با گرفتن لیست کامل از اسنپ میتونیم تمام نسخه‌های نصب شده‌ی فعال و غیر فعال رو ببینیم:

snap list --all

خروجی چیزی شبیه به این باید باشه:

Name  Version  Rev  Tracking  Publisher     Notes
atom  1.46.0   250  stable    snapcrafters  classic
vlc   3.0.9    768  stable    videolan✓     disabled
vlc   3.0.9-1  768  stable    videolan✓     disabled
vlc   3.0.9-2  770  stable    videolan✓     -
...
...

همونطوری که مشخصه، نسخه‌های قدیمی‌تر که در اصل نسخه‌ی غیر فعال شده هستن، با متن 'disabled' در ستون آخر مشخص شدن، برای دیدن فقط این نسخه‌ها میتونیم یه فیلتر کوچیک روی خروجی اعمال کنیم که اگر متن ستون آخر با disabled برابر بود، اون خط رو نمایش بده:

snap list --all | perl -lanE 'say if $F[5] eq "disabled"'

الان باید خروجی شبیه به این شده باشه:

vlc   3.0.9    768  stable    videolan✓    disabled
vlc   3.0.9-1  768  stable    videolan✓    disabled

حالا فقط کافیه که این نسخه‌ها رو حذف کنم، برای حذف کردن یک نسخه خاص از بین تمام نسخه‌های نصب شده در اسنپ میتونیم از دستوری با الگوی زیر استفاده کنیم:

snap remove "Name" --revision="Rev"

که جای Name و Rev باید اسم برنامه و ریویژنی که میخوایم حذف بشه رو بنویسیم، از اونجایی که توی لیست نمایش داده شده، ستون اول اسم برنامه و ستون سوم ریویژن اون برنامه هست، پس فیلتری که نوشته بودم رو با این دستور ترکیب کردم و به این دستور رسیدم:

snap list --all | perl -lanE 'say qx{snap remove "$F[0]" --revision="$f[2]} if $F[5] eq "disabled"'

# --- توضیحات ---
# شمارش ستون‌ها رو از صفر شروع میکنیم، پس
# ستون اول: F[0]
# ستون سوم: F[2]

توصیه: بهتره قبل از حذف ورژن‌های قدیمی، مطمین باشیم تمام اسنپ‌های در حال اجرا رو متوقف کردیم

تمام. نزدیک به ۴۰ گیگ فضای دیسک آزاد شد :)

atom (revision 223) removed
atom (revision 222) removed
bitwarden (revision 15) removed
bitwarden (revision 16) removed
canonical-livepatch (revision 50) removed
canonical-livepatch (revision 54) removed
chromium (revision 607) removed
chromium (revision 660) removed
core (revision 6531) removed
core (revision 6405) removed
core18 (revision 719) removed
core18 (revision 731) removed
gallery-dl (revision 36) removed
gallery-dl (revision 167) removed
gimp (revision 110) removed
gimp (revision 113) removed
...
...

پی‌نوشت:

قبل از انتشار برای اطمینان از درست بودن تمام چیزهایی که نوشتم یه جست و جوی نهایی کردم و به این مطلب رسیدم، How To Remove Old Snap Versions To Free Up Disk Space که با توجه به چیزی که توی اون مقاله نوشته شده، برای استفاده بدون دردسر روی سیستم‌هایی که زبان محلی سیستم‌عامل چیزی به جز انگلیسی هست میتونیم یه تغییر خیلی کوچیک دیگه هم اضافه کنیم و اسنپ رو به حالت انگلیسی اجرا کنیم:

LANG=en_US.UTF-8 snap list --all | perl -lanE 'say qx{snap remove "$F[0]" --revision="$f[2]} if $F[5] eq "disabled"'

توی اون مقاله برای حذف کردن ورژن‌های قدیمی اسنپ، از یک اسکریپت bash به عنوان راه حل استفاده کرده، که به شکل خلاصه توضیحش میدم:

‍۱- یه فایل به اسم remove-old-snaps بسازید

touch remove-old-snaps

۲- فایل رو باز کنید و متن زیر رو کپی-پیست کنید توی فایل جدید

#!/bin/bash
# Removes old revisions of snaps
# CLOSE ALL SNAPS BEFORE RUNNING THIS
set -eu

LANG=en_US.UTF-8 snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        snap remove "$snapname" --revision="$revision"
done

۳- این فایل رو با کمک دستور زیر قابل اجرا میکنیم:

chmod +x remove-old-snaps

۴- و با دسترسی root اجراش میکنیم

sudo ./remove-old-snaps
دسته بندی: گنو/لینوکس برچسب‌ها: snap،  disk،  گنو/لینوکس،  اوبونتو،  اسنپ
در صورتیکه بعد از خواندن این یادداشت بخواهید به هر شکلی در تکمیلش مشارکت کنید، مثلا آن را اصلاح کنید یا مطلبی به آن اضافه کنید، منبع این یادداشت روی گیت‌هاب در این آدرس در دسترس است:
https://github.com/kiamazi/kiavash.one/blob/master/content/blog/2020-05-16-remove-old-snap-versions-to-free-up-disk-space.md
میتوانید آن‌را ویرایش کنید. البته باید یادآوری کنم که هر ویرایشی قبل از اتشار نیاز به تایید دارد.
این وبلاگ از disqus برای سیستم نظردهی استفاده می‌کند، اگر فرم نظردادن را نمی‌بینید احتمالا کسی به جای شما تشخیص داده که این سرویس مناسبتان نیست و آن را از دسترس شما خارج کرده، برای نظردادن در این شرایط از ابزار رفع فیلتر استفاده کنید