[devel] q: installer: Killing all remaining processes (forever)

Evgeny Sinelnikov =?iso-8859-1?q?sin_=CE=C1_altlinux=2Eru?=
Пн Апр 7 20:38:41 MSD 2008


2008/4/7 Stanislav Ievlev <inger на altlinux.org>:
> On Sat, Apr 05, 2008 at 04:29:59AM +0400, Evgeny Sinelnikov wrote:
>
> > Довольно-таки смутно....  Как можно сэкономить "несколько десятков
>  > мегабайт памяти" путём затирания образа в памяти после его
>  > копирования..? Сначала копируем cp /image/altinst /mnt/altlinst, а
>  > потом затираем последние как минимум 512 байт с помощью dd
>  > if=/dev/zero of=/mnt/altinst skip=$size_of_image... После этого оно
>  > иногда падает, особенно когда мы вызываем loop_change_fd("/dev/loop0",
>  > "/mnt/altinst"), если ядро память почистило для своих нужно...
>  >
>  Не очень понял идею патча где сначала делается sparse_file, а потом уже
>  делается копирование altinst на диск.
>  Что изменилось после такой перестановки?
>
Да, это результат вольной интерпретации того, как я понял глубокий
сакральный смысл make_sparse :) Тем не менее проблема оказалась в том,
что loop_change_fd() приводил к Segfault'у на тестах... Причины
довольно были туманны... Не у всех, но иногда так получается... Но на
виртуальной машине фиксированный образ у меня давал 100%
повторяемость... В итоге было предположено, что после kill(-1,
SIGKILL) не все процессы умирают... Нет, ну, они конечно умирают, но
не все сразу... Поэтому нужно дождаться сигнала ECHILD. Это решило
проблему отмонтирования для /mnt/destination/dev.

Проблема loop_change_fd() состоит в том, что то ли в виртуальных
машинах, то ли на 2.6.24, но грязный хак с перемонтированием корневой
системы на пустой файл приводит к зависанию системы... Обойти эту
ситуацию можно несколькими вариантами:
- путём уменьшения размера образа stage2 и удержания его в памяти
- копированием его на диск и удалением не сразу, а по окончанию
установки и переносу его в память на tmpfs, когда объём занимаемой
памяти уже не критичен
- восстановлением стабильной работы при выполнении loop_change_fd()

Я пока вижу вариант 2 вполне жизнеспособным....
Есть не нулевая вероятность, что патч исключающий рэйсы на killall()
может решить многие проблемы, в частности 3 вариант... Новый вариант
можно найти здесь:
http://git.etersoft.ru/people/sin/packages/installer.git/

-- 
Sin (Sinelnikov Evgeny)


Подробная информация о списке рассылки Devel