Description
Test that compression is reversible for squashfs-tools
. The compression types tested will be those expected to work with the version of squashfs-tools you have installed and the kernel you are running. A test script is provided to provide a consistent test result. The test script needs to be run as root so that squashfs images can be mounted and to prevent warnings about setting selinux extended attributes when running unsquashfs. The script will also create a directory in the current working directory named "test-squashfs". When run, the script will check if "test-squashf/data" is already created and if so won't recreate the test data.
Setup
- Install the required
squashfs-tools
andrpmdevtools
packages:yum install squashfs-tools rpmdevtools
How to test
- Download the test script squashfs-compression-test.sh
- As root, execute the test script using the command:
bash squashfs-compression-test.sh
. Note any failure messages.
#!/bin/bash # We need rpmdev-vercmp rpm -q rpmdevtools > /dev/null 2>&1 || (echo 'rpmdev-vercmp from rpmdevtools is needed to run this script, aborting.'; exit 1) # Define block sizes blocks=(4K 1M) # Define fill files fill=(/dev/zero /dev/urandom) # Define number of iterations iter=5 # Define fragment sizes frags=(0 1 2047 4095) # Define test directory testdir=./test-squashfs # Define mount point mp=${testdir}/mnt # Define data directory datadir=${testdir}/data # Check for squashfs-tools version and set compression types to test sqfsver=`rpm -q --qf '%{EVR}' squashfs-tools` if rpmdev-vercmp 4.1 ${sqfsver} > /dev/null; [ $? == '11' ]; then ucomp=('gzip') elif rpmdev-vercmp 4.2 ${sqfsver} > /dev/null; [ $? == '11' ]; then ucomp=(gzip lzo lzma) else ucomp=(gzip lzo lzma xz) fi # Check for kernel verion and set mount test compression types kernel=`uname -r` if rpmdev-vercmp 2.6.36 ${kernel} > /dev/null; [ $? == '11' ]; then mcomp=('gzip') elif rpmdev-vercmp 2.6.38 ${kernel} > /dev/null; [ $? == '11' ]; then mcomp=(gzip lzo) else mcomp=(gzip lzo xz) fi # Check for uid 0 and print a warning if not [ ${UID} -ne 0 ] && echo 'Mount tests will not be performed when not running as root' # Check if test directory exists and make if not [ -d ${testdir} ] || mkdir ${testdir} [ -d ${testdir} ] || (echo "Unable to make '${testdir}', aborting."; exit 1) # Check if mount point directory exists and make if not [ -d ${mp} ] || mkdir ${mp} [ -d ${mp} ] || (echo "Unable to make '${mp}', aborting."; exit 1) # Check if data directory exists and make if not if [ -d ${datadir} ]; then echo "Using existing data directory." else echo "Building data directory." mkdir ${datadir} [ -d ${datadir} ] || (echo "Unable to make '${datadir}', aborting."; exit 1) for size in ${frags[*]}; do for file in ${fill[*]}; do dd if=${file} of=${datadir}/frag-`basename ${file}`-${size} bs=1 count=${size} > /dev/null 2>&1 done done for size in ${blocks[*]}; do for ((count=1;${count}<=${iter};count++)); do for file in ${fill[*]}; do dd if=${file} of=${datadir}/file-`basename ${file}`-${size}-${count} bs=${size} count=${count} > /dev/null 2>&1 done done done for size1 in ${frags[*]}; do for file1 in ${fill[*]}; do for size2 in ${blocks[*]}; do for ((count=1;${count}<=${iter};count++)); do for file2 in ${fill[*]}; do cat ${datadir}/file-`basename ${file2}`-${size2}-${count} ${datadir}/frag-`basename ${file1}`-${size1} > ${datadir}/combined-`basename ${file2}`-${size2}-${count}-`basename ${file1}`-${size1} done done done done done fi # Run unmounted tests for comp in ${ucomp[*]}; do echo "Building squashfs image using ${comp} compression." if [ "${comp}" == gzip ]; then mksquashfs ${datadir} ${testdir}/sq.img || (echo "mksquashfs failed for ${comp} compression."; continue) else mksquashfs ${datadir} ${testdir}/sq.img -comp ${comp} || (echo "mksquashfs failed for ${comp} compression."; continue) fi echo "Testing unmounted extract using ${comp} compression." unsquashfs -d ${testdir}/sq ${testdir}/sq.img || echo "unsquashfs failed for ${comp} compression." diff -r -q ${testdir}/sq ${datadir} || echo "Extract test failed for ${comp} compression." rm -rf ${testdir}/sq if [ ${UID} == 0 ]; then for kern in ${mcomp[*]}; do if [ ${kern} == ${comp} ]; then echo "Testing mounted image using ${comp} compression." mount -r -o loop ${testdir}/sq.img ${mp} || echo "Mount failed."; diff -r -q ${mp} ${datadir} || echo "Mounted test failed for ${comp} compression." umount ${mp} break fi done fi rm -f ${testdir}/sq ${testdir}/sq.img done
Expected Results
- The test script should exit cleanly and not abort early because it was unable to create some file or free disc space running out. There should be no messages with the string
failed
in them. Typically you might run this using script and then greptypescript
forfailed
. Successful test output is included below