CreatePersistentImg.sh 2.21 KB
Newer Older
longpanda's avatar
longpanda committed
1
2
3
4
5
#!/bin/sh

size=1024
fstype=ext4
label=casper-rw
6
config=''
7
outputfile=persistence.dat
longpanda's avatar
longpanda committed
8
9

print_usage() {
10
    echo 'Usage:  CreatePersistentImg.sh [ -s size ] [ -t fstype ] [ -l LABEL ] [ -c CFG ]'
longpanda's avatar
longpanda committed
11
12
13
14
    echo '  OPTION: (optional)'
    echo '   -s size in MB, default is 1024'
    echo '   -t filesystem type, default is ext4  ext2/ext3/ext4/xfs are supported now'
    echo '   -l label, default is casper-rw'
15
    echo '   -c configfile name inside the persistence file. File content is "/ union"'
16
    echo '   -o outputfile name, default is persistence.dat'
longpanda's avatar
longpanda committed
17
18
19
20
21
22
23
24
25
26
27
28
29
    echo ''
}

while [ -n "$1" ]; do
    if [ "$1" = "-s" ]; then
        shift
        size=$1
    elif [ "$1" = "-t" ]; then
        shift
        fstype=$1
    elif [ "$1" = "-l" ]; then
        shift
        label=$1
30
31
32
    elif [ "$1" = "-c" ]; then
        shift
        config=$1
33
34
35
    elif [ "$1" = "-o" ]; then
        shift
        outputfile=$1
longpanda's avatar
update  
longpanda committed
36
37
38
    elif [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
        print_usage
        exit 0
longpanda's avatar
longpanda committed
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
    else
        print_usage
        exit 1
    fi
    shift
done


# check label
if [ -z "$label" ]; then
    echo "The label can NOT be empty."
    exit 1
fi

# check size
if echo $size | grep -q "^[0-9][0-9]*$"; then
    if [ $size -le 1 ]; then
        echo "Invalid size $size"
        exit 1
    fi
else
    echo "Invalid size $size"
    exit 1
fi


# check file system type
# nodiscard must be set for ext2/3/4
# -K must be set for xfs 
if echo $fstype | grep -q '^ext[234]$'; then
    fsopt='-E nodiscard'
elif [ "$fstype" = "xfs" ]; then
    fsopt='-K'
else
    echo "unsupported file system $fstype"
    exit 1
fi

77
78
79
80
if [ "$outputdir" != "persistence.dat" ]; then
    mkdir -p "$(dirname "$outputfile")"
fi

longpanda's avatar
longpanda committed
81
# 00->ff avoid sparse file
82
dd if=/dev/zero  bs=1M count=$size | tr '\000' '\377' > "$outputfile"
longpanda's avatar
longpanda committed
83
84
85
86
sync

freeloop=$(losetup -f)

87
losetup $freeloop "$outputfile"
longpanda's avatar
longpanda committed
88
89
90
91
92

mkfs -t $fstype $fsopt -L $label $freeloop 

sync

93
94
95
96
97
98
99
100
101
102
103
104
105
if [ -n "$config" ]; then
    if [ -d ./persist_tmp_mnt ]; then
        rm -rf ./persist_tmp_mnt
    fi
    
    mkdir ./persist_tmp_mnt
    if mount $freeloop ./persist_tmp_mnt; then
        echo '/ union' > ./persist_tmp_mnt/$config
        sync
        umount ./persist_tmp_mnt
    fi
    rm -rf ./persist_tmp_mnt
fi
longpanda's avatar
longpanda committed
106

107
losetup -d $freeloop