[wiki] Migrate32To64Bit

Автор Leo, 25 марта 2014, 12:27:19

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.


qupl

#1
То что в !!! требует корректного перевода. Вычитка остального очень приветствуется.
1 часть марлезонского балета
Руководство на этой странице должно быть обновлено.  Несколько шагов теперь стали ненужными, так dpkg изначально поддерживает кросс-сборочные пакеты (хотя apt нет).  Смотрите в конце следующего анонса.

Эти инструкции не работают на текущем стабильном Debian с поддержкой нескольких архитектур.  Пошаговую инструкцию по миграции Debian Wheezy с 32 до 64 бит, см. http://www.ewan.cc/?q=node/90   
нужно отметить, что в руководстве по этой ссылке выполняются опасные и ненужные шаги, такие как распаковка сырых deb-пакетов, потому что это удаляет необходимые пакеты, вместо того, чтобы просто дать Dpkg !!!кросс-собрать!! их.

Миграция с 32-разрядной установки Debian на 64-разрядную (с i386 на x86_64)


Содержание
Миграция с 32-разрядной установки Debian на 64-разрядную (с i386 на x86_64)
Проверьте что ваш процессор Intel/AMD поддерживает 64-разрядный "long mode"
Установите 64-битное ядро
Создайте 64-разрядную мини-систему
Создайте список 64-битных бинарных файлов мини системы
Обновите вашу 32-битной систему до мини-системы
Загрузитесь  с диска аварийного восстановления
Замените вашу 32-битную базовую систему
Перезагрузитесь в вашу ​​64-битную систему
Переустановите все пакеты
Переустановите все оставшиеся 32-разрядные пакеты


После нескольких попыток найти решение, которое не требует полной переустановки системы, я начал искать подход, который бы меня устроил.  Я должен сразу извиниться, потому что он *уродливый*, но он имеет преимущество в том, что вам не нужно начинать установку, когда можно сделать что-то опасное (например потерять конфиденциальные данные при переразметке системы).  Принцип прост:
установить 64-битное ядро,
загрузиться в 64-разрядную мини-систему через CHROOT
перезаписать вашу 32-битную систему из мини-системы
переустановить все пакеты

Если вам не нравится этот путь, то предупреждаю, прекратите читать это сейчас!  Или, если вы не знакомы с apt-get, dpkg и не разберетесь в небольших скриптах, то это руководство не для вас.

Проверьте что ваш процессор Intel/AMD поддерживает 64-разрядный "long mode"

  grep -q '^flags.* lm ' < /proc/cpuinfo && echo yes



Установите 64-битное ядро

Вы можете установить соответствующий пакет ядра (например, linux-image-2.6.32-trunk-amd64) и загрузиться с ним, или вы можете собрать его самостоятельно, как это делаю я с версии ядра Linux  0.99 :).  Важно чтобы у вас был разрешен 32-битный режим эмуляции (CONFIG_IA32_EMULATION).  Он включен в ядре по умолчанию.  Если вы пропустите его (как я в первой же попытке), то при загрузке ядра, !!!! оно попытается начать инициализацию, но это 32-бит, поэтому он пытается найти соответствующий исполняемый модуль загрузчика, начав Modprobe.!!!  Но Modprobe выполняется еще 32-разрядный, поэтому ядро ​​пытается найти исполняемый модуль обработчика снова, ..., наконец, это заканчивается с сообщением что-то вроде "обнаружен бесконечный цикл, невозможно начать инициализацию".

При сборке вашего собственного 64-битного ядра на еще 32-битной системе, нужно установить пакет gcc-multilib и запускать make так
  ARCH=x86_64 make

По окончании ваше 64-битное ядро будет в arch/x86_64/boot/.

Настройте загрузчик для его загрузки и перезагрузите систему.

Теперь весь код ядра работает как 64-битной машинный код.  Плюсы по сравнению с 32-битным ядром в том, что оно использует больше регистров процессора и облегчает доступ к памяти (особенно если вы используете более 4 Гб оперативной памяти - CONFIG_HIGHMEM64G).  Но минус в том, что приложения также должны быть заменены на их 64-битные версии для улучшения производительности.


Создайте 64-разрядную мини-систему

