前言
办公室有一台服务器需要安装Centos操作系统 。一开始准备用移动硬盘来安装,但是在将操作 系统镜像文件写入硬盘映像时会清除移动硬盘里的数据,所以决定使用其他方式来安装。网上 搜索了一番,发现可以配置pxe来实现网络安装Centos操作系统,于是决定试一试。
在开始之前,先简单介绍一下pxe的工作原理。pxe(Pre-boot Execution Enviroment,预启动 执行环境)是由Intel公司开发的技术,工作于Client/Server的网络模式,支持工作站通过网络从 远端服务器下载映像,并由此支持通过网络启动操作系统。在启动过程中,终端要求服务器分 配ip地址,再用tftp(trivial file transfer protocol)或mtftp(multicast trivial file transfer protocol) 协议下载pxe引导文件与所要安装操作系统的内核文件,来引导操作系统的安装。
严格来说,pxe并不是一种安装方式,而是一种引导方式。进行pxe安装的必要条件是在安装的 计算机中必须包含一个pxe支持的网卡,即网卡中必须要有pxe client。pxe协议可以使计算机通 过网络启动。此协议分为client端和server端,而pxe client则在网卡的rom中。当计算机引导时, bios把pxe client调入内存中执行,然后由pxe client将放置在远端的文件通过网络下载到本地运 行。运行pxe协议需要设置dhcp服务器和tftp服务器。dhcp服务器会给pxe client(将要安装系统 的主机)分配一个ip地址,由于是给pxe client分配ip地址,所以在配置dhcp服务器时需要增加相 应的pxe设置。此外,在pxe client的rom中,已经存在了tftp client,那么它就可以通过tftp协议 到tftp server上下载所需的文件了。
pxe的工作过程:
pxe client从自己的pxe网卡启动,向本网络中的dhcp服务器获取ip
dhcp服务器返回分配给客户机的ip以及pxe文件的放置位置(该文件一般是放在一台tftp服务器 上)
pxe client 向本网络中的tftp服务器获取pxelinux.0文件
pxe client执行pxelinux.0(类似boot loader,是一个开机管理程序)
根据pxelinux.0的执行结果,通过tftp服务器加载内核和文件系统
进入安装画面,开始进行系统安装,所需要的文件可以通过http、ftp、nfs几种方式之一获取 (本文通过http来获取)
详细工作流程,参考下面这张图(盗图一张,来源于参考文档1)

