пʼятниця, 27 червня 2008 р.

Готуємо дистрибутиви програм для офлайнового встановлення

Є одна особливість при встановленні сторонніх програм яка широко відома мабуть лише користувачам Linux - залежності. Користувачі Windows з подібними речами стикаються набагато рідше. Чому? А тому, що дистрибутив програми для Windows зазвичай містить у собі всі необхідні бібліотеки. Таким чином достатньо просто запустити setup.exe і програма встановиться. У Linux же звичайною справою є ситуація коли для того щоб встановити якийсь пакет, потрібно спочатку довстановити ще певні пакети без яких програма працювати не буде. Такий підхід, а також практика динамічної лінковки історично склалися у середовищі Linux. Якщо ви маєте швидкісний Інтернет, то це не проблема, менеджер пакетів сам розв'язує такі проблеми, сам завантажує і встановлює програми. Але як же бути коли доступу до Інтернету нема? Наприклад ваш друг попросив принести йому якусь програму, бо у нього або немає Інтернету або він занадто дорогий. У Windows все було зрозуміло - просто копіюємо дистрибутив потрібної програми на CD або флешку, йдемо до іншого комп'ютеру і просто запускаємо там інсталяцію. А як бути в такий ситуації з Linux? Власне у даній статті я і розповім, як вирішити цю проблему навчишись створювати дистрибутиви програм які містять в собі всі необхідні пакети.

Для прикладу, спробуємо створити дистрибутив текстового редактору AbiWord, який би не потребував встановлення якихось додаткових пакетів. По аналогії з Windows.

Отже, для початку, очистимо кеш менеджера пакетів:

sudo apt-get clean

Тепер нам потрібно взнати, які пакети нам потрібні щоб abiword міг працювати:

apt-cache depends abiword

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

Далі робимо так:

sudo apt-get install --reinstall -d -y abiword

І повторюємо дану команду для всіх пакетів, що згадувалися у залежностях. Це муторно робити вручну, тому краще написати скрипт, наприклад на Python.

По завершенню, у каталозі /var/cache/apt/archives можна буде знайти всі завантажені щойно пакети. Зкопіюємо їх у нашу поточну папку:

cp /var/cache/apt/archives/* ./

Тепер запакуємо наші файли в архів:

tar cvvf abiword.tar ./

Таким чином ми отримали архів abiword.tar який містить всі необхідні пакети для встановлення AbiWord. Тепер у каталозі з архівом створимо файл self.ext (gedit self.ext) і напишемо у нього наступне:


mkdir temp
SKIP=`awk '/^__ARCHIVE_FOLLOWS__/ { print NR + 1; exit 0; }' $0`
tail -n +$SKIP $0 | tar xvv -C ./temp
cd temp
sudo dpkg -i *.deb
exit 0
__ARCHIVE_FOLLOWS__


А тепер створюємо безпосередньо архів, що сам розпаковується:

cat self.ext abiword.tar > abiword_install

І даємо йому права на виконання:

chmod +x abiword_install

Власне на цьому все й готово, ми отримали файл розміром 20,6 Мб який містить все необхідне. Тепер, нам достатньо зкопіювати файл abiword_install на будь-який інший комп'ютер з Ubuntu і просто його там запустити. В результаті отримаємо встановлений AbiWord.

Оскільки процедура дійсно не проста, то я викладаю свій щойно написаний скрипт на Python який автоматизує даний процес. Ви можете завантажити його прямо звідси:

deb-packer.tar.gz

Просто розпакуйте даний архів у /usr/bin (або куди захочете) і можете використовувати утиліту. Використовувати її дуже просто:

sudo deb-packer ім'я_програми

По завершенню, у поточному каталозі з'явиться файл *.install який і представлятиме собою готовий скрипт для встановлення програми.

7 коментарів:

  1. Украинську мову вже запам'ятав практически, так что прокомментирую по-русски.
    Отличный пост, теперь у меня появился очередной хороший инструмент :-)

    ВідповістиВидалити
  2. Не зовсім згоден з тим, що так отримаєш всі залежності. sudo apt-get build-dep -d -y distrib дотягне лише тільки ті залежні пакети, яких в системі нема. А що робити, якщо вже якісь залежності встановлені перед тим, наприклад з іншим пакетом? Як на мене, то треба дивитися властивості пакету з списком залежностей за допомогою apt-cache, дотягнути тих які бракує через build-dep, і тоді тягнути вручну ті що вже є. Тоді буде повний список з УСІМА залежностями. Справа маруднувата, як на мене.

    ВідповістиВидалити
  3. Хм. Добре, я подумаю як удосконалити підхід.

    ВідповістиВидалити
  4. І дійсно, схоже, що я помилявся. Я відредагував статтю і виклав скрипт на пітоні який виконує здається всю необхідну роботу. Реалізував через apt-cache depends, так дійсно правильніше. Буду вдячний якщо хтось спробує потестувати програмку і написати відгук. На перший погляд ніби працює, але все може бути.

    ВідповістиВидалити
  5. як на мене, все-таки краще використовувати локальний репозиторій. навіть якщо в ньому буде одна програма. простіше.
    чи я чогось не знаю?
    а для перенесення репозиторію на інший комп дуже добре було б, щоби вміст папки /var/cache/apt/archives - залишався, а не зникав. це було б реально корисно.
    як таке зробити?

    ВідповістиВидалити
  6. хм... а навіщо перевстановлювати пакети? щоб вони збереглись у кеші? чому б не витягнути потрібні пакунки за допомогою wget? от тільки не знаю, як автоматизувати процес...

    ВідповістиВидалити