Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Как создать самораспаковывающийся архив или инсталлятор в Linux

Оригинал: How to create a self-extracting archive or installer in Linux
Автор: Dan Nanni
Дата публикации: 30 июля 2013 года
Перевод: А. Кривошей
Дата перевода: январь 2014 г.

В то время как обычный файл архива требует отдельной программы (например tar, gunzip) для извлечения контента из архива, самораспаковывающийся (SFX) архив сам является исполняемым, и может сам извлекать свой контент при запуске. Самораспаковывающийся инсталлятор делает то же самое, но при этом копирует извлекаемые файлы в соответствующие директории.
В этом руководстве я покажу, как создать самораспаковывающийся архив или инсталлятор в Linux.

Для этих целей вы можете использовать утилиту командной строки под названием makeself, которая представляет собой скрипт оболочки, создающий архив, сжатый с помощью TAR, и добавляющий к нему небольшой скрипт-заглушку в начале архива для инициации самораспаковки и управления установкой извлекаемых файлов.
Чтобы установить makeself в Linux, скачайте его архив с последней версией, и распакуйте скачанный архив, как показано ниже. После того, как архив распакуется, он создаст новую директорию с названием makeself-2.1.5. Скопируйте все скрипты в директорию /usr/bin.

$ wget http://megastep.org/makeself/makeself-2.1.5.run
$ chmod 755 makeself-2.1.5.run
$ ./makeself-2.1.5.run
$ cd makeself-2.1.5
$ sudo cp *.sh /usr/bin

Базовый синтаксис makeself.sh:

makeself.sh [options] [directory_to_package] [sfx_archive_filename] [label] [startup_script] [optional_script_args]

Аргумент "label" - это сообщение, которое выводится после окончания распаковки.
Аргумент "startup_script" задает стартовый скрипт/команду, которые выполняются после успешной распаковки архива. Это полезно при создании самораспаковывающегося инсталлятора. Обычно стартовый скрипт копирует/инсталлирует извлеченный контент в соответствующие целевые директории. Стартовый скрипт может быть расположен внутри директории пакета, чтобы скрипт был включен в самораспаковывающийся архив.

Некоторые другие полезные опции makeself.sh:

--gzip : использовать для сжатия gzip (используется по умолчанию);
--bzip2 : использовать для сжатия bzip2;
--nocomp : не использовать сжатие;
--notemp :извлекать файлы не во временную директорию, а в специальную новую поддиректорию, созданную в текущей директории;
--follow : следовать всем символьным ссылкам и файлам архива, которые связаны между собой символьными ссылками.

Создание самораспаковывающегося архива

Для создания самораспаковывающегося архива, содержащего все файлы из директории ./backup, используйте приведенную ниже команду. Здесь стартовая процедура не делает ничего, кроме того, что выводит сообщение "Extraction done".

$ makeself.sh --notemp ./backup ./backup.run "SFX archive for backup" echo "Extraction done"
Header is 403 lines long

About to compress 1540 KB of data...
Adding files to archive named "./backup.run"...
./
./jpeg/
./jpeg/1.jpg
.
.
CRC: 2238411397
MD5: 0b0fd3a2ba08ffcec821b9cbaa11b70d

Самораспаковывающийся архив "./backup.run" успешно создан.
Для извлечения файлов из архива просто запустите его:

$ ./backup.run
Creating directory backup
Verifying archive integrity... All good.
Uncompressing SFX archive for backup.............
Done

Создание самораспаковывающегося инсталлятора

Если вы хотите создать самораспаковывающийся инсталлятор, вам необходимо подготовить отдельный стартовый скрипт, который будет инсталлировать извлекаемые файлы. Здесь я предполагаю, что директория программы расположена в ./program, поэтому поместим стартовый скрипт в эту директорию.

$ vi ./program/install.sh
#!/bin/sh
   
if [ -d $HOME/bin ]
then
    cp myprogram $HOME/bin/
fi

Затем сделаем стартовый скрипт исполняемым.

$ chmod 755 ./program/install.sh

И наконец создаем инсталлятор со стартовым скриптом, как показано ниже:

$ makeself.sh ./program ./program.run "SFX installer for program" ./install.sh