Как устанавливать линукс при помощи RedHat Kickstart

Технологии безинтерактивной инсталляции компьютерных систем - Sun'овский Jumpstart, известный также под именем Autoinstall, или RedHat'овский Kickstart - призваны существенно облегчить жизнь системного администратора. В некоторых случаях установить операционную систему иным способом вообще невозможно (например, когда будущий сервер находится достаточно далеко от вас, и все что у вас имеется - это доступ к кнопке питания и консоли).

Здесь, увы, вы не найдете полного описания процедуры инсталляции, равно как и перевода RedHat'овской документации. Если вы никогда не использовали kickstart - прежде всего ознакомьтесь с документами, перечисленными в самом последнем разделе моего творения. Я пытался лишь записать некоторые свои наблюдения, сделанные в процессе практического использования технологии, дабы товарищу жизнь немного облегчить, да самому иметь возможность освежить кое-что в памяти при случае.

 

Как избежать ввода "linux ks=floppy" при 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
 

Как разметить диски и разместить загрузочную запись?

Я все время использовал LiloRHL7.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
 

Как определить, что записывать в разделе %packages?

Прежде всего нужно изучить файл 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, не повредит.

 

Как установить последние updates, настроить часы, удалить ненужный sendmail и вообще "пройтись напильником"?

Для этого имеется раздел %post, на примерное содержание какового можно взглянуть в прилагаемом файле ks.cfg-testbox.txt.

 

Что делать, если нет ни floppy, ни CD?

В RedHat'овской документации сказано, что для инсталляции системы необходимо иметь a) инсталляционный диск, будь то CD-ROM, или же его копия на локальном диске или удаленном FTP/HTTP/NFS-сервере, а также необходима b) загрузочная дискета. А если дисковод отсутствует и подключить его, пусть даже и временно, нет никакой возможности? Что делать в этом случае? Официальная документация ответа на этот вопрос не дает. Но реальный способ выхода из такого затруднительного положения имеется, и я опишу его, но несколько позже.

 

Где почитать про kickstart?

RedHat его породил, RedHat же его и описал:

В Bugzilla'е: пометь Red Hat Linux, выбери версию, в разделе Status пометь все имеющиеся варианты, значительно ниже, в поле Description, впиши kickstart и нажми на кнопку Submit query - будет что почитать в случае, если натолкнешься на расхождения между желаемым (описанным в документации) и действительным.


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