Сайт | Скачать | Видео | Wiki

Автор Тема: Универсальный менеджер монтирования модулей без aufs , overlayfs.  (Прочитано 3719 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 886
  • Репутация: +24/-0
  • Автор темы
в шапке теперь финальная версия улучшеный работающий без ошибок скрипт
---------------------------------------------------------------------------------------------------------------

вот следующая итерация моего иследования на тему создания менеджера монтирования модулей используя символические ссылки.
--------
Внимание скрипт может быть опасен, подключаемые модули нужно тестировать в виртуалке.
У меня например sb модуль c libreoffice собраный в minios стабильно ложит систему (распаковал appimage и перепаковал его в sb ,естествено работает понимаю что масло масляное , но хотел понять виноват скрипт или то что положено в модуль  )

Зависимости peco,  мог использовать fzy, но так как скрипт изначально писал с peco сконцентрировался на самом принципе, позже если нужно будет, можно будет переделать с  fzy
-------
что умеет
Ищет в /usr /var /etc битые ссылки и удаляет их.
--
   при выборе опции Активировать)
--
монтирует модуль в /mnt/module_name
--
оттуда прокидывает в систему ссылки с помощью sudo cp -rs --no-clobber
--
также записывает полный путь всех сим_ссылок в спек_файл_имя_модуля в ~/.config для последующей их дезактивации то есть убираем все ссылки одним махом, и модуль дезактивирован
--
 при выборе опции Дезактивировать)
удаляет все символические ссылки прописаные в спек файл модуля
код:
Код
#!/bin/bash
set -x

