Linux操作系统安装与gcc和内核升级

一、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官网:

Index of /gnu/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搜索的路径之外的程序了。

猜你喜欢

转载自blog.csdn.net/qq_35029061/article/details/126209999