Заработай на задачках

В этой статье описан способ преобразование рабочей системы архитектуры i386 в amd64 для Debian. При желании могут быть сохранены все существующие настройки и установленные программы, а может и нет 😀

Начиная с версии Debian GNU/Linux 7.0 Wheezy для пользователей стала доступна интересная возможность, которая называется мультиархитектура (multiarch). С этого момента в операционной системе могут одновременно находиться бинарные файлы (программы, библиотеки), которые относятся к различным архитектурам. На практике это обычно используется для запуска 32-битных программ из-под 64-битной ОС. Однако есть и более интересные применения.

Мы можем разрешить выполнение 64-битных программ из-под 32-х битной операционной системы. Затем заменить все 32-битные программы на их 64-битные аналоги. Что и будет продемонстрировано в этой статье.

Подготовка

Для успешного обновления ОС необходимо:

  1. 2-3 часа свободного времени;
  2. навыки работы с чистой коммандной строкой, без использования графического интерфейса;
  3. умение самостоятельно исправить недостающие зависимости пакетов с помощью dpkg и apt-get.

Многие детали, на подобии, на подобии: “завершите работу X-сервера и перейдите в консоль Linux с помощью комбинации клавиш Ctrl-Alt-F2”, будут опускаться. Подразумевается, что вы это можете сделать самостоятельно при необходимости.

Резервные копии

Cледует создать резервные копии всех файлов настроек, которые могут быть утерены в процессе обновления. Особенно если они располагаются в директории /etc, а не домашней папке пользователя. Однако следует помнить, что некоторые конфигурационные файлы не подходят для использования в различных архитектурах.

Универсального рецепта тут нет. К примеру, можно скопировать только те файлы, которые были созданы или отредактированы вручную (для моего десктопа было достаточно /etc/X11/xorg.conf и /boot/grub/grub.cfg).

Загрузка с помощью 64-битного ядра в 32-битную систему

Ядро Linux архитектуры i386 не позволяет запускать программы, скомпилированные под amd64. А вот 64-битное ядро может выполнять как 64, так и 32-битное программное обеспечение. И именно это нам и нужно:

  1. Разрешим пакетному менеджеру устанавливать программы с архитектурой amd64:
    # dpkg --add-architecture amd64
  2. Обновим список пакетов:
    # apt-get update
  3. Установим 64-битное ядро:
    # apt-get install linux-image-amd64:amd64

Кроме этого потребуется утилита, которая поможет скачать пакеты для базовой системы:

# apt-get install debootstrap

Теперь необходимо перезагрузить компьютер. В процессе установки ядра должен обновиться файл grub.cfg. Следует обязательно убедиться, что при загрузке ОС в качестве ядра была выбрана amd64-версия в меню GRUB2.

Подготовка файлов

Создадим файлы, содержащие в себе списки установленных пакетов для разных архитектур:

  1. # dpkg --get-selections "*:i386" | grep -v deinstall > packages.i386
  2. # dpkg --get-selections "*:amd64" | grep -v deinstall > packages.amd64
  3. # dpkg --get-selections "*:all" | grep -v deinstall > packages.all

Теперь скачаем пакеты, которые входят в состав базовой системы Debian.

  1. Для архитектуры i386:
    # mkdir bootstrap-i386 # debootstrap --arch=i386 --download-only jessie ./bootstrap-i386
  2. Для архитектуры amd64:
    # mkdir bootstrap-amd64 # debootstrap --arch=amd64 --download-only jessie ./bootstrap-amd64

Создадим файл, содержащий в себе список пакетов, которые входят в базовую поставку дистрибутива Debian:

# ls -l bootstrap-amd64/var/cache/apt/archives/ | egrep "\.deb$" | cut -d "_" -f1 | awk '{print $1 ":i386 install"}' > packages.base

Последующие операции следует выполнять только при наличии достаточного количества времени. Потому как перезагрузки компьютера крайне нежелательны.

Откат до базовой 32-битной системы в Debian

Производим откат дистрибутива до базовых пакетов. При этой операции появится уведомление о том, что будет удалено текущее (amd64) ядро Linux. Следует подтвердить это действие.

# dpkg --clear-selections # cat packages.base | dpkg --set-selections # apt-get dselect-upgrade

Обновление базового дистрибутива с 32 до 64-битной архитектуры

