KylinOS-Server定制制作属于自己的ISO镜像文件

1、准备:

镜像文件:Kylin-Server-10-SP1-Release-Build20-20210518-x86_64.iso

然后安装在服务器上(用来定制ISO的服务器)
根据自己的需求选择安装,我这里选择的是GUI安装

2、安装制作ISO的工具

yum  -y install createrepo mkisofs isomd5sum rsync squashfs-tools

3、建立 image-making-directory

(1)创建 ISO制作目录

mkdir /newiso

(2)挂载官方ISO启动盘

mount -o loop Kylin-Server-10-SP1-Release-Build20-20210518-x86_64.iso /mnt

(3)把官方镜像里的文件同步到image-making-directory

rsync -rav /mnt/. /newiso

可以使用 ll -a查看目录,其中

[root@kylinos-server ~]# ls -al /newiso/

总用量 260

dr-xr-xr-x   9 root root    277  9月  8 15:45 .

dr-xr-xr-x. 20 root root    280  9月  8 12:09 ..

-r--r--r--   1 root root     53  5月 18  2021 .discinfo

dr-xr-xr-x   3 root root     35  5月 18  2021 EFI

dr-xr-xr-x   4 root root     97  9月  8 12:08 images

dr-xr-xr-x   2 root root    270  9月  8 15:53 isolinux

-r--r--r--   1 root root    266  5月 24  2021 .kyinfo

-r--r--r--   1 root root   1150  5月 18  2021 .kylin-post-actions

-r--r--r--   1 root root    135  5月 18  2021 .kylin-post-actions-nochroot

-r--r--r--   1 root root    438  5月 24  2021 LICENSE

dr-xr-xr-x   2 root root    218  5月 18  2021 manual

dr-xr-xr-x   2 root root 180224  9月  8 15:40 Packages

dr-xr-xr-x   3 root root   4096  5月 18  2021 Packages-gcc

-r--r--r--   1 root root     82  5月 18  2021 .productinfo

drwxr-xr-x   2 root root   4096  9月  8 15:45 repodata

-r--r--r--   1 root root   3110  5月 24  2021 TRANS.TBL

-r--r--r--   1 root root    437  5月 18  2021 .treeinfo

isolinux directory: store the installation interface information when the CD is booted;

images directory: necessary boot image files;

Packages directory: install packages and information;

repodata directory: packages dependency information.

4将自定义rpm包同步到image-making-directory

(1)获取当前系统中安装的所有rpm包列表;
rpm -qa > /root/package-list.txt

(2)为使后面我们生成的ISO文件尽可能的小,我们只保留系统安装所需要的RPM包以及其它需要定制的RPM包;

A. 首先,删除ISO制作目录/newiso/Packages/下所有的RPM包;

 cd /newiso/Packages/

rm -rf *.rpm

B. 接着,从ISO挂载目录/mnt/Packages/拷贝系统安装所需的RPM包拷贝到“ISO镜像制作目录”/newiso/Packages/中;

cat /root/package-list.txt | awk ‘{print $0}’ |xargs -i cp /mnt/Packages/{}.rpm /newiso/Packages/

C. 将自定义的软件包拷贝到系统安装所需的RPM包拷贝到“ISO镜像制作目录”/newiso/Packages/中;我是安装向日葵[SunloginClient_11.0.1.44968_amd64]为例。

[root@kylinos-server ~]# ls *rpm

libappindicator-gtk3-12.10.0-25.ky10.x86_64.rpm  libdbusmenu-gtk3-16.04.0-10.ky10.x86_64.rpm   webkitgtk3-2.4.11-2.ky10.ky10.x86_64.rpm

libdbusmenu-16.04.0-10.ky10.x86_64.rpm           libindicator-gtk3-12.10.1-15.ky10.x86_64.rpm  SunloginClient_11.0.1.44968_amd64.rpm

这里有个坑,后续再详述。

[root@kylinos-server ~]# cp ~/*rpm /newiso/Packages

5 编辑自己的组件说明文件

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

[root@kylinos-server ~]# ll /newiso/repodata/

总用量 10144

-rw-r--r-- 1 root root   24987  9月  8 16:24 296dc4bb6d160b9fba3b20fe7a7d31c2663455664a8fc1eac57b9bcfc1b0fe93-Kylin-x86_64-V10-ukui-comps.xml.gz

-rw-r--r-- 1 root root 3154273  9月  8 16:24 3efb77bc4e4a3efe76944123ad5560a55fbcb285501e2bd458439b37c0bd6487-filelists.sqlite.bz2

-rw-r--r-- 1 root root 3138204  9月  8 16:24 4c714f5433b03c5c56da209e252ecffa866feacfde28a6d8ff13b2dfa6344123-filelists.xml.gz

