-
Notifications
You must be signed in to change notification settings - Fork 7
/
heads.blend
666 lines (565 loc) · 17.3 KB
/
heads.blend
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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
#!/usr/bin/env zsh
# Copyright (c) 2016-2018 Dyne.org Foundation
#
# heads.blend is written and maintained by Ivan J. <parazyd@dyne.org>
#
# This source code is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This software is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this source code. If not, see <http://www.gnu.org/licenses/>.
## libdevuansdk build script for heads
source "$R/../config"
blend_preinst() {
fn blend_preinst
req=(strapdir blend)
ckreq || return 1
notice "executing $blend_name preinst"
add-user luther luther
cat <<EOF | sudo tee ${strapdir}/preinst >/dev/null
#!/bin/sh
apt --yes --force-yes purge initramfs-tools
apt --yes --force-yes --purge autoremove
rm -rf /var/lib/initramfs-tools
rm -rf /usr/share/initramfs-tools
EOF
chroot-script -d preinst || zerr
}
blend_postinst() {
fn blend_postinst
req=(strapdir)
ckreq || return 1
notice "executing $blend_name postinst"
[[ -n "$mkefi" ]] && {
iso_make_efi
iso_write_grub_cfg
}
nopackage=(tomb tbb ttdnsd wmutils)
for app in $nopackage; do
blend_install_${app} || zerr
done || zerr
notice "grabbing rootfs-overlay"
pushd "$strapdir"
sudo git clone "$rootfs_overlay" || zerr
sudo mv -v rootfs-overlay/.git . || zerr
sudo cp -rv rootfs-overlay/* . || zerr
sudo rm -rf rootfs-overlay
popd
blend_fixpax || zerr
blend_finalize || zerr
}
build_kernel_${arch}() {
fn build_kernel_${arch}
req=(R arch strapdir)
req+=(kernel_heads_git kernel_heads_version kernel_heads_flavor)
ckreq || return 1
func "override libdevuansdk's build_kernel_${arch}"
[[ -f "$R/tmp/kernel-${arch}.tgz" ]] && {
notice "using cached kernel tarball"
pushd "$strapdir"
sudo tar xf "$R/tmp/kernel-${arch}.tgz"
popd
return
}
notice "downloading the linux sources"
sudo mkdir -p "$strapdir/usr/src"
sudo wget -O "$strapdir/usr/src/$(basename ${kernel_heads_url})" "${kernel_heads_url}" || zerr
notice "extracting the linux sources"
pushd "$strapdir/usr/src"
sudo tar xf "$(basename ${kernel_heads_url})" || zerr
sudo rm -f "$(asename ${kernel_heads_url})"
sudo cp "$R/../extra/heads-${arch}.config" "$(basename -s .tar.xz ${kernel_heads_url})/.config"
popd
cat <<EOF | sudo tee ${strapdir}/install-linux-heads >/dev/null
#!/bin/sh
cd /usr/src/$(basename -s .tar.xz ${kernel_heads_url})
make oldconfig || exit 1
make ${MAKEOPTS} || exit 1
make INSTALL_MOD_STRIP=1 modules_install || exit 1
make install || exit 1
cd tools/objtool && make || exit 1
cd -
cp -rv tools/objtool ../objtool
## here we setup only what's needed to build kernel modules without the entire
## kernel sources. inspired by alpine linux once again <3
_abi_release="${kernel_heads_version}"
dir="/usr/src/linux-headers-\${_abi_release}"
mkdir "\$dir" || exit 1
cp .config "\$dir"/.config || exit 1
make -j1 O="\$dir" scripts
rm -f "\$dir"/Makefile "\$dir"/source
## copy the needed stuff from real sources
find . -path './include/*' -prune \
-o -path './scripts/*' -prune -o -type f \
\( -name 'Makefile*' -o -name 'Kconfig*' \
-o -name 'Kbuild*' -o -name '*.sh' \
-o -name '*.pl' -o -name '*.lds' \) \
-print | cpio -pdm "\$dir" || exit 1
cp -a scripts include "\$dir" || exit 1
find \$(find arch -name include -type d -print) -type f \
| cpio -pdm "\$dir"
install -Dm644 Module.symvers "\$dir"/Module.symvers
mkdir -p "/lib/modules/\${_abi_release}"
rm -f \
/lib/modules/\${_abi_release}/build \
/lib/modules/\${_abi_release}/source
ln -sv \
/usr/src/linux-headers-\${_abi_release} \
/lib/modules/\${_abi_release}/build
ln -sv \
/usr/src/linux-headers-\${_abi_release} \
/lib/modules/\${_abi_release}/source
cd ..
rm -rf linux-${kernel_heads_version}
## this cuts the barebone sources to 42MB
## which is somewhat acceptable
cd "\$dir"
find arch -mindepth 1 -maxdepth 1 -type d | grep -E -v 'x86|arm' | xargs rm -rf
find include -mindepth 1 -maxdepth 1 -type d \
| grep -E 'scsi|net|dt-bindings|sound|media|drm|trace|video' | xargs rm -rf
rm -rf include/linux/mfd
rm -rf drivers Documentation fs sound net tools firmware
mkdir -p tools
mv -v ../objtool tools/
chmod 755 /boot
cd /
tar czf kernel-${arch}.tgz /boot /lib/modules /usr/src/linux-headers-*
EOF
chroot-script -d install-linux-heads || zerr
mv "$strapdir/kernel-${arch}.tgz" "$R/tmp/"
}
##{{{ iso_prepare_strap()
iso_prepare_strap() {
# noop because we don't need live-boot anymore.
fn iso_prepare_strap "(override)"
return
}
##}}}
##{{{ iso_setup_isolinux()
iso_setup_isolinux() {
fn iso_setup_isolinux "(override)"
req=(workdir strapdir)
ckreq || return 1
notice "setting up isolinux"
pushd "$workdir"
sudo mkdir -p binary/{live,isolinux}
sudo cp $strapdir/boot/vmlinuz* binary/live/vmlinuz
pushd "$R/../initramfs"
sudo su -c "make ARCH=$arch" || zerr
popd
sudo cp "$R/../initramfs/initramfs.cpio.gz" binary/live/initramfs.cpio.gz || zerr
sudo cp "$R"/extra/syslinux/isolinux.bin binary/isolinux || zerr
sudo cp "$R"/extra/syslinux/*.c32 binary/isolinux || zerr
}
##}}}
##{{{ iso_write_isolinux_cfg()
iso_write_isolinux_cfg() {
fn iso_write_isolinux_cfg "(override)"
req=(workdir arch)
ckreq || return 1
## shamelessly stolen from katolaz minimal live :p
## hope you don't mind
notice "writing isolinux configuration"
sudo cp -f "$R/../extra/splash.png" "$workdir/binary/isolinux/splash.png"
cat <<EOF | sudo tee ${workdir}/binary/isolinux/isolinux.cfg >/dev/null
default /isolinux/vesamenu.c32
prompt 0
timeout 30
menu hshift 6
menu width 64
menu title heads boot menu
menu background /isolinux/splash.png
menu color title * #00ffffff #ff000000 none
menu color border * #00000000 #00000000 none
menu color sel 1;7;37;30 #ff000000 #ffffffff none
menu color unsel 1;30;37 #ffffffff #ff000000 none
menu color hotsel 1;7;37;40 #ffffffff #76a1d0ff *
menu color tabmsg 1;30;37 #ffffffff #ff000000 none
menu color cmdline 1;30;37 #ffffffff #ff000000 none
menu color help 37;40 #ffdddd00 #00000000 none
menu vshift 16
menu rows 4
#menu helpmsgrow 15
#menu cmdlinerow 25
#menu timeoutrow 26
#menu tabmsgrow 14
menu tabmsg Press ENTER to boot or TAB to edit a menu entry
label live-${arch}
menu label heads live (${arch}/openbox)
linux /live/vmlinuz
append initrd=/live/initramfs.cpio.gz verbose net.ifnames=0
label live-${arch}
menu label heads live (${arch}/awesomewm)
linux /live/vmlinuz
append initrd=/live/initramfs.cpio.gz verbose net.ifnames=0 awesome
endtext
EOF
}
##}}}
##{{{ conf_print_sourceslist()
conf_print_sourceslist() {
fn conf_print_sourceslist "(override)"
cat <<EOF
## package repositories
deb http://pkgmaster.devuan.org/merged beowulf main
deb http://pkgmaster.devuan.org/merged beowulf-updates main
deb http://pkgmaster.devuan.org/merged beowulf-security main
deb http://pkgmaster.devuan.org/devuan experimental main
#deb-src http://pkgmaster.devuan.org/merged beowulf main
#deb-src http://pkgmaster.devuan.org/merged beowulf-updates main
#deb-src http://pkgmaster.devuan.org/merged beowulf-security main
#deb-src http://pkgmaster.devuan.org/devuan experimental main
EOF
}
##}}}
## {{{ blend_fixpax()
blend_fixpax() {
fn blend_fixpax
req=(strapdir)
ckreq || return 1
## XXX: not really a fix, rather a hack
notice "fixing up pax markings"
cat <<EOF | sudo tee ${strapdir}/fixpax >/dev/null
#!/bin/sh
bins="
/usr/lib/thunderbird/thunderbird
/usr/lib/thunderbird/thunderbird-bin
/usr/local/lib/tor-browser/firefox
/usr/local/lib/tor-browser/plugin-container
/usr/bin/surf
/usr/bin/python2.7
/usr/bin/python3.5
/usr/bin/python3.5m
/usr/bin/python3.6
/usr/bin/python3.6m
"
for i in \${bins}; do
test -f "\${i}" && {
paxctl -c "\${i}"
paxctl -m "\${i}"
}
done || return 0
EOF
chroot-script fixpax
}
## }}}
## {{{ blend_install_tomb()
blend_install_tomb() {
fn blend_install_tomb
req=(strapdir tomb_version tomb_url)
req+=(gtomb_version gtomb_url)
ckreq || return 1
notice "cloning tomb gits"
sudo git clone "$tomb_url" "$strapdir/root/tomb" || zerr
sudo git clone "$gtomb_url" "$strapdir/root/gtomb" || zerr
notice "installing tomb in $strapdir"
cat <<EOF | sudo tee ${strapdir}/install-tomb >/dev/null
#!/bin/sh
cd /root/tomb
git checkout ${tomb_version}
make install
cd extras/kdf-keys
make
make install
cd /root/gtomb
cp gtomb /usr/local/bin/gtomb
chmod 755 /usr/local/bin/gtomb
cd ..
rm -rf tomb
rm -rf gtomb
EOF
chroot-script install-tomb || zerr
}
## }}}
## {{{ blend_install_wmutils()
blend_install_wmutils() {
fn blend_install_wmutils
req=(strapdir wmutils_version vmutils_url)
ckreq || return 1
notice "cloning wmutils..."
sudo git clone "$wmutils_url" "$strapdir/root/wmutils" || zerr
notice "installing wmutils in $strapdir"
cat <<EOF | sudo tee "${strapdir}/install-wmutils" >/dev/null
#!/bin/sh
cd /root/wmutils
git checkout ${wmutils_version}
make
make install
cd ..
rm -rf wmutils
EOF
chroot-script install-wmutils || zerr
}
## }}}
## {{{ blend_install_musl()
blend_install_musl() {
fn blend_install_musl
req=(strapdir musl_version musl_url)
ckreq || return 1
notice "cloning musl gits"
sudo git clone "$musl_url" "$strapdir/root/musl" || zerr
notice "installing musl in $strapdir"
cat <<EOF | sudo tee ${strapdir}/install-musl >/dev/null
#!/bin/sh
cd /root/musl
git checkout ${musl_version}
./configure && \
make ${MAKEOPTS} && make install || exit 1
cd ..
rm -rf musl
EOF
chroot-script install-musl || zerr
}
## }}}
## {{{ blend_install_ttdnsd()
blend_install_ttdnsd() {
fn blend_install_ttndsd
req=(strapdir ttdnsd_version ttdnsd_url)
ckreq || return 1
notice "installing ttdnsd in $strapdir"
notice "cloning ttdnsd"
sudo mkdir -p "$strapdir/root/ttdnsd"
sudo git clone "$ttdnsd_url" "$strapdir/root/ttdnsd/ttdnsd"
notice "installing ttdnsd in $strapdir"
cat <<EOF | sudo tee ${strapdir}/install-ttdnsd >/dev/null
#!/bin/sh
cd /root/ttdnsd/ttdnsd
dpkg-buildpackage || return 1
cd ..
dpkg -i *.deb || return 1
cd /root
rm -rf ttdnsd
EOF
chroot-script -d install-ttdnsd || zerr
}
## }}}
## {{{ blend_install_tbb()
blend_install_tbb() {
fn blend_install_tbb
req=(strapdir tbb_version tbb_url)
ckreq || return 1
notice "downloading Tor Browser Bundle..."
sudo curl -L -o "$strapdir/root/tbb.txz" "$tbb_url" || zerr
notice "installing Tor Browser Bundle in $strapdir"
cat <<EOF | sudo tee ${strapdir}/install-tbb
#!/bin/sh
cd /root
tar xvf tbb.txz
cd tor-browser_en-US/Browser
execs="\$(find . -executable)"
find . -type f | xargs chmod 644
echo "\${execs}" | xargs chmod 755
cp -fv TorBrowser/Tor/libstdc++/*.so.6 .
rm -rv TorBrowser/Tor TorBrowser/Docs
rm -fv TorBrowser/Data/Browser/profile.default/extensions/tor-launcher@torproject.org.xpi
mkdir -p TorBrowser/Data/Browser/Caches
TBBVER="\$(sed -n 's/^Version=\(.*\)$/\1/p' application.ini)"
cd - >/dev/null
LOCALLIB=/usr/local/lib
TBBLOCAL="\${LOCALLIB}/tor-browser"
TBBEXT=/usr/local/share/tor-browser-extensions
TBBETC=/etc/tor-browser/profile
mkdir -p "\${LOCALLIB}" "\${TBBEXT}" "\${TBBETC}"
mv -v tor-browser_en-US/Browser "\${TBBLOCAL}"
chmod 755 \${TBBLOCAL}
rm -rf tor-browser_en-US tbb.txz
mv -v \${TBBLOCAL}/TorBrowser/Data/Browser/profile.default/extensions/* \${TBBEXT}
rm -r \${TBBLOCAL}/TorBrowser/Data/Browser/profile.default/extensions
rsync -a --exclude extensions \${TBBLOCAL}/TorBrowser/Data/Browser/profile.default/ \
\${TBBETC}/
sed -i '/extensions\.torlauncher\.default_bridge\./d' \${TBBETC}/preferences/extension-overrides.js
mkdir -p \${TBBETC}/extensions
for ext in \${TBBEXT}/*; do
ln -vs "\$ext" \${TBBETC}/extensions/
done
find \${TBBETC} -type d | xargs chmod 755
EOF
chroot-script install-tbb || zerr
}
## }}}
## {{{ blend_finalize()
blend_finalize() {
fn blend_finalize
req=(strapdir)
ckreq || return 1
## XXX: torbirdy like this until we run an amprolla instance
sudo cp "$R/../extra/torbirdy_0.1.4.deb" "$strapdir/torbirdy.deb"
cat <<EOF | sudo tee ${strapdir}/finalize >/dev/null
#!/bin/sh
## rootless xorg # XXX: not anymore; investigate
groupadd wheel
#apt install --no-install-recommends xserver-xorg-legacy
chown -v :input /usr/bin/Xorg
chmod -v g+s /usr/bin/Xorg
for i in input video audio users netdev plugdev wheel sudo; do
gpasswd -a luther \${i}
done
sed 's/^allowed_users=.*/allowed_users=anybody/' -i /etc/X11/Xwrapper.config
echo "needs_root_rights=yes" >> /etc/X11/Xwrapper.config
## shells
chsh -s /bin/zsh luther
chsh -s /bin/zsh root
## perms
chown -R 1000:1000 /home/luther
chmod 0440 /etc/sudoers.d/heads
sed -i -e 's/02755/02750/g' /etc/init.d/tor # Fix permissions for ControlSocket
## torbirdy (XXX: amp)
ar x torbirdy.deb
tar xvf data.tar.gz
rm -f control.tar.gz data.tar.gz debian-binary torbirdy.deb
ln -s /usr/share/xul-ext/torbirdy /usr/lib/thunderbird/extensions/castironthunderbirdclub@torproject.org
## misc
rm -rf /usr/local/share/zsh/site-functions
#adduser --system --quiet --group clearnet # for a clearnet browser
sed -i -e 's/devuan/heads/' /etc/hosts
update-alternatives --install /usr/bin/x-www-browser x-www-browser /usr/local/bin/tor-browser 99
sed -e 's/#LID_SLEEP=.*/LID_SLEEP=true/' -i /etc/default/acpi-support
sed -e 's/synaptic-pkexec/lxqt-sudo synaptic/' -i /usr/share/applications/synaptic.desktop
rc-update add wicd default
rc-udpate add acpid default
rc-update add ferm default
rc-update add tor default
rc-update add ttdnsd default
rc-update del htpdate default
## cleanup
apt-get --yes --force-yes purge ${finalize_purge_packages}
apt-get --yes --force-yes --purge autoremove
apt-get clean
rm -f /var/log/bootstrap.log
rm -f /var/log/dpkg.log
rm -f /var/log/alternatives.log
rm -f /var/log/fontconfig.log
rm -rf /var/log/apt
rm -rf /var/log/fsck
rm -rf /var/log/ConsoleKit
rm -rf /var/lib/polkit-1
updatedb
EOF
chroot-script -d finalize || zerr
}
## }}}
## {{{ iso_make_efi()
# create /boot and /efi for uefi
# uefi code borrowed and adapted from David Hare, who borrowed and adapted it
# from similar scripts by Colin Watson and Patrick J. Volkerding.
iso_make_efi() {
fn iso_make_efi
req=(workdir efi_work)
ckreq || return 1
notice "creating efi boot files"
tempdir="$(mktemp -d /tmp/work_temp.XXXX)"
# for initial grub.cfg
mkdir -p "$tempdir"/boot/grub
cat <<EOF > "$tempdir/boot/grub/grub.cfg"
search --file --set=root /isolinux/isolinux.cfg
set prefix=(\$root)/boot/grub
source \$prefix/x84_64-efi/grub.cfg
EOF
rm -rf "$efi_work"
mkdir -p "$efi_work"
pushd "$efi_work"
mkdir -p boot/grub/x86_64-efi
mkdir -p efi/boot
# second grub.cfg file
for i in $(find $strapdir/usr/lib/grub/x86_64-efi -name 'part_*.mod'); do
print "insmod $(basename $i)" >> boot/grub/x86_64-efi/grub.cfg
done
# Additional modules so we don't boot in blind mode.
# I don't know which ones are really needed.
efimode=(
efi_gop
efi_uga
ieee1275_fb
vbe
vga
video_bochs
video_cirrus
jpeg
png
gfxterm
)
for i in $efimods; do
print "insmod $i" >> boot/grub/x86_64-efi/grub.cfg
done
pushd "$tempdir"
# make a tarred memdisk to embed in the grub image
tar cvf memdisk boot
# make the grub images
grub-mkimage -O "x86_64-efi" -m "memdisk" -o "bootx64.efi" \
-p '(memdisk)/boot/grub' \
search iso9660 configfile normal memdisk tar cat \
part_msdos part_gpt fat ext2 ntfs ntfscomp hfsplus \
chain boot linux
popd
# copy the grub image to efi/boot (to go later in the device's root
cp "$tempdir"/bootx64.efi efi/boot
# Do the boot image "boot/grub/efiboot.img
dd if=/dev/zero of=boot/grub/efiboot.img bs=1K count=1440
mkfs.vfat -F 12 boot/grub/efiboot.img
sudo mkdir img-mnt
sudo mount -o loop boot/grub/efiboot.img img-mnt
sudo mkdir -p img-mnt/efi/boot
sudo cp "$tempdir"/bootx64.efi img-mnt/efi/boot/
# copy modules and font
cp -r $strapdir/usr/lib/grub/x86_64-efi/* boot/grub/x86_64-efi/
# if this doesn't work, try another font from the same place (grub's
# default, unicode.pf2 is much larger)
# Either of these will work, and they look the same to me. Unicode seems to
# work with qemu. -fsr
# cp /usr/share/grub/ascii.pf2 boot/grub/font.pf2
cp $strapdir/usr/share/grub/unicode.pf2 boot/grub/font.fp2
# cleanup efi temps
sudo umount img-mnt
sudo rmdir img-mnt
rm -rf "$tempdir"
popd
# Copy efi files to iso
pushd $workdir
sudo rsync -avx "$efi_work"/boot binary/
sudo rsync -avx "$efi_work"/efi binary/
popd
}
## }}}
## {{{ iso_write_grub_cfg()
iso_write_grub_cfg() {
fn iso_write_grub_cfg
req=(workdir arch)
ckreq || return 1
notice "writing grub configuration"
# Do the main grub.cfg (which gets loaded last):
cat <<EOF | sudo tee "${workdir}/binary/boot/grub/grub.cfg" >/dev/null
if loadfont \$prefix/font.pf2 ; then
set gfxmode=640x480
insmod efi_gop
insmod efi_uga
insmod video_bochs
insmod video_cirrus
insmod gfxterm
insmod jpeg
insmod png
terminal_output gfxterm
fi
# background_image /boot/grub/splash.png
set menu_color_normal=white/black
set menu_color_highlight=dark-gray/white
set timeout=6
menuentry "heads ${arch} (openbox)" {
set gfxpayload=keep
linux /live/vmlinuz verbose net.ifnames=0
initrd /live/initramfs.cpio.gz
}
menuentry "heads ${arch} (awesome)" {
set gfxpayload=keep
linux /live/vmlinuz verbose net.ifnames=0 awesome
initrd /live/initramfs.cpio.gz
}
EOF
}
## }}}