Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Это фанатизм или попытка самоутвердиться?
А если он потом ещё и не заведётся (из-за описанной выше проблемы), будет совсем кисло. Ну это скорее теория, чем практика.В моём случае это практика. Оправлять человека в другой город плюс время простоя — это недёшево. Правда это было лет 10 назад — сейчас этим занимается техподдержка хостинг-провайдера, что не значит что она от этого дела в восторге.
А в фате метаинформация от файла тоже отделена, это ошибка именно в днк, а не в файловой системе.Это не совсем так. Длина файла записана именно в каталоге. В FAT нет понятия inode, которое бы хранило эту важную информацию о файле, а файлы длиной 10 байт и 100 байт — всё-таки разные файлы.
Просто пример — запустите в Windows любой исполняемый файл. А теперь переименуйте его. Фокус-покус! Файл перименовался! Причём файл не просто продолжает работать, но и может использовать ресурсы.А теперь
вы волшебным образом подменяете файл используя волшебную силупереименования файлов — что дальше произойдёт? А вот все возможные ваши беды и произойдут.
Microsoft сознательно отказалась от идеи виртуальной файловой системы ядра, так, как развязывало ей руки в применении множества других перспективных технологий.Каких именно? Какая именно технология существенным образом опирается на невозможность «удаления» открытого файла? И почему это не мешает им работать в WINE? Или может речь идёт о каких-то суперсекретных технологиях, которые WINE никак может скопировать из-за того, что Linux не использует гениального подхода Microsoft?
а библиотека в системе не одна — их многоЭто уменьшает проблему, а не увеличивает.
10 версий системной библиотеки — это в 10 раз увеличившееся потребление памятиС чего вдруг? Если в вашей системе код занимает большую часть памяти, то вы что-то делаете не так. В большинстве современных систем код занимает не так много, основная часть — это данные. Плюс большинство библиотек после 10 upgrade'ов будут иметь в памяти 2-3 версии, а не 10. Ибо чтобы у вас получилось 10 версий библиотеки вам нужно как минимум 10 программ, которые перезапускаются в разное время. Что это за программы и откуда у вас в системе образовался такой бардак? Обычно речь идёт в /sbin/init и тому подобных демонах (которые запускаются один раз и работают до перезагрузки системы), обычных демонах (типа MySQL и Apache), которые перезапускаются скопом после обновления библиотек и программах, которые запускаются из скриптов. Итого — 2-3 версии библиотеки и то если вам сильно не повезёт.
и если не думать о мегабайтах — гигабайтов начинает быстро нехватать.Насколько быстро? Вы проводили измерения? Некоторые библиотеки обновляются часто (10-20 раз в год), но среднее количество обновлений — весьма мало (пресловутый закон Паретто), так что ваша проблема — высосана из пальца.
новые версии — это далеко не только латание дыр.Та же самая история. 80-90% «новых» версий — это именно латание дыр. А в тех редких случаях когда версия кардинально отличается — можно и систему перезагрузить. Цель ведь состоит не в том, чтобы избежать перезагрузок любой ценой, а чтобы снизить потери от них! Каждая перезагрузка — это потеря времени, сил и денег, но если для отказа от перезагрузки требуется «горы свернуть» — то можно систему и перезагрузить, криминала тут нет. Простое решение используемое в *nix-системах позволяет отказаться от 90% перезагрузок легко и до 99% — если в вашем случае перезагрузки — действительно большая проблема, но отказ от 100% перезагрузок на повестке дня не стоит.
Баги нет — потому что единственный способ ГАРАНТИРОВАННО обеспечить стабильность системы это как раз перезагрузка после обновления отдельных системных модулей, а не тихая подмена исполняемых модулей без ведома приложених, их использующих.Не пишите чепухи. Единственный способ ГАРАНТИРОВАННО обеспечить стабильность системы — это писать модули так, чтобы версия 1.0 и версия 1.5 были совместимы. Если же этого нет, то кто гарантирует что ваше ненаглядное приложение A вообще сможет стартовать после замены библиотеки 1.0 на библиотеку 1.5?
У вас есть другое решение? Поделитесь пожалуйста.От вас жду того же — расскажите мне, идиоту, как перезагрузка сможет вдруг сделать библиотеку 1.5 совместимой с 1.0 если без перезагрузки она с ней несовместима. И как часто такое случается на практике.
Вы неправильно поняли условия задачи. 1.5 совместима с 1.0 (иначе это не обновление, а хз что) — только вот приложение, в которое загружена 1.5, будет портить данные, передаваемые из приложения с модулем 1.0.То есть вы обеспечиваете совместимость ABI, но не совместимость с порождаемыми данными? Бред какой-то. В 90% (если не в 99%) случаев бывает наоборот. Ибо иметь 2, 3, да даже 10 библиотек в системе — не проблема (посмотрите на количество версий msvcrt в последних версиях Windows или на количество версий libdb в *nix), а вот данные — часто собираются годами.
Именно поэтому нельзя обновлять систему постепенно, не закрывая работающие приложения. Обновить вы обновите — но стабильность под вопросом.Когда вы обновляете библиотеки — стабильность всегда под вопросом. Но возможность сделать это «на ходу» позволяет (и очень часто позволяет) уменьшить downtime.
Речь идет лишь о том, что это крайний случай, и подобные трюки необходимо использовать с большой осторожностью.Если это — крайний случай, то его никто не будет тестировать и отлаживать, а обновления будут копиться ибо нельзя же перезагружать комп каждый час! Так и до несовместимости можно дойти. Если же это штатный способ, который применяют миллионы — то об этом разработчики должны додуматься и сделать всё «как надо». Что вовсе не так сложно, как вам кажется.
Внешний интерфейс очевидно не изменяется, обеспечивая обратную совместимость. Но вот реализация библиотеки может (и наверняка будет — мы же что-то обновили) иной.С чего вдруг? Внутри процесса всегда работает одна версия библиотеки (загрузчик просто не будет загружать уже загруженную библиотеку), там конфликтов не будет, а если ваша библиотека имеет другой интерфейс с вшеним миром, то с какого перепугу она имеет тот же номер?
И когда в системе взаимодействуют несколько разных реализаций одной и той же библиотеки (причем в роизвольных комбинациях) — жди беды.
Очевидный ответ — “нет», т.к. при тестировании обновлений невозможно проверить все возможные сочетания версий загруженных одновременно разными приложениямиЕсли исходить из этого критерия то стабильную работу системы вообще никогда нельзя гарантировать.
Постарайтесь понять — что наличие в памяти двух (трех, десяти — в зависимости от количества запущенных установщиков) версий одной библиотеки в памяти это ОГРОМНАЯ проблема.Почему вдруг?
Потому что у вас нет гарантии, что СТАРЫЕ функции в данном модуле продолжают работать так же, как и раньше.В этом случае менять старый модуль на новый вообще нельзя и вся обсуждаемая проблема не стоит выеденного яйца.
Поэтому при любых изменениях в коде любой проект всегда полностью пересобирается, и на нем заново прогоняются тесты.Тесты заново прогнать — это завсегда полезно, но пересобирать-то зачем? Это ни в какие ворота не лезет — так только Microsoft делает и то только для Windows. При изменении системной библиотеки в Windows MS Office и MS Visual Studio никто заново не пересобирает.
Речь идет о том, что в памяти одновременно живут старая и новая библиотеки.Нет двух библиотек в памяти «одновременно». Вернее есть — но в памяти разных процессов. Один процесс работает со старой библиотекой и только с ней, другой — с новой и только с ней. Откуда конфликты?
Однако если библиотеку делал недобросовстный программист, решивший сэкономить место с помощью купирования «ненужной» секции, или в ней пропишет себя вирус, то мы получаем бомбу с часовым механизмом. Когда произойдет «бум» — сказать сложно.Если у вас вирусы в системе, то вам уже ничего не поможет. Что будет если обновление поместит по адресу 0x40000000 user.dll? И вашу библиотеку придётся перемещать несмотря на перезагрузку?
При этом лично у вас все может быть ок, я и сам (каюсь, грешен) часто делал библиотеки без секции .reloc — ну удобнее мне так, удобнее (я просто ставил хитрый базовый адрес, но не об этом речь). Но на машинах пользователей все может жахнуть в любой момент.Ну если вы хотите ездить на машине без тормозов и руля, то это не повод заявлять что все дороги должны быть только прямыми — и шоб никаких перекрёстков! Во-первых я не понял причём тут проблемы с базовыми адресами (две библиотеки в память одного процесса никогда не попадают), а во-вторых от использования базовых адресов в Unix мире все уже давно отказались (Linux — 1996й год, FreeBSD — 1998й год, NetBSD — 2000й год)…
но ворд ничего об этом не знает и пытается вызвать ту же самую функциюи, представьте себе, он вызовет ту же самую функцию. Ибо у него открыта старая версия dll-ки и ни о каких новых фичах он ничего не узнает до того, как его перезапустят. Или вы о том, что он может закрыть dll'ку, потом открыть её и вот тут как раз получить облом? Ну так это и в Windows возможно: если программа dll'ку закрыла — то её и подменить можно в любой OS, даже в Windows.
Это простой пример того, что поведение системы может стать непредсказуемым если всем подряд дать заменять используемые в данный момент файлы.Это простой пример показывает что бывает если статьи читать не вчитываясь и не думая.
Странно, такое впечатление что подавляющее кол-во оставляющих комменты либо никогда не занимались программированием, либо никогда не работали с большими проектами, где за трюки в стиле «да я же одну библиотеку изменил, и все» бьют по рукам. Очень, очень больно.Всё верно — такие вещи нужно проверять на тестовых системах, а потом уже ставить то же обновление на 10'000 компьютеров. Но перезагружаться-то зачем?
Ну казалось бы, что за чепуха — нажал ребут, а сам пошёл чаю налить. Пока налил, уже и ребутнулось.Ну действительно. А если этих компьютеров у вас в организации — 10'000? И на них нужно обновление установить? И на них люди работают? Или, наоборот, люди не работают, но эти компьютеры — это сервера и если они все сразу перезагрузятся, то ваша фирма убытков поимеет до… и больше?
Теперь уже не пытаются — любое .net приложение, например, устанавливает свою dll совместно с предыдущими версиями (не обновляя систему). Так что по идее, про эту проблему можно потихоньку начать забывать.Погодите — а если в библиотеке или программе ошибка — тогда как? Нифига это не решение, так, заплатка на заплатке.
Нормальный админ не делает это посреди рабочего дня. Всегда можно найти время — в конце концов, ставить автоматом ночные обновления. Ну и другие способы есть.А какая разница? Uptime того компьютера, с которого я это пишу — 72 дня. А программы я запустил и аккуратно их окошки расположил месяц назад. Какая разница — когда вы компьютер перезапустите — в любом случае мне все программы заново нужно будет запускать…
В конце концов, Гугл тоже когда-то свои сервера ребутит, но мы этого не замечаем.По иронии судьбы я знаком с одним из людей, которые это делают. Так вот: upgrade ядра (а это единственная операция, требующая перезагрузки, так как Windows они не используют) — на порядок более стрессовая ситуация, чем простая замена любой библиотеки. Даже glibc (хотя это тоже непросто ибо всякие казусы могут быть).
Предположим, есть софт А и софт Б. Они юзают библиотеку Д разных версий.А этот подход тот же Гугл использует для libstdc++… И да, нужно патчить отдельно все библиотеки, так что шибко широкое распространение этого метода создаёт свои проблемы… Представьте что ошибку нашли в zlib, которая используется в сотне программ у вас в системе…
Если с софтом Б выходит более новая библиотека Д, только Б её и использует. А софт А продолжает использовать свою версию.
Если в библиотеке Д нашли ошибку, то нужен отдельный патч для А и отдельный патч для Б — по крайней мере, мне кажется, что это так работает.
А какое отношение имеет плановая перезагрузка к сохранности данных? Правильно, никакогоможет только человек никогда не работавший админом…
Поскольку /sbin/init использует libc.so и собственно ld.so,Не нужно никакого танца с бубнами. Пусть себе /sbin/init использует столетнюю версию glibc. Он настолько мало из неё использует и та часть, которую он использует настолько вылизана, что я не думаю что в ней за много лет будет найдена хоть одна ошибка…
при обновлении этих библиотек требуется таки перезагрузка, либо очень интересный, но неизвестный мне танец с бубном.
«Ошибки в ДНК» или как неправильный дизайн может приводить к миллионным убыткам