-rw-r--r-- 1 root root  501472  9月  8 16:24 4f6e46e6a4eeb3f4fa702facac06e0f82b8da081bb4cfb38431d3dec4ea348ff-other.sqlite.bz2

-rw-r--r-- 1 root root  348054  9月  8 16:24 59e8b973c034b3317e2956526a10cd4c6aef2611ed03e36ae20d78c9591c4640-other.xml.gz

-rw-r--r-- 1 root root  196249  9月  8 16:24 d373aec87ba0a3fbcfb9fb644330bd1e39e2fd248435d42148ef081fe58834de-Kylin-x86_64-V10-ukui-comps.xml

-rw-r--r-- 1 root root  978981  9月  8 16:24 e91c1bf7bcfbd120458ba6ce1a847941e26a364e03af178582bf28844bad25ec-primary.xml.gz

-rw-r--r-- 1 root root 2018889  9月  8 16:24 f0e510fcd601d55a7c07adb2466bef571da90944b3c20bbc0713afe0c590fa88-primary.sqlite.bz2

-rw-r--r-- 1 root root    3914  9月  8 16:24 repomd.xml

-r--r--r-- 1 root root    2599  5月 24  2021 TRANS.TBL

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

打开comps.xml文件,里面主要是两个数据段<group></group>  以及 <environment></environment>

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

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

<group>

    <id>SunloginClient</id>

    <name>sunloginclient</name>

    <name xml:lang="zh_CN">向日葵安装包</name>

  <description>SunloginClient software</description>

    <description xml:lang="zh_CN">向日葵需要的所有组件</description>

    <default>false</default>

    <uservisible>false</uservisible>

  <packagelist>

      <packagereq type="mandatory">libindicator-gtk3</packagereq>

      <packagereq type="mandatory">libdbusmenu</packagereq>

      <packagereq type="mandatory">libdbusmenu-gtk3</packagereq>

      <packagereq type="mandatory">libappindicator-gtk3</packagereq>

      <packagereq type="mandatory">webkitgtk3</packagereq>

      <packagereq type="mandatory">sunloginclient</packagereq>

   </packagelist>

</group>

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

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

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

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

向日葵sunloginclient这里需要全部小写,要不然软件安装不成功。

<packagereq type="mandatory">sunloginclient</packagereq>

因为在rpm -ivh SunloginClient_11.0.1.44968_amd64.rpm的时候会提示:

Verifying...                          ################################# [100%]

准备中...                          ################################# [100%]

正在升级/安装...

   1:sunloginclient_11.0.1.44968_amd64    ################################# [100%]

sunloginclient: 未找到进程

sunloginclient_linux: 未找到进程

check operate system OK

Created symlink /etc/systemd/system/multi-user.target.wants/runsunloginclient.service → /etc/systemd/system/runsunloginclient.service.

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

<packagereq type="mandatory">jdk-11.0.9</packagereq>

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

<environment>

    <id>sunloginclient-env</id>

    <name>taoxc customization</name>

    <name xml:lang="zh_CN">向日葵需要的所有组件</name>

    <description>SunloginClient software</description>

    <description xml:lang="zh_CN">向日葵需要的所有组件</description>

    <display_order>8</display_order>

    <grouplist>

      <groupid>SunloginClient</groupid>

    </grouplist>

    <optionlist>

    </optionlist>

  </environment>

同样起一个ID, 然后声明一下这个安装环境都需要装那些包。一般只写自己的group就行

6 更新“ISO镜像制作目录”的repodata文件夹下的xxx-comps.xml文件;

[root@kylinos-server ~]# createrepo -g /newiso/repodata/*-comps.xml /newiso/

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

(7)编辑ks.cfg文件

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

#version=DEVEL

ignoredisk --only-use=sda

autopart --type=lvm

# Partition clearing information

clearpart --all --initlabel --drives=sda

# Use graphical install

graphical

# Use CDROM installation media

cdrom

# Keyboard layouts

keyboard --vckeymap=cn --xlayouts='cn'

# System language

lang zh_CN.UTF-8

# Network information

network  --bootproto=dhcp --device=ens33 --ipv6=auto --activate

network  --bootproto=dhcp --device=ens37 --onboot=off --ipv6=auto

network  --hostname=localhost.localdomain

# Root password

rootpw --plaintext PassworD

# X Window System configuration information

xconfig  --startxonboot

# Run the Setup Agent on first boot

firstboot --enable

# System services

services --enabled="chronyd"

# System timezone

timezone Asia/Shanghai --isUtc

%post --nochroot

#####copy kyinfo and LICENSE

if [ -e /tmp/.kyinfo ];then

  echo y | cp -a /tmp/.kyinfo $ANA_INSTALL_PATH/etc/

fi

if [ -e /tmp/LICENSE ];then

  echo y | cp -a /tmp/LICENSE $ANA_INSTALL_PATH/etc/

fi