В первую очередь обновим dpkg:

  1. # mkdir archives-dpkg/partial
  2. # apt-get install -d -y -o Dir::Cache::Archives=./archives-dpkg dpkg:amd64
  3. # mv -i archives-dpkg/dpkg_*.deb .
  4. # dpkg -i archives-dpkg/*.deb
  5. # dpkg -i dpkg_*.deb
  6. # mv -i dpkg_*.deb archives-dpkg

Затем apt:

  1. # mkdir archives-apt/partial
  2. # apt-get install -d -y -o Dir::Cache::Archives=./archives-apt apt:amd64
  3. # dpkg -i archives-apt/*.deb

Очистим кэш пакетов:

# dpkg --clear-selections

Теперь несколько раз запускаем dpkg -i с пропуском ошибок, чтобы установить 64-битные пакеты для базовой системы:

# dpkg --abort-after=1000 -i bootstrap-amd64/var/cache/apt/archives/*.deb ... # dpkg --abort-after=1000 -i bootstrap-amd64/var/cache/apt/archives/*.deb

Делать это нужно до тех пор, пока не разрешатся все зависимости. Если же остаются зависимости после 5-6 запуска, которые не могут разрешиться автоматически, то следует сделать это самостоятельно:

# dpkg --force-overwrite -i bootstrap-amd64/var/cache/apt/archives/имя_пакета.deb

На данном этапе параллельно будут сосуществовать две архитектуры базовой системы Debian: i386 и amd64. Необходимо удалить 32-битные пакеты:

  1. # apt-get autoremove
  2. # apt-get dselect-upgrade

Осталось переустановить 64-битное ядро Linux:

# apt-get install locales linux-image-amd64 grub-pc

Только после этого можно безопасно перезагрузить операционною систему.

На всякий случай проверьте, существуют ли еще 32-битные пакеты в системе и, удалите их в этом случае вручную:

# dpkg --get-selections "*:i386" | grep -v deinstall

Установка программ

Cформируем список программного обеспечение, которое было установлено до обновления Linux с 32 до 64-битной архитектуры:

# cat packages.all | grep -v deinstall > packages.final # cat packages.i386 | grep -v ":i386" | grep -v deinstall | cut -f1 | awk '{print $1 " install"}' >> packages.final # cat packages.i386 | grep ":i386" | grep -v deinstall | cut -f1 | awk '{print $1 " install"}' >> packages.final # cat packages.amd64 | grep ^linux-image | grep -v deinstall | cut -d: -f1 | awk '{print $1 " install"}' >> packages.final

Удалим архитектуру i386 из поддерживаемых и установим пакеты:

# dpkg --clear-selections # dpkg --remove-architecture i386 # dselect update # cat packages.final | dpkg --set-selections # apt-get dselect upgrade # apt-get install `dpkg --get-selections "*:i386" | grep -v deinstall | cut -f1 | cut -d: -f1 | sed ':a;N;$!ba;s/\n/ /g'` # apt-get install `dpkg --get-selections "*:all" | grep -v deinstall | cut -f1 | cut -d: -f1 | sed ':a;N;$!ba;s/\n/ /g'` # apt-get install `dpkg --get-selections "*:amd64" | grep -v deinstall | cut -f1 | cut -d: -f1 | sed ':a;N;$!ba;s/\n/ /g'`

Будьте готовы к тому, что некоторые пакеты не будут самостоятельно устанавливаться. Причина заключается в том, что они создают файлы, размещаемые в местах не зависящих от архитектуры. При попытке установить свежую версию пакета другой архитектуры – выпадает ошибка.

Решить эту проблему достаточно просто. Необходимо лишь сначала очистить файлы конфигурации пакета для архитектуры i386:

# apt-get purge имя_пакета:i386

После чего повторить комманду установки. Кроме того, можно начать “жизнь с чистого листа” и вручную установить пакеты, не пользуясь сгенерированным списком, к примеру:

# apt-get install firefox ratpoison feh scrot gimp emacs sudo nano eclipse alsa-utils alsa-tools alsa-oss flashplugin-nonfree

Заключение

В результате всех этих операций у меня получился вполне себе рабочий 64-битный дистрибутив Debian. Надеюсь, что вы добьётесь того же результата =) Если же нет – задавайте вопросы в комментария, постараюсь на них как можно скорее ответить.

Я буду очень рад комментарию!

Не переживайте, e-mail нигде не отображается. Обязательные поля помечены *

Навигация по записям