91
Программирование и компиляция / Re: Универсальный менеджер монтирования модулей без aufs , overlayfs.
« Последний ответ от sfs 12 Апрель 2024, 11:04:49 »Надо ли изобретать? Не лучше ли передрать проверенный код у Тинкоре?
Не отключайте рекламу на сайте - поможете проекту
x86_64: LFD10-23.05 ; Roll24.02-24.04 ; LFU22 ; FAS ; Alt-lxde3-auc
i686: DDR01-21.08
Русские PuppyLinux
#!/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
Все тоже самое, что не раз уже писалось. Не стартуют иксы с modesseting+mesa.X.Org Смена сервера Позволяет GLAMOR вернуться к программному рендерингу Для устаревших графических процессоров
#!/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
В tineCore же как-то ссылки работают. Этой системе уже много лет... Не смотрели, как у них реализовано?у них потому и система такая маленькая, они максимально обезжирили систему, а потом прокидывают симлинки и так как это поверх очень небольших взаимосвязей то нечему ломаться, в больших же линуксах, на новые симлинки начинаются динамические подключения системы и есть большая вероятность того что она сломается, я так это понимаю, ну ради интереса играюсь с этим https://forum.puppyrus.org/index.php?topic=24216.0 но приделал учет символьных ссылок и их удаление при дезактивации по спек файлу чуть позже выложу скрипт, для идей и обсуждения.
В tineCore же как-то ссылки работают. Этой системе уже много лет... Не смотрели, как у них реализовано?увы не смотрел... Но иду смотреть. Мне интересно.
вынесен в отдельный модуль, такое вот ноу-хау, заради облегчения сборки.Ну а как по другому сделать "маленький и быстрый". Использование аппимиджей быстро превращает его в "жирный и неповоротливый". В этом случае лучше ставить какой-то более традиционный дистр и ставить софт из его репы
как вариант можно создать каждому подключаемому модулю проверку если ссылка есть её не трогать, если нет то создать но прежде записать в специальный (spec) файл, и удалять после перезагрузки эти символические ссылки соотносясь с этим файлом, либо по требованию, то есть создать полноценный менеджер символических ссылок который будет шариться по корневому как у себя дома. (мне от этой идее дурно становится...)... и не зря дурно стало, в иследовательских целях написал скрипт, который неплохо это всё реализует, активирует модуль(пробрасывает символические ссылки во всю ширь, в корневом с проверками битая не битая ) и кроме этого все символические ссылки прописывает в спек с именем модуля, потом можно с помощью этого спек файла удалять эти ссылки то есть деактивировать модуль, ...но система ломается причем весьма быстро, некоторые пакеты запускаются, на некоторых ломается система. В общем молимся на aufs ,пока будут люди которые помнят как ядро компилить с его поддержкой всё будет , без него горячего подключения не видать ... я потому и перешел на appimage .
И, кстати, как это понимать?https://wiki.puppyrus.org/distr#lfd10_x86_64