简介
制作U盘无人值
制作U盘无人值,实现能够无人值安装Centos7系统。
首先准备一个ISO镜像,我这里是CentOS-7-x86_64-DVD-1511.iso
然后需要对ISO镜像进行修改, 修改之后需要重新生成。生成需要使用mkisofs命令, windows其实也有这个命令,但是没有找到可用成功的,所以我选择了在一台Centos7系统操作
当然你也可用在其他平台操作,其实就是解压ISO包,改文件内容,然后只是需要一个生成iso的命令而已
挂载ISO
首先将iso挂载到系统,因为iso是只读的所以无法直接编辑,复制一份到/tmp/iso用于编辑
然后再复制一份到/work/centos_bak用于备份(防止iso光盘掉线)
如果你修改ISO不会出现问题,最后一个备份步骤可以省略
mkdir /mnt/iso#创建挂载点mount /dev/sr0 /mnt/iso#挂载mkdir -p /work#创建/work目录, 用于存放iso目录cp /mnt/iso /work/centoschmod a+w -R /work/centos#复制用于编辑cp /work/centos /work/centos_bak#备份
了解ISO目录结构
- 查看ISO目录结构
含有介绍的目录或文件都是比较重要的, 是用的较多的。其余的默认即可,无需改动。
[root@localhost centos]#[root@localhost centos]# tree -LF 1.├── CentOS_BuildTag├── EFI/├── EULA├── GPL├── images/├── isolinux/ #配置文件、系统怎么安装├── LiveOS/├── Packages/ #数据包├── repodata/ #数据缓存├── RPM-GPG-KEY-CentOS-7└── RPM-GPG-KEY-CentOS-Testing-7
- 查看/isolinux目录
/isolinux目录也是比较重要的。CentOS-7-x86_64-DVD-1511.iso镜像是没有menu.c32和reboot.c32文件的
这两个文件是我后来加入的,因为需要通过
- menu.c32实现以文本菜单的方式安装系统(默认菜单是图形化的)
- reboot.32来实现重启系统。
[root@localhost isolinux]# tree -LF 1.├── boot.cat├── boot.msg├── grub.conf├── initrd.img├── isolinux.bin├── isolinux.cfg├── memtest├── menu.c32 # 文本命令行安装系统├── reboot.c32 # 重启系统├── splash.jpg├── splash.png├── upgrade.img├── vesamenu.c32└── vmlinuz*
isolinux.cfg
isolinux.cfg 位于 /isolinux/isolinux.cfg
如何安装系统呢? 是显示出菜单,让你选择菜单项。还是没有菜单直接就安装系统。
这个是由isolinux.cfg文件决定的
Centos7官网isolinux.cfg详解:https://wiki.syslinux.org/wiki/index.php?title=Comboot/menu.c32

默认菜单是Boot frome local drive,如果设备的硬件启动项是U盘启动,那么当我们安装完成系统之后。
重启系统之后还会再次安装。所以为了避免重复安装,设置一个默认菜单用于从当前硬盘启动。
我觉得菜单必须含有重启、从本地启动、紧急修复功能。我们来看一下我的isolinux.cfg文件
# default语句用于选择菜单显示方式# 其中vesamenu.c32以图形化方式显示, menu.c32以文本方式显示。# vesamenu.c32和memu.c32都是/isolinux/目录下的文件, 如果memu.c32文件丢失那么就无法以文本方式显示菜单# 因为是最小化安装所以图形化显示只是显示图片封面,无法显示图形化安装软件的过程default vesamenu.c32# 如果你想实现一个不需要菜单的无人值安装, 直接默认就安装系统, 可以取消注释下面的语句。表示默认执行下面语句的label linux标签的内容。# default语句只会生效一个, 最后一行default语句会生效。当然你也可以使用注释。# default linux# 界面超时时间10秒,100为10秒。timeout 100display boot.msgmenu clear# 背景图, 制作背景图时应该保证是和源背景图的大小是一致的,这样可以防止图片过大变形。背景图大小是640x480# splash.png是在isolinux目录下的menu background splash.png# 界面提示语menu title Welcome to auto install Centos!menu vshift 8menu rows 18menu margin 8#menu hiddenmenu helpmsgrow 15menu tabmsgrow 13#界面颜色menu color border * #00000000 #00000000 nonemenu color sel 0 #ffffffff #00000000 nonemenu color title 0 #ff000cff #00000000 nonemenu color tabmsg 0 #ff3a6496 #00000000 nonemenu color unsel 0 #84b8ffff #00000000 nonemenu color hotsel 0 #ffffffff #00000000 nonemenu color hotkey 0 #ffffffff #00000000 nonemenu color help 0 #ffffffff #00000000 nonemenu color scrollbar 0 #ffffffff #ff355594 nonemenu color timeout 0 #ffffffff #00000000 nonemenu color timeout_msg 0 #ffffffff #00000000 nonemenu color cmdmark 0 #84b8ffff #00000000 nonemenu color cmdline 0 #ffffffff #00000000 none# label表示一个菜单标签, 必须唯一, 用于default语句调用(就是第一行的default语句)# menu是菜单名称# menu default表示默认菜单, 如果存在多个menu default语句只有最后一个生效# kernel加载内核,vmlinuz用于安装,配合append语句实现无人值安装。append语句中的C7是U盘的U盘名, 在封装iso的时候需要用到U盘名label linuxmenu label Auto Install CentOS 7kernel vmlinuzappend initrd=initrd.img inst.ks=hd:LABEL=C7:/isolinux/bios-ks.cfg inst.stage2=hd:LABEL=C7 quietlabel rescuemenu label Rescue a CentOS systemkernel vmlinuzappend initrd=initrd.img inst.stage2=hd:LABEL=C7 rescue quietlabel localmenu label Boot from local drivemenu default# localhost 0xffff是实现从本地磁盘启动系统的功能, 没有它就白瞎了localboot 0xfffflabel rebootmenu label Reboot Systemmenu default# kernel REBOOT.c32是实现重启的功能, 没有它就白瞎了kernel REBOOT.c32menu end
编辑splash.jpg文件
默认的splash.jpg图片尺寸是640x480,所以我们这里的尺寸也最好是一样的。这是蓝色的背景图将splash.jpg图片替换掉。
isolinux.cfg配置更改的是使用splash.png而不是splash.jpg,分享一下 splash.png

