alienを使って(debからrpmに変換してCentOS|rpmからdebに変換してUbuntu)にインストールしてみる

### [alien](http://joeyh.name/code/alien/)とは
みたいな話は[こちら](https://qiita.com/akase244/items/29ecf3463e8123b11c7b)に書いてますので、参照していただけると幸いです。

### Ubuntu 20.04 でdebからrpmに変換

#### 環境の確認

```
$ cat /etc/os-release |grep '^VERSION='
VERSION="20.04.2 LTS (Focal Fossa)"
```

#### alienをインストール

`alien` がインストールされていないことを確認。

```
$ dpkg -l |grep alien
何も表示されない。

$ apt list --installed 2>/dev/null |grep alien
何も表示されない。
```

`alien` をインストール。

```
$ sudo apt-get install alien -y
```

`alien` がインストールされたことを確認。

```
$ dpkg -l |grep alien
ii  alien                            8.95                              all          convert and install rpm and other packages

$ apt list --installed 2>/dev/null |grep alien
alien/focal,now 8.95 all [installed]
```

#### deb を rpm に変換

`jo` （JSON文字列を整形するツール）をダウンロード。
※依存関係が複雑ではなく、単一のファイルでインストール可能で実行バイナリを含むパッケージを色々と探した結果、 `jo` が候補に上がりました。

```
$ sudo apt-get --download-only install jo
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  jo
0 upgraded, 1 newly installed, 0 to remove and 57 not upgraded.
Need to get 17.1 kB of archives.
After this operation, 44.0 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu focal/universe amd64 jo amd64 1.1-1 [17.1 kB]
Fetched 17.1 kB in 1s (17.9 kB/s)
Download complete and in download only mode
```

`/var/cache/apt/archives/` 配下にダウンロードされています。

```
$ ls -l /var/cache/apt/archives/jo_1.1-1_amd64.deb 
-rw-r--r-- 1 root root 17112 Nov  2  2017 /var/cache/apt/archives/jo_1.1-1_amd64.deb
```

`alien` で `deb` から `rpm` に変換する場合は `-r` もしくは `--to-rpm` オプションを利用します。

```
$ sudo alien -r /var/cache/apt/archives/jo_1.1-1_amd64.deb
jo-1.1-2.x86_64.rpm generated
```

`jo` のrpmファイルが生成されました。

```
$ ls -l jo-1.1-2.x86_64.rpm 
-rw-r--r-- 1 root root 26400 Aug 11 15:25 jo-1.1-2.x86_64.rpm
```

### CentOS 7 でrpmからdebに変換

[元々はCentOS 8の環境で試していた](https://qiita.com/akase244/items/29ecf3463e8123b11c7b)んですが、 `alien` のインストールがどうしてもうまくいかずといった状況だったので、今回はCentOS 7を利用することにしました。

#### 環境の確認

```
$ cat /etc/os-release |grep '^VERSION='
VERSION="7 (Core)"
```

#### alienをインストール

`alien` がインストールされていないことを確認。

```
$ rpm -q alien
package alien is not installed

$ yum -q list installed alien
Error: No matching Packages to list
```

`alien` は[EPELのリポジトリ](https://fedoraproject.org/wiki/EPEL?rd=EPEL/en)に含まれているので、先に `epel-release` をインストールする必要があります。

```
$ sudo yum install epel-release -y
```

`alien` をインストール。

```
$ sudo yum install alien -y
```

`alien` がインストールされたことを確認。

```
$ rpm -q alien
alien-8.95-3.el7.noarch

$ yum -q list installed alien
Installed Packages
alien.noarch                          8.95-3.el7                          @epel
```

#### rpm を deb に変換

`jo` （JSON文字列を整形するツール）をダウンロード。

```
$ yumdownloader -q --resolve jo
```

カレントディレクトリにダウンロードされています。

```
$ ls -l jo-1.4-1.el7.x86_64.rpm 
-rw-rw-r--. 1 vagrant vagrant 30886  2月 19 21:34 jo-1.4-1.el7.x86_64.rpm
```

`alien` で `rpm` から `deb` に変換する場合は `-d` もしくは `--to-deb` オプションを利用します。

```
$ sudo alien -d jo-1.4-1.el7.x86_64.rpm 
jo_1.4-2_amd64.deb generated
```

`jo` のdebファイルが生成されました。

```
$ ls -l jo_1.4-2_amd64.deb 
-rw-r--r--. 1 root root 27094  8月 11 16:10 jo_1.4-2_amd64.deb
```

### CentOS 7 の環境で変換したdebファイルを Ubuntu 20.04 でインストール

先ほど CentOS の環境で作成した jo_1.4-2_amd64.deb を Ubuntu 環境の `/tmp` 配下にコピーしました。

```
$ ls -l /tmp/jo_1.4-2_amd64.deb 
-rw-r--r-- 1 vagrant vagrant 27094 Aug 11 16:17 /tmp/jo_1.4-2_amd64.deb
```

変換したパッケージをインストールしてみると。。。成功しました！

```
$ sudo dpkg -i /tmp/jo_1.4-2_amd64.deb 
Selecting previously unselected package jo.
(Reading database ... 70529 files and directories currently installed.)
Preparing to unpack /tmp/jo_1.4-2_amd64.deb ...
Unpacking jo (1.4-2) ...
Setting up jo (1.4-2) ...
Processing triggers for man-db (2.9.1-1) ...
```

インストールした `jo` コマンドが実行可能か試してみると。。。成功しました！！

```
$ jo foo=bar baz=  hoge@t obj=`jo key=value` -p
{
   "foo": "bar",
   "baz": null,
   "hoge": true,
   "obj": {
      "key": "value"
   }
}
```

### Ubuntu 20.04 の環境で変換したrpmファイルを CentOS 7 でインストール

先ほど Ubuntu の環境で作成した jo-1.1-2.x86_64.rpm を Ubuntu 環境の `/tmp` 配下にコピーしました。

```
$ ls -l /tmp/jo-1.1-2.x86_64.rpm 
-rw-r--r--. 1 vagrant vagrant 26400  8月 11 16:17 /tmp/jo-1.1-2.x86_64.rpm
```

変換したパッケージをインストールしてみると。。。失敗しました。

```
$ sudo rpm -i /tmp/jo-1.1-2.x86_64.rpm 
	ファイル / (パッケージ jo-1.1-2.x86_64 から) は、パッケージ filesystem-3.2-25.el7.x86_64 からのファイルと競合しています。
	ファイル /usr/bin (パッケージ jo-1.1-2.x86_64 から) は、パッケージ filesystem-3.2-25.el7.x86_64 からのファイルと競合しています。
```

このままではちょっと悔しいのでrpmファイルの中身を覗いてみます。
もし、上記のインストールが成功すると バイナリファイルの `jo` が `/usr/bin` 配下に配置されることがわかります。

```
$ rpm -qlp /tmp/jo-1.1-2.x86_64.rpm 
/
/usr
/usr/bin
/usr/bin/jo
/usr/lib/.build-id
/usr/lib/.build-id/31
/usr/lib/.build-id/31/02e0c0a5f7118ef71b4debb920273cf76d7b14
/usr/share
/usr/share/doc
/usr/share/doc/jo
/usr/share/doc/jo/changelog.Debian.gz
/usr/share/doc/jo/copyright
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/jo.1.gz
```

せっかくなのでバイナリファイルの `/usr/bin/jo` をrpmファイルから取り出してみましょう。

作業用のディレクトリを作成します。

```
$ mkdir jo
$ cd jo
```

もう一度取り出す対象を確認します。

```
$ rpm2cpio /tmp/jo-1.1-2.x86_64.rpm |cpio --list
./
./usr
./usr/bin
./usr/bin/jo
./usr/lib/.build-id
./usr/lib/.build-id/31
./usr/lib/.build-id/31/02e0c0a5f7118ef71b4debb920273cf76d7b14
./usr/share
./usr/share/doc
./usr/share/doc/jo
./usr/share/doc/jo/changelog.Debian.gz
./usr/share/doc/jo/copyright
./usr/share/man
./usr/share/man/man1
./usr/share/man/man1/jo.1.gz
68 blocks
```

抽出対象のパスである `./usr/bin/jo` を `cpio` コマンドの引数に指定して取り出します。

```
$ rpm2cpio /tmp/jo-1.1-2.x86_64.rpm |cpio -id ./usr/bin/jo
68 blocks
```

rpmファイルの中から `/usr/bin/jo` を取り出すことに成功しました。

```
$ ls -l usr/bin/jo 
-rwxr-xr-x. 1 vagrant vagrant 26616  8月 11 16:38 usr/bin/jo
```

`-bash: jo: command not found` みたいなエラーが表示されないように現在作業しているディレクトリにパスを通しておきます。

```
$ export PATH=$PATH:$HOME/jo/usr/bin
```

取り出した `jo` コマンドが実行可能か試してみると。。。成功しました！！

```
$ ~/jo/usr/bin/jo foo=bar baz=  hoge@t obj=`jo key=value` -p
{
   "foo": "bar",
   "baz": null,
   "hoge": true,
   "obj": {
      "key": "value"
   }
}
```

### まとめ

Ubuntuの環境では成功しましたが、CentOSでの結果を見てわかるように、 `alien` は万能な変換ツールではなく、割と高頻度でインストールに失敗したり、インストールに成功しても正常に実行できなかったりします。
依存関係がシンプルで単一ファイルでインストールできる `jo` のようなパッケージでもこのように失敗するので、もっと複雑な依存関係があるパッケージだとさらに失敗する可能性が高いです。

メジャーなアプリケーションであればRedHat系/Debian系のどちらの環境にも存在するはずですし、環境に応じたパッケージをインストールすると思うので、 `alien` を使う機会はなかなか無いと思いますが、例えば、大量のファイル群をtgz形式で固めておいて、それをサーバーに展開して反映するといったことをやりたい場合に、通常のパッケージのインストールと同じ手順で実施したい際には、独自のrpm/debパッケージを作成して、大量のファイルを一発でインストール（展開）するといった対応方法もあるかと思います。

システム移行の都合でRedHat系のOSからDebian系のOSに載せ替えるという話はインフラを運営しているとない話ではない（あると大変だけど）ので、 そういった場合に上記のようなお手製のパッケージを `alien` を使って変換するのは1つの手段としてわりとありかもなぁと。

### 参考URL
- [【alien】パッケージの形式を変換する](https://xtech.nikkei.com/it/atcl/column/14/230520/072800002/)
- [How to install deb file in RHEL 8 / CentOS 8 Linux](https://linuxconfig.org/how-to-install-deb-file-in-redhat-linux-8)
- [Alien で rpm を deb に変換してみる](https://blog.amedama.jp/entry/2016/03/24/015306)
- [deb パッケージを rpm パッケージに変換する](http://dotnsf.blog.jp/archives/1058021902.html)
- [debパッケージをrpm形式に変換する「alien」](https://webnetforce.net/deb-to-rpm-alien/)
- [RPMパッケージからファイルを取り出すには](https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/522rpmcpio.html)
- [rpmパッケージからファイルを取り出す](https://qiita.com/tkj/items/0c4ea811b4c656db727a)
- [yumコマンドでパッケージのダウンロードだけ行う方法](https://reasonable-code.com/yumdownloader/)
- [Ubuntuでローカルにパッケージをダウンロード・インストールする](https://pcvogel.sarakura.net/2017/02/06/31685)
- [[apt] パッケージの事前ダウンロードを行う](https://qiita.com/koara-local/items/054d78cfb20592e67042)
- ["apt list"コマンドの出力をパイプに渡すと発生する、"WARNING: apt does not have a stable CLI interface. Use with caution in scripts."というエラーについて](https://qiita.com/taro-hida/items/666c1b1cdc851b038215)
- [i386.rpm is for architecture i386 ; the package cannot be built on this systemとなったときの対応方法](https://qiita.com/ponsuke0531/items/a1e77e561a179b3132b7)
- [specファイル大解剖](https://qiita.com/mypaceshun/items/5067561d6739cc9e5199)
- [jpmens/jo](https://github.com/jpmens/jo)
- [コマンドラインから JSON が簡単に作れるツール jo](https://mattn.kaoriya.net/software/20160309091404.htm)
- [jo すごいよ jo](https://qiita.com/pottava/items/865d878658275a78fd59)
- [話題のjoを試してみた](https://qiita.com/yangci/items/4a7602df4faae5773532)
- [joを使ってファイル一覧のJSONをつくる](https://qiita.com/arabian9ts/items/41c5e7bff68d16def85c)