Это старая версия документа!
Содержание
Добавление мультибиблиотечности в Slackware x86_64
Статья содержит инструкции по созданию мультибиблиотечной Slackware64. Мультибиблиотечная 64-битная система Linux способна исполнять как 32-битные, так и 64-битные программы. Стандарт иерархии файловой системы документирует оптимальный метод достижения чистого разделения между 64-битным и 32-битным программами на одной системе. Начав разработку «Slackware64» (официального порта на архитектуру x86_64), мы решили придерживаться этого стандарта. Поэтому Slackware64 была настроена на поиск 64-битных библиотек в каталогах /lib64
и /usr/lib64
. Вот почему я называю Slackware64 готовой к мультибиблиотечности — хотя 32-битные библиотеки будут искаться в /lib
и /usr/lib
, в поставке Slackware64 нет 32-битных программ. Требуется сделать ещё один шаг (вам, пользователю), прежде чем Slackware64 можно будет назвать «мультибиблиотечной».
Это достигается следующим образом:
— Сперва нужно переключиться на мультибиблиотечные версии * //glibc// (такой glibc, который поддерживает //исполнение// как 32-ных, так и 64-битных бинарных файлов), и * //gcc// (способный //компилировать// в 32-битные бинарные файлы наравне с 64-битными). — Затем взять из 32-битной Slackware библиотеки и установить их в 64-битной Slackware, что завершит процесс создания 32-битного программного слоя.
Когда вышла Slackware64, она имела преимущество перед прочими существовавшими 64-битными «форками». Последние добавляли 32-битный слой совместимости путём перекомпиляции множества своих пакетов как 32-битных бинарников. С другой стороны, Slackware — это дистрибутив, состоящий из 32-битного и 64-битного выпуска, разрабатываемых параллельно. Это означает, что вам не нужно компилировать 32-битные пакеты с нуля для добавления мультибиблиотечности в 64-битную систему. Можно просто взять их из дерева пакетов 32-битной Slackware!
Это было одной из причин не добавлять в Slackware64 полную мультибиблиотечность — мы создали необходимые условия, но если пользователю нужна мультибиблиотечность, то ему нужно действовать самостоятельно.
В разделе ниже я объясню, как взять 32-битный пакет Slackware (скажем, пакет «mesa») и перепаковать его содержимое в пакет «mesa-compat32», который можно установить непосредственно в Slackware64.
Преимущества мультибиблиотечной системы
Я приведу несколько примеров программ, которые требуют поддержки мультибиблиотечности на 64-битной Slackware, поскольку они не запускаются или не компилируются на Slackwre64 без 32-битного слоя совместимости:
- Wine
Большинство программ для Windows по-прежнему 32-разрядные, для их запуска на Linux в Wine требуется 32-битная версия Wine. - VirtualBox
Популярное программное обеспечение для виртуальных машин. Несмотря на открытый (частично) исходный код, все ещё нуждается в 32-битных библиотеках на 64-битной Slackware. - Skype, Citrix client, …
Это проприетарные программы с закрытыми исходными кодами. Мы вынуждены зависеть от их разработчиков в части доступности 64-битных бинарников. Для этих программ пока подобного не случилось.
К счастью, поддержка 64 бит становится всё более распространённой. Довольно долго больным местом был Adobe, но в конце концов они выпустили свой плагин Flash для браузера в 64-битном варианте. Sun (ныне поглощённый Oracle-ом) выпустила 64-битную версию своего плагина Java для браузера. Эти два события послужили спусковым крючком для начала работы над Slackware64.
Получение мультибиблиотечных пакетов
Можете загрузить набор мультибиблиотечных пакетов и сценариев с моего сайта: http://slackware.com/~alien/multilib/ .
Наряду с несколькими файлами README (эта статья вики — расширенная версия одного из тех файлов) ниже каталога верхнего уровня «multilib» находятся подкаталоги для каждого 64-битного выпуска Slackware. Там же расположен каталог «source». Он содержит исходные тексты и сценарии SlackBuild.
Что вам действительно нужно — бинарные пакеты — доступны в каталоге <номер_выпуска_slackware> ниже каталога верхнего уровня. Каждый такой каталог содержит подкаталог «slackware64-compat32», где находится основной набор конвертированных 32-битных пакетов Slackware, готовых к установке на 64-битной Slackware.
Включение мультибиблиотечной поддержки в Slackware64
Примерные инструкции
Этот раздел содержит основные инструкции по добавлению полной поддержки мультибиблиотечности в вашу систему Slackware64. Если хотите разобраться в процессе более подробно или нужна информация о том, как компилировать 32-битные программы в Slackware64, прочтите и последующие разделы.
Обратите внимание, знак «#» в начале команд означает приглашение суперпользователя root.
- Загрузите пакеты с моего сайта (я давал ссылку в предыдущем разделе), в примере ниже использована ссылка на зеркало. Допустим, используется Slackware 14.0. Выполните:
# SLACKVER=14.0 # mkdir multilib # cd multilib # lftp -c "open http://taper.alienbase.nl/mirrors/people/alien/multilib/ ; mirror ${SLACKVER}" # cd ${SLACKVER}
- Обновите пакеты 64-битной Slackware «gcc«» и «glibc» моими мультибиблиотечными версиями.
Выполните команду# upgradepkg --reinstall --install-new *.t?z
после перехода в каталог с загруженными пакетами.
Эта команда также установит дополнительный пакет «compat32-tools». - Если загрузили и каталог slackware64-compat32 (мой пример команды «
lftp
» делает это) — вам повезло, потому что я уже выполнил преобразование 32-битных пакетов! Всё, что нужно, это выполнить команду:# upgradepkg --install-new slackware64-compat32/*-compat32/*.t?z
которая установит все 32-битные пакеты Slackware (или обновит их, если установлены более старые их версии, например, при обновлении до новой версии Slackware). Это всё!
- Если каталог slackware64-compat32 отсутствует, то либо его не загрузили, либо зеркало его не содержало. В этом случае придётся выполнить конвертацию 32-битных пакетов самостоятельно. Несложно, но займёт какое-то время:
- Быстрее всего, если у вас есть локальный каталог с оригинальными 32-битными пакетами Slackware (локальное зеркало). Купившие официальный DVD Slackware могут использовать его: он двусторонний и 32-битная Slackware на одной из сторон. В этом примере будем считать, что локальное зеркало дерева 32-битной Slackware доступно в каталоге «
/home/ftp/pub/slackware/slackware-13.37/slackware/
».
Непосредственно в нём должны быть подкаталоги «a», «ap», «d», «l», «n», «x». (Если смонтировали DVD Slackware, возможный каталог «/media/SlackDVD/slackware/
», но в примерах команд ниже я его не буду использовать). - Создайте новый пустой каталог (назовём его «slackware64-compat32») и перейдите в него:
# mkdir slackware64-compat32 ; cd slackware64-compat32
- Выполните следующую команду для создания набора 32-битных пакетов совместимости, используя в качестве параметра каталог с официальными 32-битными пакетами Slackware:
# massconvert32.sh -i /home/ftp/pub/slackware/slackware-13.37/slackware/
- Предыдущий шаг займёт какое-то время. По завершении установите 90Мб свежеконвертированных 32-битных пакетов Slackware, созданных в подкаталогах текущего каталога:
# upgradepkg --install-new *-compat32/*.t?z
- Закончили! Теперь можно загружать, устанавливать и запускать 32-битные программы. Не очень сложно, не так ли?
glibc
и gcc
в его чёрный список. Если не принять подобных мер предосторожности, есть риск, что пакетный менеджер случайно заменит мультибиблиотечные версии версиями из оригинальной чисто 64-битной Slackware!Если используете Slackware 13.37 или новее, тогда slackpkg поддерживает регулярные выражения в файле чёрного списка. В этом случае будет достаточно одной строки в
/etc/slackpkg/blacklist
для внесения в чёрный список всех моих пакетов (включая мультибиблиотечные пакеты gcc и glibc и все пакеты compat32
): [0-9]+alien [0-9]+compat32
# massconvert32.sh -u http://someserver.org/path/to/slackware-13.37/slackware
Подробные инструкции
Обновление glibc и gcc
Следующие пакеты glibc/gcc являются заменой, не добавлением, к стандартным пакетам Slackware. Для обновления до моих мультибиблиотечных версий пакетов gcc и glibc используйте программу «upgradepkg
». Они нужны для исполнения (glibc) и сборки (gcc) 32-битных программ на компьютере с 64-битной Slackware:
Slackware64 13.0
- Комплект компиляторов gcc:
- gcc-4.3.3_multilib-x86_64-4alien.txz
- gcc-g++-4.3.3_multilib-x86_64-4alien.txz
- gcc-gfortran-4.3.3_multilib-x86_64-4alien.txz
- gcc-gnat-4.3.3_multilib-x86_64-4alien.txz
- gcc-java-4.3.3_multilib-x86_64-4alien.txz
- gcc-objc-4.3.3_multilib-x86_64-4alien.txz
- Библиотеки GNU libc:
- glibc-2.9_multilib-x86_64-3alien.txz
- glibc-i18n-2.9_multilib-x86_64-3alien.txz
- glibc-profile-2.9_multilib-x86_64-3alien.txz
- glibc-solibs-2.9_multilib-x86_64-3alien.txz
- glibc-zoneinfo-2.9_multilib-noarch-3alien.txz
Slackware64 13.1
- Комплект компиляторов gcc:
- gcc-4.4.4_multilib-x86_64-1alien.txz
- gcc-g++-4.4.4_multilib-x86_64-1alien.txz
- gcc-gfortran-4.4.4_multilib-x86_64-1alien.txz
- gcc-gnat-4.4.4_multilib-x86_64-1alien.txz
- gcc-java-4.4.4_multilib-x86_64-1alien.txz
- gcc-objc-4.4.4_multilib-x86_64-1alien.txz
- Библиотеки GNU libc:
- glibc-2.11.1_multilib-x86_64-3alien.txz
- glibc-i18n-2.11.1_multilib-x86_64-3alien.txz
- glibc-profile-2.11.1_multilib-x86_64-3alien.txz
- glibc-solibs-2.11.1_multilib-x86_64-3alien.txz
- glibc-zoneinfo-2.11.1_multilib-noarch-3alien.txz
Slackware64 13.37
- Комплект компиляторов gcc:
- gcc-4.5.2_multilib-x86_64-2alien.txz
- gcc-g++-4.5.2_multilib-x86_64-2alien.txz
- gcc-gfortran-4.5.2_multilib-x86_64-2alien.txz
- gcc-gnat-4.5.2_multilib-x86_64-2alien.txz
- gcc-java-4.5.2_multilib-x86_64-2alien.txz
- gcc-objc-4.5.2_multilib-x86_64-2alien.txz
- Библиотеки GNU libc:
- glibc-2.13_multilib-x86_64-3alien.txz
- glibc-i18n-2.13_multilib-x86_64-3alien.txz
- glibc-profile-2.13_multilib-x86_64-3alien.txz
- glibc-solibs-2.13_multilib-x86_64-3alien.txz
- glibc-zoneinfo-2.13_multilib-noarch-3alien.txz
Slackware64 current
- До тех пор, пока отсутствует отдельный каталог «current», используйте файлы из каталога для наиболее свежего стабильного выпуска.
- Комплект компиляторов gcc:
- gcc-4.7.1_multilib-x86_64-1fix1_alien.txz
- gcc-g++-4.7.1_multilib-x86_64-1fix1_alien.txz
- gcc-gfortran-4.7.1_multilib-x86_64-1fix1_alien.txz
- gcc-gnat-4.7.1_multilib-x86_64-1fix1_alien.txz
- gcc-go-4.7.1_multilib-x86_64-1fix1_alien.txz
- gcc-java-4.7.1_multilib-x86_64-1fix1_alien.txz
- gcc-objc-4.7.1_multilib-x86_64-1fix1_alien.txz
- Библиотеки GNU libc:
- glibc-2.15_multilib-x86_64-6alien.txz
- glibc-i18n-2.15_multilib-x86_64-6alien.txz
- glibc-profile-2.15_multilib-x86_64-6alien.txz
- glibc-solibs-2.15_multilib-x86_64-6alien.txz
- glibc-zoneinfo-2012e_2012e_multilib-noarch-6alien.txz
Есть один дополнительный пакет для установки программой «installpkg»:
- «32-битный инструментарий» (сценарий, облегчающий создание 32-битных пакетов)
- compat32-tools-2.2-noarch-2alien.tgz
Тем не менее, я считаю, что правильнее сохранять эти основные мультибиблиотечные пакеты неразделёнными. Я последовал концепции, используемой в пакете binutils из самой Slackware64, который сочетает 64-битные и 32-битные мультибиблиотечные возможности в едином пакете.
Adding 32-bit Slackware libraries
The upgrade of glibc and gcc which I described in the previous section changes your system from »multilib-ready« to »multilib-enabled«.
Now, all you need to do is to install 32bit versions of Slackware's system software so that future 32bit programs that you are going to install and/or compile will find all the 32bit libraries they need in order to work.
This is not as simple as grabbing 32bit Slackware packages and installing them in Slackware64:
- In the first place, you will end up with multiple packages carrying the same name (two 'mesa' packages, two 'zlib' packages, etc…) which will be confusing to you as well as to the slackpkg package manager.
- And furthermore, if the 32bit package contains binaries (something like
/usr/bin/foo
), they will overwrite their 64bit counterparts when you install the 32bit package on top. It will seriously mess up your system if that happens.
A little bit of extra care is required so that unnecessary/unwanted files are stripped from the 32bit packages before you install them. What you need, is a 32bit package that does not conflict with whatever is already present in 64bit Slackware. Hence the name «32bit compatibility package».
I decided that it would be a waste of download bandwidth if I created 32bit compatibility versions of Slackware packages myself. After all, you have probably bought the Slackware 13.37 DVD so you already possess both 64bit and 32bit versions of Slackware… or else the 32bit Slackware tree is available for free download of course
Instead, I wrote a few scripts (parts of the script code were written by Fred Emmott of Slamd64 fame) and wrapped these into a »compat32-tools« package. Their purpose is to let you extract the content from any 32bit Slackware package and use that to create a new package which you can safely install on your 64bit Slackware.
This »compat32-tools« package needs some explanation.
Please read the detailed 'README' file in the /usr/doc/compat32-tools-*/
directory, it will help you on your way. These are the three useful scripts which the package installs:
- /etc/profile.d/32dev.sh
This is the same script that comes with Slamd64. It reconfigures your shell environment so that it will be easier for you to compile 32-bit software (by preferring the 32-bit compilers and libraries over their 64-bit versions)
- convertpkg-compat32
This script takes a 32-bit Slackware package and converts it to a '-compat32' package that you can safely install (using «installpkg») on Slackware64, alongside the 64-bit version of the same software package. For instance: suppose you need 32bit libraries that are in the mesa package. You take the mesa package from 32-bit Slackware (x/mesa-7.5-i486-1.txz
) and then run# convertpkg-compat32 -i /path/to/mesa-7.5-i486-1.txz
which will create a new package called
mesa-compat32-7.5-x86_64-1.txz
. This new package (which is created in your/tmp
directory unless you specified another destination) is basically the old 32bit package, but stripped from non-essential stuff. The changed basename (mesa becomes mesa-compat32) allows you to install this new package in Slackware64 where it will co-exist with the 64bit mesa package, not overwriting any files.
The script leaves temporary files in the directory »/tmp/package-<prgnam>-compat32
« which you can safely delete.
- massconvert32.sh
This script contains an internal list of what I consider the essential subset of 32-bit Slackware packages. It uses the above »convertpkg-compat32« script to grab every package that is on this internal list, and convert these into '-compat32' packages.
You need to run this script only once, for example like this (the example assumes that you mounted your 32bit Slackware DVD on/mnt/dvd
):# massconvert32.sh -i /mnt/dvd/slackware -d ~/compat32
This action will result in about 60 MB of new packages which you will find inside the newly created directory
~/compat32
(the directory's name is arbitrary of course, I chose it for the sake of this example). These packages comprise the 32bit component of your multilib Slackware64 system.
They should be installed using »installpkg
«, and they give you a pretty complete 32-bit compatibility layer on top of Slackware64:# installpkg ~/compat32/*/*.t?z
If you are upgrading from an earlier version of these packages (because for instance you upgraded your 64-bit Slackware to a newer release) then you do not use »
installpkg
« of course, but »upgradepkg –install-new
« instead:# upgradepkg --install-new ~/compat32/*/*.t?z
The »–install-new« parameter is needed to install the new
compat32
packages which were added between releases.
compat32
packages you will notice that some will show errors about missing files in /etc
. This is «by design», and these errors can be ignored. These messages are caused by the fact that files in /etc
are removed from a »-compat32« package during conversion (except for pango and gtk+2). I assume that files in /etc
will already have been installed by the original 64bit packages.An example of these «errors» for the
cups-compat32
package: Executing install script for cups-compat32-1.3.11-x86_64-1.txz. install/doinst.sh: line 5: [: too many arguments cat: etc/cups/interfaces: Is a directory cat: etc/cups/ppd: Is a directory cat: etc/cups/ssl: Is a directory cat: etc/cups/*.new: No such file or directory cat: etc/dbus-1/system.d/cups.conf.new: No such file or directory chmod: cannot access `etc/rc.d/rc.cups.new': No such file or directory cat: etc/rc.d/rc.cups.new: No such file or directory Package cups-compat32-1.3.11-x86_64-1.txz installed.
convertpkg-compat32
script to convert a non-Slackware package to a -compat32 package, I must strongly advise against this. The script is written with a single purpose and that is to make 32bit versions of the official Slackware64 binaries/libraries available in a multilib setup. As such, the script will remove a lot of stuff that is present in the original 32bit package - stuff which is expected to have been installed as part of the 64bit version of the package.In almost all cases where you have downloaded a non-Slackware 32bit package and want to make it work on Slackware64, the best way is to find the sources and build a 64bit version of the package. Alternatively, just install the original 32bit package instead of trying to «convert it» and then run it from the commandline to find out any missing 32bit libraries you may still have to extract from an official Slackware package.
Running 32-bit programs
Running a pre-compiled 32-bit program is easy after you've done the above system preparation. Just download, install and run it!
At times, you may run into a program that requires a certain 32-bit Slackware library that you do not yet have available. In that case, find out which 32bit Slackware package contains this missing library. Use the »convertpkg-compat32« script to convert that original 32bit Slackware package and install the resulting 32bit »compatibility« package on Slackware64.
Компилирование 32-битных программ
Если нужно скомпилировать 32-битную программу (wine и grub — пара примеров исключительно 32-битных программ с открытым исходным кодом), сперва настройте окружение запуском следующей команды:
$ . /etc/profile.d/32dev.sh
Обратите внимание на точку перед именем файла — это тоже часть команды (синоним команды source)! Запуск команды изменяет или создаёт несколько переменных окружения. В результате при компиляции 32-битные версии бинарных файлов получат приоритет над 64-битными — будет запускаться 32-битная компиляция. Изменения действуют до выхода (logout) из шелла.
В этом изменённом окружении возможно использовать стандартные SlackBuild-ы для сборки 32-битных пакетов для Slackware64. Пара важных замечаний:
— Необходимо устанавливать переменную ARCH в значение «x86_64», несмотря на компиляцию 32-битной программы! \\ Это относится к //тройке// «$ARCH-slackware-linux», обычно используемой в команде «configure». Если установить ARCH, например, в значение «i486», то определение //CFLAGS// для этой архитектуры приведёт к ошибке ''gcc'' наподобие «//compiler can not create executables//» («//компилятор не может создавать исполняемые файлы//»). Это относится к дизайну сценариев SlackBuild. Вместо правки сценариев и изменения/удаления определения //GFLAGS// можно установить переменную ARCH в «x86_64» и сэкономить себе время. Реальную работу выполняет сценарий ''32dev.sh''. — Правка сценария SlackBuild потребуется, если он будет использовать каталоги «lib64/» при «$ARCH = x86_64». Придётся заставить его использовать каталоги «lib/». Обычно это достигается поиском определения:<code> LIBDIRSUFFIX="64"
</code> и заменой этой строки на
LIBDIRSUFFIX=""
Предостережения
- После установки пакетов «
-compat32
» возможно потребуется переустановить бинарные драйверы видеокарт Nvidia или Ati для X.Org. Эти пакеты драйверов содержат одновременно 64-битные и 32-битные библиотеки для максимальной пользы на 64-битной мультибиблиотечной ОС. Если установили файлы драйвера для обоих архитектур, пакет «mesa-compat32
» перезапишет некоторые из 32-битных библиотечных файлов.
С другой стороны, если были установлены только 64-битные библиотеки драйвера для видеокарты Nvidia/Ati, рекомендуется после установки мультибиблиотечных пакетов переустановить пакет бинарного драйвера. На этот раз выберите также и установку 32-битных файлов.
Графическим 32-битным приложениям, запускаемым на мультибиблиотечной системе, потребуются 32-битные библиотеки драйвера. Если не установить нужные файлы, возможны сбои.
- Если соберётесь компилировать собственное 64-битное ядро, удостоверьтесь, что будет скомпилирована возможность 32-битной эмуляции, иначе мультибиблиотечность волшебным образом отключится. Требуемый параметр настройки ядра: CONFIG_IA32_EMULATION
Пакеты, преобразованные massconvert32.sh
Вот список пакетов, преобразованных в «-compat32» версии сценарием massconvert32.sh
. Отметьте, что некоторые из этих пакетов не входят в Slackware 13.0 или 13.1, они были добавлены в более поздних версиях Slackware, и поэтому станут причиной сообщения «* FAIL: package 'package_name' was not found!» («* СБОЙ: пакет 'имя_пакета' не найден!») при запуске сценария на ранних версиях Slackware.
# Серия A/: aaa_elflibs bzip2 cups cxxlibs dbus e2fsprogs openssl-solibs util-linux # Серия AP/: mpg123 mysql # Серия D/: libtool # Серия L/: alsa-lib alsa-oss atk audiofile cairo dbus-glib esound expat freetype gamin gdk-pixbuf2 glib2 gtk+2 gst-plugins-base gst-plugins-good gstreamer hal jasper lcms libart_lgpl libelf libexif libglade libgphoto2 libidn libieee1284 libjpeg libmng libmpc libpcap libpng libsndfile libtermcap libtiff libusb libxml2 libxslt ncurses pango popt qt readline sdl seamonkey-solibs svgalib v4l-utils zlib # Серия N/: curl cyrus-sasl gnutls libgcrypt libgpg-error openldap-client openssl # Серия X/: fontconfig glew libFS libICE libSM libX11 libXScrnSaver libXTrap libXau libXaw libXcomposite libXcursor libXdamage libXdmcp libXevie libXext libXfixes libXfont libXfontcache libXft libXi libXinerama libXmu libXp libXpm libXprintUtil libXrandr libXrender libXres libXt libXtst libXv libXvMC libXxf86dga libXxf86misc libXxf86vm libdmx libdrm libfontenc libxcb mesa pixman
Сторонние инструменты поддержки
- Sėbastien Ballet написал инструмент compat32pkg. На его сайте compat32pkg доступен для загрузки как и обширная документация по его использованию в Slackware64.
Цитата с сайта:
«Compat32pkg — это автоматический инструмент, предоставляющий всё необходимое для управления (конвертации, установки, обновления, удаления) 32-битной части мультибиблиотечной slackware-64 от AlienBob-а, а также всех 32-битных пакетов из Slackware-32, в которых у пользователей 64-битного окружения может возникнуть потребность, таких как firefox, seamonkey, jre, …»
Переводы
- Bruno Russo перевёл эту статью на португальский (бразильский): http://www.brunorusso.eti.br/slackware/doku.php?id=multilib_para_o_slackware_x86_64
- Mehdi Esmaeelpour перевёл статью на персидский: http://www.slack-world.com/index.php/articles/43-general-system/85-multilib-slackware64
- Patrick FONIO и Sebastien BALLET перевели статью на французский: http://wiki.slackware-fr.org/avance:articles:slackware64-multilib
Благодарности
- Большое спасибо Fred Emmott, создателю Slamd64 — оригинального неофициального 64-битного форка Slackware. Хотя Slackware64 и не основана на его работе, большая часть моих знаний про настройку 32-битной части мультибиблиотечного Linux из его записок в Slamd64.
- Cross Linux From Scratch.
Вики CLFS (http://trac.cross-lfs.org/wiki/read#ReadtheCrossLinuxFromScratchBookOnline) из разряда «обязательно к прочтению», если хотите разобраться с портированием Linux на новую архитектуру. Там я позаимствовал несколько идей, концепций и патчей при создании Slackware64 с нуля, и опять, когда я создавал с нуля свои мультибиблиотечные пакеты gcc/glibc (мой README по мультибиблиотечности-с-нуля доступен в каталоге ./source).
Удачи!
Эрик
Источники
- Оригинальная статья Eric Hameleers: http://alien.slackbook.org/dokuwiki/doku.php?id=slackware:multilib
- Перевод на русский: Serg Bormant