Как справиться с неиспользуемой разделом цикла после удаления snap/snapd?

Вопрос или проблема

Работая с сервером Ubuntu для личного использования, я удалил все, что не будет необходимо для моего использования. Это snapd и snap, которые я хотел бы правильно очистить.

Я удалил snap и snapd самым аккуратным способом (snap remove <дефолтно установленный snap:core,lxd,snapd> + apt remove --purge snap). Это действительно удаляет демон, кэш, папку /snap, однако не очищает цикл устройства, в данный момент оно не смонтировано.

Упоминается дополнительная команда очистки, которую мне следовало бы выполнить перед удалением всего, но теперь уже поздно. Командой было бы snap remove --purge <установленный snap:core,lxd,snapd>, упоминается здесь.

Как я могу удалить эти цикл устройства наилучшим образом?
Будет ли сложно переустановить snap позже? (если потребуется)

Смотрите результат lsblk:

>$lsblk -a
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0     0B  1 loop
loop1                       7:1    0     0B  1 loop
loop2                       7:2    0     0B  1 loop
loop3                       7:3    0     0B  1 loop
loop4                       7:4    0     0B  1 loop
loop5                       7:5    0     0B  1 loop
loop6                       7:6    0     0B  0 loop
loop7                       7:7    0     0B  0 loop
sda                         8:0    0 279.4G  0 disk
├─sda1                      8:1    0     1M  0 part
[...]

используемая дистрибуция ниже

>$uname -a
Linux ubuntu 5.15.0-83-generic #92-Ubuntu SMP Mon Aug 14 09:30:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

Обновление I

Нет сомнений, что loop{0..7} были связаны с snap, смотрите ниже вывод команды до удаления snap:

>$ lsblk -a
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0  63.5M  1 loop /snap/core20/2015
loop1                       7:1    0 111.9M  1 loop /snap/lxd/24322
loop2                       7:2    0    87M  1 loop /snap/lxd/27037
loop3                       7:3    0  53.3M  1 loop /snap/snapd/19457
loop4                       7:4    0  40.4M  1 loop /snap/snapd/20671
loop5                       7:5    0  63.9M  1 loop /snap/core20/2182
loop6                       7:6    0     0B  0 loop
loop7                       7:7    0     0B  0 loop
sda                         8:0    0 279.4G  0 disk
├─sda1                      8:1    0     1M  0 part
[...]

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

Эти 0-7 автоматически создаются во время инициализации ядром (независимо от наличия менеджера пакетов SNAP или демона snapd)… Цитируя из Параметры командной строки ядра:

max_loop=       [LOOP] Количество блоков устройств loop, которые
(loop.max_loop) создаются безусловно при инициализации. Значение по умолчанию
                настраивается с помощью BLK_DEV_LOOP_MIN_COUNT. Вместо
                статического выделения предопределенного количества, устройства loop
                могут запрашиваться по запросу с помощью интерфейса
                /dev/loop-control. 

max_loop= когда-то устанавливался в 8 из-за исторических ограничений функциональности losetup(8), которые не могли динамически создавать новые блоки устройств loop во время выполнения до того, как использование интерфейса /dev/loop-control стало возможным около 2011 года … Это затем стало как ненужным, так и нежелательным жестким ограничением … Цитируя из [PATCH 3/3] loop: добавить BLK_DEV_LOOP_MIN_COUNT=%i для разрешения предустановленных устройств loop в дистрибутивах:

+ /*
+  * Если max_loop задан, создайте столько устройств заранее.
+  * Это также становится жестким лимитом. Если max_loop не задан,
+  * создайте CONFIG_BLK_DEV_LOOP_MIN_COUNT устройств loop при инициализации модуля.
+  * Устройства loop могут запрашиваться по запросу с помощью интерфейса
+  * /dev/loop-control или быть созданы доступом
+  * к 'неисправному' узлу устройства.
+  */ 

… поэтому теперь, кажется, что оно установлено на 0/не указано … Более того, цитируя из [PATCH v1] loop: Исправление обработки аргумента командной строки max_loop, когда он установлен в 0:

