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

這樣就完安裝了。