CentOS(RHEL)系列操作系统的启动流程: Intel X86兼容架构

Linux的系统组成: 内核+应用程序(GNU/Linux): 单纯的指Linux内核

从硬盘存储和启动操作系统的角度:

+根文件系统(rootfs)

内核功能: 进程管理,文件系统管理内存管理网络协议驱动程序安全功能Linux系统的系统运行环境可以分为两部分内核空间: 内核代码(系统调用)

就是内核进程占用的cpu和内存资源的总和;

用户空间: 应用程序(进程或线程就是各种存储于文件系统中的应用程序在发起为进程或线程之后占据的操作系统内核的设计流派单内核设计所有的功能全部几种于同一个程序; 运行时表现为一个进程Linux就是单内核设计原因: 我们不需要Linux成为最先进的我们只是要使用它.)

微内核设计每种功能使用一个单独的子系统来实现Windows,Solaris都是微内核设计

Linux内核的特点单内核+模块化: 内核之中的功能+各个模块提供的功能之和为了能够提效会为速度比较慢的IO设备提供缓冲和缓存Linux内核的组成部分内核核心文件: /boot/vmlinux-VERSION-release

CentOS5: /boot/vmlinux-2.6.18-398.el5

CentOS6: /boot/vmlinux-2.6.32-573.el6.x86_64

CentOS7: /boot/vmlinux-3.10.0-327.el7.x86_64

最新的内核版本: 4.17

内核模块文件: /lib/modules/KERNEL_VERSION/kernel/

ramdisk:

CentOS5: /boot/initrd-2.6.18-398.el5.img

CentOS6: /boot/initramfs-2.6.32-573.el6.x86_64.img

ramfs:

CentOS7: /boot/initramfs-3.10.0-327.el7.x86_64.img

生成ramdisk的工具CentOS5/6:mkinitrd

CentOS7:dracutmkinitrd

ramdiskramfs的区别ramdisk:双缓冲和双缓存

ramfs:提效避免双缓冲和双缓存

CentOS系列操作系统的启动流程(2)

整个系统启动的流程基本可以分为POST-->MBR(GRUB)-->Kernel-->Init-->Runlevel

BIOS(BasicInput/Output System):

