PXE网络引导安装Linux及后安装脚本编写


原理:

 

 

步骤:

1.安装vsftpd服务

# yum install vsftpd

# rpm -ql vsftpd

/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/rc.d/init.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/sbin/vsftpd
...
...
/var/ftp
/var/ftp/pub

# service vsftpd start

# chkconfig vsftpd on

# chkconfig --list | grep vsftpd

vsftpd             0:off    1:off    2:on    3:on    4:on    5:on    6:off

# mkdir /mnt/cdrom

# mount /dev/cdrom /mnt/cdrom

# cp -r /mnt/cdrom/. /var/ftp/    (把光盘上所有文件拷贝到ftp的根目录)

# du -sh /var/ftp

3.8G    /var/ftp

 

2.安装dhcp服务并配置

# yum install dhcp

# rpm -ql dhcp

/etc/dhcp
/etc/dhcp/dhcpd.conf
/etc/dhcp/dhcpd6.conf
/etc/openldap/schema/dhcp.schema
/etc/portreserve/dhcpd
/etc/rc.d/init.d/dhcpd
/etc/rc.d/init.d/dhcpd6
/etc/rc.d/init.d/dhcrelay
/etc/rc.d/init.d/dhcrelay6
/etc/sysconfig/dhcpd
/etc/sysconfig/dhcpd6
/etc/sysconfig/dhcrelay
/etc/sysconfig/dhcrelay6
/usr/bin/omshell
/usr/sbin/dhcpd
/usr/sbin/dhcrelay
/usr/share/doc/dhcp-4.1.1
/usr/share/doc/dhcp-4.1.1/3.0b1-lease-convert
/usr/share/doc/dhcp-4.1.1/IANA-arp-parameters
/usr/share/doc/dhcp-4.1.1/README.ldap
/usr/share/doc/dhcp-4.1.1/api+protocol
/usr/share/doc/dhcp-4.1.1/dhclient-tz-exithook.sh
/usr/share/doc/dhcp-4.1.1/dhcpd-conf-to-ldap
/usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample
/usr/share/doc/dhcp-4.1.1/dhcpd6.conf.sample
/usr/share/doc/dhcp-4.1.1/draft-ietf-dhc-ldap-schema-01.txt
/usr/share/doc/dhcp-4.1.1/ms2isc
/usr/share/doc/dhcp-4.1.1/ms2isc/Registry.perlmodule
/usr/share/doc/dhcp-4.1.1/ms2isc/ms2isc.pl
/usr/share/doc/dhcp-4.1.1/ms2isc/readme.txt
/usr/share/doc/dhcp-4.1.1/sethostname.sh
/usr/share/doc/dhcp-4.1.1/solaris.init
/usr/share/man/man1/omshell.1.gz
/usr/share/man/man5/dhcpd.conf.5.gz
/usr/share/man/man5/dhcpd.leases.5.gz
/usr/share/man/man8/dhcpd.8.gz
/usr/share/man/man8/dhcrelay.8.gz
/var/lib/dhcpd
/var/lib/dhcpd/dhcpd.leases
/var/lib/dhcpd/dhcpd6.leases

# vim /etc/dhcp/dhcpd.conf

该配置文件内容为空,在底行模式下读取样例文件 

:r /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample

然后修改后内容如下:

option domain-name "itecs.cn";
option domain-name-servers 222.222.222.222, 114.114.114.114;

default-lease-time 600;
max-lease-time 7200;

log-facility local7;

subnet 192.168.80.0 netmask 255.255.255.0 {
  range dynamic-bootp 192.168.80.101 192.168.80.200;
  option subnet-mask 255.255.255.0;
  option routers 192.168.80.254;
}

# service dhcpd

Usage: /etc/init.d/dhcpd {start|stop|restart|force-reload|condrestart|try-restart|configtest|status}

# service dhcpd configtest

# service dhcpd start

# chkconfig dhcpd on

 

