How To: Extract an RPM Package Files Without Installing It

Posted on in Categories CentOS, Data recovery, Howto, Linux, Linux distribution, package management, RedHat/Fedora Linux, Sys admin, Tips last updated October 18, 2006

You may know to how to extract a tarball and zip files on Linux and Unix-like system. Someone, recently PM me with a question:
Dear nixCraft,

How do I extract an RPM package file without installing it on my Fedora Linux or CentOS or RHEL (Red Hat Enterprise Linux) Suse Linux?

Sincerely,

CentOS user.

Extracting rpm file using combination of rpm2cpio and cpio command

To be frank, there is no direct option available for the rpm command to extract an RPM file. However, there is a small nifty utility available called rpm2cpio. It extracts cpio archive from RPM Package Manager (RPM) package. With the following hack, you will be able to extract an RPM file. First you use the rpm2cpio to convert the .rpm file into a cpio archive on standard out. If a - argument is given, an rpm stream is read from standard in. The basic syntax is as follows:

Syntax

rpm2cpio myrpmfile.rpm
rpm2cpio - < myrpmfile.rpm
rpm2cpio myrpmfile.rpm | cpio -idmv

Examples – Extract files from rpm

Download an RPM file:
$ mkdir test
$ cd test
$ wget https://www.cyberciti.biz/files/lighttpd/rhel4-php5-fastcgi/php-5.1.4-1.esp1.x86_64.rpm

To extract RPM file using rpm2cpio and cpio command, type:
$ rpm2cpio php-5.1.4-1.esp1.x86_64.rpm | cpio -idmv
Sample outputs:

/etc/httpd/conf.d/php.conf
./etc/php.d
./etc/php.ini
./usr/bin/php
./usr/bin/php-cgi
./usr/lib64/httpd/modules/libphp5.so
./usr/lib64/php
./usr/lib64/php/modules
....
.....
..
./var/lib/php/session
./var/www/icons/php.gif
19188 blocks

In this example, output of the rpm2cpio command piped to the cpio command with the following options:

  • i: Restore archive
  • d: Create leading directories where needed
  • m: Retain previous file modification times when creating files
  • v: Verbose i.e. display progress

Verify that you have extracted an RPM file in the current directory:
$ ls
Sample outputs:

etc  php-5.1.4-1.esp1.x86_64.rpm  usr  var

Say hello to tar command

Another option is just use the tar command:
$ tar xvf file.rpm

Related: How to extract a .deb file without opening it on Debian or Ubuntu Linux

Say hello to Midnight Commander

GNU Midnight Commander (mc) is a directory browser/file manager for Unix-like operating systems. Install mc using the following yum command:
# yum install mc

Opening an RPM file using Midnight Commander (mc)

You can use mc command as follows to browse or extract rpm files:
$ mc
Sample outputs:

Fig.01: Browsing / viewing an rpm file with GNU Midnight Commander
Fig.01: Browsing / viewing an rpm file with GNU Midnight Commander

Next select an RPM file (such as php-5.3*.rpm) by highlighting the package name and press Enter key. You need to select CONTENTS.cpio file:

Fig.02: The actual php rpm files are contained in the CONTENTS.cpio file
Fig.02: The actual php rpm files are contained in the CONTENTS.cpio file

To view/edit/extract files click or press on the special function keys. In this example, I pressed F3 function key to view php.conf file:
Fig.03: Viewing php.conf file
Fig.03: Viewing php.conf file

Say hello to tar command

Another option is just use the BSD tar command:
$ tar xvf file.rpm
Please note that this option only works with the BSD version of tar command. So if you are on MacOS or FreeBSD try the tar command to extract an rpm file.

Conclusion

I hope you found these tips useful to extract configuration file or another file without installing an RPM file.

See also

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin and a trainer for the Linux operating system/Unix shell scripting. He has worked with global clients and in various industries, including IT, education, defense and space research, and the nonprofit sector. Follow him on Twitter, Facebook, Google+.

