diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..23faf17 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.dd \ No newline at end of file diff --git a/README.md b/README.md index b56b977..40962d2 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,13 @@ A comprehensive toolkit for creating disk images with various filesystems for fo ## Features -- **Multiple Filesystem Support**: NTFS, FAT32, exFAT, ext2/3/4, XFS +- **Multiple Filesystem Support**: NTFS, FAT32, exFAT, ext2/3/4, XFS, swap +- **Multi-Partition Support**: Create up to 4 partitions in a single disk image - **Partition Schemes**: GPT (modern) and MBR (legacy) +- **Initialization Methods**: Choose between /dev/zero (fast), /dev/urandom (realistic), or fallocate (sparse) - **Interactive Configuration**: User-friendly prompts for all parameters - **Automatic Loop Device Management**: Handles mounting and cleanup +- **Filesystem Availability Check**: Verifies required tools before operation - **Forensic-Ready**: Pre-configured for hex editor and forensic tool analysis ## Prerequisites @@ -20,7 +23,8 @@ sudo apt-get install -y \ parted \ util-linux \ e2fsprogs \ - dosfstools + dosfstools \ + bc ``` ### Optional (for specific filesystems) @@ -39,6 +43,38 @@ sudo apt-get install xfsprogs sudo apt-get install sleuthkit ``` +## Initialization Methods + +The script offers three methods for creating the disk image file: + +1. **`/dev/zero`** (Recommended for most cases) + - Fast creation speed + - Fills image with zeros + - Forensically predictable and clean + - Creates realistic empty disk structure + +2. **`/dev/urandom`** (For realistic random data) + - Slow creation speed + - Fills image with random data + - More realistic for testing data recovery + - Useful for simulating previously used disks + +3. **`fallocate`** (Fastest) + - Very fast, creates sparse file + - Does not actually write data to disk initially + - Good for quick testing + - May not be suitable for all forensic scenarios + +## Multi-Partition Support + +Create complex disk layouts with up to 4 partitions: + +- Each partition can have a different filesystem +- Mix operating system types (Windows NTFS + Linux ext4) +- Include swap partitions for realistic Linux setups +- The last partition automatically uses remaining space +- Perfect for practicing partition table analysis + ## Usage ### Creating a Disk Image @@ -46,17 +82,22 @@ sudo apt-get install sleuthkit Run the main script with sudo: ```bash -sudo ./create_forensic_disk.sh +sudo ./pseudodisk.sh ``` -The script will interactively prompt you for: - -1. **Filename**: Output file name (default: forensic_disk.dd) -2. **Size**: Choose from presets (100MB, 500MB, 1GB, 5GB) or custom -3. **Partition Scheme**: GPT or MBR -4. **Filesystem**: NTFS, FAT32, exFAT, ext2/3/4, XFS -5. **Volume Label**: Custom label for the filesystem -6. **Mount**: Option to mount immediately after creation +The script will: +1. Check filesystem tool availability +2. Interactively prompt you for: + - **Filename**: Output file name (default: forensic_disk.dd) + - **Size**: Choose from presets (100MB, 500MB, 1GB, 5GB) or custom + - **Initialization Method**: /dev/zero, /dev/urandom, or fallocate + - **Partition Scheme**: GPT or MBR + - **Partition Count**: 1-4 partitions + - **Per-Partition Configuration**: + - Filesystem type (NTFS, FAT32, exFAT, ext2/3/4, XFS, swap) + - Size in MB (last partition uses remaining space) + - Volume label (except for swap) + - **Mount**: Option to mount filesystems immediately after creation ### Example Session @@ -65,6 +106,15 @@ The script will interactively prompt you for: Forensic Disk Image Creator ========================================== +Checking filesystem tool availability... + + ✓ NTFS (mkfs.ntfs available) + ✓ FAT32 (mkfs.vfat available) + ✓ exFAT (mkfs.exfat available) + ✓ ext2/3/4 (mkfs.ext4 available) + ✓ XFS (mkfs.xfs available) + ✓ swap (mkswap available) + Enter output filename (default: forensic_disk.dd): ntfsdisk.dd Disk Size Options: @@ -76,24 +126,60 @@ Disk Size Options: Select disk size [1-5]: 2 +Initialization Method: + 1) /dev/zero (Fast, zeros - forensically predictable) + 2) /dev/random (Slow, random data - more realistic) + 3) fallocate (Fastest, sparse file) + +Select initialization method [1-3]: 1 + Partition Scheme: 1) GPT (GUID Partition Table) - Modern, Windows 10/11 default 2) MBR (Master Boot Record) - Legacy, compatible with older systems Select partition scheme [1-2]: 1 +How many partitions? (1-4): 2 + +========================================== + Partition 1 Configuration +========================================== + Filesystem Type: - 1) NTFS (Windows default, requires ntfs-3g) - 2) FAT32 (Universal compatibility, 4GB file limit) + 1) NTFS (Windows default) + 2) FAT32 (Universal compatibility) 3) exFAT (Modern, large file support) 4) ext4 (Linux default) 5) ext3 (Older Linux) 6) ext2 (Legacy Linux, no journaling) 7) XFS (High-performance Linux) + 8) swap (Linux swap space) -Select filesystem [1-7]: 1 +Select filesystem for partition 1 [1-8]: 1 -Enter volume label (default: FORENSIC): EVIDENCE +Size for partition 1 in MB: 400 + +Volume label for partition 1 (default: PART1): EVIDENCE + +========================================== + Partition 2 Configuration +========================================== + +Filesystem Type: + 1) NTFS (Windows default) + 2) FAT32 (Universal compatibility) + 3) exFAT (Modern, large file support) + 4) ext4 (Linux default) + 5) ext3 (Older Linux) + 6) ext2 (Legacy Linux, no journaling) + 7) XFS (High-performance Linux) + 8) swap (Linux swap space) + +Select filesystem for partition 2 [1-8]: 4 + +[INFO] Partition 2 will use remaining space + +Volume label for partition 2 (default: PART2): DATA ``` ### Cleaning Up @@ -102,11 +188,11 @@ When finished with your analysis, use the cleanup script: ```bash # Clean up a specific disk image -sudo ./cleanup_forensic_disk.sh +sudo ./cleanup.sh # Enter filename when prompted # Or clean up all loop devices -sudo ./cleanup_forensic_disk.sh +sudo ./cleanup.sh # Type 'all' when prompted ``` diff --git a/pseudodisk.sh b/pseudodisk.sh index 4e7bd74..75c7207 100755 --- a/pseudodisk.sh +++ b/pseudodisk.sh @@ -44,7 +44,7 @@ check_dependencies() { command -v dd >/dev/null 2>&1 || missing_tools+=("coreutils") command -v losetup >/dev/null 2>&1 || missing_tools+=("util-linux") command -v parted >/dev/null 2>&1 || missing_tools+=("parted") - command -v mkfs.ext4 >/dev/null 2>&1 || missing_tools+=("e2fsprogs") + command -v bc >/dev/null 2>&1 || missing_tools+=("bc") if [ ${#missing_tools[@]} -gt 0 ]; then print_error "Missing required packages: ${missing_tools[*]}" @@ -53,6 +53,57 @@ check_dependencies() { fi } +# Check filesystem tool availability +check_filesystem_tools() { + echo "" + echo "Checking filesystem tool availability..." + echo "" + + # NTFS + if command -v mkfs.ntfs >/dev/null 2>&1; then + echo -e " ${GREEN}✓${NC} NTFS (mkfs.ntfs available)" + else + echo -e " ${YELLOW}✗${NC} NTFS (install: sudo apt-get install ntfs-3g)" + fi + + # FAT32 + if command -v mkfs.vfat >/dev/null 2>&1; then + echo -e " ${GREEN}✓${NC} FAT32 (mkfs.vfat available)" + else + echo -e " ${YELLOW}✗${NC} FAT32 (install: sudo apt-get install dosfstools)" + fi + + # exFAT + if command -v mkfs.exfat >/dev/null 2>&1; then + echo -e " ${GREEN}✓${NC} exFAT (mkfs.exfat available)" + else + echo -e " ${YELLOW}✗${NC} exFAT (install: sudo apt-get install exfat-fuse exfat-utils)" + fi + + # ext2/3/4 + if command -v mkfs.ext4 >/dev/null 2>&1; then + echo -e " ${GREEN}✓${NC} ext2/3/4 (mkfs.ext4 available)" + else + echo -e " ${YELLOW}✗${NC} ext2/3/4 (install: sudo apt-get install e2fsprogs)" + fi + + # XFS + if command -v mkfs.xfs >/dev/null 2>&1; then + echo -e " ${GREEN}✓${NC} XFS (mkfs.xfs available)" + else + echo -e " ${YELLOW}✗${NC} XFS (install: sudo apt-get install xfsprogs)" + fi + + # swap + if command -v mkswap >/dev/null 2>&1; then + echo -e " ${GREEN}✓${NC} swap (mkswap available)" + else + echo -e " ${YELLOW}✗${NC} swap (should be in util-linux)" + fi + + echo "" +} + # Display banner show_banner() { echo "" @@ -110,6 +161,29 @@ get_disk_size() { print_info "Selected disk size: ${DISK_SIZE_MB} MB" } +# Get initialization method +get_init_method() { + echo "" + echo "Initialization Method:" + echo " 1) /dev/zero (Fast, zeros - forensically predictable)" + echo " 2) /dev/random (Slow, random data - more realistic)" + echo " 3) fallocate (Fastest, sparse file)" + echo "" + read -p "Select initialization method [1-3]: " INIT_CHOICE + + case $INIT_CHOICE in + 1) INIT_METHOD="zero" ;; + 2) INIT_METHOD="random" ;; + 3) INIT_METHOD="fallocate" ;; + *) + print_error "Invalid choice" + exit 1 + ;; + esac + + print_info "Selected initialization method: $INIT_METHOD" +} + # Get partition scheme get_partition_scheme() { echo "" @@ -131,74 +205,154 @@ get_partition_scheme() { print_info "Selected partition scheme: $PARTITION_SCHEME" } -# Get filesystem type -get_filesystem() { +# Get number of partitions +get_partition_count() { echo "" - echo "Filesystem Type:" - echo " 1) NTFS (Windows default, requires ntfs-3g)" - echo " 2) FAT32 (Universal compatibility, 4GB file limit)" - echo " 3) exFAT (Modern, large file support)" - echo " 4) ext4 (Linux default)" - echo " 5) ext3 (Older Linux)" - echo " 6) ext2 (Legacy Linux, no journaling)" - echo " 7) XFS (High-performance Linux)" - echo "" - read -p "Select filesystem [1-7]: " FS_CHOICE + read -p "How many partitions? (1-4): " PARTITION_COUNT - case $FS_CHOICE in - 1) - FILESYSTEM="ntfs" - if ! command -v mkfs.ntfs >/dev/null 2>&1; then - print_error "mkfs.ntfs not found. Install with: sudo apt-get install ntfs-3g" - exit 1 - fi - ;; - 2) FILESYSTEM="vfat" ;; - 3) - FILESYSTEM="exfat" - if ! command -v mkfs.exfat >/dev/null 2>&1; then - print_error "mkfs.exfat not found. Install with: sudo apt-get install exfat-utils" - exit 1 - fi - ;; - 4) FILESYSTEM="ext4" ;; - 5) FILESYSTEM="ext3" ;; - 6) FILESYSTEM="ext2" ;; - 7) - FILESYSTEM="xfs" - if ! command -v mkfs.xfs >/dev/null 2>&1; then - print_error "mkfs.xfs not found. Install with: sudo apt-get install xfsprogs" - exit 1 - fi - ;; - *) - print_error "Invalid choice" - exit 1 - ;; - esac + if ! [[ "$PARTITION_COUNT" =~ ^[1-4]$ ]]; then + print_error "Invalid number. Must be between 1 and 4" + exit 1 + fi - print_info "Selected filesystem: $FILESYSTEM" + print_info "Creating $PARTITION_COUNT partition(s)" } -# Get volume label -get_volume_label() { - echo "" - read -p "Enter volume label (default: FORENSIC): " VOLUME_LABEL - VOLUME_LABEL=${VOLUME_LABEL:-FORENSIC} +# Get partition configurations +get_partition_configs() { + PARTITION_CONFIGS=() + + for i in $(seq 1 $PARTITION_COUNT); do + echo "" + echo "==========================================" + echo " Partition $i Configuration" + echo "==========================================" + + # Get filesystem + echo "" + echo "Filesystem Type:" + echo " 1) NTFS (Windows default)" + echo " 2) FAT32 (Universal compatibility)" + echo " 3) exFAT (Modern, large file support)" + echo " 4) ext4 (Linux default)" + echo " 5) ext3 (Older Linux)" + echo " 6) ext2 (Legacy Linux, no journaling)" + echo " 7) XFS (High-performance Linux)" + echo " 8) swap (Linux swap space)" + echo "" + read -p "Select filesystem for partition $i [1-8]: " FS_CHOICE + + case $FS_CHOICE in + 1) + PART_FS="ntfs" + if ! command -v mkfs.ntfs >/dev/null 2>&1; then + print_error "mkfs.ntfs not found. Install: sudo apt-get install ntfs-3g" + exit 1 + fi + ;; + 2) + PART_FS="vfat" + if ! command -v mkfs.vfat >/dev/null 2>&1; then + print_error "mkfs.vfat not found. Install: sudo apt-get install dosfstools" + exit 1 + fi + ;; + 3) + PART_FS="exfat" + if ! command -v mkfs.exfat >/dev/null 2>&1; then + print_error "mkfs.exfat not found. Install: sudo apt-get install exfat-fuse exfat-utils" + exit 1 + fi + ;; + 4) + PART_FS="ext4" + if ! command -v mkfs.ext4 >/dev/null 2>&1; then + print_error "mkfs.ext4 not found. Install: sudo apt-get install e2fsprogs" + exit 1 + fi + ;; + 5) + PART_FS="ext3" + if ! command -v mkfs.ext3 >/dev/null 2>&1; then + print_error "mkfs.ext3 not found. Install: sudo apt-get install e2fsprogs" + exit 1 + fi + ;; + 6) + PART_FS="ext2" + if ! command -v mkfs.ext2 >/dev/null 2>&1; then + print_error "mkfs.ext2 not found. Install: sudo apt-get install e2fsprogs" + exit 1 + fi + ;; + 7) + PART_FS="xfs" + if ! command -v mkfs.xfs >/dev/null 2>&1; then + print_error "mkfs.xfs not found. Install: sudo apt-get install xfsprogs" + exit 1 + fi + ;; + 8) + PART_FS="swap" + if ! command -v mkswap >/dev/null 2>&1; then + print_error "mkswap not found. Install: sudo apt-get install util-linux" + exit 1 + fi + ;; + *) + print_error "Invalid choice" + exit 1 + ;; + esac + + # Get size + if [ $i -lt $PARTITION_COUNT ]; then + read -p "Size for partition $i in MB: " PART_SIZE + if ! [[ "$PART_SIZE" =~ ^[0-9]+$ ]] || [ "$PART_SIZE" -lt 1 ]; then + print_error "Invalid size" + exit 1 + fi + else + PART_SIZE="remaining" + print_info "Partition $i will use remaining space" + fi + + # Get label (skip for swap) + if [ "$PART_FS" != "swap" ]; then + read -p "Volume label for partition $i (default: PART$i): " PART_LABEL + PART_LABEL=${PART_LABEL:-PART$i} + else + PART_LABEL="" + fi + + PARTITION_CONFIGS+=("$PART_FS|$PART_SIZE|$PART_LABEL") + print_info "Partition $i: $PART_FS, ${PART_SIZE}MB, label='$PART_LABEL'" + done } # Create the disk image create_disk_image() { - print_info "Creating disk image file: $FILENAME (${DISK_SIZE_MB} MB)..." + print_info "Creating disk image file: $FILENAME (${DISK_SIZE_MB} MB) using $INIT_METHOD..." - # Use fallocate for faster creation if available - if command -v fallocate >/dev/null 2>&1; then - fallocate -l ${DISK_SIZE_MB}M "$FILENAME" - else - dd if=/dev/zero of="$FILENAME" bs=1M count=$DISK_SIZE_MB status=progress - fi + case $INIT_METHOD in + fallocate) + if command -v fallocate >/dev/null 2>&1; then + fallocate -l ${DISK_SIZE_MB}M "$FILENAME" + else + print_warning "fallocate not available, falling back to /dev/zero" + dd if=/dev/zero of="$FILENAME" bs=1M count=$DISK_SIZE_MB status=progress + fi + ;; + zero) + dd if=/dev/zero of="$FILENAME" bs=1M count=$DISK_SIZE_MB status=progress + ;; + random) + print_warning "Using /dev/urandom - this will be SLOW!" + dd if=/dev/urandom of="$FILENAME" bs=1M count=$DISK_SIZE_MB status=progress + ;; + esac - print_success "Disk image created" + print_success "Disk image created with $INIT_METHOD" } # Setup loop device @@ -209,66 +363,93 @@ setup_loop_device() { print_success "Loop device created: $LOOP_DEVICE" } -# Create partition table and partition +# Create partition table and partitions create_partitions() { print_info "Creating $PARTITION_SCHEME partition table..." parted -s "$LOOP_DEVICE" mklabel "$PARTITION_SCHEME" - print_info "Creating partition..." + local start_mb=1 + local part_num=1 - if [ "$PARTITION_SCHEME" = "gpt" ]; then - # For GPT, leave 1MB at start and end for alignment - parted -s "$LOOP_DEVICE" mkpart primary 1MiB 100% - else - # For MBR - parted -s "$LOOP_DEVICE" mkpart primary 1MiB 100% - fi + for config in "${PARTITION_CONFIGS[@]}"; do + IFS='|' read -r fs size label <<< "$config" + + if [ "$size" = "remaining" ]; then + end="100%" + else + end="${start_mb}MiB + ${size}MiB" + end=$(echo "$start_mb + $size" | bc) + end="${end}MiB" + fi + + print_info "Creating partition $part_num: ${start_mb}MiB -> $end" + + if [ "$fs" = "swap" ]; then + parted -s "$LOOP_DEVICE" mkpart primary linux-swap "${start_mb}MiB" "$end" + else + parted -s "$LOOP_DEVICE" mkpart primary "${start_mb}MiB" "$end" + fi + + if [ "$size" != "remaining" ]; then + start_mb=$(echo "$start_mb + $size" | bc) + fi + + part_num=$((part_num + 1)) + done # Inform kernel about partition table changes partprobe "$LOOP_DEVICE" - sleep 1 + sleep 2 - print_success "Partition created" + print_success "Partitions created" } -# Format the partition -format_partition() { - PARTITION="${LOOP_DEVICE}p1" +# Format the partitions +format_partitions() { + local part_num=1 - # Check if partition device exists - if [ ! -e "$PARTITION" ]; then - print_warning "Partition device $PARTITION not found, trying alternative..." - PARTITION="${LOOP_DEVICE}1" - fi - - if [ ! -e "$PARTITION" ]; then - print_error "Cannot find partition device" - cleanup - exit 1 - fi - - print_info "Formatting partition with $FILESYSTEM filesystem..." - - case $FILESYSTEM in - ntfs) - mkfs.ntfs -f -L "$VOLUME_LABEL" "$PARTITION" - ;; - vfat) - mkfs.vfat -n "$VOLUME_LABEL" "$PARTITION" - ;; - exfat) - mkfs.exfat -n "$VOLUME_LABEL" "$PARTITION" - ;; - ext2|ext3|ext4) - mkfs."$FILESYSTEM" -L "$VOLUME_LABEL" "$PARTITION" - ;; - xfs) - mkfs.xfs -f -L "$VOLUME_LABEL" "$PARTITION" - ;; - esac - - print_success "Filesystem created" + for config in "${PARTITION_CONFIGS[@]}"; do + IFS='|' read -r fs size label <<< "$config" + + # Determine partition device name + PARTITION="${LOOP_DEVICE}p${part_num}" + if [ ! -e "$PARTITION" ]; then + PARTITION="${LOOP_DEVICE}${part_num}" + fi + + if [ ! -e "$PARTITION" ]; then + print_error "Cannot find partition device for partition $part_num" + cleanup + exit 1 + fi + + print_info "Formatting partition $part_num ($PARTITION) with $fs filesystem..." + + case $fs in + ntfs) + mkfs.ntfs -f -L "$label" "$PARTITION" + ;; + vfat) + mkfs.vfat -n "$label" "$PARTITION" + ;; + exfat) + mkfs.exfat -n "$label" "$PARTITION" + ;; + ext2|ext3|ext4) + mkfs."$fs" -L "$label" "$PARTITION" + ;; + xfs) + mkfs.xfs -f -L "$label" "$PARTITION" + ;; + swap) + mkswap -L "SWAP$part_num" "$PARTITION" + ;; + esac + + print_success "Partition $part_num formatted" + part_num=$((part_num + 1)) + done } # Cleanup function @@ -279,22 +460,41 @@ cleanup() { fi } -# Mount the filesystem -mount_filesystem() { +# Mount filesystems +mount_filesystems() { echo "" - read -p "Do you want to mount the filesystem now? (y/n): " MOUNT_NOW + read -p "Do you want to mount the filesystem(s) now? (y/n): " MOUNT_NOW if [ "$MOUNT_NOW" = "y" ]; then - MOUNT_POINT="/mnt/forensic_disk_$$" - mkdir -p "$MOUNT_POINT" + local part_num=1 + MOUNT_POINTS=() - print_info "Mounting to $MOUNT_POINT..." - mount "$PARTITION" "$MOUNT_POINT" - - print_success "Filesystem mounted at: $MOUNT_POINT" - print_info "To unmount: sudo umount $MOUNT_POINT" - - MOUNTED=true + for config in "${PARTITION_CONFIGS[@]}"; do + IFS='|' read -r fs size label <<< "$config" + + # Skip swap partitions + if [ "$fs" = "swap" ]; then + print_info "Skipping mount for swap partition $part_num" + part_num=$((part_num + 1)) + continue + fi + + PARTITION="${LOOP_DEVICE}p${part_num}" + if [ ! -e "$PARTITION" ]; then + PARTITION="${LOOP_DEVICE}${part_num}" + fi + + MOUNT_POINT="/mnt/forensic_p${part_num}_$$" + mkdir -p "$MOUNT_POINT" + + print_info "Mounting partition $part_num to $MOUNT_POINT..." + mount "$PARTITION" "$MOUNT_POINT" + + print_success "Partition $part_num mounted at: $MOUNT_POINT" + MOUNT_POINTS+=("$MOUNT_POINT") + + part_num=$((part_num + 1)) + done fi } @@ -307,14 +507,38 @@ show_summary() { echo "" echo "Image File: $(realpath $FILENAME)" echo "Size: ${DISK_SIZE_MB} MB" + echo "Init Method: $INIT_METHOD" echo "Partition Scheme: $PARTITION_SCHEME" - echo "Filesystem: $FILESYSTEM" - echo "Volume Label: $VOLUME_LABEL" echo "Loop Device: $LOOP_DEVICE" - echo "Partition: $PARTITION" - if [ "$MOUNTED" = true ]; then - echo "Mount Point: $MOUNT_POINT" + echo "" + echo "Partitions:" + + local part_num=1 + for config in "${PARTITION_CONFIGS[@]}"; do + IFS='|' read -r fs size label <<< "$config" + + PARTITION="${LOOP_DEVICE}p${part_num}" + if [ ! -e "$PARTITION" ]; then + PARTITION="${LOOP_DEVICE}${part_num}" + fi + + if [ "$fs" = "swap" ]; then + echo " [$part_num] $PARTITION - $fs (${size}MB)" + else + echo " [$part_num] $PARTITION - $fs (${size}MB) - '$label'" + fi + + part_num=$((part_num + 1)) + done + + if [ ${#MOUNT_POINTS[@]} -gt 0 ]; then + echo "" + echo "Mount Points:" + for mp in "${MOUNT_POINTS[@]}"; do + echo " $mp" + done fi + echo "" echo "==========================================" echo " Forensic Analysis Commands" @@ -327,23 +551,15 @@ show_summary() { echo "Hex editor analysis:" echo " hexdump -C $FILENAME | less" echo " xxd $FILENAME | less" - echo " sudo apt-get install bless # GUI hex editor" - echo " bless $FILENAME" - echo "" - echo "Mount the image later:" - echo " sudo losetup -f $FILENAME" - echo " sudo losetup -l # List loop devices" - echo " sudo mount /dev/loopXp1 /mnt/mountpoint" echo "" echo "Analyze with forensic tools:" - echo " sudo apt-get install sleuthkit" - echo " mmls $FILENAME # Show partition layout" - echo " fsstat -o 2048 $FILENAME # Filesystem details" - echo " fls -o 2048 $FILENAME # List files" + echo " mmls $FILENAME" echo "" echo "Clean up (when done):" - if [ "$MOUNTED" = true ]; then - echo " sudo umount $MOUNT_POINT" + if [ ${#MOUNT_POINTS[@]} -gt 0 ]; then + for mp in "${MOUNT_POINTS[@]}"; do + echo " sudo umount $mp" + done fi echo " sudo losetup -d $LOOP_DEVICE" echo "" @@ -357,12 +573,14 @@ main() { show_banner check_root check_dependencies + check_filesystem_tools get_filename get_disk_size + get_init_method get_partition_scheme - get_filesystem - get_volume_label + get_partition_count + get_partition_configs echo "" echo "==========================================" @@ -370,9 +588,20 @@ main() { echo "==========================================" echo "Filename: $FILENAME" echo "Size: ${DISK_SIZE_MB} MB" + echo "Init Method: $INIT_METHOD" echo "Partition Scheme: $PARTITION_SCHEME" - echo "Filesystem: $FILESYSTEM" - echo "Volume Label: $VOLUME_LABEL" + echo "Partitions: $PARTITION_COUNT" + + for i in $(seq 1 $PARTITION_COUNT); do + config="${PARTITION_CONFIGS[$((i-1))]}" + IFS='|' read -r fs size label <<< "$config" + if [ "$fs" = "swap" ]; then + echo " [$i] $fs (${size}MB)" + else + echo " [$i] $fs (${size}MB) - '$label'" + fi + done + echo "" read -p "Proceed with creation? (y/n): " CONFIRM @@ -384,8 +613,8 @@ main() { create_disk_image setup_loop_device create_partitions - format_partition - mount_filesystem + format_partitions + mount_filesystems show_summary }