]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - INSTALL/CreatePersistentImg.sh
Update grub.cfg
[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 while [ -n "$1" ]; do
22 if [ "$1" = "-s" ]; then
23 shift
24 size=$1
25 elif [ "$1" = "-t" ]; then
26 shift
27 fstype=$1
28 elif [ "$1" = "-l" ]; then
29 shift
30 label=$1
31 elif [ "$1" = "-c" ]; then
32 shift
33 config=$1
34 elif [ "$1" = "-o" ]; then
35 shift
36 outputfile=$1
37 elif [ "$1" = "-e" ]; then
38 read -s -p "Encryption passphrase: " passphrase
39 echo
40 elif [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
41 print_usage
42 exit 0
43 else
44 print_usage
45 exit 1
46 fi
47 shift
48 done
49
50
51 # check label
52 if [ -z "$label" ]; then
53 echo "The label can NOT be empty."
54 exit 1
55 fi
56
57 # check size
58 if echo $size | grep -q "^[0-9][0-9]*$"; then
59 if [ $size -le 1 ]; then
60 echo "Invalid size $size"
61 exit 1
62 fi
63 else
64 echo "Invalid size $size"
65 exit 1
66 fi
67
68
69 # check file system type
70 # nodiscard must be set for ext2/3/4
71 # -K must be set for xfs
72 if echo $fstype | grep -q '^ext[234]$'; then
73 fsopt='-E nodiscard'
74 elif [ "$fstype" = "xfs" ]; then
75 fsopt='-K'
76 else
77 echo "unsupported file system $fstype"
78 exit 1
79 fi
80
81 if [ "$outputdir" != "persistence.dat" ]; then
82 mkdir -p "$(dirname "$outputfile")"
83 fi
84
85 # 00->ff avoid sparse file
86 dd if=/dev/zero bs=1M count=$size | tr '\000' '\377' > "$outputfile"
87 sync
88
89 freeloop=$(losetup -f)
90
91 losetup $freeloop "$outputfile"
92
93 if [ ! -z "$passphrase" ]; then
94 printf "$passphrase" | cryptsetup -q --verbose luksFormat $freeloop -
95 printf "$passphrase" | cryptsetup -q --verbose luksOpen $freeloop persist_decrypted -
96 _freeloop=$freeloop
97 freeloop="/dev/mapper/persist_decrypted"
98 fi
99
100 mkfs -t $fstype $fsopt -L $label $freeloop
101
102 sync
103
104 if [ -n "$config" ]; then
105 if [ -d ./persist_tmp_mnt ]; then
106 rm -rf ./persist_tmp_mnt
107 fi
108
109 mkdir ./persist_tmp_mnt
110 if mount $freeloop ./persist_tmp_mnt; then
111 echo '/ union' > ./persist_tmp_mnt/$config
112 sync
113 umount ./persist_tmp_mnt
114 fi
115 rm -rf ./persist_tmp_mnt
116 fi
117
118 if [ ! -z "$passphrase" ]; then
119 cryptsetup luksClose $freeloop
120 freeloop=$_freeloop
121 fi
122
123 losetup -d $freeloop