准备工作
了解了pxe的工作原理,我们大概知道需要做哪些准备工作了。这里的准备工作主要是在pxe服务 器端(我用的是一台笔记本电脑,系统是ubuntu14.04)安装相应的服务,并准备好需要的文件。
- 关闭iptables与Selinux
- 安装dhcp服务并进行配置
- 安装tftp服务并进行配置
- 安装httpd服务并进行配置
- 准备安装树
- 准备kick start文件
关闭iptables与Selinux
sudo ufw disable
我的环境中并没有安装Selinux,所以关闭Selinux这步略过
安装dhcp服务并进行配置
sudo apt-get install isc-dhcp-server
我们还需要将服务器的网卡设置成静态ip
sudo vi /etc/network/interfaces
添加eth0的配置
auto eth0
iface eth0 inet static
address 192.168.3.2
netmask 255.255.255.0
broadcast 192.168.3.255
gateway 192.168.3.1
之后重启网口(重启除还回口之外的网口)
sudo ifdown --exclude=lo -a && sudo ifup --exclude=lo -a
修改dhcp配置文件
sudo vi /etc/dhcp/dhcpd.conf
在末尾添加
subnet 192.168.3.0 netmask 255.255.255.0 {
range 192.168.3.10 192.168.3.254; #地址池范围
option routers 192.168.3.2; #dhcp网关地址,这里填写为本机eth0地址
next-server 192.168.3.2; #tftp服务器地址
filename "pxelinux.0"; #指定的pxe文件
}
重启dhcp服务
sudo /etc/init.d/isc-dhcp-server restart
看看67端口是否已启用
ss -unl
安装tftp服务并进行配置
sudo apt-get install tftpd-hpa
sudo apt-get install tftp-hpa
修改配置文件
sudo vi /etc/default/tftpd-hpa
配置如下
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
RUN_DAEMON="yes"
OPTION="-l -s /var/lib/tftpboot"
重启tftp服务
sudo /etc/init.d/tftpd-hpa start
看看69端口是否已启用
ss -unl
此外,还需要在tftp目录/var/lib/tftpboot下准备好需要的文件。首先挂载操作系统的镜像文件。
sudo mount -o loop CentOS-6.9-x86_64-bin-DVD1.iso /media/cdrom
进行拷贝
sudo cp /media/cdrom/images/pxeboot/vmlinuz /var/lib/tftpboot/
sudo cp /media/cdrom/images/pxeboot/initrd.img /var/lib/tftpboot/
sudo cp /media/cdrom/isolinux/boot.msg /var/lib/tftpboot/
sudo cp /media/cdrom/isolinux/splash.jpg /var/lib/tftpboot/
sudo cp /media/cdrom/isolinux/vesamenu.c32 /var/lib/tftpboot/
这里简单说明一下这几个文件
- vmlinuz:内核文件
- initrd.img:内核模块参数
- vesamenu.c32:显示图形界面的程序
- splash.jpg:图形界面背景图片
- boot.msg:提供额外的信息,让使用者了解选项意义
图形界面显示的菜单在isolinux.cfg文件中配置。我们再新建一个pxelinux.cfg目录,将其拷贝到 该目录下,重命名为default。
sudo mkdir pxelinux.cfg
sudo cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
可以看到,该文件的每一个label都对应图形界面上的一个启动选项。
label linux
menu label ^Install or upgrade an existing system
menu default
kernel vmlinuz
append 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 -
等一等,是不是还少了个最重要的文件。没错,我们还需要pxelinux.0。这个文件需要通过安装syslinux 才能获取到,然后将其拷贝到tftp目录下。
apt-get install syslinux
sudo cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftpboot/
安装httpd服务并进行配置
sudo apt-get install apache2
启动httpd服务
sudo service apache2 start
查看httpd服务状态
sudo service apache2 status
准备安装树
安装树是一个目录,包括了完整的系统安装文件和相关程序。我们之前下载好的Centos镜像文件,进行 挂载后(目录为/media/cdrom)就可以作为安装树。同时,我们需要httpd服务来向外提供安装树,因 此需要把安装树放在httpd服务路径/var/www/html目录下。
sudo mount --bind /media/cdrom/ /var/www/html/centos6.9/
准备kick start文件
相信大家都有过不少安装操作系统的经验了。在安装系统的时候,安装程序会与我们进行交互,要求我们 完成很多设定,比如区域,语言,时间,用户名密码以及磁盘分区等。那么有没有可能安装程序自动完成 这些设定而不需要与我们进行交互呢?答案是肯定的,通过kick start可以实现。我们可以把我们想要的 设定预先保存在一个kick start文件中,当安装程序需要完成系统的各种设定时,它不再与我们进行交互, 而是直接读取kick start文件中的配置。ubuntu系统下,通过system-config-kickstart来生成kick start文件。
安装system-config-kickstart
sudo apt-get install system-config-kickstart
使用system-config-kickstart进行配置
system-config-kickstart &
配置界面如下

在安装方法中,我们选择http,http服务器地址填写为之前配置的静态ip地址,目录填写安装树的目录。

