@stiletto О чём я и говорю. Но я не хочу своё здоровое ядро тащить в незашифрованный домен, а собирать мелкоядро с минимумом драйверов чтобы не было у него возможности ничего зашкварить при kexec лень.
Вместо ефишелла всё же лучше взять busybox.
@stiletto Я планирую загнать загрузчик в биос, до которого мейде добраться труднее, алсо если я раскурю интелевые доки, то могу попросить интель не грузить не подписанный мной биос, что вообще охуенно.
@l29ah Но конечно это всё выглядит дичайшим оверкиллом, и проще просто в обнимку с ноутбуком ходить, и в любой непонятной ситуации перенакатывать биос и бут из бекапа с флешки засунутой в анус.
> Надо использовать Linux в качестве загрузчика для Linux
ты молодой, шутливый, тебе всё легко. но у меня например на Athlon 200GE (Vega 3) и RX 570 ванильное ядро просто зависает на стадии загрузки, не может прожевать драйвер, помогает только опция nomodeset. если бы не загрузчик, пришлось бы пердолиться, загружаться в live образ и пересобирать ядро, а так дописал опцию nomodeset и загрузился более-менее успешно.
а сейчас я перевожу все свои сервера на PXE, и делаю как ты и сказал: грузится абсолютно голое ядро (make allnoconfig), а затем делаю kexec в "нормальное" после switch_root из initramfs, зависимость есть, базарю.
@l29ah > всё же лучше взять busybox
мне не понравился busybox, слишком много чести для сраного initramfs, я копирую просто бинарники из текущего дистрибутива. брат жив. рекомендую.
WORK_DIR="$(mktemp -d)"
copy_binary() {
local src="$1" dst="$2"
[ "$dst" != "" ] || dst="$src"
if [ -e "$WORK_DIR$dst" ]; then
return
fi
install -D -m 0755 "$src" "$WORK_DIR$dst"
local dep
for dep in $(ldd "$src" 2>/dev/null | grep -o '/.* '); do
copy_binary "$dep"
done
}
for t in sh chroot pivot_root switch_root mount umount cp rm mkdir sleep reboot poweroff modprobe; do
copy_binary "$(which $t)"
done
затем просто: find . -print0 | cpio --null -o --format=newc > /boot/initramfs ; алсо не забудь сделать свой /init
у меня вместе с init'ом ещё рядом лежит filesystem.squashfs -- пожатый корень дистрибутива, можешь вообще любой на свой вкус туда запихать. не принципиально. оно просто в него потом свичнется.
# cat pxe/init
#!/bin/sh
switch_initramfs() {
local FS=/fs
if [ -d $FS ]; then
mount -t tmpfs -o size=100% inittmpfs $FS
cp -a /???* $FS
cd $FS
# FIX: Yes I know about /proc /sys /dev fails.
exec switch_root . /init 2>/dev/null
fi
}
switch_inittmpfs() {
mkdir -p /proc /sys /dev
mount -n -t proc none /proc
mount -n -t sysfs none /sys
mount -n -t devtmpfs none /dev
mkdir -p /mnt/drive /mnt/changes /mnt/work /mnt/rootfs
mount -n -t squashfs -o ro,loop,noatime /filesystem.squashfs /mnt/drive
mount -n -t overlay -o lowerdir=/mnt/drive,upperdir=/mnt/changes,workdir=/mnt/work rootfs /mnt/rootfs
umount /proc
umount /sys
umount /dev
cd /mnt/rootfs
pivot_root . mnt
exec chroot . /sbin/init
}
main() {
modprobe loop
modprobe overlay
modprobe squashfs
switch_initramfs
switch_inittmpfs
}
main
вооот, и уже после загрузки внутри этого filesystem.squashfs у меня делается kexec в нормальное ядро, и таким образом работают все сервера PXE с загрузкой в RAM.
задавайте вопросы если шо.