3.安装tftp-server

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务,基于UDP,端口号为69。主要用于以下场景:

  • 交换机或路由器升级或备份
  • 无盘工作站存放boot loader
  • 嵌入式开发时装载系统
  • 大规模的服务安装布署

# ll /mnt/cdrom/Packages/tftp*

-r--r--r--. 2 root root 32372 May 12  2016 /mnt/cdrom/Packages/tftp-0.49-8.el6.x86_64.rpm
-r--r--r--. 2 root root 40328 May 12  2016 /mnt/cdrom/Packages/tftp-server-0.49-8.el6.x86_64.rpm

# yum install tftp-server

# rpm -ql tftp-server

/etc/xinetd.d/tftp
/usr/sbin/in.tftpd
/usr/share/doc/tftp-server-0.49
/usr/share/doc/tftp-server-0.49/CHANGES
/usr/share/doc/tftp-server-0.49/README
/usr/share/doc/tftp-server-0.49/README.security
/usr/share/doc/tftp-server-0.49/README.security.tftpboot
/usr/share/man/man8/in.tftpd.8.gz
/usr/share/man/man8/tftpd.8.gz
/var/lib/tftpboot

 # vim /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     = -s /var/lib/tftpboot   #指定tftp-server的根目录,参数-s指定chroot,-c指定了可以创建文件
    disable         = no #disable设为no表示启用该服务
    per_source      = 11                     #每一个来源最多可以建立11个连接
    cps             = 100 2                  #每秒连接数,达到100个就等待2秒
    flags           = IPv4
}

# service xinetd start

注意:tftp是被xinetd动态管理的服务,所以在安装tftp-server时作为依赖xinetd也被一起安装。启动服务也仅启动xinetd即可,无须单独启动tftp服务。

# netstat -tupln | grep 69

udp        0      0 0.0.0.0:69                  0.0.0.0:*                               26996/xinetd

# tail -f /var/log/messages (查看日志有无错误信息)

 

4.把系统引导文件、内核和驱动拷贝到tftp-server的根目录

tftp的根目录在/var/lib/tftpboot/

 # yum install syslinux (通过安装该软件包获得引导文件)

# cd /var/lib/tftpboot/

# cp /usr/share/syslinux/pxelinux.0 ./

# cp /mnt/cdrom/images/pxeboot/vmlinuz ./

# cp /mnt/cdrom/images/pxeboot/initrd.img ./

引导文件在使用时还需要有相应的配置文件:

# mkdir pxelinux.cfg

# cp /mnt/cdrom/isolinux/isolinux.cfg pxelinux.cfg/default (把配置文件拷贝到新建的目录pxelinux.cfg中并改名为default)

# vim pxelinux.cfg/default

default linux
prompt 1
timeout 6

display boot.msg

menu background splash.jpg
menu title Welcome to CentOS 6.9!
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color tabmsg 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ff000000 #ffffffff
menu color hotkey 7 #ffffffff #ff000000
menu color scrollbar 0 #ffffffff #00000000

label linux
  menu label ^Install or upgrade an existing system
  menu default
  kernel vmlinuz
  append ks=ftp://192.168.80.100/ks.cfg initrd=initrd.img
label vesa
  menu label Install system with ^basic video driver
  kernel vmlinuz
  append initrd=initrd.img nomodeset
label rescue
  menu label ^Rescue installed system
  kernel vmlinuz
  append initrd=initrd.img rescue
label local
  menu label Boot from ^local drive
  localboot 0xffff
label memtest86
  menu label ^Memory test
  kernel memtest
  append -

 dhcp服务器需要配置next-server参数才能把tftp server的IP地址告诉客户端,filename参数指定引导程序的名字。

# vim /etc/dhcp/dhcpd.conf

option domain-name "itecs.cn";
option domain-name-servers 222.222.222.222, 114.114.114.114;

default-lease-time 600;
max-lease-time 7200;

log-facility local7;