while true; do
    # Проверки
    command -v peco >/dev/null || { echo "Требуется утилита peco"; exit 1; }

    # Выбор модуля
    selected_module="$(find ~/modules -maxdepth 1 -type f | sed 's|.*/||' | peco)"

    if [ -z "$selected_module" ]; then
        echo "Выход из скрипта."
        break
    fi

    # Путь к файлу спецификации модуля
    spec_file="$HOME/.config/special_file_${selected_module}.txt"
   
   # Ищем и удаляем битые символические ссылки в системе
   echo "Поиск и удаление битых ссылок: ЖДИТЕ"
    sudo find /usr /var /etc -depth -type l ! \( -path /proc -o -path /sys -o -path /dev \) -prune -o -type l ! -exec test -e {} \; -print -delete
    echo "БИТЫЕ ССЫЛКИ УДАЛЕНЫ!"
    # Меню действия
    ACTION=$(echo -e "Активировать\nДеактивировать" | peco --prompt "Выберите действие:")

    case "$ACTION" in

        "Активировать")

            SOURCE_DIR="$HOME/modules/$selected_module"
            TARGET_DIR="/mnt/$(basename "$selected_module" .sb)"

            # Создаем каталог в /mnt с именем выбранного модуля
            sudo mkdir -p "$TARGET_DIR"

            # Монтируем выбранный модуль в /mnt
            sudo mount -t squashfs -o loop "$SOURCE_DIR" "$TARGET_DIR"

            # Создаем файл спецификации с именем модуля
            spec_file="$HOME/.config/special_file_${selected_module%.*}.txt"
            touch "$spec_file"

            # Копируем все файлы и каталоги из модуля в файловую систему
            # и записываем пути символических ссылок в файл спецификации
            sudo cp -rs --no-clobber "$TARGET_DIR"/* /
            find "$TARGET_DIR" -type f -exec echo {} \; | sed "s|$TARGET_DIR||" >> "$spec_file"

            # Продолжаем с остальными действиями, такими как компиляция схем и т.д.
            sudo glib-compile-schemas /usr/share/glib-2.0/schemas/
            sudo ldconfig
            sudo rm -rf ~/.cache/menus/
            sudo update-desktop-database
            lxpanelctl restart

            echo "Модуль АКТИВИРОВАН!"
            sleep 3
            ;;

        "Деактивировать")
            TARGET_DIR="/mnt/$(basename "$selected_module" .sb)"

            # Читаем файл спецификации и удаляем символические ссылки
            xargs -a "$HOME/.config/special_file_${selected_module%.*}.txt" sudo rm -f

            # Удаляем файл спецификации
            rm -f "$HOME/.config/special_file_${selected_module%.*}.txt"

            # Отмонтируем каталог
            sudo umount "$TARGET_DIR"
            sudo rm -rf ~/.cache/menus/
            sudo update-desktop-database
            lxpanelctl restart
            echo "Модуль ДЕАКТИВИРОВАН!"
            sleep 3
            ;;
    esac

    echo "Готово"
done

требует максимальной осторожности в использовании
но на нескольких модулях работает попробую его в паре с скриптом repo2app , посмотрю как себя поведёт
из недостатков десктоп файл символическую ссылку на картинку картинкой не  воспринимает почему-то, но это мелочи , со временем можно пофиксить, тут главное отловить все возможные странные поведения системы, а они есть так что еще раз повторюсь тестировать скрипт в виртуалке или на отдельной как например у меня отведенной для тестов системе.  Буду рад выслушать замечания , критику , и идеи, братцы идеи нужны...
« Последнее редактирование: 14 Апрель 2024, 18:43:45 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 886
  • Репутация: +24/-0
  • Автор темы
 :) нашёл причину почему ломается система ,при дезактивации, дело в том что в файл спецификации попадает всё подряд из /mnt/name_module, так как иду почти на ощупь подрываясь на собственых ошибках, то я не продумал логику, вначале я ввел условие для cp не создавать ссылку на файл и симлинк если он существует, но так как в спек файле он фигурирует то он удалялся, то есть я сносил важные части системы  ??? , достаточно было ввести необходимое условие проверяющее перед удалением файл или смволическая ссылка и всё такое поведение было пресечено.
Внимание код еще сырой использовать на виртуальных машинах либо на системе отведеной для издевательств тестов
код:
Код
#!/bin/bash
set -x

while true; do
    # Проверки
    command -v peco >/dev/null || { echo "Требуется утилита peco"; exit 1; }

    # Выбор модуля
    selected_module="$(find ~/modules -maxdepth 1 -type f | sed 's|.*/||' | peco)"

    if [ -z "$selected_module" ]; then
        echo "Выход из скрипта."
        break
    fi

    # Путь к файлу спецификации модуля
    spec_file="$HOME/.config/special_file_${selected_module}.txt"
   
   # Ищем и удаляем битые символические ссылки в системе
   echo "Поиск и удаление битых ссылок: ЖДИТЕ"
    sudo find /usr /var /etc -depth -type l ! \( -path /proc -o -path /sys -o -path /dev \) -prune -o -type l ! -exec test -e {} \; -print -delete
    echo "БИТЫЕ ССЫЛКИ УДАЛЕНЫ!"
    # Меню действия
    ACTION=$(echo -e "Активировать\nДеактивировать" | peco --prompt "Выберите действие:")

    case "$ACTION" in

        "Активировать")

            SOURCE_DIR="$HOME/modules/$selected_module"
            TARGET_DIR="/mnt/$(basename "$selected_module" .sb)"

            # Создаем каталог в /mnt с именем выбранного модуля
            sudo mkdir -p "$TARGET_DIR"

            # Монтируем выбранный модуль в /mnt
            sudo mount -t squashfs -o loop "$SOURCE_DIR" "$TARGET_DIR"

            # Создаем файл спецификации с именем модуля
            spec_file="$HOME/.config/special_file_${selected_module%.*}.txt"
            touch "$spec_file"

            # Копируем все файлы и каталоги из модуля в файловую систему
            # и записываем пути символических ссылок в файл спецификации
            #sudo cp -rs --no-clobber "$TARGET_DIR"/* /
            sudo cp -rsPn "$TARGET_DIR"/* /
            find "$TARGET_DIR" -type f -exec echo {} \; | sed "s|$TARGET_DIR||" >> "$spec_file"

            # Продолжаем с остальными действиями, такими как компиляция схем и т.д.
            sudo glib-compile-schemas /usr/share/glib-2.0/schemas/
            sudo ldconfig
            sudo rm -rf ~/.cache/menus/
            sudo update-desktop-database
            lxpanelctl restart

            echo "Модуль АКТИВИРОВАН!"
            sleep 3
            ;;

        "Деактивировать")
            TARGET_DIR="/mnt/$(basename "$selected_module" .sb)"

            # Читаем файл спецификации и удаляем символические ссылки
            #xargs -a "$HOME/.config/special_file_${selected_module%.*}.txt" sudo rm -f
xargs -a "$HOME/.config/special_file_${selected_module%.*}.txt" sh -c 'for file do
  if [ -L "$file" ]; then
    sudo rm -f "$file"
  else
    echo "Skipping real file: $file"
  fi
done'
            # Удаляем файл спецификации
            rm -f "$HOME/.config/special_file_${selected_module%.*}.txt"

            # Отмонтируем каталог
            sudo umount "$TARGET_DIR"
            sudo rm -rf ~/.cache/menus/
            sudo update-desktop-database
            lxpanelctl restart
            echo "Модуль ДЕАКТИВИРОВАН!"
            sleep 3
            ;;
    esac

    echo "Готово"
done

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

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 34007
  • Репутация: +231/-0
    • PuppyRus-A
Надо ли изобретать? Не лучше ли передрать проверенный код у Тинкоре?

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 886
  • Репутация: +24/-0
  • Автор темы
Надо ли изобретать? Не лучше ли передрать проверенный код у Тинкоре?
я смотрел и ничего не понял, у них всё завязано на инсталятор программ, и это не один скрипт ,там этим занимается группа скриптов, каждый выполняет свою функцию,инсталятор по ходу монтирует squashfs модуль, далее пробрасываются симлинки , у них всё завязано на свою структуру, вероятно всё делает tce-load вот он https://disk.yandex.ru/d/u_3Vw1tHA31-Aw
по сути они делают всё тоже самое  к чему я пришёл, и им проще потому что , сама система упрощеная её взаимосвязи труднее нарушить, большую систему проще ушатать , потому модули нужно тщательно тестировать перед распространением, ну и сам скрипт дорабатывать, мне проще сделать всё заново, чем понять как это работает в tinyCore, а скопировать напрямую вы же сами  понимаете что это так не работает...
« Последнее редактирование: 12 Апрель 2024, 12:06:33 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 886
  • Репутация: +24/-0
  • Автор темы
По результатам тестирования последнего скрипта
Код
#!/bin/bash
set -x

while true; do
    # Проверки
    command -v peco >/dev/null || { echo "Требуется утилита peco"; exit 1; }

    # Выбор модуля
    selected_module="$(find ~/modules -maxdepth 1 -type f | sed 's|.*/||' | peco)"

    if [ -z "$selected_module" ]; then
        echo "Выход из скрипта."
        break
    fi

    # Путь к файлу спецификации модуля
    spec_file="$HOME/.config/special_file_${selected_module}.txt"
   
   # Ищем и удаляем битые символические ссылки в системе
   echo "Поиск и удаление битых ссылок: ЖДИТЕ"
    sudo find /usr /var /etc -depth -type l ! \( -path /proc -o -path /sys -o -path /dev \) -prune -o -type l ! -exec test -e {} \; -print -delete
    echo "БИТЫЕ ССЫЛКИ УДАЛЕНЫ!"
    # Меню действия
    ACTION=$(echo -e "Активировать\nДеактивировать" | peco --prompt "Выберите действие:")

    case "$ACTION" in

        "Активировать")

            SOURCE_DIR="$HOME/modules/$selected_module"
            TARGET_DIR="/mnt/$(basename "$selected_module" .sb)"

            # Создаем каталог в /mnt с именем выбранного модуля
            sudo mkdir -p "$TARGET_DIR"

            # Монтируем выбранный модуль в /mnt
            sudo mount -t squashfs -o loop "$SOURCE_DIR" "$TARGET_DIR"

            # Создаем файл спецификации с именем модуля
            spec_file="$HOME/.config/special_file_${selected_module%.*}.txt"
            touch "$spec_file"

            # Копируем все файлы и каталоги из модуля в файловую систему
            # и записываем пути символических ссылок в файл спецификации
            #sudo cp -rs --no-clobber "$TARGET_DIR"/* /
            sudo cp -rsPn "$TARGET_DIR"/* /
            find "$TARGET_DIR" -type f -exec echo {} \; | sed "s|$TARGET_DIR||" >> "$spec_file"

            # Продолжаем с остальными действиями, такими как компиляция схем и т.д.
            sudo glib-compile-schemas /usr/share/glib-2.0/schemas/
            sudo ldconfig
            sudo rm -rf ~/.cache/menus/
            sudo update-desktop-database
            lxpanelctl restart

            echo "Модуль АКТИВИРОВАН!"
            sleep 3
            ;;

        "Деактивировать")
            TARGET_DIR="/mnt/$(basename "$selected_module" .sb)"

            # Читаем файл спецификации и удаляем символические ссылки
            #xargs -a "$HOME/.config/special_file_${selected_module%.*}.txt" sudo rm -f
xargs -a "$HOME/.config/special_file_${selected_module%.*}.txt" sh -c 'for file do
  if [ -L "$file" ]; then
    sudo rm -f "$file"
  else
    echo "Skipping real file: $file"
  fi
done'
            # Удаляем файл спецификации
            rm -f "$HOME/.config/special_file_${selected_module%.*}.txt"

            # Отмонтируем каталог
            sudo umount "$TARGET_DIR"
            sudo rm -rf ~/.cache/menus/
            sudo update-desktop-database
            lxpanelctl restart
            echo "Модуль ДЕАКТИВИРОВАН!"
            sleep 3
            ;;
    esac

    echo "Готово"
done

остаюсь более чем довольным код стабилизировался, работает хорошо, файловую систему не портит, еще пару дней покручу и скрипт в топик . Напомню я использую sb модули, вы можете использовать какие угодно, главное чтоб указали это в 31 строке скрипта а также в 61 строке (строка TARGET_DIR="/mnt/$(basename "$selected_module" .sb)"), замените расширение sb на расширение ваших модулей, скрипт будет их искать  в ~/modules

upd: И ведь krasnyh говорил об этом---
Как просто. ) Но у нас ведь копирование создание ссылок в /. И чтобы потом удалять, надо как минимум список иметь созданных ссылок, и лучше с точной датой до секунды, чтоб лишнего не удалить.--- прислушался  я бы тогда к его словам , скрипт был бы уже тогда написан, но я тогда вероятно даже не совсем понял о чём речь, но ум помню точно зацепился за эти слова, и за слова сказанные остальными участниками темы, мужики спасибо вам!

upd2: Скрипт удаляет только ссылки, ему запрещено удалять файлы, если вы забыли дезактивировать модуль, после перезагрузки , ссылки станут битыми и при запуске заново скрипта менеджера модулей, скрипт сначала удалит все битые ссылки, и только потом создаст новые.

upd3: Написал вернее переделал скрипт для appimage для добычи ресурсов для модулей, и их создания используя репозиторий debian 12 процесс полностью автоматизирован, скрипт назвал repo2sb,  Хочу протестировать скрипты и посмотреть на переносимость, буду пробовать на 2-х своих кастомных live-kit , а так же на minios, если результаты удовлетворят будет публикация в топик темы, на одном дистрибутиве с lxde , с него сейчас пишу, результат просто вдохновляющий!
« Последнее редактирование: 12 Апрель 2024, 22:05:31 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 886
  • Репутация: +24/-0
  • Автор темы
подумал а чего тянуть вот код скрипта для создания модулей как и говорил расчитан для debian
Код
#!/usr/bin/env bash
#set -x
mkdir -p ~/apptool
cd ~/apptool
# Проверка наличия инструментов
#if [ ! -f appimagetool ]; then
  #wget -q https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O appimagetool
  #chmod a+x appimagetool
#fi

if [ ! -f pkg2appimage ]; then
  wget -q https://raw.githubusercontent.com/ivan-hc/AM-application-manager/main/tools/pkg2appimage
  chmod a+x pkg2appimage
fi
# Установка необходимых зависимостей
sudo apt install imagemagick binutils

# Создание временной директории
mkdir -p tmp
cd tmp



# Создание файла рецепта
echo "app: $1
ingredients:" > recipe.yml

cat >> recipe.yml <<EOF
  dist: debian
  arch: $(arch)
  sources:
    - deb http://deb.debian.org/debian/ stable main contrib non-free 
    - deb http://deb.debian.org/debian/ stable-updates main contrib non-free
    - deb http://security.debian.org/debian-security stable/updates main contrib non-free
  packages: 
    - $1 
EOF

# Скачивание пакетов и сборка APPDIR
~/apptool/pkg2appimage ./recipe.yml   

# Копируем каталог с ресурсами в ~/portapps
echo "Копируем каталог с ресурсами в ~/portapps "
mkdir -p ~/portapps/$1.AppDir
cp -r ./$1/$1.AppDir ~/portapps/
cd ~/portapps/$1.AppDir
# Имя файла из десктоп-файла
requested_filename=$(grep -m 1 -o '^Icon=.*' *.desktop | cut -d '=' -f 2-)
echo "$requested_filename"
# Переименовываем app.png
#cd ~/portapps/$1.AppDir
image="$(find /usr/share/icons/gnome/48x48/apps/ -name "$requested_filename.png")"
# Добавляем изображение app.png в ~/portapps/$1.AppDir
cp "$image" ~/portapps/$1.AppDir/

# Сборка AppImage
#ARCH=$(arch) ~/apptool/appimagetool -n ~/portapps/$1.AppDir

cd ~/apptool
rm -rf ./tmp
cd ~/portapps/$1.AppDir
rm ./AppRun
rm ./*desktop
for locale in $(ls ~/portapps/$1.AppDir/usr/share/locale/ | grep -Ev "en|ru"); do
    rm -rf ~/portapps/$1.AppDir/usr/share/locale/$locale
done
rm -rf ~/portapps/$1.AppDir/usr/share/man/*
rm -rf ~/portapps/$1.AppDir/usr/share/help/*

cd ..
mksquashfs ./"$1.AppDir" ./"$1.AppDir".sb -comp gzip -b 256K -Xcompression-level 9

« Последнее редактирование: 12 Апрель 2024, 22:12:17 от totiks2012 »

Оффлайн krasnyh

  • Ветеран
  • *****
  • Сообщений: 5344
  • Репутация: +139/-1
Проверил скрипт mod_man в вирте на roll2305-23.06-x86_64.iso. Вроде нормально отработал, только пустые папки не удаляет в /mnt.

Приложил лог, как это выглядит в данной сборке и в арче в частности.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 886
  • Репутация: +24/-0
  • Автор темы
только пустые папки не удаляет в /mnt.
да это моё упущение... но эти пустые папки ни на что не влияют, но для эстетики да можно их и удалить, я внесу эту правку в код.

О значит переносимость и повторяемость в наличии! Спасибо за тест!
« Последнее редактирование: 13 Апрель 2024, 08:20:09 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 886
  • Репутация: +24/-0
  • Автор темы
Всё скрипты в топике темы! Сердечное Спасибо всем кто участвовал !

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 886
  • Репутация: +24/-0
  • Автор темы
Проанализировав последний скрипт еще раз, увидел что пользовательский опыт, способ взаимодействия скрипта менеджера модулей mod_man можно сильно улучшить.
Этот скрипт представляет собой простой и удобный в использовании менеджер модулей для Linux. Он позволяет активировать и деактивировать модули, а также выбирать,
загружать их на постоянной основе или только для текущего сеанса.

Как использовать

Запустите скрипт с помощью bash mod_man.sh или сделайте его исполняемым с помощью chmod +x mod_man.sh и запустите его с помощью ./mod_man.sh.
Выберите действие: активировать или деактивировать.
Если вы решите активировать модуль, выберите, загружать его постоянно или только для текущего сеанса.
Выберите модуль, который вы хотите активировать или деактивировать.
Скрипт позаботится обо всем остальном!
Описание скрипта
Скрипт выполняет следующие действия:

Проверяет, установлена ​​ли утилита peco. В противном случае сценарий завершается с сообщением об ошибке.
Предлагает пользователю выбрать действие: активировать или деактивировать.
Если пользователь решает активировать модуль, сценарий предлагает ему выбрать, загружать ли его постоянно или только для текущего сеанса.
Скрипт ищет доступные модули в каталоге ~/modules и отображает их в списке с помощью peco.
Выбранный модуль монтируется в каталог /mnt.
Скрипт создает файл со спецификациями модуля в каталоге ~/.config.
Скрипт создаёт символические ссылки на все файлы и каталоги из модуля в файловую систему и записывает пути символических ссылок в файл со спецификациями модуля.
Скрипт выполняет дополнительные действия, такие как составление схем и обновление базы данных рабочего стола.
Если пользователь выбрал постоянную загрузку модуля, скрипт создает постоянный файл, скрипт автозагрузки и файл рабочего стола для выбранного модуля.
Если пользователь решает деактивировать модуль, сценарий ищет смонтированные модули в каталоге ~/.config и отображает их в списке с помощью peco.
Скрипт читает файл со спецификациями модуля и удаляет символические ссылки.
Скрипт размонтирует каталог модуля и удалит его.
Скрипт обновляет базу данных рабочего стола.
Если модуль был загружен постоянно, скрипт удаляет постоянный файл, скрипт автозагрузки и файл рабочего стола для выбранного модуля.
Примечание. Для выполнения некоторых действий сценарий использует sudo, поэтому убедитесь, что у вас есть необходимые разрешения.
  В итоге скрипт предоставляет полноценный Менеджер модулей, и похож свой функциональность на тот что был в старом puppy linux 2.7-3.0, там правда утилиты были разделены по своим Gui
код во вложении, для публикации напрямую великоват

прошу тестов .
upd: Этот скрипт будет работать на любом linux дистрибутиве , будь он live или нет.
« Последнее редактирование: 15 Апрель 2024, 19:00:06 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 886
  • Репутация: +24/-0
  • Автор темы
Улучшил код добавил метку `*` в выводе peco смонтированым модулям, теперь много удобнее стало визуально отличать смонтированый модуль от не смонтированого. Архив со скриптом во вложении, а так же скачать можно по адресу https://disk.yandex.ru/d/BmbKDpNClnMIMQ

upd: выполняю  просьбу ИИ  Код был написан в соавторстве с ИИ https://chat.mistral.ai/
« Последнее редактирование: 24 Апрель 2024, 21:40:05 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 886
  • Репутация: +24/-0
  • Автор темы
исправил ошибку в mod-man.sh , при активации модуля только на одну сессию , после перезагрузки оставалась метка о том что модуль активирован, по логике метка индицирующая что модуль активирован, так как активация только на одну сессию  после перезагрузки метка должна была быть удалена, в коде был заложен этот функционал, но я не доглядел и код попал не в ту секцию. После того как исправил код работает правильно.