自动化安装系统(一)

系统安装过程

  • 加载boot loader
  • 加载启动安装菜单
  • 加载内核和initrd文件
  • 加载根系统
  • 运行anaconda的安装向导

安装光盘中与安装相关的文件

安装autofs启动后会自动出现/misc目录。

在虚拟机设置中添加CD/DVD,使用系统ISO文件,登录系统后mount /dev/cdrom /misc 即可

  • boot.cat:相当于grub第一阶段
  • isolinux.bin:光盘引导程序,在mkisofs的选项中需要明确给出文件路径,这个文件属于SYSLINUX项目
  • isolinux.cfg:启动菜单的配置文件,当光盘启动后(即运行isolinux.bin),会自动去找isolinux.cfg文件
  • vesmenu.c32:是光盘启动后的启动菜单图形界面,也属于SYSLINUX项目,menu.c32提供纯文本的菜单
  • memtest:内存检测程序
  • splash.png:光盘启动菜单界面的背景图
  • vmlinuz:内核映像
  • initrd.img:ramfs文件

isolinux.cfg参数

参数与安装过程对应关系

1、

2、

 

 

选择不同选项实际是内核参数的不同。

  • 加载内核:isolinuz/vmlinuz
  • 向内核传递参数:append initrd=initrd.img 参数

选择直接安装 Install CentOS Linux 8,内核参数为:append initrd=initrd.img inst.stage2=hd:LABEL=CentOS-8-2-2004-x86_64-dvd quiet

选择测试媒介,若无误则安装 Test this media & install CentOS Linux 8,内核参数为:append initrd=initrd.img inst.stage2=hd:LABEL=CentOS-8-2-2004-x86_64-dvd rd.live.check quiet

选择在基本图形模式下安装 Install CentOS Linux 8 in basic graphics mode,内核参数为:append initrd=initrd.img inst.stage2=hd:LABEL=CentOS-8-2-2004-x86_64-dvd nomodeset quiet

选择救援系统 Rescue a CentOS Linux system,内核参数为:append initrd=initrd.img inst.stage2=hd:LABEL=CentOS-8-2-2004-x86_64-dvd rescue quiet

比如进入救援模式可以这麽做

一、当光标定位在 Install Centos Linux 8 时,按Tab键

在末端输入救援模式的内核参数 rescue,即可进入救援模式

二、在此界面按ESC键,然后 boot:rescue,进入救援模式

常见内核参数

1、text:默认启动GUI图形界面安装接口,可以指定文本方式的安装界面

2、rescue:进入救援模式

3、inst.repo=path:指定安装源文件的路径,可以是以下格式
Centos 6
DVD drive repo=cdrom:device
Hard Drive repo=hd:device/path
HTTP Server repo=http://host/path
HTTPS Server repo=https://host/path
FTP Server repo=ftp://username:password@host/path
NFS Server repo=nfs:server:/path
ISO images on an NFS Server repo=nfsiso:server:/path

Centos 7
Any CD/DVD drive inst.repo=cdrom
Hard Drive inst.repo=hd:device:/path
HTTP Server inst.repo=http://host/path
HTTPS Server inst.repo=https://host/path
FTP Server inst.repo=ftp://username:password@host/path
NFS Server inst.repo=nfs:[options:]server:/path

askmethod:选择安装源文件的获取方法,提供了光盘,本地硬盘,NFS,FTP,HTTP多种安装源,此项Centos 7 以后版已废弃

ks=path: 指定自动化安装应答文件路径,如:initrd=initrd.img inst.ks=http://192.168.8.8/ksdir/ks8.cfg

ip= : 指定IP地址信息
ip=method,method 可以为dhcp
ip=interface:method 指定特定接口
ip=ip::gateway:netmask:hostname:interface:none 静态IP

anaconda

anaconda是Linux系统安装程序,提供两种风格安装界面

1、GUI:图形窗口

2、TUI:基于图形库的curses的文本窗口

anaconda工作过程

1、安装过程使用的语言

