Alien 是一個可以將 Linux 的 rpm 檔與 deb 檔互相轉換的小工具,方便 Linux 管理者安裝各種類型的軟體。

通常 Linux 系統管理者都很熟悉使用自己系統上的套件管理系統來安裝軟體,例如 Debian 系列的 Linux 就會使用 apt 或 aptitude,Red Hat 系列的 Linux 則使用 yum,而 SUSE 可以使用 zypper,另外也可以直接使用比較低階 dpkgrpm 指令直接安裝套件檔,如果不想從套件管理系統安裝,也可以選擇從原始碼編譯安裝,這些都是一般在安裝軟體時常用的方式。

這裡我們要介紹 Alien 這個套件轉換工具,它可以將 Linux 最常見的 .rpm 檔與 .deb 檔互相轉換,如果您需要的套件類型剛好跟手上有的套件類型不同,就可以用 Alien 轉換一下,這種狀況通常會發生在安裝商業軟體時,廠商只提供打包好的 .rpm 檔或是 .deb 檔,沒有原始碼,只能透過這樣的工具來轉換。

使用 Alien 轉換後的套件有一定的風險,橫跨不同體系的 Linux 有可能會造成檔案損毀,除非真的沒辦法,否則不建議使用。

以下我們示範 Alien 的安裝與使用方式。

安裝 Alien

如果是在 CentOS/RHEL 7 中,要先安裝 EPEL 與 Nux Dextop repositories:

sudo yum install epel-release
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

接著安裝 Nux Dextop:

rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

本文撰寫時最新的版本是 0.5,您可以從 li.nux.ro 上面查看是否有更新的版本。

接著安裝 Alien:

sudo yum update
sudo yum install alien

上面的操作步驟同樣適用於 Fedora Linux。

如果是 Debian 系列的 Linux,就直接用 apt 安裝即可:

sudo apt-get install alien

deb 檔轉 rpm 檔

這裡我們示範如何將 .deb 檔轉換為 .rpm 檔,使用的測試環境為 CentOS 7:

cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)

以下我們選用 dateutils 這個套件為範例,示範使用 Alien 將 .deb 檔轉換為 .rpm 檔的步驟。

Step 1

通常在實際的狀況下,您的手上應該會有一個 .deb 檔,而這裡我們從 Debian 官方網站下載一個 dateutils 的 .deb 檔來做測試:

wget http://ftp.us.debian.org/debian/pool/main/d/dateutils/dateutils_0.3.1-1.1_amd64.deb

Step 2

接著使用 Alien 把 .deb 檔轉換為 .rpm 檔:

sudo alien --to-rpm --scripts dateutils_0.3.1-1.1_amd64.deb

如果順利的話,應該會看到類似這樣的訊息:

dateutils-0.3.1-2.1.x86_64.rpm generated

雖然只是轉換檔案,但是因為有檔案權限的問題,需要使用 root 權限來進行轉換,如果使用一般的使用者權限的話,會出現這樣的警告訊息:

Warning: alien is not running as root!
Warning: Ownerships of files in the generated packages will probably be wrong.

這裡還要注意一下套件版本的問題,Alien 在轉換套件時,會自動遞增版本的編號,以這個 dateutils 例子來說,轉換前的版本是 0.3.1-1.1,而經過 Alien 轉換之後,新的版本編號就變成 0.3.1-2.1,如果您不希望 Alien 自動更改版本編號,可以加上 --keep-version 參數。

Step 3

接著測試轉換出來的 .rpm 檔,使用 rpm 指令安裝:

sudo rpm -Uvh dateutils-0.3.1-2.1.x86_64.rpm

結果出現這樣的錯誤訊息:

正在準備…                       ################################# [100%]
	從 dateutils-0.3.1-2.1.x86_64 安裝的檔案 / 與來自套件 filesystem-3.2-20.el7.x86_64 的檔案產生衝突
	從 dateutils-0.3.1-2.1.x86_64 安裝的檔案 /usr/bin 與來自套件 filesystem-3.2-20.el7.x86_64 的檔案產生衝突

Step 4

接著我們要修正這個檔案衝突的問題,啟用 epel-testing 這個套件庫(repository),安裝 rpmrebuild 這個可以修改 rpm 套件的工具:

sudo yum --enablerepo=epel-testing install rpmrebuild

接著使用 rpmrebuild 修正 rpm 檔:

sudo rpmrebuild -pe dateutils-0.3.1-2.1.x86_64.rpm

rpmrebuild 會使用系統預設的編輯器來編輯 spec file 設定檔,在這個設定檔中,尋找 %files 這個段落:

(Converted from a deb package by alien version 8.90.)
%files
%dir %attr(0755, root, root) "/"
%dir %attr(0755, root, root) "/usr"
%dir %attr(0755, root, root) "/usr/bin"
%attr(0755, root, root) "/usr/bin/dateutils.dadd"
%attr(0755, root, root) "/usr/bin/dateutils.dconv"
%attr(0755, root, root) "/usr/bin/dateutils.ddiff"

//usr/bin 這兩個衝突的項目拿掉(刪除這兩行),改成這樣:

(Converted from a deb package by alien version 8.90.)
%files
%dir %attr(0755, root, root) "/usr"
%attr(0755, root, root) "/usr/bin/dateutils.dadd"
%attr(0755, root, root) "/usr/bin/dateutils.dconv"
%attr(0755, root, root) "/usr/bin/dateutils.ddiff"

修改好之後,存檔離開,離開時會詢問是否要繼續:

Do you want to continue ? (y/N)

請輸入 y 繼續,接著就產生新的 rpm 檔:

