#!/bin/bash CAT=`type -p cat` GREP=`type -p grep` AWK=`type -p awk` SFDISK=`type -p sfdisk` PARTED=`type -p parted` MOUNT=`type -p mount` MKDIR=`type -p mkdir` SWAPON=`type -p swapon` MKFSEXT3=`type -p mkfs.ext3` MKFSXFS=`type -p mkfs.xfs` MKSWAP=`type -p mkswap` LS=`type -p ls` get_swap_size() { ramkb=`$CAT /proc/meminfo | $GREP MemTotal | $AWK {'print $2'}` let swap_size=2*$ramkb/1024+16 } remove_removable() { revindex=0 element_count=${#disks[@]} while [ "$revindex" -lt "$element_count" ] do s=${disks[$revindex]#/dev/} s=${s//:/} removable=`$CAT /sys/block/$s/removable` [ $removable -gt 0 ] && unset disks[$revindex] revindex+=1 done } get_devices() { get_swap_size disks=(`$SFDISK -s | $GREP dev | $AWK {'print $1'}`) remove_removable numdisks=0 sizes=() for disk in ${disks[@]};do numdisks=$((numdisks+1)) let sizes[$numdisks-1]=`$SFDISK -s | $GREP $disk | $AWK {'print $2'}`/1024 done [ ${#disks[@]} -eq 0 ] && echo 'No disc found :,( I am giving up'; exit 255 [ ${#disks[@]} -gt 2 ] && echo 'More than 2 disks found, I can/will use only the first two :-('; exit 127 let smallestdisk=2048+2048+100+$swap_size [ ${sizes[0]} -lt $smallestdisk ] && echo 'First disk size is smaller than $smallestdisk :-/ manual install required'; exit 13 } wipe_device() { hd_part=${$1#/dev/} partitions=(`$LS /dev/ | $GREP $hd_part.`) if [[ ${#partitions[@]} -gt 0 ]] then index=1 elements=${#partitions[@]} while [ "$index" -lt "$elements"+1 ] do $PARTED -s $1 rm $index index+=1 done fi } partition_single() { exit dev=${disks[0]//:/} echo "Destroying partitions on device $dev ..." wipe_device $dev echo "Creating a new partition table on $dev ..." $SFDISK $dev -uM -L <<-EOT 0,100,L,* ,$swap_size,S ,2048,L ,,L EOT echo "Formating partitions on $dev ..." $MKFSEXT3 ${dev}1 $MKSWAP -v1 ${dev}2 $MKFSXFS -f ${dev}3 $MKFSXFS -f ${dev}4 echo "Mounting partitions on $dev ..." $MOUNT ${dev}3 /mnt/target $MKDIR -p /mnt/target/{boot,data} [ $double ] && $MKDIR -p /mnt/target/backup $MOUNT ${dev}1 /mnt/target/boot $MOUNT ${dev}4 /mnt/target/data $SWAPON ${dev}2 } partition_double() { double=1 partition_single dev2=${disks[1]//:/} echo "Creating a new partition table on $dev2 ..." $SFDISK $dev2 echo "Formating partitions on $dev2 ..." $MKFSXFS -f ${dev2}1 echo "Mounting partitions on $dev2 ..." $MOUNT ${dev2}1 /mnt/target/backup } main() { get_devices [ ${#disks[@]} -eq 1 ] && partition_single [ ${#disks[@]} -ge 2 ] && partition_double } main