Запуск 32-х битных deb пакетов на 64-х битной ubuntu

Сегодня решил вынести в массы ещё один написанный мною скрипт. Это модификация скрипта yeoworks, в котором я оставил только конвертирование 32х битных пакетов в 64х битные и упростил процесс запуска. Возможно кто-нибудь из новичков заинтересуется, как работает скрипт, по этому под катом подробное описание.

 

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

Неверная архитектура "i386"

 

Но это легко исправить ниже описанным скриптом. Кстати, я обратил внимание, что ошибки в linux на порядок проще понять и решить, чем в windows. Например виндовская ошибка 0xc000000f … что это такое и что с этим делать догадается далеко не каждый.

А теперь приступим к скрипту. Для начала создаим файл с любым названием  в папке со скриптами.

gedit ~/.gnome2/nautilus-scripts/'32>64'

Если в адресе есть пробелы или спец символы, то берём имя в кавычки.

В открывшийся файл вставляем следующий код

#!/bin/bash
N=`basename "$*"`
D="$PWD/$N"
mkdir tukstmp
dpkg-deb -x $N tukstmp
dpkg-deb --control $N tukstmp/DEBIAN
sed -i 's/i386/all/' tukstmp/DEBIAN/control
dpkg -b tukstmp 64_$N
rm -rf tukstmp/*
rmdir tukstmp &&
$(zenity --question --text "Установить $N ?" );
if [[ $? == 0 ]]; then
gnome-terminal -x bash -i -c "
sudo dpkg -i 64_$N
"
else
exit 0
fi

Сохраняем файл и делаем его исполняемым

chmod +x ~/.gnome2/nautilus-scripts/'32>64'

Скрипт готов. Что же он делает?
Если нажать правой кнопкой по deb пакету и выбрать в сценариях 32>64

То скрипт, создаст копию файла, но с возможностью запуска на 64х разрядных системах и спросит: «установить ли программу?»

А теперь, как и обещал, объяснения работы скрипта для новичков.

Первая строчка указывает, что именно bash отвечает за следующие команды. Кроме баша есть и другие языки, например python.
Следующими 2-мя стоками мы присваиваем переменным N и D значения. Первой переменной присваиваем имя файла, а второй полный путь. $PWD это стандартная переменная в UNIX системах показывающая папку в которой мы находимся.
Далее создаём папку tukstmp и распаковываем туда deb пакет (подробнее в man dpkg)
Команда sed -i 's/i386/all/' ищет в указанном файле (tukstmp/DEBIAN/control ) слово i386 и меняет его на all.
И затем заново собираем deb пакет, но с припиской 64_
Теперь можно удалить, то что мы по распаковывали (man rm для более подробной информации).
Теперь начинается часть с вопросом об установке.
Zenity позволяет создавать графические элементы с помощью bash реализации. К счастью помощь по zenity на русском языке — zenity —help
zenity с вопросом может принимать только 2 значения: да и нет, соответственно переменная будет иметь вид $0 и $1.
Теперь переходим к оператору ЕСЛИ(if). В нашем случае если zenity является нулём, то это означает, что ответ был да и тогда мы открываем терминал и просим ввести пароль от sudo для установки программы.
Если ответ был нет и переменная приобрела значение отличное от $0, то нечего не делаем.

Вот и всё. Bash это просто и интересно :)

Поделись статьёй с друзьями

Или просто поиграйся с кнопочками

3 комментария на «Запуск 32-х битных deb пакетов на 64-х битной ubuntu»

  1. Lexx:

    Достаточно выполнить установку c опцией игнорирования архитектуры пакета:
    dpkg -i —force-architecture package.deb

  2. Андрей:

    Так я не понял: что и iа32-lib или getlibs теперь не нужно ? Простo переписал архитектуру — перепаковал пакет и все ?

Добавить комментарий