Обновление с Debian x32 на Debian x64 (кроссгрейд)

То что я тут покажу - это вполне необычный способ обновить ОС до 64-бит системы, но он работает.

Первый выпуск Debian с функцией Multiarch - это Wheezy, поэтому вам нужно будет выполнить обновление, прежде чем пытаться выполнить процедуру, описанную здесь.

Полное резервное копирование также настоятельно рекомендуется, так как эта процедура все еще находится в стадии разработки. Переустановка все еще более безопасный вариант. Вы были предупреждены!

Это шаги для преобразования установки i386 в amd64, но они могут применяться для любых других пар архитектуры, если ваша машина может работать как (например, armel и armhf). Вы можете использовать arch-test, чтобы определить, какие архитектуры Debian может работать ваша система. Вы можете установить поддержку добавления qemu-user-static для других архитектур Debian.

1. Добавим новую архитектуру в ОС

# dpkg --print-architecture i386
# dpkg --add-architecture amd64
# dpkg --print-foreign-architectures amd64
# apt-get update

2. Установим подходящее ядро и перезагрузимся

# apt-get install linux-image-amd64:amd64
# reboot

Внимание! Убедитесь, что вы действительно запускаете новое ядро, прежде чем переходить к следующим шагам (uname -a).

3. Синхронизуем пакеты между дистрибутивами

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

4. Кроссгрейдим пакеты установщиков tardpkgapt

Получите все пакеты, необходимые для замены dpkg, tar и apt, затем установите их для новой архитектуры. Это изменение dpkg, которое на самом деле «рассчитывает» на изменение арки по умолчанию. Tar должен быть заменен на dpkg, а не на apt, в противном случае он будет удален, тогда не будет tar, с которым можно было бы исправить положение.

# apt-get --download-only install dpkg:amd64 tar:amd64 apt:amd64
# dpkg --install /var/cache/apt/archives/*_amd64.deb
# dpkg --print-architecture amd64
# dpkg --print-foreign-architectures i386
# apt-get update

5. Кроссгрейдим зависимости

Если вы дошли до этого уровня, то теперь вы эффективно запускаете amd64, но в основном с пакетами i386. Вы можете попробовать заменить их на соответствующие пакеты amd64. Если это не сработает (еще не все библиотеки обязательно будут конвертированы в Multiarch), можно удалить пакет i386 и установить вместо него версию amd64.

Один довольно жестокий способ сделать swap:

dpkg --get-selections | grep :i386 | sed -e s/:i386/:amd64/ | dpkg --set-selections
apt-get -f install

Вам нужно будет ввести «Yes, do as I say», чтобы получить такую возможность.

6. Пример скрипта кроссгрейда (рекомендуется разработчиками Debian)

# scary script to crossgrade your debian machine between arches.
# usage crossgrade <final-architecture>
set -e

if [ -z "$1" ]; then
  echo "Usage: crossgrade <architecture>  (debian architecture to convert to)"
  exit 1
fi

#validate arch
if ! TO=$(dpkg-architecture -qDEB_HOST_ARCH -a$1); then
    echo "$1 is not a recognised architecture name"
    exit 1
fi
FROM=$(dpkg --print-architecture)
echo "Crossgrading from $FROM to $TO"

#check for a compatible kernel
# should check $FROM and $TO harder
# allow for switching kernel over too to minimal one if requested?
case $TO in
   amd64)
       TO_KERN=amd64
       ;;
   i386)
       TO_KERN=amd64
       ;;
   armhf)
       TO_KERN=armhf
       ;;
   armel)
       TO_KERN=armhf
       ;;
   arm64)
       TO_KERN=arm64
       ;;
   mips)
       TO_KERN=mips64le
       ;;
   mipsel)
       TO_KERN=mips64le
       ;;
   mips64le)
       TO_KERN=mips64le
       ;;
   ppc)
       TO_KERN=ppc64el
       ;;
   powerpc)
       TO_KERN=ppc64el
       ;;
   ppc64el)
       TO_KERN=ppc64el
esac
   
dpkg --add-architecture $TO
# check that dpkg --print-foreign-architectures is $TO
apt-get update
apt-get upgrade

# Install a kernel capable to run the new architecture with the old
# architecture in userspace

KERNEL=$(uname -m)
echo "Current kernel arch is $KERNEL"
if [ "$KERNEL" != "$TO_KERN" ]; then
    if apt-get install linux-image-$TO:$TO; then
        echo "There should be a reboot here"
        #reboot
    else
        echo "kernel updating to linux-image-$TO:$TO failed"
    fi
fi

#Crossgrade dpkg and apt
apt-get clean
apt-get --download-only install dpkg:$TO apt:$TO

#check ever package to be installed is available in same version for amd64 if installed (multiarch sync is needed)
#for pkg in /var/cache/apt/archives/*_$TO.deb
#do
#    file=$(basename $pkg)
#    pkgname= ${file%%_.*}
#    version= ${file##*._} 
#    if dpkg -l $($pkgname)
#done
#in practice this needs to run twice (do it more? is there a better way?)
if ! dpkg --install /var/cache/apt/archives/*_$TO.deb; then
    dpkg --install /var/cache/apt/archives/*_$TO.deb
fi

test $(dpkg --print-architecture) = $TO

test $(dpkg --print-foreign-architectures | grep $FROM) = $FROM

echo "Yay! dpkg and apt crossgrade completed successfully"
echo "Updating core packages"
apt-get -f install
Работаю с
КриптоПро
1С Предприятие
MacOS
Linux
Windows
Бесплатно, круглосуточно