Я буду использовать путь /chroot64, но, конечно, вы можете создать его в любом месте.  Так что, если вы запустили свое 64-битное ядро, вы уже можете запускать 64-разрядные приложения.  Но приложения редко связаны статически, они используют разделяемые библиотеки, которые будут загружены (отображены) в пространство памяти процесса динамическим загрузчиком.  Исполняемый код может быть либо 32-битным либо 64-битным.  Если приложение является 64-разрядным, то оно может использовать только 64-разрядные совместно используемые библиотеки.  !!!Это крепкий орешек перед поддержка мульти-архитектурная не будет работать в Debian.!!!  Теперь мы создадим мини-систему, которая работает только в 64-бит.  Она имеет 64-разрядные исполняемые файлы и 64-битные библиотеки от которых они зависят.

mkdir /chroot64
apt-get install debootstrap
debootstrap --arch amd64 sid /chroot64 http://ftp.debian.org/debian

Примечание: я использовал нестабильную ветку (SID) во всех моих случаях миграции, потому что у меня никогда не было чистой stable установки.  По крайней мере, некоторые пакеты были всегда установлены из SID, так что я привык жить в опасности ... :-).  Если у вас установлена стабильная 32-разрядная версия,то можно, конечно, преобразовать ее в стабильную 64-битную, но тогда и мини-систему вы должны загружать тоже stable.

"Логинимся" в вашу мини-систему и добавляем еще несколько пакетов:
chroot /chroot64
apt-get install libc6-i386 file bzip2 openssh-client lftp
<CTRL-D>

(libc6-i386 требуется чтобы существующие 32-битные исполняемые файлы продолжали работать. Bzip2 будет необходим, если вы хотите запустить "apt-get update" успешно, так как загружаемые файлы сжаты bzip. Остальные пакеты !!!на всякий случай!!!.)

Создайте список 64-битных бинарных файлов мини системы

Мини система это то, что вы хотите получить в качестве основной системы, кроме того, что а) она содержит намного меньше пакетов и б) это не основная система, а просто песочница.  Мы разделим основные, но только исполняемые файлы, и все остальные файлы (например, ваши обожаемые конфигурационные файлы в /etc останутся неизменными), поэтому составим их список:
cd /chroot64
    find . -depth | while read f
    do
       if file -L "$f" | grep -q ELF
       then
          echo "$f" >> /tmp/bins.txt
       fi
    done
    echo "./etc/ld.so.cache" >> /tmp/bins.txt

Примечание 1: вы можете запустить эти команды и в chroot, но тогда вы должны сначала перейти в его корневой каталог 'cd /'  и ваш 'bins.txt' окажется в /chroot64/tmp. 
Примечание 2: последняя команда, добавляющая ld.so.cache, очень важна!  Он не является исполняемым, но нужен динамическому компоновщику (ld.so).



Обновите вашу 32-битную систему ближе к мини-системы

Для того чтобы ваша 32-битная система была более совместима (из конфигурационных файлов POV) с 64-разрядной мини-системой, обновите все пакеты, которые вы установили в 64-разрядной мини-системе.

chroot /chroot64
dpkg --get-selections|awk '{print $1}' > /tmp/minipackages.txt
<CTRL-D>
apt-get update
apt-get install `cat /chroot64/tmp/minipackages.txt`

Загрузитесь с диска аварийного восстановления

Один шаг необходимо сделать из внешней системы (Live Linux CD), потому что некоторые бинарные файлы не могут заменить сами себя.  Или, по крайней мере, это будет рискованно.  Таким образом, скачайте CD или USB live-образ с базовым дистрибутивом. Одним из моих любимых является [ http://blag.chaox.net/|Chaox ].  Он имеет очень свежую версию ядра, он небольшой по размеру, и в нем есть все важные системные инструменты и даже X интерфейс с проприетарными драйверами NVIDIA, кроме того он работает с компакт-диска и USB "из коробки".

После загрузки смонтируйте основную систему, например в /main :
mkdir /main
mount /dev/sda1 /main
cd /main
ls # проверяем, что мы действительно в корне основной системы
cat etc/fstab # просматриваем все автомонтируемые файловые системы, например: /usr
mount /dev/sda8 /main/usr
mount /dev/sda11 /main/tmp
...

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

Важно, чтобы вы смонтировали все системные разделы в /main, так же как на работающей системе.  Если у вас, например, есть различные разделы для /bin, /usr, /usr/bin и т.д., то смонтируйте их все!

Замените вашу 32-битную систему

Заменяем бинарные файлы вашей основной системы на 64-разрядные из мини-системы:
cd /main/chroot64
cpio -pVdu /main < /main/tmp/bins.txt

Примечание: файл bins.txt тот, что вы создали ранее.  Если вы скопировали его в другое место (например, в ваш /), то вы можете не монтировать /main/tmp, потому что там нет бинарных файлов для замены.

Проверьте свои /lib* каталоги.  Вероятно, в мини-системе будут только 64-битные библиотеки в /lib64, но в вашей оригинальной системе даже не было такого каталога.  64-разрядной системе будут нужны 64-битные библиотеки в /lib.

Отключите все смонтированные разделы:
umount /main/tmp
umount /main/usr
...
umount /main

Перезагрузитесь в 64-битную систему

Теперь, когда самая важная часть вашей системы (исполняемые файлы и библиотеки) стали 64-разрядными, вы можете загрузить ее!  Конечно, 99% вашей системы по-прежнему 32-битная.  Они, скорее всего, не рабочие, потому что рудиментарные библиотеки уже 64-битные и динамический загрузчик будем жаловаться на них.  Это будет страшная загрузка :-), но у Вас будет возможность войти и использовать базовую систему.

