Bug 55043 - gearlever: Некорректная работа с appimage-extract без наличия 7-zip (/usr/bin/7zz), squashfs-tools (/usr/bin/unsquashfs)
Summary: gearlever: Некорректная работа с appimage-extract без наличия 7-zip (/usr/bin...
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: gearlever (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: oleg@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-07-03 16:31 MSK by Artem Varaksa
Modified: 2025-07-09 14:20 MSK (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Artem Varaksa 2025-07-03 16:31:34 MSK
Шаги
====

1. # apt-get install -y gearlever
2. $ curl \
    --location "https://download.kde.org/Attic/krita/5.2.6/krita-5.2.6-x86_64.appimage" \
    --output "krita-5.2.6-x86_64.appimage"
3. $ gearlever
4. Нажать Открыть (+) > выбрать скачанный файл.
5. Если появится сообщение "Пожалуйста, проверьте источник этого приложения, прежде чем открывать его", нажать Разблокировать.
6. Нажать Добавить в меню приложений.
6. Выполнить любое действие, которое приведёт к попытке заново прочитать метаданные AppImage (для чего требуется его распаковать), например нажать Обновить метаданные, попробовать открыть другой файл AppImage и т. п.


Фактический результат
=====================

В логе первое извлечение успешно (хотя проваливаются попытки извлечения с помощью 7zz и unsquashfs):

> ==> /home/test/.cache/logs/gearlever.log <==
> DEBUG [AppImageProvider.py:677] Created temporary folder at /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_xdz2rp51b7

> DEBUG [terminal.py:42] Running ['dwarfsck', '--input=/home/test/krita-5.2.6-x86_64.appimage', '-q', '-detail=0', '--no-check']
> INFO [AppImageProvider.py:694] Filesystem is not dwarfsck

> INFO [AppImageProvider.py:702] Exctracting with p7zip to /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_xdz2rp51b7/squashfs-root
> DEBUG [terminal.py:42] Running ['7zz', 't', '/home/test/krita-5.2.6-x86_64.appimage', '-y', '-bso0', '-bsp0']
> ERROR [AppImageProvider.py:714] Extraction with 7zz failed
> ERROR [AppImageProvider.py:715] [Errno 2] Нет такого файла или каталога: '7zz'

> DEBUG [AppImageProvider.py:719] Testing with unsquashfs
> DEBUG [terminal.py:42] Running ['/usr/lib/gearlever/get_appimage_offset', '/home/test/krita-5.2.6-x86_64.appimage']
> DEBUG [terminal.py:60] Done ['/usr/lib/gearlever/get_appimage_offset', '/home/test/krita-5.2.6-x86_64.appimage']
> DEBUG [terminal.py:42] Running ['unsquashfs', '-o', '2048', '-l', '/home/test/krita-5.2.6-x86_64.appimage']
> ERROR [AppImageProvider.py:726] Extraction with unsquashfs failed
> ERROR [AppImageProvider.py:727] [Errno 2] Нет такого файла или каталога: 'unsquashfs'

> INFO [AppImageProvider.py:731] Extracting with appimage-extract
> DEBUG [utils.py:74] Copying /home/test/krita-5.2.6-x86_64.appimage to /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_xdz2rp51b7/app.appimage
> DEBUG [terminal.py:42] Running ['chmod', '+x', '/tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_xdz2rp51b7/app.appimage']
> DEBUG [terminal.py:60] Done ['chmod', '+x', '/tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_xdz2rp51b7/app.appimage']
> DEBUG [terminal.py:42] Running ['/tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_xdz2rp51b7/app.appimage', '--appimage-extract']
> DEBUG [terminal.py:60] Done ['/tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_xdz2rp51b7/app.appimage', '--appimage-extract']
> DEBUG [utils.py:74] Copying /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_xdz2rp51b7/squashfs-root/org.kde.krita.desktop to /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_appimage_32fd472fdd41b148bad8162182ff82a4/app.desktop
> DEBUG [AppImageProvider.py:808] Looking for icon in: /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_xdz2rp51b7/squashfs-root/usr/share/icons/hicolor/scalable/apps/krita.svg
> DEBUG [AppImageProvider.py:808] Looking for icon in: /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_xdz2rp51b7/squashfs-root/usr/share/icons/hicolor/512x512/apps/krita.png
> DEBUG [utils.py:74] Copying /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_xdz2rp51b7/squashfs-root/usr/share/icons/hicolor/512x512/apps/krita.png to /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_appimage_32fd472fdd41b148bad8162182ff82a4/icon.png
> DEBUG [terminal.py:42] Running ['arch']
> DEBUG [terminal.py:60] Done ['arch']

> INFO [AppImageProvider.py:264] Installing appimage: /home/test/krita-5.2.6-x86_64.appimage
> DEBUG [utils.py:74] Copying /home/test/krita-5.2.6-x86_64.appimage to /home/test/AppImages/krita.appimage
> DEBUG [AppImageProvider.py:339] file copied to /home/test/AppImages
> DEBUG [AppImageProvider.py:65] Chmod file /home/test/AppImages/krita.appimage
> DEBUG [utils.py:74] Copying /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_appimage_32fd472fdd41b148bad8162182ff82a4/icon.png to /home/test/AppImages/.icons/krita.png
> INFO [AppImageProvider.py:451] Deleting original appimage file from: /home/test/krita-5.2.6-x86_64.appimage
> DEBUG [terminal.py:18] Running ['update-desktop-database', '/home/test/.local/share/applications', '-q']
> DEBUG [terminal.py:35] Done ['update-desktop-database', '/home/test/.local/share/applications', '-q']
> DEBUG [AppImageProvider.py:456]
> DEBUG [terminal.py:42] Running ['arch']
> DEBUG [terminal.py:60] Done ['arch']
> DEBUG [json_config.py:16] Reading config from /home/test/.config/apps.json
> DEBUG [json_config.py:16] Reading config from /home/test/.config/apps.json
> DEBUG [json_config.py:16] Reading config from /home/test/.config/apps.json
> DEBUG [terminal.py:42] Running ['readelf', '--string-dump=.upd_info', '--wide', '/home/test/AppImages/krita.appimage']
> DEBUG [terminal.py:60] Done ['readelf', '--string-dump=.upd_info', '--wide', '/home/test/AppImages/krita.appimage']

При втором извлечении воспроизводятся те же проблемы, но и appimage-extract уже не работает:

> INFO [AppImageProvider.py:464] Reloading metadata for /home/test/AppImages/krita.appimage
> DEBUG [utils.py:74] Copying /home/test/AppImages/krita.appimage to /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_3qxd72r9r6/tmp.appimage
> INFO [AppImageProvider.py:203] Removing /home/test/AppImages/krita.appimage
> INFO [AppImageProvider.py:211] Trashing /home/test/AppImages/krita.appimage
> INFO [AppImageProvider.py:219] Removing /home/test/.local/share/applications/krita.desktop
> INFO [AppImageProvider.py:264] Installing appimage: /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_3qxd72r9r6/tmp.appimage
> DEBUG [AppImageProvider.py:677] Created temporary folder at /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_28d9q9dca1

> DEBUG [terminal.py:42] Running ['dwarfsck', '--input=/tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_3qxd72r9r6/tmp.appimage', '-q', '-detail=0', '--no-check']
> INFO [AppImageProvider.py:694] Filesystem is not dwarfsck

> INFO [AppImageProvider.py:702] Exctracting with p7zip to /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_28d9q9dca1/squashfs-root
> DEBUG [terminal.py:42] Running ['7zz', 't', '/tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_3qxd72r9r6/tmp.appimage', '-y', '-bso0', '-bsp0']
> ERROR [AppImageProvider.py:714] Extraction with 7zz failed
> ERROR [AppImageProvider.py:715] [Errno 2] Нет такого файла или каталога: '7zz'

> DEBUG [AppImageProvider.py:719] Testing with unsquashfs
> DEBUG [terminal.py:42] Running ['/usr/lib/gearlever/get_appimage_offset', '/tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_3qxd72r9r6/tmp.appimage']
> DEBUG [terminal.py:60] Done ['/usr/lib/gearlever/get_appimage_offset', '/tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_3qxd72r9r6/tmp.appimage']
> DEBUG [terminal.py:42] Running ['unsquashfs', '-o', '2048', '-l', '/tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_3qxd72r9r6/tmp.appimage']
> ERROR [AppImageProvider.py:726] Extraction with unsquashfs failed
> ERROR [AppImageProvider.py:727] [Errno 2] Нет такого файла или каталога: 'unsquashfs'

> INFO [AppImageProvider.py:731] Extracting with appimage-extract
> DEBUG [utils.py:74] Copying /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_3qxd72r9r6/tmp.appimage to /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_28d9q9dca1/app.appimage
> ERROR [AppImageProvider.py:446] Appimage installation error: g-io-error-quark: Ошибка выполнения splice для файла: На устройстве не осталось свободного места (12)

В терминале:

> Exception in thread Thread-5 (on_refresh_metadata_btn_clicked):
> Traceback (most recent call last):
>   File "/usr/lib64/python3.12/threading.py", line 1075, in _bootstrap_inner
>     self.run()
>   File "/usr/lib64/python3.12/threading.py", line 1012, in run
>     self._target(*self._args, **self._kwargs)
>   File "/usr/share/gearlever/gearlever/AppDetails.py", line 719, in on_refresh_metadata_btn_clicked
>     self.provider.reload_metadata(self.app_list_element)
>   File "/usr/share/gearlever/gearlever/providers/AppImageProvider.py", line 481, in reload_metadata
>     self.install_file(el)
>   File "/usr/share/gearlever/gearlever/providers/AppImageProvider.py", line 447, in install_file
>     raise e
>   File "/usr/share/gearlever/gearlever/providers/AppImageProvider.py", line 270, in install_file
>     extracted_appimage = self._load_appimage_metadata(el)
>                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/usr/share/gearlever/gearlever/providers/AppImageProvider.py", line 758, in _load_appimage_metadata
>     mounted_appimage_path = self._extract_appimage(el)
>                             ^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/usr/share/gearlever/gearlever/providers/AppImageProvider.py", line 733, in _extract_appimage
>     gio_copy(file, cloned_file)
>   File "/usr/share/gearlever/gearlever/lib/utils.py", line 75, in gio_copy
>     return file.copy(
>            ^^^^^^^^^^
> gi.repository.GLib.GError: g-io-error-quark: Ошибка выполнения splice для файла: На устройстве не осталось свободного места (12)

При этом на / доступно >15 GB места:

> # lsblk -f
> NAME   FSTYPE  FSVER            LABEL                       UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
> sda
> ├─sda1 swap    1                                            5e3df10b-de36-4d1b-810e-f01406264277                [SWAP]
> └─sda2 ext4    1.0                                          16ad7332-e58d-4e81-9adb-d7b3170b48b8   16,8G    42% /
> sr0    iso9660 Joliet Extension ALT Workstation 11.0 x86_64 2025-04-19-14-59-13-00

Что-то связанное с appimage-extract монтируется неправильно / повторно использует смонтированное расположение, не предназначенное для повторного использования. Исправляется после перезапуска приложения.

Однако эта ошибка приводит к следующим результатам:

* После перезапуска Gear Lever или возврата к главной странице файл AppImage теряется (если, как по умолчанию, стоит опция перемещать AppImage). В ~/AppImages его уже нет.

* Если попробовать установить приложение, метаданные которого не удалось получить, установка зависает; в логе

> ERROR [AppImageProvider.py:446] Appimage installation error: 'NoneType' object has no attribute 'getExec'
> ERROR [AppDetails.py:275] 'NoneType' object has no attribute 'getExec'

* Один раз приложение удалось установить (конкретно, параллельно другую версию Krita из https://download.kde.org/stable/krita/5.2.9/krita-5.2.9-x86_64.AppImage по аналогии с https://bugzilla.altlinux.org/54913), однако при попытке запуска приложения с версией из меню упала виртуальная машина в среде Proxmox Virtual Environment. Возможно, было связано с самим PVE. После загрузки системы AppImage оказался испорченный, при попытке запуска выводилось уведомление с ошибкой FUSE.

Ожидаемый результат
===================

Успешное извлечение метаданных неограниченное количество раз.


Дополнительно
=============

Если установить пакеты:

# apt-get install -y 7-zip squashfs-tools

после воспроизведения ошибки с appimage-extract, то 7zz и unsquashfs не работают:

> DEBUG [AppImageProvider.py:677] Created temporary folder at /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_cbz27zqza3

> DEBUG [terminal.py:42] Running ['dwarfsck', '--input=/home/test/AppImages/gearlever_krita529x86_64appimage.appimage', '-q', '-detail=0', '--no-check']
> INFO [AppImageProvider.py:694] Filesystem is not dwarfsck

> INFO [AppImageProvider.py:702] Exctracting with p7zip to /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_cbz27zqza3/squashfs-root
> DEBUG [terminal.py:42] Running ['7zz', 't', '/home/test/AppImages/gearlever_krita529x86_64appimage.appimage', '-y', '-bso0', '-bsp0']
> DEBUG [terminal.py:60] Done ['7zz', 't', '/home/test/AppImages/gearlever_krita529x86_64appimage.appimage', '-y', '-bso0', '-bsp0']
> DEBUG [terminal.py:42] Running ['7zz', 'x', '/home/test/AppImages/gearlever_krita529x86_64appimage.appimage', '-o/tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_cbz27zqza3/squashfs-root', '-y', '-bso0', '-bsp0', '*.png', '*.svg', '*.desktop', '.DirIcon', '-r']
> ERROR [AppImageProvider.py:714] Extraction with 7zz failed
> ERROR [AppImageProvider.py:715] Command '['7zz', 'x', '/home/test/AppImages/gearlever_krita529x86_64appimage.appimage', '-o/tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_cbz27zqza3/squashfs-root', '-y', '-bso0', '-bsp0', '*.png', '*.svg', '*.desktop', '.DirIcon', '-r']' returned non-zero exit status 2.

> DEBUG [AppImageProvider.py:719] Testing with unsquashfs
> DEBUG [terminal.py:42] Running ['/usr/lib/gearlever/get_appimage_offset', '/home/test/AppImages/gearlever_krita529x86_64appimage.appimage']
> DEBUG [terminal.py:60] Done ['/usr/lib/gearlever/get_appimage_offset', '/home/test/AppImages/gearlever_krita529x86_64appimage.appimage']
> DEBUG [terminal.py:42] Running ['unsquashfs', '-o', '2048', '-l', '/home/test/AppImages/gearlever_krita529x86_64appimage.appimage']
> ERROR [AppImageProvider.py:726] Extraction with unsquashfs failed
> ERROR [AppImageProvider.py:727] Command '['unsquashfs', '-o', '2048', '-l', '/home/test/AppImages/gearlever_krita529x86_64appimage.appimage']' returned non-zero exit status 1.

> INFO [AppImageProvider.py:731] Extracting with appimage-extract
> DEBUG [utils.py:74] Copying /home/test/AppImages/gearlever_krita529x86_64appimage.appimage to /tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_cbz27zqza3/app.appimage

Лог 7zz не выводится в файл лога, как происходит при успешном извлечении с помощью него.

И appimage-extract также не завершается из-за ошибки, описанной выше.

При выполнении вручную команд из лога:

> $ 7zz x /home/test/AppImages/gearlever_krita529x86_64appimage.appimage -o/tmp/.private/test/it.mijorus.gearlever/appimages/gearlever_cbz27zqza3/squashfs-root -y -bso0 -bsp0 *.png *.svg *.desktop .DirIcon -r
> System ERROR:
> errno=28 : На устройстве не осталось свободного места

> $ unsquashfs -o 2048 -l /home/test/AppImages/gearlever_krita529x86_64appimage.appimage
> FATAL ERROR: Can't find a valid SQUASHFS superblock on /home/test/AppImages/gearlever_krita529x86_64appimage.appimage

Только после перезапуска приложения начинает корректно использоваться 7zz (до unsquashfs уже не доходит, видимо предполагается работа с любым из 7zz, unsquashfs, appimage-extract).


Отмечу, что уже добавлялась зависимость на пакет p7zip (https://bugzilla.altlinux.org/53225), однако пакет p7zip не предоставляет /usr/bin/7zz. Его предоставляет только пакет 7-zip.


Воспроизводимость
=================

Воспроизводится на виртуальных машинах:

[sisyphus] ALT Workstation 11.0 x86_64
gearlever-3.3.3-alt1.noarch

[p11+386229.3] ALT Workstation 11.0 x86_64
gearlever-3.3.3-alt1.noarch
Comment 1 Repository Robot 2025-07-09 14:20:29 MSK
gearlever-3.3.3-alt2 -> sisyphus:

Wed Jul 09 2025 Semen Fomchenkov <armatik@altlinux> 3.3.3-alt2
- Remove user manual (ALT #55037).
- Added 7-zip dependency (ALT #55043).