初涉定制linux系统之——自动化安装Centos系统镜像制作
最近碰到个需求:要在内网环境安装centos6.5系统并搭建服务,但由于自动部署脚本里安装依赖包使用的是yum安装,而服务器无法连接外网,实施人员也不会本地yum源搭建…..
本来想法是打算把需要的依赖包全找出来打包发给实施人员自己安装去,后来考虑到系统安装人员的安装方式不一致,分区及安装包的不统一会对之后的维护造成负担,干脆就决定做个自动化安装的镜像,并把需要的业务依赖包全打包进去
ok,首先我们来看看环境准备:
1、两台刚安装好的、符合业务要求的系统(博主选择的是minimal 最小化安装,这个看个人需求了)
2、新装系统的/root 目录下 install.log 和 anaconda-ks.cfg 文件,之后会用到
3、需要添加的安装包
4、CentOS 6.5镜像文件或者光盘
5、安装工具包
####以下为在服务器A上的操作,即镜像制作服务器####
一、安装必要的工具包,创建对应目录
[root@localhost ~]# yum -y install anaconda createrepo mkisofs rsync [root@localhost ~]# mkdir -p /root/iso/Packages #创建存放当前系统里已安装的包的目录 [root@localhost ~]# mkdir -p /root/iso/repodata #创建存放rpm包依赖关系的目录
二、插入光盘,挂载DVD镜像
[root@localhost ~]# mount /dev/cdrom /mnt #挂载光盘镜像
mount: block device /dev/sr0 is write-protected, mounting read-only #有这提示是正常的
三、centos系统在安装包时,包名都记录在root目录install.log文件里,我们可以从中提取出来
1 [root@localhost ~]# awk '/Installing/{print $2}' /root/install.log | sed 's/^[0-9]*://g' >/root/package.txt
四、执行下面test.sh的脚本,从挂载的光盘镜像中提取出需要的安装包,放到/root/iso/Packages目录里。脚本内容如下:
[root@localhost ~]# cat test.sh
#!/bin/bash
Packages='/mnt/Packages' #挂载的光盘镜像中存放安装包的路径
i='/root/iso/Packages/' #新镜像存放安装包的路径
while read line
do
cp ${Packages}/${line}*.rpm /${i} || echo "$line don't cp......."
done < /root/package.txt 2 [root@localhost ~]# sh test.sh
五、把镜像需要的其他文件也拷贝到iso目录下
[root@localhost ~]# rsync -a --exclude=Packages --exclude=repodata /mnt/ /root/iso
[root@localhost ~]# ll iso/
total
-rw-------. root root May : anaconda-ks.cfg
-r--r--r--. root root Nov CentOS_BuildTag
dr-xr-xr-x. root root Nov EFI
-r--r--r--. root root Nov EULA
-r--r--r--. root root Nov GPL
dr-xr-xr-x. root root Nov images
dr-xr-xr-x. root root May : isolinux
drwxr-xr-x. root root May : MyPackages
drwxr-xr-x. root root May : Packages
-r--r--r--. root root Nov RELEASE-NOTES-en-US.html
-r--r--r--. root root Nov RPM-GPG-KEY-CentOS-
-r--r--r--. root root Nov RPM-GPG-KEY-CentOS-Debug-
-r--r--r--. root root Nov RPM-GPG-KEY-CentOS-Security-
-r--r--r--. root root Nov RPM-GPG-KEY-CentOS-Testing-
-r--r--r--. root root May : TRANS.TBL
六、执行xml.sh脚本,生成repodata下的comps.xml文件(重要),comps.xml 文件中包含了安装时用户所见到的与rpm相关的所有内容,它会检查Packages下的RPM包的依赖关系,安装时如果缺少依赖包,它会提示哪个RPM 包需要哪些依赖库。脚本内容如下:
[root@localhost ~]# cat xml.sh
#!/bin/bash ISO_DIR=/root/iso
cd ${ISO_DIR}
declare -x discinfo=$(head - .discinfo)
cp /mnt/repodata/*-comps.xml ${ISO_DIR}/repodata/
createrepo -g ${ISO_DIR}/repodata/*-comps.xml ${ISO_DIR}
createrepo -u "media://$discinfo" -g ${ISO_DIR}/repodata/*-comps.xml ${ISO_DIR}
执行结果如下:
[root@localhost ~]# sh xml.sh
Spawning worker with pkgs
Workers Finished
Gathering worker results Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
Spawning worker with pkgs
Workers Finished
Gathering worker results Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
上面对定制系统的精简已经完成,如果不需要添加自定义或者其他不在原系统镜像中的rpm包的话,可直接跳到第十一步即可,下面是对定制系统安装包的更新和增加
####以下为在服务器B上的操作####
部署环境有时候需要更新版本的软件,而上面我们定制的镜像中往往只有很旧的版本,这时候就需要我们对里面的rpm包进行更新,首先我们需要将所需的包及依赖下载下来但不安装,这就需要yum-plugin-downloadonly模块,相关说明可以看该博客http://www.cnblogs.com/dengtr/p/6518622.html,我们这里不再多做解释。
七、安装yum插件yum-plugin-downloadonly和epel第三方yum源
[root@ ~]# yum install yum-plugin-downloadonly [root@localhost ~]# yum install epel-release
八、将需要更新的包及依赖关系下载到本地
[root@localhost ~]# yum install --downloadonly gcc gcc-c++ libtool autoconf automake imake libxml2-devel expat-devel ncurses-devel cmake zlib.i686 libstdc++.i686 unzip wget vim ntpdate unzip
九、将下载到本地的包收集起来传到服务器A的/root/iso/Packages目录下
[root@localhost ]# find /var/cache/yum/x86_64// -name "*.rpm" >>/root/rpm.txt #将下载的rpm包绝对路径写到文件里 [root@localhost ~]# mkdir /root/tmp #建立临时存放目录 [root@localhost ~]# cat cp.sh #执行该脚本将下载的rpm包复制到tmp目录下
#!/bin/bash
while read line
do
cp $line /root/tmp/ || echo "$line don't cp......."
done < /root/rpm.txt 4 [root@localhost ~]# yum install openssh-clients #安装scp命令
[root@localhost ~]# scp /root/tmp/*.rpm root@192.168.1.92:/root/iso/Packages/ #将收集到的rpm包远程传输到服务器A的/root/iso/Packages/目录上
rpm包及依赖关系的收集就完了,接着就需要回到服务器A上进行操作。
####以下为在服务器A上的操作,即镜像制作服务器####
十、因为/root/iso/Packages/目录下的包变动了,需要我们再回到上面第六步,执行xml.sh脚本,重新生成repodata下的comps.xml文件。这步主要是更新rpm包的依赖关系
[root@localhost ~]# cat xml.sh
#!/bin/bash ISO_DIR=/root/iso
cd ${ISO_DIR}
declare -x discinfo=$(head - .discinfo)
cp /mnt/repodata/*-comps.xml ${ISO_DIR}/repodata/
createrepo -g ${ISO_DIR}/repodata/*-comps.xml ${ISO_DIR}
createrepo -u "media://$discinfo" -g ${ISO_DIR}/repodata/*-comps.xml ${ISO_DIR}
十一、制作 anaconda-ks.cfg 脚本
anaconda-ks.cfg记录了在安装系统时填写的参数和选项,即你在安装系统时选择分区、时区、设置用户密码等一系列操作,存放在/root目录,我们直接对由系统安装所创建的 anaconda-ks.cfg进行修改,当然也可以用system-config-kickstart工具制作而成
[root@localhost ~]# cp anaconda-ks.cfg /root/iso #复制到我们的定制镜像目录里,并进行修改
这里附上一个我在用的ks文件,其中新增的地方有注释,需要注意的是后面更新和增加的安装包需要追加到配置的后面
[root@localhost iso]# cat anaconda-ks.cfg
# Kickstart file automatically generated by anaconda. #version=DEVEL
install
cdrom
lang en_US.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6
rootpw --iscrypted $$6u5l74FLeYsJgLRP$HnamRVB2RvRUFB2jEc
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --enforcing
timezone --utc Asia/Shanghai
bootloader --location=mbr --driveorder=sda --append="nomodeset crashkernel=auto rhgb quiet"
zerombr
clearpart --all --initlabel ####下面是系统分区,视个人情况修改,--size=1表示剩余空间全部分给该分区####
part /boot --asprimary --fstype="ext4" --ondisk=sda --size=
part swap --asprimary --fstype="swap" --ondisk=sda --size=
part / --asprimary --fstype="ext4" --grow --ondisk=sda --size=
reboot
# 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 --none
#repo --name="CentOS" --baseurl=cdrom:sr0 --cost= %packages
@core
@server-policy
@workstation-policy #下面的包即是我们在服务器B上更新的包名,相关依赖在第十步的时候就已经做好了
autoconf
automake
bison
cmake
expat-devel
gcc
gcc-c++
imake
libtool
libxml2-devel
ncurses-devel
yasm
glibc.i686
libgcc.i686
libstdc++.i686
nss-softokn-freebl.i686
zlib.i686 %post #这里是系统安装完后执行的脚本命令,你可以在目录里放类似redis安装包、jdk安装包等,然后把安装命令都写在这里,博主这里写ls -l只是做实例。
ls -l eject #安装完弹出光盘
%end
十一、修改 isolinux.cfg 配置文件,指定anaconda-ks.cfg路径
[root@localhost mnt]# cat /root/iso/isolinux/isolinux.cfg
default linux ks=cdrom:/anaconda-ks.cfg #修改第一行
十二、制作iso镜像,并生成 MD5校验码
[root@localhost ~]# mkisofs -o CentOS.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size -boot-info-table -R -J -v -T /root/iso/
[root@localhost ~]# implantisomd5 CentOS.iso
新鲜出炉的自动安装镜像就完事了,之后刻盘,安装系统时只需要放入光盘就行了,简单吧
初涉定制linux系统之——自动化安装Centos系统镜像制作的更多相关文章
- Linux学习(一)-安装vm虚拟机以及如何在虚拟机上安装Centos系统
(一)基本说明 学习Linux需要一个环境,我们需要创建一个虚拟机,然后在虚拟机上安装一个Centos系统来学习. 1)安装软件vm12; 2)通过vm12创建一个虚拟机空间; 3)在vm12创建好的 ...
- CentOS 6.5自动化运维之基于DHCP和TFTP服务的PXE自动化安装centos操作系统详解
前言 如果要给很多台客户端主机安装操作系统,要是每一台都拿张安装光盘一台一台主机的去装系统那就太浪费时间和精力了.在生产环境中也不实际,要实现为多台主机自动安装操作系统,那我们怎么实现自动化安装 ...
- kickstart半自动安装centos系统与pxe自动安装centos系统
一.kickstart半自动安装centos系统 关闭防火墙,关闭selinux,使用system-config-kickstart生成kickstart配置文件,启动xmanger-Passive ...
- VMware虚拟机安装CentOS系统图文教程
上一篇:VMware虚拟机安装教程详解图文 上一篇文章给大家介绍了虚拟机的安装,本文为大家详细介绍一下如何在虚拟机安装CentOS系统: 一:VMware虚拟机创建: 1:打开 ...
- virtualbox 安装centos系统,设置双网卡实现虚拟机上网及主宿互访
写在前面:前两天想玩linux,在VMware中装了centos,进入系统后发现连不上网,搜了下教程,/etc/sysconfig/network-scripts/目录下没有 ifcfg-e*的文件 ...
- Linux Centos7部署环境安装-CentOS
Linux Centos7部署环境安装-CentOS Centos7部署环境安装及Linux常用命令 centos系统下各文件夹的作用 centos7修改系统默认语言 centos7安装rz/sz命令 ...
- yum安装centos系统依赖库
安装centos系统依赖库,安装软件过程中,经常需要的一些库,可以在编译安装软件前执行如下命令: 首先更新系统(这步可以不执行) yum -y update 这种更新是全部更新,但是有时一些软件不想更 ...
- 安装 CentOs 系统 及 Python 及 Scrapy 框架
1: 先安装Centos 系统: 为什么选择CentOs系统,而不选择Ubuntu ? 我在Ubuntu上尝试了三次安装 python 和 Scrapy ,结果都没成功,在运维老王的建议下 使用Cen ...
- VWware Workstation 安装CentOS系统
VWware Workstation 安装CentOS系统 下载CentOS系统镜像: 官方地址:https://www.centos.org/download/mirrors/ 在此可选择华为云服务 ...
随机推荐
- 一次Oracle 11g+FluentNHibernate AutoMapping组合尝试
本文的上下文环境 操作系统:Win7 x64 Ultimate开发工具:Visual Studio 2013 一.前言 在以前开发的大多数场景下,使用的开发语言是C#,使用的数据库是Sql Serve ...
- (转)C语言_测试程序运行内存状态GlobalMemoryStatus使用案例
在做毕业设计的时候,需要验证算法的空间复杂度,C语言网上都说是用GlobalMemoryStatus这个函数,但是网上却没有这个函数的使用实例,也有人说是用内存分析器的东西,但是这个显然是不靠谱的. ...
- Ubuntu Kylin 14.04-修改IP固定地址
前言:今天我们办公室的网络不稳定,隔一会时间就断掉,后来请负责网络的同事来处理了一下,说是路由器的有些配置起冲突了,所以他将IP地址做了一些修改,比如:原IP是192.168.0.110 ...
- git 撤销commit
如果不小心commit了一个不需要commit的文件,可以对其进行撤销. 先使用git log 查看 commit日志 commit 422bc088a7d6c5429f1d0760d008d86c5 ...
- 4T_进程与进程间通信
∮进程 进程与程序 进程与程序是有区别的.刚吃完炸鸡腿,拿出一张餐巾纸,擦完嘴之后,在油乎乎的纸上写下以下文字 #include <stdio.h> void main() { print ...
- 图解GitHub基本操作
目录 一.注册并登陆到github网站 1.1.打开github网站首页(https://github.com/) 1.2.注册一个自己的github账号 1.3.登陆自己的github账号 二.创建 ...
- 采集的GPS数据如何正确显示在arcgis和cad中
利用GPS定位卫星,在全球范围内实时进行定位.导航的系统,称为全球卫星定位系统,简称GPS.GPS是由美国国防部研制建立的一种具有全方位.全天候.全时段.高精度的卫星导航系统,能为全球用户提供低成本. ...
- Hsqldb安装与使用
HSQLDB是一个轻量级的纯Java开发的开放源代码的关系数据库系统,其体积小,占用空间小,使用简单,支持内存运行方式等特点.可以在http://sourceforge.net/projects/hs ...
- Java日志——2016.6.3
1)二维数组的静态初始化: int[][] arr = new int[][] { {1,2,3}, {4,5}, {6,7}} 2)杨辉三角: /** * 需求: ...
- 填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT
填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT 警告:发生了重入! 解释:在主循环里调用了一个函数,而在中断服务中又一次调用了同样的函数.当主循环运行到该函数中 ...