Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
#!/bin/sh # "hddimg", by Andrew Brockman # Version: 2008apr22 (with a header added by Edrx) # License unclear - he sent me this by e-mail. # http://angg.twu.net/PLURALL/hddimg.html # http://angg.twu.net/PLURALL/hddimg # (find-es "plurall" "hddimg") # clear cylendars=20 heads=64 sectors=32 point=/media/vhd filename= size= errpipe=/tmp/stderr.log outpipe=/tmp/stdout.log dev=/tmp/free.dev grub= fs=ext2 usage () { cat <<%%% Usage: $0 [OPTION] imageName Create a hdd image with a given geometry -h or --help print this help -c=INTEGER number of cylendars = INTEGER -h=INTEGER number of heads = INTEGER -s=INTEGER number of sectors per track = INTEGER -f=FILE_SYSTEM create with the filesystem FILE_SYSTEM supported filesystems are: ext2 vfat minix reiserfs -g Install grub onto image -m=DIR mount into folder DIR Note that there is a set of discrete values that each parameter can take %%% } for option in "$@"; do case "$option" in -h | --help) usage exit 0 ;; -g) grub=true ;; -c=*) cylendars=`echo "$option" | sed 's/-c=//'` ;; -f=*) fs=`echo "$option" | sed 's/-f=//'` ;; -h=*) heads=`echo "$option" | sed 's/-h=//'` ;; -s=*) sectors=`echo "$option" | sed 's/-s=//'` ;; -m=*) point=`echo "$option" | sed 's/-m=//'` ;; -*) echo "Unrecognized option \`$option'" 1>&2 usage exit 1 ;; *) if test "x$filename" != x; then echo "More than one image file?" 1>&2 usage exit 1 fi filename="${option}" ;; esac done size=`expr "$cylendars" "*" "$heads"` size=`expr "$sectors" "*" "$size"` size=`expr "$size" "/" "2"` #check if a output file was specified if [ "x$filename" = "x" ]; then echo "You must specify an output file\nType \"$0 --help\" for more help" exit 1 fi #remove old image file if it exists if [ -f $filename ]; then echo "Removing the old image file" rm $filename fi #create new image file echo "Creating new image file" dd if=/dev/zero of=$filename bs=1024 count=$size 1>$outpipe 2>$errpipe #fdisk with specified geometry #echo "Partitioning the new image file" #sudo fdisk -C $cylendars -H $heads -S $sectors $filename 1>$outpipe 2>$errpipe<<%%% #n #p #1 # # #w #%%% #Associate the virtual disk to a loop device echo "Istalling raw image file into: \c" sudo losetup -f | tee $dev 2>$errpipe sudo losetup -o 32256 $(cat $dev) $filename 1>$outpipe 2>$errpipe #format the image, then make an ext2 filesystem echo "Formatting the new partition" size=`expr "$size" "-" "16"` sudo dd if=/dev/zero of=$(cat $dev) bs=1024 count=$size 1>$outpipe 2>$errpipe echo "Creating file system on the new partition" case "$fs" in ext2) sudo mke2fs -b 1024 -v $(cat $dev) $temp 1>$outpipe 2>$errpipe ;; vfat) sudo mkfs.vfat $(cat $dev) $temp 1>$outpipe 2>$errpipe ;; # jfs) # sudo mkfs.jfs $(cat $dev) $temp 1>$outpipe 2>$errpipe ;; minix) sudo mkfs.minix $(cat $dev) $temp 1>$outpipe 2>$errpipe ;; reiserfs) sudo mkfs.reiserfs $(cat $dev) $temp 1>$outpipe 2>$errpipe ;; # xfs) # sudo mkfs.xfs $(cat $dev) $temp 1>$outpipe 2>$errpipe ;; *) echo "Error formatting the image: Unknown file system type" ;; esac #dismount loop devices echo "Dismounting the raw disk image" sudo losetup -d $(cat $dev) 1>$outpipe 2>$errpipe sudo rm $dev #check and see if we want grub if test "x$grub" = "x"; then echo "Finished creating the image file, would you like to mount it now? [y] \c" option= read option if [ "$option" = "y" ] || [ "x$option" = "x" ]; then echo "Mounting the image file" sudo mount -o loop,offset=32256 $filename $point 1>$outpipe 2>$errpipe fi exit 1 fi #mount the image test -d "$point" || sudo mkdir "$point" 1>$outpipe 2>$errpipe sudo umount $point 1>$outpipe 2>$errpipe echo "Mounting the new partion to \"$point\"" sudo mount -o loop,offset=32256 $filename $point 1>$outpipe 2>$errpipe #################################################################### #GRUB instalation echo "Installing grub" bootdir=${point}/boot grubdir=${bootdir}/grub pkglibdir=/usr/lib/grub/x86-pc echo "Making directory: \"$bootdir\"" sudo mkdir "$bootdir" 1>$outpipe 2>$errpipe sudo chmod 777 "$bootdir" 1>$outpipe 2>$errpipe echo "Making directory: \"$grubdir\"" sudo mkdir "$grubdir" 1>$outpipe 2>$errpipe sudo chmod 777 "$grubdir" 1>$outpipe 2>$errpipe echo "Copying grub files into \"$grubdir\"" for file in \ ${pkglibdir}/stage1 ${pkglibdir}/stage2 ${pkglibdir}/*stage1_5; do sudo cp -f $file $grubdir 1>$outpipe 2>$errpipe done sudo chmod 777 $grubdir/* 1>$outpipe 2>$errpipe echo "Creating menu.lst" #sudo touch "$grubdir/menu.lst" echo " default 0 timeout 0 title Media Center root (hd0,0) kernel /boot/osloader/mbloader module /system/kernel" 1>$outpipe sudo cp $outpipe $grubdir/menu.lst 1>$outpipe 2>$errpipe sudo chmod 777 $grubdir/menu.lst 1>$outpipe 2>$errpipe sudo umount $point 1>$outpipe 2>$errpipe sudo losetup -f | tee $dev 1>$outpipe 2>$errpipe sudo losetup $(cat $dev) $filename 1>$outpipe 2>$errpipe echo "Copying the grub boot files" sudo dd if=$pkglibdir/stage1 of=$(cat $dev) bs=512 count=1 1>$outpipe 2>$errpipe case "$fs" in ext2) sudo dd if=$pkglibdir/e2fs_stage1_5 of=$(cat $dev) bs=512 seek=1 1>$outpipe 2>$errpipe ;; vfat) sudo dd if=$pkglibdir/fat_stage1_5 of=$(cat $dev) bs=512 seek=1 1>$outpipe 2>$errpipe ;; # jfs) # sudo dd if=$pkglibdir/jfs_stage1_5 of=$(cat $dev) bs=512 seek=1 1>$outpipe 2>$errpipe ;; minix) sudo dd if=$pkglibdir/minix_stage1_5 of=$(cat $dev) bs=512 seek=1 1>$outpipe 2>$errpipe ;; reiserfs) sudo dd if=$pkglibdir/reiserfs_stage1_5 of=$(cat $dev) bs=512 seek=1 1>$outpipe 2>$errpipe ;; # xfs) # sudo dd if=$pkglibdir/xfs_stage1_5 of=$(cat $dev) bs=512 seek=1 1>$outpipe 2>$errpipe ;; *) echo "Error copying GRUB stage 1.5: Unknown file system type" ;; esac size=`expr "$cylendars" "*" "$heads"` size=`expr "$sectors" "*" "$size"` size=`expr "$size" "-" "63"` partsize=/tmp/partsize asciidump=asciidump $asciidump $size $partsize sudo dd if=$partsize of=$(cat $dev) bs=2w obs=1 count=1 seek=458 1>$outpipe 2>$errpipe sudo losetup -d $(cat $dev) 1>$outpipe 2>$errpipe echo "Finished creating the image file, would you like to mount it now? [y] \c" option= read option if [ "$option" = "y" ] || [ "x$option" = "x" ]; then echo "Mounting the image file" sudo mount -o loop,offset=32256 $filename $point 1>$outpipe 2>$errpipe fi sudo rm $partsize sudo rm $errpipe sudo rm $outpipe sudo rm $dev