简介

制作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不会出现问题,最后一个备份步骤可以省略

  1. mkdir /mnt/iso
  2. #创建挂载点
  3. mount /dev/sr0 /mnt/iso
  4. #挂载
  5. mkdir -p /work
  6. #创建/work目录, 用于存放iso目录
  7. cp /mnt/iso /work/centos
  8. chmod a+w -R /work/centos
  9. #复制用于编辑
  10. cp /work/centos /work/centos_bak
  11. #备份

了解ISO目录结构

  1. 查看ISO目录结构

含有介绍的目录或文件都是比较重要的, 是用的较多的。其余的默认即可,无需改动。

  1. [root@localhost centos]#
  2. [root@localhost centos]# tree -LF 1
  3. .
  4. ├── CentOS_BuildTag
  5. ├── EFI/
  6. ├── EULA
  7. ├── GPL
  8. ├── images/
  9. ├── isolinux/ #配置文件、系统怎么安装
  10. ├── LiveOS/
  11. ├── Packages/ #数据包
  12. ├── repodata/ #数据缓存
  13. ├── RPM-GPG-KEY-CentOS-7
  14. └── RPM-GPG-KEY-CentOS-Testing-7
  1. 查看/isolinux目录

/isolinux目录也是比较重要的。CentOS-7-x86_64-DVD-1511.iso镜像是没有menu.c32reboot.c32文件的
这两个文件是我后来加入的,因为需要通过

  • menu.c32实现以文本菜单的方式安装系统(默认菜单是图形化的)
  • reboot.32来实现重启系统。
  1. [root@localhost isolinux]# tree -LF 1
  2. .
  3. ├── boot.cat
  4. ├── boot.msg
  5. ├── grub.conf
  6. ├── initrd.img
  7. ├── isolinux.bin
  8. ├── isolinux.cfg
  9. ├── memtest
  10. ├── menu.c32 # 文本命令行安装系统
  11. ├── reboot.c32 # 重启系统
  12. ├── splash.jpg
  13. ├── splash.png
  14. ├── upgrade.img
  15. ├── vesamenu.c32
  16. └── vmlinuz*

isolinux.cfg

isolinux.cfg 位于 /isolinux/isolinux.cfg

如何安装系统呢? 是显示出菜单,让你选择菜单项。还是没有菜单直接就安装系统。

这个是由isolinux.cfg文件决定的

Centos7官网isolinux.cfg详解:https://wiki.syslinux.org/wiki/index.php?title=Comboot/menu.c32

Centos装机 - 图1

默认菜单是Boot frome local drive,如果设备的硬件启动项是U盘启动,那么当我们安装完成系统之后。

重启系统之后还会再次安装。所以为了避免重复安装,设置一个默认菜单用于从当前硬盘启动。