其余配置可以借鉴参考文档2
配置好以后,我们把这些配置保存成文件ks.cfg,放在/var/www/html/目录下。生成的ks.cfg文件内容如下
#Generated by Kickstart Configurator
#platform=x86
#System language
lang en_US
#Language modules to install
lang en_US
#System keyboard
keyboard us
#System mouse
#mouse
#System timezone
timezone Asia/Shanghai
#Root password
rootpw --iscrypted $1$Cl5Hj3DM$YK2YmnSGhWlS3Ikoll2jf.
#Initial user
#user xxk --fullname "xxk" --iscrypted --password $1$hidfUjGt$AGwC0WU3InS1HG5/kRfD41
#Reboot after installation
reboot
#Use text mode install
text
#Install OS instead of upgrade
install
#Use Web installation
url --url http://192.168.3.2/centos6.9
#System bootloader configuration
bootloader --location=mbr
#Clear the Master Boot Record
zerombr yes
#Partition clearing information
clearpart --all --initlabel
#Disk partitioning information
part /home --fstype ext4 --size 50000
part / --fstype ext4 --size 400000
part /boot --fstype ext4 --size 1000
part swap --size 2000
#System authorization infomation
auth --useshadow --enablemd5
#Network information
network --bootproto=dhcp --device=eth0
#Firewall configuration
firewall --disabled
#Do not configure the X Window System
skipx
需要注意的是,因为我是在ubuntu系统下生成kick start文件,而我要安装的是Centos系统,不同系统的kick start文件会有少许区别。比如我生成的ks.cfg文件中,关于鼠标的设定以及普通用户(非超级用户)的设定在 Centos下就不支持,需要把它们注释掉。
此外,我们还需要告诉安装程序ks.cfg文件的位置。修改/var/lib/tftpboot/pxelinux.cfg/default,第一个label下, append initrd=initrd.img后面增加ks=http://192.168.3.2/ks.cfg
label linux
menu label ^Install or upgrade an existing system
menu default
kernel vmlinuz
append initrd=initrd.img ks=http://192.168.3.2/ks.cfg
安装过程
- 硬件环境
- 修改bios
- 开始安装
硬件环境
将pxe服务器端(一台笔记本电脑)和pxe客户端(待安装Centos的一台服务器)连接在同一个子网内。最简单的 办法是使用hub,但是由于办公室里面没有hub,只有无线路由器,于是将笔记本和服务器都用网线连接到路由器, 这样也可以保证它们在一个子网内。
现在的无线路由器都自带了dhcp的功能,按道理应该需要将路由器的dhcp关闭。但是我没有关闭路由器的dhcp服务 (因为不知道路由器admin账号的密码),也并没有影响。
修改bios
修改待安装Centos系统的服务器的bios,将启动方式改为从网络启动。(并不是所有bios都支持这种启动方式,如果 不支持,那么就不能通过网络进行安装)。
开始安装
修改bios后,重启待安装系统的服务器,出现安装界面,选择第一项,后面的整个安装过程就不需要我们干预了, 我们就可以去做别的事情了。等整个安装过程结束,系统会自动重启,我们再进入bios,把启动方式修改为从硬盘 启动,整个安装过程就结束了。如果我们有多台电脑需要安装同样的操作系统,那么我们配置好pxe服务器端以后, 只要保证待安装系统的电脑处于同一子网内,这些电脑就会自动进行下载,安装,大大减轻了工作量。
安装过程中出现的图形界面(网上找了一张Centos6.5的界面,6.9的和这类似)

遇到的问题
其实和本文所讲的内容没有关系。我之前在办公室台式机上搭建了一个octopress环境,在那上面写博客,现在 想在笔记本上也搭一个octopress。安装好octopress和相关组件后,运行rake setup_github_pages将远端仓库origin 关联到我github上的repo。此时运行git branch -a,并不能看到我github上repo里面的两个分支。
运行命令
git fetch origin可以将远端仓库origin的分支同步到本地,再用命令git branch -a,就可以看到origin仓库的远端分支了。再将远端 分支与本地分支关联起来。
git branch -u origin/master master git branch -u origin/source source这样就可以进行git pull,git push等操作了。
参考文档
[1]http://www.linuxidc.com/Linux/2014-11/109074.htm
[2]http://linuxme.blog.51cto.com/1850814/871839
[3]http://www.tuicool.com/articles/meM7Nb
[4]http://linux.vbird.org/linux_enterprise/0120installation.php