ks.cfg详解
ks文件组成
命令段
键盘类型,语言,安装方式等系统的配置,有必选项和可选项,如果缺少某项必选项,安装时会中断并提示用户选择此项的选项
软件包段
以%packages开头,以%end结束,在安装过程中默认安装的软件包,安装软件时会自动分析依赖关系。
@groupname:指定安装的包组package_name:指定安装的包-package_name:指定不安装的包
脚本段(可选)
以%post开头,以%end结束,在安装完系统之后执行的相关Linux命令、脚本
以%pre开头,以%end结束,在安装完系统之前执行的相关Linux命令、脚本
关键词
1.安装模式 选择全新的安装系统,而不是升级
install# upgrade
2.模式语言键盘
# 使用text文本模式安装,graphical图形化安装text# 设置在安装过程中使用的语言以及系统的缺省语言lang en_US.UTF-8# 设置系统键盘类型。keyboard us
安装源部分
通过FTP或HTTP或NFS从远程服务器上的安装树中安装。任选一即可
url --url="http://10.0.0.7/CentOS-6.7/"url --url ftp://<username>:<password>@<server>/<dir>nfs --server=nfsserver.example.com --dir=/tmp/install-tree
bootloader 系统引导配置
—location 指定引导记录被写入的位置.有效的值如下:mbr(缺省),partition,none。
—driveorder 指定在BIOS引导顺序中居首的驱动器。
—append= 指定内核参数.要指定多个参数,使用空格分隔它们。
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
network网络配置[客户机]
network --bootproto=dhcp --device=eth0 --onboot=yes --noipv6 --hostname=CentOS7 --activate或者network --bootproto=static --device=eth0 --ip=10.0.0.201 --netmask=255.255.255.0 --gateway=10.0.0.201 --nameserver=10.0.0.202 --activatenetwork --hostname=CentOS7static方法要求在kickstart文件里输入所有的网络信息。请注意所有配置信息都必须在一行上指定,或写两个newwork,不能使用反斜线来换行。--ip= 被安装的机器的IP地址.--gateway IP地址格式的默认网关.--netmask 安装的系统的子网掩码.--hostname 安装的系统的主机名.--onboot 是否在引导时启用该设备.--noipv6 禁用此设备的IPv6.--nameserver 配置dns解析.
时区认证等
设置时区上海,设置认证方式,设置密码,密码非明文,用前文生成密码的方式生成
timezone --utc Asia/Shanghaiauthconfig --enableshadow --passalgo=sha512rootpw --iscrypted $6$X20eRtuZhkHznTb4$dK0BJByOSA.....wJbAjVI5D6/
分区相关
clearpart --all --initlabel--all 从系统中清除所有分区,--initlable 初始化磁盘标签part /boot --fstype xfs --size 1024part swap --size 1024part / --fstype xfs --size 1 --grow磁盘分区。--fstype 为分区设置文件系统类型.有效的类型为ext2,ext3,swap, xfs和vfat。--asprimary 强迫把分区分配为主分区,否则提示分区失败。--size 以MB为单位的分区最小值.在此处指定一个整数值,如500.不加MB。--grow 告诉分区使用所有可用空间(若有),或使用设置的最大值。
其他信息
firstboot --disableselinux --disabledfirewall --disabledlogging --level=inforebootfirstboot 负责协助配置redhat一些重要的信息。selinux 关闭selinux。firewall 关闭防火墙。logging 设置日志级别。reboot 设定安装完成后重启,也可以选择halt关机。
包选装
%packages@^minimal@compat-libraries@debugging@developmenttreenmapsysstatlrzszdos2unixtelnetwgetvimbash-completion%end
安装完成后操作
%postsystemctl disable postfix.service%end
验证ks文件的正确性
yum -y install pykickstartksvalidator /path/to/kickstart.ks
centos6和centos7的ks文件差异对比
ksverdiff -f RHEL6 -t RHEL7
grub.cfg
grub.cfg是用于uefi启动的,isolinux.cfg是用于传统的bios启动的。
UEFI需要以下软件包
grub2-efi-2.02-0.29.el7.centos.x86_64.rpmefibootmgr-0.8.0-7.el7.x86_64.rpmshim-0.9-2.el7.x86_64.rpmmokutil-0.9-2.el7.x86_64.rpmefivar-libs-0.11-1.el7.x86_64.rpm
精简软件包
删除无用的软件包。Packages目录是存放Centos7系统的软件包。
Packages目录下存在3724个软件包,而我们最小化安装系统只用得到292个软件包。所以我们需要删除无用的软件包,以减少生成的ISO大小。
删除不需要的软件包,我们需要重新生成软件仓库源。现在只剩下292的软件包了,这些存在的软件包列表你可以通过ks.cfg文件查看。
脚本内容
#!/bin/bashsrc_path="/tmp/iso/Packages"dst_path="/root/Packages"file="/tmp/iso/isolinux/package.conf.bak"[ -d $dst_path ] || mkdir -p $dst_pathfor i in $(cat $file)dopkg_name="${i}.rpm"pkg_file=$(find $src_path -name $pkg_name)cp -a $pkg_file $dst_pathdone
生成仓库源
1.复制原有的*comps.xml文件到任意目录
cp repodata/*comps.xml /tmp/
2.删除repodata目录
rm -f repodata/
3.生成源数据。此时会生成repodata目录
createrepo -g /tmp/*comps.xml /tmp/iso
4.删除TRANS包含根下的子目录
find -name TRANS.TBL -exec rm {} \;
生成镜像
mkisofs参数说明:
- -o /tmp/My-Server-CentOS7-v1.0.iso,设置输出文件名,-output
- -b isolinux/isolinux.bin,指定开机映像文件
- -c isolinux/boot.cat,制作启动光盘时,mkisofs会将开机映像文件中的全-eltorito-catalog*文件的全部内容作成一个文件
- -no-emul-boot,非模拟模式启动
- -boot-load-size 4,
- -boot-info-table,
- -joliet-long,
- -R,使用Rock Ridge Extensions,是用于linux环境下的光盘,文件名区分大小写同时记录文件长度,-rock
- -J,使用Joliet格式的目录与文件名称,Jolient是windows下使用的光盘,-joliet
- -v,执行时显示详细的信息,-verbose
- -V “CentOS 7 x86_64”,设置卷标Volume ID,-volid
- -T,建立文件名的转换表,适用于不支持Rock Ridge Extensions的系统,-translation-table
/tmp/iso/,光盘源文件目录
yum -y install genisoimagemkisofs -o /root/CentOS7-v1.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -joliet-long -R -J -v -V "C7" -T /cola/
Rufus软件刻录
如果光盘镜像为ISOHybrid镜像,有ISO镜像模式和DD镜像模式两种写入方式,其中ISO镜像模式写入的U盘还可以写入其他文件,和一般U盘无区别,但兼容性较差,推荐DD镜像模式,但该模式写入后,windows下将不识别,仅可用于系统安装

总结
iso生成是一个很麻烦的过程,所以一定要有耐心,每一次要保留一下上个版本ks文件,等重要文件 用于回退
很多时候虚拟机可以,但是物理机并不可以,可能是缺少某些驱动软件导致无法成功安装物理机
也有时候虚拟机不可以,这完全取决你的虚拟机环境,我之前parallels不可以,vmware fusion可以
物理机调试部署是很麻烦的过程,BIOS可以,UEFI不行
制作镜像还有很多挑战,例如自动识别磁盘,当机器有4-5个硬盘,哪块硬盘用于安装系统,都是需要脚本判断的
