144 lines
4.0 KiB
Nix
144 lines
4.0 KiB
Nix
{
|
|
description = "Linux Performance Engineering Workshop";
|
|
|
|
inputs = {
|
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
|
|
|
system-manager = {
|
|
url = "github:numtide/system-manager";
|
|
inputs.nixpkgs.follows = "nixpkgs";
|
|
};
|
|
|
|
flake-utils.url = "github:numtide/flake-utils";
|
|
};
|
|
|
|
outputs = { self, nixpkgs, system-manager, flake-utils }:
|
|
let
|
|
# Workshop source for embedding in ISO
|
|
workshopSrc = builtins.path {
|
|
path = ./.;
|
|
name = "perf-workshop";
|
|
filter = path: type:
|
|
let
|
|
baseName = baseNameOf path;
|
|
in
|
|
# Exclude nix build artifacts and git
|
|
!(baseName == "result" ||
|
|
baseName == ".git" ||
|
|
baseName == "flake.lock" ||
|
|
nixpkgs.lib.hasSuffix "~" baseName);
|
|
};
|
|
in
|
|
flake-utils.lib.eachSystem [ "x86_64-linux" "aarch64-linux" ] (system:
|
|
let
|
|
pkgs = nixpkgs.legacyPackages.${system};
|
|
workshopPackages = import ./nix/packages.nix { inherit pkgs; };
|
|
in
|
|
{
|
|
# Development shell with all workshop tools
|
|
devShells.default = pkgs.mkShell {
|
|
packages = workshopPackages;
|
|
shellHook = ''
|
|
echo "Linux Performance Workshop Development Environment"
|
|
echo ""
|
|
echo "Available tools: perf, strace, py-spy, hyperfine, bpftrace, ..."
|
|
'';
|
|
};
|
|
|
|
# Package containing workshop materials
|
|
packages.workshop-materials = pkgs.runCommand "workshop-materials" {} ''
|
|
mkdir -p $out/share/perf-workshop
|
|
cp -r ${workshopSrc}/* $out/share/perf-workshop/
|
|
'';
|
|
}
|
|
) // {
|
|
# System-manager configuration for Ubuntu
|
|
systemConfigs.default = system-manager.lib.makeSystemConfig {
|
|
modules = [
|
|
./nix/system-manager.nix
|
|
];
|
|
};
|
|
|
|
# NixOS configuration for bootable workshop ISO
|
|
nixosConfigurations.workshop-iso = nixpkgs.lib.nixosSystem {
|
|
system = "x86_64-linux";
|
|
specialArgs = { inherit workshopSrc; };
|
|
modules = [
|
|
"${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-graphical-base.nix"
|
|
./nix/iso.nix
|
|
];
|
|
};
|
|
|
|
# NixOS configuration for netboot
|
|
nixosConfigurations.workshop-netboot = nixpkgs.lib.nixosSystem {
|
|
system = "x86_64-linux";
|
|
specialArgs = { inherit workshopSrc; };
|
|
modules = [
|
|
"${nixpkgs}/nixos/modules/installer/netboot/netboot.nix"
|
|
"${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-graphical-base.nix"
|
|
./nix/netboot.nix
|
|
];
|
|
};
|
|
|
|
# Convenient alias for building the ISO
|
|
packages.x86_64-linux.iso =
|
|
self.nixosConfigurations.workshop-iso.config.system.build.isoImage;
|
|
|
|
# Netboot artifacts
|
|
packages.x86_64-linux.netboot-kernel =
|
|
self.nixosConfigurations.workshop-netboot.config.system.build.kernel;
|
|
packages.x86_64-linux.netboot-initrd =
|
|
self.nixosConfigurations.workshop-netboot.config.system.build.netbootRamdisk;
|
|
packages.x86_64-linux.netboot-ipxe =
|
|
self.nixosConfigurations.workshop-netboot.config.system.build.netbootIpxeScript;
|
|
|
|
# Bundle netboot files for easy serving
|
|
packages.x86_64-linux.netboot = let
|
|
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
|
cfg = self.nixosConfigurations.workshop-netboot.config;
|
|
kernel = "${cfg.system.build.kernel}/bzImage";
|
|
initrd = "${cfg.system.build.netbootRamdisk}/initrd";
|
|
in pkgs.runCommand "workshop-netboot" {} ''
|
|
mkdir -p $out
|
|
ln -s ${kernel} $out/bzImage
|
|
ln -s ${initrd} $out/initrd
|
|
cp ${cfg.system.build.netbootIpxeScript} $out/netboot.ipxe
|
|
|
|
cat > $out/README.md << 'EOF'
|
|
# Workshop Netboot Files
|
|
|
|
## Quick Start with Pixiecore (easiest)
|
|
|
|
```bash
|
|
# Serve on your LAN (requires root for DHCP)
|
|
sudo pixiecore boot bzImage initrd --cmdline "$(grep -oP 'imgargs.*? \K.*' netboot.ipxe)"
|
|
```
|
|
|
|
## Using dnsmasq + HTTP server
|
|
|
|
1. Start HTTP server in this directory:
|
|
```bash
|
|
python3 -m http.server 8080
|
|
```
|
|
|
|
2. Configure dnsmasq (adjust interface/IP):
|
|
```
|
|
interface=eth0
|
|
dhcp-range=192.168.1.100,192.168.1.200,12h
|
|
enable-tftp
|
|
tftp-root=/path/to/this/dir
|
|
dhcp-boot=netboot.ipxe
|
|
```
|
|
|
|
3. For UEFI clients, you may need iPXE chainloading.
|
|
|
|
## Files
|
|
|
|
- bzImage: Linux kernel
|
|
- initrd: Initial ramdisk (contains full system)
|
|
- netboot.ipxe: iPXE boot script
|
|
EOF
|
|
'';
|
|
};
|
|
}
|