]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - INSTALL/CreatePersistentImg.sh
Add escaping for path in VentoyPlugson.sh (#2585)
[Ventoy.git] / INSTALL / CreatePersistentImg.sh
1 #!/bin/bash
2
3 size=1024
4 fstype=ext4
5 label=casper-rw
6 config=''
7 outputfile=persistence.dat
8
9 print_usage() {
10 echo 'Usage: sudo ./CreatePersistentImg.sh [ -s size ] [ -t fstype ] [ -l LABEL ] [ -c CFG ] [ -e ]'
11 echo ' OPTION: (optional)'
12 echo ' -s size in MB, default is 1024'
13 echo ' -t filesystem type, default is ext4 ext2/ext3/ext4/xfs are supported now'
14 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'
17 echo ' -e enable encryption, disabled by default (only few distros support this)'
18 echo ''
19 }
20
21 print_err() {
22 echo ""
23 echo "$*"
24 echo ""
25 }
26
27 uid=$(id -u)
28 if [ $uid -ne 0 ]; then
29 print_err "Please use sudo or run the script as root."
30 exit 1
31 fi
32
33 while [ -n "$1" ]; do
34 if [ "$1" = "-s" ]; then
35 shift
36 size=$1
37 elif [ "$1" = "-t" ]; then
38 shift
39 fstype=$1
40 elif [ "$1" = "-l" ]; then
41 shift
42 label=$1
43 elif [ "$1" = "-c" ]; then
44 shift
45 config=$1
46 elif [ "$1" = "-o" ]; then
47 shift
48 outputfile=$1
49 elif [ "$1" = "-e" ]; then
50 read -s -p "Encryption passphrase: " passphrase
51 echo
52 elif [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
53 print_usage
54 exit 0
55 else
56 print_usage
57 exit 1
58 fi
59 shift
60 done
61
62
63 # check label
64 if [ -z "$label" ]; then
65 echo "The label can NOT be empty."
66 exit 1
67 fi
68
69 # check size
70 if echo $size | grep -q "^[0-9][0-9]*$"; then
71 vtMinSize=1
72 if echo $fstype | grep -q '^xfs$'; then
73 vtMinSize=16
74 fi
75
76 if [ $size -lt $vtMinSize ]; then
77 echo "size too small ($size)"
78 exit 1
79 fi
80 else
81 echo "Invalid size $size"
82 exit 1
83 fi
84
85
86 # check file system type
87 # nodiscard must be set for ext2/3/4
88 # -K must be set for xfs
89 if echo $fstype | grep -q '^ext[234]$'; then
90 fsopt='-E nodiscard'
91 elif [ "$fstype" = "xfs" ]; then
92 fsopt='-K'
93 else
94 echo "unsupported file system $fstype"
95 exit 1
96 fi
97
98 if [ "$outputdir" != "persistence.dat" ]; then
99 mkdir -p "$(dirname "$outputfile")"
100 fi
101
102 # 00->ff avoid sparse file
103 dd if=/dev/zero bs=1M count=$size | tr '\000' '\377' > "$outputfile"
104 sync
105
106 freeloop=$(losetup -f)
107
108 losetup $freeloop "$outputfile"
109
110 if [ ! -z "$passphrase" ]; then
111 printf "$passphrase" | cryptsetup -q --verbose luksFormat $freeloop -
112 printf "$passphrase" | cryptsetup -q --verbose luksOpen $freeloop persist_decrypted -
113 _freeloop=$freeloop
114 freeloop="/dev/mapper/persist_decrypted"
115 fi
116
117 mkfs -t $fstype $fsopt -L $label $freeloop
118
119 sync
120
121 if [ -n "$config" ]; then
122 if [ -d ./persist_tmp_mnt ]; then
123 rm -rf ./persist_tmp_mnt
124 fi
125
126 mkdir ./persist_tmp_mnt
127 if mount $freeloop ./persist_tmp_mnt; then
128 echo '/ union' > ./persist_tmp_mnt/$config
129 sync
130 umount ./persist_tmp_mnt
131 fi
132 rm -rf ./persist_tmp_mnt
133 fi
134
135 if [ ! -z "$passphrase" ]; then
136 cryptsetup luksClose $freeloop
137 freeloop=$_freeloop
138 fi
139
140 losetup -d $freeloop