Fedora Server定制化封装ISO(5)-系统初始化方法

之前我们已经将操作系统定制完成,无论是定制的包还是系统的包,都按照我们的ks要求进行了安装,现在遇到的一个问题是想要在操作系统安装完毕后的第一次boot,执行且只执行一次系统初始化脚本。

在网上有各种方法可以实现,但都有相对多的弊端,经过对比甄选,我们选择了使用服务的方式进行系统初始化,简单的逻辑是这样:

  1. 在ISO安装过程中,定制一个服务,这个服务调用的是我们的初始化脚本
  2. 在ks中标注这个服务为系统启动自动运行
  3. 在初始化脚本中的最后,将服务从系统自启动变更为系统启动时默认不运行

经过这样的逻辑,服务就只有在第一次启动的时候运行一次,其他的时间都不会自动运行。

下面举个例子:

首先定义服务,分别为一个os-init.service 的服务和一个os-init.sh的脚本,在通过之前的章节,我们可以自己定制一个rpm包,然后让这个rpm包将os-init.service放置在/etc/systemd/system/目录下,os-init.sh可以放置在自己的目录下,我这里假定放置在/opt/os-init.sh。然后把这个rpm包根据之前的章节进行ISO安装过程的自动化安装。两个文件如下:

# cat /etc/systemd/system/os-init.service 

[Unit]
Description=OS Init Service
After=rabbitmq-server.service mariadb.service

[Service]
User=root
Group=root
Type=simple
ExecStart=/opt/os-init.sh
KillMode=process

[Install]
WantedBy=multi-user.target

其中标红的是比较重要的地方

  • After:表示这个service是在哪些服务之后才可以启动,当os -init.sh脚本中有一些指令需要服务支持的时候,就需要将其加入进来,比如我要初始化数据库和消息队列,所以我引入的就是rabbitmq-server和mariadb,这两个启动之后才运行这个服务
  • User,Group:这两个表示服务以什么身份运行,非特殊要求,尽量不要用root
  • ExecStart:指定可执行程序位置,目前示例中写的是直接执行,所以os-init.sh需要可执行权限,在rpm构建时要正确处理
# cat /opt/os-init.sh

#!/bin/bash

# init ssh root password login permision
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config

# init 8021q kmod
modprobe 8021q

# init rabbitmq-server start post shell
rm -rf /usr/lib/systemd/system/rabbitmq-server.service
mv /etc/uxcloud/rabbitmq-server.service /usr/lib/systemd/system/

# init mysql
mysqladmin password mysqlpasswd
mysql -uroot -pzaq12wsx -e "CREATE DATABASE testDB CHARACTER SET utf8 COLLATE utf8_bin"
mysql -uroot -pzaq12wsx -e"GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysqlpasswd' WITH GRANT OPTION;"

# disable os-init
systemctl disable os-init

这里注意要将最后标红的加上,这样就可以将os-init.sh只在操作系统安装完之后的第一次启动仅运行一次。

 

About the author

liuyuhang

View all posts

发表评论