Решаю характерную для Linux проблему отсутствия каталога "Program Files"
Многие вероятно знают, что в Linux просто нет места для портативного софта, в папке пользователя хранить приложения не принято, а домашний каталог быстро превращается в помойку, в системных папках всё ограничено правами доступа, и куда деваться разработчикам? Подстраиваться и переучивать огромную массу "вендузятников" делать по другому? Я не собираюсь подстраиваться ущемляя себя в возможностях!
реклама
Вижу только один действительно простой и рабочий выход, это создать каталог "portsoft", прямо в корне файловой системы, так нагло и дерзко:
Ох, уже предвкушаю вопли недовольных "безопасностью" такого решения, и на словах даже будут правы, ведь предполагается, что каталог доступен для записи кому угодно, а значит заразить вирусами проще простого, пользователю не надо даже root пароль вводить для доступа к этому месту, хотя на самом деле линуксоидные ограничения что есть, что их нет, настоящие вандалы всегда найдут способ всё сломать:
Спойлер, несколько команд и root права в кармане, даже без помощи загрузочной флешки с другим линуксом. Б - безопасность...
реклама
Так о чём это я...
Мне нужна такая "небезопасная" папка для размещения своего же софта, который специально разработан таким образом, чтобы свести к минимуму любой мусор генерируемый в каких-либо других местах системы, и пользователю не приходилось выковыривать файлы настроек по всей системе при переносе на другой ПК:
Но делать папку как в Windows не лучшая идея, ведь существуют как 32 битные приложения, так и 64 битные, причём для разных архитектур, например ARM, хотя мой дистрибутив в первую очередь предназначен для x86/x86_64, но сама возможность унификации не будет лишней:
реклама
Причём не только нативные приложения могут быть расположены в папке "portsoft", но и такие вещи как скрипты, собственно почему нет?
Папка "other" тоже не просто так существует, она предназначена для всего, что не входит в основные категории... По идее ей не место в "Program Files", но если это будет удобно и практично в реальном использовании, я ничего против "неподобающего использования" не имею.
реклама
Для проверки жизнеспособности своих идей в реальности было решено начать с простого, заодно создал явно необходимый раздел меню "Пуск", который содержит только скрипты:
И сразу же выявилось несколько нюансов... Скрипт Terminalix нужно переделывать, слишком уж много ярлыков для своей работы он требует, но это мелочи, важно другое, нужно сделать "инсталлятор", чтобы пользователь не раскидывал вручную файлы по нужным папкам, а таких мест всего два, собственно каталог "Program Files" (/softport), и каталог ярлыков меню "Пуск" (/usr/share/applications).
Можно конечно заняться извращением используя DEB пакеты для установки софта, но пожалуй воздержусь от этой жути, да и наверняка у многих сложились нехорошие ассоциации с этими пакетами, особенно у людей, которые пытались устанавливать софт в линуксах без доступа к интернету...
Так как мне надоело вручную через терминал обновлять меню "Пуск" после изменений, на скорую руку была написана малюсенькая bash портянка, которая позволяет всё сделать кликом мыши вместо возни с терминалом, и да, вот я начал использовать команду "terminal":
Хотя ладно, сейчас нет смысла вызывать "terminal", это может сделать XDG система заведующая "ярлыками":
И так, есть два файла, скрипт и ярлык, как это установить в систему?
Начну с простого, а именно установочного скрипта!
Есть у такого подхода только одна проблема, скрипты нужно запускать через терминал, но с этим можно что-нибудь придумать позже:
Начинаем писать установочный скрипт, первым делом определяем путь к установочному файлу, именно он будет считаться исходным рабочим каталогом на время установки:
ScriptDir="$( dirname "$(readlink -f "$0")")"
...
В общем, хотел попроще, но получилось "как всегда", в процессе написания скрипта выявился неприятный нюанс, а что если у пользователя отобрали права доступа за пределами домашнего каталога? Ведь у меня не предусмотрен вариант установки в домашний каталог, значит нужно исправить недоразумение!
Долго думать не пришлось, каталог "portsoft" будет расположен прямо в папке ".local", и его структура идентична общедоступному системному каталогу:
В чём собственно разница между системным и пользовательским каталогом? Может показаться что системный больше не нужен, но вдруг на одном ПК работает несколько людей? Правильно, установленный софт в папку "/portsoft" будет доступен всем, а установленный в "~/.local/portsoft" только одному пользователю, в этом и разница.
Если человек не желает "делится" приложением с остальными пользователями ПК, значит устанавливать нужно в режиме "User Only", выглядит просто, но добавляет мне дополнительной работы...
Похоже я немного увлёкся, и скрипт получился сложнее чем хотелось бы, наверное стоило пренебречь элементарной обработкой возможных ошибок:
Осталось только решить одну маленькую проблему, нужно написать функцию автоматического исправления путей к исполняемому файлу в соответствии с каталогом установки:
Готово! Немного "sed" колдовства и всё подставилось как надо, правда есть проблема, оно не будет работать если ярлык в зоне "root", но это уже мелочи, просто нужно будет дописать костыль, вызывающий команду через sudo при ошибке:
Пожалуй хватит для начала, иначе можно бесконечно дорабатывать установочный скрипт:
Хм, есть проблема, кто-то ведь наверняка попытается использовать такой скрипт за пределами моего дистрибутива Chimbalix, и столкнётся с проблемой отсутствующего каталога "portsoft", а значит нужно исправить недоразумение отдельным скриптом:
Ничего сложного, берём "заготовку" и копируем содержимое в подготовленные командой mkdir каталоги, для системного всё нужно делать с root правами по понятным причинам, главное не забыть про чмод (chmod) 777 разрешающий полный доступ на чтение/запись, однако в каталоге пользователя особые права не нужны.
Хотя...
Если открыть полный доступ для всех на системный каталог, то можно будет легко удалить подкаталоги вроде "x86", "x86_64", это не есть хорошо, нужно чтобы у пользователя должна быть свобода действий внутри подкаталогов, но не на удаление "корня" целиком:
Конкретно эти папки нужно защитить от случайного удаления, но при этом не создавать лишние проблемы, например флагом "immutable" на корневом каталоге, который распространяется и на внутренности вплоть до одного уровня:
Вероятно разработчики захотят создать особые категории, например для софта под ARM архитектуру, флаг предотвращающий изменения будет только мешать, ведь даже с root правами невозможно изменить ничего, пока не будет снят флаг...
Выход есть, достаточно ограничить права на главную папку, но открыть полный доступ к внутренностям, эта защита от дурака конечно вносит ограничения, но эти ограничения не доставляют проблем, так как в абсолютном большинстве случаев пользователю не надо удалять "Program Files" целиком, а вот содержимое совсем другое дело:
Конечно я потерял содержимое папок в ходе экспериментов, вот же незадача, но такова расплата за опыт полученный в ходе многократных тестов, и напоминание, что всегда нужно иметь резервные копии важной информации...
Осталось дело за малым, описать принцип работы каталогов, естественно с примерами использования, чтобы не возникало лишних вопросов "а как сделать", само собой в моём дистрибутиве делать это всё не надо, но пользователи других дистрибутивов могут захотеть себе такую же "систему":
Если вкратце: Системная папка portsoft доступна только для чтения, чтобы предотвратить случайное удаление со стороны обычного пользователя, это защищает и вложенные папки "категорий" от случайного удаления, но внутри "категорий" (например x86_64) у всех есть полный доступ, что позволяет хранить все настройки рядом с приложением, без размазывания по всяким ".config", ".cache" и т.п., а так же легко перенести всё разом на другой ПК.
Конечно, есть "проблема" безопасности, ведь пользователь может что угодно сделать с приложениями в "Program Files", но это уже проблемы пользователя, если надо - значит надо, а вирусы это отдельная история, нормальному вирусу обычно плевать, как сильно всё "закрыто" и "заблокировано" правами доступа...
Так что я выбираю меньшее из зол, а именно свободный и удобный в использовании каталог для программ, ну а кто до усрачки боится "подхватить вирус", ну извольте, тут всем не угодить, полагаю таким людям нормально и в других дистрибутивах живётся, с вводом root пароля при любом действии, чтобы наверняка "безопасно" было.
Перед загрузкой в репозиторий следует всё перепроверить... Отлично, всё создалось как положено, в том числе установились права доступа, так как у меня отключен root пароль, то никаких уведомлений ввода пароля не появлялось, хм, нужно бы проверить в другом дистрибутиве:
Например, в злополучной Ubuntu 22.04 с кривым меню "Пуск" и отвратительной цветовой схемой терминала, что даже на скриншотах без сжатия тёмно-голубой текст сложно прочитать на тёмном, пурпурно-красном фоне, брр:
Так как GNOME поделки слишком недоразвиты в плане практичности, особенно с кривым Wayland окружением, я не могу перетащить в сторонку окно свойств выбранного файла/папки, но в целом и так ясно, что всё работает как надо:
Наконец можно загрузить результат своих трудов в репозиторий!
https://github.com/Shedou/Chimbalix
Пожалуй на этом закончу статью, вообще делится наработками до выпуска даже Alpha версии дистрибутива Chimbalix как-то не очень правильно, но это всяко лучше, чем жевать сопли, оправдывая вечно кривые, непрактичные и неполноценные линуксы в Desktop сегменте...
Благодарю за внимание, больше интересных статей в блоге Hard-Workshop.
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Комментарии Правила