Мнение Общественности |
Что для вас предпочтительней?
1. Настроить Мультизагрузку по инструкциям.2. Скачать готовый проект по частям.
Всего ответов: 3786
|
Статистика |
|
|
Dr.Web Live USB и GRUB
| |
b0s | Дата: Четверг, 19.04.2012, 02:38 | Сообщение # 181 |
Ищущий
Группа: Пользователи
Сообщений: 22
Статус: Отсутствует
| Sh1td0wn, Завидую вам, по доброму, что у вас на новых машинах работает. Понимайте в чём дело? Согласно отладке, устройство готово и есть в списке, начиная со второго вызова функции Delay, то есть после сравнения, find_root похоже вызывается, ноу устройство не считывает или не монтирует. Но вот если самому запускать, тогда заработает. Я выполняю команду exec ash -x /init и вуаля /dev/sdb1 есть в списке после первого вызова функции delay(), и думаю /sdb1 там и должено быть, ещё при первом вызове иначе, последующие вызовы почему то не срабатывают, или срабатывают но с какой-то вероятностью... Я поставил SDELAY = 600. Там даже до 400 дошло, но не сработало. Уверен, что даже до нуля бы дошло и не сработало.
Сообщение отредактировал b0s - Четверг, 19.04.2012, 02:40 |
|
| |
Sh1td0wn | Дата: Четверг, 19.04.2012, 02:47 | Сообщение # 182 |
Программист
Группа: Модераторы
Сообщений: 3829
Статус: Отсутствует
| > find_root похоже вызывается, ноу устройство не считывает или не монтирует Вывод: отлаживать нужно find_root. Попробуйте добавить в разных его местах echo "что-нибудь ${переменная}" 1>&2 (1>&2 = необходимо перенаправить stdout в stderr, чтобы не смутить /init, который читает stdout в поисках переменных).
Возможно, дело не в find_root (он не вызывается), а в race condition в этом скрипте, когда устройство появляется ровно между проверками на его наличие (вообще это весьма маловероятно). Для избавления от него достаточно дописать ещё один, запасной вызов find_root после всех delay (сразу после приведённого куска скрипта).
НАЖМИ МЕНЯ, прежде чем что-либо написать
|
|
| |
b0s | Дата: Четверг, 19.04.2012, 02:58 | Сообщение # 183 |
Ищущий
Группа: Пользователи
Сообщений: 22
Статус: Отсутствует
| Quote (Sh1td0wn) > find_root похоже вызывается, ноу устройство не считывает или не монтирует Вывод: отлаживать нужно find_root. Попробуйте добавить в разных его местах echo "что-нибудь ${переменная}" 1>&2 (1>&2 = необходимо перенаправить stdout в stderr, чтобы не смутить /init, который читает stdout в поисках переменных).
Возможно, дело не в find_root (он не вызывается), а в race condition в этом скрипте, когда устройство появляется ровно между проверками на его наличие (вообще это весьма маловероятно). Для избавления от него достаточно дописать ещё один, запасной вызов find_root после всех delay (сразу после приведённого куска скрипта).
Вы читайте мои мысли, я клянусь что сейчас об этом и писал. Если быть конкретным:
Ммм я кажется разобрался как же это происходит! Почему на втором этапе не начинается загрузка. Флешка на втором этапе уже найдена, она есть в списке, по этому её извлечение и вставка ведёт к изменению списка и дальнейшей загрузке, на второй фазе. Если бы флешки не было бы в списке и в первом и во втором случае, загрузка бы обязательно началась, но по скольку во втором списке она уже есть, загрузка не начинается. И я теперь понял, почему так происходило, что иногда загрузка начиналась. Просто в веду каких то причин связанных например с электропитанием, или чем ещё другим, на доли секунды инициализация запаздывала, потому наверное успевала второй раз активировать функция delay() ещё до того как устройство будет добавлено ядром в папку /devДобавлено (19.04.2012, 02:56) --------------------------------------------- Дописать ещё один, или вообще, что либо дописать, это ведь невероятно сложная ситуация для меня, так как я не обладаю инструментарием для распаковки initrd, даже если бы я распаковал это в в Windows, у файлов и папок не сохраняться права, как вы писали, а как именно это сделать в Linux я не знаю Добавлено (19.04.2012, 02:58) --------------------------------------------- Вообще чисто теоретически. Если добавить после загрузки драйверов, наипростешую паузу, судя по всему я так полагаю это команда sleep, например в 10 секунд или даже в 5, разве этого бы не было бы достаточно? Если дело именно в "миллисекундах", это ведь такой ареал потребностей пользователей удовлетворил, у которых как раз не находится устройство из-за этих самых долей секунды?
Сообщение отредактировал b0s - Четверг, 19.04.2012, 02:53 |
|
| |
Sh1td0wn | Дата: Четверг, 19.04.2012, 02:59 | Сообщение # 184 |
Программист
Группа: Модераторы
Сообщений: 3829
Статус: Отсутствует
| > а как именно это сделать в Linux я не знаю Где-то я это писал.
sudo unsquashfs initrd sudo $favourite-text-editor squashfs-root/sbin/find_root sudo mksquashfs squashfs-root initrd.new
А ещё есть сообщения о том, что правильный подбор параметров к mksquashfs.exe позволит создать initrd, загрузка из которого возможна (например, права 755 для всех файлов).
> Если дело именно в "миллисекундах", это ведь такой ареал потребностей пользователей удовлетворил, у которых как раз не находится устройство из-за этих самых долей секунды? Возможно. Но это лечение симптомов. Правильнее было бы переписать скрипт без этих race condition. Например, люди из Kaspersky Labs раньше использовали обычную вполне надёжную (и не самописную) систему запуска Gentoo Live CD, а теперь и вовсе перешли на унифицированный dracut. Хотя и там, и там, они внесли много своих изменений.
А может быть, дело вовсе не в race condition и не в баге find_root, и имеет место какая-то третья ошибка.
НАЖМИ МЕНЯ, прежде чем что-либо написать
|
|
| |
b0s | Дата: Четверг, 19.04.2012, 03:04 | Сообщение # 185 |
Ищущий
Группа: Пользователи
Сообщений: 22
Статус: Отсутствует
| sudo unsquashfs initrd -> Простите за глупые вопросы, а куда распакует? sudo $favourite-text-editor squashfs-root/sbin/find_root -> в папку squashfs-root ? sudo mksquashfs squashfs-root initrd.new -> ну а это компиляция обратно я так пологаю?
Не буду исключать такой вариант, про третий баг. Так как я вообще не программист компании Доктор Веб, и вообще не программист в том понимании в котором требуется. Просто так захотелось разрешить данный вопрос, столько сил и времени я на это потратил, и было бы здорово если бы это не только мне помогло но и людям вокруг. Было бы здорово.
Сообщение отредактировал b0s - Четверг, 19.04.2012, 03:07 |
|
| |
Sh1td0wn | Дата: Четверг, 19.04.2012, 03:07 | Сообщение # 186 |
Программист
Группа: Модераторы
Сообщений: 3829
Статус: Отсутствует
| Всё верно, распакует в squashfs-root, а третья команда - сборка обратно в squashfs. Подробнее см. man unsquashfs и man mksquashfs.
> Не буду исключать такой вариант, про третий баг. Заставить DrWeb с ним разобраться можно только в том случае, если наберётся достаточно пользователей этого LiveCD с платной лицензией, наткнувшихся на этот баг и обратившихся с ним в техподдержку.
НАЖМИ МЕНЯ, прежде чем что-либо написать
|
|
| |
b0s | Дата: Четверг, 19.04.2012, 03:18 | Сообщение # 187 |
Ищущий
Группа: Пользователи
Сообщений: 22
Статус: Отсутствует
| А как думайте, ну вот если так призадуматься основательно, почему при первом использовании delay, sdb1 в списке нет? Хот ... кажется я понял почему. Нет дело не в инициализации. Кажется в первом списке всё всегда обрывается на том устройстве у которого при вкл-ой отладке справа от него пишется равно и какое то другое устройство, например как у меня, /dev/sg1 = x/dev/hdc
Сейчас проверю.Добавлено (19.04.2012, 03:13) ---------------------------------------------
Quote (Sh1td0wn) > Не буду исключать такой вариант, про третий баг. Заставить DrWeb с ним разобраться можно только в том случае, если наберётся достаточно пользователей этого LiveCD с платной лицензией, наткнувшихся на этот баг и обратившихся с ним в техподдержку.
Не сколько в этом не сомневаюсь, и как мне кажется, если я не ошибся, вполне понимаю ваше презрение к естествоиспытателям. Но почему не попробовать, хуже ведь не станет никому, да и всёравно рано или поздно, разработчики наверняка разберутся. Но в друг кому то удастся раньше разрешить данную проблему?Добавлено (19.04.2012, 03:18) --------------------------------------------- Кстати, не знайте ли вы, как можно вообще прервать загрузку, без перезагрузки или вытаскивания флешки, вот такого вот /init'а и вообще возможно ли поставить загрузку на паузу, как например это возможно сделать в DOS с помощью клавиши Pause?
|
|
| |
Sh1td0wn | Дата: Четверг, 19.04.2012, 03:19 | Сообщение # 188 |
Программист
Группа: Модераторы
Сообщений: 3829
Статус: Отсутствует
| Не то чтобы я не люблю "естествоиспытателей", просто мне не нравится вносить очень глубокие изменения в то, чего я сам не делал. Это делает трудной автоматизацию обновления, особенно если случайно обновится эта самая изменяемая часть. А так сражаться со скриптом и находить, куда бы дописать поиск ISO-образа, было даже некоторое время интересно.
> Кажется в первом списке всё всегда обрывается на том устройстве у которого при вкл-ой отладке справа от него пишется равно и какое то другое устройство, например как у меня, /dev/sg1 = x/dev/hdc А вот этого я не понял. Кроме того, это странное поведение, потому что find_root всегда самостоятельно ищет, что бы ему помонтировать, а не руководствуется выводами /init или delay.
> Кстати, не знайте ли вы, как можно вообще прервать загрузку, Что понимать под "загрузкой"? С точки зрения ядра, на момент запуска /init система уже запущена и вовсю работает. И как именно прервать и с какой целью? Всю систему можно попытаться повесить каким-нибудь alt+syrq (пощите magic sysrq keys), но это вряд ли сработает. В ряде случаев нажатие Ctrl+Z на консоли посылает sigstop выполняемому процессу, но в данном случае это работать не должно (нет запущенного интерактивного шелла, который контролирует терминал и является родителем подопытного процесса).
НАЖМИ МЕНЯ, прежде чем что-либо написать
|
|
| |
b0s | Дата: Четверг, 19.04.2012, 03:26 | Сообщение # 189 |
Ищущий
Группа: Пользователи
Сообщений: 22
Статус: Отсутствует
| Quote (Sh1td0wn) А вот этого я не понял. Кроме того, это странное поведение, потому что find_root всегда самостоятельно ищет, что бы ему помонтировать, а не руководствуется выводами /init или delay.
Я чуть позже заметил, что при самом первом вызове delay - sdb в списке нет вообще. В командной строке, перечислены все устройства что и во второй, кроме флешки.
Кстати был бы вам благодарен, если бы объяснили как работает эта команда в которой указаны регулярные выражения? Это мне кажется просто уникальным, ни разу в жизни не видел столь лаконичного перечисления списка устройств. Но как в командной строке выбираются именно те которые в текущий момент существуют?Добавлено (19.04.2012, 03:26) ---------------------------------------------
Quote (Sh1td0wn) > Кстати, не знайте ли вы, как можно вообще прервать загрузку, Что понимать под "загрузкой"? С точки зрения ядра, на момент запуска /init система уже запущена и вовсю работает. И как именно прервать и с какой целью? Всю систему можно попытаться повесить каким-нибудь alt+syrq (пощите magic sysrq keys), но это вряд ли сработает. В ряде случаев нажатие Ctrl+Z на консоли посылает sigstop выполняемому процессу, но в данном случае это работать не должно (нет запущенного интерактивного шелла, который контролирует терминал и является родителем подопытного процесса).
Уже прочёл, спасибо большое за пояснение!
|
|
| |
Sh1td0wn | Дата: Четверг, 19.04.2012, 03:30 | Сообщение # 190 |
Программист
Группа: Модераторы
Сообщений: 3829
Статус: Отсутствует
| > Кстати был бы вам благодарен, если бы объяснили как работает эта команда в которой указаны регулярные выражения? > ls -x /dev/[hs]d[a-z]* /dev/[hs][rg][0-9]* /dev/cd* 2>/dev/null Используемые здесь регулярные выражения описаны в man 7 glob: > An expression "[...]" where the first character after the leading '[' is not an '!' matches a single character, namely any of the characters enclosed by the brackets. > There is one special convention: two characters separated by '-' denote a range. (Thus, "[A-Fa-f0-9]" is equivalent to "[ABCDEFabcdef0123456789]".)
> Но как в командной строке выбираются именно те которые в текущий момент существуют? ls печатает только те имена файлов, которые ему удалось найти. Поскольку файла (например) /dev/sdz* не существует, ls ругается на stderr (перенаправленный в /dev/null) и не печатает его имя.
НАЖМИ МЕНЯ, прежде чем что-либо написать
|
|
| |
b0s | Дата: Четверг, 19.04.2012, 03:47 | Сообщение # 191 |
Ищущий
Группа: Пользователи
Сообщений: 22
Статус: Отсутствует
| Sh1td0wn, спасибо за ваше пояснение!
Добавлено (19.04.2012, 03:43) --------------------------------------------- Забавно. Команда которая как раз таки делает паузу на пять секунд, за комментирована, верней две команды одна из которых приостанавливает сценарий
Code # [ "x$(lsmod|grep usb)" = "x" ] && sleep 5
Добавлено (19.04.2012, 03:46) --------------------------------------------- И кстати. Может она как раз дополняла сценарий тем, что в случае отсутствия вывода каких-либо устройств с usb префиксом или постфиксом, вызывала сон на пять секунд, и может без неё и начался хаос? А отключили например за ненадобностью, исходя из того, что у разработчиков всё работает?
Добавлено (19.04.2012, 03:47) --------------------------------------------- И например не флеше конкретно, а блоку с USB устройствами не достаточно времени на инициализацию?
Сообщение отредактировал b0s - Четверг, 19.04.2012, 03:48 |
|
| |
Sh1td0wn | Дата: Четверг, 19.04.2012, 03:51 | Сообщение # 192 |
Программист
Группа: Модераторы
Сообщений: 3829
Статус: Отсутствует
| Возможно, строка осталась с тех времён, когда /init был ещё маленький и глупый и либо сразу пытался монтировать /dev/sr0, либо ждал 5 секунд, пока флешки проснутся, и монтировал их. Логика тут может быть разной.
НАЖМИ МЕНЯ, прежде чем что-либо написать
|
|
| |
b0s | Дата: Четверг, 19.04.2012, 21:32 | Сообщение # 193 |
Ищущий
Группа: Пользователи
Сообщений: 22
Статус: Отсутствует
| Согласен! Спасибо вам за ваши ответы и разъяснения, и за ваше время, что вы мне уделили! Пойду спать.
Надеюсь убунту подойдёт для создания рам диска.
Добавлено (19.04.2012, 16:36) --------------------------------------------- Sh1td0wn. Ну, чтож. У меня всё получилось! Похоже, что на данном ноут буке, проблема "Cannot find boot device" решена. Всё как вы и предполагали и как я и думал. Принудительно установив sleep на 10 секунд получил "вуаля"! Я не правил сценарий find_root, не менял delay, не менял условие которое вызывает delay и find_root. Благодаря паузе, моё устройство, то есть флешка sdb1 появляется уже при первом вызове delay. Я внимательно читал ваше замечание, что если что-то разработчики задумали, то возможно так оно и должно быть, и не сколько с ним не спорю, и волнуюсь, что что-либо произойдёт не так, но мне принудительная приостановка, очень даже нравится. Всего то 10 секунд, а с флешки работает. Думаю можно было бы, доработать вызов sleep таким образом, что бы можно было задать его по надобности. И я уверен, что эта штука будет работать и с компакт диска.
Спасибо вам за ваш комментарий и помощь!Добавлено (19.04.2012, 21:32) --------------------------------------------- Sh1td0wn, у меня получилось. Сделал так, что теперь можно задавать параметр USBWAIT, а если он не задан или задан неправильно, не виде цифр, то тогда интервал ожидания 5 секунд. Представляйте? Даже их не хватает на инициализацию. Когда указываешь 10 секунд, тогда успевает гарантировано, а за пять нет...
И ещё про негативный момент. К сожалению я заметил предупреждение, которое можно было успеть увидеть только сделав видеозапись загрузки или поставив sleep перед переходом ко второму этапу загрузки. Code umount: can't umount /dev: Device or resource busy Появляется после после команды umount /dev. Она написана ближе к концу сценария, где создаётся папка .pivot и присоединяются точки соединения proc и sysfs, и затем идёт эта команда. Не знайте ли вы зачем она? И почему в при использовании оригинального initrd, проблем с отсоединением /dev нет, а в моём варианте есть?
Сообщение отредактировал b0s - Четверг, 19.04.2012, 16:46 |
|
| |
Sh1td0wn | Дата: Четверг, 19.04.2012, 21:36 | Сообщение # 194 |
Программист
Группа: Модераторы
Сообщений: 3829
Статус: Отсутствует
| > Не знайте ли вы зачем она? Чтобы отключить все ресурсы, которые могут быть заняты, перед переключением корневого устройства с initramfs на squashfs. Иначе pivot_root может быть неудачным или привести к сбоям.
Вот если бы внутри initramfs была доступна команда lsof, можно было бы посмотреть, кто держит /dev/.
НАЖМИ МЕНЯ, прежде чем что-либо написать
|
|
| |
b0s | Дата: Четверг, 19.04.2012, 21:51 | Сообщение # 195 |
Ищущий
Группа: Пользователи
Сообщений: 22
Статус: Отсутствует
| Sh1td0wn, я не уверен, что-то что я сделал правильный подход, но поставив двух секундную паузу перед отсоединением, проблема пропала. Права это лишь на виртуальной машине, не знаю хватит ли этой пазу для кого либо ещё.
|
|
| |
|
|