基本输入输出系统改系统存储于主板的ROM芯片上计算机在开机时会最先读取该系统然后会有一个加电自检过程这个过程其实就是检查cpu和内存计算机最基本的组成单元(控制器运算器和存储器),还会检查其他硬件若没有异常就开始加载BIOS程序到内存中. BIOS主要的一个功能就是存储了磁盘的启动顺序会按照启动顺序去查找第一个磁盘头的MBR信息并加载和执行MBR中的Bootloader程序若第一个磁盘不存在MBR,则会继续查找第二个磁盘(PS: 启动顺序可以在BIOS的界面中进行设置一旦BootLoader程序被检测并加载内存中就将控制权交给了BootLoader程序.

MBR(Master BootRecord):

主引导记录存储于磁盘的头部大小为512bytes,启动用于存储用于存储分区表信息最后2bytes用于MBR的有效行检查GRUB(GrandUnified Bootloader):

多系统启动程序其执行过程可分为三个步骤Stage1:这个其实就是它的主要工作就是查找并加载第二段(stage2),但系统在没启动时根本找不到文件系统也就找不到stage2所存放的位置因此就有了stage1_5

Stage1_5:该步骤就是为了识别文件系统

Stage2:GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息然后开始加载Kernel程序kernel程序被检测并加载到内存中就将控制权交给 PS:实际上这个步骤/boot还没被挂载直接识别grub所在磁盘的文件系统所以实际上应该是/grub/grub.conf文件改配置文件的信息如下:

grub.conf:
#boot=/dev/sda
default=0 #
设定默认启动的title的编号,从0开始
timeout=5 #等待用户选择的超时时间
splashimage=(hd0,0)/boot/grub/splash.xpm.gz #GRUB的背景图片
hiddenmenu #隐藏菜单
title CentOS (2.6.18-194.el5PAE) #内核标题
root (hd0,0) #内核文件所在的设备
kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ #内核文件路径以及传递给内核的参数
initrd /initrd-2.6.18-194.el5PAE.img#ramdisk文件路径

Kernel

内核Linux系统最主要的程序实际上的文件很小只保留了最基本的模块并以压缩的文件形式存储在硬盘中GRUBKernel读进内存内存开始解压内核文件. 将内核启动应该先讲下initrd这个文件initrd(InitialRAM disk),它在stage2这个步骤就被拷贝到了内存中这个文件实在安装系统时产生的是一个临时的根文件(rootfs). 因为Kernel为了精简只保留最基本的模块上并没有各种硬件的驱动程序也就无法识别rootfs所在的设备故产生了该文件装载了必要的驱动模块Kernel启动时可以从initrd文件中装载驱动模块直到挂载真正的rootfs,然后将initrd从内存中移除Kernel会以只读方式挂载根文件系统当根文件系统被挂载后开始装载第一个进程(用户空间的进程执行/sbin/init之后就将控制权交给init程序Init

初始化该程序就是进行OS初始化操作实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行第一个被执行的脚本为/etc/rc.d/rc.sysinit,这个是真正的OS初始化脚本简单讲下这个脚本的任务1.激活udevselinux;

2.根据/etc/sysctl.conf文件来设定内核参数3.设定系统时钟4.装载硬盘映射 5.启动交换分区6.设置主机名7.根文件系统检测并以读写方式重新挂载根文件系统8.激活RAIDLVM设备9.启动磁盘配额 10.根据/etc/fstab,检查并挂载其他文件系统11.清理过期的锁和PID文件执行完后根据配置的启动级别执行对应目录底下的脚本最后执行/etc/rc.d/rc.local这个脚本至此系统启动完成Runlevel

runlevel,运行级别不同的级别会启动的服务不一样会根据定义的级别去执行相应目录下的脚本的启动级别分为以下几种0:关机

1:单一用户模式(直接以管理员身份进入2:多用户模式(无网络3:多用户模式(命令行4:保留

5:多用户模式(图形界面 6: 重启

在不同的运行级别下这个脚本会分别执行不同目录下的脚本

Runlevel 0 - /etc/rc.d/rc0.d/

Runlevel 1 - /etc/rc.d/rc1.d/

Runlevel 2 - /etc/rc.d/rc2.d/

Runlevel 3 - /etc/rc.d/rc3.d/

Runlevel 4 - /etc/rc.d/rc4.d/

Runlevel 5 - /etc/rc.d/rc5.d/

Runlevel 6 - /etc/rc.d/rc6.d/

这写目录下的脚本只有K*S*开头的文件开头的文件为开机需要执行关闭的服务开头的文件为开机需要执行开启的服务CentOS 5SysV Init的工作过程CentOS 5 SysVInit:

运行级别(run level): 为了系统的运行或维护等目的而设置的管理机制0-6:七个运行级别#0 - 关机 # 1 - 单用户模式(Single user mode),root,无需验证; 维护模式#2 - 多用户模式(Multiuser),会启动网络功能; 但不会启动NFS,维护模式#3 - 多用户模式(Full multiuser mode),完全的功能模式仅使用CLI,不激活GUI;

#4 - 预留级别目前无特别使用的目的; 但是习惯上认为与3运行级别相同#5 - 多用户模式默认激活GUI默认使用的是#6 - 重启通常会使用3,5运行级别作为此次系统启动的默认运行级别查看当前系统的运行级别who-r

runlevel

切换运行级别init[0-6]

Init的配置文件: /etc/inittab,此配置文件有如下功能1.在整个系统初始化的过程中要做哪些任务启动或关闭哪些后台服务如何进行系统初始化在验证用户的身份无误之后如何为用户提供登陆提示符还要区分是图形界面还是文件界面当备用电源失效或重新生效时如何指挥系统操作定义了按下"Ctrl+Alt+Del"组合键时系统将采取什么行为2.所有规定的任务如何执行每一行定义一种操作格式如下id:runlevels:action:process

id:一种操作的唯一标识符1#,id,pf,pr,#,x,

runlevels:指定任务执行所依赖的运行级别####,留空

action: 在何种条件下启动此任务wait:等待切换至此任务所在的运行级别时运行一次respawn:一旦此任务结束就自动重新启动此任务initdefault:用于设定默认的运行级别通常后面的process省略

sysinit:设置系统初始化的方式一般情况下此处运行/etc/rc.d/rc.sysinit脚本

此文件的功能如下1.设置主机名称2.设置启动的欢迎信息3.激活SELinux

4.挂载/etc/fstab文件中定义的所有有效文件5.激活各个swap设备6.检测并且以读写的方式重新挂载rootfs;

7.设置系统时间8.根据/etc/sysctl.conf文件设置内核参数9.激活lvm和软RAID等高级逻辑设备10.加载额外的设备的驱动程序11.完成清理工作/etc/rc.d/rc,sans-serif;">根据特定的运行级别启动或关闭/etc/rc.d/rd$runlevel.d/*

K*:要停止的服务; K字母后面的两位数字表示优先级; 数字越小优先级越高; 依赖其他服务的服务应该优先关闭被其他服务依赖的服务应该稍后关闭S*:要启动的服务; S字母后面的两位数字表示优先级; 被其他服务依赖的服务应该优先启动依赖其他服务的服务应该稍后启动rc脚本可以接受一个运行级别作为其参数运行内容的 其脚本框架:

foriin/etc/rc.d/rc#.d/K*;do
$istop
done
foriin/etc/rc.d/rc#.d/S*;do
$istart
done

所有由rc脚本关闭或启动的链接文件的源文件都存在于/etc/rc.d/init.d,系统为了方便使用为此目录创建了链接/etc/init.d

所有/etc/init.d(/etc/rc.d/init.d)目录中的脚本执行方式#/etc/init.d/SRV_SCRIPT {start|stop|restart|status}

#service SRV_SCRIPT {start|stop|restart|status}

chkconfig命令: 查看系统服务相关运行级别下的运行状态格式: chkconfig --list [name]

管理系统服务在/etc/rc.d/rc#.d/目录下的服务脚本的链接chkconfig--add name

chkconfig--del name

为了能够让chkconfig命令管理系统服务的脚本的链接每个脚本中都必须有这样的格式#chkconfig: 2345 90 60

2345:在哪个运行级别下此服务是自动启动状态; 也就是说在对应的运行级别的rc#.d目录中是以S开头的文件; 如果该位置为"-",则表示所有运行级别都为K开头的90:如果在某个运行级别下为开启状态该数字为S后面的优先级数字60:如果在某个运行级别下为停止状态K后面的优先级数字#description: 对于此系统服务的摘要性描述信息单独设置指定运行级别下系统服务的自动启动或关闭的状态chkconfig[--level levels] name <on|off|reset>

/etc/rc.d/rc.local脚本的功能它是init程序在引导用户空间进程启动的过程中所执行的最后一个脚本; 因此以便于或不需要写在系统服务相关的脚本中的内容但又期望可以开机即运行的功能可以直接卸载此脚本中 /etc/inittab的文件的第二部分#Run gettys in standard runlevels

1:2345:respawn:/sbin/mingettytty1

2:2345:respawn:/sbin/mingettytty2

3:2345:respawn:/sbin/mingettytty3

4:2345:respawn:/sbin/mingetty tty4

5:2345:respawn:/sbin/mingettytty5

6:2345:respawn:/sbin/mingettytty6

mingetty会调用login程序打开虚拟终端; 除了mingetty之外诸如getty之类的程序也可以生成虚拟终端控制台如果默认的运行级别是5,则我们需要/etc/x11/prefdm脚本打开图形界面终端; 操作如下X6R11- X Version 6 Release 11

小结:(用户空间的启动流程/sbin/init--> /etc/inittab --> 设置默认运行级别 --> /etc/rc.d/rc.sysinit脚本完成系统初始化 -->关闭那些对应运行级别下需要停止的服务启动那些对应运行级别下需要开启的服务 --> Ctrl+Alt+Del热键功能 --> UPS电源的失效与恢复之后的操作 --> 生成终端[启动图形界面]

CentOS 6:

Init程序: uupstart,其应用程序依然是/sbin/init,其配置文件/etc/inittab:仅仅只是用于定义默认运行级别/etc/init/*.conf:

rcS.conf:执行系统初始化脚本的任务rc.conf:执行根据运行级别关闭或开启系统服务的任务start-ttys.conf:执行打开终端相关的任务prefdm.conf:执行打开图形界面的任务upstart机制: 基于事件驱动的程序管理模型: Driven-envet

系统的启动流程POST--> BootSequence(BIOS) --> Bootloader --> kernel [--> ramfs] -->rootfs(ro) --> /sbin/init --> 设定默认运行级别 --> 系统初始化 --> 可以并行执行Ctrl+Alt+del热键功能定义系统服务的开启和关闭电源管理管理等 --> 登陆提示符

CentOS 7:

: Systemd,与经典的Init程序完全不同: 其配置文件/etc/systemd/system/*

/usr/lib/systemd/system/*:systemdUNIT文件 /etc/inittab: 已废除systemd完全兼容SysV分格的Init程序及其脚本类的命令在CentOS7中依然可用; 但是建议使用CentOS 7标配的systemctl命令来控制和管理系统服务systemctl命令:该系统和服务系统的管理控制

: systemctl [OPTIONS...] COMMAND [NAME...]

使用systemctl管理服务的一般方式~]#systemctl {start|stop|restart|status} name[.service]

设置CentOS 7的默认运行级别~]#systemctl set-default {multi-user.target | graphical.target}

查看~]#systemctl get-default

Bootloader:

GRUB: GRandUniform Bootloader,通用统一引导加载器grub0.x: grub legacy

grub1.x: grub2

grub legacy:

1ststage: stage1,MBR的前446Bytes;

1.5stage: stage1_5,MBR之后的若干个扇区中; stage1中的bootloader程序能够识别stage2所在额分区的文件系统2ndstage: stage2,磁盘的启动分区注意: stage2及内核核心文件必须放置在同一个基本磁盘分区上stage2提供的功能1.加载操作系统内核核心文件2.提供一个菜单和交互接口3.允许用户编辑菜单内容 4.命令行接口操作模式5.身份认证机制以保证菜单编辑和内核启动的安全grub的命令行界面提示符: grub>

grub的命令行界面中的常用命令help:获取所有的grub命令的名称列表和简要使用方法helpGRUB_CMD: 显示特定命令的详细帮助信息root(hd#,#): 将指定磁盘的指定分区作为grub程序的根设备hd#:磁盘编号一般是从0开始的数字; hd0表示第一块磁盘#:分区编号一般也是从0拜师第一个分区 示例: (hd0,0): 当前计算机上的第一块磁盘的第一个分区find(hd#,#): 从指定的分区中搜索文件并显示出文件所在位置kernel/PATH/TO/KERNEL_CORE_FILE: 设定本次启动时用到的内核文件的绝对路径; 额外还可以在kernel 命令中为内核启动添加更多的内核参数roroot=/dev/sda3 selinux=0 init=/sbin/init(/bin/bash) quiet rhgb {1|s|S|single}

initrd/PATH/TO/initramfs-VERSION-release.img

grub的配置文件/boot/grub/grub.conf

/etc/grub.conf:链接文件链接到其文件内容default=0 #设定默认菜单项;整个菜单中的所有的title是从0开始编号的;
timeout=5 #等待用户做出选择的时间;若用户不做选择,grub会自动引导默认菜单项;
splashimage=(hd0,0)/grub/splash.xpm.gz#grub的背景图片对应的路径;
hiddenmenu #隐藏grub的启动菜单
passwordd --md5 CRYPTED_PASSwoeD #为保护菜单设置的密码,通常用于防止随意进入单用户模式;
title CentOS 6 (2.6.32-573.el6.x86_64)#菜单项中的"标题"
root (hd0,0) #指定grub的根设备,通常是用来安装grub的那个分区;
kernel/vmlinuz-2.6.32-573.el6.x86_64.img #内核所对应的ramdisk(ramfs)文件
password --md5 CRYPTED_PASSWORD #保护操作系统内核的启动;

Systemd:

Systemd的新特性1.在系统引导的时候可以实现服务的并行启动2.能够实现按需激活进程; 在系统启动时需要随系统启动服务其服务进程并没有启动但是Systemd为每一个此类服务进程都注册了对应的套接字; 我们称这种服务处理方式为"半激活状态";

3.能够对当前系统的用户空间的每个进程进行状态快照; 以后如果进程出现问题或故障可以迅速恢复进程状态至过去的某一时刻4.systemd内部有一种基于依赖关系来定义的服务控制逻辑核心管理概念: unit文件

systemd相关的配置文件进行标识识别和配置功能的实现的基础unit的文件分类: 系统服务类 socket 目标类快照类 ......

其配置文件/usr/lib/systemd/system/*:主要的配置文件

/etc/systemd/system/*:符号链接文件/usr/lib/systemd/system/*

/run/systemd/system/*:非配置关键项

Unit文件的常见类型Serviceunit: 文件的扩展名为.service,用于定义系统服务一般.service扩展名可以省略Targetunit: 文件的扩展名为.target,用于模拟实现"init程序的运行级别Deviceunit: 文件的扩展名为.device,用于定义内核识别出来的各设备Mountunit: 文件的扩展名为.mount,用于定义可以被systemd管理的文件系统的挂载点Automountunit: 文件的扩展名为.automount,用于定义文件系统自动挂载点的位置Socketunit: 文件的扩展名为.socket,用于标识进程间通信所用到的socket文件Swapunit: 文件的扩展名为.swap,用于标识Pathunit: 文件的扩展名为.path,用于监控指定目录中的一个文件或一个子目录; 如果被监控的文件或目录不存在systemd可以自动创建systemd特性的实现方式1.基于socket unit的方式实现进程激活机制2.基于device unit的方式实现设备的自动识别挂载3.基于bus的激活机制 4.基于path的激活机制systemd的兼容和不兼容兼容: SysV init的脚本不兼容: 不许使用systemctl命令来管理系统stemctl命令的格式是固定不变的; 所有不经由systemd启动的系统服务或系统功能stemctl命令无法与之直接通信也就以为此类服务或功能无法通过systemctl来控制:系统和服务系统的管理控制

管理服务类的操作启动: service NAME start ==> systemctlstart NAME[.service]

停止: service NAME stop ==> systemctl stopNAME[.service]

重启: service NAME restart ==> systemctlrestart NAME[.service]

状态: service NAME status ==> systemctlstatus NAME[.service]

设置服务的开机自启: chkconfig --level runlevels NAME on==> systemctl enable NAME[.service]

禁止服务的开机自启: chkconfig --level runlevels NAME off==> systemctl disable NAME[.service]

查看某服务是否开机自启: chkconfig --list NAME ==> systemctlis-enabled NAME.service

条件式重启: service NAME condrestart ==>systemctl try-restart NAME.service

重载或重启: systemctl reload-or-restartNAME[.service]

重载或条件式重启: systemctl reload-or-try-restartNAME[.service]

查看某服务当前是否处于激活状态: systemctl is-active NAME[.service]

查看所有已处于激活状态的服务: systemctl list-units

--type=UNITTYPE: 查看指定unit类型和处于活跃状态的服务--all:显示所有包括处于活跃状态和处于非活跃状态的各服务 查看依赖指定服务的其他服服务: systemctl list-dependencies NAME[.service]

禁止某服务被设定为开机自启: systemctl mask NAME[.service]

取消禁止某服务被设定为开机自启: systemctl unmask NAME[.service]

管理target unit:

为兼容init的运行级别stemd中模拟了运行级别0==> runlevel0.target,poweroff.target

1==> runlevel1.target,rescue.target

2==> runlevel2.target,multi-user.target

3==> runlevel3.target,sans-serif;">4==> runlevel4.target,sans-serif;">5==> runlevel5.target,graphical.target

6==> runlevel6.target,shutdown.target

运行级别间切换: init # ==> systemctl isolateNAME.tartet

: 不是所有的target都能使用上述命令进行级别切换的; 只有那些在对应的unit文件中包含了AllowIsolate=yes的语法的target才能用于切换修改了unit文件之后需要通过命令才能使之生效: # systemctl daemon-reload

查看运行级别: runlevel ==> systemctl list-units--type=target --all

查看默认运行级别: /etc/inittab(id:3:initdefault:) ==>systemctl get-default

修改默认运行级别: /etc/inittab(id:3:initdefault:) ==>systemctl set-default NAME.target

rescue.target:紧急救援模式

切换命令: systemctl isolate rescue.target

systemctlrescue

emergency.target:紧急调试模式

切换模式: systemctl emergency

rescue模式相当于安全模式在切换到此模式时操作系统会运行最底层的驱动程序以保证服务器可以运行起来emergency模式: 一般来说通常是硬件故障或者硬件不可识别或者硬件可识别但不可用等关乎于计算机设施的问题通常系统会启动除上述模式之外传统的init命令命令命令命令命令其实都是systemctl的符号链接可以使用systemctl命令来直接实现上述功能关机: systemctl halt,systemctl poweroff

: systemctl reboot

挂起: systemctl suspend

休眠(进程快照): systemctl hibernate

挂起并休眠: systemctl hybrid-sleep

Service unit file的基本文件格式/etc/systemd/system:存放的都是各个unit file的符号链接/usr/lib/systemd/system:主要的存放路径

如果自行编写unit file,可以直接将文件放置于/etc/systemd/system目录中; 也可以将其放在/usr/bib/systemd/system目录中但是需要为其提供一个符号链接文件放置于Serviceunit file文件的基本格式此类unit file通常分为三段[Unit]:定义与Unit类型无关的通用选项; 用于提供当前unit的描述信息的行为信息的依赖关系相关帮助文档信息等常用的选项语句Description:定义了相关服务的描述信息; 意义性的介绍性的描述After:定义了此服务在启动前必须依赖的其他服务Before:定义了依赖此服务启动的其他服务Wants:指明依赖关系说明该服务依赖于哪些其他的unit; 弱依赖即使被依赖的服务并没有被正确激活也不会影响当前服务是否可以被激活Requires:指明依赖关系unit; 强依赖关系只要被依赖的unit无法被正确激活则当前服务一定无法激活Conflict:定义了各unit之间可能存在冲突Documentation:定义了跟当前unit相关的管理命令的文档所在[Service]:定义与系统服务相关的专用的选项语句Type:用于定义影响ExecStart即相关参数的功能的unit进程的启动类型simple:默认值表示由ExecStart语句指明的应用程序启动的进程就是主进程forking:复制自身表示有ExecStart语句指明的应用程序所启动的进程中众多的子进程中一个将成为主进程而一旦启动完成父进程会退出oneshot:一次性进程功能类似于simple,在启动后续的unit之前主进程会退出notify:功能类似于但是其后续的unit仅在通过sd_notifu()函数发送通知之后才会运行ExecStart所指明的应用程序EnvironmentFile:环境配置文件此文件一般用于在ExecStart之前被读取并为ExecStart执行后面的应用程序提供必要的变量以及其他自定义功能等ExecStart:指明启动服务所需要运行的命令或脚本ExecReload:指明重载配置文件所需要运行的命令或脚本ExecStop:指明停止服务所需要运行的命令或脚本ExecStartPre:指明在执行ExecStart指明的命令之前需要运行的命令或脚本ExecStartPost:指明在执行ExecStart指明的命令之后需要运行的命令或脚本Restart:表示如果服务遭遇有意外而终止则会自动重启该服务[Install]:定义由"systemctlenable""systemctl disable"命令在实现服务启动或禁用时用到的专用选项语句WantedBy:弱依赖关系指的是该服务被哪些其他units所依赖requiredBy:强依赖关系CentOS 7系统引导过程1.POST

2.选择启动设备读取引导程序

3.装载引导程序(CentOS 7使用的grub2)

4.装载引导程序的配置文件: /etc/grub.d/,/etc/default/grub,/boot/grub2/grub.cfg

5.加载initramfs驱动模块

6.加载内核

7.内核以只读方式挂载systemd进程8.执行initrd-*.target所有的unit,包括挂载/etc/fstab文件中所有有效的文件系统9.根切换

10.systemd执行默认的target

CentOS系统启动的更多相关文章

  1. ios – Xcode警告:“没有处理文件的规则”和“找不到目录”

    重命名我的项目文件夹后,我收到以下错误消息:什么可能出错?解决方法关于第一个警告,您可以在项目设置中的“构建阶段”中检查XCode,即头文件不会出现在“编译源”列表中.

  2. 你如何将xcode项目转换为cocoapod?

    我有一段代码,我发现我在多个不同的项目中重复使用,所以我想把它变成一个cocoapod并使用私人cocoapod仓库.我的问题是如何将xcode项目设置为cocoapod?它应该是一个静态库还是一个带有appdelegate的空“项目”?

  3. ios – 如何将文件添加到主包的/ Library / Sounds目录中?

    根据Apple’sdocumentation,/Library/Sounds中的声音文件将在尝试播放声音时由系统搜索.如何将声音文件添加到此文件夹?适用于iOS的正确文档应为here总之,您只需将声音文件作为应用程序包的非本地化资源添加到项目中.

  4. ios – 资产目录与文件夹参考:何时使用其中一个?

    我可以将文件放入Assets.xcassets,或者我可以将文件放入文件夹引用.我何时会选择一个而不是另一个?

  5. ios – 从icloud备份中限制sqlite-wal和sqlite-shm

    我是第一次使用coredata,我必须从文档目录中的iCloud备份限制sqlitedb文件,我使用下面的代码完成了它//阻止iCloud备份文档目录文件夹现在我不明白的是,我们还需要从icloud备份中限制sqlite-wal和sqlite-shm文件,如果是,那么如何从icloud备份限制sqlite-wal和sqlite-shm文件我想要一个解决方案,而无需从文档目录文件夹中更改sqlitedb位置…

  6. iOS:如何从文档目录中删除具有特定扩展名的所有现有文件?

    当我更新我的iOS应用程序时,我想删除Documents目录中的任何现有sqlite数据库.现在,在应用程序更新时,我将数据库从软件包复制到文档目录,并通过附加软件包版本来命名它.因此,在更新时,我还想删除可能存在的任何旧版本.我只是希望能够删除所有sqlite文件,而无需循环浏览并查找以前版本的文件.是否有任何方法可以对removeFileAtPath:方法进行通配符?解决方法那么,你想要删除所有*.sqlite文件?

  7. .dylib在Debug中链接,在XCode中找不到适用于iPhone的版本

    所以我已经将libxml2.2.dylib库包含在我的iPhoneXCode项目中,以创建一些Xml和XPath解析实用程序.当我编译并运行在模拟器和设备的调试模式时,我没有问题,但是,当我切换到发布模式我得到…

  8. ios – 从文件目录加载UIImage

    我正在尝试从文件目录加载一个UIImage,并将其设置为UIImageView,如下所示:但是,每当我尝试以上,图像从不加载.该图像在Documents/MyAppCustomDirectory/school.png中.以上是否正确从该目录加载?我也尝试了其他几个:UIImageimageWithContentsOfFile,以及基于SO响应的其他方法.解决方法要获取您应该使用的文档目录:我不太清

  9. Xcode 6 / iOS 8模拟器数据和软件包文件夹脚本

    随着xcode6的最新更改,它看起来像.app文件和文档文件夹不再驻留在iPhone模拟器目录中的同一个文件夹中.以前,我们可以访问目录和.app文件但在Xcode6中,模拟器目录是完全不同的:和其中CryptNumber1,2和3都不同.有没有办法找到包含.app文件的文件夹后,我可以得到相应的文件夹?我有这个麻烦.为什么…?

  10. ios – 上传符号文件

    我该如何解决?

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部