Сетевую загрузку пилил следующим диким способом. Извиняюсь за длинный текст, но так будет ближе к делу. Если нужна дополнительная информация, спрашивайте.
Если есть совсем другой способ, буду благодарен за подробную инструкцию. Однако, пробовал через debootstrap и chroot на i386 системе - не получилось.
В итоге запилил следующее.
0) Клиентская бездисковая машина - сервер на базе Intel Xeon E5
1) Установил минимальный Ubuntu 14.04.5 LTS Server amd64 с загрузочной флэшки и репозитория в интернете. Затем настроил свои скрипты и прикладной софт. Проверил - работает, идет мониторинг этой машины на удаленном zabbix-сервере.
2) Отредактировал /etc/initramfs-tools/initramfs.conf
BOOT=ram
3) Добавил скрипт ram, как рекомендовано здесь но с изменениями, подробно описанными здесь там поэтапно описаны мемуары моей борьбы, есть вопросы но нет ответов
4) На работающей системе создал initrd.img для сетевой загрузки
mkinitramfs -o /home/user1/initrd.img
5) Выключил клиентскую машину, отсоединил диск, примонтировал на рабочей машине, почистил ненужное и упаковал целиком, вместе с директорией boot.
find . -print0 | cpio --null -ov --format=newc | gzip -9 > /путь с архиву/rootfs.cpio.gz
Получилось следующее
/../../tftpboot/
pxelinux.cfg/
default
initrd.img
linux
pxelinux.0
rootfs.cpio.gz
файл default настроен так
timeout 0
default default
label default
kernel linux
append initrd=initrd.img boot=ram rooturl=ftp://10.0.1.1/rootfs.cpio.gz
8) Включаю целевую бездисковую машину,
стартует получение IP по DHCP, получен IP, загружены pxelinux.0 linux initrd.img стартовал скрипт ram но остановился на строке configure_networking, с ошибкой
ipconfig: no devices to confugure
/init: .: line 222: can't open 'run/net-*.conf'
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000200
...
содержимое этого скрипта-ram с отладочным кодом и неудачными попытками
retry_nr=0
do_rammount()
{
log_begin_msg "configure_networking"
# Вешается внутри этой функции
configure_networking
E=$?
#if [ $E ]; then
log_begin_msg "ERROR=$E"
#fi
log_end_msg
/bin/sleep 30
log_begin_msg "mkdir -p /tmp/rootfs"
mkdir -p /tmp/rootfs
log_end_msg
cd /tmp/rootfs
IP=`echo "${rooturl}"|sed -e 's/^[^0-9.]*\([0-9.]*\)\/\(.*\)$/\1/'`
FILE=`echo "${rooturl}"|sed -e 's/^[^0-9.]*\([0-9.]*\)\/\(.*\)$/\2/'`
#Это осталось от попыток качать образ tftp и ftp клиентами, которых не нашлось. Но до закачки всё равно пока не доходит из-за отсутствия устройств.
log_begin_msg "wget ftp://$IP:69/$FILE -O /tmp/rootfs/$FILE"
wget ftp://$IP:69/$FILE -O /tmp/rootfs/$FILE
log_end_msg
#log_begin_msg "echo get "$FILE"|ftp "$IP
# echo "get $FILE"|ftp $IP
#log_end_msg
log_begin_msg "mkdir -p ${rootmnt}"
mkdir -p ${rootmnt}
log_end_msg
log_begin_msg "mount -t tmpfs -o size=6G none ${rootmnt}"
mount -t tmpfs -o size=6G none ${rootmnt}
log_end_msg
log_begin_msg "gzip -dc /tmp/rootfs/rootfs.cpio.gz|cpio -idm -"
cd ${rootmnt}
gzip -dc /tmp/rootfs/rootfs.cpio.gz|cpio -im -
log_end_msg
}
# Это основная функция
mountroot(){
log_begin_msg "for x in $(cat /proc/cmdline); do"
for x in $(cat /proc/cmdline); do
case $x in
rooturl=*)
export rooturl=${x#rooturl=}
;;
esac
done
log_end_msg
/bin/sleep 10
# Это я добавил просто так, т.к. ничего не получалось
log_begin_msg "load_modules"
load_modules
log_end_msg
/bin/sleep 10
log_begin_msg "wait_for_udev 10"
wait_for_udev 30
log_end_msg
/bin/sleep 10
log_begin_msg "delay=${ROOTDELAY:-180}"
delay=${ROOTDELAY:-180}
log_end_msg
/bin/sleep 10
# Этот блок не решает проблему. Устройств как не было , так и не появляются
log_begin_msg "modprobe af_packet;ifdown*;modprobe e1000e;ifup*"
modprobe af_packet
ifdown eth3;ifdown eth2;ifdown eth1;ifdown eth0
#rmmod e1000e; modprobe -r e1000e;
modprobe e1000e
ifup eth0; ifup eth1; ifup eth2; ifup eth3
ls /sys/class/net
log_end_msg
/bin/sleep 10
# Это тоже добавлено просто так, может поможет, не помогло
log_begin_msg "resolve_device /dev/eth0"
resolve_device /dev/eth0
log_end_msg
/bin/sleep 10
log_begin_msg "do_rammount"
# Досюда доходит, но далее оно повиснет
do_rammount
log_end_msg
# Досюда и до цикла не доходит
/bin/sleep 1
log_begin_msg "while [ ${retry_nr} -lt ${delay} ] && [ ! -e ${rootmnt}${init} ]; do"
while [ ${retry_nr} -lt ${delay} ] && [ ! -e ${rootmnt}${init} ]; do
/bin/sleep 3
log_begin_msg "do_rammount"
do_rammount
log_end_msg
retry_nr=$(( ${retry_nr} + 1 ))
done
log_end_msg
}