1、概述
Anaconda是RedHat、CentOS、Fedora等Linux的安装管理程序。它可以提供文本、图形等安装管理方式,并支持Kickstart等脚本提供自动安装的功能。此外,其还支持许多启动参数,熟悉这些参数可为安装带来很多方便。该程序的功能是把位于光盘或其他源上的数据包,根据设置安装到主机上。为实现该定制安装,它提供一个定制界面,可以实现交互式界面供用户选择配置(如选择语言,键盘,时区等信息)。Anaconda的大部分模块用Python编写,有少许的载入模块用C编写。
Anaconda支持的管理模式:
(1)Kickstart提供的自动化安装;
(2)对一个RedHat实施upgrade;
(3)Rescuse模式对不能启动的系统进行故障排除。
要进入安装步骤,需要先有一个引导程序引导启动一个特殊的Linux安装环境系统;引导有多种方式:
(1)基于网络方式的小型引导镜像,需要提供小型的引导镜像;
(2)U盘引导,通过可引导存储介质中的小型引导镜像启动安装过程;  
(3)基于PXE的网络安装方式,要提供PXE的完整安装环境;
(4)其他bootloder引导(如GRUB)。
可用的安装方式:本地CDROM、硬盘驱动器、网络方式(NFS、FTP、HTTP)。
通过网络方式安装时,不论通过FTP、HTTP还是NFS方式共享安装,可以将安装光盘先拷贝到网络服务器上保存为iso镜像,然后loop挂载到共享目录或网页目录(当然,拷贝镜像中的所有文件到指定位置或直接挂载到共享目录也可),而通过NFS方式时,可以直接将光盘的iso文件放到共享目录即可,安装程序挂载共享目录后可以自动识别镜像。
注意思复制安装光盘,并保存为一个 iso 映像文件的方法(对于 DVD/CD):
# dd if=/dev/cdrom  of=/location/of/disk/space/RHEL.iso  bs=32k
注意拷贝时bs块大小设置为32k,我实验时设为1M,虽然减小了文件体积,但是安装读镜像时会报错。
对于Kickstart,它是一个利用Anconda工具实现服务器自动化安装的方法。通过生成的kickstart配置文件ks.cfg,服务器安装可以实现从裸机到全功能服务的的非交互式(无人值守式)安装配置;ks.cfg是一个简单的文本文件,文件包含Anconda在安装系统及安装后配置服务时所需要获取的一些必要配置信息(如键盘设置,语言设置,分区设置等)。Anconda直接从该文件中读取必要的配置,只要该文件信息配置正确无误且满足所有系统需求,就不再需要同用户进行交互获取信息,从而实现安装的自动化。但是配置中如果忽略任何必需的项目,安装程序会提示用户输入相关的项目的选择,就象用户在典型的安装过程中所遇到的一样。一旦用户进行了选择,安装会以非交互的方式(unattended)继续。使用kickstart可以实现流线化自动化的安装、快速大量的裸机部署、强制建立的一致性(软件包,分区,配置,监控,安全性)、以及减少人为的部署失误。
使用Kickstart方法安装的过程包括创建一个kickstart文件、创建有kickstart文件的引导介质或者使这个文件在网络上可用、筹备一个安装树、开始ks安装(anconda自身启动 -->选取ks安装模式--> 从ks文件读取配置 --> 最后安装)。创建kickstart配置文件可以使用任何文本编辑器,也可以使用图形化配置工具system-config-kickstat(需要安装system-config-kickstart.noarch包)。注意配置文件生成后,推荐使用ksvalidator命令检查配置文件语法及完整性错误,例如:
[root@bogon ~]# ksvalidator ks.cfg
not enough arguments for format string
Kickstart文件的语法及参数含义可参考 http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-options.html。
我们以RHEL 6.0的安装为例来分析Anaconda。为紧跟新版本,anaconda源码则使用较新的在Fedora 15中使用的版本。先从Fedora的下载站点镜像列表http://mirrors.fedoraproject.org/publiclist/中选择一个站点,例如上海交大镜像站点的/fedora/linux/releases/15/Everything/source/SRPMS/目录中下载用于Fedora 15的最新版anaconda源码包anaconda-15.31-1.fc15.src.rpm,还要准备好RHEL6.0的DVD安装光盘。
2、RedHat企业版6.0光盘的安装树介绍
(1)Packages目录:包含安装所需的所有二进制RPM包。
(2)HighAvailability、LoadBalancer、ResilientStorage、ScalableFileSystem、Server目录:五个文件夹包含了安装所需的所有RPM软件包信息。它们分别对应高可用性、负载均衡、弹性存储、可扩展文件系统、以及服务器基础的软件包信息。每个文件夹下都有一个Packages目录,它只是一个链接,指向顶级的../Packages目录。还有一个repodata目录,其中的类似于*-comps-rhel6-HighAvailability.xml的XML文件定义了对应特性的软件包信息,这些软件包被分成不同的组,每个组有一个ID。这样的repodata精确描述各个RPM包的详细信息,如依赖关系,包含文件,校验码信息等。可以通过在Kickstart文件的%packages段中指定组ID来安装相应组中的软件包。
(3)EFI目录:用于64位的基于EFI的系统引导。其中BOOT目录下的BOOTX64.conf为grub的配置文件,用于显示引导菜单。
(4)TRANS.TBL文件:记录当前目录的列表,用mkisofs的-T参数重新生成,主要是为了长文件名称。
(5).discinfo文件是安装介质的识别信息。.treeinfo文件记录不同安装方式安装程序所在的目录结构,如PXE方式时,内核kernel=images/pxeboot/vmlinuz,根文件系统initrd=images/pxeboot/initrd.img。
(6)isolinux目录:有开机引导系统安装的内核(vmlinuz)及RAM镜像(initrd.img),在引导系统时会载入内存,给系统的安装提供一个Linux安装引导平台,文件夹中还有在不同模式下显示信息的boot.msg文件,splash.jpg是特殊格式的引导过程背景图片(640*480)。安装时这个画面上的引导菜单内容在isolinux.cfg文件中指定。按Enter会自动进入图形界面安装模式,若按Esc,会显示"boot: "命令提示符,进入用户交互模式,界面上会有各种模式操作提示。键入"linuxtext",会进入文本安装模式。
(7)images目录:包含有各种引导镜像。最重要的是引导第二阶段安装需要用到的镜像文件install.img(rhel 5中是stage2.img),anaconda程序就在这个镜像文件中。另外还有用于制作微型启动光盘的boot.iso(为节省空间rhel 6.0中已经删除了,在rhel 5中是有的),有可放置于USB或其他大容量可引导介质的VFAT分区上,制作引导工具的镜像diskboot.img(rhel 5中有),也有用于制作PXE安装方式引导介质的pxeboot文件夹等。
3、Anaconda程序目录结构和源代码包概览
先用file命令查看install.img的文件系统类型,可知是suqashfs,用mount -o loop -t squashfs install.img ./img/的方式挂载出来。 除了主执行体/usr/bin/anaconda,其它安装脚本模块均在/usr/lib/anaconda主目录下。我们看一下整个anaconda主目录的结构:
/usr/bin/anaconda: 主程序,是python脚本。
/usr/lib/anaconda/installclasses: 定义了在安装过程中用户可选择的安装类型。每个安装类型描述文件根据相应安装类型的特点,分别对安装步骤、分区策略以及安装包的取舍给出了不同的方案。里面有两个文件fedora.py和rhel.py,分别针对fedora和rhel的安装类型。其他的Linux发行版可以定义它们自己的安装类型。
/usr/lib/anaconda/iw: 图形安装模式的模块。包含所有图形界面类所在的模块,每个图形界面对应一个类,负责相应安装步骤图形界面的具体外观显示及与用户的交互,(可能)调用anaconda主目录下的相关安装行为模块完成具体的安装操作。
/usr/lib/anaconda/storage: 存储配置的响应目录(如分区,FCOE, iSCSI, RAID, ZFCP的配置等)。
/usr/lib/anaconda/textw: 文本安装模式的模块。和iw子目录含义是一致的,只是包含的是文本安装模式的前端字符用户界面类所在的模块,每个字符用户界面对应一个类,负责与用户的交互,字符界面的采用了python的snack库。
/usr/lib/anaconda-runtime: 有init和loader程序。这是两个静态编译的程序,不依赖其他库,就是编译anaconda源代码目录下的loader目录下的C代码得到。这两个程序会放在最后用来启动安装过程的Linux initrd image里面。
/usr/anaconda主目录:如果说用户界面类是处理安装程序外观的话,则anaconda主目录下的各python模块执行每个安装界面背后具体的安装行为,包括那些无用户界面安装步骤的安装操作。
由此可见,主执行体/usr/bin/anaconda调用的大量例程分布在/usr/lib/anaconda目录下,安装过程要用到的资源文件(例如背景图片)则分布在/usr/share/anaconda目录下。Python的许多内置模块则在目录/usr/lib/pythonXX下,其中XX指版本号。
上面分析的是已经编译好的anaconda目录结构,现在概览一下anaconda源代码包的结构。Anaconda主要用Python编写,图形界面前端用pyGtk库(参考http://www.pygtk.org/)和Glade界面描述文件(参考http://glade.gnome.org/)编写。用来启动环境、加载模块、加载anaconda主体的loader程序用C编写,一些其他的硬件相关的部分也是用C编写。另外,bash和python脚本还用在一些管理性的任务中。
Aanaconda核心的源代码主要有:
(1)界面(Interface)
pyanaconda/cmdline.py
pyanaconda/gui.py
pyanaconda/installinterfacebase.py
pyanaconda/text.py
这些文件处理用户界面。anaconda支持3种用户界面,即图形、文本、命令行模式。每种模式的相应实现文件都包含用来画出各种窗体的类。
data/ui
pyanaconda/iw/
pyanaconda/textw/  
iw目录包含图形界面屏幕的python文件,textw目录包含文件界面屏幕的python文件,ui目录包含图形模式所需的glade界面描述文件。通常开发者尽可能多地移除文本模式,把更多地东西移到图形界面,以便能使用glade。
pyanaconda/dispatch.py
调度器类Dispatcher是一个状态机,用来控制安装器中各步骤的移动。当一个Next或Back按钮被单击时,调度器知道要跳转到哪个屏幕,也知道根据相应的设置哪一步应该被忽略而直接跳过。每种安装模式都有它自己的要跳过或被添加返回的步骤集。Install类也可以指定需要跳过或需要添加的步骤。各种其他的与机器相关的细节,如anaconda检测和用户选择能够修改步骤集。
pyanaconda/vnc.py
用于控制对VNC进行设置(当在安装过程中请求了VNC时)。之后,安装进入图形模式。
(2)分区(Partitioning)
pyanaconda/storage/dasd.py
pyanaconda/storage/devicelibs/
pyanaconda/storage/fcoe.py
pyanaconda/storage/iscsi.py
pyanaconda/storage/zfcp.py
这些文件处理探测、配置、启动和停止anaconda支持的高级存储系统。这既包括硬件设备(FCOE, iSCSI, RAID, ZFCP等),也包含软件抽象(加密,逻辑卷管理lvm等)。其中LVM和RAID使用最普遍。
pyanaconda/storage/formats/  
这个目录下的文件用来将一些文件系统或类似于文件系统的抽象写到存储设备。你可以把它看作是在pyanaconda/storage/devicelibs/之上的一层。类似于文件系统的抽象包括硬盘卷标、加密、与机器相关的引导分区、交换分区。
pyanaconda/partIntfHelpers.py
用来进行错误检查、输入验证、显示错误消息。图形和文本模式都要用到它。
pyanaconda/storage/__init__.py
pyanaconda/storage/errors.py
pyanaconda/storage/miscutils.py
pyanaconda/storage/size.py
pyanaconda/storage/storage_log.py
pyanaconda/storage/udev.py
这些文件形成存储模块的一个支持库,完成不适合分在其他组中的一些细小任务。从文件名即可看出其功能。__init__.py完成大部分的工作,包括读写存储相关的配置文件、检测现存的安装、各存储动作的协作、聚焦不同存储对象的数据、执行完整性检查。
pyanaconda/storage/deviceaction.py
pyanaconda/storage/devices.py
pyanaconda/storage/devicetree.py
pyanaconda/storage/partitioning.py
pyanaconda/storage/partspec.py
这组文件实现分区逻辑。它们使用DeviceTree抽象来存放现存的分区和请求、定义把存储请求写到硬盘的行为、处理自动分区(为默认方式)、并且知道怎么调整分区大小,以符合给定的分区容量。硬盘上分区的创建使用pyparted包来完成。
(3)引导器(Bootloader)
pyanaconda/bootloader.py
pyanaconda/booty/
这些文件控制把bootloader写到安装后的系统里。每种类型的机器有它自己的bootloader格式,因此在booty/目录下有相应的文件,bootloader.py则把它们粘合到一起。这对新的安装和更新非常有用。
(4)配置(Configuration)
pyanaconda/desktop.py
pyanaconda/firewall.py
pyanaconda/language.py
pyanaconda/network.py
pyanaconda/security.py
pyanaconda/timezone.py
pyanaconda/users.py
这些文件处理相关配置,这些配置步骤可以通过图形界面或kickstart进入。某种程度上它们影响安装过程(例如语言和键盘设置)。但是它们的主要目的是在安装过程的最后把这些配置写到安装后的系统里去。
(5)软件包安装(Package Installation)
pyanaconda/compssort.py
pyanaconda/backend.py
pyanaconda/image.py
pyanaconda/sortedtransaction.py
pyanaconda/yuminstall.py
这些文件控制软件包的安装。anaconda允许在后端安装多个软件包,虽然在安装树中某一时刻真正只有一个在使用yum、写入安装包的配置。
(6)安装类型(Installation Classes)
pyanaconda/installclass.py
pyanaconda/installclasses/
pyanaconda/product.py
安装类型定义形成一种安装轮廓的配置。这包括要显示或跳过的步骤、产品名称、安装方法、激活的库、配置设置等。这里主要用它来创建针对Fedora和RHEL的不同安装类型,其他的项目或ISV可以定义它们自己的安装类型。
(7)特殊模式(Special Modes)
pyanaconda/kickstart.py
Kickstart是一种通过给anaconda提供一个文件以实现自动化安装的方式。这个文件包含用户通过UI需要提供的所有数据。这个文件是解析器(在pykickstart包中)和anaconda内部构件之间的接口。它主要提供在anaconda期望的地方保存设置的方法。
data/icons
data/liveinst
liveinst/
pyanaconda/livecd.py
这些文件实现从Live CD安装。它们提供一种特殊的安装方法、一个特殊的软件包安装后端、以及一些用来从Live CD桌面上加载安装器的文件。
pyanaconda/rescue.py
pyanaconda/upgrade.py
这些文件提供与恢复模式和更新相关的方法。
(8)库(Library)
pyanaconda/__init__.py
pyanaconda/anaconda_log.py
pyanaconda/backend_log.py
pyanaconda/baseudev.py
pyanaconda/constants.py
pyanaconda/errors.py
pyanaconda/exception.py
pyanaconda/flags.py
pyanaconda/installmethod.py
pyanaconda/isys/
pyanaconda/iutil.py
pyanaconda/packages.py
pyanaconda/platform.py
pyanaconda/pyudev.py
pyanaconda/simpleconfig.py
pyanaconda/sitecustomize.py
pyanaconda/xutils.c
这组文件提供在安装器中使用的各种杂项功能,包括日志框架、硬件检测(通过udev接口)、进程控制、异常处理,以及其他任务。
(9)主程序(The Main Program)
anaconda
这是anaconda主程序,在源代码包的顶级目录中。它处理大量的环境设置、激活更新(如果存在)、读取kickstart文件、设置VNC,等等。当所有这些任务完成后,它把控制权交给dispatcher,以处理其余的安装过程。
(10)安装映像文件的构建(Image Building)
data/bootdisk/
data/command-stubs/
data/fonts/
scripts/
utils/
这些目录下的代码用来控制怎么建立安装环境,这包括创建初始ramdisk和stage2映像,添加某些必需命令的基本版,分割安装树为媒介大小的块,以及其他一些杂项任务。
(11)anaconda加载器(Loader)
loader/
该目录下的C代码实现initrd.img中的/init程序(实为指向/sbin/init程序)和/sbin/loader程序,loader程序用来加载主程序anaconda。
4、Anaconda启动分析
从“Linux内核启动过程分析”一节中我们知道,当开机从OS光盘启动,会先加载isolinux下可执行的内核映像vmlinuz,在内存中建立一个虚拟的根文件系统(rootfs),然后内核加载初始RAM磁盘initrd.img,建立一个安装Linux所需要的系统环境,这就是所谓的第一阶段。内核最后会运行initrd.img中的/init程序,由它来启动第二阶段的安装过程,即加载系统安装程序anaconda,执行具体的安装过程。注意如果通过网络方式安装(如NFS方式),则会根据安装树的NFS路径,通过mount把vmlinuz和initrd.img挂载到本地,像访问本地文件一样访问远程文件,以建立安装环境(在具体运行某个文件时会从网络下载到本地)。
initrd.img通常是一个用gzip压缩的cpio归档文件,需要加上.gz后缀并用gunzip解压成新的initrd.img,然后用cpio -i --make-directories < initrd.img释放其内容,生成一个小型的根文件系统。可以看到/init程序指向的是/sbin/init程序,里面还有loader程序,这就是编译anaconda源码时生成的两个程序。可见这个initrd.img中的/sbin/init程序是专门为anaconda定制的,常被称为installer类型的init。/sbin/loader程序可以看作是真正的anaconda自己的"init"程序,它由/init程序调用。
总结anaconda的两个阶段:
(1)第一阶段:加载安装树的isolinux目录下的内核映像vmlinuz和初始RAM磁盘initrd.img,建立安装环境。initrd.img中的/init程序调用/sbin/loader程序,loader加载kickstart文件,最后运行/usr/bin/anaconda主程序,进入第二阶段。
(2)第二阶段:anaconda程序加载各python和bash模块,执行各个安装步骤。
OK,分析的起点从loader/init.c的main函数开始。可以结合系统安装完后的anaconda log来分析,在/var/log下,主要有一般性的anaconda消息anaconda.log,由anaconda运行的所有外部程序信息anaconda.program.log,可扩展的存储模块信息anaconda.storage.log,网络接口配置相关信息anaconda.ifcfg.log,yum安装软件包的信息anaconda.yum.log,硬件相关的系统信息anaconda.syslog。注意如果系统安装失败,则这些文件的信息会一起放在一个anaconda-tb-identifier文件中,这里identifier是一个随机字符串。

    文件的调用顺序为isolinux/vmlinuz--->isolinux/initrd.img--->/init--->/sbin/loader--->imagaes/install.img--->/usr/bin/anaconda。以最新的Fedora 15使用的Anaconda 15.31版本为例(注意RHEL 6.0使用的是比这老的版本,为了跟踪前沿,这里使用比较新的版本),Anaconda主程序的启动流程如下:

/init (loader/init.c)--->setupEnv()		设置环境变量--->mount("/proc", "/proc", "proc",...)		挂载/proc文件系统--->mount("/dev", "/dev", "tmpfs",...)		创建/dev文件系统--->execl("/sbin/udevd", "/sbin/udevd",...)		启动udev--->mount("/sys", "/sys", "sysfs",...)		挂载/sys文件系统--->open("/dev/console", O_WRONLY)		打开控制台设备--->open("/dev/tty1", O_RDWR, 0)		打开tty1控制台,用于执行安装--->禁用Ctrl+Z、Ctrl+C等--->mount("/", "/", "ext2",...)		尝试重新挂载rootfs--->mount("none", "/tmp", "tmpfs",...)		挂载/tmp文件系统--->execve("/sbin/loader", argvc, env)	  根据选项参数运行loader程序,替换init进程/sbin/loader (loader/loader.c:main())--->解析运行loader的选项参数--->pyanaconda/isys/log.c:openLog()		打开log--->fopen("/dev/tty3","a")		在tty3上显示硬件相关消息--->fopen("/tmp/anaconda.log", "a")--->fopen("/tmp/program.log", "a") --->loader.c:parseCmdLineFlags()	解析/proc/cmdline中的内核命令行参数,以获取ks文件的nfs路径--->readNetInfo()		读取/tmp/s390net文件中的网络配置信息(如果存在的话)--->driverdisk.c:readModuleInfo(arg, modInfo,...)		读取/lib/modules/module-info中的模块信息--->loader.c:checkForRam(-1)		检查内存容量是否足够--->pyanaconda/isys/mem.c:totalMemory() --->open("/proc/meminfo", O_RDONLY)	获取meminfo中"MemTotal"一行中的数据(kB为单位)--->loader.c:loadScsiDhModules()	加载SCSI模块(读取/lib/modules/<ver>/kernel/drivers/scsi/device_handler/下的模块)--->modules.c:mlLoadModuleSet(modNames)		加载用:分隔的模块列表--->modules.c:_doLoadModule()--->modules.c:mlSaveModuleState()		保存预加载的模块状态--->modules.c:processModuleLines()		一行一行地处理每个模块--->fopen("/proc/modules", "r")		读取/proc/modules中的所有模块信息--->modules.c:cb_savestate()		保存当前模块状态--->hardware.c:busProbe()		探测总线以加载所有知道的硬件设备--->hardware.c:detectHardware()-->execv("/sbin/udevadm", args)		运行udevadm来加载设备--->driverdisk.c:loadDriverDiskFromPartition()	  加载自动检测到的第三方Driver Disk(如果有的话)--->loadDriverDisk(loaderData, "/tmp/drivers")		加载DD--->pyanaconda/isys/iface_start_NetworkManager()		启动NetworkManager--->execl(NETWORKMANAGER, NETWORKMANAGER,...) --->kickstart.c:getKickstartFile(&loaderData)		获取Kickstart文件并复制到/tmp/ks.cfg################################### NFS 方式 #####################################--->nfsinstall.c:kickstartFromNfs(c+4, loaderData)		从NFS获取ks文件--->nfsinstall.c:getFileFromNfs()--->net.c:kickstartNetworkUp()		启动网卡--->pyanaconda/isys/iface.c:iface_ip2str()		获取系统IP--->nfsinstall.c:parseNfsHostPathOpts()		解析NFS的url路径--->拷贝kickstart文件到本地################################## CD 方式 #######################################--->cdinstall.c:kickstartFromCD()		从光盘上获取ks文件ks.cfg--->kickstart.c:getKickstartFromBlockDevice()--->method.c:getFileFromBlockDevice()--->pyanaconda/isys/imount.c:doPwMount()	挂载光盘--->pyanaconda/isys/imount.c:mountCommandWrapper()--->execl("/bin/mount",...)######################################################################################--->kickstart.c:runKickstart()		运行Kickstart--->导入一些python库,如pykickstart.parser--->getObject()		创建KickstartParser对象--->preprocessKickstart()  预处理,执行与pykickstart.parser.preprocessKickstart类似的任务--->readKickstart()-->PyObject_CallMethodObjArgs()	  处理kickstart文件,解析各个属性并设置到parser对象上--->处理Kickstart数据                                  --->loadKickstartModule()		载入kickstart模块--->setKickstartNfs()		解析NFS路径中的主机IP、路径名、及选项参数--->setDisplayMode()		解析安装模式(文本、命令行、或图形模式)--->处理其他各项数据--->net.c:kickstartNetworkUp()		再次启动网卡--->chooseNetworkInterface(loaderData)		选择并启动可使用的网卡(如果有多个网卡)--->writeEnabledNetInfo()	把网卡信息写入/etc/tsysconfig/network-scripts/ifcfg-DEVICE--->loader.c:doLoaderMain()--->cdinstall.c:findInstallCD()		挂载光盘,加载images/install.img等(光盘安装情况)--->pyanaconda/isys/imount.c:doPwMount("/mnt/source","iso9660",...)--->STEP_LANG和STEP_KBD		设置安装语言和键映射(若从CD/DVD安装则跳过这两步)--->lang.c:setLanguage()和pyanaconda/isys/lang.c:isysLoadKeymap()--->STEP_METHOD和STEP_DRIVER等	  命令行模式下设置安装方法、驱动等(若为图形安装模式则跳过)--->selinux.c:loadpolicy()		加载SELinux策略--->execl("/sbin/load_policy",...)--->loader.c:spawnShell()		在tty2上打开Shell,这样在安装时可在tty2上登录--->open("/dev/tty2",...)--->execl("/bin/sh",...)--->execv(anacondaArgs[0], anacondaArgs)	开始运行/usr/bin/anaconda,替换当前进程
    执行到/usr/bin/anaconda,就是安装程序的主体了,这是一个python脚本。可见/init程序会初始化console,/dev文件系统,mount相应的目录等等。然后调用loader程序,就开始了安装过程。loader程序中会打开log、进行network interface的配置等相关工作,如果指定了网络上的kickstart文件,他也会下载下来保存为/tmp/ks.cfg ,然后从kickstart配置文件中获取到install.img所在的位置(如光盘或者NFS上)。如果install.img是在光盘上的话,会被挂载到/mnt/source目录下。   install.img里面的anaconda程序运行所需要的很多python支持库、*.so文件等也都是在这时mount过来,一般是复制到/lib 目录下,然后配置好LD_LIBRARY_PATH环境变量,这样主安装程序运行时候就可以找到库了。当然硬盘也会被mount到一个目录下,这样安装程序才能把OS文件及各个软件包都写到这个目录去。

5、Anaconda各模块分析
从没计角度看,整个安装程序分为三层,从上层往下层依次是前端显示、调度中心、安装行为。如下图所示。


图1 Anaconda体系结构
    Dispatcher类在主目录pyanaconda下的dispatch.py模块中,负责整个安装流程的控制,在安装过程中,某些安装步骤有的需要前置安装操作,有的又需要后置安装操作,而某些安装操作则是没有用户界面的,我们统称这些安装操作为无用户界面的安装操作,那么,这些没有用户界面的安装操作由谁来调度运行呢?答案就是Dispatcher。InstallControlWindow类控制安装过程中前端图形界面的显示,总体调度各个安装图形界面类,InstallControlWindow建立图形界面的主窗体,每个具体的图形安装界面可视为其子窗体。InstallControlWindow调用Dispatcher控制整个安装流程。安装过程中,每个具体的图形安装界面均对应一个具体的类,由其对应的具体的类完成具体的安装任务,我们将这些图形界面类归为前端显示层,位于iw目录下的模块中。
anaconda将某些用户界面类中的具体安装操作分离出来,放到了另外一些模块中,这些模块放在了anaconda的主目录pyanaconda下。由Dispatcher直接调用的没有用户界面的安装步骤对应的函数也放在了anaconda的主目录下,我们将这些模块归为安装行为层。
dispatch.py模块中有一个序列(sequence)数据结构:installSteps,如下所示:
installSteps = [("language", ),("keyboard", ),("betanag", betaNagScreen, ),("filtertype", ),("filter", ),("storageinit", storageInitialize, ),("findrootparts", findRootParts, ),("findinstall", ),("network", ),("timezone", ),("accounts", ),("setuptime", setupTimezone, ),("parttype", ),("cleardiskssel", ),("autopartitionexecute", doAutoPartition, ),("partition", ),("upgrademount", upgradeMountFilesystems, ),("restoretime", restoreTime, ),("upgradecontinue", queryUpgradeContinue, ),("upgradeswapsuggestion", upgradeSwapSuggestion, ),# ......]
    installSteps中记录了有序排列的整个安装过程中所有可能的安装步骤,在生成具体的Dispatcher实例时,会根据安装类型制定对此进行相应裁减。installSteps中的条目(item)有两种格式,即( name )或( name, Function )。name代表安装步骤的名称,Function指安装操作的具体执行函数,这个函数会直接由Dispatcher调用。所有的安装步骤都把anaconda对象作为唯一的参数,当我们调用这个Function时,这个参数就会传进去。
我们假设当前安装步骤为autopartitionexecute,如果熟悉linux安装过程,你应该可以猜出这个安装步骤是分区方式选择,对应该安装步骤的函数为storage/partitioning.py中的doAutoPartition函数,代码片断如下:
def doAutoPartition(anaconda):# ......if anaconda.storage.doAutoPart:(disks, devs) = _createFreeSpacePartitions(anaconda)if disks == []:if anaconda.ksdata:msg = _("Could not find enough free space for automatic ""partitioning.  Press 'OK' to exit the installer.")else:msg = _("Could not find enough free space for automatic ""partitioning, please use another partitioning method.")anaconda.intf.messageWindow(_("Error Partitioning"), msg,custom_icon='error')if anaconda.ksdata:sys.exit(0)anaconda.storage.reset()return DISPATCH_BACK_schedulePartitions(anaconda, disks)# sanity check the individual deviceslog.warning("not sanity checking devices because I don't know how yet")# run the autopart function to allocate and grow partitionstry:doPartitioning(anaconda.storageif anaconda.storage.doAutoPart:_scheduleLVs(anaconda, devs)# grow LVsgrowLVM(anaconda.storage)except PartitioningWarning as msg:if not anaconda.ksdata:anaconda.intf.messageWindow(_("Warnings During Automatic ""Partitioning"),_("Following warnings occurred during automatic ""partitioning:\n\n%s") % (msg,),custom_icon='warning')else:log.warning(msg)except PartitioningError as msg:# restore drives to original stateanaconda.storage.reset()if not anaconda.ksdata:extra = ""if anaconda.displayMode != "t":anaconda.dispatch.skipStep("partition", skip = 0)else:extra = _("\n\nPress 'OK' to exit the installer.")anaconda.intf.messageWindow(_("Error Partitioning"),_("Could not allocate requested partitions: \n\n""%(msg)s.%(extra)s") % {'msg': msg, 'extra': extra},custom_icon='error')if anaconda.ksdata:sys.exit(0)else:return DISPATCH_BACK# now do a full check of the requests(errors, warnings) = anaconda.storage.sanityCheck()if warnings:for warning in warnings:log.warning(warning)if errors:errortxt = "\n".join(errors)if anaconda.ksdata:extra = _("\n\nPress 'OK' to exit the installer.")else:extra = _("\n\nPress 'OK' to choose a different partitioning option.")anaconda.intf.messageWindow(_("Automatic Partitioning Errors"),_("The following errors occurred with your ""partitioning:\n\n%(errortxt)s\n\n""This can happen if there is not enough ""space on your hard drive(s) for the ""installation. %(extra)s")% {'errortxt': errortxt, 'extra': extra},custom_icon='error')## XXX if in kickstart we reboot#if anaconda.ksdata:anaconda.intf.messageWindow(_("Unrecoverable Error"),_("The system will now reboot."))sys.exit(0)anaconda.storage.reset()return DISPATCH_BACK
    主要执行的步骤包括创建空闲分区,运行autopart分配或增长分区容量,分区完整性检查等。
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. iview admin 使用mock.js模拟数据

    最近在使用ivew admin做项目,为了前后端分离使用mock模拟数据,记录步骤:1.文件结构:2.打开src / mock,新建文件glbr.js:3.编写需要模拟的数据结构:import Mock from mockjs import {doCustomTimes } from @/libs/util; export const getHospital = (req) => {let hos…...

    2024/5/1 12:51:48
  2. Linux驱动开发学习的一些必要步骤.

    1. 学会写简单的makefile2. 编一些应用程序,可以用makefile跑起来3. 学会写驱动的makefile4. 写一简单char驱动,makefile编译通过,可以insmod, lsmod, rmmod. 在驱动的init函数里打印hello world,insmod后应该能够通过dmesg看到输出。5. 写一完整驱动, 加上read, write…...

    2024/5/1 16:07:50
  3. C# zip压缩文件的功能

    using System; using System.Collections.Generic; using System.IO; using ICSharpCode.SharpZipLib.Checksums; using ICSharpCode.SharpZipLib.Zip;namespace BuildAssetBundle {public class ZipUtility{/// <summary> /// 所有文件缓存 /// </summary> Lis…...

    2024/5/1 6:43:41
  4. 修改后的取得汉字首字母的lazarus函数,可以自己增加疑难汉字,这个应该比较理想了

    前面要引用:LazUTF8function getPinYinCode(const input:string):string; varpinyintable: TStrings;i,j:integer;uChar: string; beginresult:=;pinyintable:=TStringList.Create;pinyintable.Append(A阿啊锕嗄厑哎哀唉埃挨溾锿鎄啀捱皑凒溰嘊敳皚癌毐昹嗳矮蔼躷噯藹譪霭靄艾…...

    2024/5/1 16:26:28
  5. hbase笔记---新版api之对表的操作,指定region创建,普通创建,删除,修改列族信息

    hbase 对于表的相关操作: 实现功能有:指定region创建,普通创建,删除,修改列族信息package learm.forclass.testclass;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescript…...

    2024/5/1 11:48:23
  6. wordpress 靶机渗透

    人过留名,雁过留声 人生天地间,凡有大动静处 必有猪头环境准备VMware workstation Pro12 Kali 虚拟机 (攻击机IP:10.10.16.133) Wordpress 虚拟机 (靶机IP:10.10.16.135) NAT 网络模式安装靶机 在导入靶机的时候出现版本不兼容的现象。用记事本打开靶机安装包里面的 .v…...

    2024/5/1 7:57:32
  7. iOS的url编码和解码

    1.url编码ios中http请求遇到汉字的时候,需要转化成UTF-8,用到的方法是:NSString * str = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];2.url解码请求后,返回的数据,如何显示的是这样的格式:%3A%2F%2F,此时需要我们进行UTF-8解码,用到…...

    2024/4/17 21:31:31
  8. Inno Setup 制作安装程序[支持静默安装.NET环境]

    1.贴源码 ; 脚本由 Inno Setup 脚本向导 生成!; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #define MyAppName "TestSet"#define MyAppVersion "1.0"#define MyAppPublisher "ZCF"#define MyAppURL "http://www.zcfsky.com…...

    2024/4/17 12:07:13
  9. ClouderaManager java api 有关查询api 使用。

    首先pom中加上此依赖:<dependency><groupId>com.cloudera.api</groupId><artifactId>cloudera-manager-api</artifactId><version>5.14.2</version><dependency><groupId>ch.qos.logback</groupId><artifactI…...

    2024/4/17 12:05:54
  10. Java--使用Base64编码对url传值

    有些时候我们可能需要把信息通过url传递,但是url中出现特殊字符如空格,#,&等符号会使原有的信息失真,还有当传递密码等重要信息的时候可能就需要更复杂的加密解密算法。 这里使用的apache commons项目下的一个改进的base64算法,专门对url重新编码和加密的,如果要是…...

    2024/4/17 12:06:25
  11. EasyUI 中combobox利用拼音进行检索

    combobox利用拼音进行检索准备工作 需要一个pinyin.js代码如下:var arrInitialChart = new Array();arrInitialChart[0]="伌侒俺傲僾儑凒凹厑厫哀哎唉唵啀啊啽嗄嗌嗳嗷嗸嘊噯坳垇垵埃埯堓塧壒奡奥奧婩媪嫒嫯嬡安岇岙岰岸峖嶅嶴庵廒愛慠懊懓扷按挨捱揞擙敖敳昂昹昻暗暧曖枊…...

    2024/5/1 14:55:14
  12. 【20190307】第一个微信小程序

    注:本材料来自微信官方教程,有部分删改 本次实验介绍如何创建第一个小程序,包括新建项目、真机预览和调试、代码提交等内容;然后分析小程序的目录结构。 开发小程序的第一步,你需要拥有一个小程序帐号,通过这个帐号你就可以管理你的小程序。 1. 申请帐号 点击:https://m…...

    2024/4/11 14:29:02
  13. Java 使用 org.apache.tools.zip.* 压缩文件源代码

    Java 使用 org.apache.tools.zip.* 压缩/解压缩文件源代码Java 使用 org.apache.tools.zip.* 压缩/解压缩文件的源代码。本源码支持中文路径和中文文件名;解决了压缩后有一个多余同名文件夹的 bug、压缩后用 7-zip 打开时根目录下的文件名前有“\”的 bug。package com.defond…...

    2024/4/20 2:54:32
  14. ruby URL编码函数

    方法一: require erb puts ERB::Util.url_encode(http://www.qq.com?id=1&name=2)方法二: require uri a = URI::encode(李世民) puts a puts URI::decode(a)...

    2024/4/18 18:35:30
  15. 精仿今日头条微擎小程序手工安装的方法

    适用对象:已经安装微擎【精仿今日头条】公众号版的用户小程序源码百度网盘下载:https://pan.baidu.com/s/1i69MXz3你也可以加入QQ群,在群共享那里下载需要提前准备:1、通过上面的任何一个地址,下载小程序源码2、已经安装微擎精仿今日头条公众号版(小程序后台),如果没有…...

    2024/4/19 9:45:02
  16. 开启dubbo之旅——Dubbo Admin(新版)

    正经学徒,佛系记录,不搞事情根据dubbo官网的指示,来到了Dubbo ops,这个其实可以理解为zookeeper的可视化界面,就像是springcloud的eureka提供的可视化界面,可以直观监控系统的各个服务器情况,既然是监控,那意思就是非必需品,所以看心情使用。话不多说,先到官网提供的…...

    2024/4/18 21:02:25
  17. 复习题

    cookie Cookie是由服务器端生成的,发送给User-Agent(一般是浏览器),(服务器告诉浏览器设置一下Cookie),浏览器会将cookie以key/value 的形式保存在某个目录下的文本文件内,下一次请求同一网站时就发送该Cookie服务器(前提是浏览器设置Cookie) 为什么会有Cookie? htt…...

    2024/4/17 12:06:19
  18. php中文转拼音

    /*** 中文转拼音 (utf8版,gbk转utf8也可用)* @param string $str utf8字符串* @param string $ret_format 返回格式 [all:全拼音|first:首字母|one:仅第一字符首字母]* @param string $placeholder 无法识别的字符占位符* @param string $allow_chars 允许的非中文字符…...

    2024/4/27 8:03:12
  19. 微信小程序解码工具

    项目地址 & 个人博客 起因 前段时间想学习微信小程序开发但是又没有什么深厚前端功底,看到很多很好玩的小程序想要做一个类似的学习学习,所以想着借鉴一下现有的小程序。但是苦于没有源码,抓包也没有办法获取源码。 google后知道可以用安卓模拟器安装微信然后安装小程序…...

    2024/4/17 21:48:16
  20. Hadoop开发常用的API汇总

    HDFS JAVA APIversion 273 HBASE JAVA APIversion 124 MAPREDUCE JAVA APIversion 273HDFS JAVA API(version 2.7.3)HDFS 分布式文件系统JAVA API。与local的java 文件系统的API类似。NameDescriptionorg.apache.hadoop.conf.configurationhadoop中java API使用最多的一个类,很…...

    2024/4/17 12:07:07

最新文章

  1. Scala 多版本下载指南

    Scala&#xff0c;这一功能丰富的编程语言&#xff0c;结合了面向对象和函数式编程的精华&#xff0c;为开发者提供了强大的工具来构建高效、可扩展的应用程序。随着Scala社区的不断壮大和技术的演进&#xff0c;多个版本的Scala被广泛应用于不同的项目与场景中。本文旨在为您提…...

    2024/5/1 16:57:05
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. DevOps三步法之反馈:流动是油门,反馈是刹车

    打个比方&#xff0c;流动是油门&#xff0c;反馈是刹车。流动是关于行使&#xff0c;反馈是关于安全。车辆要想持续平稳运行&#xff0c;需要油门与刹车良好配合&#xff0c;否则就有可能车毁人亡。核电站需要使核反应处于临界状态&#xff0c;超出临界状态就是核爆炸这也需要…...

    2024/4/30 6:15:51
  4. 基于单片机的数字万用表设计

    **单片机设计介绍&#xff0c;基于单片机的数字万用表设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的数字万用表设计概要是关于使用单片机技术来实现数字万用表功能的一种设计方案。下面将详细概述该设计的各个…...

    2024/5/1 13:21:23
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57