netboot-statelesslisted
Install: claude install-skill yktsnet/dotfiles-public
# netboot-stateless
ディスクレス機はストレージを使わず、ルートを RAM(tmpfs)に展開する完全無状態運用。NixOS の世代保持をあえて捨て、最新1世代のみを配給する。ビルドは GUI 機で行い、ターゲットは PXE で受信・展開することに専念する。
構成は `devices/headless/diskless/` にある。tmpfs root・`boot.loader.grub.enable = false`・initrd 圧縮の指定は `diskless/system.nix` に集約し、機体固有の設定は `diskless/<device>/` に置く。
## 構成の選び方
| ベース | 対象 | 特徴 |
|---|---|---|
| `devices/gui/` | GUI ありのディスクレス機 | Hyprland・Waybar 等を含むフルセット |
| `devices/headless/diskless/` | CLI のみのディスクレス機 | 最小構成。システムツール・Python・Zsh・Git のみ |
新規ディスクレス機は `devices/headless/diskless/system.nix` をベースに、機体ごとの `hardware.nix` を組み合わせる。
## 配信フロー
`toplevel` だけでは配給できない。kernel / initrd / ipxe スクリプトを個別にビルドする。
```bash
host=<device>
nix build ".#nixosConfigurations.${host}.config.system.build.toplevel"
nix build ".#nixosConfigurations.${host}.config.system.build.netbootIpxeScript" --out-link result-ipxe
nix build ".#nixosConfigurations.${host}.config.system.build.netbootRamdisk" --out-link result-initrd
nix build ".#nixosConfigurations.${host}.config.system.build.kernel" --out-link result-kernel
```
`init=` のパスはビルドごとに変わる。固定値を書かず `result-ipxe/netboot.ipxe` から動的に抽出し、`toplevel/kernel-params` の内容と併せて `--cmdline` に渡す。
```bash
sudo nix run nixpkgs#pixiecore -- boot \
result-kernel/bzImage result-initrd/initrd \
--cmdline "${kernel_params} ${init_path} ip=dhcp" --dhcp-no-bind --debug
```
ターゲットは BIOS で PXE Boot を最優先にして電源投入する。
## 制約と地雷(4GB RAM 機)
- **initrd は 1GB 未満が絶対条件**。`boot.initrd.compressorArgs = [ "-19" "-T0" ]`(`diskless/sy