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

Автор Тема: Доработки PFS-utils  (Прочитано 9239 раз)

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

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
  • Автор темы
Доработки PFS-utils
« : 19 Ноябрь 2015, 18:01:46 »
Залез в pfsload, пока еще не все разобрал, но то, что он подключает слой к aufs  в режиме ro - мне кажется неправильным.
Должно быть rr+wh, а то даже файл затенить нельзя.

UPD
Вообще нахожу в pfsload много странного.
Например, не понимаю, что делает эта функция
Код
MENUC(){                                                                                                                                                                
        dt="$(find "${mountpoint}/usr/share/applications" "${mountpoint}/usr/local/share/applications" -type f -name "*.desktop" 2>/dev/null)"                          
        if [ "$dt" ] ;then                                                                                                                                              
            for i in $dt ;do                                                                                                                                            
                cp "$i" "$(dirname "`echo "$i" |sed 's#'"$mountpoint"'##'`")" &                                                                                        
            done                                                                                                                                                        
        fi                                                                                                                                                              
}
Вызывается она уже после подключения слоя в aufs, вроде бы файлы, что она копирует, и так должны быть видны на тех местах, куда зачем-то копируются

А такое
Код
for font_dir in "${mountpoint}/usr/share/fonts/TTF"  "${mountpoint}/usr/X11R6/lib/X11/fonts/TTF" "${mountpoint}/usr/share/fonts/default/TTF" ;  do              
        if [ -d "${mountpoint}/${font_dir}" ]; then                                                                                                            
                fc-cache -f -s &.                                                                                                                              
                mkfontscale ${font_dir} &.                                                                                                                      
                mkfontdir ${font_dir} &                                                                                                                        
        fi                                                                                                                                
done
вообще работать не может, поскольку mountpoint приписан дважды, а такой директории нет, да и запускать mkfontdir в RO файловой системе тоже как-то странно.

То ли я чего-то еще недопонял, то ли там полфайла править надо.
« Последнее редактирование: 20 Ноябрь 2015, 00:20:11 от ander »

Оффлайн Pro

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 10737
  • Репутация: +113/-2
Доработки PFS-utils
« Ответ #1 : 20 Ноябрь 2015, 02:55:07 »
По второй конструкции могу сказать что это определяет есть ли шрифты в модуле, и если есть, то обновляет кеш шрифтов. /usr/X11R6/lib/X11/fonts/TTF очень даже есть, только не в arch linux.
Я загружаю новые пакеты сюда: http://file.puppyrus.org/users/ а дальше можно найти самостоятельно.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
    • PuppyRus-A
Доработки PFS-utils
« Ответ #2 : 20 Ноябрь 2015, 09:06:01 »
rr+wh - я не настолько глубоко в этой теме. Дядя Шурик (наш главный спец AUFS) почему-то отмалчивается...
Что это даст с практической точки зрения?

desktop - мой костыль. Инициирует обновление меню. Т.к. построителей меню несколько - не уверен что везде работает
По другому - типа inode не отследить (пробовали с Дядей Шуриком). В идеале надо бы доразобраться

TTF ${mountpoint}- уверены что нет? Мутная тема (для меня) - вроде и без этого (mkfontscale...) работает

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
  • Автор темы
Доработки PFS-utils
« Ответ #3 : 20 Ноябрь 2015, 11:36:54 »
Насколько понял из описаний aufs, ro от rr отличается следующим:
вот собрали вы какую-то директорию на aufs, например, корневую, и указали, что слои туда вставлены в режиме ro.
Это означает, что при попытке записать что-то в эту директорию, на слои ro ничего писаться не будет.
Но что такое сам по себе слой?  Это директория, существующая где-то в другом месте, например, /mnt/live/memory/images/abcd/
И сама эта директория-слой может иметь разные права на запись.  Туда может быть и смонтирован squashfs, который принципиально readonly, но вполне может быть и что-то записываемое типа ext4.  Тогда, при записи файла непосредственно в директорию-слой, этот файл появится и в  aufs.  Поэтому при подключении слоя в режиме ro драйвер aufs  должен отслеживать, не изменился ли исходный слой и добавляеть в aufs изменения.
Режим же rr указывает на то, что исходный слой сам по себе доступен только на чтение и отслеживать изменения в нем не нужно.
С +wh дело обстоит так:
Имеем мы два слоя.  В первом существует файл /home/live/aaa.txt, во втором его тень /home/live/.wh.aaa.txt
Вставляем второй слой выше первого.  Если с +wh - файл исчезнет, тень его закрыла, если без +wh - файл останется видимым, тень просто проигнорируется.

Код
for font_dir in "${mountpoint}/usr/share/fonts/TTF"  "${mountpoint}/usr/X11R6/lib/X11/fonts/TTF" "${mountpoint}/usr/share/fonts/default/TTF" ;  do              
        if [ -d "${mountpoint}/${font_dir}" ]; then                                                                                                             
                fc-cache -f -s &.                                                                                                                               
                mkfontscale ${font_dir} &.                                                                                                                     
                mkfontdir ${font_dir} &
делаем подстановку переменных.  Получаем:
[ -d /mnt/.<имя модуля>/mnt/.<имя модуля>/usr/share/fonts/TTF ]  - нет таких директорий, лишняя подстановка mountpoint

mkfontscale /mnt/.<имя модуля>/usr/share/fonts/TTF  - а эта директория на запись недоступна

Конструкция не работает.
Шрифты работают только потому, что добавлены из одного модуля и fonts.dir, fonts.scale там уже есть.  Если бы другой модуль попытался добавить свои шрифты, проблема бы вылезла.
Надо:
Код
for font_dir in "/usr/share/fonts/TTF"  "/usr/X11R6/lib/X11/fonts/TTF" "/usr/share/fonts/default/TTF" ;  do 

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
    • PuppyRus-A
Доработки PFS-utils
« Ответ #4 : 20 Ноябрь 2015, 11:49:19 »
В initrd я уже правил mount ... =rr на =rr+wh - в итоге стло возможным удалять в сохраненке файлы из aufs
Если это - да лучше поправить. Правьте - выкладывайте. ttf тоже
Переношу в pfs-util

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
Доработки PFS-utils
« Ответ #5 : 20 Ноябрь 2015, 14:09:18 »
Надо:
Код
for font_dir in "/usr/share/fonts/TTF"  "/usr/X11R6/lib/X11/fonts/TTF" "/usr/share/fonts/default/TTF" ;  do 
А надо ли? У вас проверяется вся система, а надо только подключаемый слой.
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
    • PuppyRus-A
Доработки PFS-utils
« Ответ #6 : 20 Ноябрь 2015, 15:25:45 »
надо только подключаемый слой.

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
  • Автор темы
Доработки PFS-utils
« Ответ #7 : 20 Ноябрь 2015, 23:51:11 »
Там строчкой ниже идет
if [ -d "${mountpoint}/${font_dir}" ]; then
И когда под for были "${mountpoint}/usr/share/fonts/TTF", то ${mountpoint} добавлялся два раза и не искалось вообще нигде.

Малость переписал pfsload.
Кое-что сократил, типа поиска свободного loop и монтирования pfs  в два этапа, сначала связыванием через losetup, а потом монтирования loop блочного устройства.  Чем это лучше обычного mount -o loop ?
Может, зря сократил?

Повысил читабельность тем, что после операции проверяется неудачное завершение и следует выход, а не так, как было:
if [ $? -eq 0 ], потом операции, опять куча вложенных if, а все else с выходами в самом конце, в результате фиг разберешь, какое условие куда вложено и на каком уровне вложенности текущая строка стоит.

В некоторых местах применил условия типа [[ выражение1 || выражение2 ]], теперь вот думаю, эта конструкция специфична только для bash, или нет и может ли где-то pfsload оказаться без bash?

Функцию MENUC пока закомментировал, не понял, зачем она копирует файлы фактически сами в себя и на что это влияет.
В pra1510 game хоть с этой функцией, хоть без нее при подключении libreoffice в меню xfce, которое по правой кнопке на рабочем столе, libreoffice есть, а в whisker меню его нет.  Надо почитать чего-нибудь, где вообще эти меню настраиваются.  А pfsload тут, похоже, ни при чем.

Если слой сам ro, то в aufs вставляется как rr+wh, иначе как ro+wh
Некоторые конструкции переписал покомпактнее.
В общем-то, основную логику не трогал, у себя тестировал, вроде работает как положено.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
    • PuppyRus-A
