117 lines
2.5 KiB
TypeScript
117 lines
2.5 KiB
TypeScript
import { copyFile, readFile, rm, writeFile } from "node:fs/promises";
|
|
import path from "node:path";
|
|
import { Alpine } from "./alpine.js";
|
|
import { execFile } from "./helpers/better-api.js";
|
|
|
|
export type Kind = "lts" | "virt";
|
|
export type Kernel = {
|
|
initramfs: string;
|
|
vmlinuz: string;
|
|
kind: Kind;
|
|
};
|
|
|
|
export async function setupKernel(
|
|
alpine: Alpine,
|
|
output: string
|
|
): Promise<Kernel> {
|
|
const kind: Kind = "virt";
|
|
|
|
await alpine.writeFile(
|
|
"/etc/update-extlinux.conf",
|
|
`# configuration for extlinux config builder
|
|
|
|
# Overwrite current /boot/extlinux.conf.
|
|
overwrite=1
|
|
|
|
# vesa_menu
|
|
# use fancy vesa menu (vesamenu.c32) menus, won't work with serial
|
|
vesa_menu=1
|
|
|
|
#default_kernel_opts=quiet
|
|
default_kernel_opts=
|
|
modules=loop,squashfs,sd-mod,usb-storage,ext4,vfat
|
|
|
|
# root device - if not specified, will be guessed using
|
|
# blkid -o export /dev/root
|
|
root=/dev/sda
|
|
|
|
# if set to non-zero, update-extlinux will be a lot more verbose.
|
|
verbose=0
|
|
|
|
hidden=0
|
|
timeout=3
|
|
default=lts
|
|
`
|
|
);
|
|
|
|
const features = [
|
|
"squashfs",
|
|
"ata",
|
|
"base",
|
|
"cdrom",
|
|
"ext4",
|
|
"keymap",
|
|
"kms",
|
|
"mmc",
|
|
"nvme",
|
|
"scsi",
|
|
"usb",
|
|
...(kind === "virt" ? ["virtio"] : []),
|
|
];
|
|
|
|
await alpine.writeFile(
|
|
"/etc/mkinitfs/mkinitfs.conf",
|
|
`features="${features.join(" ")}"
|
|
disable_trigger=yes`
|
|
);
|
|
|
|
await alpine.installPackages([`linux-${kind}`, "zstd"]);
|
|
|
|
// patch mkinitfs to use faster zstd
|
|
const mkinitfs = alpine.path("/sbin/mkinitfs");
|
|
const newMkinitfs = (await readFile(mkinitfs, "utf-8")).replace(
|
|
'comp="zstd -19"',
|
|
'comp="zstd -3"'
|
|
);
|
|
await writeFile(mkinitfs, newMkinitfs);
|
|
|
|
const kernelRelease = (
|
|
await readFile(
|
|
alpine.path(`/usr/share/kernel/${kind}/kernel.release`),
|
|
"utf-8"
|
|
)
|
|
).trim();
|
|
// TODO: poner en un mejor lugar
|
|
await alpine.writeExecutable(
|
|
"/etc/mkinitfs/init",
|
|
await readFile("./initramfs-init", "utf-8")
|
|
);
|
|
// run mkinitfs manually as trigger was diabled
|
|
await execFile("chroot", [
|
|
alpine.dir,
|
|
"mkinitfs",
|
|
"-C",
|
|
"zstd",
|
|
"-o",
|
|
`/boot/initramfs-${kind}`,
|
|
"-i",
|
|
"/etc/mkinitfs/init",
|
|
kernelRelease,
|
|
]);
|
|
|
|
const initramfs = path.join(alpine.dir, `/boot/initramfs-${kind}`);
|
|
const vmlinuz = path.join(alpine.dir, `/boot/vmlinuz-${kind}`);
|
|
|
|
const kernel: Kernel = {
|
|
kind,
|
|
initramfs: path.join(output, "initramfs"),
|
|
vmlinuz: path.join(output, "vmlinuz"),
|
|
};
|
|
|
|
await copyFile(initramfs, kernel.initramfs);
|
|
await copyFile(vmlinuz, kernel.vmlinuz);
|
|
await rm(initramfs);
|
|
await rm(vmlinuz);
|
|
return kernel;
|
|
}
|