2、键盘类型

3、时区和时间

4、安装源文件路径

5、选定要安装的程序包

6、安装目标存储设备及分区设置

Basic Storage:本地磁盘

特殊设备:iSCSI

KDUMP功能

设定主机名和配置网络接口

安全策略

管理员密码

创建一个普通用户

anaconda的配置方式:

1、交互式配置方式

2、通过读取事先给定的配置文件自动完成配置,加内核参数:ks=/path实现指明kickstart文件的位置,各种路径格式如下:

​ DVD drive:ks=cdrom:/PATH/TO/KICKSTART_FILE
​ Hard drive:ks=hd:device:/directory/KICKSTART_FILE
​ HTTP server:ks=http://host:port/path/to/KICKSTART_FILE
​ FTP server:ks=ftp://host:port/path/to/KICKSTART_FILE
​ HTTPS server:ks=https://host:port/path/to/KICKSTART_FILE
​ NFS server:ks=nfs:host:/path/to/KICKSTART_FILE

实现自动化安装应答文件

实现自动安装需要提前制作对应的安装应答文件,称为kickstart文件,用于保存安装过程需要指定的选项。

kickstart文件使用过程

1、创建kickstart文件。

2、将kickstart文件放在可移动媒体、硬盘驱动器或网络位置上。

3、创建引导介质,将用于开始安装。

4、提供安装源。

5、启动kickstart安装。

kickstart文件格式

root家目录里有anaconda-ks.cfg文件,可参考

1、命令段

指明各种安装前配置,如键盘类型等

keyboard设定键盘类型
lang语言类型
zerombr清除MBR
clearpart清除分区
part创建分区
rootpw设定root密码
timezone时区
text文本安装界面
network指定网络设置
firewall设置防火墙
selinuxselinux设置
reboot安装完自动重启
user安装完为系统创建新用户
url配置安装源

2、程序包段

指明要安装的程序包组或程序包,不安装的程序包等

%packages
@^environment group: 指定环境包组,如:@^minimal-environment
@group_name
package
-package
%end

3、脚本段

%pre: 安装前脚本

%post: 安装后脚本 

注意:

  • CentOS 8,7,6 不同版本的kickstart文件格式不尽相同,不可混用
  • %addon(拓展)、%packages(软件包)、%onerror、%pre、%post 必须以%end结束,否则安装失败

创建kickstart文件

方式

  • 使用创建工具:system-config-kickstart ,注意:此方法 CentOS 8 不再支持
  • 依据某模板修改并生成新配置;CentOS安装完后,会自动参考当前系统的安装过程,生成一个kickstart文件 /root/anaconda-ks.cfg

检查语法

安装pykickstart,使用ksvalidator工具检查kickstart语法错误

[root@wenzi ~]#ls
anaconda-ks.cfg
[root@wenzi ~]#yum -y install pykickstart.noarch

[root@wenzi ~]#ksvalidator anaconda-ks.cfg

在centos7使用system-config-kickstart创建kickstart文件

centos7地址 192.168.28.141

1、物理机上安装xmanager进行图形化操作

2、

[root@wenzi ~]# yum list | grep pykickstart
pykickstart.noarch                          1.99.66.22-1.el7           @base
#192.168.28.1是物理机VMware Network Adapter VMnet8的地址
[root@wenzi ~]# export DISPLAY=192.168.28.1:0.0

[root@wenzi ~]# system-config-kickstart

会出现图形化界面

踩坑:

若图形化界面出现乱码

将Linux系统语言从 LANG="zh_CN.UTF-8" 修改为 LANG="en_US.UTF-8"

3、设置安装选项

 

 

 

centos7默认网卡名为ens33。若此处写为eth0,需要修改内核参数 net.ifnames=0,使用网卡传统命名方式 eth0

 

 

 

 

 

选择安装的软件包,以Web Server为例。

 

踩坑:

点击Package Selection右侧加载不出列表,修改文件 vim /etc/yum.repos.d/CentOS-Base.repo 为下图样式。注释掉[base],添加[development];重新system-config-kickstart即可

