============================================================================================================================================== 一、相关概念 1、库 库和程序的区别是,库没有独立运行的能力,只有在其他程序调用时才会运行,库的存在形式也是二进制。 静态链接: 在编译程序时,链接器将库的内容直接添加到程序中。静态链接的缺点是,生成的程序体积庞大,运行 时需要全部加载到内存中。 动态链接: 程序在加载运行时,才将库加载被程序调用。 2、内核设计 内核 kernel 也是一个计算机程序,用来管理应用成发出的系统调用请求,并交由CPU及其他硬件进行处理。 内核提供了对硬件抽象的接口。 事实上内核并不是计算机必须的组件,应用程序可以直接运行在硬件之上。只是直接运行于硬件之上增加了 系统维护的难度及系统移植性。 3、内核设计风格 宏内核:Linux是一个宏内核,设备驱动程序可以完全访问硬件。Linux内的设备驱动程序可以方便地以模块化 (modularize)的形式设置,并在系统运行期间可直接装载或卸载。 微内核:微核的目标是将系统服务的实现和系统的基本操作规则分离开来。每一个功能都使用独立子系统实现, 由中央调度每一个功能的运行。可以对单个功能进行修改维护。 Windows|Solaris 单内核:将所有程序集成为一个程序,每一个功能程序使用线程实现。在单内核体系中,如果一个功能线程出 现错误,则有可能导致整个系统奔溃。Linux 尽管Linux是单内核设计,但Linux内核依然支持内核模块化的方式运行功能,并且支持内核模块的动态 装载卸载操作。 Linux是单内核的的设计体系,但Linux内核充分借鉴了微内核的优点及设计思想。 4、Linux内核组成 核心文件:内核 kernel /boot/vmlinuz-3.10.0-514.el7.x86_64 虚根:initramfs(CentOS6|7) | randisk(CentOS5) # 将内存模拟成文件系统或者磁盘(挂载真正的根文件 前,先挂载虚根,也就是ramdisk) 内核模块:/usr/lib/modules/3.10.0-514.el7.x86_64/ .ko结尾的文件 ============================================================================================================================================== 二、启动流程 1、加电自检 (Power-on and self-test) 加电自检是一个速度极快的过程,是计算机BIOS的一个功能,在开机后,对计算机的硬件如CPU、主板、内存及外设等设备 进行检测,检测完成后,会将结果输出到BIOS可以输出的接口上如屏幕。 2、基本输入输出系统 BIOS (Basic input/output System) BIOS也是一套程序,所以也需要CPU和内存去加载运行它。但当计算机加电的一瞬间,计算机内存中没有任何指令,CPU不能获 得任何可执行的指令。事实上,当计算机加电之后,主板上的 timer 被触发,它产生一个复位脉冲送给 CPU 让 CPU 开始工作 告诉 CPU 到[什么地方]^ 读取 BIOS 程序,之后将 BIOS 程序映射到内存中, 至此 BIOS 程序开始工作。BIOS 自检程序 POST 侦测计算机各项硬件,以及读取 CPU 的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。 在 BIOS RAM(只读存储器)芯片中装有一个程序称为“系统设置程序”,就是用来设置BIOS中的参数的,并将这些设置保存在COMS中。 互补式金属氧化物半导体(Complementary Metal-Oxide-Semiconductor CMOS)。 BIOS程序存储在BIOS芯片中,即主板的ROM中。 3、BOOT Sequence 引导次序。按次序查找个引导设备,第一个有引导程序的设备作为启动设备。根据BOOT Sequence中的启动顺序加载磁盘是MBR。 4、Bootloader 引导加载器 windows:ntloader Linux: LILO LInux LOader GRUB GRand Uniform Bootloader 5、GRUB的作用 引导将内核装载到内存中的特定空间,解压、展开,并将系统控制权交给内核。 GRUB的启用引导分为三个阶段: stage1 存放在 MBR 中,主要用来引导第二段 stage2 (计算机硬件可以识别硬盘中的MBR,支持读取磁盘的MBR) stage1-5 因为 stage2 存放在硬盘的基本分区,而这个分区的文件系统,stage1 并不能识别所有要借助与stage1-5 来识别读取存放在硬盘基本分区的 stage2,stage1-5阶段装载位置为MBR之后的位置。 stege2 引导加载内核 6、内核阶段 内核初始化: 探测识别硬件设备 加载硬件驱动程序 只读方式挂载根文件系统 运行用户空间的第一个程序 7、ramdisk CentOS5 --> initrd CentOS6|7--> initramfs 8、init程序 https://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?sort_by=&show_abstract=true&show_all=&search_flag=&contentarea_by=Linux&search_by=%E6%B5%85%E6%9E%90+Linux+%E5%88%9D%E5%A7%8B%E5%8C%96+init+%E7%B3%BB%E7%BB%9F&topic_by=-1&type_by=%E6%89%80%E6%9C%89%E7%B1%BB%E5%88%AB&ibm-search=%E6%90%9C%E7%B4%A2 1、Sysvinit /etc/inittab 2、UpStart 1、配置文件 /etc/initab /etc/init/*.conf 2、优点 基于事件机制; 更快的启动系统; 动态发现启动服务; 硬件被拔时动态停止服务; 3、systemd /usr/lib/systemd/system /etc/systemd/system ============================================================================================================================================== 三、CentOS 5 启动流程 1、运行级别 0 Halt 关机 1 Single-user mode 单用户模式(维护模式,无须登录,直接root身份登录,不会启动任何模式) 2 Multi-User Mode(without networking) 多用户模式,在系统出错情况下进入。会启动网络功能。redhat 系列的发行版没有NFS功能 3 Multi-User Mode 多用户模式(正常模式,默认为字符界面) 4 Not used/user definable 保留级别 5 GUI mod 图形界面 6 Reboot 重启 2、运行级别的查看与切换 查看: runlevel # N表示上一次的运行级别为空,直接启动为当前级别 who -r 切换: init N (CentOS7不适用) 3、chkconfig 不同的运行级别启动的服务不同 格式: chkconfig OPTION SERVIVE [on|off] # 启动和关闭的级别默认是23 选项: --add --del --level --list --override 示例: # 查看服务再那些级别启动 chkconfig --list # 对某个服务在某个运行级别是是否启动设置 chkconfig --level 4 SERVICE_NAME on|off|reset # 添加服务到开机自动启动 chkconfig --add NAME 注:事实上修改的是/etc/rc.d/rcN.d目录下链接文件的名称。 K*: K##* 数字越小,越先运行;数字越小的服务,通常为依赖到别的服务 S*: S##* 数字越小,越先运行;数字越小的服务,通常为被依赖到的服务 注:ntsysv 命令可以在字符图形界面修改启动级别 4、服务脚本解释 # network Bring up/down networking # 服务名称 # chkconfig: 2345 10 90 # 2345表示在2345级别下启动,10和90分别表示启动和关闭的优先级,省略表示2345 # description: Activates/Deactivates all network interfaces configured to \ # 描述信息 5、/etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l6:6:wait:/etc/rc.d/rc 6 tty1:2345:respawn:/usr/sbin/mingetty tty1 x:5:respawn:/etc/X11/prefdm -nodaemon # 启动图形界面 每一行定义一个操作,# 每一行4个字段。配置示例:id:3:initdefault: 1、ID # 标识数字,id一般要求4个字符以内 2、runlevels # 在那些级别下执行此操作 3、action # 动作,定义操作的工作模式 initdefault 设置默认级别运行级别,无需定义操作 sysinit 指定系统初始化脚本 /etc/rc.d/rc.sysinit ,无条件执行 wait 等待系统切换至级别时运行一次 ctrlaltdel 定义组合键被按下时要运行的命令 Ctrl+Alt+Delete respawn 当指定的操作被关闭时,在启动一次(例如终端)(将终端的bash进程杀死后,又会调用mingetty调用login立即启动) 4、process # 操作 /etc/inittab定义的操作及init完成的任务: 设定默认运行级别 指定系统初始化脚本 /etc/rc.d/rc.sysinit脚本 启动指定级别下要启动的服务,并关闭需要停止的服务 执行/etc/init.d中的脚本,去执行/etc/rc#.d中的链接脚本,S开头全部启动,K开头全部关闭 K##* S##* ,##数字决定了执行次序 所有的链接文件按照字符顺序排序 定义组合键 启动字符终端 启动图形终端 注:/etc/rc.d/init.d/目录下的文件,被链接到/etc/rc.d/rcN.d/目录下。 如果想要某个脚本开机自动启动,可以将脚本放置到/etc/rc.d/init.d 目录下,然后在对应要在那个级别下启动的目录下rcN.d目录下,创建 链接文件即可。 /etc/rc.d/rc.local文件是最后启动的脚本,可以将开机自动执行的脚本或命令 放置到这个文件中。 6、Sysvinit程序读取文件顺序 1、/etc/inittab 系统需要进入的 runlevel 捕获组合键的定义 定义电源 fail/restore 脚本 启动 getty 和虚拟控制台 2、读取并执行inittab文件中定义的操作 1、/etc/rc.d/rc.sysinit 激活 udev 和 selinux 设置定义在/etc/sysctl.conf 中的内核参数 设置系统时钟 加载 keymaps 激活交换分区 设置主机名(hostname) 根分区检查和 remount 以读写方式挂载 激活 RAID 和 LVM 设备 开启磁盘配额 检查并挂载所有文件系统 (/etc/fstab) 清除过期的 locks 和 PID 文件 2、/etc/rc.d/rc 和/etc/rc.d/rcX.d/ (X 代表运行级别 0-6) 3、/etc/rc.d/rc.local rc.local 是 Linux 留给用户进行个性化设置的地方。您可以把自己私人想设置和启动的东西 放到这里,一台 Linux Server 的用户一般不止一个 在 /rc.d/rc{2,3,4,5}.d/ 目录下都有一个 rc.local 文件的链接文件,无论在那个运行级别,开机都 会运行此脚本。 ============================================================================================================================================== 四、CentOS 6 启动流程 CentOS6的启用过程文件执行顺序: /etc/inittab /etc/init/*.conf 这些配置文件中: rc.conf 脚本是运行rcN.d目录下的文件; rcS.conf文件调用rc.sysinit脚本; tty.conf启动终端 ============================================================================================================================================== 五、进入单用户模式 1、CentOS 6 进入GRUB编辑界面,给内核传递参数 1 或者 s 或者 S 或者 single 2、CentOS 7 开机界面 e ro ,修改为 init=/sysroot/bin/sh chroot /sysroot passwd root touch / .autorelabel exit reboot ============================================================================================================================================== 六、CentOS 7启动流程 1、在CentOS 7上采用的系统初始化程序为 Systemd 。Systemd 采用并行启动的机制,所以有更好的性能,更快的启动速度。 采用了 socket / D-Bus activation 等技术启动服务。 在Upstart中,也采用了类似的并行启动服务的机制,但Upstart中,相依赖的服务,依然需要先后启动。 2、Systemd的优势 1、无论服务是否依赖,都可以并行的启动,由此大大减小了启动时间 2、同时systemd提供了按需启动的功能,即某个服务只有在真正被使用到时才会启动 基于 socket 的激活机制,socket 与服务程序分离 (socket 随服务的启动而启动,当有人访问 socket 时,才去激活相对应的进程) 3、采用Linux内核的特性CGROUP对进程跟踪和管理 4、事务一致性的机制确保相互依赖的服务能够正常运行 5、使用二进制格式保存日志信息,可以使用 journalctl 命令查看日志 6、对于天生有依赖关系的服务,Systemd 采用对 unit 文件中定义事前启动的服务 7、Systemd 采用 target 的概念模拟了运行级别 (例如 nfs 和 rpmbind 两个依赖的服务,可以任意启动其中一个,而不需要手动解决依赖) 3、unit 的概念 表示不用类型的 systemd 对象,通过配置文件进行表示和配置。 保存路径: /usr/lib/systemd/system # systemd 配置文件主要存放目录 /run/systemd/system # 系统运行过程中临时产生的脚本 /etc/systemd/system # 管理员配置脚本。优先级最高,自动以服务脚本建议防止在此目录 service 代表一个后台服务进程,比如 mysqld。这是最常用的一类 socket 此类配置单元封装系统和互联网中的一个套接字 。当下,systemd 支持流式、数据报和连续包的 AF_INET、AF_INET6、 AF_UNIX socket 每一个套接字配置单元都有一个相应的服务配置单元。相应的服务在第一个"连接"进入套接字时就会启动 (例如:nscd.socket 在有新连接后便启动 nscd.service)。可以实现按需启动服务 device 此类配置单元封装一个存在于 Linux 设备树中的设备。每一个使用 udev 规则标记的设备都将会在 systemd 中作为一个 设备配置单元出现 mount 此类配置单元封装文件系统结构层次中的一个挂载点。Systemd 将对这个挂载点进行监控和管理。比如可以在启动时自动将 其挂载;可以在某些条件下自动卸载。Systemd 会将/etc/fstab 中的条目都转换为挂载点,并在开机时处理 automount 此类配置单元封装系统结构层次中的一个自挂载点。每一个自挂载配置单元对应一个挂载配置单元 ,当该自动挂载点被访问 时,systemd 执行挂载点中定义的挂载行为 swap 和挂载配置单元类似,交换配置单元用来管理交换分区。用户可以用交换配置单元来定义系统中的交换分区,可以让这些交换 分区在启动时被激活 target 此类配置单元为其他配置单元进行逻辑分组。它们本身实际上并不做什么,只是引用其他配置单元而已。这样便可以对配置单 元做一个统一的控制。这样就可以实现大家都已经非常熟悉的运行级别概念。比如想让系统进入图形化模式,需要运行许多服 务和配置命令,这些操作都由一个个的配置单元表示,将所有这些配置单元组合为一个目标(target),就表示需要将这些配置 单元全部执行一遍以便进入目标所代表的系统运行状态。 (例如:multi-user.target 相当于在传统使用 SysV 的系统中运行级别 5) timer 定时器配置单元用来定时触发用户定义的操作,这类配置单元取代了 atd、crond 等传统的定时服务 snapshot 与 target 配置单元相似,快照是一组配置单元。它保存了系统当前的运行状态 path 用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如:spool 目录 4、运行级别的概念 target 0 runlevel0.target,poweroff.target 关闭系统 1,s,single runlevel1.target,rescue.target 单用户模式 2,4 runlevel2.target,runlevel4.target,multi-user.target 用户定义/域特定运行级别。默认等同于 3 3 runlevel3.target,multi-user.target 多用户,非图形化。用户可以通过多个控制台或网络登录 5 runlevel5.target,graphical.target 多用户,图形化。通常为所有运行级别 3 的服务外加图形化登录 6 runlevel6.target,reboot.target 重启 emergency emergency.target 紧急 Shell 5、unit 文件书写 1、 # 号为注释行,且注释行只能独占一行 2、Requires=NAME.service|target 表示启动此服务前,启动那个服务或者target 3、格式 [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target # 表示在启动此服务时,先启动 Documentation=man:httpd(8) Documentation=man:apachectl(8) [Service] Type=notify EnvironmentFile=/etc/sysconfig/httpd ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND ExecReload=/usr/sbin/httpd $OPTIONS -k graceful ExecStop=/bin/kill -WINCH ${MAINPID} # We want systemd to give httpd some time to finish gracefully, but still want # it to kill httpd after TimeoutStopSec if something went wrong during the # graceful stop. Normally, Systemd sends SIGTERM signal right after the # ExecStop, which would kill httpd. We are sending useless SIGCONT here to give # httpd time to finish. KillSignal=SIGCONT PrivateTmp=true [Install] WantedBy=multi-user.target 4、字段含义 Unit段的常用选项: Description= # 描述信息(systemctl status NAME.service 查看到的第一行提示信息) After= # 定义unit的启动次序,表示当前unit应该晚于哪些 unit启动,其功能与 Before 相反 Documentation= # 指定帮助文档 Requires= # 依赖到的其它units,强依赖,被依赖的units无法 激活时,当前unit也无法激活 Want= # 依赖到的其它units,弱依赖 Conflicts # 定义units间的冲突关系 Service段的常用选项: type= Type=simple # (默认值)systemd认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动, 除非该服务是socket 激活型。这个daemon主要由ExecStart接的指令串来启动 ,启动后常驻于内存中. Type=forking # systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启 动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的 主进程。 Type=oneshot # 这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在 服务程退出之后仍然认为服务处于激活状态。 Type=notify # 与Type=simple相同,但约定服务会在就绪后向systemd发送一个信号。这一通知的实现由libsystemd-daemon.so提供 在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd 接收消息 Type=dbus # 若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪 Type=idle # systemd会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似 EnvironmentFile= # 环境配置文件例如:EnvironmentFile=/etc/sysconfig/httpd ExecStart= # 指明启动unit要运行命令或脚本的绝对路径 ExecStartPre= # ExecStart前运行 ExecStartPost= # ExecStart后运行 ExecStop= # 指明停止unit要运行的命令或脚本 Restart = # 当设定 Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务 ExecReload= # 重新加载 KillSignal=SIGCONT # 发送的 kill 信号类型 Install段的常用选项: Alias # 别名,可使用 systemctl command Alias.service 进行相关操作 RequiredBy # 被哪些units所依赖,强依赖 WantedBy # 被哪些units所依赖,弱依赖 Also # 安装本服务的时候还要安装别的相关服务  注意:1、对于新创建的unit文件,或者修改了的unit文件,要通 知systemd重载此配置文件,而后可以选择重启 systemctl daemon-reload 2、时间单位默认是秒,如果用毫秒ms 或者 分钟m 时需要显示说明 3、布尔值 1 yes on true 都是开启,0 no off false 都为关闭 6、日志功能 journalctl 7、服务状态 systemctl list-unit-files --type service --all 显示状态 loaded:Unit 配置文件已处理 active(running) 一次或多次持续处理的运行 active(exited) 成功完成一次性的配置然后退出 active(waiting) 运行中,等待一个事件 inactive 不运行 enabled 开机启动 disabled 开机不启动 static 开机不启动,但可被另一个启用的服务激活 8、systemctl 命令 1、服务管理 # 重新加载配置 systemctl reload sshd.service # 列出活动状态的所有服务单元 systemctl list-units --type=service # 列出所有服务单元 systemctl list-units --type=service --all # 查看服务单元的启用和禁用状态 systemctl list-unit-files --type=service # 列出失败的服务 systemctl --failed --type=service # 禁用network,使之不能手动或自动启动 systemctl mask network # 启用 network systemctl unmask network # 禁止启动或者关闭服务,将 /etc/systemd/system/NAME.service创建软链接服务脚本指向了 /dev/null systemctl mask NAME.service # 关闭禁止启动服务设置 systemctl unmask NAME.service # 列出某服务所依赖的服务 systemctl list-dependencies NAME.service # 杀掉进程 systemctl kill Pro # 条件式重启 systemctl try-restart NAME.service # 如果已经启动才重新启动, 否则不进行操作 systemctl reload-or-restart NAME.service # 先尝试加载,如果失败,则进行重新启动 systemctl reload-or-try-restart name.service # 先尝试加载,若失败,然后判断是否未启动,如果是则试图重新启动 # 切换级别 systemctl isolate name.target 注:target 配置文件中配置项 AllowIsolate=yes 才支持级别切换 # 获取当前运行的target systemctl get-default # 设置默认启动的target systemctl set-default graphical.target # 切换至紧急救援模式 systemctl rescue # 切换至emergency模式 systemctl emergency 9、传递内核参数 systemd.unit=recure.target(单用户救援) | nulti-user.target | emergency.target(recure 比 emergency 支持更多的功能,例如日志功能) ============================================================================================================================================== 七、GRUB-1 1、GRUB命令行 help [COMD] # 查看帮助或者查看指定命令的帮助信息 root (hdN,hdM) # 指定根设备,第二阶段所在的设备,内核所在的硬盘 N表示第几块磁盘,M表示第几个分区。从0开始编号 kernel /vmlinuz-2.6.32-584.el6.x86_64 ro root= # 传递内核参数及内核位置。 ro 只读挂载根文件系统 root= 指定根文件系统所在的设备 init= 指定init程序 selinux= 设定selinux是否启动 quit 静默模式(隐藏内核加载的过程信息) rhgb 启用图形界面的加载进度圈 initrd /initramfs-.6.32-584.el6.x86_64.img # 指定initrd find (hdN,) # 查找文件 boot # 启动选定的内核 2、GRUB启动时传递给内核的参数查看 cat /proc/cmdline 3、内核参数文档查看 /usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt 4、GRUB配置文件 /etc/grub.conf -> ../boot/grub/grub.conf default=0 # 设定默认启动的title编号,即系统 timeout=5 # 等待用户选择的超时时长,单位是秒。如果不选择则启动默认选项 splashimage=(hd0,0)/grub/splash.xpm.gz # 指定背景图片 password # 密码字符,修改grub的密码 password --md5 STRING # 编辑菜单需要的密码,加密的密码使用grub-md5-crypt命令生成 --encrypted 可以使用 sha512 加密算法 grub-crypt 命令生成 hiddenmenu # 隐藏菜单 title CentOS (2.6.32-431.el6.x86_64) # 引导的内核的标题或操作系统标题,可自由修改 root (hd0,0) # 内核文件所在的设备:对于grub硬盘为hd,第一个数字表示第一块磁盘,第二个数字表示对应磁盘的分区 kernel ro root=/dev/sda3 nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 rd_NO_LVM rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-431.el6.x86_64.img # randisk位置 password --md5 STRING # 加密的密码使用grub-md5-crypt命令生成,启动内核需要的密码 5、安装grub 方法1: grub-install --root-directory=/path/to/boot_part_dir /path/to/device 方法2: [localhost@root ~]grub # 进入greb命令行 >grub root(hd0,0) # 指定root所在分区 >grub setup (hd0) # 安装grub,并指定硬盘 >grub quit # 退出 [sum:4 localhost@root ~]#shutdow -r now # 重启 grub-install grub-install工具会将grub安装到boot目录下。--root-directory= 选项是含义是将grub安装到此目录下的boot目录下, 比如--root-directory=/mnt 则grub-install 程序会将grub安装到mnt目录下的boot目录下 6、grub 目录 device.map e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 grub.conf # 配置文件 iso9660_stage1_5 jfs_stage1_5 menu.lst minix_stage1_5 reiserfs_stage1_5 splash.xpm.gz stage1 stage2 # grub第二阶段 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5 注:目录下的文件大多数文件属于备份作用,但当grub重装以后,stage2 就是不起备份作用了,而是真正起作用的文件。 ============================================================================================================================================== 八、grub2 1、配置文件 /etc/default/grub是grub2的配置模板,根据此模板的配置,生成grub2的配置文件。可以使用下列命令重新 生成grub2的配置文件。 grub2-mkconfig -o /etc/grub2.cfg 2、/etc/default/grub 模板配置文件 GRUB_TIMEOUT=5 # 系统启动超时时长。-1则表示必须选择 GRUB_DISABLE_LINUX_UUID="true" # grub-mkconfig 默认使用根文件系统的 UUID 要禁用此设置 GRUB_DISABLE_RECOVERY="true" # 生成recovery模式的菜单项 GRUB_CMDLINE_LINUX="" # 变量可以向 Linux 内核传递额外的参数 GRUB_CMDLINE_LINUX_DEFAULT=" " # 变量可以向 Linux 内核传递额外的参数. 生成普通启动项时,这两 个参数的值会合并在一起加入, 对于recovery启动项, 则添加 GRUB_CMDLINE_LINUX 参数的值。 GRUB_HIDDEN_TIMEOUT=15 # 选择菜单是否隐藏 GRUB_DEFAULT=saved|数字|title名|ID名 # saved代表使用 grub2-set-default设置那一个值 数字形式的0表示第一个菜单 菜单为默认值的意思。通常默认为 0 GRUB_DISABLE_OS_PROBER='true' # 不检测其他的操作系统 GRUB_TIMEOUT_STYLE=menu|countdown|hidden # 默认值为menu。 countdown表示不显示菜单,但显示倒计时;hidden则为完全隐藏 3、/boot/grub2目录结构 [ root@node0 /boot/grub2 ]# tree -f -L 1 . ├── ./device.map # 设备信息 ├── ./fonts # 字体 ├── ./grub.cfg # 主配置文件 ├── ./grubenv # 环境区块符号 ├── ./i386-pc # 针对一般 x86 PC 所需要的 grub2 的相关模块 ├── ./locale # 语言相关 └── ./themes # 主题相关文件 4、grub2表示磁盘的代号 (hd0,1) # 一般的默认语法,由 grub2 自动判断分区格式 (hd0,msdos1) # 此磁盘的分区为传统的 MBR 模式 (hd0,gpt1) # 此磁盘的分区为 GPT 模式 注意:第一个磁盘编号为0,第一个分区编号为1。 5、/boot/grub2/grub.cfg 或者 /etc/grub.conf 配置文件 menuentry 'CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-514.el7.x86_64-advanced-fea54bd4-9e03-48c4-bdd9-ab07ca46b295' { load_video # 启动前加载的模块 set gfxpayload=keep # 启动前加载的模块 insmod gzio # 启动前加载的模块 insmod part_msdos # 启动前加载的模块 insmod ext2 # 启动前加载的模块 set root='hd0,msdos1' # 安装grub的设备 if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' e89a5336-50db-43fa-a3cd-acd70a33748f else search --no-floppy --fs-uuid --set=root e89a5336-50db-43fa-a3cd-acd70a33748f fi linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=UUID=fea54bd4-9e03-48c4-bdd9-ab07ca46b295 ro crashkernel=auto rhgb quiet net.ifnames=0 systemd.unit= # 指明启动的 Linux 内核及传递给内核的参数 # root= HHHHHLLKKJJJJJJJHHHHJJJJJKKK表示根文件系统的设备位置 # systemd.unit= 指明启动默认级别 initrd16 /initramfs-3.10.0-514.el7.x86_64.img # 指明 ramdisk } 6、/etc/grub.d/* 文件 grub2-mkconfig 工具通过分析此目录下的文件,构建initramfs文件。 00_header 00_tuned 01_users 10_linux # 分析主机使用的内核版本以及启动所需要加载的模块等 20_linux_xen 20_ppc_terminfo 30_os-prober # 查找系统其它分区中有没有操作系统 40_custom 41_custom 7、grub2的安装 grub2-install [--boot-directory=DIR] INSTALL_DEVICE --boot-directory= 指明将生成的grub目录放置的目录 8、进入单用户模式 给内核传递参数:systemd.unit=rescue.target # 需要输入root密码 9、开机画面及语言设置 GRUB_TERMINAL=gfxterm # 设置终端显示为图形界面 GRUB_GFXMODE=1024x768x24 # 图形界面的 X, Y, 彩度数据 GRUB_GFXPAYLOAD_LINUX=keep # 保留图形界面 10、为菜单加密 1、生成加密密码 grub2-mkpasswd-pbkdf2 2、 新建 /etc/grub.d/NM_newfile 文件 cat << EOF set superusers="user1" password_pbkdf2 user1 EncryptedPasswordOfUser1 EOF 3、重新生成grub2配置文件 11、添加新菜单项 可以在/etc/grub/40_custom文件中新添加菜单项 12、破解修改root密码 方法1: 1、给内核传递参数 rd.break ,表示进入挂载 initramfs 时的环境。此时根文件系统以只读的方式挂载到/sysroot目录下 2、进入后,使用mount查看挂载的文件系统,重新挂载根文件系统,挂载为可读写 mount -o remount,rw /sysroot 3、切换根文件系统 chroot /sysroot 4、修改密码 passwd 5、设置关于SElinux touch /.autorelabel 注:在进入 initramfs 环境后,因为 SElinux 的问题,可能会导致用户无法登录的问题。还可以在这个环境中将SElinux 关闭,然后启动系统。 6、exit 7、重启 reboot 方法2: 1、指定开机启动程序 root=/bin/bash 2、重新挂载根文件系统 3、修改密码 4、重启(使用绝对路径) 方法3: 1、传递内核参数 rw init=/sysroot/bin/sh 2、重新挂载根文件系统 3、chroot 4、修改密码 5、touch /.autorelabel 6、exit;reboot ============================================================================================================================================== 九、超级守护进程 xinetd 配置文件: /etc/xinetd.conf no_access =IP # 拒绝指定IP的访问 only_from =IP # 只允许指定IP的访问 ============================================================================================================================================== 十、机器故障解决 1、grub 第一阶段的前446字节损坏 重启:进入救援模式,重新安装grub 未重启:直接重新安装grub 2、删除 boot 目录 进入救援模式,从光盘中复制内核到 /boot 目录下,然后使用 mkinitrd 工具生成 ramdisk 文件。 最后重新安装 grub,提供 grub 配置文件。 3、删除 /etc/fstab 和 /boot 目录下 1、进入救援模式 2、尝试挂载个文件系统,找到根文件系统所在的分区和boot所在的分区 3、挂载根文件系统,{fdisk|blkid}修复 /etc/fstab 文件 4、再次进入救援模式,根文件系统将自动挂载 5、恢复 boot 目录 4、逻辑卷环境下 /etc/fstab 和 /boot 目录损坏 1、lvdisplay 查看逻辑卷信息 2、vgchange -ay 激活所有逻辑卷 3、lvscan 查看逻辑卷信息 4、挂载根文件系统所在的逻辑卷到临时目录 5、进入根文件系统修复 /etc/fstab 文件 ==============================================================================================================================================