subnet 192.168.80.0 netmask 255.255.255.0 {
  range dynamic-bootp 192.168.80.101 192.168.80.200;
  option subnet-mask 255.255.255.0;
  option routers 192.168.80.254;
  next-server 192.168.80.100;
  filename "pxelinux.0";
}

# service dhcpd restart

5.创建Kickstart自动应答文件ks.cfg

生成ks.cfg文件需要Linux安装图形界面。菜单界面上做选择确认,在软件包等选择时,需要设置好yum源,否则这些内容不会出现。

# yum list all | grep kick

pykickstart.noarch                         1.74.22-1.el6                 base   
system-config-kickstart.noarch             2.8.6.6-1.el6                 base 

# yum -y install system-config-kickstart  (必须在图形桌面下运行,xshell注册后具有图形功能,可以执行)

关于在xshell下运行此命令,有可能出现

Could not open display because no X server is running.
Try running 'system-config-kickstart --help' for a list of options.

baidu搜索,依然不能解决问题,但在我另一台电脑上(win10,有问题的电脑安装的是win7)运行却没有问题。

① 在Basic Configuration中:

② 在Installation Method中:

③ 在Boot Loader Options中:

④ 在Partition Informatica中:

⑤ Network Configuration中:

⑥ 在Authentication中:

⑦ 在Firewall Configuration中:

⑧ 在Display Configuration中:

⑨ 在Package Selection中:

⑩ 在Pre-Installation Script中:

在预安装脚本中不用添加脚本。

⑪ 在Post-Installation Script中:

 在后安装脚本中暂时不添加脚本。

设置完成后,File->Save。文件名为ks.cfg,保存在vsftpd的根目录(/var/ftp)下。

6. 测试

 创建一台新的CentOS 6 64位虚拟机(注意:在光驱的设备状态里,启动时连接复选框没有勾选),然后开启此虚拟机,稍等片刻就可以看到从网络上开始引导了。

安装完成后系统重启就可以登录了。

安装完成后2个地方需要完善:一是所有主机的主机名都为localhost.localdomain,需要统一命名;二是所有主机的IP地址都是dhcp动态获取,需要设置为静态地址,这2个设置可以通过后安装脚本完成。

7.编写后安装脚本

 (1)解决主机名重名的问题

假设主机动态获取的IP地址是192.168.80.100,则主机名命名为station100,即主机名由“station”字符串和IP地址的最后一个字节组成。

# ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 00:0C:29:79:F1:B3  
          inet addr:192.168.80.131  Bcast:192.168.80.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe79:f1b3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1411 errors:0 dropped:0 overruns:0 frame:0
          TX packets:949 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:122384 (119.5 KiB)  TX bytes:87462 (85.4 KiB)

# ifconfig eth0 | grep -i inet

inet addr:192.168.80.131  Bcast:192.168.80.255  Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe79:f1b3/64 Scope:Link

# ifconfig eth0 | grep -i "inet\>"    (词尾锚定)

inet addr:192.168.80.131  Bcast:192.168.80.255  Mask:255.255.255.0

# ifconfig eth0 | grep -i "inet\>" | awk '{print $2}'

addr:192.168.80.131

# ADDR=`ifconfig eth0 | grep -i "inet\>" | awk '{print $2}'`

# echo $ADDR

# NUM=${ADDR##*.}    (进行字符串的截取,##表示从左边开始截,一直截取到最后一个点号,*表示把点号左边的扔掉,留下右边的,即得到131)

# echo $NUM

# IP=${ADDR#*:}

# echo $IP

# MASK1=`ifconfig eth0 | grep -i "inet\>" | awk '{print $4}'`

# MASK=${MASK1#*:}

# GATEWAY=`route -n | grep UG | awk '{print $2}'`

# echo $GATEWAY

改主机名要修改/etc/sysconfig/network文件

# cat /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=localhost.localdomain

# sed -e "/HOSTNAME/c\HOSTNAME=station$NUM.itecs.cn" /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=station131.itecs.cn

(2)把网卡IP地址由DHCP动态获取改为静态地址

 # cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