Доработки PFS-utils
« Ответ #8 : 21 Ноябрь 2015, 09:06:39 »
Кое-что сократил, типа поиска свободного loop и монтирования pfs  в два этапа, сначала связыванием через losetup, а потом монтирования loop блочного устройства.  Чем это лучше обычного mount -o loop ?
Может, зря сократил?
Возможно делалось еще под старое ядро и aufs. Хорошо бы здесь Дядю Шурика услышать...
может ли где-то pfsload оказаться без bash?
Вряд ли, но bashизма лучше избегать
Функцию MENUC пока закомментировал, не понял, зачем она копирует файлы фактически сами в себя
Я же писал - мой костыль для инициирования обновления меню. Делал под jwm. Возможно под каждую ДЕ придется отдельно
lxde - killall menu-cashed && rm ~/.cache/menus/* && lxpanelctl restart
xfce - даже не знаю как
« Последнее редактирование: 23 Ноябрь 2015, 09:06:07 от sfs »

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
Доработки PFS-utils
« Ответ #9 : 21 Ноябрь 2015, 09:20:00 »
Может, зря сократил?
Не зря, всё правильно.
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
  • Автор темы
Доработки PFS-utils
« Ответ #10 : 23 Ноябрь 2015, 22:04:32 »
Цитата
Возможно под каждую ДЕ придется отдельно
lxde - killall menu-cashed && rm ~/.cache/menus/* && lxpanelctl restart
xfce - даже не знаю как

В таком случае надо это выносить в отдельную утилиту.  Например fixmenus, которая сейчас не работает.  И пусть каждый DE тащит с собой свою собственную версию fixmenus.  Тогда в pfsload достаточно будет fixmenus запустить, не заботясь о том, в какой версии дистрибутива работаем.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
    • PuppyRus-A
Доработки PFS-utils
« Ответ #11 : 24 Ноябрь 2015, 09:03:13 »
надо это выносить в отдельную утилиту. 
да

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
  • Автор темы
Доработки PFS-utils
« Ответ #12 : 24 Ноябрь 2015, 21:11:49 »
Меню пока не вынес, разобраться надо, как вообще с ним работать.
Еще раз прошелся по pfsload, убрал специфичные для bash конструкции условий, убрал функцию MENUC - все равно ни на что не влияет, убрал многочисленные sync - не вижу в них смысла, ничего доступного на запись мы здесь не монтируем, убрал многие перенаправления в /dev/null - когда все идет нормально, в тех местах все равно ничего не выводится, а если что-то пошло не так - то это лучше видеть, а не сбрасывать в null.  В остальном все работает как и раньше.

Прошелся и по pfsunload.  Изменил обработку ошибок так же как в pfsload -  $? не 0 - ругательство и выход, иначе идем дальше, а не так как было с вложенными условиями на $? = 0.  Работает точно так же, но в тексте разобраться проще.
Убрал излишние проверки.  Зачем, к примеру, проверять, поддерживает ли ядро pfs в утилите размонтирования?  И так ясно, что раз смонтировали, значит поддерживает. :)
Точка монтирования теперь ищется не в /mnt, а в слоях aufs.  В результате можно отключать не только то, что подключили через pfsload, но и то, что подключилось из modules при загрузке.  Почему-то до сих пор в pfsunload это не предусматривалось.
Всяческие кэши при отключении теперь обновляются по тем же условиям, что и при подключении, а вот модули ядра выгружаются до отключения слоя от aufs - ведь возможно подходящий modules.dep находится именно на этом слое.

Дальше думаю вынести обновления кэшей отдельно, поскольку что в pfsload, что в pfsunload, получилось, написано одно и то же.
Кто бы вот еще занялся написанием fixmenus под разные оконные менеджеры, а то я вообще в этой теме полный ноль, разбираться придется долго.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
    • PuppyRus-A
Доработки PFS-utils
« Ответ #13 : 25 Ноябрь 2015, 10:10:37 »
Правки забрал.
Обновление меню:
jwm: jwm_menu_refresh
openbox
xfce - не знаю и возможно там вообще нет этой проблемы

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
  • Автор темы
Доработки PFS-utils
« Ответ #14 : 26 Ноябрь 2015, 09:30:45 »
Вынес апдейты кэшей из pfsload/pfsunload в отдельную утилиту.
Оттуда же запускается fixmenus.  fixmenus сделал под game сборку, с xfce.  Работает, но с проблемой: как заставить whiskermenu перечитать *.desktop не нашел, по сигналу оно просто прибивается и панель его перезапускает, при этом меню обновляется.
Но если делать такое чаще, чем раз в минуту (а это вполне может случиться при подключении нескольких модулей подряд) панель начинает вопросы задавать: мол, что-то whiskermenu часто дохнет, перезапускать, или добить, чтоб не мучилось?