-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmultitool.sh
executable file
·183 lines (166 loc) · 4.94 KB
/
multitool.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#!/bin/sh
# Colors
ERROR='\033[0;31m'
SUCCESS='\033[0;32m'
WARNING='\033[0;33m'
DEFAULT='\033[0m'
# Reading arguments
DEVICE=$1
PARTITION=${DEVICE}1
if [ -z "${DEVICE}" ]; then
printf "${ERROR}Device not specified${DEFAULT}\n"
exit 1
fi
if [ $(blkid ${DEVICE} | grep PTUUID | wc -l) -ne 1 ]; then
printf "${ERROR}Device invalid${DEFAULT}\n"
exit 1
fi
if [ $(blkid ${DEVICE} | grep -o -e 'PTUUID="[a-zA-Z0-9-]*"' | cut -d \" -f 2 | wc -m) -gt 10 ]; then
printf "${ERROR}Device PTUUID is unusually long${DEFAULT}\n"
printf "${ERROR}Please verify that you are using the right device and edit the code if absolutely sure${DEFAULT}\n"
exit 1
fi
LABEL=$2
if [ -z "${LABEL}" ]; then
printf "${WARNING}Label not specified, using default MULTITOOL${DEFAULT}\n"
LABEL=MULTITOOL
fi
# Unmount partition
umount ${PARTITION}
# Create partitions
cat << EOF > multitool.temp
o
n
p
y
t
0b
w
EOF
fdisk ${DEVICE} < multitool.temp 2>/dev/null
if [ $? -ne 0 ]; then
printf "${ERROR}fdisk failed${DEFAULT}\n"
rm multitool.temp
exit 1
else
rm multitool.temp
fi
sleep 1
# Format partition
mkfs.fat ${PARTITION} -F 32 -n ${LABEL}
if [ $? -ne 0 ]; then
printf "${ERROR}mkfs.fat failed${DEFAULT}\n"
exit 1
fi
UUID=$(blkid ${PARTITION} | grep -o -e ' UUID="[a-zA-Z0-9-]*"' | cut -d \" -f 2)
if [ -z "${UUID}" ]; then
printf "${ERROR}mkdir failed${DEFAULT}\n"
exit 1
fi
# Mount
if [ ! -d multitool ]; then
mkdir multitool
if [ $? -ne 0 ]; then
printf "${ERROR}mkdir failed${DEFAULT}\n"
exit 1
fi
fi
mount ${PARTITION} multitool
if [ $? -ne 0 ]; then
printf "${ERROR}mount failed${DEFAULT}\n"
exit 1
fi
# Install grub
grub-install ${DEVICE} --target=i386-pc --root-directory=multitool --boot-directory=multitool --efi-directory=multitool --removable
if [ $? -ne 0 ]; then
printf "${WARNING}grub-install --target=i386-pc failed${DEFAULT}\n"
fi
grub-install ${PARTITION} --root-directory=multitool --boot-directory=multitool --efi-directory=multitool --removable
if [ $? -ne 0 ]; then
printf "${ERROR}grub-install failed${DEFAULT}\n"
exit 1
fi
# Configure grub
if [ ! -d multitool/grub/multitool ]; then
mkdir -p multitool/grub/multitool
if [ $? -ne 0 ]; then
printf "${ERROR}mkdir failed${DEFAULT}\n"
exit 1
fi
fi
cp multitool.png multitool/grub/multitool/multitool.png
cat << EOF > multitool/grub/grub.cfg
# This configuration was generated as part of github.com/kyrylo-sovailo/Multitool project
# Developed by Kyrylo Sovailo
search --fs-uuid ${UUID} --set
insmod all_video
insmod part_gpt
insmod loopback
insmod png
terminal_output gfxterm
loadfont unicode
background_image /grub/multitool/multitool.png
set default=0
set timeout=10
set gfxpayload=text
menuentry "TinyCore" {
terminal_output console
set iso="/grub/multitool/Core-current.iso"
loopback loop \${iso}
linux (loop)/boot/vmlinuz ro
initrd (loop)/boot/core.gz
}
menuentry "Debian" {
# Wiki: wiki.debian.org/DebianLive/MultibootISO
terminal_output console
set iso="/grub/multitool/debian-live-12.0.0-amd64-standard.iso"
set kernel=6.1.0-9
loopback loop \${iso}
linux (loop)/live/vmlinuz-\${kernel}-amd64 findiso=\${iso} boot=live ro
initrd (loop)/live/initrd.img-\${kernel}-amd64
}
menuentry "OpenSUSE" {
# Info: jeevanism.wordpress.com/2020/05/13/boot-opensuse-live-iso-from-hdd-using-grub2/
terminal_output console
set iso="/grub/multitool/openSUSE-Leap-15.5-XFCE-Live-x86_64-Build10.57-Media.iso"
set label=openSUSE_Leap_15.5_XFCE_Live
loopback loop \${iso}
linux (loop)/boot/x86_64/loader/linux boot=isolinux iso-scan/filename=\${iso} root=live:CDLABEL=\${label} rd.live.image ro
initrd (loop)/boot/x86_64/loader/initrd
}
menuentry "Arch" {
# Wiki: wiki.archlinux.org/title/Multiboot_USB_drive#Boot_entries
terminal_output console
set iso="/grub/multitool/archlinux-x86_64.iso"
loopback loop \${iso}
linux (loop)/arch/boot/x86_64/vmlinuz-linux img_dev=/dev/disk/by-uuid/${UUID} img_loop=\${iso} earlymodules=loop ro
initrd (loop)/arch/boot/intel-ucode.img (loop)/arch/boot/amd-ucode.img (loop)/arch/boot/x86_64/initramfs-linux.img
}
menuentry "Gentoo" {
# Wiki: wiki.gentoo.org/wiki/GRUB/Chainloading#ISO_images
terminal_output console
set iso="/grub/multitool/install-amd64-minimal-20230611T170207Z.iso"
loopback loop \${iso}
linux (loop)/boot/gentoo isoboot=\${iso} root=/dev/ram0 init=/linuxrc looptype=squashfs loop=/image.squashfs cdroot ro
initrd (loop)/boot/gentoo.igz
}
#menuentry "FreeDOS" {
# terminal_output console
# set iso="/grub/multitool/FD13LIVE.iso"
# loopback loop \${iso}
# linux (loop)/isolinux/memdisk
# initrd (loop)/isolinux/fdlive.img
#}
EOF
# Unmount
umount ${PARTITION}
if [ $? -ne 0 ]; then
printf "${WARNING}umount failed${DEFAULT}\n"
else
rm -r multitool
if [ $? -ne 0 ]; then
printf "${WARNING}rm failed${DEFAULT}\n"
fi
fi
# Success
printf "${SUCCESS}Success${DEFAULT}\n"