Аргумент командной строки max_loop может использоваться для переопределения
значения CONFIG_BLK_DEV_LOOP_MIN_COUNT. Однако, когда max_loop установлен
в 0 через командную строку, текущая логика рассматривает это так, как будто он
не был установлен, и в любом случае создает устройства CONFIG_BLK_DEV_LOOP_MIN_COUNT.

… а CONFIG_BLK_DEV_LOOP_MIN_COUNT в Ubuntu:

$ grep 'CONFIG_BLK_DEV_LOOP_MIN_COUNT' /boot/config-"$(uname -r)"
CONFIG_BLK_DEV_LOOP_MIN_COUNT=8

… также отражается в:

$ cat /sys/module/loop/parameters/max_loop 
8

Следовательно вы можете ограничить количество устройств loop, создаваемых во время загрузки на текущих ядрах до одного, установив параметр загрузки ядра “max_loop=1” в вашем загрузочном менеджере, т.е. GRUB, и, предположительно, до нулевого в будущих исправленных ядрах с “max_loop=0” … и это не должно повлиять на будущую переустановку системы управления пакетами SNAP, так как устройства loop должны динамически создаваться по мере необходимости.

Существование loop{0..7} не связано с snap. Snap просто использовал 6 из них. То, что snap использовал 1 ГБ вашего жесткого диска, не означает, что вам нужно выбрасывать свой жесткий диск на 1 ТБ, чтобы избавиться от snap.

Если вы выполните ls /dev на https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192, вы увидите loop{0..7}. Это Alpine Linux, и он не основан на Ubuntu, так что никогда не поддерживал snap. Тем не менее, без snap он все еще имеет эти устройства loop. Это нормально.

Как очистить старые ревизии Snap и удалить устройства loop?

Скрипт для очистки

#!/bin/sh
set -eu

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

Ответ или решение

Как удалить неиспользуемые циклические разделы после удаления snap/snapd на Ubuntu

При использовании Ubuntu Server вы, вероятно, столкнулись с ситуацией, когда удаление пакетов snap и snapd не приводит к очистке всех связанных циклических разделов. В этом руководстве мы подробно рассмотрим процесс удаления неизрасходованных циклических разделов и объясним, как это сделать правильно.

Причины появления циклических устройств

Циклические устройства, такие как loop0, loop1 и т.д., создаются ядром Linux и могут использоваться различными приложениями для монтирования файловых систем или образов устройства. В случае snap, циклические устройства создаются для монтирования пакетов приложений и их версий. После удаления snap и snapd, эти устройства могут оставаться в системе, как в вашем случае.

Как удалить циклические устройства

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

  1. Проверьте статус циклических устройств: Для начала вам следует убедиться, что устройства действительно не используются. Запустите команду:

    lsblk -a

    Это покажет вам список всех устройств, включая циклические.

  2. Удалите циклические устройства вручную: Если вы уверены, что устройства не используются, вы можете удалить их с помощью команды losetup. Например, чтобы удалить устройство loop0, выполните:

    sudo losetup -d /dev/loop0

    Повторите эту команду для каждого устройства, которое вы хотите удалить.

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

    #!/bin/bash
    for loopdev in /dev/loop*; do
       if ! mount | grep -q "$loopdev"; then
           sudo losetup -d "$loopdev"
       fi
    done

Восстановление snap/snapd в будущем

Если вы решите восстановить snap или snapd в будущем, это можно сделать довольно легко. Просто выполните следующую команду:

sudo apt install snapd

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

Заключение

Удаление неиспользуемых циклических устройств после удаления snap/snapd не является сложной задачей, но требует внимательного подхода. Используя вышеописанные методы, вы сможете очистить систему от неизрасходованных устройств без риска потери данных или функциональности.

Если у вас остались вопросы или возникли трудности при выполнении этих шагов, не стесняйтесь обратиться к сообществу пользователей Ubuntu или к профессиональным сервисам техподдержки.

Оцените материал
Добавить комментарий

Капча загружается...