During my recent activity I have noted to check out how to extract an ISO image in a traditional way using only shell utilities. It turned out to be easier than I thought, so I will present you three different solutions.
Extract an ISO image using p7zip
p7zip
is a file archiver which supports most file-system images.
Installation and usage
This solution requires p7zip-full package.
$ sudo apt-get install p7zip-full
Now you can extract image.iso
ISO image to the extracted_image
directory using the following command.
$ 7z x -oextracted_image image.iso
Example
Extract debian-7.6.0-amd64-CD-1.iso
ISO image to the debian_cd1
directory.
$ 7z x -odebian_cd1 debian-7.6.0-amd64-CD-1.iso 7-Zip [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18 p7zip Version 9.20 (locale=pl_PL.UTF-8,Utf16=on,HugeFiles=on,4 CPUs) Processing archive: debian-7.6.0-amd64-CD-1.iso Extracting .disk Extracting .disk/base_components Extracting .disk/base_installable Extracting .disk/cd_type Extracting .disk/info Extracting .disk/mkisofs Extracting .disk/udeb_include Extracting README.html [..] Extracting tools/loadlin.txt Extracting win32-loader.ini Extracting [BOOT]/Bootable_NoEmulation.img Everything is Ok Folders: 852 Files: 2823 Size: 660989403 Compressed: 665845760
The [BOOT]
directory
You can safely remove the [BOOT]
directory as it contains Bootable_NoEmulation.img
bootable image file and is not actually present inside directory tree.
Incorrect command line
error
You need to remember that p7zip
does not like spaces between switches and its arguments.
To visualize this problem look at the following example, then notice that space between -o
switch and its output_directory
argument is generating incorrect command line
error.
$ 7z x -o output_directory image.iso Error: Incorrect command line
Extract an ISO image using xorriso
xorriso
is a Swiss Army knife when it comes to ISO 9660 file-system image manipulation.
Installation and usage
This solution requires xorriso package.
$ sudo apt-get install xorriso
Now you can extract image.iso
ISO image to the extracted_iso_image
directory using the following command.
$ xorriso -osirrox on -indev image.iso -extract / extracted_iso_image
Example
Extract debian-7.6.0-amd64-CD-1.iso
ISO image to the debian_cd1
directory.
$ xorriso -osirrox on -indev debian-7.6.0-amd64-CD-1.iso -extract / debian_cd1 xorriso 1.3.2 : RockRidge filesystem manipulator, libburnia project. Copying of file objects from ISO image to disk filesystem is: Enabled xorriso : NOTE : Loading ISO image tree from LBA 0 xorriso : UPDATE : 3695 nodes read in 1 seconds xorriso : NOTE : Detected El-Torito boot information which currently is set to be discarded Drive current: -indev 'debian-7.6.0-amd64-CD-1.iso' Media current: stdio file, overwriteable Media status : is written , is appendable Boot record : El Torito , ISOLINUX isohybrid MBR pointing to boot image Media summary: 1 session, 325120 data blocks, 635m data, 25.3g free Volume id : 'Debian 7.6.0 amd64 1' xorriso : UPDATE : 3028 files restored ( 494.9m) in 1 seconds , 374.7xD xorriso : UPDATE : 3581 files restored ( 614.4m) in 2 seconds , 90.2xD xorriso : UPDATE : 3695 files restored ( 630.4m) in 2 seconds = 220.0xD Extracted from ISO image: file '/'='/home/milosz/Pobrane/debian_cd1'
Mount an ISO image and copy its contents
Solution with root privileges
This solution is the simplest one and does not require any additional utilities.
Create iso_contents
directory and mount image.iso
ISO image using loop device
.
$ mkdir -p iso_contents $ sudo mount -o loop image.iso iso_contents
Copy ISO image contents to desired iso_contents_copy
directory.
$ mkdir iso_contents_copy $ rsync -a -H iso_contents/ iso_contents_copy
Umount ISO image.
$ sudo umount iso_contents
You can inspect losetup
utility to explore this solution further.
Solution without root privileges
This solution requires fuseiso
utility which provides a module to mount ISO file-system images using FUSE.
$ sudo apt-get install fuseiso
Mount image.iso
ISO image to the ~/iso_contents
directory without root privileges using the following command.
$ mkdir ~/iso_contents $ fuseiso image.iso ~/iso_contents
Verify mount point.
$ mount -l -t fuse.fuseiso | grep user=$(whoami) fuseiso on /home/milosz/iso_contents type fuse.fuseiso (rw,nosuid,nodev,user=milosz)
Copy ISO image contents to desired iso_contents_copy
directory.
$ mkdir iso_contents_copy $ rsync -a -H ~/iso_contents/ iso_contents_copy
Umount ISO image.
$ fusermount -u ~/iso_contents
This solution can be easily scripted to mount desired ISO image without root privileges.