Однажды в этом месте я получил следующее "дружественное" сообщение:
run-init: /sbin/init: No such file or directory
Kernel panic - not syncing: Attempted to kill init!

!!!! Я загрузился с USB снова и увидел, что /sbin/init есть, и это хорошая 64-разрядная Exec.  Ядро лжёт!  Или нет?  Только чуть-чуть.  !!!! init на месте, но ему нужно было загрузить libc6.so.  Конечно, 64-разрядную версию, которая располагалась в /lib64.  В корне мини-системы была символическая ссылка: /lib -> /lib64.  Так что я создал символическую ссылку (через режим восстановления) и следующая загрузка была успешной.

Переустановите все пакеты

Вы думаете, этот метод миграции ужасен, как ад?  Ужас только приходит сюда :-).  Но вы не должны бояться, ваша система не повреждена и остается безопасной.  Проблемы, которые вы увидите здесь только при установке системных файлов.  Они могут быть загружены в любое время, когда вы захотите, не так ли?

Судя по базе apt ваша система сейчас повреждена.  apt видит, что cистема уже 64-битная (uname -m), но архитектура для всех пакетов = i386.  При любой попопытке сделать что-либо через apt, он будет говорить, что необходимо исправить несоответствие выполнив "apt-get install -f".  Последуйте этому совету:
apt-get install -f

При этом будет загружено множество пакетов и начнется их переустановка.  Прекрасно.  Но вы увидите некоторые предупреждения (например, некоторые процедуры постустановки не работают, потому что они хотят использовать 32-битные исполняемые файлы, у которых больше нет соответствующих библиотек).

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

- libc не обновляется автоматически

Internal Error, Could not perform immediate configuration (2) on libc6
E: Could not perform immediate configuration on 'libc6'.Please see man 5 apt.conf under APT::Immediate-Configure for details. (2)


Apt скачал libc6-amd64, но не обновил, потому что у нее другая архитектура.  (Он не знает, что она уже изменилась, так что ничего не делает, просто обновляет собственную базу данных.) Таким образом, вы должны помочь ему:
cd /var/cache/apt/archives
dpkg -i libc6*deb

После этого вы можете продолжить 'apt-get install -f'.

- конфликтующие библиотеки

Динамический загрузчик (на момент написания) не поддерживает одновременно 32-разрядные и 64-разрядную версию одной и той же библиотеки (soname) в том же каталоге.  Если вы видите предупреждения:

ldconfig: libraries libz.so.1.2.3.0 and libz.so.1.2.3.3 in directory /usr/lib have same soname but different type.

вы должны пойти туда и проверить, какая версия является 32-разрядной.  Она будет больше не нужна , поэтому вы можете просто удалить ее:

# cd /usr/lib
# ls -l libz.so*
lrwxrwxrwx 1 root root    15 Dec 30 21:25 libz.so -> libz.so.1.2.3.4
lrwxrwxrwx 1 root root    15 Dec 30 21:25 libz.so.1 -> libz.so.1.2.3.4
-rw-r--r-- 1 root root 93936 Dec 28 20:10 libz.so.1.2.3.4
-rw-r--r-- 1 root root 93936 Jun 18 11:14 libz.so.1.2.3.0
# file libz.so.1.2.*
libz.so.1.2.3.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
libz.so.1.2.3.4: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped
# rm libz.so.1.2.3.0
# ldconfig   # теперь не будет сообщений о libz

Такие предупреждения часты, !!!если ваш старая система отстает больше от нынешней нестабильной!!!, потому что тогда новая версия той же библиотеки может иметь другую версию, поэтому они не могут быть просто перезаписаны.

- отсутствуют "базовые" пакеты

