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

Автор Тема: Даёшь советский init!  (Прочитано 30495 раз)

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

Оффлайн DdShurick

  • Это Риччи
  • Модератор
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Автор темы
  • Старый чайник
Даёшь советский init!
« : 07 Март 2013, 21:32:59 »
 Понравится это будущему совету или нет, я расковырял init. Учитывая, что у нас обновлён busybox, появилась возможность избавиться от прежних костылей и сопутствующих тараканов.
 Выкинуто:
- mntfunc и umntfunc. Busybox прекрасно справляется с монтированием самостоятельно.
- /bin/losetup. За ненадобностью. Теперь применяется команда mount -o loop.
- /sbin/probepart_init. Замена - fdisk -l | grep ^/
- секция "LOAD PUPPY FILES FROM TFTP SERVER". Есть новые идеи, надо обдумать.
 Перерабатывается:
- секция "FINDING PUPPY FILES" объединена с "LOADING PUPPY FILES" и переписывается под именем "FINDING AND LOADING PUPPY FILES". Пробую другой алгоритм поиска.
- создание /etc/PUPSTATE. Придётся переписывать. ИМХО нафиг не нужен, но используется многими скриптами.
 Вот начало
Код
#######################FINDING AND LOADING PUPPY FILES###########################

if [ "$PDEV1" = "" ]; then
[ $PSUBDIR ] && MAXDEPTH=1 || MAXDEPTH=2
fdisk -l | grep ^/ | grep -v swap | cut -f 1 -d ' ' |
 while read PDEV1
 do
mount $PDEV1 /mnt/dev_save
PBASE=$(find /mnt/dev_save$PSUBDIR -maxdepth $MAXDEPTH -name ${DISTRO_FILE_PREFIX}-${DISTRO_VERSION}*.sfs)
  if [ "$PBASE" = "" ]; then
  umount /mnt/dev_save
  continue
  else
  echo "$PBASE" > /tmp/PUPBASEFILEPATH
  break
  fi
 done
