Восстанавливаемая система сборки пользовательского дистрибутива для Linux

Я думаю, что Вы ищете, не непосредственно возможно. Одно важное свойство равенства - то, что это является переходным. (т.е. Если == b и b == c, то == c). С мерой по расстоянию, тем не менее, Вы действительно не хотите это свойство. Пример:

Берут единственное плавание (для простоты). Предположим, что мы хотим хешировать каждое плавание так, чтобы плавания меньше, чем 1e-3 далеко были тем же значением. Теперь, предположите, что мы добавляем к этим плавающим значениям хэш-таблицы 1000 весь 1e-4 независимо. Любое граничение с 2 значениями должно хешировать к тому же плаванию, так как они ближе, чем 1e-3. Однако из-за транзитивности, соседи тех значений должны также иметь к тому же значению и их соседям и так далее. В результате все 1 000 значений, включая пар дальше, чем 1e-3 независимо, хешировали бы к тому же целому числу. Если необходимо было потянуть эти точки на изображении:

A  B  C  D  E  F  G  H ... Y Z

предположим все разрывы являются < 1e-3 независимо, но A и Z> 1e-3 независимо (для не масштабирования!). Это не может быть удовлетворено, потому что, если хеш (A) == хеш (B) и хеш (B) == хеш (C) и так далее для всех пар, (так как они - < 1e-3 независимо), чем хеш (A) должен == хеш (Z).

Один возможный вариант состоит в том, чтобы определить регионы Вашего векторного пространства, в котором все векторы хешировали бы к тому же значению (т.е. вокруг них прежде, чем хешировать их), но Вы могли все еще получить 2 вектора на краях их соответствующих пробелов, которые являются близко друг к другу, но хеш к другому значению. Вы могли обойти это путем поиска всех соседних пробелов вектор. (т.е. в 1-d случае выше, Вы были бы вокруг всех векторов к ближайшему несколько 1e-3, и затем ищите соседей, таким образом, 5.3e-3 искал бы 5e-3, 4e-3 и 6-e3. В более многомерных случаях необходимо было бы искать соседей во всех размерах.)

5
задан imz -- Ivan Zakharyaschev 21 March 2011 в 09:06
поделиться

1 ответ

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

  1. Чтобы автоматизировать сборку дистрибутива, я использовал XML-определение порядка сборки и зависимостей, а также сценарий GNU Make для создания параллельных независимых ветвей и создания двоичных пакетов . Результатом XML + shell-script + bit of python + Make / Autotools была полная сборка специального набора «основных» инструментов, а затем дополнительных.

  2. Вторым шагом была установка этих двоичных файлов / необработанных каталогов сборки в система. Я использовал installwatch (думаю), чтобы использовать inotify, чтобы следить за тем, куда что-то было установлено. Затем я вывожу XML этого вместе с зависимостями любых двоичных файлов.

  3. После этого у меня был манифест сборки (XML) и для каждого пакета XML-файл с подробной информацией об установленных пакетах. Затем я создал инструмент для преобразования XML и двоичных файлов на месте в различные форматы (RPM и т. Д.)

  4. Теперь (используйте свое воображение) у меня есть сценарий установки для автоматизации сборки, тонны метаданных о собранных пакетах и ​​их зависимости и метод преобразования этих метаданных в развертываемые пакеты

  5. Затем я сделал сценарии сборки для различных серверов, начиная с glib и заканчивая :) ... и запустил эти сборки. Система знала, какие пакеты /./ configure были общими, и разделяла эти пакеты. Это оставило меня с
    Затем я создал инструмент для преобразования XML и двоичных файлов на месте в различные форматы (RPM и т. Д.)

  6. Теперь (используйте свое воображение) у меня есть сценарий установки для автоматизации сборки, тонны метаданных о собранных пакетах и ​​их зависимости и метод преобразования этих метаданных в развертываемые пакеты

  7. Затем я сделал сценарии сборки для различных серверов, начиная с glib и заканчивая :) ... и запустил эти сборки. Система знала, какие пакеты /./ configure были общими, и разделяла эти пакеты. Это оставило меня с
    Затем я создал инструмент для преобразования XML и двоичных файлов на месте в различные форматы (RPM и т. Д.)

  8. Теперь (используйте свое воображение) у меня есть сценарий установки для автоматизации сборки, тонны метаданных о собранных пакетах и ​​их зависимости и метод преобразования этих метаданных в развертываемые пакеты

  9. Затем я сделал сценарии сборки для различных серверов, начиная с glib и заканчивая :) ... и запустил эти сборки. Система знала, какие пакеты /./ configure были общими, и разделяла эти пакеты. Это оставило меня с
    s были общими и разделяли эти пакеты. Это оставило меня с
    s были общими и разделяли эти пакеты. Это оставило меня с
    o Открытое / обыкновенное репо
    o Репозиторий для каждого типа сборки и архитектуры

  10. Несколько сценариев / rsync-over-ssh и сценариев управления исправлениями - и вы уезжаете.

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

Затем возникает вопрос о автоматизация инструментальной цепочки.

Все началось с LFS ... но, как вы можете видеть, все стало немного авантюрным.

Суть в том, что это было очень весело , но я просто отказался от всего этого для BSD и Fedora.

Такие вещи, как Suse Build Service , могут быть интересны. Разделение поиска и компиляции комбинаций стабильных источников упростит задачу! Вам даже не нужно ничего строить для Suse.

4
ответ дан 13 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: