Meego Wiki
Views

User:Jketreno/meego-image-resize

From MeeGo wiki
(Difference between revisions)
Jump to: navigation, search
(Created page with "#!/bin/bash TARGET=$1 [ -z ${TARGET} ] && die "Usage: $0 meego-image.bin [size in M]" shift SIZE=$1 [ -z ${SIZE} ] && SIZE=7600 function die { echo $@ exit -1 } function unh…")
Line 1: Line 1:
-
#!/bin/bash
+
#!/bin/bash
-
TARGET=$1
+
TARGET=$1
-
[ -z ${TARGET} ] && die "Usage: $0 meego-image.bin [size in M]"
+
[ -z ${TARGET} ] && die "Usage: $0 meego-image.bin [size in M]"
-
shift
+
shift
-
SIZE=$1
+
SIZE=$1
-
[ -z ${SIZE} ] && SIZE=7600
+
[ -z ${SIZE} ] && SIZE=7600
-
 
+
-
function die {
+
function die {
-
echo $@
+
echo $@
-
exit -1
+
exit -1
-
}
+
}
-
 
+
-
 
+
function unhook {
-
function unhook {
+
local path=$1
-
local path=$1
+
[ -e "${path}" ] && {
-
[ -e "${path}" ] && {
+
mount | grep -q "${PWD}/${path}" && {
-
mount | grep -q "${PWD}/${path}" && {
+
sudo umount "${path}" || die "Unable to unmount '${path}'"
-
sudo umount "${path}" || die "Unable to unmount '${path}'"
+
}
-
}
+
rmdir "${path}" || die "Unable to rmdir '${path}'"
-
rmdir "${path}" || die "Unable to rmdir '${path}'"
+
}
-
}
+
return 0
-
return 0
+
}
-
}
+
-
 
+
function hook {
-
function hook {
+
local path=$1
-
local path=$1
+
local image=$2
-
local image=$2
+
unhook "${path}"
-
unhook "${path}"
+
mkdir "${path}" || die "Unable to create directory '${path}'"
-
mkdir "${path}" || die "Unable to create directory '${path}'"
+
local VALUE=($(echo -ne "u b\np\nq\n" | parted "${image}" | grep primary))
-
local VALUE=($(echo -ne "u b\np\nq\n" | parted "${image}" | grep primary))
+
local OFFSET=${VALUE[1]/B}
-
local OFFSET=${VALUE[1]/B}
+
sudo mount -o loop,offset=${OFFSET} "${image}" "${path}" ||
-
sudo mount -o loop,offset=${OFFSET} "${image}" "${path}" ||
+
die "Unable to mount '${image}' to '${path}'"
-
die "Unable to mount '${image}' to '${path}'"
+
return 0
-
return 0
+
}
-
}
+
-
 
+
function resize {
-
function resize {
+
local image=$1
-
local image=$1
+
local size=$2
-
local size=$2
+
local tmp=($(du --apparent-size -B $((1024*1024)) "${image}"))
-
local tmp=($(du --apparent-size -B $((1024*1024)) "${image}"))
+
local current="${tmp[0]}"
-
local current="${tmp[0]}"
+
[ "${current}" != "${size}" ] && {
-
[ "${current}" != "${size}" ] && {
+
echo -n "Settting '${image}' to ${size}M..."
-
echo -n "Settting '${image}' to ${size}M..."
+
dd if=/dev/zero of=${image} bs=1M seek=$((size - 1)) count=1 > /dev/null
-
dd if=/dev/zero of=${image} bs=1M seek=$((size - 1)) count=1 > /dev/null
+
local VALUE=($(echo -ne "u b\np\nq\n" | parted "${image}" | grep btrfs\$))
-
local VALUE=($(echo -ne "u b\np\nq\n" | parted "${image}" | grep btrfs\$))
+
[ -z "${VALUE[0]}" ] && die "$0 only supports BTRFS images"
-
[ -z "${VALUE[0]}" ] && die "$0 only supports BTRFS images"
+
local OFFSET=${VALUE[1]/B}
-
local OFFSET=${VALUE[1]/B}
+
echo -e "rm 1\nmkpart primary btrfs ${OFFSET}b -1\nq" | parted "${image}" > /dev/null
-
echo -e "rm 1\nmkpart primary btrfs ${OFFSET}b -1\nq" | parted "${image}" > /dev/null
+
echo "done"
-
echo "done"
+
}
-
}
+
-
 
+
return 0
-
return 0
+
}
-
}
+
-
 
+
resize "${TARGET}" 7600
-
resize "${TARGET}" 7600
+
-
 
+
echo -n "Finalizing image resize..."
-
echo -n "Finalizing image resize..."
+
TMP=.tmp-resize
-
TMP=.tmp-resize
+
hook ${TMP} "${TARGET}"
-
hook ${TMP} "${TARGET}"
+
sudo btrfsctl -r ${SIZE}M -A $(mount | sed -ne "s,^\([^ ]*\) .*${PWD}/${TMP}.*$,\1,p")
-
sudo btrfsctl -r ${SIZE}M -A $(mount | sed -ne "s,^\([^ ]*\) .*${PWD}/${TMP}.*$,\1,p")
+
unhook ${TMP}
-
unhook ${TMP}
+
echo "done"
-
echo "done"
+

Revision as of 16:18, 1 April 2011

#!/bin/bash
TARGET=$1
[ -z ${TARGET} ] && die "Usage: $0 meego-image.bin [size in M]"
shift
SIZE=$1
[ -z ${SIZE} ] && SIZE=7600

function die {
	echo $@
	exit -1
}

function unhook {
	local path=$1
	[ -e "${path}" ] && {
		mount | grep -q "${PWD}/${path}" && {
			sudo umount "${path}" || die "Unable to unmount '${path}'"
		}
		rmdir "${path}" || die "Unable to rmdir '${path}'"
	}
	return 0
}

function hook {
	local path=$1
	local image=$2
	unhook "${path}"
	mkdir "${path}" || die "Unable to create directory '${path}'"
	local VALUE=($(echo -ne "u b\np\nq\n" | parted "${image}" | grep primary))
	local OFFSET=${VALUE[1]/B}
	sudo mount -o loop,offset=${OFFSET} "${image}" "${path}" ||
		die "Unable to mount '${image}' to '${path}'"
	return 0
}

function resize {
	local image=$1
	local size=$2
	local tmp=($(du --apparent-size -B $((1024*1024)) "${image}"))
	local current="${tmp[0]}"
	[ "${current}" != "${size}" ] && {
		echo -n "Settting '${image}' to ${size}M..."
		dd if=/dev/zero of=${image} bs=1M seek=$((size - 1)) count=1 > /dev/null
		local VALUE=($(echo -ne "u b\np\nq\n" | parted "${image}" | grep btrfs\$))
		[ -z "${VALUE[0]}" ] && die "$0 only supports BTRFS images"
		local OFFSET=${VALUE[1]/B}
		echo -e "rm 1\nmkpart primary btrfs ${OFFSET}b -1\nq" | parted "${image}" > /dev/null
		echo "done"
	}

	return 0
}

resize "${TARGET}" 7600

echo -n "Finalizing image resize..."
TMP=.tmp-resize
hook ${TMP} "${TARGET}"
sudo btrfsctl -r ${SIZE}M -A $(mount | sed -ne "s,^\([^ ]*\) .*${PWD}/${TMP}.*$,\1,p")
unhook ${TMP}
echo "done"
Personal tools