admin管理员组

文章数量:1564204

文章总览:制作Centos7自动安装镜像

终于进入到最后的阶段了,这也是这个阶段最为复杂的一步了。

我们来逐步完善吧:

1. 同步系统安装包

建立一个目录,用于制作安装包,我建立的目录是/root/kickstart/iso

首先,将Linux标准的安装光盘放入光驱,或者虚拟光驱,执行如下命令

/usr/bin/rsync -a --exclude=repodata/ /media/ /root/kickstart/iso/

将光盘上数据全部同步到指定目录。其中/media/ 是光盘的挂载路径。  这里说明一下,repodata目录不需要同步,后面我们会手工来编辑。 另外,建议大家选择合适的镜像。我当初用了一个everything的镜像。 这个镜像原本就8个G 做完之后竟然高达10G 😭 给自己找了不少麻烦。

另外,还有一个办法可以在目标镜像中只放入必要的安装包,这样可以做出一个小镜像。但是有时候会缺少依赖。所以建议还是用标准镜像直接全部复制好一些。

2. 复制自己的安装包

将我们自己定义的应用安装包,配置文件安装包,java的安装包,以及mysql的安装包全部复制到/root/kickstart/iso/Packages 下面,我测试的时候,需要额外安装的rpm如下:

DeviceConrtoller-1.0.0-1.x86_64.rpm
DeviceConrtoller-cfg-1.0.0-1.x86_64.rpm
jdk-11.0.9_linux-x64_bin.rpm
mysql-community-common-8.0.22-1.el7.x86_64.rpm
ysql-community-client-plugins-8.0.22-1.el7.x86_64.rpm
mysql-community-client-8.0.22-1.el7.x86_64.rpm
mysql-community-devel-8.0.22-1.el7.x86_64.rpm
mysql-community-libs-8.0.22-1.el7.x86_64.rpm
mysql-community-server-8.0.22-1.el7.x86_64.rpm

将这些rpm包全部复制到packages目录下

3. 编辑自己的组件说明文件

在 /root/kickstart/iso 目录下面建立 repodata目录 然后执行如下命令:

cp /media/repodata/*-x86_64-comps.xml  /root/kickstart/iso/repodata/comps.xml

然后编辑这个comps.xml文件,将我们的自定义的组件加入进去。

这个文件的主要作用,就说用于说明ks.cfg packages段中的每一个组件都对应那些安装包。前面我们声明了一个DeviceController的安装组件,这里就要在这个comps.xml文件里对DeviceController的内容进行定义。

打开comps.xml文件

里面主要是两个数据段<group></group>  以及 <environment></environment>

其中group用于定义每个组件包含那些rpm包, environment用于定义不同组件之间的组合。

针对我们上面的需求,在文件中加入一个group段,内容如下:

<group>
    <id>DeviceController</id>
    <name>Device-Controller</name>
    <name xml:lang="zh_CN">设备管理控制器自定义安装包</name>
    <description>DeviceController's software</description>
    <description xml:lang="zh_CN">设备管理控制器软件需要的所有组件</description>
    <default>false</default>
    <uservisible>false</uservisible>
    <packagelist>
      <packagereq type="mandatory">DeviceController</packagereq>
      <packagereq type="mandatory">DeviceController-cfg</packagereq>
      <packagereq type="mandatory">jdk-11.0.9</packagereq>
      <packagereq type="mandatory">mysql-community-common</packagereq>
      <packagereq type="mandatory">mysql-community-client-plugins</packagereq>
      <packagereq type="mandatory">mysql-community-client</packagereq>
      <packagereq type="mandatory">mysql-community-devel</packagereq>
      <packagereq type="mandatory">mysql-community-libs</packagereq>
      <packagereq type="mandatory">mysql-community-server</packagereq>

   </packagelist>
</group>

其中 id  必须和ks.cfg文件中定义的名字完全一致,否则会找到不到安装组件。

name是起一个名字,英文名  name xml:lang 用于声明国际化的名字,可以针对不同的语言提供文字说明,我们只用了中文,如果想要更多,可以参考文件中原有的group的内容。

description和name类似,随便写个描述

packagelist 用来列出所有需要安装的rpm包,我们上面列出来的需要安装的都会写在这里面。这里要注意,安装包的名字一般不需要写后面的版本号,只需要写主要的名字就行了。

但是这里java是一个坑,必须带上它的版本号。 只写jdk是不行的。至于具体写什么名字,如果不确定的话,可以用 rmp2cpio xxxx.rpm | cpio -idv 看一下解压出来的路径。一般用路径中的名字就可以(但是也有例外,实在不行,只能多试几次了)。

group编辑完之后,我们需要在设定一个environment. 我当时写的内容如下:

<environment>
    <id>DEVICECONTROLLER-ENV</id>
    <name>APC customization</name>
    <name xml:lang="zh_CN">APC定制环境</name>
    <description>APC software.</description>
    <description xml:lang="zh_CN">APC软件环境。</description>
    <display_order>10</display_order>
    <grouplist>
      <groupid>network-tools</groupid>
      <groupid>performance</groupid>
      <groupid>system-management</groupid>
      <groupid>DeviceController</groupid>
    </grouplist>
    <optionlist>
    </optionlist>
  </environment>

同样起一个ID, 然后声明一下这个安装环境都需要装那些包。一般只写自己的group就行,这里我加上了网络工具和系统管理工具。具体可以根据需要。

4. 编译comps.xml

在/root/kickstart/iso 目录下执行如下命令:

createrepo -g repodata/comps.xml ./

执行完成后repodata包中就会多出一堆xml和 zip文件。 这里也需要注意:一旦你对Packages目录中的内容作了变更,就需要重新编译comps.xml。 所以最好留好备份。甚至有时候对其他内容的改动也会需要重新制作comps.xml  否则可能会出现一些小问题,所以建议大家做好备份,最好每次都制作一下。

5.复制ks.cfg

将我们编辑好的ks.cfg文件复制到/root/kickstart/iso/isolinux/ 目录下面。 理论上,iso下面的任何位置都可以,不过我测试的时候是放在isolinux目录下面的

6.设定启动菜单

注意::本系列最大的坑来了。

要让我们ks.cfg生效,需要修改一下启动菜单的配置文件,告知启动菜单,在安装的时候加载哪个配置文件。很多网上的资料都会告诉你需要修改的是 /isolinux/isolinux.cfg文件,但是实际上根据安装和启动方式的不同生效的配置文件是不一样的。

如果你是光盘安装,请修改/isolinux/isolinux.cfg

如果你是用U盘 Lagency方式安装操作系统,则需要修改的是/isolinux/syslinux.cfg

而如果你用的UEFI方式,U盘安装操作系统,需要修改的文件就变成了/EFI/BOOT/grub.cfg

至于怎么修改,方式都是一样的。

根据你需要的安装方式,打开相应的配置文件。或者你干脆通是把三个配置文件都改了

打开配置文件之后,向下翻找到这样一行文字:

label linux
  menu label ^Install CentOS 7 
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS%207%2064 quiet

label check
  menu label Test this ^media & install CentOS 7
  menu default
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS%207%2064 rd.live.check quiet

怎么样?是不是有些眼熟?这个其实就是安装的时候,Linux弹出来的安装菜单。第一项(label linux)就是安装,第二项(label check)就是先对介质做校验,然后在安装。 我只对第一种安装方式做了修改,如果你需要先校验在安装的话,那么请修改第二种安装方式。

将我们的ks.cfg文件加入到安装菜单中,加入后的样子如下:

label linux
  menu label ^Install CentOS 7 FOR DeviceController
  kernel vmlinuz
  append initrd=initrd.img inst.ks=hd:LABEL=CentOS7:/isolinux/ks.cfg inst.stage2=hd:LABEL=CentOS7 quiet

label check
  menu label Test this ^media & install CentOS 7
  menu default
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS7 rd.live.check quiet

关键在于这一句:

inst.ks=hd:LABEL=CentOS7:/isolinux/ks.cfg

用于指定ks文件的位置。

 

在这里,又有两个小坑:

第一,注意LABEL= 后面要跟光盘/U盘的卷标,一个小坑就是,如果你的镜像要拿去windows下刻录(到光盘或者U盘),则卷标必须少于12个字符(windows的要求),否则的话会导致卷标被截断,从而导致第二个问题。

第二,关于ks.cfg的路径,网上可以找到几种写法,一开始我用的是inst.ks=cdrom:/isolinux/ks.cfg, 对于光盘安装,这个自然没有问题。但是如果用的是U盘,就会出现找不到ks.cfg的问题,一种临时的解决方案是,在启动菜单出现的时候,按下tab或者是e 然后对展示出来的加载项进行修改,将cdrom改为U盘的路径。 但是这种方式比较繁琐,也不符合我们自动化安装的理念,所以我们 改用 卷标的方式指定文件位置。这样无论光盘 U盘都可以。但是,就必须注意第一点中提到的问题,如果卷标过长,windows下刻录的时候会被截断,仍然会导致无法找到配置文件。

7. 镜像打包

所有的准备工作都完成了,下一步开始打包制作镜像了。

在/root/kickstart/iso 目录下执行以下命令

genisoimage -joliet-long -V CentOS7 -o CentOS7.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -cache-inodes -T -eltorito-alt-boot -e images/efiboot.img -no-emul-boot /root/kickstart/iso

genisoimage -joliet-long -V CentOS7 -o CentOS7.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -cache-inodes -T -eltorito-alt-boot -e images/efiboot.img -no-emul-boot /iso
 

注意: -V 后面就是卷标,需要和第6步中写的卷标保持一致 -o 后面是镜像文件的名字

 

运行完毕后,就可以在/root/kickstart/iso目录下面找到一个 CentOS7.iso文件了。 

这个文件或者刻盘,或者做U盘安装盘,或煎或炸,是蒸是煮,那就随你所愿了。

 

好了,所有的步骤全部描述完了,按照这个方法就可以做出一个自动安装的镜像。 插入U盘,开机,选择菜单。 后面全部自动:分区,装系统,装应用,初始化用户,初始化脚本全部搞定。 除了最后还需要自己在手工运行一个脚本初始化一下mysql数据库之外,一切自动OK.

说到mysql 顺便提一句,在mysql初始化脚本中创建用户的时候,记得使用以下的语句:

CREATE USER 'controller'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY '1234567890';

少了with 这一个参数,会导致程序一开始连不上mysql 必须手工从命令行登陆一次之后,程序才能连上。

 

OK,一切搞定,祝大家工作顺利。

 

本文标签: 镜像