下图中注意yum源的写法,$releasever等变量前要加转义符

点击左上方File-save保存至系统中,查看ks.cfg文件内容即安装过程配置,还可继续手动修改该文件,比如将时区timezone Africa/Abidjan 改为 timezone Asia/Shanghai

对图形界面配置的修正,否则使用该ks.cfg文件安装系统会启动失败:

bootloader --append="net.ifnames=0" --location=mbr --boot-drive=sda

[root@wenzi ~]# ll
total 8
-rw-------. 1 root root 1333 Aug 11 04:39 anaconda-ks.cfg
-rw-r--r--  1 root root 1580 Aug 12 10:56 ks.cfg

[root@wenzi ~]# cat ks.cfg
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password
rootpw --plaintext admin
# System language
lang en_US
# System authorization information
auth  --useshadow  --passalgo=sha512
# Use text mode install
text
firstboot --disable
# SELinux configuration
selinux --disabled


# Firewall configuration
firewall --disabled
# Network information
network  --bootproto=dhcp --device=eth0
# Reboot after installation
reboot
# System timezone
timezone Asia/Shanghai
# Use network installation
url --url="http://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/"
# System bootloader configuration
bootloader --append="net.ifnames=0" --location=mbr --boot-drive=sda
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --fstype="ext4" --size=1024
part swap --fstype="swap" --size=2048
part / --fstype="xfs" --grow --size=1

%post
useradd wenzi
echo admin | passwd --stdin wenzi

mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/* /etc/yum.repos.d/backup
cat > /etc/yum.repos.d/Base.repo <<EOF
[development]
name=CentOS-\$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/\$releasever/os/\$basearch/
        http://mirrors.aliyuncs.com/centos/\$releasever/os/\$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/\$releasever/os/\$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

EOF

yum -y install vim
%end

%packages
@web-server

%end

使用应答文件

在centos7上把ks,cfg文件共享,可通过物理机浏览器进行访问测试,能看到文件内容成功

[root@wenzi ~]# yum -y install httpd

[root@wenzi ~]# mv ks.cfg /var/www/html/
[root@wenzi ~]# systemctl start httpd

新建一台虚拟机,在启动时指定应答文件。在开机进入读条界面时按ESC进入下面流程

在下面界面选中第二个,按ESC

进入此界面后输入 linux ks=http://192.168.28.141/ks.cfg 然后回车开始安装

centos6、centos7、centos8三个系统的kickstart文件各有不同,不可混用。各自最小化安装的kickstart文件可参考自动安装的应答文件 - 运维派

实现基于ISO文件的Linux半自动化安装

centos8准备工作

centos8地址 192.168.28.151

#安装httpd,作为系统镜像、kickstart应答文件网络存放地址

[root@wenzi ~]# dnf -y install httpd

[root@wenzi ~]# systemctl start httpd

一、定制kickstart应答文件

[root@wenzi ~]# cp anaconda-ks.cfg centos8_ks.cfg
[root@wenzi ~]# vim centos8_ks.cfg
#version=RHEL8
#只使用系统中的第一块磁盘
ignoredisk --only-use=nvme0n1
#清除所有磁盘的分区表
zerombr
#文本方式安装
text
#graphical
#成功安装后重启
reboot
# 清除系统上所有分区
clearpart --all --initlabel
#关闭selinux
selinux --disabled
#关闭防火墙
firewall --disabled
#通过http远程服务器的目录树安装
url --url=http://192.168.28.151/centos/8/
#键盘
keyboard --vckeymap=us --xlayouts='us'
#系统语言
lang en_US.UTF-8
#网络配置
network --bootproto=dhcp --device=ens160 --ipv6=auto --activate
#network  --bootproto=static --device=ens160 --gateway=192.168.28.2 --ip=192.168.28.152 --nameserver=223.5.5.5,180.76.76.76 --netmask=255.255.255.0 --ipv6=auto --activate
#主机名
network  --hostname=wenzi
#root加密后的密码
rootpw --iscrypted $6$CEK/siEJwPyzpudd$cJ/rz9oiqDmc8LmI1uZmI8BRFxje4OnuGS0qLBRZ4cAFWqKg482sPuN1BstCMY62NN58ivBzZ.bGD.0QFaYnf/
# Run the Setup Agent on first boot
firstboot --enable
#不启动图形化
skipx
#开机时启动或关闭的服务
services --disabled="chronyd"
#系统时区
timezone Asia/Shanghai --isUtc --nontp
#分区信息
part /boot --fstype="ext4" --ondisk=nvme0n1 --size=1024
part /swap --fstype="swap" --ondisk=nvme0n1 --size=2048
part / --fstype="xfs" --ondisk=nvme0n1 --grow --size=1  #根分区/使用磁盘剩余的所有空间#需要的安装包
%packages
@^minimal-environment
kexec-tools
vim
%end%addon com_redhat_kdump --enable --reserve-mb='auto'%end%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

二、定制启动菜单

centos8安装autofs启动后会自动出现/misc目录。

在虚拟机设置中添加CD/DVD,使用系统ISO文件,登录系统后mount /dev/cdrom /misc

#创建定制ISO文件目录
[root@wenzi ~]# mkdir /data/myiso -p
[root@wenzi ~]# cp -r /misc/isolinux/ /data/myiso/
[root@wenzi ~]# tree /data/myiso/
/data/myiso/
└── isolinux├── boot.cat├── boot.msg├── grub.conf├── initrd.img├── isolinux.bin├── isolinux.cfg├── ldlinux.c32├── libcom32.c32├── libutil.c32├── memtest├── splash.png├── TRANS.TBL├── vesamenu.c32└── vmlinuz#编辑菜单文件
[root@wenzi ~]# vim /data/myiso/isolinux/isolinux.cfg
......
menu separator # insert an empty line
menu separator # insert an empty line#自动安装系统
label linuxmenu label ^Auto Install CentOS Linux 8 #菜单名字可自行修改kernel vmlinuz#指定应答文件路径append initrd=initrd.img quiet ks=http://192.168.28.151/centos8_ks.cfg#救援系统
label rescuemenu label ^Rescue a CentOS Linux systemkernel vmlinuz#指定救援系统路径append initrd=initrd.img rescue quiet inst.repo=http://192.168.28.151/centos/8#启动本地系统
label localmenu defaultmenu label Boot from ^local drivelocalboot 0xffffmenu separator # insert an empty line
menu separator # insert an empty line#返回主菜单
label returntomainmenu label Return to ^main menumenu exitmenu end#安装mkisofs工具
[root@wenzi ~]# dnf install genisoimage.x86_64
#创建自己的ISO文件,此条命令可通用,只修改路径即可
[root@wenzi ~]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 8.0 x86_64 boot" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso  /data/myiso/#boot.iso即是生成的定制ISO文件
[root@wenzi ~]# ls
anaconda-ks.cfg  boot.iso  centos8_ks.cfg

三、将系统镜像资源、kickstart应答文件部署至httpd

[root@wenzi ~]# mv centos8_ks.cfg /var/www/html/centos8_ks.cfg
[root@wenzi ~]# chmod 644 /var/www/html/centos8_ks.cfg
[root@wenzi ~]# mkdir /var/www/html/centos/8 -p
[root@wenzi ~]# mount /dev/cdrom /var/www/html/centos/8/
[root@wenzi ~]# ll /var/www/html/
total 4
drwxr-xr-x 3 root root   15 Aug 13 10:56 centos
-rw-r--r-- 1 root root 1719 Aug 13 17:11 centos8_ks.cfg
[root@wenzi ~]# systemctl restart httpd

通过浏览器访问测试

将boot.iso传送至物理机,新建虚拟机,使用boot.iso,选择第一个Auto Install Centos Linux 8,静等安装完毕出现登录界面即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/39506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

青翼科技自研2路250MSPS DA回放FMC子卡模块

FMC150_V30是一款基于VITA57.1规范的2路125MSPS采样率16位分辨率AD采集、2路250MSPS采样率16位分辨率DA回放FMC子卡模块。该模块遵循VITA57.1规范&#xff0c;可直接与符合VITA57.1规范的FPGA载卡配合使用&#xff0c;板卡ADC器件采用ADI公司的AD9268芯片&#xff0c;板卡DAC器…

机器学习理论笔记(一):初识机器学习

文章目录 1 前言&#xff1a;蓝色是天的机器学习笔记专栏1.1 专栏初衷与定位1.2 本文主要内容 2 机器学习的定义2.1 机器学习的本质2.2 机器学习的分类 3 机器学习的基本术语4 探索"没有免费的午餐"定理&#xff08;NFL&#xff09;5 结语 1 前言&#xff1a;蓝色是天…

mac安装vscode 配置git

1、安装vscode 官网地址 下载mac稳定版安装很慢的解决办法 (转自) mac电脑如何解决下载vscode慢的问题 选择谷歌浏览器右上角的3个点&#xff0c;选择下载内容&#xff0c;右键选择复制链接地址&#xff0c;在新窗口粘贴地址&#xff0c; 把地址中的一段替换成下面的vscode.cd…

项目配置中心介绍

目录 什么是配置中心 为什么要有配置中心 配置中心的做法&#xff08;读取和通知&#xff09; 配置中心优点: 常用的配置中心中间件 什么是配置中心 配置中心就是用来管理项目当中所有配置的系统&#xff0c;也是微服务系统当中不可或缺的一部分。项目的配置文件不放到本地…

Servlet+JDBC实战开发书店项目讲解第四篇:登录实现

ServletJDBC 实战开发书店项目讲解第四篇&#xff1a;登录注册实现 在本篇博客中&#xff0c;我们将继续讲解 ServletJDBC 实战开发书店项目。这次我们将重点讲解如何实现登录和注册功能。 1. 创建数据库表 首先&#xff0c;我们需要在数据库中创建两个表&#xff0c;一个用…

[C++] 模板template

目录 1、函数模板 1.1 函数模板概念 1.2 函数模板格式 1.3 函数模板的原理 1.4 函数模板的实例化 1.4.1 隐式实例化 1.4.2 显式实例化 1.5 模板参数的匹配原则 2、类模板 2.1 类模板的定义格式 2.2 类模板的实例化 讲模板之前呢&#xff0c;我们先来谈谈泛型编程&am…

Qt读写Excel--QXlsx编译为静态库2

1、概述&#x1f954; 在使用QXlsx时由于源码文件比较多&#xff0c;如果直接加载进项目里面&#xff0c;会增加每次编译的时间&#xff1b; 直接将源码加载进项目工程中&#xff0c;会导致项目文件非常多&#xff0c;结构变得更加臃肿&#xff1b; 所以在本文中将会将QXlsx编译…

骨传导耳机头晕是怎么回事?骨传导耳机好不好

骨传导耳机在音频传输上采用了不同于传统耳机的方式。它们通过将声音振动传递到颞骨&#xff0c;然后通过骨骼传导到内耳&#xff0c;从而使用户能够听到音乐或声音。 然而&#xff0c;有些人在使用骨传导耳机时可能会感到头晕。这可能与以下几个原因有关&#xff1a; 1、刚开…

prometheusalert区分告警到不同钉钉群

方法一 修改告警规则 - alert: cpu使用率大于88%expr: instance:node_cpu_utilization:ratio * 100 > 88for: 5mlabels:severity: criticallevel: 3kind: CpuUsageannotations:summary: "cpu使用率大于85%"description: "主机 {{ $labels.hostname }} 的cp…

99%的Python用户都不知道的f-string隐秘技巧

f-string想必很多Python用户都基础性的使用过&#xff0c;作为Python3.6版本开始引入的特性&#xff0c;通过它我们可以更加方便地向字符串中嵌入自定义内容&#xff0c;但f-string真正蕴含的功能远比大多数用户知道的要丰富&#xff0c;今天我们就来一起get它们~ 「最基础用法…

ajax解析

Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于在不重新加载整个页面的情况下与服务器交换数据的技术。它通过异步的方式发送请求和接收响应&#xff0c;能够实现在后台与服务器进行数据交互&#xff0c;然后更新页面的部分内容&#xff0c;从而提升用…

【CI/CD】基于 Jenkins+Docker+Git 的简单 CI 流程实践(上)

基于 JenkinsDockerGit 的简单 CI 流程实践&#xff08;上&#xff09; 在如今的互联网时代&#xff0c;随着软件开发复杂度的不断提高&#xff0c;软件开发和发布管理也越来越重要。目前已经形成一套标准的流程&#xff0c;最重要的组成部分就是 持续集成 及 持续交付、部署。…

GPU编程基础-CUDA实现图像处理

GPU编程基础-CUDA实现图像处理 1. 相关基础概念1.1 Host和Device程序1.2 Kernel程序1.3 SIMT和SIMD1.4 GPU计算的 Occupancy指标1.5 GPU计算的基本流程2. GPU计算框架与过程说明3. 一个基于CUDA的图像处理例子4. 一些报错解决1. 相关基础概念 1.1 Host和Device程序 在CPU上运行…

Effective C++学习笔记(7)

目录 条款41&#xff1a;了解隐式接口和编译多态条款42&#xff1a;了解typename的双重意义条款43&#xff1a;学习处理模板化基类内的名称条款44&#xff1a;将与参数无关的代码抽离templates条款45&#xff1a;运用成员函数模板接受所有兼容类型条款46&#xff1a;需要类型转…

opencv,opengl,osg,vulkan,webgL,opencL,cuda,osg,vtk,ogre的区别

OpenCV OpenCV是一个基于BSD许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C 类构成&#xff0c;同时提供了Python、Ruby、MATLAB等…

avue多选列表根据后端返回的某个值去判断是否选中;avue-curd多选回显

效果如上&#xff1a; getSiteList().then(res > {//列表数据this.siteData res.data.datathis.$nextTick(()>{this.siteData.forEach(item>{//业务条件if(item.configid&&item.configid!0&&item.configid>0){//符合条件时调用选中的方法this.$…

JAVASE---数组的定义与使用

数组的基本概念 什么是数组 数组是具有相同类型元素的集合&#xff0c;在内存中连续存储。 1. 数组中存放的元素其类型相同 2. 数组的空间是连在一起的 3. 每个空间有自己的编号&#xff0c;起始位置的编号为0&#xff0c;即数组的下标 数组的创建及初始化 数组的创建 T[…

mybatis高级特性

文章目录 数据库事务管理批处理插件扩展持久化和ORM缓存机制 数据库事务管理 通过注解方式&#xff1a; 在需要进行事务管理的方法上添加Transactional注解&#xff0c;该注解可以用于类或方法上。在配置文件中开启事务管理器&#xff0c;并指定事务管理器的类型和连接池等相关…

Java SpringBoot Vue智能停车系统

基础环境 JDK1.8、Maven、Mysql、IntelliJ IDEA 内置功能 系统管理&#xff1a;角色管理、接口管理、系统菜单、全局配置 账号管理&#xff1a;用户管理、合作单位 系统监控&#xff1a;监控大屏、日志监控 财务管理&#xff1a;订单列表 停车记录&#xff1a;停车记录 车辆管…

Labview选项卡之实现被选择选项卡工作

文章目录 前言一、使用选项卡二、实现被选择选项卡工作1、需求2、分析3、实现①、前面板②、程序框图 三、效果展示四、源码自取 前言 有些时候&#xff0c;我们做界面&#xff0c;需要好多个界面切换。如果是同一个 VI 里界面切换&#xff0c;一般都是选项卡了。切换不同选项…