一、Linux操作系统安装
RHEL 8 安装
进入安装界面:
语言建议选择英文:
设置磁盘空间分配策略
选择自定义分区:
可以选择标准分区与LVM分区形式,标准分区会将磁盘做成标准分区,LVM会将磁盘做成逻辑卷,建议选择LVM形式,将来空间不够可以增加磁盘进行扩容:
Linux分区要根据服务器应用类型进行划分,有Web服务器、FTP服务器、数据库服务器等等。
注意:如果没有对/home或/var等目录单独分区,/home等分区默认使用的就是根分区的内容。
根分区至少预留50G:
Linux的根分区和boot分区必须要创建,/boot分区存放系统系统引导和内核文件,最少1G:
因此,在Red Hat Enterprise Linux 中,以下是设置合适的交换分区大小的规则:
物理内存 | 交换分区(SWAP) |
<= 4G | 至少4G |
4~16G | 至少8G |
16G~64G | 至少16G |
64G~256G | 至少32G |
点击Done继续安装:
分区后要进行格式化,点击接收改变即可。
配置网络:
先是默认DHCP,因此我们不动它,直接Done:
设定时区:
指定安装包组:
可以安装图形去了解一下,生产环境只会用最小化系统进行安装,可安装一些工具包:
一直下一步:
设置root密码以及创建普通用户(可以不建):
安装完成。
CentOS和RHEL的区别:
a. RHEL:Red Hat Enterprise Linux(企业级的Linux系统)
b. CentOS:Community Enterprise Operating System(也是红帽的产品,社区版本)
c. 两者区别:
(1)企业版本RHEL:如果你购买了订阅,可以得到技术支持!但是CentOS没有此服务:400
(2)CentOS作为一个社区版本,有些新的特性(不稳定)也是在社区版本优先进行发布,但在RHEL中,它不包含这些。
(3)关于漏洞(BUG)修复RHEL的企业级用户:400电话,也是最先响应的;BUG一定会在红帽社区中进行公布,一般会较长一段时间后,BUG的修复才会被公布出来。
(4)关于命令及操作:两者在同期的版本的情况下相同。
(5)支持周期:RHEL为最近的3个大版本(现在是RHEL6/7/8),CentOS通常只有18个月。
因为centos8的系统将要结束支持,后期维护的是CentOS Stream项目。
二、PXE+Kickstart批量安装Linux操作系统
1. PXE环境概述
作为一名运维人员,在一些中小公司经常会遇到一些机械式的重复工作,比如:批量一次大批量的进行操作系统的安装等等。为了实现自动化运维,减少人员负担我们可以部署以下服务:Kickstart(PXE+DHCP+TFTP+HTTP)或Cobbler
2. 批量装机软件介绍
Redhat系通主要有两种方式:Kickstart和Cobbler。
Kickstart是一种无人值守的安装方式。它的工作原理是在安装过程中记录人工干预填写的各种参数,并生成一个名为ks.cfg的文件。如果在自动安装过程中出现要填写参数的情况,安装程序首先会去查找ks.cfg文件,如果找到合适的参数,就采用所找到的参数;如果没有找到合适的参数,便会弹出对话框让安装者手工填写。所以,如果ks.cfg文件涵盖了安装过程中所有需要填写的参数,那么安装者完全可以只告诉安装程序从何处下载ks.cfg文件。等安装完毕,安装程序会根据ks.cfg中的设置重启/关闭系统,并结束安装。
Cobbler集中和简化了通过网络安装操作系统需要使用到的DHCP、TFTP和DNS服务的配置。Cobbler不仅有一个命令行界面,还提供了一个Web界面,大大降低了使用者的入门水平。Cobbler内置了一个轻量级配置管理系统,但它也支持和其它配置管理系统集成。
3. 什么是PXE?
PXE,全名Pre-boot Execution Environment,预启动执行环境;简单的说,Cobbler是对kickstart的封装,简化安装步骤、使用流程,并降低使用者的门槛。而kickstart实现方式依赖于PXE环境,通过网络接口启动计算机,不依赖本地存储设备(如硬盘)或本地已安装的操作系统;它是由Intel和Systemsoft公司于1999年9月20日公布的技术,运行在Client/Server的工作模式;PXE客户端会调用网际协议(IP)、用户数据报协议(UDP)、动态主机设定协议(DHCP)、小型文件传输协议(TFTP)等网络协议;PXE客户端(client)这个术语是指机器在PXE启动过程中的角色。一个PXE客户端可以是一台服务器、笔记本电脑或者其他装有PXE启动代码的机器(我们电脑的网卡)。
4. PXE工作流程及相关介绍
PXE client是需要安装Linux的计算机;
TFTP Server、DHCP Server及HTTPD Server都是部署在PXE Server端的服务;Bootstrap文件、配置文件以及Linux根文件系统都需要放置在Linux Server的TFTP服务器根目录下;
ks.cfg 及系统内核文件都需要放置在在Httpd server目录。
4.1 PXE必要条件
4.1.1 pxe client必须支持pxe用户端功能,并且开机时选择网络启动,这样系统才能以网络的方式进入pxe启动程序;
4.1.2 pxe服务器必须至少提供DHCP及TFTP的服务才行,且其中DHCP服务器必须能够除为pxe client分配ip地址外,还需告知tftp所在的位置(即pxelinux.0的文件位置);
4.1.3 TFTP服务器则为pxe client 提供bootloader 及 kernel 等重要文件下载服务;
4.1.4 使用NFS/HTTP/FTP之一的服务器提供pxe client所需程序及软件来源等通讯协议;
4.2 PXE工作流程
1. PXE Client向DHCP发送请求 PXE Client从自己的PXE网卡启动,通过PXE BootROM(自启动芯片)会以UDP(简单用户数据报协议)发送一个广播请求,向本网络中的DHCP服务器索取IP。
2. DHCP服务器提供信息 DHCP服务器收到客户端的请求,验证是否来至合法的PXE Client的请求,验证通过它将给客户端一个“提供”响应,这个“提供”响应中包含了为客户端分配的IP地址、pxelinux启动程序(TFTP)位置,以及配置文件所在位置。
3. PXE客户端请求下载启动文件 客户端收到服务器的“回应”后,会回应一个帧,以请求传送启动所需文件。这些启动文件包括:pxelinux.0、pxelinux.cfg/default、vmlinuz、initrd.img等文件。
4. Boot Server响应客户端请求并传送文件 当服务器收到客户端的请求后,他们之间之后将有更多的信息在客户端与服务器之间作应答, 用以决定启动参数。BootROM由TFTP通讯协议从Boot Server下载启动安装程序所必须的文件(pxelinux.0、pxelinux.cfg/default)。default文件下载完成后,会根据该文件中定义的引导顺序,启动Linux安装程序的引导内核。
5. 请求下载自动应答文件 客户端通过pxelinux.cfg/default文件成功的引导Linux安装内核后,安装程序首先必须确定你通过什么安装介质来安装linux,如果是通过网络安装(NFS, FTP, HTTP),则会在这个时候初始化网络,并定位安装源位置。接着会读取default文件中指定的自动应答文件ks.cfg所在位置,根据该位置请求下载该文件。
6. 客户端安装操作系统 将ks.cfg文件下载回来后,通过该文件找到OS Server,并按照该文件的配置请求下载安装过程需要的软件包。 OS Server和客户端建立连接后,将开始传输软件包,客户端将开始安装操作系统。安装完成后,将提示重新引导计算机。
4.3 PXE服务中重要目录介绍
TFTP根目录:
/var/lib/tftpboot/
该目录用于存放客户端的配置文件,比如菜单选项、安装源等等配置:
/var/lib/tftpboot/pxelinux.cfg
pxelinux.0:引导文件
pxelinux.cfg/default:开机时的选项菜单,pxelinux.cfg是启动菜单目录
vesamenu.c32:是光盘启动后的安装图形界面,也属于SYSLINUX项目,
menu.c32版本是纯文本的菜单
Memtest:内存检测,这是一个独立的程序
splash.jgp:光盘启动界面的背景图
vmlinuz:是内核映像
initrd.img:是ramfs (先cpio,再gzip压缩)
ks.cfg :是Kickstart自动应答配置文件,默认是没有的
5. PXE环境部署
5.1 安装DHCP
安装dhcp server:
yum install dhcp
查看dhcpd配置文件安装路径:
rpm –ql dhcp
修改dhcp配置文件,用于PXE只要改这几个:
vim /etc/dhcp/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 { #定义子网
range 192.168.1.100 192.168.1.200; #可分配的起始IP-结束IP
option subnet-mask 255.255.255.0; #分配给客户端的子网掩码
default-lease-time 21600; #设置默认的IP租用期限
max-lease-time 43200; #最大租期
next-server 192.168.4.150; #添加tftp服务器地址
filename="pxelinux.0"; #告知客户端从TFTP根目录下载pxelinux.0这个启动引导文件
}
启动DHCP服务:
systemctl start dhcpd.service #启动DHCP服务
systemctl status dhcpd.service #查看DHCP服务状态
systemctl enable dhcpd.service #设置开机自动启动DHCP服务
netstat -lntup |grep dhcpd #查看DHCP服务端口的侦听状态
udp 0 0 0.0.0.0:67 0.0.0.0:*
tailf /var/log/messages #查看DHCP日志状态
注意:
- 本来软件安装完成后都要加入开机自启,但这个Kickstart系统不能开机自启,而且用完后服务都要关闭,防止未来重启服务器后自动重装系统。
- 如果机器数量过多的话,注意dhcp服务器的地址池,不要因为耗尽IP而导致dhcp服务器没有IP地址分配的情况。
DHCP指定监听网卡:
如果是多网卡模式,默认是监听eth0网卡,需手动指定监听网卡。
# vim /etc/sysconfig/dhcpd 在这个文件中,不是/etc/dhcp/dhcpd.conf
# Command line options here
DHCPDARGS=eth1 # 指定监听网卡
5.2 安装TFTP
TFTP服务端口 69。
安装tftp服务器:
yum install tftp-server –y
把disable参数改成no,启用tftp服务:
vim /etc/xinetd.d/tftp
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot //指定目录,保持默认
disable = no //将yes改为no
per_source = 11
cps = 100 2
flags = IPv4
}
systemctl start tftp.socket
systemctl status tftp.socket
systemctl enable tftp.socket
Or
[root@elk-1 ~]# systemctl start xinetd.service
[root@elk-1 ~]# netstat -lntup|grep 69
udp 0 0 0.0.0.0:69 0.0.0.0:*
5.3 使用 syslinux 提供的bootstart
syslinux是一个功能强大的引导加载程序,而且兼容各种介质。
syslinux是一个小型的linux操作系统,它的目的是简化首次安装linux的时间,并建立维护或其它特殊用途的启动盘。
[root@PXE ~]# yum install syslinux
[root@PXE ~]# rpm -ql syslinux /usr/share/syslinux # pxelinux.0 文件存储目录
[root@PXE ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ # 复制启动菜单程序文件pxelinux.0到/var/lib/tftpboot 目录
[root@PXE boot]# mount /dev/cdrom /media/ # 挂载光盘 mount: block device /dev/sr0 is write-protected, mounting read-only
5.4 配置pxelinux.cfg 文件
创建pxelinux.cfg 文件夹
[root@PXE ~]# mkdir /var/lib/tftpboot/pxelinux.cfg
把isolinux.cfg引导文件拷贝到tftpd存储目录下的pxelinux.cfg文件中,并命名为default:
[root@PXE ~]# cp isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
修改linux内核引导文件:
[root@PXE ~]# vi /var/lib/tftpboot/pxelinux.cfg/default
default vesamenu.c32 # 默认启动界面,该文件需要拷贝到tftp存储目录中。
#prompt 1
timeout 600 # 倒计时 600就是60 秒,改数字为秒数的10倍
display boot.msg # 将额外信息写入到boot.msg文件中,该文件需要拷贝到tftp存储目录中。
menu background splash.jpg # 菜单背景图,该文件需要拷贝到tftp存储目录中。
menu title Welcome to CentOS 7! # 菜单主标题
label linux
menu label ^Install or upgrade an PXE system #菜单項目
menu default # 预设项目
kernel vmlinuz # 内核 vmlinuz,该文件需要拷贝到tftp存储目录中。
append initrd=initrd.img ks=http://服务器ip地址/ks.cfg
# 核心参数,指定initrd 核心文件,该文件需要拷贝到tftp存储目录中。另指定ks文件目录,这儿使用的http协议
把内核及根文件拷贝到tftpd存储目录 :参照上菜单配置信息,包括 vesamenu.c32,boot.msg,splash.jpg,vmlinuz,initrd.img 文件做拷贝:
[root@PXE ~]# cp /media/images/pxeboot/{initrd.img,vmlinuz} /var/lib/tftpboot/
[root@PXE ~]# cp /media/isolinux/{boot.msg,vesamenu.c32,splash.jpg} /var/lib/tftpboot/
最简单方式,直接复制整个CentOS引导程序到tftp目录:
[root@elk-1 ~]# cp -a /var/www/html/CentOS7/isolinux/* /var/lib/tftpboot/
这里有一个很大的坑:
若不给tftpboot目录下所有文件执行权限的话,后面启动界面安装系统的时候会报错:PXE-T00 permission denied.
chmod -R 777 /var/lib/tftpboot/
创建一个pxelinux.cfg的目录,存放客户端的配置文件:
[root@elk-1 ~]# mkdir -p /var/lib/tftpboot/pxelinux.cfg
[root@elk-1 ~]# cp /var/www/html/CentOS-7.6/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
5.5 配置HTTP服务
安装HTTP服务:
yum install httpd –y
[root@elk-1 ~]# sed -i "95i ServerName 127.0.0.1:80" /etc/httpd/conf/httpd.conf #在95行插入ServerName 127.0.0.1:80,否则启动报错。
systemctl start httpd.service
systemctl status httpd.service
systemctl enable httpd.service
rpm -ql httpd
netstat -nltup |grep 80
httpd配置文件:
/etc/httpd/conf/httpd.conf # httpd 配置文件
/var/www/html # httpd 默认存储目录
内核文件、虚拟根文件以及菜单文件,我们都是通过tftp服务来提供的,由于系统及版本的不同,对于一个比较复制机群来说,我们需要准备不同系统,不同版本的内核文件,initrd.img文件。菜单文件只需要一份即可。
光盘挂载:
mkdir -p /var/www/html/CentOS7 #创建CentOS7目录用于存放光盘中的文件
mount /dev/cdrom /var/www/html/CentOS7 #这里采用挂载光盘的方式等等
如果是镜像文件已上传到linux中,可以这样挂:
#mount -o loop /opt/CentOS-7-x86_64-Minimal-1511.iso /var/www/html/centos7
# ls /var/www/html/centos7
-rw-rw-r-- 3 root root 14 9月 5 2017 CentOS_BuildTag
drwxr-xr-x 3 root root 2048 9月 5 2017 EFI
-rw-rw-r-- 3 root root 227 8月 30 2017 EULA
-rw-rw-r-- 3 root root 18009 12月 10 2015 GPL
drwxr-xr-x 3 root root 2048 9月 5 2017 images
drwxr-xr-x 2 root root 2048 9月 5 2017 isolinux
drwxr-xr-x 2 root root 2048 9月 5 2017 LiveOS
drwxrwxr-x 2 root root 641024 9月 5 2017 Packages
drwxr-xr-x 2 root root 4096 9月 5 2017 repodata
-rw-rw-r-- 3 root root 1690 12月 10 2015 RPM-GPG-KEY-CentOS-7
-rw-rw-r-- 3 root root 1690 12月 10 2015 RPM-GPG-KEY-CentOS-Testing-7
-r--r--r-- 1 root root 2883 9月 6 2017 TRANS.TBL
不管怎么弄,只要把安装光盘内容能通过web发布即可。如果复制镜像就有点浪费时间,但生产环境就一定要复制了,光盘读取速度优先。
挂载或者拷贝完成之后打开浏览器查看网页是否正常显示:
http://web服务器的地址/CentOS7/
curl http://web服务器的地址/CentOS7/ #命令行检查
5.6 配置无人值守文件ks.cfg
每安装好一台CentOS机器,系统都会生成并记录真实的安装配置,生成的文件名为 anaconda-ks.cfg,位于/root/下。
拷贝模板到/var/www/html 目录,并重命名为ks.cfg:
[root@PXE ~]# cp /root/anaconda-ks.cfg /var/www/html/ks.cfg
[root@PXE ~]# chmod o+r /var/www/html/ks.cfg #分配权限为pxe client引导安装使用
ks.cfg文件组成
- 命令段 键盘类型、语言、安装方式等系统配置,有必须项和可选项;若缺少必选项,安装时会中断并提示手动选择。
- 软件包段
%packages:软件包开头的标识位
@groupname:指定安装的包组
package_name:指定安装的包
-package_name:指定不安装的包
- 脚本段(可选段)
%pre:安装系统前执行的命令或脚本(由于只依赖于启动镜像,支持的命令很少)
%post:安装系统后执行的命令或脚本(基本支持所有命令)
参数说明:
关键字 含义
install 告知安装程序,这是一次全新安装,而不是升级upgrade。
url --url=" " 通过FTP或HTTP从远程服务器上的安装树中安装。
url --url="http://10.0.0.7/CentOS-6.7/"
url --url ftp://<username>:<password>@<server>/<dir>
nfs 从指定的NFS服务器安装。
nfs --server=nfsserver.example.com --dir=/tmp/install-tree
text 使用文本模式安装。
lang 设置在安装过程中使用的语言以及系统的缺省语言。lang en_US.UTF-8
keyboard 设置系统键盘类型。keyboard us
zerombr 清除mbr引导信息。
bootloader 系统引导相关配置。
bootloader --location=mbr --driveorder=sda --append=“crashkernel=auto rhgb quiet”
–location=,指定引导记录被写入的位置.有效的值如下:mbr(缺省),partition(在包含内核的分区的第一个扇区安装引导装载程序)或none(不安装引导装载程序)。
–driveorder,指定在BIOS引导顺序中居首的驱动器。
–append=,指定内核参数.要指定多个参数,使用空格分隔它们。
network 为通过网络的kickstart安装以及所安装的系统配置联网信息。
network --bootproto=dhcp --device=eth0 --onboot=yes --noipv6 --hostname=CentOS6
–bootproto=[dhcp/bootp/static]中的一种,缺省值是dhcp。bootp和dhcp被认为是相同的。
static方法要求在kickstart文件里输入所有的网络信息。
network --bootproto=static --ip=10.0.0.100 --netmask=255.255.255.0 --gateway=10.0.0.2 --nameserver=10.0.0.2
请注意所有配置信息都必须在一行上指定,不能使用反斜线来换行。
–ip=,要安装的机器的IP地址.
–gateway=,IP地址格式的默认网关.
–netmask=,安装的系统的子网掩码.
–hostname=,安装的系统的主机名.
–onboot=,是否在引导时启用该设备.
–noipv6=,禁用此设备的IPv6.
–nameserver=,配置dns解析.
timezone 设置系统时区。timezone --utc Asia/Shanghai
authconfig 系统认证信息。authconfig --enableshadow --passalgo=sha512
设置密码加密方式为sha512 启用shadow文件。
rootpw root密码
clearpart 清空分区。clearpart --all --initlabel
--all 从系统中清除所有分区,--initlable 初始化磁盘标签
part 磁盘分区。
part /boot --fstype=ext4 --asprimary --size=200
part swap --size=1024
part / --fstype=ext4 --grow --asprimary --size=200
–fstype=,为分区设置文件系统类型.有效的类型为ext2,ext3,swap和vfat。
–asprimary,强迫把分区分配为主分区,否则提示分区失败。
–size=,以MB为单位的分区最小值.在此处指定一个整数值,如500.不要在数字后面加MB。
–grow,告诉分区使用所有可用空间(若有),或使用设置的最大值。
firstboot 负责协助配置redhat一些重要的信息。
firstboot --disable
selinux 关闭selinux。selinux --disabled
firewall 关闭防火墙。firewall --disabled
logging 设置日志级别。logging --level=info
reboot 设定安装完成后重启,此选项必须存在,不然kickstart显示一条消息,并等待用户按任意键后才重新引导,也可以选择halt关机。
ks配置文件1:
[root@PXE ~]# vi /var/www/html/ks.cfg
# Kickstart file automatically generated by anaconda.
#version=DEVEL
install # 命令段 ,安装
url --url=http://192.168.4.150/centos/os/ # 指定网络url安装目录
lang en_US.UTF-8 # 默认字体
keyboard us # 键盘类型
network --onboot yes --device eth0 --bootproto dhcp --noipv6
# 指定开机自启,网络接口eth0 ,dhcp获取网络地址,ipv6 禁用
rootpw --iscrypted $6$ZOGP2tA0PI/6SI/X$MlC5bJyXfP9TBN5/0vwoc6dqAqIijOQthEbAZUnIXft85Tj9n4sKWB2PfxrsVfkZ2ibqX63apu8ElmdEvBo9o/
# root 加密密码,使用grub-crypt 生成的字符串替代
reboot # 配置完毕后,重启内核
firewall --disabled # 防火墙禁用
authconfig --enableshadow --passalgo=sha512 # 登录身份使用 sha1 的 512bits 加密算法
selinux --disabled # selinux 功能禁用
timezone Asia/Shanghai # 定义上海时区
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
# 定义bootloader,grub安装mbr ,安装在sda磁盘
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
clearpart --all # 清除磁盘分区表
text # 纯文本格式安装显示
zerombr # 对磁盘进行初始化
part /boot --fstype=ext4 --asprimary --size=2000 # 分区信息 ,定义boot分区 ,格式为ext4 ,大小为2G
part swap --size=4096 # 分区信息 ,定义swap分区 ,大小为4G
part pv.008003 --size=80000 # 分区信息 ,定义lv分区 pv.008003,大小为80G
volgroup vg0 --pesize=8192 pv.008003 # 分区信息 ,在lv分区pv.008003定义vg0卷组 ,pe大小为8M
logvol / --fstype=ext4 --name=root --vgname=vg0 --size=15000
logvol /usr --fstype=ext4 --name=/usr --vgname=vg0 --size=30000
logvol /var --fstype=ext4 --name=/var --vgname=vg0 --size=20000
logvol /home --fstype=ext4 --name=/home --vgname=vg0 --size=12000
repo --name="CentOS-6.6" --baseurl=http://192.168.4.150/centos/os/ --cost=100
# 定义yum仓库 ,类别为bashurl ,名称为CentOS-6.6
%packages # 包组段,安装包组及程序包
@core
@server-policy
@workstation-policy
%end
ks配置文件2:
# mkdir /var/www/html/ks_config
[root@elk-1 /var/www/html/ks_config]# cat ks.cfg
# 告知安装程序,这是一次全新安装,而不是升级
install
# 通过http下载安装镜像
url --url="http://100.100.100.2/Centos7"
# 以文本格式安装
text
# Run the Setup Agent on first boot
firstboot --disable
ignoredisk --only-use=sda
# 键盘和语言
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8
# 网络配置
# Network information
network --bootproto=dhcp --device=ens33 --ipv6=auto --activate
network --hostname=localhost.localdomain
# 设置用户密码123456
# Root password
auth --enableshadow --passalgo=sha512
rootpw --iscrypted $6$0Hu4r5pwNdX1zdsJ$Y58jOsbs0kSlplbtVf3lacoA7Etbf8tHH6BwxR78VT74Ut6D1Q/g.rS5GSwYZD5rAZpA4NmNlTBSZkyNZP3JZ0
# 启动服务
# System services
services --enabled="chronyd"
selinux --disabled
firewall --disabled
# 时区
# System timezone
timezone Asia/Shanghai --isUtc --nontp
#添加内核参数 指定mbr引导 选择sda启动
# System bootloader configuration
bootloader --append="crashkernel=auto rhgb quiet" --location=mbr --boot-drive=sda
# Clear the Master Boot Record清除mbr引导信息。
zerombr
##清空分区
clearpart --all --initlabel
##分区
part /boot --fstype=ext4 --asprimary --size=500
part swap --size=65536
part / --fstype=ext4 --size=1 --grow --asprimary
# 安装完成重启
reboot
# 最小化安装和指定的安装软件
%packages
@base
@compat-libraries
@development
net-tools
sysstat
lrzsz
telnet
wget
vim
%end
# KDUMP禁止
%addon com_redhat_kdump --disable --reserve-mb='auto'
%end
# 安装完成后执行的命名,这里设置阿里云的yum源镜像
%post
/usr/bin/yum-config-manager --add-repo=http://mirrors.aliyun.com/repo/Centos-7.repo
%end
给配置文件执行权限:
# chmod 777 /var/www/html/ks_config/
安装ksvalidator 软件:
[root@PXE ~]# yum -y install pykickstart
[root@PXE ~]# ksvalidator /var/www/html/ks.cfg # ksvalidator验证ks.cfg语法是否正确,如为空则表示没有语法错误。
5.7 整合编辑default配置文件
[root@elk-1 /var/lib/tftpboot/pxelinux.cfg]# cat default
default ks
prompt 0
label ks
kernel vmlinuz
append initrd=initrd.img ks=http://10.0.0.114/ks_config/ks.cfg
至此,PXE服务器环境部署完成,可以打开客户端安装系统试一试,如出现问题,一般需要查看系统日志,如:/var/log/messages, 通过日志报错信息进行解决 。
案例:
dell服务器开机F12进行PXE装机后如果一直没反应,检查服务端的DHCP和PXE问题
开机后进入PXE安装,但是出现下图问题:
原因:
/var/lib/tftpboot/pxelinux.cfg/default #此文件中指定的 网卡名字和客户端的网卡名字不符,导致卡在这步,正常来说按照上面配置不会遇到这个
开机后提示http://10.0.0.114/var/www/html/ks_config/ks.cfg not found 404
这是因为default文件路径写错了,服务器获取不到ks.cfg文件,无法进行安装操作。
5.8 kickstart图形化制作工具
CentOS提供了图形化的kickstart配置工具。需要安装图形化界面才可以使用。
配置工具命令为:
开图形kickstart制作工具如下:
1. 时区选择上海;填写超级用户密码;选择安装后自启;默认图形界面:
2. 选择HTTP,其中HTTP server 为服务器ip,HTTP Directory 选择镜像的挂载点
3. 选择第一个
4. 均选择第一个,然后点击Add
(1)设置/boot为200M:
(2)设置/swap为500M:
(3)设置剩下的硬盘均为/,这里表示为1:
4. 增添网关,名取为eth0;选择DHCP
5. 选择默认的即可。
6. 选择关闭防火墙
7. 这两步操作,选择默认
8. 点击file,保存
(二)配置脚本
1、一定要复制,cp 到 /var/www/html
2、kickstart资源共享
安装httpd:
开启httpd,设置开机自启;关闭防火墙,设置开机不自启。
增加安装软件:
三、gcc和Linux内核升级
1、Linux内核升级
查看系统版本号:
lsb_release -a
cat /etc/issue
查看内核版本升级内核:
rpm -qa | grep kernel
rpm -qa | grep -i centos-release
下载 centos 7.6 rpm 包:
wget http://vault.centos.org/7.6.1810/os/x86_64/Packages/centos-release-7-6.1810.2.el7.centos.x86_64.rpm
卸载kernel 3.10.0-1062 和相关包:
yum remove kernel-3.10.0-1062.1.2.el7.x86_64 kernel-devel-3.10.0-1062.1.2.el7.x86_64
安装下载的7.6 rpm 包:
rpm -ivh centos-release-7-6.1810.2.el7.centos.x86_64.rpm --force
这时重新运行 rpm -qa | grep -i centos-release 就可以看到两个发行版本:
卸载掉7.7版本:
rpm -ev centos-release-7-7.1908.0.el7.centos.x86_64
这时再看内核版本和发行版版本:
uname -a
cat /etc/redhat-release
最近这两天在更新CentOS7系统时,出现了Multilib version problems错误,出现了的错误信息:
# yum update
...
Protected multilib versions: glibc-2.17-196.el7.i686 != glibc-2.17-157.el7_3.1.x86_64
Error: Protected multilib versions: pcre-8.32-17.el7.i686 != pcre-8.32-15.el7_2.1.x86_64
Error: Protected multilib versions: elfutils-libs-0.168-8.el7.i686 != elfutils-libs-0.166-2.el7.x86_64
解决过程如下:
查询重复的软件包:
# rpm -q systemd-libs
systemd-libs-219-30.el7.x86_64
systemd-libs-219-42.el7_4.1.x86_64
删除旧版:
# rpm -e systemd-libs-219-30.el7.x86_64
error: Failed dependencies:
systemd-libs = 219-30.el7 is needed by (installed) libgudev1-219-30.el7.x86_64
仍然出现依赖问题,继续查询libgudev1的版本信息:
rpm -q libgudev1
libgudev1-219-30.el7.x86_64
发现只有一个版本,升级试一下
yum update libgudev1
......
Updated:
libgudev1.x86_64 0:219-42.el7_4.1
Complete!
rpm -q libgudev1
libgudev1-219-42.el7_4.1.x86_64
升级完成后,删除旧版本的systemd-libs:
# rpm -e systemd-libs-219-30.el7.x86_64
# rpm -q systemd-libs
systemd-libs-219-42.el7_4.1.x86_64
最后查询发现只剩下最新版本的systemd-libs,其他重复版本包的解决,也是同样的过程。
核心的命令主要是:
rpm -q package-names
rpm -e package-full-version
2、gcc升级
查看当前的gcc版本:
[root@aarch64vm-centos74-011 ~]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-redhat-linux/4.8.5/lto-wrapper
Target: aarch64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-aarch64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-aarch64-redhat-linux/cloog-install --enable-gnu-indirect-function --build=aarch64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
gcc官网:
删除gcc:
sudo yum remove --skip-broken gcc
安装gcc:
sudo yum install --skip-broken gcc
源码编译升级,下载gcc 7.4.0的源码:
https://mirrors.ustc.edu.cn/gnu/gcc/gcc-7.4.0/gcc-7.4.0.tar.gz
将源码上传至服务器然后解压:
[root@aarch64vm-centos74-010 ~]# mkdir -p /usr/local/gcc
[root@aarch64vm-centos74-010 ~]# ls /usr/local/
bin boost cmake doc etc games gcc include lib lib64 libexec man maven mysql sbin share src tomcat
[root@aarch64vm-centos74-010 ~]# ls
anaconda-ks.cfg boost_1_59_0.tar.gz jdk1.8.0_161 mysql-5.7.19.tar.gz spark-1.6.1-bin-without-hadoop.tgz
apache-maven-3.3.9-bin.tar.gz cmake-2.8.5.tar.gz jdk-8u161-linux-arm64-vfp-hflt.tar.gz scala-2.11.7.tgz spark-2.1.0-bin-hadoop2.7.tgz
apache-tomcat-8.0.53.tar.gz gcc-7.4.0.tar.gz mysql-5.7.19 scala-2.12.6.tgz
[root@aarch64vm-centos74-010 ~]# tar -xvf gcc-7.3.0.tar.gz -C /usr/local/gcc/
解压完成后,编译安装gcc源码。
(1)进入gcc 7.3.0目录,运行 download_prerequisites 脚本:
[root@aarch64vm-centos74-010 ~]# cd /usr/local/gcc/
[root@aarch64vm-centos74-010 gcc]# ls
gcc-7.3.0
[root@aarch64vm-centos74-010 gcc]# cd gcc-7.4.0/
[root@aarch64vm-centos74-010 gcc-7.4.0]# ls
ABOUT-NLS config-ml.in COPYING3 gnattools libada libffi libitm libstdc++-v3 lto-plugin Makefile.in NEWS
ChangeLog config.rpath COPYING3.LIB gotools libatomic libgcc libmpx libtool-ldflags ltoptions.m4 Makefile.tpl README
ChangeLog.jit config.sub COPYING.LIB include libbacktrace libgfortran libobjc libtool.m4 ltsugar.m4 MD5SUMS symlink-tree
ChangeLog.tree-ssa configure COPYING.RUNTIME INSTALL libcc1 libgo liboffloadmic libvtv ltversion.m4 missing ylwrap
compile configure.ac depcomp install-sh libcilkrts libgomp libquadmath ltgcc.m4 MAINTAINERS mkdep zlib
config contrib fixincludes intl libcpp libhsail-rt libsanitizer ltmain.sh maintainer-scripts mkinstalldirs
config.guess COPYING gcc LAST_UPDATED libdecnumber libiberty libssp lt~obsolete.m4 Makefile.def move-if-change
[root@aarch64vm-centos74-010 gcc-7.4.0]# ./contrib/download_prerequisites
2018-07-18 16:06:03 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840] -> "./gmp-6.1.0.tar.bz2" [1]
2018-07-18 16:08:29 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284] -> "./mpfr-3.1.4.tar.bz2" [1]
2018-07-18 16:09:25 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925] -> "./mpc-1.0.3.tar.gz" [1]
2018-07-18 16:12:42 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.16.1.tar.bz2 [1626446] -> "./isl-0.16.1.tar.bz2" [1]
gmp-6.1.0.tar.bz2: OK
mpfr-3.1.4.tar.bz2: OK
mpc-1.0.3.tar.gz: OK
isl-0.16.1.tar.bz2: OK
All prerequisites downloaded successfully.
[root@aarch64vm-centos74-010 gcc-7.4.0]#
(2)建立编译输出目录,将所有的中间文件都放到该目录中:
这里建目录的时候,在当前gcc解压目录下建,否则这里所有命令行的路径都要修改。
获取这四个包时,可能有错误,无法识别这个包的状态啥的,没事,删了再来一遍就行了。
[root@aarch64vm-centos74-010 gcc-7.4.0]# mkdir gcc-build-7.3.0
[root@aarch64vm-centos74-010 gcc-7.4.0]# cd gcc-build-7.3.0/
[root@aarch64vm-centos74-010 gcc-build-7.4.0]# cp ../gmp-6.1.0.tar.bz2 ./
[root@aarch64vm-centos74-010 gcc-build-7.4.0]# cp ../mpfr-3.1.4.tar.bz2 ./
[root@aarch64vm-centos74-010 gcc-build-7.4.0]# cp ../mpc-1.0.3.tar.gz ./
[root@aarch64vm-centos74-010 gcc-build-7.4.0]# cp ../isl-0.16.1.tar.bz2 ./
[root@aarch64vm-centos74-010 gcc-build-7.4.0]# ls
gmp-6.1.0.tar.bz2 isl-0.16.1.tar.bz2 mpc-1.0.3.tar.gz mpfr-3.1.4.tar.bz2
[root@aarch64vm-centos74-010 gcc-build-7.4.0]#
(3)配置 :
在当前目录执行,这个目录下gcc-build-7.3.0:
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
参数解释:
--enable-checking=release //增加一些检查,也可以–disable-checking生成的编译器在编译过程中不做检查;
--enable-languages=c,c++ //让gcc支持的编程语言 ;
--disable-multilib //取消多目标库编译(取消32位库编译)。
(4)make编译
当前目录执行:
make -j4
(编译时间较长,耐心等待!!!!!!!)
(5)卸载旧版本的gcc,安装gcc7.3.0
rpm -q gcc
rpm -q gcc-c++
根据执行输出的包名执行:
[root@localhost ~]# rpm -q gcc
gcc-4.8.5-28.el7_5.1.aarch64
[root@localhost ~]# rpm -q gcc-c++
gcc-c++-4.8.5-28.el7_5.1.aarch64
[root@localhost ~]# rpm -e gcc-c++-4.8.5-28.el7_5.1.aarch64
[root@localhost ~]# rpm -e gcc-4.8.5-28.el7_5.1.aarch64
进入make的gcc目录进行安装:
make install -j8
(6)验证
[root@localhost ~]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/aarch64-unknown-linux-gnu/7.4.0/lto-wrapper
Target: aarch64-unknown-linux-gnu
Configured with: ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
Thread model: posix
gcc version 7.4.0 (GCC)
[root@localhost ~]# g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/aarch64-unknown-linux-gnu/7.4.0/lto-wrapper
Target: aarch64-unknown-linux-gnu
Configured with: ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
Thread model: posix
gcc version 7.4.0 (GCC)
[root@localhost ~]# which gcc
/usr/local/bin/gcc
[root@localhost ~]#
安装成功!!!
Linux下使用gcc编译和运行C程序的简单操作
1. 编辑C程序文件,名字为main.c
#include <stdio.h>
int main(void) {
printf("Hello World.\n");
return 0;
}
2. 编译与运行
(1)简单直接的方式
如下命令会在当前目录下生成a.out文件,使用./a.out运行
gcc main.c
./main
(2)分步骤
//源文件编译为可执行文件,生成main.o
gcc -c main.c
//main.o编译为可执行文件main
gcc -o main main.o
//使用./main命令运行
./main
(3)一步执行(可设置生成文件的名称)
//hello是输出的文件名
gcc main.c -o hello
//运行
./hello
四、Linux环境变量配置
环境变量文件
首先是设置全局环境变量,对所有用户都会生效:
/etc/profile: 此文件为系统的每个用户设置环境信息。当用户登录时,该文件被执行一次,并从 /etc/profile.d 目录的配置文件中搜集shell 的设置。一般用于设置所有用户使用的全局变量。
/etc/bashrc: 当 bash shell 被打开时,该文件被读取。也就是说,每次新打开一个终端 shell,该文件就会被读取。
用户级别的环境变量,用户可以覆盖全局变量,只对单个用户生效:
~/.bash_profile或 ~/.profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。
用户可使用该文件添加自己使用的 shell 变量信息。另外在不同的LINUX操作系统下,这个文件可能是不同的,可能是 ~/.bash_profile, ~/.bash_login 或 ~/.profile 其中的一种或几种,如果存在几种的话,那么执行的顺序便是:~/.bash_profile、 ~/.bash_login、 ~/.profile。比如 Ubuntu 系统一般是 ~/.profile 文件。
~/.bashrc: 只对单个用户生效,当登录以及每次打开新的 shell 时,该文件被读取。
~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件。
/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系。
~/.bash_profile 是交互式、login 方式进入 bash 运行的。
~/.bashrc 是交互式 non-login 方式进入 bash 运行的。
通常二者设置大致相同,所以通常前者会调用后者。
此外,修改 /etc/environment 这个文件也能实现环境变量的设置。/etc/environment 设置的也是全局变量,从文件本身的作用上来说, /etc/environment 设置的是整个系统的环境,而/etc/profile是设置所有用户的环境。有几点需注意:
- 系统先读取 etc/profile 再读取 /etc/environment(还是反过来?)
- /etc/environment 中不能包含命令,即直接通过
VAR="..."
的方式设置,不使用 export 。 - 使用
source /etc/environment
可以使变量设置在当前窗口立即生效,需注销/重启之后,才能对每个新终端窗口都生效。
Linux的变量种类
按变量的生存周期来划分,Linux变量可分为两类:
1、永久的:需要修改配置文件,变量永久生效。
2、临时的:使用export命令声明即可,变量在关闭shell时失效。
修改 Linux 环境变量实例
设置变量的三种方法
1、在/etc/profile文件中添加变量【对所有用户生效且永久的】
用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。
例如:编辑/etc/profile文件,添加CLASSPATH变量
# vi /etc/profile
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。
2、在用户目录下的.bash_profile文件中增加变量【对单一用户生效且永久的】
用VI在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。
例如:编辑guok用户目录(/home/guok)下的.bash_profile
$ vi /home/guok/.bash.profile
添加如下内容:
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile不然只能在下次重进此用户时生效。
查看:
source ~/.profile
echo $PATH
3、直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】
export PATH=$PATH:/usr/local/hadoop/bin
在shell的命令行下直接使用[export 变量名=变量值]
定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。
PATH声明,其格式为:
PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>
你可以自己加上指定的路径,中间用冒号隔开。环境变量更改后,在用户下次登陆时生效。
如果想立刻生效,则可执行下面的语句:$source .bash_profile
需要注意的是,最好不要把当前路径”./”放到PATH里,这样可能会受到意想不到的攻击。
完成后,可以通过$ echo $PATH查看当前的搜索路径。这样定制后,就可以避免频繁的启动位于shell搜索的路径之外的程序了。