Вопрос или проблема
Работая с сервером 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, эти устройства могут оставаться в системе, как в вашем случае.
Как удалить циклические устройства
Для удаления неиспользуемых циклических устройств вы можете воспользоваться следующими шагами:
-
Проверьте статус циклических устройств: Для начала вам следует убедиться, что устройства действительно не используются. Запустите команду:
lsblk -a
Это покажет вам список всех устройств, включая циклические.
-
Удалите циклические устройства вручную: Если вы уверены, что устройства не используются, вы можете удалить их с помощью команды
losetup
. Например, чтобы удалить устройство loop0, выполните:sudo losetup -d /dev/loop0
Повторите эту команду для каждого устройства, которое вы хотите удалить.
-
Автоматизированный подход: Вы можете также написать небольшой скрипт, который автоматически удалит все циклические устройства, которые не используются. Вот пример скрипта на 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 или к профессиональным сервисам техподдержки.