[ $PSUBDIR ] || PSUBDIR="/$(cut -f4 -d'/' /tmp/PUPBASEFILEPATH | grep -v \.sfs)"
else
mount $PDEV1 /mnt/dev_save
ls /mnt/dev_save/*/${DISTRO_FILE_PREFIX}-${DISTRO_VERSION}*.sfs > /tmp/PUPBASEFILEPATH
[ $PSUBDIR ] || PSUBDIR="/$(cut -f4 -d'/' /tmp/PUPBASEFILEPATH | grep -v \.sfs)"
fi
echo -n "load basefile" > /dev/console

mount -o loop /mnt/dev_save$PSUBDIR/${DISTRO_FILE_PREFIX}-${DISTRO_VERSION}*.sfs /pup_ro2 || (echo -n "No basefile">/dev/console; check_status 1)
mount -o loop /mnt/dev_save$PSUBDIR/${DISTRO_FILE_PREFIX}_save*.sfs /pup_ro1 && UMNTMAIN="/pup_rw=rw:/pup_ro1=ro:/pup_ro2=ro"
if [ -f /mnt/dev_save$PSUBDIR/${DISTRO_FILE_PREFIX}_save*.[234]fs ]; then
mount -o loop /mnt/dev_save$PSUBDIR/${DISTRO_FILE_PREFIX}_save*.sfs /pup_rw
else
RAMSIZE=`free | grep 'Mem:' | tr -s ' ' | cut -f 3 -d ' '` #total physical ram (less shared video).
FREEK=0
 FREEK=`expr $RAMSIZE \/ 2` #half of physical.
 ALLOCK=`expr $FREEK + $EXTRAALLOCK`
 mount -t tmpfs -o size=${ALLOCK}k tmpfs /pup_rw
#RW (top) layer now has a tmpfs, PDEV1 or ${DISTRO_FILE_PREFIX}save mounted on it. calc free space...
[ $FREEK -eq 0 ] && FREEK=`df | grep ' /pup_rw' | tr -s ' ' | cut -f 4 -d ' '`
[ ! $FREEK ] && FREEK=0
fi
[ $UMNTMAIN ] || UMNTMAIN="/pup_rw=rw:/pup_ro2=ro"
check_status 0
########################END FINDING AND LOADING PUPPY FILES############################
Моноблок 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

Оффлайн georgii-2

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 554
  • Репутация: +14/-0
Re:Даёшь советский init!
« Ответ #1 : 07 Март 2013, 23:42:59 »
Просьба к разработчикам - относиться к новым идеям и предложениям как в "мозговом штурме". Т.е не критиковать хотя бы неделю. Вопросы задавать можно. Любая идея, даже неперспективная, часто наводит на другие, уже более ценные. Цените генераторов идей.
ищем простые решения актуальных задач технического прогресса.
AMD Athlon(tm) 64 Processor 3000+
GeForce 6150SE nForce 430

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
Re:Даёшь советский init!
« Ответ #2 : 08 Март 2013, 10:03:09 »
Пока глубоко не разбирался, со временем напряг, но сама идея очень нравится. Я за такой подход к разработке!

/etc/PUPSTATE ... ИМХО нафиг не нужен
Согласен. Было бы неплохо убрать этот файл, в т.ч. и из скриптов. Задача большая, но плюсы есть.

С учётом возможного строительства дистрибутива на других пакетах хотелось бы сделать Init минимально зависимым от содержимого системы. Задача Init - запустить систему, а что дальше - это уже дело самой системы.

Ещё предложения по теме:

  Перенести, если это реализуемо, всю работу с сохранёнкой из Init в скрипты загрузки (rc.sysinit).
  Как раз можно добавить возможность работы с каталогом вместо файла.

  Возвращаюсь к предложению исключить базу. Достаточно подключать в цикле все файлы из каталога packages.

Оффлайн DdShurick

  • Это Риччи
  • Модератор
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Автор темы
  • Старый чайник
Re:Даёшь советский init!
« Ответ #3 : 08 Март 2013, 12:36:48 »
Перенести, если это реализуемо, всю работу с сохранёнкой из Init в скрипты загрузки (rc.sysinit).
Не только реализуемо, но и уже фактически реализовано (см. sysinit Richy-217-DdSE). В ваших скриптах надо добиться подключения сохранёнки гарантированно в верхний слой.
  Как раз можно добавить возможность работы с каталогом вместо файла.
В старом init эта возможность есть.
Моноблок 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

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
Re:Даёшь советский init!
« Ответ #4 : 08 Март 2013, 13:24:06 »
надо добиться подключения сохранёнки гарантированно в верхний слой
Код
mount -o remount,add:0:/catalog/ /
Этот код решает вопрос, или ещё что-то надо?

Тогда тем более есть смысл убрать PUPSTATE. Только нужно где-то хранить информацию о режиме "При выключении скопировать tmpfs в сохранёнку" (то что раньше было PUPMODE=13).

Оффлайн DdShurick

  • Это Риччи
  • Модератор
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Автор темы
  • Старый чайник
Re:Даёшь советский init!
« Ответ #5 : 08 Март 2013, 15:49:37 »
Код
mount -o remount,add:0:/catalog/ /
Этот код решает вопрос, или ещё что-то надо?
Это при PUPMODE=12 (прямая запись в save-файл). Кстати, надо ещё проверить, а смонтируется ли rw? Мне больше нравится вариант PUPMODE=13 (mount -t tmpfs -o size=${ALLOCK}k tmpfs /pup_rw), тогда в init можно оставить только монтирование базы и tmpfs, а остальное в sysinit.d.
Тогда тем более есть смысл убрать PUPSTATE. Только нужно где-то хранить информацию о режиме "При выключении скопировать tmpfs в сохранёнку" (то что раньше было PUPMODE=13).
Если обрезать init, как я предложил выше, то PUPMODE=13 будет у нас единственным универсальным режимом и PUPSTATE просто не потребуется. Хотя можно и оставить, он никому не мешает (у меня сейчас есть, но пустой).
Моноблок 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

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
Re:Даёшь советский init!
« Ответ #6 : 08 Март 2013, 17:52:50 »
в init можно оставить только монтирование базы и tmpfs, а остальное в sysinit.d
Это было бы неплохо.

PUPMODE=13 будет у нас единственным универсальным режимом
Но возможность прямого подключения тоже желательно оставить (хотя бы опционально).

Оффлайн DdShurick

  • Это Риччи
  • Модератор
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Автор темы
  • Старый чайник
Re:Даёшь советский init!
« Ответ #7 : 08 Март 2013, 18:01:15 »
в init можно оставить только монтирование базы и tmpfs, а остальное в sysinit.d
Это было бы неплохо.
Сделано и испытано на 13.02. В init осталось 368 строк  :o Резать дальше?
PUPMODE=13 будет у нас единственным универсальным режимом
Но возможность прямого подключения тоже желательно оставить (хотя бы опционально).
Не проблема, но нужно ли?
Моноблок 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

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
Re:Даёшь советский init!
« Ответ #8 : 08 Март 2013, 18:09:06 »
В init осталось 368 строк  :o Резать дальше?
Если работает не хуже после этого, то чем короче - тем лучше!
Краткий и ясный код легче читать / править.

Не проблема, но нужно ли?
ИМХО - нужно. RAM не у всех много, а в некоторых случаях может быть нужно сразу много места в сохраненке.
Кроме того в случае отключения сети (например) все данные за сессию пропадут.

Оффлайн DdShurick

  • Это Риччи
  • Модератор
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Автор темы
  • Старый чайник
Re:Даёшь советский init!
« Ответ #9 : 09 Март 2013, 09:09:34 »
Не проблема, но нужно ли?
ИМХО - нужно. RAM не у всех много, а в некоторых случаях может быть нужно сразу много места в сохраненке.
Кроме того в случае отключения сети (например) все данные за сессию пропадут.
Согласен.
Намечаются два варианта init - мини и макси. Мини подключает базу, сохранёнку (если есть) и tmpfs. Макси подключает всё самостоятельно. Надо двигать оба.
 Работающий у меня мини (ну совсем мини) для 13.02
Моноблок 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

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
Re:Даёшь советский init!
« Ответ #10 : 09 Март 2013, 09:33:56 »
Для большей универсальности, ИМХО, было бы удобнее чтобы Init подключал все модули из каталога и создавал tmpfs.
А вся работа с сохраненкой - уже непосредственно в системе.

Намечаются два варианта init - мини и макси.
Не запутаемся?

Мини подключает ... сохранёнку
Всё же, из sysinit возможно подключить сохраненку поверх?

Оффлайн DdShurick

  • Это Риччи
  • Модератор
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Автор темы
  • Старый чайник
Re:Даёшь советский init!
« Ответ #11 : 09 Март 2013, 10:15:57 »
Для большей универсальности, ИМХО, было бы удобнее чтобы Init подключал все модули из каталога и создавал tmpfs.
А вся работа с сохраненкой - уже непосредственно в системе.
Т. е. вы за вариант макси? Он отличается от mini только наличием секции LOADING PUPPY MODULES.
Не запутаемся?
Вы Сусунин? Я нет.
Всё же, из sysinit возможно подключить сохраненку поверх?
Конечно можно.
Код
SAVE=$(find /initrd/mnt/dev_save/{217,SFS} -maxdepth 1 -name richy_save*.[234s]fs)
if [ $SAVE ]; then
SAVE=$(echo $SAVE | cut -f1 -d' ') #костыль
busybox mount -o loop $SAVE /initrd/pup_ro1
mount -o remount,add:1:/initrd/pup_ro1/ /
fi
у меня вот такой костылик в rc.sysinit для работы с мини.
Моноблок 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

Оффлайн Zay

  • Почетный участник
  • Ветеран
  • *
  • Сообщений: 1536
  • Репутация: +25/-0
Re:Даёшь советский init!
« Ответ #12 : 09 Март 2013, 11:32:24 »
Логика работы Init может быть, например, такой:

Подключаем все модули из указанного каталога.
if []; then
  Подключаем сохранёнку в верхний слой AUFS.
else
  Подключаем tmpfs в верхний слой AUFS.
fi


В rc.sysinit надо будет проверять, если tmpfs используется - то подключать сохранёнку вторым слоем.
Кстати, подключать сохранёнку во второй слой (и файл, и каталог) можно скриптом pfsload, последние версии это умеют.
И после подключения надо делать "echo 2 >/tmp/.topaufslayer", чтобы при горячем подключении модули не перекрывали сохранёнку.

Так можно реализовать оба режима (PUPMODE 12 и 13).

Оффлайн andy-voit

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 1250
  • Репутация: +60/-0
  • Расту!!!
Re:Даёшь советский init!
« Ответ #13 : 09 Март 2013, 11:46:01 »
Пользую, как известно, версию 13.02 c xfce-модулем. Попробовал новый инит. Все подключается, нормально работает, из отличий - иконки жестких дисков изменились на изображения дисков usb. А так все работает
XFCE forever!!!
Перешел на приставку 3vi. Теперь издеваюсь над ней! :)

Оффлайн DdShurick

  • Это Риччи
  • Модератор
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Автор темы
  • Старый чайник
Re:Даёшь советский init!
« Ответ #14 : 09 Март 2013, 12:53:46 »
иконки жестких дисков изменились на изображения дисков usb.
У меня тоже (wm - IceWM). На Richy - нет.
Моноблок 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