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

Автор Тема: Подключение PFS c копированием в RAM  (Прочитано 36855 раз)

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

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
  • Автор темы
Подключение PFS c копированием в RAM
« : 17 Октябрь 2012, 12:46:39 »

Тема выделена из: Реализация .PFS (тестирование)

Первая реализация здесь.



Тогда вопрос к sfs:
У меня есть файл /file.pfs, хочу его скопировать в RAM и подключить, что нужно конкретно сделать? И как правильно размонтировать, чтобы память освободилась? Т.е. нужна краткая справка.
« Последнее редактирование: 18 Октябрь 2012, 12:42:48 от Zay »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33955
  • Репутация: +231/-0
    • PuppyRus-A
Подключение PFS c копированием в RAM
« Ответ #1 : 17 Октябрь 2012, 15:11:19 »
http://forum.puppyrus.org/index.php/topic,12727.msg68673.html#msg68673
Если надо в RAM - вместо pfsload модуль.pfs делаем sfs2ram -r модуль.pfs
Названия скриптов меняйте как хотите
После размещения модуля на созданном под него tmpfs RAM диске вызывается pfsload

Обратно - после стандартного отключения вызвать sfs-ram. Если модуль был не в памяти - ничего не произойдет.
Если в памяти - удалит ram диск (очистит память)

В Байт со старой подключалкой все работает.
Вдохновлялся init. Дуракозащищенность (типа 2Гб модуль в 1Гб памяти) присутствует, но возможно мало

http://forum.puppyrus.org/index.php/topic,12727.msg68631.html#msg68631
по 5. (notify) какое решение? Потом переделывать будет сложнее...
« Последнее редактирование: 17 Октябрь 2012, 16:13:51 от sfs »

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
  • Автор темы
Подключение PFS c копированием в RAM
« Ответ #2 : 17 Октябрь 2012, 15:29:40 »
sfs2ram модуль.pfs
Делаю так, не работает... Делаю pfsload модуль.pfs - работает.
Как я понял, pfsload'у не передаётся параметр.

Надо бы доработать, и убрать весь закомментированный код (он затрудняет чтение).
Названия предлагаю pfsramload и pfsramfree.

По notify пока ничего нового. Основные скрипты уже написаны, надо делать альфу, а потом решим как быть.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33955
  • Репутация: +231/-0
    • PuppyRus-A
Подключение PFS c копированием в RAM
« Ответ #3 : 17 Октябрь 2012, 16:43:03 »
Сам уже забыл - надо было sfs2ram -r x.psf
Почистил, убрал -r , перепроверил

Т.к. в pfsramload нет проверок на то что файл squashfs и т.п - в качестве обертки - плохая идея
Лучше вызвать из pfsload при наличии -r после этих проверок
Сделал чтобы просто выводил имя модуля в tmpfs
Ну или поправьте последние строчки - как считаете нужным...

Итог:
pfsramload x.psf
pfsramfree x.psf (достаточно basename)
« Последнее редактирование: 17 Октябрь 2012, 16:46:33 от sfs »

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
  • Автор темы
Подключение PFS c копированием в RAM
« Ответ #4 : 17 Октябрь 2012, 16:57:09 »
Теперь работает.

Предлагаю вызывать в конце pfsload и проверять код возврата, если не 0 - то вызывать pfsramfree. Монтирование может быть неудачным по многим причинам, и если смонтировать не удалось - то надо очистить память.

Функция проверки loop-ов не нужна, она есть в pfsload.
ИМХО, в таком коротком скрипте функции лучше вообще не использовать, читается труднее.
Почему две точки перед названием каталога tmpfs (ИМХО лучше одна)?

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33955
  • Репутация: +231/-0
    • PuppyRus-A
Подключение PFS c копированием в RAM
« Ответ #5 : 17 Октябрь 2012, 17:03:57 »
Предлагаю вызывать в конце pfsload и проверять код возврата, если не 0 - то вызывать pfsramfree.
Да.
Функция проверки loop-ов не нужна, она есть в pfsload.
Тогда уберите всю функцию и ее вызов
Почему две точки перед названием каталога tmpfs (ИМХО лучше одна)?
На мой взгляд так удобнее - не будет смешиваться с монтированными модулями.
Лазать юзеру туда все-равно незачем.
Можно вообще куда-нибудь в /var/run или т.п.
Короче - не принципиально.

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
  • Автор темы
Подключение PFS c копированием в RAM
« Ответ #6 : 17 Октябрь 2012, 17:46:58 »
Примерно так:
Код
#!/bin/bash
#121017 sfslinux@gmail.com for Richy-218. Based on init

s="$1"

