Fedoraのyumでパッケージを再インストールする

yumコマンドにはパッケージを再インストールするコマンドがないみたいなので、yumdownloaderを使ってパッケージをダウンロードし、rpmの–forceオプションを使って強制インストールする方法。

# yum install yum-utils
# yumdownloader <package>
# rpm -Uvh --force <package>.rpm


–forceオプションはちょっと恐い場合は、file-rollerでrpmを開けば中のファイルを展開できるので、必要なファイルを取り出して置き換えればいい。

# file-roller <package>.rpm

コマンドラインの場合は以下のコマンドでカレントディレクトリに展開できる。

# rpm2cpio <package>.rpm | cpio -id

 
    
[追記]
いつの間にかyumにreinstallコマンドが追加されているみたいです。(気づかなかっただけ?)
# yum reinstall [package]

Fedora – yum でソースを取得してコンパイル、デバッグする

yumでインストールできるパッケージのソースを取得して、コンパイルする方法。ここではsedを対象に行った。Fedoraで行っている。

まず、rpm-buildとyum-utilsをインストールする。

# yum install rpm-build
# yum install yum-utils

次にsedのソースrpmを取得する。

# yumdownloader --source sed
# ls
sed-4.1.5-9.fc8.src.rpm
#

このrpmをインストールすると、/usr/src/redhat/SOURCEにソースコードがコピーされる。 多くの場合パッチも一緒に入っている。このソースコードのコンパイル方法は/usr/src/redhat/SPECにあるスペックファイルのビルドセクションに記述されているが詳細は見ない。

ビルドする。

# cd /usr/src/redhat/
# rpmbuild -bc SPECS/sed.spec
.................

-bcオプションは通常パッチをあてmakeすることを意味する。このコマンドが成功すれば、BUILDディレクトリにsedのいろいろなファイルが作られている。

しかしこれらはデバッグビルドではないので、このままでは中途半端にしかデバッグできない。幸いsedはCで書かれていて基本的なmakeコマンドで処理できるので、あとはどこかでCFLAGSとして”-O0 -g”を指定してmakeすればデバッグビルドできる。

ここでは、configureスクリプトをCFLAGSを変えて起動することで行った。configureスクリプトの起動方法はSPECファイルに記述されているので、そのとおりにやらないとエラーになるかもしれないが、ここでは面倒なので無視した。

# cd /usr/src/redhat/BUILD/sed-4.1.5/
# make clean
......
# CFLAGS="-O0 -g" ./configure
......
# make
......

これでsed/sedがデバッグビルドされ、gdbなどでデバッグできる。

# cat > ttt
aaa
bbb
ccc<CTRL+D>
# gdb sed/sed
GNU gdb Red Hat Linux (6.6-45.fc8rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) break main
Breakpoint 1 at 0x8049864: file sed.c, line 179.
(gdb) r s/aaa/xxx/ ttt
Starting program: /usr/src/redhat/BUILD/sed-4.1.5/sed/sed s/aaa/xxx/ ttt

Breakpoint 1, main (argc=3, argv=0xbfd5b684) at sed.c:179
179 const char *cols = getenv("COLS");
Missing separate debuginfos, use: debuginfo-install glibc.i686
(gdb)

最後に上記作業は全部rootで行ったが、rpmdevtoolsパッケージに含まれるrpmdev-setuptreeを使えば、一般ユーザでも作業できる。参考