BOOTPROTO="dhcp"
HWADDR="00:0C:29:79:F1:B3"
IPV6INIT="yes"
MTU="1500"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID="025d7cec-4f8f-4d94-ab18-55ecf90f3a97"

# NETCFG=/etc/sysconfig/network-scripts/ifcfg-eth0

# sed -e "s/dhcp/static/" $NETCFG

# sed -e "2a\IPADDR=$IP\nNETMASK=$MASK\nGATEWAY=$GATEWAY" $NETCFG

# vim f1.sh

 1 #!/bin/bash
 2 NETCFG=/etc/sysconfig/network-scripts/ifcfg-eth0
 3 ADDR=`/sbin/ifconfig eth0 | grep -i "inet\>" | awk '{print $2}'`
 4 NUM=${ADDR##*.}
 5 IP=${ADDR#*:}
 6 MASK1=`/sbin/ifconfig eth0 | grep -i "inet\>" | awk '{print $4}'`
 7 MASK=${MASK1#*:}
 8 GATEWAY=`/sbin/route -n | grep UG | awk '{print $2}'`
 9 #modify hostname
10 sed -i -e "/HOSTNAME/c\HOSTNAME=station$NUM.itecs.cn" /etc/sysconfig/network
11 hostname station$NUM.itecs.cn
12 #modify ipaddress
13 . $NETCFG
14 if [ "$BOOTPROTO"="dhcp" ];then
15         sed -i -e "/BOOTPROTO/cBOOTPROTO=static\nIPADDR=$IP\nNETMASK=$MASK\nGATEWAY=$GATEWAY" $NETCFG
16 fi

 重新创建ks.cfg自动应答文件,在最后添加后安装脚本:

 # cat ks.cfg

#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Firewall configuration
firewall --disabled
# Install OS instead of upgrade
install
# Use network installation
url --url="ftp://192.168.80.99/"
# Root password
rootpw --iscrypted $1$pmulo95A$xS0R8IcWcjjHjH33vczop.
# System authorization information
auth  --useshadow  --passalgo=sha512
# Use text mode install
text
firstboot --disable
# System keyboard
keyboard us
# System language
lang en_US
# SELinux configuration
selinux --disabled
# Installation logging level
logging --level=info
# Reboot after installation
reboot
# System timezone
timezone  Asia/Shanghai
# Network information
network  --bootproto=dhcp --device=eth0 --onboot=on
# System bootloader configuration
bootloader --append="quiet" --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel 
# Disk partitioning information
part /boot --fstype="ext4" --size=200
part swap --fstype="swap" --size=512
part / --fstype="ext4" --size=10000

%post --interpreter=/bin/bash
NETCFG=/etc/sysconfig/network-scripts/ifcfg-eth0
ADDR=`/sbin/ifconfig eth0 | grep -i "inet\>" | awk '{print $2}'`
NUM=${ADDR##*.}
IP=${ADDR#*:}
MASK1=`/sbin/ifconfig eth0 | grep -i "inet\>" | awk '{print $4}'`
MASK=${MASK1#*:}
GATEWAY=`/sbin/route -n | grep UG | awk '{print $2}'`
#modify hostname
sed -i -e "/HOSTNAME/c\HOSTNAME=station$NUM.itecs.cn" /etc/sysconfig/network
hostname station$NUM.itecs.cn
#modify ipaddress
. $NETCFG
if [ "$BOOTPROTO"="dhcp" ];then
        sed -i -e "/BOOTPROTO/cBOOTPROTO=static\nIPADDR=$IP\nNETMASK=$MASK\nGATEWAY=$GATEWAY" $NETCFG
fi
%end

%packages
@additional-devel
@development
@server-platform-devel

%end

 参考文献:

(1)PXE服务器原理与实战搭建

(2)dhcp、tftp及pxe简介

(3)Linux自学笔记——dhcp,tftp,pxe

(4)PXE+Kickstart+DHCP+TFTP实现无人值守安装操作系统

(5)PXE服务器原理与实战搭建

(6)PXE详解


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM