From: agk@sourceware.org <agk@sourceware.org>
To: lvm-devel@redhat.com
Subject: LVM2 ./WHATS_NEW scripts/fsadm.sh tools/fsadm/ ...
Date: 17 Dec 2007 12:31:51 -0000 [thread overview]
Message-ID: <20071217123151.435.qmail@sourceware.org> (raw)
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: agk at sourceware.org 2007-12-17 12:31:50
Modified files:
. : WHATS_NEW
Added files:
scripts : fsadm.sh
Removed files:
tools/fsadm : Makefile.in fsadm.c
Log message:
replace fsadm.c with fsadm.sh
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.745&r2=1.746
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/scripts/fsadm.sh.diff?cvsroot=lvm2&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/fsadm/Makefile.in.diff?cvsroot=lvm2&r1=1.5&r2=NONE
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/fsadm/fsadm.c.diff?cvsroot=lvm2&r1=1.4&r2=NONE
--- LVM2/WHATS_NEW 2007/12/14 21:53:01 1.745
+++ LVM2/WHATS_NEW 2007/12/17 12:31:49 1.746
@@ -1,5 +1,6 @@
Version 2.02.30 -
===================================
+ Replace tools/fsadm with scripts/fsadm.sh.
Append fields to report/pvsegs_cols_verbose.
Permit LV segment fields with PV segment reports.
Add seg_start_pe and seg_pe_ranges to reports.
/cvs/lvm2/LVM2/scripts/fsadm.sh,v --> standard output
revision 1.1
--- LVM2/scripts/fsadm.sh
+++ - 2007-12-17 12:31:50.989633000 +0000
@@ -0,0 +1,343 @@
+#!/bin/sh
+#
+# Copyright (C) 2007 Red Hat, Inc. All rights reserved.
+#
+# This file is part of LVM2.
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions
+# of the GNU General Public License v.2.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Zdenek Kabelac <zkabelac@redhat.com>
+#
+# Script for resizing devices (usable for LVM resize)
+#
+# Needed utilities:
+# mount, umount, grep, readlink, blockdev, blkid, fsck, xfs_check
+#
+# ext2/ext3: resize2fs, tune2fs
+# reiserfs: resize_reiserfs, reiserfstune
+# xfs: xfs_growfs, xfs_info
+#
+
+TOOL=fsadm
+
+PATH=/sbin:/usr/sbin:/bin:/usr/sbin:$PATH
+
+# utilities
+TUNE_EXT=tune2fs
+RESIZE_EXT=resize2fs
+TUNE_REISER=reiserfstune
+RESIZE_REISER=resize_reiserfs
+TUNE_XFS=xfs_info
+RESIZE_XFS=xfs_growfs
+
+MOUNT=mount
+UMOUNT=umount
+MKDIR=mkdir
+RM=rm
+BLOCKDEV=blockdev
+BLKID=blkid
+GREP=grep
+READLINK=readlink
+FSCK=fsck
+XFS_CHECK=xfs_check
+
+YES=
+DRY=0
+VERB=0
+FORCE=
+EXTOFF=0
+FSTYPE=unknown
+VOLUME=unknown
+TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$/m"
+BLOCKSIZE=
+BLOCKCOUNT=
+MOUNTPOINT=
+MOUNTED=
+REMOUNT=
+
+IFS_OLD=$IFS
+
+tool_usage() {
+ echo "${TOOL}: Utility to resize underlying filesystem"
+ echo "Usage:"
+ echo " ${TOOL} [options] check|resize device [size]"
+ echo " -h | --help show this help"
+ echo " -v | --verbose be verbose"
+ echo " -f | --force forces to proceed"
+ echo " -e | --ext-offline unmount filesystem before Ext2/3 resize"
+ echo " -n | --dry-run print commands rather than running them"
+ echo " -y | --yes answer \"yes\" to automatically proceed"
+ echo " check run fsck"
+ echo " resize resize given device to new size"
+ echo " size in filesystem blocks"
+ echo " add B to specify Bytes (i.e.: 1000000B)"
+ echo " add K to specify KiloBytes (1024B)"
+ echo " add M to specify MegaBytes (1024KB)"
+ echo " add G to specify GigaBytes (1024MB)"
+ echo " add T to specify TeraBytes (1024GB)"
+ echo " (if unspecified full device is used)"
+ exit
+}
+
+verbose() {
+ test "$VERB" -eq 1 && echo "$TOOL: $@" || true
+}
+
+error() {
+ echo "$TOOL: $@" >&2
+ cleanup 1
+}
+
+dry() {
+ verbose "Executing $@"
+ test "$DRY" -ne 0 && return 0
+ $@
+}
+
+cleanup() {
+ trap '' 2
+ # reset MOUNTPOINT - avoid recursion
+ test "$MOUNTPOINT" = "$TEMPDIR" && MOUNTPOINT="" temp_umount
+ if [ -n "$REMOUNT" ]; then
+ verbose "Remounting unmounted filesystem back"
+ dry $MOUNT "$VOLUME" "$MOUNTED"
+ fi
+ IFS=$IFS_OLD
+ trap 2
+ exit $1
+}
+
+# convert parameters from Mega/Kilo/Bytes/Blocks
+# and print number of bytes
+decode_size() {
+ case "$1" in
+ *[tT]) NEWSIZE=$(( ${1%[tT]} * 1099511627776 )) ;;
+ *[gG]) NEWSIZE=$(( ${1%[gG]} * 1073741824 )) ;;
+ *[mM]) NEWSIZE=$(( ${1%[mM]} * 1048576 )) ;;
+ *[kK]) NEWSIZE=$(( ${1%[kK]} * 1024 )) ;;
+ *[bB]) NEWSIZE=${1%[bB]} ;;
+ *) NEWSIZE=$(( $1 * $2 )) ;;
+ esac
+ #NEWBLOCKCOUNT=$(round_block_size $NEWSIZE $2)
+ NEWBLOCKCOUNT=$(( $NEWSIZE / $2 ))
+}
+
+# detect filesystem on the given device
+# dereference device name if it is symbolic link
+detect_fs() {
+ VOLUME=$($READLINK -e -n "$1")
+ # use /dev/null as cache file to be sure about the result
+ FSTYPE=$($BLKID -c /dev/null -o value -s TYPE "$VOLUME" || error "Cannot get FSTYPE of \"$VOLUME\"")
+ verbose "\"$FSTYPE\" filesystem found on \"$VOLUME\""
+}
+
+# check if the given device is already mounted and where
+detect_mounted() {
+ MOUNTED=$($MOUNT | $GREP "$VOLUME")
+ MOUNTED=${MOUNTED##* on }
+ MOUNTED=${MOUNTED% type *} # allow type in the mount name
+ test -n "$MOUNTED"
+}
+
+# get the full size of device in bytes
+detect_device_size() {
+ DEVSIZE=$($BLOCKDEV --getsize64 "$VOLUME") || error "Cannot read device \"$VOLUME\""
+}
+
+# round up $1 / $2
+# could be needed to gaurantee 'at least given size'
+# but it makes many troubles
+round_up_block_size() {
+ echo $(( ($1 + $2 - 1) / $2 ))
+}
+
+temp_mount() {
+ dry $MKDIR -p -m 0000 "$TEMPDIR" || error "Failed to create $TEMPDIR"
+ dry $MOUNT "$VOLUME" "$TEMPDIR" || error "Failed to mount $TEMPDIR"
+}
+
+temp_umount() {
+ dry $UMOUNT "$TEMPDIR" && dry $RM -r "${TEMPDIR%%m}" || error "Failed to umount $TEMPDIR"
+}
+
+yes_no() {
+ echo -n "$@? [Y|n] "
+ if [ -n "$YES" ]; then
+ ANS="y"; echo -n $ANS
+ else
+ read -n 1 ANS
+ fi
+ test -n "$ANS" && echo
+ case "$ANS" in
+ "y" | "Y" | "" ) return 0 ;;
+ esac
+ return 1
+}
+
+try_umount() {
+ yes_no "Do you want to unmount \"$MOUNTED\"" && dry $UMOUNT "$MOUNTED" && return 0
+ error "Cannot proceed test with mounted filesystem \"$MOUNTED\""
+}
+
+validate_parsing() {
+ test -n "$BLOCKSIZE" -a -n "$BLOCKCOUNT" || error "Cannot parse $1 output"
+}
+####################################
+# Resize ext2/ext3 filesystem
+# - unmounted or mounted for upsize
+# - unmounted for downsize
+####################################
+resize_ext() {
+ verbose "Parsing $TUNE_EXT -l \"$VOLUME\""
+ for i in $($TUNE_EXT -l "$VOLUME"); do
+ case "$i" in
+ "Block size"*) BLOCKSIZE=${i##* } ;;
+ "Block count"*) BLOCKCOUNT=${i##* } ;;
+ esac
+ done
+ validate_parsing $TUNE_EXT
+ decode_size $1 $BLOCKSIZE
+ FSFORCE=$FORCE
+
+ if [ $NEWBLOCKCOUNT -lt $BLOCKCOUNT -o $EXTOFF -eq 1 ]; then
+ detect_mounted && verbose "$RESIZE_EXT needs unmounted filesystem" && try_umount
+ REMOUNT=$MOUNTED
+ # CHECKME: after umount resize2fs requires fsck or -f flag.
+ FSFORCE="-f"
+ fi
+
+ verbose "Resizing \"$VOLUME\" $BLOCKCOUNT -> $NEWBLOCKCOUNT blocks ($NEWSIZE bytes, bs:$BLOCKSIZE)"
+ dry $RESIZE_EXT $FSFORCE "$VOLUME" $NEWBLOCKCOUNT
+}
+
+#############################
+# Resize reiserfs filesystem
+# - unmounted for upsize
+# - unmounted for downsize
+#############################
+resize_reiser() {
+ detect_mounted
+ if [ -n "$MOUNTED" ]; then
+ verbose "ReiserFS resizes only unmounted filesystem"
+ try_umount
+ REMOUNT=$MOUNTED
+ fi
+ verbose "Parsing $TUNE_REISER \"$VOLUME\""
+ for i in $($TUNE_REISER "$VOLUME"); do
+ case "$i" in
+ "Blocksize"*) BLOCKSIZE=${i##*: } ;;
+ "Count of blocks"*) BLOCKCOUNT=${i##*: } ;;
+ esac
+ done
+ validate_parsing $TUNE_REISER
+ decode_size $1 $BLOCKSIZE
+ verbose "Resizing \"$VOLUME\" $BLOCKCOUNT -> $NEWBLOCKCOUNT blocks ($NEWSIZE bytes, bs: $NEWBLOCKCOUNT)"
+ if [ -n "$YES" ]; then
+ dry echo y | $RESIZE_REISER -s $NEWSIZE "$VOLUME"
+ else
+ dry $RESIZE_REISER -s $NEWSIZE "$VOLUME"
+ fi
+}
+
+########################
+# Resize XFS filesystem
+# - mounted for upsize
+# - can not downsize
+########################
+resize_xfs() {
+ detect_mounted
+ MOUNTPOINT=$MOUNTED
+ if [ -z "$MOUNTED" ]; then
+ MOUNTPOINT=$TEMPDIR
+ temp_mount || error "Cannot mount Xfs filesystem"
+ fi
+ verbose "Parsing $TUNE_XFS \"$MOUNTPOINT\""
+ for i in $($TUNE_XFS "$MOUNTPOINT"); do
+ case "$i" in
+ "data"*) BLOCKSIZE=${i##*bsize=} ; BLOCKCOUNT=${i##*blocks=} ;;
+ esac
+ done
+ BLOCKSIZE=${BLOCKSIZE%%[^0-9]*}
+ BLOCKCOUNT=${BLOCKCOUNT%%[^0-9]*}
+ validate_parsing $TUNE_XFS
+ decode_size $1 $BLOCKSIZE
+ if [ $NEWBLOCKCOUNT -gt $BLOCKCOUNT ]; then
+ verbose "Resizing Xfs mounted on \"$MOUNTPOINT\" to fill device \"$VOLUME\""
+ dry $RESIZE_XFS $MOUNTPOINT
+ elif [ $NEWBLOCKCOUNT -eq $BLOCKCOUNT ]; then
+ verbose "Xfs filesystem already has the right size"
+ else
+ error "Xfs filesystem shrinking is unsupported"
+ fi
+}
+
+####################
+# Resize filesystem
+####################
+resize() {
+ detect_fs "$1"
+ detect_device_size
+ verbose "Device \"$VOLUME\" has $DEVSIZE bytes"
+ # if the size parameter is missing use device size
+ NEWSIZE=$2
+ test -z $NEWSIZE && NEWSIZE=${DEVSIZE}b
+ trap cleanup 2
+ #IFS=$'\n' # don't use bash-ism ??
+ IFS="$(printf \"\\n\")" # needed for parsing output
+ case "$FSTYPE" in
+ "ext3"|"ext2") resize_ext $NEWSIZE ;;
+ "reiserfs") resize_reiser $NEWSIZE ;;
+ "xfs") resize_xfs $NEWSIZE ;;
+ *) error "Filesystem \"$FSTYPE\" on device \"$VOLUME\" is not supported by this tool" ;;
+ esac || error "Resize $FSTYPE failed"
+ cleanup
+}
+
+###################
+# Check filesystem
+###################
+check() {
+ detect_fs "$1"
+ case "$FSTYPE" in
+ "xfs") dry $XFS_CHECK "$VOLUME" ;;
+ *) dry $FSCK $YES "$VOLUME" ;;
+ esac
+}
+
+#############################
+# start point of this script
+# - parsing parameters
+#############################
+if [ "$1" = "" ] ; then
+ tool_usage
+fi
+
+while [ "$1" != "" ]
+do
+ case "$1" in
+ "-h"|"--help") tool_usage ;;
+ "-v"|"--verbose") VERB=1 ;;
+ "-n"|"--dry-run") DRY=1 ;;
+ "-f"|"--force") FORCE="-f" ;;
+ "-e"|"--ext-offline") EXTOFF=1 ;;
+ "-y"|"--yes") YES="-y" ;;
+ "check") shift; CHECK=$1 ;;
+ "resize") shift; RESIZE=$1; shift; NEWSIZE=$1 ;;
+ *) error "Wrong argument \"$1\". (see: $TOOL --help)"
+ esac
+ shift
+done
+
+if [ -n "$CHECK" ]; then
+ check "$CHECK"
+elif [ -n "$RESIZE" ]; then
+ resize "$RESIZE" "$NEWSIZE"
+else
+ error "Missing command. (see: $TOOL --help)"
+fi
reply other threads:[~2007-12-17 12:31 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20071217123151.435.qmail@sourceware.org \
--to=agk@sourceware.org \
--cc=lvm-devel@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.