RAMSIZE=`free | grep 'Mem:' | tr -s ' ' | cut -f 4 -d ' '` #total physical ram (less shared video).
SIZESFSK=`du -k $s | cut -f 1`
SIZESFSK=$(($SIZESFSK + 1000)) #some slack.
MINRAM2CPY=$(($SIZESFSK * 2)) #100222 technosaurus: in case of very big puppies.
sfs_module="$(basename "$s" .sfs)"
[ $RAMSIZE -gt 280000 ] && [ $RAMSIZE -gt $MINRAM2CPY ] && COPY2RAM="yes" && COPYMSG="$sfs_module copying to ram"
if [ "$COPY2RAM" = "yes" ];then
  st="/mnt/..tmpfs.$sfs_module"
  [ -d $st ] || `which sudo` mkdir -p "$st"
  `which sudo` mount -t tmpfs -o size=${SIZESFSK}k tmpfs "$st"
  `which sudo` cp -af "$s" "$st" && s="$st/`basename "$s"`"
  `which sudo` sync
fi

pfsload "$s"
status=$?
[ $status -gt 0 ] && pfsramfree "$s"

exit $status

Не забываем кавычки везде, пути могут быть с пробелами.
Почему sfs_module (а не pfs_module) - не понял.
И зачем sudo? Всё равно в других скриптах нет...

Ещё неплохо бы предусмотреть случай, когда $1 - симлинк.
И добавить параметры -u/-l (передавать их pfsload).
« Последнее редактирование: 17 Октябрь 2012, 17:53:27 от Zay »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33955
  • Репутация: +231/-0
    • PuppyRus-A
Подключение PFS c копированием в RAM
« Ответ #7 : 17 Октябрь 2012, 17:47:22 »
Примерно так:
Годится
Если модуль окажется кривой - pfsload спалит и отмонтирует
Почему sfs_module (а не pfs_module) - не понял.
Based on init - оттуда
И зачем sudo? Всё равно в других скриптах нет...
Привычка. Чтобы использовать в любом линуксе
Может и у нас не-root приживется
Наверное оптимально 1 раз проверить и далее везде переменная
Можно и убрать. Трюки с sudo актуальны там где есть gui
Ещё неплохо бы предусмотреть случай, когда $1 - симлинк.
И добавить параметры -u/-l (передавать их pfsload)
Тогда может лучше не оберткой, а после проверок и -u/-l
Дублировать - плохая идея

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
  • Автор темы
Подключение PFS c копированием в RAM
« Ответ #8 : 17 Октябрь 2012, 17:54:25 »
Можно вообще куда-нибудь в /var/run или т.п.
Может лучше вообще в /tmp, чтобы после перезагрузки каталог наверняка удалился?

И ещё, не вижу в коде проверки на повторный запуск. Как эта ситуация должна обрабатываться?

Трюки с sudo актуальны там где есть gui
ИМХО, если будет не-root то эти скрипты надо уже вызывать с sudo (там, откуда они будут запущены, например из GUI).

Тогда может лучше не оберткой, а после проверок и -u/-l
Дублировать - плохая идея
Дублирование минимальное, зато логика монтирования и копирования в RAM разделены.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33955
  • Репутация: +231/-0
    • PuppyRus-A
Подключение PFS c копированием в RAM
« Ответ #9 : 17 Октябрь 2012, 18:14:45 »
Может лучше вообще в /tmp, чтобы после перезагрузки каталог наверняка удалился?
Можно но как-то боязно
В /mnt тоже удаляется. Если rc.shutdown поправленный (из Байт). В 216 жестко заточен на pupm*.sfs
И ещё, не вижу в коде проверки на повторный запуск. Как эта ситуация должна обрабатываться?
Да. Надо в начало [ -d /mnt/..tmpfs.$1 ] && exit (лучше сообщение об ошибке)
если будет не-root то эти скрипты надо уже вызывать с sudo (там, откуда они будут запущены, например из GUI).
Да, но если захочется выдать X сообщение об ошибке уже и будут проблемы про которые я писал (если Х запущены не от root)
-u/-lДублирование минимальное, зато логика монтирования и копирования в RAM разделены.
Думаю мои скрипты на отдельные не тянут. И больше нигде использоваться не будут. Может их просто в функцию внутри pfsload переделать?
Я до конца не проникся логикой. Думаю - проще будет мне писать отдельные куски,  а сводить Вам...
« Последнее редактирование: 17 Октябрь 2012, 18:24:50 от sfs »

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
  • Автор темы
Подключение PFS c копированием в RAM
« Ответ #10 : 17 Октябрь 2012, 19:17:16 »
При написании скриптов .pfs я старался следовать правилу: вся серьёзная работа - в исключительно консольных скриптах, а GUI - это обёртки.
С таким подходом наиболее ответственный код не размазан по множеству скриптов, а находится в одном месте, и его можно использовать из других скриптов.

Думаю что и pfsramload надо делать чисто консольным, если понадобится GUI - то в отдельном скрипте.

ИМХО, обёртки - это лучше чем длинные, крайне сложные скрипты, которые выполняют много разных задач. Отдельные скрипты проще читать и править. И в данном случае я думаю что лучше поступить так же.

Можно но как-то боязно
Какие минусы?