43 comment

  1. I just found this page and it is great. One thing to note is that opensuse compresses the cpio part with lzma to decrease size so you have to do something like the following instead.

    rpm2cpio file.rpm | lzma -d | cpio -idmv

    This will extract the files for you.

  2. This is very good, however, I don’t think I see the installation script from inside the RPM. how do I get that? If I’m missing something, please let me know. Thank you!

  3. @Matthew,

    To display scripts you need to use rpm command as follows, this faq is about extracting file from rpm. In short type:
    rpm -pq --scripts file.rpm
    rpm -pq --scripts rsnapshot-1.3.0-1.noarch.rpm

    Here is sample output from my rpm:

    postinstall scriptlet (using /bin/sh):
    #
    # upgrade rsnapshot config file
    #
    RSNAPSHOT_CONFIG_VERSION=`/usr/bin/rsnapshot check-config-version`
    if test $? != 0; then
            echo "Error upgrading /etc/rsnapshot.conf"
    fi
     
    if test "$RSNAPSHOT_CONFIG_VERSION" = "1.2"; then
            # already latest version
            exit 0
    fi
     
    if test "$RSNAPSHOT_CONFIG_VERSION" = "unknown"; then
            /usr/bin/rsnapshot upgrade-config-file
            RETVAL=$?
            exit $RETVAL
    fi

    HTH

  4. Excellent article that helped us save a lot of time from having to actually install a 64 bit linux system just to be able to retrieve the rpms for that platform.

    I would suggest that the author remove the first two lines of the incomplete example which throws the user off until they realize that the cpio part has to be run together for actually extract the files.

    No need to display :
    rpm2cpio myrpmfile.rpm
    rpm2cpio – < myrpmfile.rpm

    (the above command dumps a continuous stream of unreadable characters to the screen)

    Just need to know :
    rpm2cpio myrpmfile.rpm | cpio -idmv

    Thanks for sharing this with the linux community.

    – Samuel Benjamin, NC.

  5. So, now I have the rpm opened and with all dirs.
    Can I just mv to / and have program installed and running?
    Yes, I know, if this works the rpm database is not updated.
    But this works?

    1. Not with all packages; rpm executes [pre/post][install/uninstall] scripts contained in the rpm…

  6. Hey, this worked great. I kept getting segmentation fault with plain old rpm and all I really needed from the rpm was some source files in a direction. πŸ™‚

  7. Fantastic! The command line as you gave it worked perfectly: 100% correct, unlike the usual almost-correct posting that I have to debug. You saved me hours of work. Thank you!

  8. I tried to extract a newer RPM (from Fedora 13 repository) on my Fedora 10 box and it wouldn’t work. The rpm2cpio program would not create a valid cpio file. I tried alien and it wouldn’t work either. I then did a “yum update rpm” and it downloaded the latest rpm package and that solved the problem.

  9. Excellent Post. Thank You very much.

    I extracted my rpm using rpm2cpio myrpmfile.rpm | cpio -idmv .

    Is ther a way to invoke some scripts from thei extracted folder.
    Ex; I have a execute.py under scripts folder of above rpm. This need to be run automatically once we extarcted the rpm.

  10. Sorry to dig up an old thread, but…

    The free 7-zip does this too… It opens .rpm, you can see the .cpio, which it also opens, & you see the dir structure to browse.

    Or just extract from the get go… Cant see the scripts though, which is what i came here looking for, so my thanks to you Vivek!

    Blurry
    Australia

  11. install Pzip from “www.peazip.org/” and get it done easily.

    The above command will not work as it showing “premature end of archive ” on Centos 5.6 32 bit architechure.

  12. good tutorial and very clear description and how to solve my problem. Thank for your tutorial. My problem about how to extract rpm file is solve πŸ™‚

  13. The rpmpeek tool from rpmdevtools looks great:

    SYNOPSIS
           rpmpeek [-h] RPM command [args...]
    
    DESCRIPTION
           rpmpeek unpacks RPM contents into a temporary directory and executes a
           command under that directory.  The directory is purged upon exit.
    
  14. Yap it works !!! i tried to convert prefix of the rpm so i unpack diffmerger rpm and repack using mavn-shell plugin and this rpm2cpio help me moving packages as i wanted !

    Great Article :
    cheers

  15. I extracted an rpm file using this method and I tried other methods too. They all resulted in two directories (etc and usr). Now I was expecting to see a .spec file or something where the dependencies are listed but I can’t find it anywhere in the extraction path. I’m trying to learn where rpm -qpR gets it’s information from.

    Any ideas?

  16. This put me on the right track. If you’re getting gibberish, the following might sort out your issue:

    rpm2cpio myapp.rpm | bsdtar -xf -
  17. Midnight comander (mc) will open it for it and extract easialy.Just point to your rpm then cpio directory and here you go your files.

  18. In Ubuntu (works on 12.04) you can open the RPM using the compressed archive manager. I.e. right click and choose from the menu).

  19. big thumbs up for

    rpm2cpio myrpmfile.rpm | cpio -idmv

    πŸ™‚

    That’s all I needed. Thanks!

Comments are closed.