result: /root/rpmbuild/RPMS/x86_64/dateutils-0.3.1-2.1.x86_64.rpm

Step 5

安裝修改好的 rpm 檔:

sudo rpm -Uvh /root/rpmbuild/RPMS/x86_64/dateutils-0.3.1-2.1.x86_64.rpm

這樣就可以正常安裝了,輸出會像這樣:

正在準備…                       ################################# [100%]
Updating / installing...
   1:dateutils-0.3.1-2.1              ################################# [100%]

檢查一下套件列表,確認是否有裝進去:

rpm -qa | grep dateutils
dateutils-0.3.1-2.1.x86_64

最後再看一下 /usr/bin 下面新裝進去的檔案:

ls -l /usr/bin | grep dateutils
-rwxr-xr-x.   1 root root     158224 11月 15  2014 dateutils.dadd
-rwxr-xr-x.   1 root root     154128 11月 15  2014 dateutils.dconv
-rwxr-xr-x.   1 root root     162320 11月 15  2014 dateutils.ddiff
-rwxr-xr-x.   1 root root     178704 11月 15  2014 dateutils.dgrep
-rwxr-xr-x.   1 root root     166416 11月 15  2014 dateutils.dround
-rwxr-xr-x.   1 root root     158224 11月 15  2014 dateutils.dseq
-rwxr-xr-x.   1 root root     154320 11月 15  2014 dateutils.dsort
-rwxr-xr-x.   1 root root     150032 11月 15  2014 dateutils.dtest
-rwxr-xr-x.   1 root root     154128 11月 15  2014 dateutils.dzone
-rwxr-xr-x.   1 root root     150096 11月 15  2014 dateutils.strptime

實際執行測試:

dateutils.dconv --from-zone America/Chicago -z Europe/Berlin '2012-03-01 12:00' -i '%F %H:%M' -f '%F %T'

輸出為:

2012-03-01 19:00:00

這樣就完安裝了。

rpm 檔轉 deb 檔

接下來我們示範如何將 .rpm 檔轉換為 .deb 檔,讓 Debian 系列的 Linux 可以使用,使用的測試環境為 :

lsb_release -a
No LSB modules are available.
Distributor ID:	elementary OS
Description:	elementary OS Freya
Release:	0.3.2
Codename:	freya

這個系統中的 shells 有這一些:

cat /etc/shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash

以下我們示範從 CentOS 6 的套件庫下載 zsh 的 .rpm 檔,使用 Alien 把 .rpm 檔轉換成 .deb 檔來安裝。

Step 1

從 CentOS 7 的套件庫下載 zsh 的 .rpm 檔:

wget http://mirror.centos.org/centos/6/os/x86_64/Packages/zsh-4.3.11-4.el6.centos.x86_64.rpm

Step 2

使用 Alien 將 .rpm 檔轉換為 .deb 檔:

sudo alien --to-deb --scripts zsh-4.3.11-4.el6.centos.x86_64.rpm

這時候可能會有這樣的警告訊息:

warning: zsh-4.3.11-4.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY

這是套件簽署的問題,可以不用管它。正常來說,這樣就會產生 .deb 擋了。

Step 3

使用 dpkg 安裝產生出來的 .deb 檔:

sudo dpkg -i zsh_4.3.11-5_amd64.deb

安裝完成後,查看一下可用的 shells:

cat /etc/shells

輸出為:

# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/bin/zsh

實際執行 zsh 測試:

zsh --version

輸出為:

zsh 4.3.11 (x86_64-redhat-linux-gnu)

看起來正常可以執行,這樣就完成了。

處理器架構問題

如果我們手上套件的處理器架構與系統的處理器架構不同,將 .rpm 檔轉為 .deb 檔時,就會出現這樣的錯誤訊息:

zsh-4.3.11-4.el6.centos.i686.rpm is for architecture i386 ; the package cannot be built on this system

通常若遇到這樣的問題是沒有辦法使用的,最好的方式是再找找看有沒有符合自己系統處理器架構的 .rpm 套件可以使用。

如果想要強制它產生套件的話,可以用另一種方式:

sudo alien -g --script zsh-4.3.11-4.el6.centos.i686.rpm
Directories zsh-4.3.11 and zsh-4.3.11.orig prepared.

接著進入套件的目錄中,修改 debian/control 這個設定檔:

cd zsh-4.3.11
sudo vi debian/control

debian/control 的檔案內容會像這樣:

Source: zsh
Section: alien
Priority: extra
Maintainer: GTWang <gtwang@gtwang-linux>

Package: zsh
Architecture: i386
Depends: ${shlibs:Depends}
Description: A powerful interactive shell
 The zsh shell is a command interpreter usable as an interactive login
 shell and as a shell script command processor.  Zsh resembles the ksh
 shell (the Korn shell), but includes many enhancements.  Zsh supports
 command line editing, built-in spelling correction, programmable
 command completion, shell functions (with autoloading), a history
 mechanism, and more.
 .
 (Converted from a rpm package by alien version 8.90.)

i386 改為自己處理器的架構,例如 amd64

Architecture: amd64

然後儲存檔案並離開。接著執行:

sudo debian/rules binary

產生 .deb 檔,這個過程中會有很多輸出訊息,正常的話最後一行會有這樣的訊息:

dpkg-deb:把套件 `zsh' 製作為 `../zsh_4.3.11-5_amd64.deb'。

這樣就表示已經成功在上一層目錄中產生 .deb 檔了,不過雖然這樣可以產生 .deb 檔,也可以安裝,但不表示可以正常使用,通常不同處理器架構的執行檔會使用不同的函式庫,如果系統上沒有經過特別的設定,也是沒辦法正常使用的。

參考資料