Включаю ПК или виртуалку подключенные к локальной сети, DHCP раздаёт PXE, загружается дистрибутив линукса (в теории, он может быть любой), — там просто загружается ядро и initramfs сразу содержащий squashfs-образ с системой, куда потом chroot'ится /init-скрипт. В общем, получается работающая система в RAM через PXE.
Простой /init-скрипт в initramfs, который чрутится в squashfs-образ с системой.
# cat init
#!/bin/sh
error() {
setsid sh -c 'exec sh </dev/tty1 >/dev/tty1 2>&1'
}
mount -t proc none /proc || error
mount -t sysfs none /sys || error
mount -t devtmpfs devtmpfs /dev || error
mount -t tmpfs tmpfs /overlay || error
mkdir -p /ro /overlay/rw /overlay/work
mount -t squashfs -o loop,noatime /filesystem.squashfs /ro || error
mount -t overlay -o lowerdir=/ro,upperdir=/overlay/rw,workdir=/overlay/work rootfs /newroot || error
mount --move /dev /newroot/dev
umount /sys
umount /proc
exec chroot /newroot /sbin/init
exec sh
reboot
Чрутнулся. Система успешно загрузислась. Теперь не знаю как лучше настраивать систему сразу после загрузки. Например, в дистрибутивах есть /etc/rc.local файл, выполняющийся сразу после загрузки. Можно модифицировать его, чтобы он например, делал bash -s <(curl http://10.0.0.1/rc_local.php)
, и уже скриптом отдавать глядя на IP машины дальнейшие команды (в виде bash скрипта) для конфигурации системы и введения её в работу. Настроить SSH, доустановить нужные пакеты, сделать git clone и прочая-прочая-прочая. Всё, что угодно.
А как бы вы реализовали такую настройку системы?
Только не надо про syslinux с его pxeconfig, это не то пальто: там в зависимости от MAC ты только выбираешь, какой файл с конфигурацией syslinux'а отдать. Я не хочу иметь 100500 образов систем, — пусть система будет одна, и уже в процессе загрузки она настраивается под каждый хост.