我觉得菜单必须含有重启、从本地启动、紧急修复功能。我们来看一下我的isolinux.cfg文件

  1. # default语句用于选择菜单显示方式
  2. # 其中vesamenu.c32以图形化方式显示, menu.c32以文本方式显示。
  3. # vesamenu.c32和memu.c32都是/isolinux/目录下的文件, 如果memu.c32文件丢失那么就无法以文本方式显示菜单
  4. # 因为是最小化安装所以图形化显示只是显示图片封面,无法显示图形化安装软件的过程
  5. default vesamenu.c32
  6. # 如果你想实现一个不需要菜单的无人值安装, 直接默认就安装系统, 可以取消注释下面的语句。表示默认执行下面语句的label linux标签的内容。
  7. # default语句只会生效一个, 最后一行default语句会生效。当然你也可以使用注释。
  8. # default linux
  9. # 界面超时时间10秒,100为10秒。
  10. timeout 100
  11. display boot.msg
  12. menu clear
  13. # 背景图, 制作背景图时应该保证是和源背景图的大小是一致的,这样可以防止图片过大变形。背景图大小是640x480
  14. # splash.png是在isolinux目录下的
  15. menu background splash.png
  16. # 界面提示语
  17. menu title Welcome to auto install Centos!
  18. menu vshift 8
  19. menu rows 18
  20. menu margin 8
  21. #menu hidden
  22. menu helpmsgrow 15
  23. menu tabmsgrow 13
  24. #界面颜色
  25. menu color border * #00000000 #00000000 none
  26. menu color sel 0 #ffffffff #00000000 none
  27. menu color title 0 #ff000cff #00000000 none
  28. menu color tabmsg 0 #ff3a6496 #00000000 none
  29. menu color unsel 0 #84b8ffff #00000000 none
  30. menu color hotsel 0 #ffffffff #00000000 none
  31. menu color hotkey 0 #ffffffff #00000000 none
  32. menu color help 0 #ffffffff #00000000 none
  33. menu color scrollbar 0 #ffffffff #ff355594 none
  34. menu color timeout 0 #ffffffff #00000000 none
  35. menu color timeout_msg 0 #ffffffff #00000000 none
  36. menu color cmdmark 0 #84b8ffff #00000000 none
  37. menu color cmdline 0 #ffffffff #00000000 none
  38. # label表示一个菜单标签, 必须唯一, 用于default语句调用(就是第一行的default语句)
  39. # menu是菜单名称
  40. # menu default表示默认菜单, 如果存在多个menu default语句只有最后一个生效
  41. # kernel加载内核,vmlinuz用于安装,配合append语句实现无人值安装。append语句中的C7是U盘的U盘名, 在封装iso的时候需要用到U盘名
  42. label linux
  43. menu label Auto Install CentOS 7
  44. kernel vmlinuz
  45. append initrd=initrd.img inst.ks=hd:LABEL=C7:/isolinux/bios-ks.cfg inst.stage2=hd:LABEL=C7 quiet
  46. label rescue
  47. menu label Rescue a CentOS system
  48. kernel vmlinuz
  49. append initrd=initrd.img inst.stage2=hd:LABEL=C7 rescue quiet
  50. label local
  51. menu label Boot from local drive
  52. menu default
  53. # localhost 0xffff是实现从本地磁盘启动系统的功能, 没有它就白瞎了
  54. localboot 0xffff
  55. label reboot
  56. menu label Reboot System
  57. menu default
  58. # kernel REBOOT.c32是实现重启的功能, 没有它就白瞎了
  59. kernel REBOOT.c32
  60. menu end

编辑splash.jpg文件

默认的splash.jpg图片尺寸是640x480,所以我们这里的尺寸也最好是一样的。这是蓝色的背景图将splash.jpg图片替换掉。
isolinux.cfg配置更改的是使用splash.png而不是splash.jpg,分享一下 splash.png

Centos装机 - 图2

ks.cfg详解

ks文件组成

命令段
键盘类型,语言,安装方式等系统的配置,有必选项和可选项,如果缺少某项必选项,安装时会中断并提示用户选择此项的选项
软件包段
以%packages开头,以%end结束,在安装过程中默认安装的软件包,安装软件时会自动分析依赖关系。

  1. @groupname:指定安装的包组
  2. package_name:指定安装的包
  3. -package_name:指定不安装的包

脚本段(可选)
以%post开头,以%end结束,在安装完系统之后执行的相关Linux命令、脚本
以%pre开头,以%end结束,在安装完系统之前执行的相关Linux命令、脚本

关键词

1.安装模式 选择全新的安装系统,而不是升级

  1. install
  2. # upgrade

2.模式语言键盘

  1. # 使用text文本模式安装,graphical图形化安装
  2. text
  3. # 设置在安装过程中使用的语言以及系统的缺省语言
  4. lang en_US.UTF-8
  5. # 设置系统键盘类型。
  6. keyboard us

安装源部分
通过FTP或HTTP或NFS从远程服务器上的安装树中安装。任选一即可

  1. url --url="http://10.0.0.7/CentOS-6.7/"
  2. url --url ftp://<username>:<password>@<server>/<dir>
  3. nfs --server=nfsserver.example.com --dir=/tmp/install-tree

bootloader 系统引导配置
—location 指定引导记录被写入的位置.有效的值如下:mbr(缺省),partition,none。
—driveorder 指定在BIOS引导顺序中居首的驱动器。
—append= 指定内核参数.要指定多个参数,使用空格分隔它们。

  1. bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"

network网络配置[客户机]

  1. network --bootproto=dhcp --device=eth0 --onboot=yes --noipv6 --hostname=CentOS7 --activate
  2. 或者
  3. 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
  4. network --hostname=CentOS7
  5. static方法要求在kickstart文件里输入所有的网络信息。
  6. 请注意所有配置信息都必须在一行上指定,或写两个newwork,不能使用反斜线来换行。
  7. --ip= 被安装的机器的IP地址.
  8. --gateway IP地址格式的默认网关.
  9. --netmask 安装的系统的子网掩码.
  10. --hostname 安装的系统的主机名.
  11. --onboot 是否在引导时启用该设备.
  12. --noipv6 禁用此设备的IPv6.
  13. --nameserver 配置dns解析.

