David Huff
2009-Aug-20 16:29 UTC
[Ovirt-devel] [PATCH ovirt-node-image] fixes for edit-livecd
Patch set fixes issues with image size increase when using edit-livecd Also address issue with ext4 root fs
David Huff
2009-Aug-20 16:29 UTC
[Ovirt-devel] [PATCH 1/3] Applied Perry Myers <pmyers@redhat.com> edit-livecd patch
Old edit-livecd just kept adding to the ext2 fs image which meant
it never decreased in size even if files were removed.
New functionality does multiple passes of ext2fs creation. First pass
creates a new ext2fs from the image file inside the squashfs. This
first pass is to allow the user to optionally increase the filesystem
size. If the -s parameter is omitted the existing size is used and this
step is a nop. The new ext2 fs is mounted to the ex-rw directory.
After ex-rw is modified by the user (either manually or through supplied
script) it is copied again to ex-min. This step is done so that the
filesystem is minimized in size (i.e. file removals will actually reduce
the size of the ext2 image and therefore reduce the overall size of the
livecd)
NOTE: There seems to be an approximate 1MB increase in size even on a nop
edit-livecd. This is not in the ext2 filesystem itself, it's seen in the
squashfs image. Not sure why this happens.
Signed-off-by: Perry Myers <pmyers at redhat.com>
---
edit-livecd | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 110 insertions(+), 13 deletions(-)
diff --git a/edit-livecd b/edit-livecd
index d69ca9d..e94b1e6 100755
--- a/edit-livecd
+++ b/edit-livecd
@@ -31,7 +31,7 @@ CD=$NODEIMG_DEFAULT
usage() {
case $# in 1) warn "$1"; try_h; exit 1;; esac
cat <<EOF
-Usage: $ME -i LiveCD.iso [-b bootparams] [-p program]
+Usage: $ME -i LiveCD.iso [-b bootparams] [-p program] [-s MB]
-b BOOTPARAMS optional parameters appended to the kernel command line
-i LIVECD.iso LiveCD ISO to edit (default: $NODEIMG_DEFAULT)
-o OUTPUT.iso specify the output file (required)
@@ -42,6 +42,7 @@ Usage: $ME -i LiveCD.iso [-b bootparams] [-p program]
the user (in another terminal) to modify the filesystem
manually. Type <enter> when done, and the script
re-packages the ISO.
+ -s Size of ext2 filesystem in MB (default is existing size)
-h display this help and exit
EXAMPLES
@@ -69,14 +70,16 @@ set -e
CODE OUTPUT_FILE+SIZE
err=0 help=0
-while getopts :b:hi:o:p: c; do
+while getopts :b:hi:o:p:s: c; do
case $c in
i) CD=$OPTARG;;
b) PARAMS=$OPTARG;;
o) OUTPUT_FILE=$OPTARG;;
p) CODE=$OPTARG;;
+ s) SIZE=$OPTARG;;
h) help=1;;
'?') err=1; warn "invalid option: \`-$OPTARG'";;
:) err=1; warn "missing argument to \`-$OPTARG' option";;
@@ -86,9 +89,9 @@ done
test $err = 1 && { try_h; exit 1; }
test $help = 1 && { usage; exit 0; }
-# Require "-o OUTPUT_FILE"
+# Require "-o OUTPUT.iso"
test -z "$OUTPUT_FILE" \
- && { warn "no output file specified; use -o FILE.iso";
try_h; exit 1; }
+ && { warn "no output file specified; use -o OUTPUT.iso";
try_h; exit 1; }
# Fail if there are any extra command-line arguments.
if test $OPTIND -le $#; then
@@ -101,6 +104,8 @@ if [ $( id -u ) -ne 0 ]; then
die "Must run as root"
fi
+test selinuxenabled || { echo "selinux not enabled, aborting" ; exit
1 ; }
+
# Check for some prerequisites.
# "type" prints "PROG not found" if it's not in $PATH.
type mkisofs
@@ -137,6 +142,71 @@ mnt() {
addExit "df | grep $mp > /dev/null 2>&1 && umount -v
$mp"
}
+# Create new ext2 filesystem and copy contents of one into the other
+# Size of ext2 filesystem is same as original size unless size parameter
+# is passed in
+create_ext2fs() {
+ local input_file=$1
+ local input_dir=$2
+ local output_file=$3
+ local output_dir=$4
+ local size_mb=$5
+
+ local size+ if [[ -n "$size_mb" ]]; then
+ size=$(( $size_mb * 1024 ))
+ fi
+
+ echo ">>> Mounting old ext3fs"
+ mnt "-t ext2 $input_file -o ro,loop" $input_dir
+ ext_used=$(df $WDIR/$input_dir | tail -1 | awk '{print $3}')
+ ext_max=$(df $WDIR/$input_dir | tail -1 | awk '{print $2}')
+
+ echo ">>> $input_file max_size=$ext_max
current_size=$ext_used"
+
+ local new_size+ if [[ -z "$size" ]]; then
+ new_size=$ext_max
+ elif [ $size -lt $ext_used ]; then
+ echo "New size of $size is less than the current used size
$ext_used"
+ exit 1
+ else
+ new_size=$size
+ fi
+
+ echo ">>> Size selected for new $output_file: $new_size"
+
+ echo ">>> Creating new ext3fs"
+ dd if=/dev/zero of=$output_file bs=1024 count=0 seek=${new_size}
+ mkfs.ext2 -b 4096 -m 1 -L "ovirt-node-image" -F $output_file
+ tune2fs -i 0 -c 0 -Odir_index -ouser_xattr,acl $output_file
+
+ echo ">>> Mounting new ext3fs"
+ mnt "-t ext2 $output_file -o rw,loop" $output_dir
+
+ SELINUX_ENFORCING=$(getenforce)
+ case $SELINUX_ENFORCING in
+ Enforcing) setenforce Permissive ;;
+ Permissive) ;;
+ *) echo "Do not run $0 with selinux in disabled mode" ; exit
1 ;;
+ esac
+
+ echo ">>> Copying data from old ext3fs to new ext3fs"
+ rsync -aX $WDIR/$input_dir/ $WDIR/$output_dir/
+
+ echo -e ">>> $(df $WDIR/$input_dir | tail -1)"
+ echo -e ">>> $(df $WDIR/$output_dir | tail -1)"
+ umount $WDIR/$output_dir
+ umount $WDIR/$input_dir
+
+ if [ "$SELINUX_ENFORCING" = "Enforcing" ]; then
+ setenforce Enforcing
+ fi
+
+ e2fsck -f -y $output_file || :
+ e2fsck -f -y $output_file || :
+}
+
addExit "rm -rf $WDIR"
ID_FS_LABEL= # initialize, in case vol_id fails
@@ -150,47 +220,73 @@ mnt "-t iso9660 $CD -o loop,ro" cd
mnt "-t squashfs $WDIR/cd/LiveOS/squashfs.img -o ro,loop" sq
# create writable copy of the new filesystem for the CD
-cp -pr $WDIR/cd $WDIR/cd-w
+rsync -a $WDIR/cd/ $WDIR/cd-w/
# create writable copy of the filesystem for the new compressed
# squashfs filesystem
-cp -pr $WDIR/sq $WDIR/sq-w
+rsync -a $WDIR/sq/ $WDIR/sq-w/
+echo ">>> Old LiveCD Size: $(du -b $CD)"
+echo ">>> Old Squash Size: $(du -b
$WDIR/cd/LiveOS/squashfs.img)"
+echo ">>> Old ext3fs Size: $(du -b
$WDIR/sq-w/LiveOS/ext3fs.img)"
-# mount root filesystem
-mnt "-t ext2 $WDIR/sq-w/LiveOS/ext3fs.img -o rw,loop" ex
+# Create copy of original ext2fs in case user wants to make
+# the file system larger than the original
+create_ext2fs $WDIR/sq-w/LiveOS/ext3fs.img ex-ro $WDIR/ext3fs-rw.img ex-rw
$SIZE
+
+echo ">>> New ext3fs Size: $(du -b $WDIR/ext3fs-rw.img)"
+
+echo ">>> Mounting new ext3fs"
+mnt "-t ext2 $WDIR/ext3fs-rw.img -o rw,loop" ex-rw
echo ">>> Updating CD content"
if [ -n "$CODE" ]; then
(
- cd $WDIR/ex
+ cd $WDIR/ex-rw
set +e
eval "$CODE"
set -e
)
else
echo "***"
- echo "*** Pausing to allow manual changes. Press any key to
continue."
+ echo "*** Pausing to allow manual changes."
+ echo "*** Make changes in $WDIR/ex-rw"
+ echo "*** Press any key to continue."
echo "***"
read
fi
+# cleanup temporary and cache locations in the chroot, rhbz#508043
+rm -rf $WDIR/ex-rw/var/cache/yum
+rm -rf $WDIR/ex-rw/tmp
+mkdir $WDIR/ex-rw/tmp
+
# Try to unmount. But this is likely to fail, so let the user retry,
-# e.g., if he forgot to "cd" out of $WDIR/ex.
+# e.g., if he forgot to "cd" out of $WDIR/ex-rw.
while :; do
echo ">>> Unmounting ext3fs"
- umount $WDIR/ex && break
+ umount $WDIR/ex-rw && break
echo ">>> Unmounting the working file system copy failed"
echo "***"
- echo "*** Did you forget to 'cd' out of $WDIR/ex?"
+ echo "*** Did you forget to 'cd' out of $WDIR/ex-rw?"
echo "***"
echo "*** Press any key to repeat the attempt."
echo "***"
read
done
+# Copy the filesystem again to make sure we minimize the image
+create_ext2fs $WDIR/ext3fs-rw.img ex-rw $WDIR/ext3fs-min.img ex-min $SIZE
+
+echo ">>> Min ext3fs Size: $(du -b $WDIR/ext3fs-min.img)"
+
+# Move the minimized ext2 filesystem into the squash directory
+mv -v $WDIR/ext3fs-min.img $WDIR/sq-w/LiveOS/ext3fs.img
+
echo ">>> Compressing filesystem"
mksquashfs $WDIR/sq-w/ $WDIR/cd-w/LiveOS/squashfs.img -noappend
+echo ">>> New Squash Size: $(du -b
$WDIR/cd-w/LiveOS/squashfs.img)"
+
echo ">>> Recomputing MD5 sums"
( cd $WDIR/cd-w && find . -type f -not -name md5sum.txt \
-not -path '*/isolinux/*' -print0 | xargs -0 -- md5sum >
md5sum.txt )
@@ -215,6 +311,7 @@ mkisofs \
echo ">>> Implanting ISO MD5 Sum"
implantisomd5 --force "$OUTPUT_FILE"
+echo ">>> New LiveCD Size: $(du -b $OUTPUT_FILE)"
# The trap ... callbacks will unmount everything.
set +e
--
1.6.2.5
David Huff
2009-Aug-20 16:29 UTC
[Ovirt-devel] [PATCH 2/3] Fixed issue with finding file system size, USED, MAX
---
edit-livecd | 9 ++++++---
1 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/edit-livecd b/edit-livecd
index e94b1e6..f519d5e 100755
--- a/edit-livecd
+++ b/edit-livecd
@@ -159,10 +159,13 @@ create_ext2fs() {
echo ">>> Mounting old ext3fs"
mnt "-t ext2 $input_file -o ro,loop" $input_dir
- ext_used=$(df $WDIR/$input_dir | tail -1 | awk '{print $3}')
- ext_max=$(df $WDIR/$input_dir | tail -1 | awk '{print $2}')
+ ext_type=$(df -P -T $WDIR/$input_dir | tail -1 | awk '{print $2}')
+ ext_max=$(df -P -T $WDIR/$input_dir | tail -1 | awk '{print $3}')
+ ext_used=$(df -P -T $WDIR/$input_dir | tail -1 | awk '{print $4}')
+ ext_avail=$(df -P -T $WDIR/$input_dir | tail -1 | awk '{print $5}')
- echo ">>> $input_file max_size=$ext_max
current_size=$ext_used"
+ echo ">>> extfs image=$input_file"
+ echo ">>> type=$ext_type max_size=$ext_max
current_size=$ext_used available=$ext_avail"
local new_size if [[ -z "$size" ]]; then
--
1.6.2.5
David Huff
2009-Aug-20 16:29 UTC
[Ovirt-devel] [PATCH 3/3] modified edit-livecd to work with ext4 fs images
---
edit-livecd | 68 ++++++++++++++++++++++++++++++++++------------------------
1 files changed, 40 insertions(+), 28 deletions(-)
diff --git a/edit-livecd b/edit-livecd
index f519d5e..483daa1 100755
--- a/edit-livecd
+++ b/edit-livecd
@@ -142,10 +142,10 @@ mnt() {
addExit "df | grep $mp > /dev/null 2>&1 && umount -v
$mp"
}
-# Create new ext2 filesystem and copy contents of one into the other
-# Size of ext2 filesystem is same as original size unless size parameter
+# Create new filesystem and copy contents of one into the other
+# Size of filesystem is same as original size unless size parameter
# is passed in
-create_ext2fs() {
+create_fs() {
local input_file=$1
local input_dir=$2
local output_file=$3
@@ -157,14 +157,14 @@ create_ext2fs() {
size=$(( $size_mb * 1024 ))
fi
- echo ">>> Mounting old ext3fs"
- mnt "-t ext2 $input_file -o ro,loop" $input_dir
+ echo ">>> Mounting old fs image"
+ mnt "-t $fs_type $input_file -o ro,loop" $input_dir
ext_type=$(df -P -T $WDIR/$input_dir | tail -1 | awk '{print $2}')
ext_max=$(df -P -T $WDIR/$input_dir | tail -1 | awk '{print $3}')
ext_used=$(df -P -T $WDIR/$input_dir | tail -1 | awk '{print $4}')
ext_avail=$(df -P -T $WDIR/$input_dir | tail -1 | awk '{print $5}')
- echo ">>> extfs image=$input_file"
+ echo ">>> old ext3fs image=$input_file info:"
echo ">>> type=$ext_type max_size=$ext_max
current_size=$ext_used available=$ext_avail"
local new_size@@ -179,13 +179,13 @@ create_ext2fs() {
echo ">>> Size selected for new $output_file: $new_size"
- echo ">>> Creating new ext3fs"
+ echo ">>> Creating new fs"
dd if=/dev/zero of=$output_file bs=1024 count=0 seek=${new_size}
- mkfs.ext2 -b 4096 -m 1 -L "ovirt-node-image" -F $output_file
+ mkfs -t $fs_type -b 4096 -m 0 -L "ovirt-node-image" -F
$output_file
tune2fs -i 0 -c 0 -Odir_index -ouser_xattr,acl $output_file
- echo ">>> Mounting new ext3fs"
- mnt "-t ext2 $output_file -o rw,loop" $output_dir
+ echo ">>> Mounting new fs"
+ mnt "-t $fs_type $output_file -o rw,loop" $output_dir
SELINUX_ENFORCING=$(getenforce)
case $SELINUX_ENFORCING in
@@ -194,20 +194,21 @@ create_ext2fs() {
*) echo "Do not run $0 with selinux in disabled mode" ; exit
1 ;;
esac
- echo ">>> Copying data from old ext3fs to new ext3fs"
+ echo ">>> Copying data from old fs to new fs"
rsync -aX $WDIR/$input_dir/ $WDIR/$output_dir/
- echo -e ">>> $(df $WDIR/$input_dir | tail -1)"
- echo -e ">>> $(df $WDIR/$output_dir | tail -1)"
- umount $WDIR/$output_dir
+ echo -e ">>> OLD fs image: $(df -T $WDIR/$input_dir | tail
-1)"
+ echo -e ">>> NEW fs Image: $(df -T $WDIR/$output_dir | tail
-1)"
+
+ umount $WDIR/$output_dir
umount $WDIR/$input_dir
if [ "$SELINUX_ENFORCING" = "Enforcing" ]; then
setenforce Enforcing
fi
- e2fsck -f -y $output_file || :
- e2fsck -f -y $output_file || :
+ echo ">>> Running fsck on new fs"
+ fsck -t $fs_type -f -y $output_file || :
}
addExit "rm -rf $WDIR"
@@ -228,18 +229,24 @@ rsync -a $WDIR/cd/ $WDIR/cd-w/
# create writable copy of the filesystem for the new compressed
# squashfs filesystem
rsync -a $WDIR/sq/ $WDIR/sq-w/
-echo ">>> Old LiveCD Size: $(du -b $CD)"
-echo ">>> Old Squash Size: $(du -b
$WDIR/cd/LiveOS/squashfs.img)"
-echo ">>> Old ext3fs Size: $(du -b
$WDIR/sq-w/LiveOS/ext3fs.img)"
-# Create copy of original ext2fs in case user wants to make
-# the file system larger than the original
-create_ext2fs $WDIR/sq-w/LiveOS/ext3fs.img ex-ro $WDIR/ext3fs-rw.img ex-rw
$SIZE
+# get info
+cd_size=$(du -b $CD)
+sq_size=$(du -b $WDIR/cd/LiveOS/squashfs.img)
+fs_size=$(du -b $WDIR/sq-w/LiveOS/ext3fs.img)
+fs_type=$(file $WDIR/sq-w/LiveOS/ext3fs.img | awk '{print $5}')
+
+echo ">>> LiveCD iso Size: $cd_size"
+echo ">>> Squash image Size: $sq_size"
+echo ">>> fs image Size: $fs_size"
+echo ">>> fs type: $fs_type"
-echo ">>> New ext3fs Size: $(du -b $WDIR/ext3fs-rw.img)"
+# Create copy of original fs image in case user wants to make
+# the file system larger than the original
+create_fs $WDIR/sq-w/LiveOS/ext3fs.img ex-ro $WDIR/ext3fs-rw.img ex-rw $SIZE
-echo ">>> Mounting new ext3fs"
-mnt "-t ext2 $WDIR/ext3fs-rw.img -o rw,loop" ex-rw
+echo ">>> remounting new fs"
+mnt "-t $fs_type $WDIR/ext3fs-rw.img -o rw,loop" ex-rw
echo ">>> Updating CD content"
if [ -n "$CODE" ]; then
@@ -277,12 +284,15 @@ while :; do
read
done
+echo ">>> New fs image size: $(du -b $WDIR/ext3fs-rw.img)"
+
# Copy the filesystem again to make sure we minimize the image
-create_ext2fs $WDIR/ext3fs-rw.img ex-rw $WDIR/ext3fs-min.img ex-min $SIZE
+echo ">>> Copying the filesystem again to minimize the
image"
+create_fs $WDIR/ext3fs-rw.img ex-rw $WDIR/ext3fs-min.img ex-min $SIZE
-echo ">>> Min ext3fs Size: $(du -b $WDIR/ext3fs-min.img)"
+echo ">>> Min fs image Size: $(du -b $WDIR/ext3fs-min.img)"
-# Move the minimized ext2 filesystem into the squash directory
+# Move the minimized filesystem into the squash directory
mv -v $WDIR/ext3fs-min.img $WDIR/sq-w/LiveOS/ext3fs.img
echo ">>> Compressing filesystem"
@@ -314,6 +324,8 @@ mkisofs \
echo ">>> Implanting ISO MD5 Sum"
implantisomd5 --force "$OUTPUT_FILE"
+
+echo ">>> Old LiveCD Size: $cd_size"
echo ">>> New LiveCD Size: $(du -b $OUTPUT_FILE)"
# The trap ... callbacks will unmount everything.
--
1.6.2.5
Reasonably Related Threads
- [PATCH node-image] Fix edit-livecd to re-create ext2 filesystem each time
- Refactor ovirt-node-image code base for inclusion in Fedora
- Refactor ovirt-node code base for inclusion in Fedora
- [RFC][PATCH] ovirt-node-image : edit-livecd : fail on error in arbitrary code
- [PATCH] edit-livecd in python