source: soft/giet_vm/create_dmg @ 758

Last change on this file since 758 was 755, checked in by cfuguet, 9 years ago

Improving the create_dmg script to search the mkfs.vfat tool in
UNIX standard directories when it's not in the PATH.

  • Property svn:executable set to *
File size: 3.8 KB
RevLine 
[258]1#!/bin/bash
2# Author: Cesar FUGUET
3# Date  : Novembre 2013
4
5clusters=65536
6sector_size=512
7sectors_per_cluster=8
[364]8reserved_sectors=2048
[258]9
[259]10# FAT32 SPEC: The first two clusters are not present in the data region but
11# they are used in the computation of the FAT sectors
12data_region_clusters=$clusters-2
[258]13
[259]14let "data_sectors = data_region_clusters * sectors_per_cluster"
15let "fat_sectors  = (clusters * 4) / 512"
[258]16
[259]17# The disk image contains:
18#   - MBR sector : this sector is removed by this script as it will be copied
19#                  after)
20#   - Reserved region sectors (usually 32)
21#   - FAT region sectors
22#   - DATA region sectors
23let "sectors      = data_sectors + fat_sectors + reserved_sectors + 1" 
24
[258]25platform=`uname`
26echo "Detected platform: $platform"
27
28if [[ $platform == "Darwin" ]]; then
29        case $1 in
30                create )
31                        # Create disk image
32                        # -fs        <fs>   : use filesystem <fs>
33                        # -volname   <name> : use volume name <name>
34                        # -srcfolder <src>  : copy every file in <src> into image
35                        # -format    <fmt>  : format of image. UDRW (UDIF read/write image)
36                        # -sectors   <sect> : size of image in 512-byte sectors
37                        # -ov                           : overwrite existing image file
38                        # -fargs         <args> : additional args to pass to newfs program
39                        #                            -F : FAT type (FAT32)
40                        #                                -c : sector per cluster
41                        #                                -n : number of FAT
42
43                        if [[ -z $2 ]]; then
[302]44                                echo "Create action need second argument: <disk_image>"
[258]45                                exit 1;
46                        fi;
47
[300]48                        # -F FAT type = 32 (FAT32)
49                        # -c sectors/cluster
50                        # -n number of FATs
51                        # -r reserved sectors
52                        # -k backup boot sector (VBR and FS INFO) = 0xffff (no backup)
[302]53                        echo "Creating empty disk image: $2.dmg"
[300]54                        fsargs="-F32 -c $sectors_per_cluster -n 1 -r $reserved_sectors -k 0xffff"
[302]55
56                        # -layout = NONE (No partition scheme. Hence no Master Boot Record)
[258]57                        hdiutil create \
58                                -fs MS-DOS \
59                                -volname virtualdisk \
[302]60                                -layout NONE \
[258]61                                -sectors $sectors \
62                                -ov \
[300]63                                -fsargs "$fsargs" \
[302]64                                -type "UDIF" \
65                                $2; 
66                        ;;
[258]67
68                attach )
69                        # Attach created disk image to the system and mount it
[302]70                        hdiutil attach $2
71                        ;;
[258]72
73                detach )
74                        # Detach attached device. Must pass as parameter the /dev/<device>
[302]75                        hdiutil detach $2
76                        ;;
[258]77
78                info )
[302]79                        hdiutil imageinfo $2
80                        ;;
[258]81
82                * )
83                        echo "Pass the command as the first parameter: "
84                        echo "  - create: create disk image"
85                        echo "  - attach: attach created disk image to the system and "
86                        echo "            mount it (arg: path to disk_image)"
87                        echo "  - detach: detach specified device "
88                        echo "            (arg: path to /dev/<device>)"
89                        echo "  - info  : print information about created disk image"
90                        echo "            (arg: path to disk_image)"
91                        echo ""
92                        echo "EXAMPLES:"
[302]93                        echo " ./create_diskimage.sh create disk_image"
[258]94                        echo " ./create_diskimage.sh attach /path/to/disk_image.dmg"
95                        echo " ./create_diskimage.sh detach /dev/disk5"
96                        echo " ./create_diskimage.sh info   /path/to/disk_image.dmg"
[302]97                        ;;
[258]98        esac;
99
100elif [[ $platform == "Linux" ]]; then
[259]101        case $1 in
102                create )
[302]103
[259]104                        if [[ -z $2 ]]; then
[302]105                                echo "Create action need second argument: <disk_image>"
[259]106                                exit 1;
107                        fi;
[258]108
[302]109                        echo "Creating empty disk image: $2"
[755]110                        let "sectors = (sectors - 1) / 2" 
[258]111
[755]112                        CREATE_DISK=$(command -v mkfs.vfat ||\
113                                      command -v /sbin/mkfs.vfat ||\
114                                      command -v /usr/sbin/mkfs.vfat ||\
115                                      command -v /usr/local/sbin/mkfs.vfat)
116
117                        if [ -z ${CREATE_DISK} ]; then
118                                echo "error: command mkfs.vfat not found";
119                                exit 1;
120                        fi;
121
122                        ${CREATE_DISK} \
[259]123                                -C \
124                                -F32 \
125                                -f 1 \
126                                -R $reserved_sectors \
127                                -S $sector_size \
128                                -s $sectors_per_cluster \
129                                -v \
[302]130                                $2.dmg $sectors
131                        ;;
[258]132
[259]133                * )
134                        echo "Pass the command as the first parameter: "
135                        echo "  - create: create disk image"
136                        echo ""
137                        echo "EXAMPLES:"
[302]138                        echo " ./create_diskimage.sh create disk_image"
139                        ;;
[259]140        esac;
141
[258]142else
143        echo "Your platform is not supported: $platform"
144fi;
145
Note: See TracBrowser for help on using the repository browser.