时区认证等
设置时区上海,设置认证方式,设置密码,密码非明文,用前文生成密码的方式生成

  1. timezone --utc Asia/Shanghai
  2. authconfig --enableshadow --passalgo=sha512
  3. rootpw --iscrypted $6$X20eRtuZhkHznTb4$dK0BJByOSA.....wJbAjVI5D6/

分区相关

  1. clearpart --all --initlabel
  2. --all 从系统中清除所有分区,--initlable 初始化磁盘标签
  3. part /boot --fstype xfs --size 1024
  4. part swap --size 1024
  5. part / --fstype xfs --size 1 --grow
  6. 磁盘分区。
  7. --fstype 为分区设置文件系统类型.有效的类型为ext2,ext3,swap, xfsvfat
  8. --asprimary 强迫把分区分配为主分区,否则提示分区失败。
  9. --size MB为单位的分区最小值.在此处指定一个整数值,如500.不加MB
  10. --grow 告诉分区使用所有可用空间(若有),或使用设置的最大值。

其他信息

  1. firstboot --disable
  2. selinux --disabled
  3. firewall --disabled
  4. logging --level=info
  5. reboot
  6. firstboot 负责协助配置redhat一些重要的信息。
  7. selinux 关闭selinux
  8. firewall 关闭防火墙。
  9. logging 设置日志级别。
  10. reboot 设定安装完成后重启,也可以选择halt关机。

包选装

  1. %packages
  2. @^minimal
  3. @compat-libraries
  4. @debugging
  5. @development
  6. tree
  7. nmap
  8. sysstat
  9. lrzsz
  10. dos2unix
  11. telnet
  12. wget
  13. vim
  14. bash-completion
  15. %end

安装完成后操作

  1. %post
  2. systemctl disable postfix.service
  3. %end

验证ks文件的正确性

  1. yum -y install pykickstart
  2. ksvalidator /path/to/kickstart.ks

centos6和centos7的ks文件差异对比

  1. ksverdiff -f RHEL6 -t RHEL7

grub.cfg

grub.cfg是用于uefi启动的,isolinux.cfg是用于传统的bios启动的。

UEFI需要以下软件包

  1. grub2-efi-2.02-0.29.el7.centos.x86_64.rpm
  2. efibootmgr-0.8.0-7.el7.x86_64.rpm
  3. shim-0.9-2.el7.x86_64.rpm
  4. mokutil-0.9-2.el7.x86_64.rpm
  5. efivar-libs-0.11-1.el7.x86_64.rpm

精简软件包

删除无用的软件包。Packages目录是存放Centos7系统的软件包。

Packages目录下存在3724个软件包,而我们最小化安装系统只用得到292个软件包。所以我们需要删除无用的软件包,以减少生成的ISO大小。

删除不需要的软件包,我们需要重新生成软件仓库源。现在只剩下292的软件包了,这些存在的软件包列表你可以通过ks.cfg文件查看。

脚本内容

  1. #!/bin/bash
  2. src_path="/tmp/iso/Packages"
  3. dst_path="/root/Packages"
  4. file="/tmp/iso/isolinux/package.conf.bak"
  5. [ -d $dst_path ] || mkdir -p $dst_path
  6. for i in $(cat $file)
  7. do
  8. pkg_name="${i}.rpm"
  9. pkg_file=$(find $src_path -name $pkg_name)
  10. cp -a $pkg_file $dst_path
  11. done

生成仓库源

1.复制原有的*comps.xml文件到任意目录

  1. cp repodata/*comps.xml /tmp/

2.删除repodata目录

  1. rm -f repodata/

3.生成源数据。此时会生成repodata目录

  1. createrepo -g /tmp/*comps.xml /tmp/iso

4.删除TRANS包含根下的子目录

  1. 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/,光盘源文件目录
  1. yum -y install genisoimage
  2. 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下将不识别,仅可用于系统安装

Centos装机 - 图3

总结

iso生成是一个很麻烦的过程,所以一定要有耐心,每一次要保留一下上个版本ks文件,等重要文件 用于回退

很多时候虚拟机可以,但是物理机并不可以,可能是缺少某些驱动软件导致无法成功安装物理机

也有时候虚拟机不可以,这完全取决你的虚拟机环境,我之前parallels不可以,vmware fusion可以

物理机调试部署是很麻烦的过程,BIOS可以,UEFI不行

制作镜像还有很多挑战,例如自动识别磁盘,当机器有4-5个硬盘,哪块硬盘用于安装系统,都是需要脚本判断的


瓦雀