Fedora Server定制化封装ISO(1)-封装ISO

需求

以往的软件部署模式,经常是先在裸机上安装操作系统,然后再在操作系统上安装软件,常常会遇到操作系统版本不同,软件包兼容性问题,安装效率也十分低下,不能进行大规模批量部署。

为解决这个痛点,研发经常会将软件连同操作系统一起打包成ISO文件,进行统一部署,在我们的云平台中,各节点就是以这种方式进行安装的。即可在开发阶段解决软件依赖问题,亦可以通过定制化的KS文件,提供无人值守的自动化安装部署。大大增加软件的稳定性和便捷性。

定制化ISO往往会遇到以下几个问题,也是本系列要核心解决的问题:

  1. 如何将原版的ISO重新封装成我们定制化的ISO
  2. 自动化的安装KS文件如何撰写,以满足要求
  3. 如何进行rpm封装,将自己的软件做成RPM包
  4. 预装软件如何正确在系统部署时进行自动化安装

如何将原版的ISO重新封装

在第一步的时候,先尝试如何将原版的Fedora重新封装成新的ISO,并可以正常使用,这一步完全不对原始ISO的包进行修改,只做必要的操作。

先安装一下依赖的包:

yum install createrepo genisoimage

在重新构建的过程中,有以下几个步骤:

  1. 复制原版ISO文件至本地文件夹
    先上传我们的ISO至服务器上,我们这里以Fedora31的server版ISO作为示例。
    [root@localhost ~]# ls
    anaconda-ks.cfg  Fedora-Server-dvd-x86_64-31-1.9.iso
    		
    然后使用mount命令将ISO挂到一个临时目录下
    [root@localhost ~]# mount Fedora-Server-dvd-x86_64-31-1.9.iso /mnt
    mount: /mnt: 警告:设备写保护,使用只读方式挂载.
    		
    创建一个目录,用来保存ISO内部数据,这里创建在/opt/fedora-custom下
    [root@localhost ~]# cp -r /mnt /opt/fedora-custom
    [root@localhost ~]# ls -a /opt/fedora-custom/
    .  ..  .discinfo  EFI  images  isolinux  media.repo  Packages  repodata  TRANS.TBL  .treeinfo
    这里要注意两个.开头的文件.discinfo和.treeinfo,如果是使用cp /mnt/* /opt/fedora-custom/这种命令,要检查这两个文件是不是也copy过去了,默认是不copy隐藏文件的
  2. 重新构建repo的xml文件
    进入到fedora-custom的repodata目录:/opt/fedora-custom/repodata,目录里大概是这个样子:
    我们看到里边有两个以xml结尾的文件,主要关注一下最长的那个.xml文件,5e02ba6ebe8b75337e5f789f83eb3bb6ca9b4623ab7be9db939f36ec1b4e4b99-comps-Server.x86_64.xml
    现在要基于这个文件进行重新构建repo,首先将其改名为comps-Server.x86_64.xml
    # mv *-comps-Server.x86_64.xml comps-Server.x86_64.xml
    然后删除其他所有文件:
    # ls .|grep -v "comps-Server.x86_64.xml"|xargs -i rm -f {}
    会到上级菜单(ISO根目录),再重新构建repo:
    # cd /opt/fedora-custom
    # createrepo -g repodata/comps-Server.x86_64.xml ./
    注:这里有个报错,我发现它并不影响结果,选择了忽视。。。
    这样repo就重新构建完成了
  3. 修改discinfo信息
    # declare -x discinfo=`head -1 .discinfo`
  4. 重新打包ISO
    使用mkisofs进行打包:
    # mkisofs -o /opt/fedora31-custom.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -T -r -l -d -joliet-long -allow-multidot -allow-leading-dots -no-bak /opt/fedora-custom
    具体的mkisofs参数大家可以参考mkisofs manpage
    至此,ISO打包完成,放置目录在/opt/fedora31-custom.iso

    下面是一个根据以上命令写的ISO打包脚本,在完成1的内容后,会在后续不停的进行ISO打包和测试,使用自动化脚本会比较方便:
    #!/bin/bash
    
    ## constants
    
    BUILD_DIR=/opt/fedora-custom
    OUTPUT_FILE=/opt/fedora31-cunstom.iso
    
    ## rebuild repo
    
    cd $BUILD_DIR/repodata
    mv *-comps-Server.x86_64.xml comps-Server.x86_64.xml
    ls .|grep -v "comps-Server.x86_64.xml"|xargs -i rm -f {}
    
    cd $BUILD_DIR
    createrepo -g repodata/comps-Server.x86_64.xml ./
    declare -x discinfo=`head -1 .discinfo`
    
    ## make iso file
    mkisofs -o $OUTPUT_FILE -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -T -r -l -d -joliet-long -allow-multidot -allow-leading-dots -no-bak $BUILD_DIR
    将其保存到文件/opt/build-iso.sh,并赋予可执行权限:
    # chmod +x /opt/build-iso.sh
    未来可以使用下列命令重新构建ISO:
    # /opt/build-iso.sh

下一章会讲一下如何使用kickstart文件进行自动化的安装:Fedora Server定制化封装ISO(2)-定制KickStart

 

About the author

liuyuhang

View all posts

93 Comments

发表评论