Завантажимо Linux по мережі (на прикладі Fedora)

Щоб завантажити лінуха по мережі, будемо використовувати : DHCP (для отримання параметрів мережі), tftpd (для скачування власне образів) і все це буде працювати через  PXE-стек. Для нижчеприведеного випадку нотую мережеву інсталяцію Федори в корпоративному середовищі, проте з невеликими правками можна затосовувати до завантаження тонких клієнтів, інших ОС чи на інші (не заборонені законом 😉 ) цілі.

Качаємо потрібний образ ОС Fedora Linux:

Заходимо на список дзеркал Федори, вибираємо потрібну версію, збірку, найближче дзеркало та звантажуємо образ. Мені був потрібен образ мережевої інсталяції Fedora 14 під i386, я брав з посилання:

wget http://fedora.vc.ukrtel.net/linux/releases/14/Fedora/i386/iso/Fedora-14-i386-netinst.iso

Готуємо образ до мережевої загрузки:

Встановлюємо livecd-iso-to-pxeboot

yum install livecd-tools

Або качаємо (слід встановити залежності) з : http://svn.rpmforge.net/svn/trunk/rpms/livecd-tools/livecd-iso-to-pxeboot.sh

Або копіюємо прямо звідси:

#!/bin/bash
# Convert a live CD iso so that it can be booted over the network
# using PXELINUX.
# Copyright 2008 Red Hat, Inc.
# Written by Richard W.M. Jones <rjones@redhat.com>
# Based on a script by Jeremy Katz <katzj@redhat.com>
# Based on original work by Chris Lalancette <clalance@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

export PATH=/sbin:/usr/sbin:$PATH

usage() {
    echo "Usage: livecd-iso-to-pxeboot <isopath>"
    exit 1
}

cleanup() {
    [ -d "$CDMNT" ] && umount $CDMNT && rmdir $CDMNT
}

exitclean() {
    echo "Cleaning up to exit..."
    cleanup
    exit 1
}

if [ $(id -u) != 0 ]; then
    echo "You need to be root to run this script."
    exit 1
fi

# Check pxelinux.0 exists.
if [ ! -f /usr/share/syslinux/pxelinux.0 -a ! -f /usr/lib/syslinux/pxelinux.0 ]; then
    echo "Warning: pxelinux.0 not found."
    echo "Make sure syslinux or pxelinux is installed on this system."
fi

while [ $# -gt 1 ]; do
    case "$1" in
	*) usage ;;
    esac
    shift
done

ISO="$1"

if [ -z "$ISO" -o ! -e "$ISO" ]; then
    usage
fi

if [ -d tftpboot ]; then
    echo "Subdirectory tftpboot exists already.  I won't overwrite it."
    echo "Delete the subdirectory before running."
    exit 1
fi

mkdir tftpboot

# Mount the ISO.
# FIXME: would be better if we had better mountpoints
CDMNT=$(mktemp -d /media/cdtmp.XXXXXX)
mount -o loop "$ISO" $CDMNT || exitclean

trap exitclean SIGINT SIGTERM

# Does it look like an ISO?
if [ ! -d $CDMNT/isolinux -o ! -f $CDMNT/isolinux/initrd0.img ]; then
    echo "The ISO image doesn't look like a LiveCD ISO image to me."
    exitclean
fi

# Create a cpio archive of just the ISO and append it to the
# initrd image.  The Linux kernel will do the right thing,
# aggregating both cpio archives (initrd + ISO) into a single
# filesystem.
ISOBASENAME=`basename "$ISO"`
ISODIRNAME=`dirname "$ISO"`
( cd "$ISODIRNAME" && echo "$ISOBASENAME" | cpio -H newc --quiet -o ) |
  gzip -9 |
  cat $CDMNT/isolinux/initrd0.img - > tftpboot/initrd0.img

# Kernel image.
cp $CDMNT/isolinux/vmlinuz0 tftpboot/vmlinuz0

# pxelinux bootloader.
if [ -f /usr/share/syslinux/pxelinux.0 ]; then
    cp /usr/share/syslinux/pxelinux.0 tftpboot
elif [ -f /usr/lib/syslinux/pxelinux.0 ]; then
    cp /usr/lib/syslinux/pxelinux.0 tftpboot
else
    echo "Warning: You need to add pxelinux.0 to tftpboot/ subdirectory"
fi

# pxelinux configuration.
mkdir tftpboot/pxelinux.cfg
cat > tftpboot/pxelinux.cfg/default <<EOF
DEFAULT pxeboot
TIMEOUT 20
PROMPT 0
LABEL pxeboot
	KERNEL vmlinuz0
	APPEND initrd=initrd0.img root=/$ISOBASENAME rootfstype=iso9660 rootflags=loop
ONERROR LOCALBOOT 0
EOF

# All done, clean up.
umount $CDMNT
rmdir $CDMNT

echo "Your pxeboot image is complete."
echo
echo "Copy tftpboot/ subdirectory to /tftpboot or a subdirectory of /tftpboot."
echo "Set up your DHCP, TFTP and PXE server to serve /tftpboot/.../pxeboot.0"
echo
echo "Note: The initrd image contains the whole CD ISO and is consequently"
echo "very large.  You will notice when pxebooting that initrd can take a"
echo "long time to download.  This is normal behaviour."

exit 0

В течці, де лежить звантажений образ, пишемо щось на зразок:

livecd-iso-to-pxeboot Fedora-14-i386-netinst.iso 

Отримуємо:

The ISO image doesn't look like a LiveCD ISO image to me.
Cleaning up to exit...

Хм… То є зле — адже це справжнісінький диск для встановлення. Починаємо копатися в скрипті. Для початку зробимо його локальну копію:

cp -p `which livecd-iso-to-pxeboot` ./

Відриваємо текст скрипта і що ж бачимо?

# Does it look like an ISO?
if [ ! -d $CDMNT/isolinux -o ! -f $CDMNT/isolinux/initrd0.img ]; then
 echo "The ISO image doesn't look like a LiveCD ISO image to me."
 exitclean
fi

Ага! В образі є тека isolinux, проте initrd-образ має назву не initrd0.img, a initrd.img. Міняємо всі збіги initrd0.img, на initrd.img , а до пари й vmlinuz0 на vmlinuz і маємо щастя.

./livecd-iso-to-pxeboot Fedora-12-i386-netinst.iso

Налаштовуємо tftp-сервер:

Якщо у Вас раніше не використовувався tftpd, то можна просто скопіювати вміст створеної скриптом теки tftpboot до теки, яку використовує tftpd (у мене це /tftpboot).

cp -pRv tftpboot/* /tftpboot/

Мій tftpd запускається з-під xinetd. Конфіг-файл  /etc/xinetd.d/tftp має вигляд:

# default: off
# description: The tftp server serves files using the trivial file transfer \
#    protocol.  The tftp protocol is often used to boot diskless \
#    workstations, download configuration files to network-aware printers, \
#    and to start the installation process for some operating systems.
service tftp
{
 socket_type        = dgram
 protocol        = udp
 wait            = yes
 user            = root
 server            = /usr/sbin/in.tftpd
 server_args        = -vvvv -p -c -u ftp -s /tftpboot
 disable            = no
 enable            = yes
 per_source        = 11
 cps            = 100 2
 flags            = IPv4
}

Звісно ж, не забуваємо включити та запустити сам суперінетдемон:

chkconfig xinetd on
service xinetd start

Дозволяємо з’єднання до нашого tftp-сервера (обов’язково прилаштуйте під свої потреби!) в /etc/sysconfig/iptables:

#dhcp
-A INPUT -m udp -p udp --dport 67 -j ACCEPT

#tftpd
-A INPUT -m udp -p udp --dport 69 -j ACCEPT

Налаштовуємо DHCP-сервер:

Мінімально потрібна конфігурація сервера (cat /etc/dhcpd.conf):

subnet 192.168.0.0 netmask 255.255.255.0 {

# --- default gateway
 option routers            192.168.0.1;
 option subnet-mask        255.255.255.0;

 option nis-domain        "localdomain";
 option domain-name        "localdomain";
 option domain-name-servers    192.168.0.1;

 option time-offset        7200;    # my Time
 option ntp-servers        192.168.0.1;

 
 default-lease-time 60;
 max-lease-time 600;
 boot-unknown-clients off;



 host test-pc {
 # вписуємо МАС-адресу машини для завантаженння
 hardware ethernet 00:1d:00:00:00:10;
 # адреса для машини
 fixed-address 192.168.0.2;
 # адреса tftp-сервера
 next-server 192.168.0.1;
 # файл для загрузки з сервера
 filename "pxelinux.0";
 }
}

При потребі, звісно, підправте мережеві налаштування. Отже, DHCP-сервер (який живе на адресі 192.168.0.1) видасть машині з МАС-адресою 00:1d:00:00:00:10 адресу 192.168.0.2 і передасть, що файл для завантаження називається pxelinux.0 і скачати його слід з tftp-сервера з адресою 192.168.0.1.

Включивши в BIOS завантаження з мережі і перегрузившись, наша тестова машина отримає мережеві налаштування і завантажить по мережі з tftp-сервера початковий образ netinstall, так, неначе цей самий образ був би записаний на диск і вставлений в цю машину.

При бажанні — можна всяко-разно крутити як налаштування DHCP, так і налаштування pxe, для отримання такого результату, який Вам потрібен. Зокрема, можна створити під кожну окрему машину окремий файл  конфігурації pxeboot і передавати ядру Linux необхідні параметри, як описано, наприклад в Графічна інсталяція Fedora Linux на dedicated server хостингу. Таким чином можна організувати, наприклад, встановлення типових конфігурацій в корпоративній мережі та багато інших смакот…

Опубліковано у DHCP, Fedora, Linux, Tips&Tricks, Мережі. Додати до закладок постійне посилання.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *