简介
制作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/centos
chmod 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 100
display boot.msg
menu clear
# 背景图, 制作背景图时应该保证是和源背景图的大小是一致的,这样可以防止图片过大变形。背景图大小是640x480
# splash.png是在isolinux目录下的
menu background splash.png
# 界面提示语
menu title Welcome to auto install Centos!
menu vshift 8
menu rows 18
menu margin 8
#menu hidden
menu helpmsgrow 15
menu tabmsgrow 13
#界面颜色
menu color border * #00000000 #00000000 none
menu color sel 0 #ffffffff #00000000 none
menu color title 0 #ff000cff #00000000 none
menu color tabmsg 0 #ff3a6496 #00000000 none
menu color unsel 0 #84b8ffff #00000000 none
menu color hotsel 0 #ffffffff #00000000 none
menu color hotkey 0 #ffffffff #00000000 none
menu color help 0 #ffffffff #00000000 none
menu color scrollbar 0 #ffffffff #ff355594 none
menu color timeout 0 #ffffffff #00000000 none
menu color timeout_msg 0 #ffffffff #00000000 none
menu color cmdmark 0 #84b8ffff #00000000 none
menu color cmdline 0 #ffffffff #00000000 none
# label表示一个菜单标签, 必须唯一, 用于default语句调用(就是第一行的default语句)
# menu是菜单名称
# menu default表示默认菜单, 如果存在多个menu default语句只有最后一个生效
# kernel加载内核,vmlinuz用于安装,配合append语句实现无人值安装。append语句中的C7是U盘的U盘名, 在封装iso的时候需要用到U盘名
label linux
menu label Auto Install CentOS 7
kernel vmlinuz
append initrd=initrd.img inst.ks=hd:LABEL=C7:/isolinux/bios-ks.cfg inst.stage2=hd:LABEL=C7 quiet
label rescue
menu label Rescue a CentOS system
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=C7 rescue quiet
label local
menu label Boot from local drive
menu default
# localhost 0xffff是实现从本地磁盘启动系统的功能, 没有它就白瞎了
localboot 0xffff
label reboot
menu label Reboot System
menu default
# kernel REBOOT.c32是实现重启的功能, 没有它就白瞎了
kernel REBOOT.c32
menu 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 --activate
network --hostname=CentOS7
static方法要求在kickstart文件里输入所有的网络信息。
请注意所有配置信息都必须在一行上指定,或写两个newwork,不能使用反斜线来换行。
--ip= 被安装的机器的IP地址.
--gateway IP地址格式的默认网关.
--netmask 安装的系统的子网掩码.
--hostname 安装的系统的主机名.
--onboot 是否在引导时启用该设备.
--noipv6 禁用此设备的IPv6.
--nameserver 配置dns解析.
时区认证等
设置时区上海,设置认证方式,设置密码,密码非明文,用前文生成密码的方式生成
timezone --utc Asia/Shanghai
authconfig --enableshadow --passalgo=sha512
rootpw --iscrypted $6$X20eRtuZhkHznTb4$dK0BJByOSA.....wJbAjVI5D6/
分区相关
clearpart --all --initlabel
--all 从系统中清除所有分区,--initlable 初始化磁盘标签
part /boot --fstype xfs --size 1024
part swap --size 1024
part / --fstype xfs --size 1 --grow
磁盘分区。
--fstype 为分区设置文件系统类型.有效的类型为ext2,ext3,swap, xfs和vfat。
--asprimary 强迫把分区分配为主分区,否则提示分区失败。
--size 以MB为单位的分区最小值.在此处指定一个整数值,如500.不加MB。
--grow 告诉分区使用所有可用空间(若有),或使用设置的最大值。
其他信息
firstboot --disable
selinux --disabled
firewall --disabled
logging --level=info
reboot
firstboot 负责协助配置redhat一些重要的信息。
selinux 关闭selinux。
firewall 关闭防火墙。
logging 设置日志级别。
reboot 设定安装完成后重启,也可以选择halt关机。
包选装
%packages
@^minimal
@compat-libraries
@debugging
@development
tree
nmap
sysstat
lrzsz
dos2unix
telnet
wget
vim
bash-completion
%end
安装完成后操作
%post
systemctl disable postfix.service
%end
验证ks文件的正确性
yum -y install pykickstart
ksvalidator /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.rpm
efibootmgr-0.8.0-7.el7.x86_64.rpm
shim-0.9-2.el7.x86_64.rpm
mokutil-0.9-2.el7.x86_64.rpm
efivar-libs-0.11-1.el7.x86_64.rpm
精简软件包
删除无用的软件包。Packages目录是存放Centos7系统的软件包。
Packages目录下存在3724个软件包,而我们最小化安装系统只用得到292个软件包。所以我们需要删除无用的软件包,以减少生成的ISO大小。
删除不需要的软件包,我们需要重新生成软件仓库源。现在只剩下292的软件包了,这些存在的软件包列表你可以通过ks.cfg文件查看。
脚本内容
#!/bin/bash
src_path="/tmp/iso/Packages"
dst_path="/root/Packages"
file="/tmp/iso/isolinux/package.conf.bak"
[ -d $dst_path ] || mkdir -p $dst_path
for i in $(cat $file)
do
pkg_name="${i}.rpm"
pkg_file=$(find $src_path -name $pkg_name)
cp -a $pkg_file $dst_path
done
生成仓库源
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 genisoimage
mkisofs -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个硬盘,哪块硬盘用于安装系统,都是需要脚本判断的