創用 CC 授權條款
除非另有註明,本網站的著作Fygul Hether製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。

2020年4月12日 星期日

Unix上製作自解封存檔:makeself

摘要

前面〈淺談Ubuntu上常見的壓縮與封存命令〉提過7zip可以製作自解封存檔,然而這類自解檔較常見的形式反而可能是以 .run 或 .sh 為副檔名(或稱後綴)的自解檔。之前第一次使用到這類自解檔感覺有點新鮮,有異於7zip做出來的東西,後來發現是由makeself做出來的。

makeself可用在製作自解安裝檔的用途上,本文做點簡單介紹。

makeself簡介

makself 是開放源碼軟體專案,官網的介紹文字大致就很清楚,這裡只做簡要介紹。

makeself.sh腳本用來把某目錄打包生成可自解壓縮的tar封存檔。所產生的檔案看來就像普通的shell腳本,也可執行,以 .run 或 .sh 為後綴名。所產生的壓縮tar封存檔的開頭是段小腳本,它用來解開檔案,執行內嵌的命令,並在完成時移除暫存檔。可以指定在解開檔案後自動執行某個命令或腳本。

幾點值得留意:
  • makeself為保留與各式類Unix系統的相容性,以 sh (Bourne shell) 寫腳本代碼。在撰寫自動執行的命令或腳本時,可以用sh以外的shell,但要記得,必須採用目的電腦會有的shell,否則就白做了。
  • makeself預設採用gzip壓縮,因為類Unix系統都有。可指定壓縮選項改用壓縮比較大的xz或bzip2,但目的電腦必須要有相同的壓縮程式,否則無法解開檔案。
  • 同樣的,它提供的其他像加密功能,也大多類似上述採用系統中的其他命令來達成,故目的電腦中必須要有所要的命令,才能正確執行這些功能。

安裝makeself

Ubuntu可用apt安裝:

$ sudo apt install makeself
不過這裡為方便解說,自行到官網下載最新的版本,目前版號是2.4.0版。

makeself-2.4.0.run 本身其實也是以makeself打包的,自行找個適當的位置下載存放好後,將其調整為可執行,先看一下幫助說明:

$ wget https://github.com/megastep/makeself/releases/download/release-2.4.0/makeself-2.4.0.run
$ chmod +x makeself-2.4.0.run
$ ./makeself-2.4.0.run -h
顯示用法如下:

Makeself version 2.4.0
 1) Getting help or info about ./makeself-2.4.0.run :
  ./makeself-2.4.0.run --help   Print this message
  ./makeself-2.4.0.run --info   Print embedded info : title, default target directory, embedded script ...
  ./makeself-2.4.0.run --lsm    Print embedded lsm entry (or no LSM)
  ./makeself-2.4.0.run --list   Print the list of files in the archive
  ./makeself-2.4.0.run --check  Checks integrity of the archive

 2) Running ./makeself-2.4.0.run :
  ./makeself-2.4.0.run [options] [--] [additional arguments to embedded script]
  with following options (in that order)
  --confirm             Ask before running embedded script
  --quiet               Do not print anything except error messages
  --accept              Accept the license
  --noexec              Do not run embedded script
  --keep                Do not erase target directory after running
                        the embedded script
  --noprogress          Do not show the progress during the decompression
  --nox11               Do not spawn an xterm
  --nochown             Do not give the extracted files to the current user
  --nodiskspace         Do not check for available disk space
  --target dir          Extract directly to a target directory (absolute or relative)
                        This directory may undergo recursive chown (see --nochown).
  --tar arg1 [arg2 ...] Access the contents of the archive through the tar command
  --                    Following arguments will be passed to the embedded script
以上即以makeself製作的自解檔可用的執行選項。

現在,執行它,它會自動建立一個預設名稱為 makeself-2.4.0 的子目錄,並抽取出所有檔案放在其中。這裡為了方便使用makeself,把其中的二支 .sh 檔也複製到 /usr/bin 中:

$ ./makeself-2.4.0.run
$ cd makeslef-2.4.0
$ sudo cp *.sh /usr/bin/
如果不想用預設的子目錄名稱,可用 --target 選項,指定想要的名稱即可,同樣的,該目錄會自動建立。

由於主要的 .sh 檔已在 /usr/bin/ 中,上述解開的目錄即可自行移除。如果不想放 /usr/bin/ 中,而是放其他非系統路徑中,如家目錄下,執行makeselft.sh時,請自行加上正確的路徑。

makeself使用法

這裡看一下 makeself.sh 的使用法,另一支 makeself-header.sh 則由前者呼叫使用,我們不會直接用到它。

$ makeself.sh -h 
顯示的用法:

