Changeset 863f5d5
- Timestamp:
- Jan 21, 2020, 11:46:13 PM (5 years ago)
- Branches:
- master
- Children:
- 54096f7
- Parents:
- c43e516
- Files:
-
- 2 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
content/posts/reproducible-builds.org
rc43e516 r863f5d5 1 1 #+TITLE: Воспроизводимые сборки на примере GNU/Guix 2 #+DATE: <2020-01-21 Вт> 2 3 #+LANGUAGE: ru 3 #+OPTIONS: toc:24 4 5 5 * Воспроизводимые сборки на примере GNU/Guix 6 #+BEGIN_abstract7 Эта обзорная статья описывает преимущества, которые предоставляют8 системы с воспроизводимой сборкой программ. Она не затрагивает9 глубокие технические детали. В качестве демонстрации используется10 пакетный менеджер GNU/Guix.11 #+END_abstract12 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 сборки, которая является основным ожидаемым результатом. 23 23 24 24 ** Термины 25 25 - Исходный код :: Обычно берется из системы контроля версий 26 определенной ревизии или изархива.26 определенной ревизии или архива. 27 27 28 28 - Соответствующие аттрибуты среды сборки :: Обычно включают в себя … … 62 62 63 63 Не смотря на то, что отдельно взятые разработчики кажутся 64 естественной мишенью, под атакутакже попадают инфраструктуры для64 естественной мишенью, под удар также попадают инфраструктуры для 65 65 сборки, которые при успешной атаке предоставляют доступ к большому 66 66 числу компьютерных систем. Модифицирование собранных исполняемых … … 74 74 находится перед нами оригинальная правильная или 75 75 скомпроментированная неправильная сборка. Это позволяет 76 предотвращать такие угрозы и атаки сразу же, так как любое76 предотвращать такие угрозы и атаки как можно раньше, так как любое 77 77 изменение будет быстро обнаружено. 78 79 ** Можно ли доверять компилятору80 TODO81 78 82 79 ** Как добиться воспроизводимости … … 112 109 113 110 В остальных же случаях, необходимо поместить описание рядом с 114 исполняемыми файлами о том, как воспроизвести эти файлы.111 исполняемыми файлами о том, как воспроизвести окружение. 115 112 116 113 *** Предоставление протокола сравнения … … 124 121 125 122 ** Как проверить воспроизводимость 126 Важно выявлять проблемы с воспроизводимости в системе сборки раньше 127 конечных пользователей. 123 Техника, используемая в воспроизводимых сборках, называется Diverse 124 Double-Compilation[fn:diverse-double-compilation] и создана она 125 David A. Wheeler. 128 126 129 127 Алгоритм примерно следующий: … … 156 154 - Количество ядер CPU 157 155 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 воспроизводимой манере. 162 160 163 161 ** Воспроизводимые сборки в GNU/Guix 164 162 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 340 508 341 509 ** Воспроизводимые сборки в других дистрибутивах 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 342 521 *** 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 343 531 *** 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]] 347 539 348 540 [fn:determinational-build: Детерминированная компиляция: https://ru.wikipedia.org/wiki/Детерминированная_компиляция] … … 352 544 [fn:gnu-nixos: Пакетный менеджер, а также открытый дистрибутив GNU/Linux с воспроизводимым ПО: https://nixos.org] 353 545 [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 1 1 #+TITLE: @w96k 2 2 3 - [[file:about.org][about]] 3 4 - [[file:index.org][@w96k]] 4 5 - [[file:legal.org][legal]] 5 - [[file:about.org][about]]6 6 - [[file:404.org][404]] 7 7 - [[file:cv.org][cv]] -
public/css/custom.css
rc43e516 r863f5d5 6 6 #footnotes { 7 7 max-width: calc(80ch + 4em); 8 border-radius: 0. em;8 border-radius: 0.1em; 9 9 margin: var(--universal-padding); 10 10 padding: 1em; … … 105 105 font-size: 12pt; 106 106 position: fixed; 107 right: calc(var(--universal-margin));107 left: 95ch; 108 108 top: calc(var(--universal-margin) + 0.5em); 109 109 background: #fefefe; … … 200 200 width: auto; 201 201 } 202 203 .asciicast { 204 text-align: center; 205 }
Note:
See TracChangeset
for help on using the changeset viewer.