...выдать X сообщение об ошибке...
Нежелательно. Лучше echo и выход с ненулевым кодом возврата.

Я до конца не проникся логикой.
Что не понятно конкретно? ИМХО, то что получается - вполне нормально (если учесть и поправить отмеченные минусы).

А pfsload усложнять не надо, это один из самых важных скриптов (он вызывается из open_pfs, load_sfs, rc.sysinit и вообще во всех случаях, когда нужно смонтировать модуль).

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33955
  • Репутация: +231/-0
    • PuppyRus-A
Подключение PFS c копированием в RAM
« Ответ #11 : 17 Октябрь 2012, 20:18:45 »
Согласен. Переделал.
Точка монтирования - переменной (на случай желания изменить)
Понятно всё, но проникся еще не полностью.

Чего в итоге для альфы не хватает?

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
  • Автор темы
Подключение PFS c копированием в RAM
« Ответ #12 : 18 Октябрь 2012, 09:51:21 »
ИМХО - лучше! Но:

В начале проверяется каталог /$mnt/..tmpfs.[полный_путь], а потом создаётся каталог /$mnt/..tmpfs.[название_файла].
По тексту используется ${infile}, а надо ${fsfile} (там реальный путь, если был указан симлинк).
$(basename "${infile}" .sfs) - почему расширение не .pfs ?
Параметры pfsload'у передаются неправильно, либо -u, либо --upper (но не -upper), и не учитывается ситуация, если параметра нет.
Нет вызова pfsramfree и нет финального exit c результатом...

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33955
  • Репутация: +231/-0
    • PuppyRus-A
Подключение PFS c копированием в RAM
« Ответ #13 : 18 Октябрь 2012, 11:17:08 »
Поправил pfsram*
Проверил с сим.линками

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
  • Автор темы
Re:Подключение PFS c копированием в RAM
« Ответ #14 : 18 Октябрь 2012, 12:39:11 »
Нашёл ещё несколько недоработок:
  pfsramfree вызывается без параметра.
  Результат pfsload не проверяется.
  В некоторых местах нет кавычек, а надо бы.

Поправил сам. Ничего принципиального не менял.
Вот что получилось:

Код
#!/bin/bash
#121018 sfslinux@gmail.com for Richy-218. Based on init
#fixed by Zay, 18.10.2012

mnt=/tmp/..tmpfs
sudo="`which sudo`"

case "$1" in
  "-u" | "--upper") mntmode="upper";;
  "-l" | "--lower") mntmode="lower";;
  *) infile="$1"
esac

if [ ! "${infile}" ]; then
  [ "$2" ] && infile="$2"
fi

if [ "${infile}" = "" ]; then
  echo "Usage: `basename "$0"` [OPTIONS] FILE${IFS}${IFS}Options:"
  echo " -u, --upper    Copy file to RAM & Mount to upper layer (AUFS)."
  echo " -l, --lower    Copy file to RAM & Mount to lower layer (AUFS)."
  exit 1
fi

[ ! -f "${infile}" ] && echo "File \"${infile}\" not found!" && exit 1
pfs_module="$(basename "${infile}")"
[ -d "$mnt.$pfs_module" ] && echo "File \"${infile}\" mounted!" && exit 1

RAMSIZE=`free | grep 'Mem:' | tr -s ' ' | cut -f 4 -d ' '` #total physical ram (less shared video).
SIZESFSK=`du -k "${infile}" | cut -f 1`
SIZESFSK=$(($SIZESFSK + 1000)) #some slack.
MINRAM2CPY=$(($SIZESFSK * 2)) #100222 technosaurus: in case of very big puppies.
[ $RAMSIZE -gt 280000 ] && [ $RAMSIZE -gt $MINRAM2CPY ] && COPY2RAM="yes" && echo "$pfs_module copying to ram"

ERR() {
echo "ERROR copy to RAM" && $sudo pfsramfree "${infile}"
exit 1
}

if [ "$COPY2RAM" = "yes" ];then
  st="$mnt.$pfs_module"
  [ -d "$st" ] || $sudo mkdir -p "$st"
  $sudo mount -t tmpfs -o size=${SIZESFSK}k tmpfs "$st"
  $sudo cp -afL "${infile}" "$st" || ERR
  $sudo sync
fi

$sudo pfsload --$mntmode "$st/$pfs_module"
status=$?

[ ${status} -gt 0 ] && ERR

exit ${status}

Код
#!/bin/sh
#121018 sfslinux@gmail.com for Richy 218
#fixed by Zay, 18.10.2012

mnt=/tmp/..tmpfs
sudo="`which sudo`"
[ "$1" ] || echo "Usage: `basename "$0"` FILE"
f="$mnt.`basename "$1"`"
( [ -d "$f" ] && $sudo umount "$f" && $sudo rmdir "$f" && echo "RAM free" ) \
    || ( echo "ERROR RAM free" && exit 1 )
exit 0

Посмотрите.