Usage: /usr/bin/makeself.sh [params] archive_dir file_name label startup_script [args]
params can be one or more of the following :
    --version | -v     : Print out Makeself version number and exit
    --help | -h        : Print out this help message
    --tar-quietly      : Suppress verbose output from the tar command
    --quiet | -q       : Do not print any messages other than errors.
    --gzip             : Compress using gzip (default if detected)
    --pigz             : Compress with pigz
    --bzip2            : Compress using bzip2 instead of gzip
    --pbzip2           : Compress using pbzip2 instead of gzip
    --xz               : Compress using xz instead of gzip
    --lzo              : Compress using lzop instead of gzip
    --lz4              : Compress using lz4 instead of gzip
    --compress         : Compress using the UNIX 'compress' command
    --complevel lvl    : Compression level for gzip pigz xz lzo lz4 bzip2 and pbzip2 (default 9)
    --base64           : Instead of compressing, encode the data using base64
    --gpg-encrypt      : Instead of compressing, encrypt the data using GPG
    --gpg-asymmetric-encrypt-sign
                       : Instead of compressing, asymmetrically encrypt and sign the data using GPG
    --gpg-extra opt    : Append more options to the gpg command line
    --ssl-encrypt      : Instead of compressing, encrypt the data using OpenSSL
    --ssl-passwd pass  : Use the given password to encrypt the data using OpenSSL
    --ssl-pass-src src : Use the given src as the source of password to encrypt the data
                         using OpenSSL. See "PASS PHRASE ARGUMENTS" in man openssl.
    --ssl-no-md        : Do not use "-md" option not supported by older OpenSSL.
    --nocomp           : Do not compress the data
    --notemp           : The archive will create archive_dir in the
                         current directory and uncompress in ./archive_dir
    --needroot         : Check that the root user is extracting the archive before proceeding
    --copy             : Upon extraction, the archive will first copy itself to
                         a temporary directory
    --append           : Append more files to an existing Makeself archive
                         The label and startup scripts will then be ignored
    --target dir       : Extract directly to a target directory
                         directory path can be either absolute or relative
    --nooverwrite      : Do not extract the archive if the specified target directory exists
    --current          : Files will be extracted to the current directory
                         Both --current and --target imply --notemp
    --tar-extra opt    : Append more options to the tar command line
    --untar-extra opt  : Append more options to the during the extraction of the tar archive
    --nomd5            : Don't calculate an MD5 for archive
    --nocrc            : Don't calculate a CRC for archive
    --sha256           : Compute a SHA256 checksum for the archive
    --header file      : Specify location of the header script
    --follow           : Follow the symlinks in the archive
    --noprogress       : Do not show the progress during the decompression
    --nox11            : Disable automatic spawn of a xterm
    --nowait           : Do not wait for user input after executing embedded
                         program from an xterm
    --lsm file         : LSM file describing the package
    --license file     : Append a license file
    --help-header file : Add a header to the archive's --help output
    --packaging-date date
                       : Use provided string as the packaging date
                         instead of the current date.

    --keep-umask       : Keep the umask set to shell default, rather than overriding when executing self-extracting archive.
    --export-conf      : Export configuration variables to startup_script

Do not forget to give a fully qualified startup script name
(i.e. with a ./ prefix if inside the archive).
可以看到其指令形式:

makeself.sh [params] archive_dir file_name label startup_script [args]
  • [params]:命令選項,後述。
  • archive_dir:就是要打包的目錄。
  • file_name:即自解檔名稱。
  • label:對此自解檔的描述文字。
  • starup_script:解開後要執行的腳本命令。如果是所解開目錄中的命令,記得該命令要前置 ./ 。
  • [args]則是要給startup_script的參數。
幾個選項:
  • --version | -v:顯示版號。
  • --help | -h:顯示上述的用法。
  • --notemp:不使用暫存目錄。
  • --needroot:檢查執行者是否為root。
  • --target dir:解壓縮標的目錄。可為絕對或相對路徑。

使用範例

原本嘗試做了個範例,以小小輸入法臺灣包2018年版的Linux包裝檔為例,改用makeself來製作自解安裝檔,讓makeselft解開檔案後自動執行內容有sudo ./yong-tool.sh --install的shell腳本,雖然執行上沒有錯誤訊息,但實際上不成功,所以這裡改成以yong-tool.sh顯示系統資訊。

先解開原包裝檔,用makeself把整個 yong 目錄打包,並指定解開後自動執行其中的yong-tool.sh,並給它--sysinfo選項以顯示系統資訊:

$ makeself.sh --notemp yong yong-tw2018.run "yong IME TW 2018" ./yong-tool.sh --sysinfo
沒問題的話,可以把新產生的 yong-tw2018.run 弄到目標電腦上,並在該電腦中執行它。假定在放檔案的位置啟動終端機用命令列,以解開到 /opt/yong 為例:

$ chmod +x yong-tw2018.run
$ sudo ./yong-tw2018.run --target /opt/yong
上面因要存到/opt/下才加 sudo,檔案會解開到/opt/yong下。如果不加 --target 則會在目前目錄中建立 yong 子目錄,解開檔案在其中。如果只想放在自家目錄,假定有個app子目錄放各種自用軟體,可以這樣:

$ ./yong-tw2018.run --target ~/app/yong
解開之後還要進行後續的安裝工作,可參考小小輸入法臺灣包2018年版的Linux安裝說明

參考

  • https://www.armedia.com/blog/create-a-self-extracting-installer-in-linux/

沒有留言:

張貼留言