Changeset 863f5d5


Ignore:
Timestamp:
Jan 21, 2020, 11:46:13 PM (5 years ago)
Author:
Mikhail Kirillov <w96k@…>
Branches:
master
Children:
54096f7
Parents:
c43e516
Message:

Add reproducible builds article

Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • content/posts/reproducible-builds.org

    rc43e516 r863f5d5  
    11#+TITLE: Воспроизводимые сборки на примере GNU/Guix
     2#+DATE: <2020-01-21 Вт>
    23#+LANGUAGE: ru
    3 #+OPTIONS: toc:2
    44
    55* Воспроизводимые сборки на примере GNU/Guix
    6 #+BEGIN_abstract
    7 Эта обзорная статья описывает преимущества, которые предоставляют
    8 системы с воспроизводимой сборкой программ. Она не затрагивает
    9 глубокие технические детали. В качестве демонстрации используется
    10 пакетный менеджер GNU/Guix.
    11 #+END_abstract
    12 
    13 Воспроизводимая сборка также называется детерменированной
    14 компиляцией [fn:determinational-build]. Сборка называется
    15 воспроизводимой, если исходный код, программное окружение и инструкции
    16 сборки будут давать на выходе побитово идентичные копии всех
    17 артефактов.
    18 
    19 Соответствующее программное окружение, инструкции сборки и исходный
    20 код также как и ожидаемый воспроизводимый артефакт определены авторами
    21 ПО или дистрибьюторами. Артефакты сборки -- это часть сборки, которая
    22 является основным ожидаемым результатом.
     6  #+BEGIN_abstract
     7  Эта обзорная статья описывает преимущества, которые предоставляют
     8  системы с воспроизводимой сборкой программ. Она не затрагивает
     9  глубокие технические детали. В качестве демонстрации используется
     10  пакетный менеджер GNU/Guix.
     11  #+END_abstract
     12
     13  Воспроизводимая сборка также называется детерменированной
     14  компиляцией [fn:determinational-build]. Сборка называется
     15  воспроизводимой, если исходный код, программное окружение и
     16  инструкции сборки будут давать на выходе побитово идентичные копии
     17  всех артефактов.
     18
     19  Соответствующее программное окружение, инструкции сборки и исходный
     20  код также как и ожидаемый воспроизводимый артефакт определены
     21  авторами ПО или дистрибьюторами. Артефакты сборки -- это часть
     22  сборки, которая является основным ожидаемым результатом.
    2323
    2424** Термины
    2525   - Исходный код :: Обычно берется из системы контроля версий
    26                      определенной ревизии или из архива.
     26                     определенной ревизии или архива.
    2727
    2828   - Соответствующие аттрибуты среды сборки :: Обычно включают в себя
     
    6262
    6363   Не смотря на то, что отдельно взятые разработчики кажутся
    64    естественной мишенью, под атаку также попадают инфраструктуры для
     64   естественной мишенью, под удар также попадают инфраструктуры для
    6565   сборки, которые при успешной атаке предоставляют доступ к большому
    6666   числу компьютерных систем. Модифицирование собранных исполняемых
     
    7474   находится перед нами оригинальная правильная или
    7575   скомпроментированная неправильная сборка. Это позволяет
    76    предотвращать такие угрозы и атаки сразу же, так как любое
     76   предотвращать такие угрозы и атаки как можно раньше, так как любое
    7777   изменение будет быстро обнаружено.
    78 
    79 ** Можно ли доверять компилятору
    80    TODO
    8178
    8279** Как добиться воспроизводимости
     
    112109
    113110    В остальных же случаях, необходимо поместить описание рядом с
    114     исполняемыми файлами о том, как воспроизвести эти файлы.
     111    исполняемыми файлами о том, как воспроизвести окружение.
    115112
    116113*** Предоставление протокола сравнения
     
    124121
    125122** Как проверить воспроизводимость
    126    Важно выявлять проблемы с воспроизводимости в системе сборки раньше
    127    конечных пользователей.
     123   Техника, используемая в воспроизводимых сборках, называется Diverse
     124   Double-Compilation[fn:diverse-double-compilation] и создана она
     125   David A. Wheeler.
    128126
    129127   Алгоритм примерно следующий:
     
    156154   - Количество ядер CPU
    157155
    158 [[https://tests.reproducible-builds.org/debian/index_variations.html][Пример вариаций в Debian]]
    159 
    160 [[https://packages.debian.org/sid/disorderfs][disorderfs]] -- утилита помогающая тестировать файловую систему в
    161 воспроизводимой манере.
     156   [[https://tests.reproducible-builds.org/debian/index_variations.html][Пример вариаций в Debian]]
     157
     158   [[https://packages.debian.org/sid/disorderfs][disorderfs]] -- утилита, помогающая тестировать файловую систему в
     159   воспроизводимой манере.
    162160
    163161** Воспроизводимые сборки в GNU/Guix
    164162
    165 #+CAPTION: Логотип GNU/Guix
    166 [[https://upload.wikimedia.org/wikipedia/commons/8/81/Guix_logo.svg]]
    167 
    168 GNU/GUIX /(произносится гикс ɡiːks)/ — пакетный менеджер и
    169 операционная система, разработанные Ludovic Courtès. Отличительной
    170 особенностью является создание полностью воспроизводимых сборок и
    171 наличие только [[https://www.gnu.org/philosophy/free-sw.ru.html][свободного ПО]]. Guix можно поставить на существующий
    172 дистрибутив GNU/Linux или в качестве отдельной системы на базе Linux
    173 или GNU Hurd. Раньше существовало разделение менеджера пакетов Guix и
    174 операционной системы GuixSD.
    175 
    176 Определения пакетов описываются на диалекте языка Scheme –
    177 [[https://www.gnu.org/software/guile/][GNU/Guile]]. Большая часть исходников написана на нём же. Система
    178 изначально была основана на Nix. Отличиями от Nix(OS) являются язык
    179 для описания пакетов и сервисов, система инициализации ([[https://www.gnu.org/software/guile/][GNU Shepherd]]),
    180 использование ядра [[https://www.fsfla.org/ikiwiki/selibre/linux-libre/][Linux-Libre]] (Linux без проприетарных блобов) и
    181 отсутствие проприетарных пакетов.
    182 
    183 Все пакеты Guix собраны из исходников, включая различные прошивки
    184 (firmware), которые имеют тенденцию быть представлены в виде
    185 предсобранных исполняемых файлов без предоставления доступа к
    186 исходному коду. В Guix возможно получение предсобранных исполняемых
    187 файлов в виде [[https://guix.gnu.org/manual/ru/html_node/Podstanovki.html#g_t_041f_043e_0434_0441_0442_0430_043d_043e_0432_043a_0438][подстановок]]. Эти подстановки представляют из себя
    188 программы, собранные на отдельных машинах (build farm), одинаковый
    189 результат которых вы получите, если бы собирали их на своей машине.
    190 
    191 Guix собирает пакеты в [[https://guix.gnu.org/manual/ru/html_node/Osobennosti.html][полностью изолированном программном окружении]]
    192 для максимизации воспроизводимости -- это важнейшая особенность,
    193 унаследованная от пакетного менеджера [[http://nixos.org/nix/][Nix]].
    194 
    195 Таким образом возможно очень малое количество вариаций между
    196 различными экземплярами окружений сборки; список доступных файлов в
    197 окружении, имя хоста, переменные окружения, локаль и так далее
    198 полностью под контролем и недоступны для изменения.
    199 
    200 Единственное, что может различаться -- это ядро и железо. Самый
    201 популярный пример того, как детали "железа" могут просочиться в
    202 процесс сборки -- временная метка (timestamp). К сожалению это очень
    203 частое явление, использующееся выводе сборки.
    204 
    205 Подробнее о преимуществах GUIX в статье [[https://www.opennet.ru/docs/RUS/guix/][«Guix: Самая совершенная операционная система»]].
    206 
    207 Существует русскоязычная [[https://t.me/gnu_guix_ru][конференция пользователей Guix в Telegram]].
    208 
    209 *** Использование Guix
    210 Нам понадобится Guix в качестве пакетного менеджера, он предоставляет
    211 все инструменты для создания окружений воспроизводимых программ. Я
    212 подразумеваю, что вы использует GNU/Linux дистрибутив. Вы можете
    213 установить guix, используя пакетный менеджер вашего дистрибутива:
    214 
    215 [[https://aur.archlinux.org/packages/guix/][Arch Linux]] | [[https://packages.gentoo.org/packages/sys-apps/guix][Gentoo]]
    216 
    217 Если в вашем дистрибутиве нет готового пакета с Guix, то это не
    218 проблема. Guix возможно установить на любой дистрибутив
    219 GNU/Linux, единственное требование -- иметь программы GNU tar и
    220 Xz. Для этого необходимо воспользоваться инструкцией «[[https://guix.gnu.org/manual/ru/html_node/Binarnaya-ustanovka.html][Бинарная
    221 установка]]».
    222 
    223 В отличии от большинства системных пакетных менеджеров (apt, dnf,
    224 pacman, portage) guix не требует доступа суперпользователя для
    225 функционирования. Guix, будучи функциональным пакетным менеджером, не
    226 использует состояние системы, поэтому ему не надо лазать в системные
    227 директории, для которых нужны права суперпользователя.
    228 
    229 Рассмотрим программу [[https://www.gnu.org/software/hello/][GNU Hello]]
    230 
    231 Пакет GNU Hello в Guix определен следующим образом:
    232 #+BEGIN_SRC scheme
    233 (define-public hello
    234   (package
    235     (name "hello")
    236     (version "2.10")
    237     (source (origin
    238               (method url-fetch)
    239               (uri (string-append "mirror://gnu/hello/hello-" version
    240                                   ".tar.gz"))
    241               (sha256
    242                (base32
    243                 "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
    244     (build-system gnu-build-system)
    245     (synopsis "Hello, GNU world: An example GNU package")
    246     (description
    247      "GNU Hello prints the message \"Hello, world!\" and then exits.  It
    248 serves as an example of standard GNU coding practices.  As such, it supports
    249 command-line arguments, multiple languages, and so on.")
    250     (home-page "https://www.gnu.org/software/hello/")
    251     (license gpl3+)))
    252 #+END_SRC
    253 
    254 Это определение написано на языке GNU/Guile, диалекте лиспа
    255 Scheme. Вам не нужно понимать тонкости языка, чтобы его использовать в
    256 Guix. Как мы видим пакет описан декларативно.
    257 
    258 Разберем это определение на составные части.
    259 
    260 #+BEGIN_SRC scheme
    261   (package
    262     (name "hello")
    263     (version "2.10")
    264     ...
    265 #+END_SRC
    266 
    267 Имя и версия пакета.
    268 
    269 #+BEGIN_SRC scheme
    270   (package
    271     ...
    272     (source (origin
    273               (method url-fetch)
    274               (uri (string-append "mirror://gnu/hello/hello-" version
    275                                   ".tar.gz"))
    276               (sha256
    277                (base32
    278                 "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
    279     ...
    280 #+END_SRC
    281 
    282 Источник пакета и его хеш-сумма. Источником пакета может являться как
    283 гит репозиторий, так и обычная ссылка на архив. Если хеш-сумма не
    284 совпадает, то guix не установит пакет.
    285 
    286 #+BEGIN_SRC scheme
    287   (package
    288     ...
    289     (build-system gnu-build-system)
    290     ...
    291 #+END_SRC
    292 
    293 Система сборки. В Guix существуют несколько систем сборки, содержащие
    294 инструкции сборки. В данном случае подразумевается, что система сборки
    295 запустит команды ~./configure && make && make check && make install~.
    296 
    297 #+BEGIN_SRC scheme
    298   (package
    299     ...
    300     (synopsis "Hello, GNU world: An example GNU package")
    301     (description
    302      "GNU Hello prints the message \"Hello, world!\" and then exits.  It
    303 serves as an example of standard GNU coding practices.  As such, it supports
    304 command-line arguments, multiple languages, and so on.")
    305     (home-page "https://www.gnu.org/software/hello/")
    306     (license gpl3+))
    307 #+END_SRC
    308 
    309 Короткое описание, длинное описание, домашняя страница и лицензия. Тут всё понятно.
    310 
    311 Также определение пакета может содержать зависимости ~inputs~,
    312 ~native-inputes~ и ~propogated-inputs~, но в нашем случае пакет hello
    313 не содержит зависимостей. Если бы зависимости были, то они бы
    314 собрались раньше пакета, а зависимости зависимостей еще раньше. Таким
    315 образом образуется дерево зависимостей. Например дерево зависимостей программы ~grep~.
    316 
    317 #+CAPTION: дерево зависимостей программы grep
    318 [[../../public/images/grep.png]]
    319 
    320 Вы можете создать такую же визуализацию командой ~guix graph grep |
    321 dot -Tpng > grep.png~. Перед выполнением установите пакет ~graphviz~.
    322 
    323 Дерево зависимостей может быть достаточно большим. Попробуйте
    324 например визуализировать пакет ~guix~ с самим пакетным менеджером.
    325 
    326 
    327 
    328 [[https://guix.gnu.org/manual/ru/html_node/Opisanie-paketov.html][Подробнее про определение пакетов в Guix]]
    329 
    330 *** Создание детерменированного окружения сборки
    331 Флаг ~--container~ использует возможность ядра [[https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_(Linux)][cgroups]], которая может не
    332 поддерживаться вашим процессором. Если это так, то используется вместо
    333 --container флаг --pure.
    334 
    335 #+BEGIN_SRC bash
    336 guix environment --container
    337 #+END_SRC
    338 
    339 Подробнее про команду [[https://guix.gnu.org/manual/ru/html_node/Vyzov-guix-environment.html#g_t_0412_044b_0437_043e_0432-guix-environment][guix environment]]
     163   #+CAPTION: Логотип GNU/Guix
     164   [[https://upload.wikimedia.org/wikipedia/commons/8/81/Guix_logo.svg]]
     165
     166   GNU/GUIX /(произносится гикс ɡiːks)/ — функциональный пакетный
     167   менеджер и операционная система, разработанные Ludovic Courtès и
     168   сообществом GNU. Отличительной особенностью является использование
     169   воспроизводимых сборок и наличие только [[https://www.gnu.org/philosophy/free-sw.ru.html][свободного ПО]]. Guix можно
     170   поставить на существующий дистрибутив GNU/Linux или в качестве
     171   отдельной системы на базе Linux или GNU Hurd. Раньше существовало
     172   разделение менеджера пакетов Guix и операционной системы GuixSD.
     173
     174   Определения пакетов описываются на диалекте языка Scheme –
     175   [[https://www.gnu.org/software/guile/][GNU/Guile]]. Большая часть исходников написана на нём же. Система
     176   изначально была основана на Nix. Отличиями от Nix(OS) являются язык
     177   для описания пакетов и сервисов, система инициализации ([[https://www.gnu.org/software/guile/][GNU
     178   Shepherd]]), использование ядра [[https://www.fsfla.org/ikiwiki/selibre/linux-libre/][Linux-Libre]] (Linux без проприетарных
     179   блобов) и отсутствие проприетарных пакетов.
     180
     181   Все пакеты Guix собраны из исходников, включая различные прошивки
     182   (firmware), которые имеют тенденцию быть представлены в виде
     183   предсобранных исполняемых файлов без предоставления доступа к
     184   исходному коду. В Guix возможно получение предсобранных исполняемых
     185   файлов в виде [[https://guix.gnu.org/manual/ru/html_node/Podstanovki.html#g_t_041f_043e_0434_0441_0442_0430_043d_043e_0432_043a_0438][подстановок]]. Эти подстановки представляют из себя
     186   программы, собранные на отдельных машинах (build farm), одинаковый
     187   результат которых вы получите, если бы собирали их на своей машине.
     188
     189   Guix собирает пакеты в [[https://guix.gnu.org/manual/ru/html_node/Osobennosti.html][полностью изолированном программном
     190   окружении]] для максимизации воспроизводимости -- это важнейшая
     191   особенность, унаследованная от пакетного менеджера [[http://nixos.org/nix/][Nix]].
     192
     193   Таким образом возможно очень малое количество вариаций между
     194   различными экземплярами окружений сборки; список доступных файлов в
     195   окружении, имя хоста, переменные окружения, локаль и так далее
     196   полностью под контролем и недоступны для изменения.
     197
     198   Единственное, что может различаться -- это ядро и железо. Самый
     199   популярный пример того, как детали "железа" могут просочиться в
     200   процесс сборки -- временная метка (timestamp). К сожалению это
     201   очень частое явление, которое используется в выводе сборки.
     202
     203   Подробнее о преимуществах GUIX в статье [[https://www.opennet.ru/docs/RUS/guix/][«Guix: Самая совершенная
     204   операционная система»]][fn:guix-best].
     205
     206   Существует русскоязычная [[https://t.me/gnu_guix_ru][конференция пользователей Guix в Telegram]].
     207
     208*** Установка Guix
     209    Нам понадобится Guix в качестве пакетного менеджера, он
     210    предоставляет все инструменты для воспроизводимых сборок. Я
     211    подразумеваю, что вы использует GNU/Linux дистрибутив. Вы можете
     212    установить Guix, используя пакетный менеджер вашего дистрибутива:
     213
     214    [[https://aur.archlinux.org/packages/guix/][Arch Linux]] | [[https://packages.gentoo.org/packages/sys-apps/guix][Gentoo]]
     215
     216    Если в вашем дистрибутиве нет готового пакета с Guix, то это не
     217    проблема. Guix возможно установить на любой дистрибутив GNU/Linux,
     218    единственное требование -- иметь программы GNU tar и Xz. Для этого
     219    необходимо воспользоваться инструкцией «[[https://guix.gnu.org/manual/ru/html_node/Binarnaya-ustanovka.html][Бинарная установка]]».
     220
     221    При установке Guix создаст директории в следующих местах:
     222    - ~/gnu/store/~
     223    - ~/var/guix/~
     224    - ~~/.guix-profile/~
     225
     226    В ~/gnu/~ помещаются все собранные программы в так называемый
     227    ~store~. Если программа предполагается к установке, то сначала она
     228    собирается в ~store~, а далее линкуется в ~~/.guix-profile/~ и
     229    помещается в переменную окружения PATH. Много версий программ
     230    может существовать на одной системе без конфликтов и хранится в
     231    store. Неиспользуемые программы могут быть удалены сборщиком
     232    мусора ~guix gc~.
     233
     234    В отличии от большинства системных пакетных менеджеров (apt, dnf,
     235    pacman, portage) guix не требует доступа суперпользователя для
     236    функционирования. Guix, будучи функциональным пакетным менеджером,
     237    не использует состояние системы, поэтому ему не надо лазать в
     238    системные директории, для которых нужны права суперпользователя.
     239
     240*** GNU Hello
     241
     242    Рассмотрим программу [[https://www.gnu.org/software/hello/][GNU Hello]]. Это небольшая hello-world
     243    программа, написанная на языке Си в соответствии со стилем и
     244    практиками проекта GNU. Найдём ее описание при помощи
     245    ~guix show hello~.
     246
     247    #+BEGIN_SRC bash
     248    w96k ~$ guix show hello
     249    name: hello
     250    version: 2.10
     251    outputs: out
     252    systems: x86_64-linux i686-linux
     253    dependencies:
     254    location: gnu/packages/base.scm:73:2
     255    homepage: https://www.gnu.org/software/hello/
     256    license: GPL 3+
     257    synopsis: Hello, GNU world: An example GNU package 
     258    description: GNU Hello prints the message "Hello, world!" and then exits.
     259    It serves as an example of standard GNU coding practices.  As such, it
     260    + supports command-line arguments, multiple languages, and so on.
     261    #+END_SRC
     262
     263    Если не знаете название пакета, то используйте команду для поиска ~guix search~.
     264
     265*** Определение пакета
     266    :PROPERTIES:
     267    :CUSTOM_ID: package_definition
     268    :END:
     269
     270    Определение пакета[fn:guix-package-definition] можно найти в файле
     271    ~~/.config/guix/current/share/guile/site/2.2/~ + строка
     272    location (~location: gnu/packages/base.scm:73:2~). Для простоты взаимодействия с системой существует мод
     273    для редактора [[https://www.gnu.org/software/emacs/][Emacs]] -- [[https://emacs-guix.gitlab.io/][emacs-guix]]. Из него можно проще
     274    навигироваться по системе.
     275
     276    Пакет GNU Hello в Guix определен следующим образом[fn:gnu-guix-hello]:
     277
     278    #+BEGIN_SRC scheme
     279      (define-public hello
     280          (package
     281            (name "hello")
     282            (version "2.10")
     283            (source (origin
     284                      (method url-fetch)
     285                      (uri (string-append "mirror://gnu/hello/hello-" version
     286                                          ".tar.gz"))
     287                      (sha256
     288                       (base32
     289                        "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
     290            (build-system gnu-build-system)
     291            (synopsis "Hello, GNU world: An example GNU package")
     292            (description
     293             "GNU Hello prints the message \"Hello, world!\" and then exits.  It
     294        serves as an example of standard GNU coding practices.  As such, it supports
     295        command-line arguments, multiple languages, and so on.")
     296            (home-page "https://www.gnu.org/software/hello/")
     297            (license gpl3+)))
     298    #+END_SRC
     299
     300    Это определение написано на языке [[https://www.gnu.org/software/guile/][GNU/Guile]], диалекте лиспа
     301    Scheme. Вам не нужно понимать тонкости языка, чтобы его
     302    использовать в Guix. Как мы видим пакет описан декларативно.
     303
     304    Разберем это определение на составные части.
     305
     306    #+BEGIN_SRC scheme
     307      (package
     308       (name "hello")
     309       (version "2.10")
     310       ...
     311    #+END_SRC
     312
     313    Имя и версия пакета.
     314
     315    #+BEGIN_SRC scheme
     316      (package
     317          ...
     318          (source (origin
     319                (method url-fetch)
     320                (uri (string-append "mirror://gnu/hello/hello-" version
     321                                    ".tar.gz"))
     322                (sha256
     323                 (base32
     324                  "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
     325          ...
     326    #+END_SRC
     327
     328    Источник пакета и его хеш-сумма. Источником пакета может являться
     329    как гит репозиторий, так и обычная ссылка на архив. Если хеш-сумма
     330    не совпадает, то guix не установит пакет. Строка mirror заменяет
     331    строку на url доступного зеркала[fn:guix-mirrors].
     332
     333    #+BEGIN_SRC scheme
     334      (package
     335         ...
     336         (build-system gnu-build-system)
     337         ...
     338    #+END_SRC
     339
     340    Система сборки[fn:guix-build-systems]. В Guix существуют несколько систем сборки,
     341    содержащие инструкции и окружение сборки. В данном случае
     342    подразумевается, что система сборки запустит команды ~./configure
     343    && make && make check && make install~ и будет иметь
     344    соответствующие утилиты.
     345
     346    #+BEGIN_SRC scheme
     347      (package
     348         ...
     349         (synopsis "Hello, GNU world: An example GNU package")
     350         (description
     351          "GNU Hello prints the message \"Hello, world!\" and then exits.  It
     352     serves as an example of standard GNU coding practices.  As such, it supports
     353     command-line arguments, multiple languages, and so on.")
     354         (home-page "https://www.gnu.org/software/hello/")
     355         (license gpl3+))
     356
     357    #+END_SRC
     358
     359    Синопсис, описание, домашняя страница и лицензия. Информация,
     360    полезная при поиске пакета.
     361
     362    Также определение пакета может содержать зависимости ~inputs~,
     363    ~native-inputes~ и ~propogated-inputs~, но в нашем случае пакет
     364    hello не содержит зависимостей. Если бы зависимости были, то они
     365    бы собрались раньше пакета и были бы добавлены в окружение, а
     366    зависимости зависимостей собрались бы еще раньше. Таким образом
     367    образуется дерево зависимостей. Например дерево зависимостей
     368    программы ~grep~.
     369
     370    #+CAPTION: дерево зависимостей программы grep
     371    [[../../public/images/grep.png]]
     372
     373    Вы можете создать такую же визуализацию командой ~guix graph
     374    grep | dot -Tpng > grep.png~. Для выполнения нужен установленный
     375    пакет ~graphviz~.
     376
     377*** Загрузка исходного кода
     378    Создадим отдельную директорию для нашей демонстрации и
     379    переместимся в нее:
     380
     381    #+BEGIN_SRC bash
     382    mkdir hello
     383    cd hello
     384    #+END_SRC
     385
     386    Загрузим исходный код при помощи команды ~guix download~ и ссылки
     387    на пакет из [[file:#package_definition][определения пакета]] (необходимо подставить версию):
     388
     389    #+BEGIN_SRC bash
     390     guix download -o hello.tar.gz mirror://gnu/hello/hello-2.10.tar.gz
     391
     392     Starting download of hello.tar.gz
     393     From https://ftpmirror.gnu.org/gnu/hello/hello-2.10.tar.gz...
     394     following redirection to `https://mirror.tochlab.net/pub/gnu/hello/hello-2.10.tar.gz`
     395     709KiB                                       5.2MiB/s 00:00 [##################] 100.0%
     396     hello.tar.gz
     397     0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i       
     398    #+END_SRC
     399
     400    Мы получили файл hello.tar.gz в текущей директории. Последняя
     401    строка вывода консоли -- это хеш-сумма, которую мы видели в
     402    определении пакета.
     403
     404*** Создание детерминированного окружения
     405    Детерминированное окружение одно из требований для создания
     406    воспроизводимых сборок. Для создания изолированного окружения
     407    воспользуемся командой ~guix environment~:
     408
     409    #+BEGIN_SRC bash
     410    guix environment hello --container
     411    #+END_SRC
     412
     413    Флаг ~--container~ использует возможность ядра [[https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_(Linux)][cgroups]], которая
     414    может не поддерживаться вашим процессором. Если это так, то
     415    используется вместо ~--container~ флаг ~--pure~.
     416
     417    Выполнив данную команду Guix скачивает необходимые программы для
     418    окружения сборки и перемещает нас в него. То есть нам доступны
     419    только непосредственно программы для сборки (gnu-build-system) +
     420    при наличии зависимостей -- собранные зависимости.
     421
     422    Строка ~[env]~ говорит о том, что вы находитесь в изолированном
     423    окружении. Чтобы выйти из окружения, используйте сочетание клавиш
     424    ~C-d~. Для дальнейшей работы оставайтесь в изолированном
     425    окружении.
     426
     427*** Сборка
     428    Разархивируем архив при помощи ~tar~ и переместимся в папку с
     429    исходным кодом:
     430    #+BEGIN_SRC bash
     431    tar -xf hello.tar.gz
     432
     433    ls
     434    hello-2.10  hello.tar.gz
     435    cd hello-2.10
     436    #+END_SRC
     437
     438    Далее соберем проект из серии команд:
     439    1. ~./configure~
     440    2. ~make~
     441    3. ~make check~
     442    4. ~make prefix=./dist install~
     443
     444    И так мы получили в директории  ~dist~:
     445    #+BEGIN_SRC bash
     446    cd dist; cd bin;
     447    ./hello
     448    Hello, world!
     449    #+END_SRC
     450
     451    Теперь можно выйти из виртуального окружения, нажав ~C-d~.
     452
     453*** Сборка через пакетный менеджер
     454    Теперь вы примерно понимаете как происходит процесс сборки. Всё
     455    что мы сделали уже реализовано пакетным менеджером, для повторения
     456    всей процедуры используем ~guix build~:
     457   
     458    #+BEGIN_SRC bash
     459    guix build hello --check
     460    #+END_SRC
     461
     462    На самом деле данная команда использует дополнительные шаги, но
     463    основные -- те, что мы уже выполнили.
     464
     465*** Установка через пакетный менеджер
     466    Основная команда для взаимодействия с пакетами ~guix package~[fn:guix-package-command], но
     467    есть удобные алиасы ~guix install~ для установки и ~guix remove~
     468    для удаления. Попробуем установить пакет hello:
     469
     470    #+BEGIN_SRC bash
     471      guix install hello
     472      hello
     473      Здравствуй, мир!
     474      # Я использую русскую локаль в системе, поэтому выводит на русском. В
     475      # окружении сборки переменная LANG не настроена. Поменяем переменную
     476      # окружения LANG на en_US
     477      LANG=en_US hello
     478      Hello, world!
     479    #+END_SRC
     480
     481*** Проверка воспроизводимости
     482    Для проверки существует команда ~guix challenge~. Она проверяет
     483    совпадает ли хеш, собранной программы с тем, что находится на
     484    сборочной ферме (build farm):
     485
     486    #+BEGIN_SRC bash
     487    guix challenge hello -v
     488    /gnu/store/kg9mirg6xbvzcp0a98v7326n1nvvwgsj-hello-2.10 contents match:
     489    local hash: 101vrhsf9zrzkir4yz01934il2b8wp3z30cc8h0aymzdzbwrikq9
     490    https://ci.guix.gnu.org/nar/lzip/kg9mirg6xbvzcp0a98v7326n1nvvwgsj-hello-2.10: 101vrhsf9zrzkir4yz01934il2b8wp3z30cc8h0aymzdzbwrikq9
     491
     492    1 store items were analyzed:
     493    - 1 (100.0%) were identical
     494    - 0 (0.0%) differed
     495    - 0 (0.0%) were inconclusive
     496    #+END_SRC
     497
     498    Наша сборка побитово идентична, а значит воспроизводима. Таким
     499    образом мы рассмотрели воспроизводимые сборки на примере уже
     500    существующей программы в репозитории Guix.
     501
     502*** Запись действий
     503    #+BEGIN_EXPORT html
     504    <span align="center">
     505      <script id="asciicast-Ie61O6XaPHzu5O5WafFxA0Hsc" src="https://asciinema.org/a/Ie61O6XaPHzu5O5WafFxA0Hsc.js" async></script>
     506    </span>
     507    #+END_EXPORT
    340508
    341509** Воспроизводимые сборки в других дистрибутивах
     510*** NixOS
     511    #+CAPTION: Логотип Nix(OS)
     512    [[https://nixos.wiki/nixos-logo-small.png]]
     513   
     514    Дистрибутив GNU/Linux, которым вдохновлялся Guix.
     515
     516    #+BEGIN_QUOTE
     517    1528 out of 1541 (99.16%) paths in the minimal installation image
     518    are reproducible! [fn:nixos-reproducible]
     519    #+END_QUOTE
     520
    342521*** Debian
     522    #+CAPTION: Логотип Debian
     523    [[https://www.debian.org/logos/openlogo-100.jpg]]
     524   
     525    Проект Reproducible Debian[fn:debian-reproducible] ставит целью
     526    достижение воспроизводимости как можно большего числа пакетов в
     527    дистрибутиве Debian. Достаточно много пакетов уже воспроизводимы:
     528
     529    [[https://tests.reproducible-builds.org/debian/unstable/amd64/stats_pkg_state.png]]
     530
    343531*** Arch Linux
    344 
    345 ** Доклады
    346 
     532    #+CAPTION: Логотип Arch Linux
     533    [[https://www.archlinux.org/static/logos/archlinux-logo-dark-90dpi.ebdee92a15b3.png]]
     534
     535    Дистрибутив Arch Linux также старается использовать практику
     536    воспроизводимых сборок[fn:arch-reproducible].
     537
     538    [[https://tests.reproducible-builds.org/archlinux/archlinux.png]]
    347539
    348540[fn:determinational-build: Детерминированная компиляция: https://ru.wikipedia.org/wiki/Детерминированная_компиляция]
     
    352544[fn:gnu-nixos: Пакетный менеджер, а также открытый дистрибутив GNU/Linux с воспроизводимым ПО: https://nixos.org]
    353545[fn:debian-reproducible: Воспроизводимые сборки Debian: https://wiki.debian.org/ReproducibleBuilds/]
    354 [fn:gnu-guix-blog-1: Reproducible builds: a means to an end https://guix.gnu.org/blog/2015/reproducible-builds-a-means-to-an-end/]
    355 [fn:gnu-guix-blog-2: Reproducible computations with Guix https://guix.gnu.org/blog/2020/reproducible-computations-with-guix/]
     546[fn:arch-reproducible: Воспроизводимые сборки Arch Linux: https://tests.reproducible-builds.org/archlinux/archlinux.html]
     547[fn:nixos-reproducible: Воспроизводимые сборки NixOS: https://r13y.com]
     548[fn:guix-blog-1: Статья "Reproducible builds: a means to an end": https://guix.gnu.org/blog/2015/reproducible-builds-a-means-to-an-end/]
     549[fn:guix-blog-2: Статья "Reproducible computations with Guix": https://guix.gnu.org/blog/2020/reproducible-computations-with-guix/]
     550[fn:guix-best: Оригинал статьи «Guix: Самая совершенная операционная система»: https://ambrevar.xyz/guix-advance/index.html]
     551[fn:gnu-guix-hello: Определение GNU Hello в Guix: https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/base.scm#n72]
     552[fn:guix-mirrors: Зеркала пакетов Guix: https://paste.sr.ht/~w96k/8d0e03d5a7193dec95b6f0dc77682dab55d57e3d]
     553[fn:guix-build-systems: Системы сборки в Guix: https://guix.gnu.org/manual/ru/html_node/Sistemy-sborki.html]
     554[fn:guix-package-definition: Определение пакета в Guix: https://guix.gnu.org/manual/ru/html_node/Opisanie-paketov.html]
     555[fn:guix-package-command: Команда guix package: https://guix.gnu.org/manual/ru/html_node/Vyzov-guix-package.html]
     556[fn:diverse-double-compilation: Diverse Double-Compilation: https://dwheeler.com/trusting-trust/]
  • content/sitemap.org

    rc43e516 r863f5d5  
    11#+TITLE: @w96k
    22
     3- [[file:about.org][about]]
    34- [[file:index.org][@w96k]]
    45- [[file:legal.org][legal]]
    5 - [[file:about.org][about]]
    66- [[file:404.org][404]]
    77- [[file:cv.org][cv]]
  • public/css/custom.css

    rc43e516 r863f5d5  
    66#footnotes {
    77    max-width: calc(80ch + 4em);
    8     border-radius: 0.em;
     8    border-radius: 0.1em;
    99    margin: var(--universal-padding);
    1010    padding: 1em;
     
    105105    font-size: 12pt;
    106106    position: fixed;
    107     right: calc(var(--universal-margin));
     107    left: 95ch;
    108108    top: calc(var(--universal-margin) + 0.5em);
    109109    background: #fefefe;
     
    200200    width: auto;
    201201}
     202
     203.asciicast {
     204    text-align: center;
     205}
Note: See TracChangeset for help on using the changeset viewer.