Технологии безинтерактивной инсталляции компьютерных систем - Sun'овский Jumpstart, известный также под именем Autoinstall, или RedHat'овский Kickstart - призваны существенно облегчить жизнь системного администратора. В некоторых случаях установить операционную систему иным способом вообще невозможно (например, когда будущий сервер находится достаточно далеко от вас, и все что у вас имеется - это доступ к кнопке питания и консоли).
Здесь, увы, вы не найдете полного описания процедуры инсталляции, равно как и перевода RedHat'овской документации. Если вы никогда не использовали kickstart - прежде всего ознакомьтесь с документами, перечисленными в самом последнем разделе моего творения. Я пытался лишь записать некоторые свои наблюдения, сделанные в процессе практического использования технологии, дабы товарищу жизнь немного облегчить, да самому иметь возможность освежить кое-что в памяти при случае.
Необходимо подредактировать файл syslinux.cfg. На дискете, изготовленной из образа boot.img, имеется файл syslinux.cfg, в котором [помимо прочего] записано вот что:
default linux prompt 1 timeout 600 display boot.msg label linux kernel vmlinuz append initrd=initrd.img local
Вышеприведенный фрагмент означает примерно следующее: На экран будет выведено содержимое файла boot.msg, что имеется на этой же дискете. Если после появления подсказки "boot:" нажать на клавишу Enter, или если вообще ничего не нажимать и выдержать паузу, то начнется стандартная графическая инсталляция.
Подредактировав файл и приведя его в нижеуказанное состояние, мы доб'емся того, что по умолчанию начнется kickstart'ная инсталляция, причем конфигурационный файл ks.cfg будет считан с этой же дискеты (файл syslinux.cfg может содержать только лишь эти пять строк).
default ks prompt 0 label ks kernel vmlinuz append ks=floppy initrd=initrd.img
Если устанавливается RHL7.2 на SCSI-диск, то в последней строке необходима еще одна пара, а именно ramdisk_size=7168.
На загрузочной дискете свободного места совсем немного, и если файл ks.cfg предполагается развесистым, то можно смело избавиться от файлов expert.msg и snake.msg. Тогда места хватит для 5KB-ного файла, а это уже очень даже кое и что.
Я пробовал три способа - с локального CD-привода, с NFS-сервера и с FTP-сервера (обновлял пакеты в рамках kickstart-инсталляции и с HTTP-сервера). Первая строка в файле ks.cfg указывает откуда что берется.
cdrom
Нетрудно догадаться, что в данном случае делается попытка обращения к локальному устройству.
nfs --server 192.168.3.10 --dir /opt/ftp/pub/redhat-6.2-cdrom
В моем случае NFS-сервером служил портативный компьютер с RHL6.2, где в /etc/exports было записано "/opt/ftp/pub (ro)".
url --url ftp://192.168.3.10/pub/redhat-7.2-cdrom/disc1
Таким образом я устанавливал RHL7.2. Хотя в RedHat'овской документации и написано, что anaconda сама подставит имя каталога "disc1" или "disc2" по мере надобности, но я этого подтвердить не могу. Инсталлятор тупо и радостно пытался переместиться в подкаталог "RedHat" (а URL в приведенной выше строке заканчивался словом "-cdrom/"), попытка была безуспешной и на консоли я мог наблюдать просто синий прямоугольник, без каких-либо сообщений об ошибках, хотя попытки подсоединиться к FTP-серверу повторялись многократно. В качестве возможного, но не исследованного оправдания могу лишь добавить, что подкаталоги disc[12] у меня обслуживаются automounter'ом (autofs-3.1.4-4).
Еще одно наблюдение: когда я пытался применить команду "rpm -i ftp://..." и в качестве FTP-сервера выступал Solaris8, то команда rpm завершалась ошибкой, так как родной солярисовый FTP-демон не понимал одну из посылаемых ему команд (что за команда я не помню, но в RFC959 я таковой не встречал). По этой причине kickstart-инсталляцию с FTP-сервера под солярисом я даже и не пробовал.
Все время я устанавливал системы, понимающие лишь английский язык. При установке RHL6.2 строка была всего одна:
lang en_US
В RHL7.2 кроме вышеуказанной необходимо написать еще одну строку (в руководстве не написано, что эта строка "required"; если ее не включить в файл ks.cfg, то в процессе инсталляции придется вступать в диалог):
langsupport --default en_US en_US
Если в этой строке указать "en_US" один только раз, то будут установлены всякие ненужные пакеты вроде Canna, kakasi и man-pages-ru (из описания это не очевидно).
Формат команды network в RHL6.2 и в RHL7.2 несколько отличен, но в обоих случаях приходится записывать одну очень длинную строку.
RHL6.2: можно описать только один сетевой интерфейс и нельзя описать hostname иначе как в постинсталляционном разделе %post.
network --bootproto static
--ip 192.168.3.20 --netmask 255.255.255.0
--gateway 192.168.3.1 --nameserver 192.168.3.11
RHL7.2: хотя hostname и описывается, корректная запись в файл /etc/hosts все равно не добавляется.
network --bootproto static --device eth0 --hostname testbox
--ip 192.168.3.20 --netmask 255.255.255.0
--gateway 192.168.3.1 --nameserver 192.168.3.11
Я все время использовал Lilo (в RHL7.2 по умолчанию ставится Grub). Вот несколько примеров:
-- роутер с небольшим диском и 48 MB RAM, RHL6.2 (как жаль, что нет возможности устанавливать все пакеты посредством rpm -i --excludedocs):
clearpart --all zerombr yes part /boot --ondisk hda --size 16 part swap --ondisk hda --size 48 part / --ondisk hda --size 176 part /var --ondisk hda --grow lilo --location mbr
-- cервер с зеркалированными копиями всех файловых систем и двумя областями свопинга, RHL6.2:
clearpart --all zerombr yes part raid.01 --size 32 --ondisk sda part raid.02 --size 32 --ondisk sdb part swap --size 512 --ondisk sda part swap --size 512 --ondisk sdb part raid.11 --size 1024 --ondisk sda part raid.12 --size 1024 --ondisk sdb part raid.21 --grow --ondisk sda part raid.22 --grow --ondisk sdb raid /boot --level 1 --device md0 raid.01 raid.02 raid / --level 1 --device md1 raid.11 raid.12 raid /var --level 1 --device md2 raid.21 raid.22 lilo --location partition
-- сервер с одним SCSI-диском, RHL7.2:
clearpart --all zerombr yes part /boot --ondisk sda --size 50 part swap --ondisk sda --size 1024 part / --ondisk sda --size 2048 part /web --ondisk sda --size 2048 --grow bootloader --useLilo --location mbr
В случае RHL7.2, когда используется модификатор --grow, все равно нужно использовать описатель --size (в отличие от RHL6.2, где --grow все за себя и говорит).
В RHL7.2 все очень просто и работает именно так, как описано в документации, например:
auth --useshadow --enablemd5 rootpw --iscrypted $1$6ilA3X4G$5HhAMOflJ8dGZUjj5CNc21
В RHL6.2 все было несколько сложнее - как ты ни бейся, вписать пароль в /etc/shadow не удавалось, что RedHat'овцы в конце концов и признали - смотри Bug 17476 - поэтому приходилось изворачиваться следующим образом:
auth --useshadow --enablemd5
rootpw password
%post
cp /etc/passwd /tmp/passwd
sed -e /^root:/s/root:[^:]*:/root:x:/ /tmp/passwd > /etc/passwd
cp /etc/shadow /tmp/shadow
sed -e "/^root:/s*root::*root:`grep '^root:' /tmp/passwd|cut -d: -f2`:*" \
/tmp/shadow > /etc/shadow
rm -f /tmp/passwd /tmp/shadow
Прежде всего нужно изучить файл RedHat/base/comps на [первом] инсталляционном диске - там есть список всех пакетов, входящих, к примеру, в кластер "Base" или в "Software Development". Устанавливая анонимный FTP-сервер под RHL6.2 я использовал следующий набор заклинаний:
%packages @ Base anonftp bind-utils inetd ipchains iputils pam tcp_wrappers wu-ftpd xntp3
Описатель будущего web-сервера под RHL7.2 (некоторые удаленные каталоги монтируются "по требованию", время от времени подстраиваются часы, делаются удаленные backup'ы и осуществляется мелкий development) имел вид:
%packages @ Base @ Software Development openssl openssh openssh-clients openssh-server apache apache-devel apache-manual libxml2 mod_ssl autofs nfs-utils portmap libcap ntp dump rmt rsh bind-utils ftp rsync tcpdump traceroute ucd-snmp
Порядок записи имен пакетов не существенен, хотя знание того, что, к примеру, перед установкой пакета ntp должен быть установлен пакет libcap, не повредит.
Для этого имеется раздел %post, на примерное содержание какового можно взглянуть в прилагаемом файле ks.cfg-testbox.txt.
В RedHat'овской документации сказано, что для инсталляции системы необходимо иметь a) инсталляционный диск, будь то CD-ROM, или же его копия на локальном диске или удаленном FTP/HTTP/NFS-сервере, а также необходима b) загрузочная дискета. А если дисковод отсутствует и подключить его, пусть даже и временно, нет никакой возможности? Что делать в этом случае? Официальная документация ответа на этот вопрос не дает. Но реальный способ выхода из такого затруднительного положения имеется, и я опишу его, но несколько позже.
RedHat его породил, RedHat же его и описал:
http://www.redhat.com/docs/manuals/linux/RHL-6.2-Manual/ref-guide/ch-kickstart2.html
http://www.redhat.com/docs/manuals/linux/RHL-7.2-Manual/custom-guide/ch-kickstart2.html
https://bugzilla.redhat.com/bugzilla/query.cgi В Bugzilla'е: пометь Red Hat Linux, выбери версию, в разделе Status пометь все имеющиеся варианты, значительно ниже, в поле Description, впиши kickstart и нажми на кнопку Submit query - будет что почитать в случае, если натолкнешься на расхождения между желаемым (описанным в документации) и действительным.
http://www.linuxdoc.org/HOWTO/KickStart-HOWTO.html ks.cfg-testbox:
#
# ks.cfg
# Host: TESTBOX 02/26/2002
#
# Type of KickStart Installation
#
url --url ftp://192.168.3.10/pub/redhat-7.2-cdrom/disc1
#
# System Identification
#
lang en_US
langsupport --default en_US en_US
keyboard us
mouse none
network --bootproto static --device eth0 --ip 192.168.3.20 --netmask 255.255.255.0 --hostname testbox --gateway 192.168.3.1 --nameserver 192.168.3.11
timezone --utc US/Pacific
#
# Disk Layout / LILO
#
install
text
clearpart --all
zerombr yes
part /boot --ondisk sda --size 50
part swap --ondisk sda --size 1024
part / --ondisk sda --size 2048
part /web --ondisk sda --size 2048 --grow
### lilo --location mbr
bootloader --useLilo --location mbr
skipx
#
# Root's password
#
auth --useshadow --enablemd5
rootpw --iscrypted $1$6ilA3X4G$5HhAMOflJ8dGZUjj5CNc21
reboot
#
# What to install
#
%packages
@ Base
@ Software Development
### ... OpenSSL/OpenSSH
openssl
openssh
openssh-clients
openssh-server
### ... Web Server
apache
apache-devel
apache-manual
libxml2
mod_ssl
### ... NFS client
autofs
nfs-utils
portmap
### ... NTP
libcap
ntp
### ... [remote] DUMP/RESTORE
dump
rmt
rsh
### ... MISC
bind-utils
ftp
rsync
tcpdump
traceroute
ucd-snmp
%post
#
#------------------------------------------------------------------------
#
# ... Defining variables
#
. /etc/sysconfig/network
#
DNS_SERVERS=192.168.4.11
DNS_DOMAIN="domain.com"
NTP_SERVER=192.168.3.1
MRTG_SERVER=192.168.3.222
SNMP_ROCOMMUNITY=ROCommunityString
FTP_URL=ftp://192.168.3.10/pub
CHKCONFIG_OFF="kudzu apmd sendmail gpm"
#
NETW_CONFIG=/etc/sysconfig/network
ETH0_CONFIG=/etc/sysconfig/network-scripts/ifcfg-eth0
CLOCK_CONFIG=/etc/sysconfig/clock
#
if [ -f "$ETH0_CONFIG" ]; then
IP_ADDRESS=`grep ^IPADDR $ETH0_CONFIG | cut -d= -f2`
IP_NETMASK=`grep ^NETMASK $ETH0_CONFIG | cut -d= -f2`
fi
IP_GATEWAY=`grep ^GATEWAY $NETW_CONFIG | cut -d= -f2`
TIMEZONE=`grep ^ZONE $CLOCK_CONFIG | cut -d= -f2`
#
# ... Disallow hotkey interactive startup
#
mv /etc/sysconfig/init /tmp/etc-sysconfig-init
sed -e 's/PROMPT=yes/PROMPT=no/' /tmp/etc-sysconfig-init > /etc/sysconfig/init
rm -f /tmp/etc-sysconfig-init
#
# ... Preparing to redirect system console (lilo.conf not updated!)
#
echo -e "\n#\nS0:345:respawn:/sbin/agetty ttyS0 9600 vt100" >> /etc/inittab
echo ttyS0 >> /etc/securetty
#
# ... configuring hostname
#
if [ -f "$ETH0_CONFIG" ]; then
echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts
echo -n "`grep ^IPADDR $ETH0_CONFIG | cut -d= -f2` " >> /etc/hosts
if [ -n "$DNS_DOMAIN" ]; then
echo -n "${HOSTNAME}.$DNS_DOMAIN " >> /etc/hosts
fi
echo "$HOSTNAME" >> /etc/hosts
fi
#
# ... configuring resolver
#
if [ -n "$DNS_SERVERS" ]; then
for d in $DNS_SERVERS; do
echo "nameserver $d" >>/etc/resolv.conf
done
fi
if [ -s /etc/resolv.conf ]; then
if [ -n "$DNS_DOMAIN" ]; then
echo "domain $DNS_DOMAIN" >>/etc/resolv.conf
fi
if [ -n "$DNS_SEARCH" ]; then
echo "search $DNS_SEARCH" >>/etc/resolv.conf
fi
fi
#
# ... switching OFF unnecessary services
#
for s in $CHKCONFIG_OFF; do
chkconfig --level 2345 $s off
done
#
# ... SNMP
#
rpm -q ucd-snmp >/dev/null 2>&1
if [ $? -eq 0 -a -n "$SNMP_ROCOMMUNITY" ]; then
mv /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.orig
( echo -n "rocommunity $SNMP_ROCOMMUNITY" ;\
[ -n "$MRTG_SERVER" ] && echo " $MRTG_SERVER" ) > /etc/snmp/snmpd.conf
echo "exec days-up /bin/ash /etc/snmp/days-up.sh" >> /etc/snmp/snmpd.conf
echo "#!/bin/ash" > /etc/snmp/days-up.sh
echo "awk '{print int(\$1/86400)}' /proc/uptime" >> /etc/snmp/days-up.sh
chmod 755 /etc/snmp/days-up.sh
chkconfig snmpd on
fi
#
# ... configuring NTP
#
rpm -q ntp >/dev/null 2>&1
if [ $? -eq 0 -a -n "$NTP_SERVER" ]; then
echo "server $NTP_SERVER" > /etc/ntp.conf
echo "$NTP_SERVER" > /etc/ntp/step-tickers
chkconfig --level 2345 ntpd on
fi
#
# ... going on-line
#
if [ -n "$IP_GATEWAY" ]; then
ifconfig eth0 inet $IP_ADDRESS netmask $IP_NETMASK up
route add default gw $IP_GATEWAY
ping -nc 1 $IP_GATEWAY >/dev/null 2>&1
if [ $? -eq 0 ]; then
#
# ... attempting to set h/w clock
#
[ -n "$NTP_SERVER" -a -f /etc/ntp/step-tickers ] && \
/usr/sbin/ntpdate -s -b -p 8 -u $NTP_SERVER
if [ $? -eq 0 ]; then
/sbin/hwclock --systohc --utc
fi
#
# ... installing new kernel (/etc/lilo.conf not updated!)
#
rpm -F $FTP_URL/redhat/updates/7.2/i386/kernel-headers-2.4.9-21.i386.rpm
#
# rpm -i $FTP_URL/redhat/updates/7.2/i686/kernel-enterprise-2.4.9-21.i686.rpm
# shall install new kernel after reboot -- initrd image will be generated
# automatically (in RHL7.2, but not in RHL6.2!)
#
# ...... installing updates
#
rpm -F $FTP_URL/redhat/updates/7.2/i386/apache-1.3.22-2.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/apache-devel-1.3.22-2.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/apache-manual-1.3.22-2.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/at-3.1.8-23.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/gdb-5.1-1.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/glibc-common-2.2.4-19.3.i386.rpm \
$FTP_URL/redhat/updates/7.2/i686/glibc-2.2.4-19.3.i686.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/glibc-devel-2.2.4-19.3.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/groff-1.17.2-7.0.2.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/initscripts-6.43-1.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/iptables-1.2.4-2.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/libxml2-2.4.10-0.7x.2.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/mod_ssl-2.8.5-1.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/modutils-2.4.13-0.7.1.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/nfs-utils-0.3.1-13.7.2.1.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/openldap-2.0.21-1.i386.rpm \
$FTP_URL/redhat/updates/7.2/i386/openldap-devel-2.0.21-1.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/openssh-2.9p2-12.i386.rpm \
$FTP_URL/redhat/updates/7.2/i386/openssh-clients-2.9p2-12.i386.rpm \
$FTP_URL/redhat/updates/7.2/i386/openssh-server-2.9p2-12.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/pam-0.75-19.i386.rpm \
$FTP_URL/redhat/updates/7.2/i386/pam-devel-0.75-19.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/raidtools-0.90-24.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/rsync-2.4.6-10.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/tmpwatch-2.8.1-1.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/ucd-snmp-4.2.3-1.7.2.3.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/util-linux-2.11f-17.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/vim-common-6.0-7.13.i386.rpm
rpm -F $FTP_URL/redhat/updates/7.2/i386/vim-minimal-6.0-7.13.i386.rpm
#
# ... installing additional packages
#
rpm -i $FTP_URL/redhat/7.2/misc/watchdog-5.2-2.i386.rpm
fi
fi
#
# End-Of-File