Многие скрипты postinstall запускают 'menu' and 'python'.  Но apt-get не может начать переустановку пакета с ними, вы снова можете ему помочь.  Если вы видите сообщения "update-menus failed", это о пакете «menu», и "update-menus" вызывается из !!хука!! dpkg.

cd /var/cache/apt/archives
dpkg -i menu*
dpkg -i python*

- debsums не работает

В случае, если вы получаете ошибки, что не работает perl-модуль MD5, который на самом деле является бинарным модулем Perl, вы можете установить его вручную.  Иногда процесс переустановки пакета жалуется, что в старых пакетах некоторые файлы принадлежали другому пакету, и dpkg не может перезаписать их. Вы можете заставить его:
  cd /var/cache/apt/archives
dpkg -i --force-overwrite perl*

- не удалось переустановить doc-base

doc-base использует NDBM файлы базы данных (files.db и status.db), которые как оказалось архитектурно зависимы.  Процедура обновления из 64-битной doc-base не может прочитать файлы оставшиеся от 32-битной.  Не беспокойтесь, они будут восстановлены, если вы удалите их:
cd /var/lib/doc-base/info
rm files.db status.db

Переустановите все оставшиеся 32-разрядные пакеты

После того как "apt-get install -f' успешно выполнится, миграция вашей системы будет завершена.  Но иногда часть пакетов остается 32-разрядными.  Они либо работают (если они находят свои 32-разрядные библиотеки) или нет.  Но в любом случае лучше переустановить их тоже.  Чтобы найти такие пакеты выполним следующий запрос:
dpkg-query -W -f '${Package} ${Architecture}\n' | awk '/i386$/ {print $1}'


Если вы хотите, переустановить все пакеты i386:
apt-get install `dpkg-query -W -f '${Package} ${Architecture}\n' | awk '/i386$/ {print $1}'`

Но, это не сработает для более не существующих пакетов.  Вы можете удалить по-настоящему не нужные пакеты через "apt-get purge", и попробовать команду переустановки снова.

Если в вашей системе много таких необновляемых пакетов, то вы можете найти эту процедуру утомительной.
Можно выполнить команду для каждого пакета отдельно, а о необновляемых позаботиться позже:

for p in `dpkg-query -W -f '${Package} ${Architecture}\n' | awk '/i386$/ {print $1}'`
do
apt-get -y install $p
done


это работает медленнее (база apt читается для каждого пакета), но зато необновляемые пакеты пропускаются.


И если у вас есть время, чтобы заняться оставшимися i386 "Какого черта они"-пакетами, вы можете вывести список с их описанием и решить жить им или нет:

  # dpkg-query -W -f '${Architecture} ${Package} ${Description}\n' | awk '/^i386/ {print; getline; for(;$0 ~ /^ /;getline) print; print "\n";}'
i386 pbzip2 parallel bzip2 implementation
pbzip2 is a parallel implementation of the bzip2 block-sorting file
compressor that uses pthreads and achieves near-linear speedup on SMP
machines. The output of this version is fully compatible with bzip2
v1.0.2 (ie: anything compressed with pbzip2 can be decompressed with
bzip2).


i386 pcscd Middleware to access a smart card using PC/SC (daemon side)
The purpose of PC/SC Lite is to provide a Windows(R) SCard interface
in a very small form factor for communicating to smart cards and
smart cards readers.
.
The PC/SC daemon is used to dynamically allocate/deallocate reader
drivers at runtime and manage connections to the readers.
...

Я проделывал эту процедуру много раз и полагаю, что это безопасно, реальным гикам может даже понравится.  И если вам не удалось , то можно просто установить систему с нуля так, как вы бы сделали без этого руководства.
[свернуть]

**добавил остальное

jidckii

Наверное не очень хорошо поднимать эту тему, но все же.
У меня есть сервер:
~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 7.8 (wheezy)
Release: 7.8
Codename: wheezy
~$ uname -a
Linux keikogi.ru 3.16.0-0.bpo.4-686-pae #1 SMP Debian 3.16.7-ckt9-3~deb8u1~bpo70+1 (2015-04-27) i686 GNU/Linux


Есть нужда переехать на 64 битную платформу(нужен LXC).
Переустанавливать все с 0 ну очень геморойно будет, так как очень много сервисов поднято.
С английским не очень, с этой статьей ознакомился и как понял мне нужен вот этот гайд : http://www.ewan.cc/?q=node/90.
Кто имеет опыт, помогите пожалуйста с данным вопросом, может есть инфа на русском подобная ?
Lenovo U410, Jessie