if [ -e /run/install/repo/.kyinfo ];then

  echo y | cp -a /run/install/repo/.kyinfo $ANA_INSTALL_PATH/etc/

fi

if [ -e /run/install/repo/LICENSE ];then

echo y | cp -a /run/install/repo/LICENSE $ANA_INSTALL_PATH/etc/

fi

##### kylin postaction

## cdrom install, copy .kylin-post-actions

if [ -e /run/install/repo/.kylin-post-actions ];then

  echo y | cp -a /run/install/repo/.kylin-post-actions /tmp/.kylin-post-actions

  echo "repo=/run/install/repo" > /tmp/.kylin-repo

fi

## copy kylin post scripts in new os

if [ -e /tmp/.kylin-post-actions ];then

  echo y | cp -a /tmp/.kylin-post-actions $ANA_INSTALL_PATH/bin

fi

if [ -e /tmp/.kylin-repo ];then

  echo y | cp -a /tmp/.kylin-repo $ANA_INSTALL_PATH/tmp/

fi

## copy and run .kylin-post-actions-nochroot

if [ -e /run/install/repo/.kylin-post-actions-nochroot ];then

  echo y | cp -a /run/install/repo/.kylin-post-actions-nochroot /tmp/.kylin-post-actions-nochroot

fi

if [ -e /tmp/.kylin-post-actions-nochroot ];then

  /bin/bash -x /tmp/.kylin-post-actions-nochroot &> $ANA_INSTALL_PATH/var/log/.kylin-post-actions-nochroot.log

fi

%end

%post

/bin/sed -i '13a Port 6022' /etc/ssh/sshd_config; \\

/bin/sed -i '/PermitRootLogin /d' /etc/ssh/sshd_config; \\

/bin/sed -i '32a PermitRootLogin yes' /etc/ssh/sshd_config; \\

systemctl disable systemd-networkd-wait-online.service

systemctl disable multipathd.service

### do kylin post action

if [ -e /bin/.kylin-post-actions ];then

  /bin/bash -x /bin/.kylin-post-actions &> /var/log/.kylin-post-actions.log

fi

%end

%packages

@^kylin-desktop-environment

kexec-tools

openssh

audit

mate-indicators

@SunloginClient  

%end

%addon com_redhat_kdump --enable --reserve-mb='1024M'

%end

%anaconda

pwpolicy root --minlen=8 --minquality=1 --notstrict --nochanges --notempty

pwpolicy user --minlen=8 --minquality=1 --notstrict --nochanges --emptyok

pwpolicy luks --minlen=8 --minquality=1 --notstrict --nochanges --notempty

%end

reboot

我们在%packages这个列表上,加上我们自定义的安装组件<group><id>的值, 起名字叫做SunloginClient。

(8)设定启动菜单

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

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

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

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

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

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

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

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

label linux

  menu default

  menu label ^Install Kylin Linux Advanced Server V10

  kernel vmlinuz

  append initrd=initrd.img inst.stage2=hd:LABEL=Kylin-Server-10  video=efifb:on quiet

label check

  menu label Test this ^media & install Kylin Linux Advanced Server V10

  kernel vmlinuz

  append initrd=initrd.img inst.stage2=hd:LABEL=Kylin-Server-10 rd.live.check video=efifb:on quiet

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

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

label linux

  menu default

  menu label ^Install Kylin Linux Advanced Server V10

  kernel vmlinuz

  append initrd=initrd.img inst.stage2=hd:LABEL=Kylin-Server-10 inst.ks=hd:LABEL=Kylin-Server-10:/isolinux/ks.cfg video=efifb:on quiet

label check

  menu label Test this ^media & install Kylin Linux Advanced Server V10

  kernel vmlinuz

  append initrd=initrd.img inst.stage2=hd:LABEL=Kylin-Server-10 rd.live.check video=efifb:on quiet

这个“Kylin-Server-10”可以任意命名,记得保持一致就好(后面刻盘时候,USB启动盘的名字要改成这个。不然找不到U盘的话需要先在install centos那里按"E",然后使用linux dd 查看U盘设备名,假如是/dev/sda4,确认设备名后重启,再次按E编辑,把"LABEL=Kylin-Server-10"改为/dev/sda4,两边都要改,然后ctrl+X进入安装界面)

在这里,又有两个小坑:

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

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

4、制作ISO

(1) 运行如下命令

mkisofs -o ~/kylin10.iso -input-charset utf-8 -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -T -joliet-long -V Kylin-Server-10 .

或者

genisoimage -joliet-long -V kylin10 -o kylin10.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 /newiso #这条命令没测试

(2)生成MD5(虽然不做这一步ISO也能用)

implantisomd5 kylin10.iso

5、附:没遇到过,也没试过,网上摘录的

关于安装过程要注意的点:

(1) 我是在制作CentOS7.4-wedge400.iso后,拷贝到U盘里,然后windows下使用UltraISO软碟通刻盘,刻录完成后U盘名字可能是

“NO NAME”,这时要手动改成之前制作时设置的LABEL,如”EVGLOW“

如果还是不行,则采用以下万能方法:

安装时,在"在install centos"那里按"E",然后删掉"linuxefi /image/pxeboot/vmlinuz"哪一行后面的内容(一般是到quiet结束),追加linux dd 命令查看U盘设备名,按Ctrl+X运行,然后可以看到挂载情况。假如是/dev/sda4,确认设备名后重启,再次按E编辑,把"LABEL=EVGLOW"改为/dev/sda4,前后都要改,然后ctrl+X进入安装界面

(2) 服务器本身没有VGA/HDMI显示器接口使用的是外接显卡,如果安装界面一直黑屏,换一张显卡试试。我遇见过安装好OS后,换一种显卡进不去(一直黑屏)的情况,但是使用SSH可以登录机器,说明OS起来了,再换回原来的显卡也是可以开机的。

可能是显卡生成了多个窗口等原因造成的。

命令解释:

rsync是可以实现增量备份的工具。配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。

-r 即 recursive(递归的、循环的)

-l 同步软链接文件(小写的L)

-p 这个选项的全名是 perserve permissions,顾名思义,就是保持权限

-g -o 这两个选项是一对,用来保持文件的属组(group)和属主(owner)。改变属主和属组,往往要有管理员权限才可以。

-D 原文解释是 preserve devices (root only),从字面意思看,是保持设备文件的原始信息

-a 使用-a选项,就相当于使用了-rlptgoD选项, archive option,中文叫做归档选项。使用-a选项,就表明你希望采取递归方式来同步,且尽可能的保持各个方面的一致性

createrepo 命令用于创建yum源(软件仓库),即为存放于本地特定位置的众多rpm包建立索引,描述各包所需依赖信息,并形成元数据。

-g --groupfile 指定本地软件仓库的组划分,范例如下: createrepo -g comps.xml /path/to/rpms 注意:组文件需要和rpm包放置于同一路径下。

-u --baseurl 指定Base URL的地址 -o --outputdir 指定元数据的输出位置

-x --excludes 指定在形成元数据时需要排除的包 -i --pkglist 指定一个文件,该文件内的包信息将被包含在即将生成的元数据中,格式为每个包信息独占一行,不含通配符、正则,以及范围表达式。

-n --includepkg 通过命令行指定要纳入本地库中的包信息,需要提供URL或本地路径。

-q --quiet 安静模式执行操作,不输出任何信息。 -v --verbose 输出详细信息。

-c --cachedir 指定一个目录,用作存放软件仓库中软件包的校验和信息。 当createrepo在未发生明显改变的相同仓库文件上持续多次运行时,指定cachedir会明显提高其性能。

–update 如果元数据已经存在,且软件仓库中只有部分软件发生了改变或增减, 则可用update参数直接对原有元数据进行升级,效率比重新分析rpm包依赖并生成新的元数据要高很多。

-p --pretty 以整洁的格式输出xml文件。

-d --database 该选项指定使用SQLite来存储生成的元数据,默认项。

mkisofs可将指定的目录与文件做成ISO 9660格式的映像文件,以供刻录光盘

-D或-disable-deep-relocation ISO 9660最多只能处理8层的目录,超过8层的部分,RRIP会自动将它们设置成ISO 9660兼容的格式。使用-D参数可关闭此功能。

-o<映像文件>或-output<映像文件> 指定映像文件的名称

-input-charset utf8 -output-charset utf8,解决中文文件名乱码问题

-b<开机映像文件>或-eltorito-boot<开机映像文件> 指定在制作可开机光盘时所需的开机映像文件。

-c<开机文件名称> 制作可开机光盘时,mkisofs会将开机映像文件中的全-eltorito-catalog<开机文件名称>全部内容作成一个文件

-load-size 4:设置加载扇区数

-boot-info-table:修补启动映像与信息表 Patch boot image with info table

-no-emul-boot Boot image is ‘no emulation’ image 无仿真

-R, -rock Generate Rock Ridge directory information

-J或-joliet 使用Joliet格式的目录与文件名称

-v或-verbose 执行时显示详细的信息。

-V<光盘ID>或-volid<光盘ID> 指定光盘的卷册集ID

-T或-translation-table 建立文件名的转换表,适用于不支持Rock Ridge Extensions的系统上

implantisomd5 – implant an MD5 checksum in an ISO9660 image

This manual page documents briefly the implantisomd5 command. implantisomd5 is a program that embeds an MD5 checksum in an unused section of and ISO9660 (.iso) image. This checksum can later be compared to the .iso, or a block device, using the corresponding checkisomd5 command.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太极淘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值