alienとは
みたいな話はこちらに書いてますので、参照していただけると幸いです。
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の環境で試していたんですが、 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のリポジトリに含まれているので、先に 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】パッケージの形式を変換する
- How to install deb file in RHEL 8 / CentOS 8 Linux
- Alien で rpm を deb に変換してみる
- deb パッケージを rpm パッケージに変換する
- debパッケージをrpm形式に変換する「alien」
- RPMパッケージからファイルを取り出すには
- rpmパッケージからファイルを取り出す
- yumコマンドでパッケージのダウンロードだけ行う方法
- Ubuntuでローカルにパッケージをダウンロード・インストールする
- [apt] パッケージの事前ダウンロードを行う
- "apt list"コマンドの出力をパイプに渡すと発生する、"WARNING: apt does not have a stable CLI interface. Use with caution in scripts."というエラーについて
- i386.rpm is for architecture i386 ; the package cannot be built on this systemとなったときの対応方法
- specファイル大解剖
- jpmens/jo
- コマンドラインから JSON が簡単に作れるツール jo
- jo すごいよ jo
- 話題のjoを試してみた
- joを使ってファイル一覧のJSONをつくる