#!/bin/bash #Copyright 2002 William Stearns #Based on work by Jeff Dike #GPL'd. VERSION='0.3.3' MAXINT=$[ 127 * 256 * 256 * 256 ] echo mkemptyfs $VERSION usage () { echo Creates an empty filesystem in a file. echo echo Usage: echo -e '\tmkemptyfs [fstype] [size]' echo -e '\tmkemptyfs -h|--help' echo echo Where fstype is dos \(equivalent to fat and vfat\), ext2, ext3, echo minix, reiser, or swap and size is in megabytes. echo You do not need that amount of space in the current directory - echo a sparse file will be created. echo Default is an 1024M ext2 filesystem. } while [ -n "$1" ]; do case "$1" in [Dd][Oo][Ss]|[Dd][Oo][Ss][Ff][Ss]|[Ff][Aa][Tt]|[Ff][Aa][Tt][Ff][Ss]|[Vv][Ff][Aa][Tt]|[Vv][Ff][Aa][Tt][Ff][Ss]) FSTYPE='dos' ; UTIL='mkdosfs' ; MINSIZE=0 ; MAXSIZE=2047 ;; [Ee][Xx][Tt]2|[Ee][Xx][Tt]2[Ff][Ss]) FSTYPE='ext2' ; UTIL='mke2fs' ; MINSIZE=0 ; MAXSIZE=$MAXINT ;; [Ee][Xx][Tt]3|[Ee][Xx][Tt]3[Ff][Ss]) FSTYPE='ext3' ; UTIL='mke2fs' ; MINSIZE=0 ; MAXSIZE=$MAXINT ;; [Mm][Ii][Nn][Ii][Xx]|[Mm][Ii][Nn][Ii][Xx][Ff][Ss]) FSTYPE='minix' ; UTIL='mkfs.minix' ; MINSIZE=1 ; MAXSIZE=64 ;; [Rr][EeIi][IiEe][Ss][Ee][Rr]|[Rr][EeIi][IiEe][Ss][Ee][Rr][Ff][Ss]) FSTYPE='reiser' ; UTIL='mkreiserfs' ; MINSIZE=40 ; MAXSIZE=2047 ;; [Ss][Ww][Aa][Pp]|[Ss][Ww][Aa][Pp][Ff][Ss]) FSTYPE='swap' ; UTIL='mkswap' ; MINSIZE=0 ; MAXSIZE=2047 ;; -[Hh]|--[Hh][Ee][Ll][Pp]) usage exit 0 ;; #Up to 10TB [0-9]|[0-9][0-9]|[0-9][0-9][0-9]|[0-9][0-9][0-9][0-9]|[0-9][0-9][0-9][0-9][0-9]|[0-9][0-9][0-9][0-9][0-9][0-9]|[0-9][0-9][0-9][0-9][0-9][0-9][0-9]) EMPTYMEGS="$1" ;; *) echo Unrecognized command line parameter "$1", exiting usage exit 1 ;; esac shift done #Defaults EMPTYMEGS=${EMPTYMEGS:-1024} if [ -z "$FSTYPE" ]; then FSTYPE='ext2' MINSIZE=0 MAXSIZE=$MAXINT fi UTIL=${UTIL:-mke2fs} if ! type -path $UTIL >/dev/null 2>/dev/null ; then echo Missing utility $UTIL. Please install it. >>/dev/stderr exit 1 fi if [ $EMPTYMEGS -lt $MINSIZE ]; then echo $FSTYPE filesystems need to be at least $MINSIZE megabytes, exiting. exit 1 fi if [ $EMPTYMEGS -gt $MAXSIZE ]; then echo $FSTYPE filesystems can\'t be larger than $MAXSIZE megabytes, exiting. exit 1 fi EMPTYFILE="emptyfs.$FSTYPE.$EMPTYMEGS" if [ -f "$EMPTYFILE" ] || [ -f "$EMPTYFILE.old" ]; then echo Moving old empty filesystem out of the way... if [ -f "$EMPTYFILE.old" ]; then rm -f "$EMPTYFILE.old" ; fi if [ -f "$EMPTYFILE" ]; then mv -f "$EMPTYFILE" "$EMPTYFILE.old" ; fi fi if [ "$FSTYPE" != "dos" ]; then echo Creating a "$EMPTYMEGS" megabyte empty "$FSTYPE" filesystem... #Make a completely sparse file to start with dd if=/dev/zero of="$EMPTYFILE" bs=$((1024 * 1024)) count=0 seek=$EMPTYMEGS || exit 1 #Fully filled file, no sparse usage. #dd if=/dev/zero of="$EMPTYFILE" bs=$((1024 * 1024)) count=$EMPTYMEGS || exit 1 fi echo Making empty filesystem in it... # $SUDO not necessary, it appears. case $FSTYPE in dos) #Each fat fs block is 1024 bytes mkdosfs -C "$EMPTYFILE" $[ $EMPTYMEGS * 1024 ] || exit 1 chmod -x "$EMPTYFILE" ;; ext2) mke2fs -m 2 -F "$EMPTYFILE" || exit 1 ;; ext3) mke2fs -j -m 2 -F "$EMPTYFILE" || exit 1 ;; minix) mkfs.minix "$EMPTYFILE" || exit 1 ;; reiser) #3.x.0j in rh73 does _not_ honor the -f and leaves the empty file as it is. #3.6.4 in rh9 _does_ honor the -f flag. echo Reiserfs requires a block device to build, so you either need to echo be root or have sudo rights to run losetup and mkreiserfs. if [ `whoami` = root ]; then SUDO="" else SUDO=`which sudo` fi echo Clearing any old references to /dev/loop0 $SUDO losetup -d /dev/loop0 || : echo Loopback mounting $EMPTYFILE $SUDO losetup /dev/loop0 "$EMPTYFILE" || exit 1 echo Making reiserfs echo 'y' | $SUDO mkreiserfs /dev/loop0 || exit 1 echo $? echo Clearing loop device $SUDO losetup -d /dev/loop0 ;; swap) mkswap "$EMPTYFILE" || exit 1 ;; esac rm -f "$EMPTYFILE.bz2" echo Compressing filesystem... nice nice bzip2 -k -9 "$EMPTYFILE" echo 'Done!'