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
|
#!/bin/ksh93
# Build script for hammerhead-kernel
# Packages kernel modules, boot infrastructure, and CPU microcode from proto area
#
# Requires PROTO_AREA to be set to the hammerhead proto path, e.g.:
# export PROTO_AREA=/usr/src/hammerhead-build/root_amd64
#
# Optional: ROOTFS_DIR for rootfs overlay (boot archive filelist, etc.)
# export ROOTFS_DIR=/usr/src/hammerhead/rootfs
set -e
PROTO_AREA="${PROTO_AREA:?PROTO_AREA must be set to hammerhead proto path}"
# Validate required directories
for dir in kernel boot; do
if [ ! -d "$PROTO_AREA/$dir" ]; then
printf "ERROR: %s/%s does not exist\n" "$PROTO_AREA" "$dir"
printf "Has the hammerhead build completed successfully?\n"
exit 1
fi
done
# Validate critical files
for f in kernel/genunix kernel/unix boot/loader64.efi; do
if [ ! -f "$PROTO_AREA/$f" ]; then
printf "ERROR: %s not found in proto area\n" "$f"
exit 1
fi
done
# --- Kernel modules (includes driver .conf files) ---
printf "Packaging kernel modules...\n"
mkdir -p "$PKGDIR/kernel"
(cd "$PROTO_AREA/kernel" && find . | cpio -pdm "$PKGDIR/kernel" 2>/dev/null)
# Set ownership: kernel modules are root:sys
chown -R root:sys "$PKGDIR/kernel"
# --- Boot infrastructure (loader, fonts, splash, forth scripts) ---
printf "Packaging boot files...\n"
mkdir -p "$PKGDIR/boot"
(cd "$PROTO_AREA/boot" && find . | cpio -pdm "$PKGDIR/boot" 2>/dev/null)
# Apply rootfs overlay for boot files (filelist.ramdisk, etc.)
if [ -n "$ROOTFS_DIR" ] && [ -d "$ROOTFS_DIR/boot" ]; then
printf "Applying rootfs overlay for boot...\n"
(cd "$ROOTFS_DIR/boot" && find . | cpio -pdm "$PKGDIR/boot" 2>/dev/null)
fi
chown -R root:sys "$PKGDIR/boot"
# --- CPU microcode ---
if [ -d "$PROTO_AREA/platform/amd64/ucode" ]; then
printf "Packaging CPU microcode...\n"
mkdir -p "$PKGDIR/platform/amd64/ucode"
(cd "$PROTO_AREA/platform/amd64/ucode" && find . | cpio -pdm "$PKGDIR/platform/amd64/ucode" 2>/dev/null)
chown -R root:sys "$PKGDIR/platform/amd64/ucode"
fi
# --- Post-install script ---
mkdir -p "$PKGDIR/.SCRIPTS"
cat > "$PKGDIR/.SCRIPTS/post-install.sh" << 'SCRIPT'
#!/bin/ksh93
# Update boot archive to include new kernel modules
# Only run if we're on a live system (not during initial install to altroot)
if [ -f /kernel/genunix ]; then
# Generate boot archive using cpio method (not bootadm)
if [ -f /boot/solaris/filelist.ramdisk ]; then
printf "Regenerating boot archive...\n"
tmpfilelist=/tmp/boot_archive_files.$$
tmparchive=/tmp/boot_archive.$$
(cd / && while IFS= read -r line; do
[[ -z "$line" || "$line" = \#* ]] && continue
[[ -e "$line" ]] && printf "%s\n" "$line"
done < /boot/solaris/filelist.ramdisk) > "$tmpfilelist"
(cd / && cpio -o -H odc < "$tmpfilelist" 2>/dev/null) > "$tmparchive"
digest -a sha1 "$tmparchive" > /boot/boot_archive.hash
gzip -9 -c "$tmparchive" > /boot/boot_archive
rm -f "$tmpfilelist" "$tmparchive"
printf "Boot archive updated.\n"
fi
fi
printf "Kernel updated. A reboot is required to load the new kernel.\n"
SCRIPT
chmod 755 "$PKGDIR/.SCRIPTS/post-install.sh"
# --- Summary ---
MODULES=$(find "$PKGDIR/kernel" -type f | wc -l)
BOOT_FILES=$(find "$PKGDIR/boot" -type f | wc -l)
SIZE=$(du -sh "$PKGDIR" | cut -f1)
printf "Packaged %d kernel files, %d boot files (%s total)\n" "$MODULES" "$BOOT_FILES" "$SIZE"
# hammerhead-kernel - Kernel modules, boot infrastructure, and microcode
# https://git.sharkos.one/zygaena/hammerhead
[package]
name = "hammerhead-kernel"
version = "0.1.0"
release = 1
description = "Hammerhead kernel modules, boot loader, and CPU microcode"
url = "https://git.sharkos.one/zygaena/hammerhead"
license = "CDDL-1.0"
maintainer = "Chris Tusa <chris.tusa@leafscale.com>"
arch = "x86_64"
conflicts = ["illumos-kernel", "illumos-platform", "illumos-boot"]
[dependencies]
runtime = []
build = []
[build]
parallel = false
|