Linux init
- 格式:doc
- 大小:62.00 KB
- 文档页数:6
linux中init命令的详细解释linxu下的init命令是进程初始化工具。
下面由店铺为大家整理了linux的init命令的详细解释的相关知识,希望对大家有帮助!一、linux中的init命令的详细解释init命令init命令是Linux下的进程初始化工具,init进程是所有Linux的进程的父进程,它的进程号为1。
init命令是Linux操作系统中不可缺少的程序之一,init进程是Linux内核引导运行的,是系统中的第一个进程。
语法init(选项)(参数)选项-b:不执行相关脚本而直接进入单用户模式;-s:切换到单用户模式。
参数运行等级:指定Linux系统要切换到的运行等级。
二、linux中的init命令的详解实例几个常用的命令查看系统进程命令:ps -ef | head查看init的配置文件:more /etc/inittab查看系统当前运行的级别:runlevel运行级别到底什么是运行级呢?简单的说,运行级就是操作系统当前正在运行的功能级别。
这个级别从0到6 ,具有不同的功能。
你也可以在/etc/inittab中查看它的英文介绍。
#0 停机(千万不能把initdefault 设置为0)#1 单用户模式#2 多用户,没有 NFS(和级别3相似,会停止部分服务)#3 完全多用户模式#4 没有用到#5 x11(Xwindow)#6 重新启动(千万不要把initdefault 设置为6)三、linux的init命令的六种模式简介6种模式中有两种是系统内定的:0:停止系统运行。
init 0〈回车〉相当于 halt〈回车〉。
6:重启系统。
init 6〈回车〉相当于 reboot〈回车〉。
如果你了解/etc/inittab文件,就千万不要把0设为缺省登录模式,否则你的Linux的运行就只能两点一线了——开机←→停机,或者是开机←→重启的无限循环。
Linux终端中的系统关机和重启命令Linux作为一种开源的操作系统,具有很高的灵活性和自定义性。
在使用Linux终端时,系统关机和重启是经常涉及到的操作。
本文将介绍Linux终端中常用的系统关机和重启命令,供用户参考和使用。
1. 关机命令在Linux终端中,通过使用特定的关机命令可以实现系统的安全关机,保证数据的完整性,避免出现数据丢失或损坏的情况。
下面是常用的关机命令及其用法:1.1. shutdown命令shutdown命令可实现系统的关机操作,并向所有登录用户发送关机通知。
命令格式如下:```shutdown [选项] 时间 [警告信息]```常用选项:- -r: 关机后立即重启系统- -h: 关机后不重启系统- -c: 取消已经设置的关机操作- -t seconds: 设置关机前的等待时间(以秒为单位)示例:```shutdown -h now # 立即关机shutdown -h +10 # 10分钟后关机shutdown -r 20:00 # 指定时间关机并重启shutdown -c # 取消当前关机操作```1.2. poweroff命令poweroff命令负责关闭电源,可以用来执行硬件完全关机,对电源断电。
命令格式如下:```poweroff```示例:```poweroff```1.3. halt命令halt命令用于停止系统运行,并使计算机进入停止状态。
命令格式如下:```halt```示例:```halt```1.4. init命令init命令用于改变系统的运行等级,其中运行等级0为关机状态,通常用init命令实现关机操作。
命令格式如下:```init [运行等级]```示例:```init 0```2. 重启命令有时候需要重启系统以应用修改或解决一些问题。
在Linux终端中,可以使用以下命令实现系统的重启:2.1. reboot命令reboot命令用于重启系统,它会关闭所有正在运行的进程,并重新引导计算机。
在linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init,它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的,通过本文的介绍,希望你可以更加灵活的运用各种关机命令。
1.shutdownshutdown命令安全地将系统关机。
有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的。
因为linux与windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备。
而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭。
并且login指令会被冻结﹐即新的用户不能再登录。
直接关机或者延迟一定的时间才关机都是可能的﹐还可能重启。
这是由所有进程〔process〕都会收到系统所送达的信号〔signal)决定的。
这让像vi之类的程序有时间储存目前正在编辑的文档﹐而像处理邮件〔mail〕和新闻〔news〕的程序则可以正常地离开等等。
shutdown执行它的工作是送信号〔signal〕给init程序﹐要求它改变runlevel。
Runlevel 0被用来停机〔halt〕﹐runlevel 6是用来重新激活〔reboot〕系统﹐而runlevel 1则是被用来让系统进入管理工作可以进行的状态﹔这是预设的﹐假定没有-h也没有-r参数给shutdown。
要想了解在停机〔halt〕或者重新开机〔reboot〕过程中做了哪些动作﹐你可以在这个文件/etc/inittab里看到这些runlevels相关的资料。
shutdown 参数说明:[-t] 在改变到其它runlevel之前﹐告诉init多久以后关机。
[-r] 重启计算器。
[-k] 并不真正关机﹐只是送警告信号给每位登录者〔login〕。
[-h] 关机后关闭电源〔halt〕。
[-n] 不用init﹐而是自己来关机。
不鼓励使用这个选项﹐而且该选项所产生的后果往往不总是你所预期得到的。
arm版本linux系统的启动流程ARM架构是一种常见的处理器架构,被广泛应用于嵌入式设备和移动设备中。
在ARM版本的Linux系统中,启动流程是非常重要的,它决定了系统如何从开机到正常运行。
本文将详细介绍ARM版本Linux系统的启动流程。
一、引导加载程序(Bootloader)引导加载程序是系统启动的第一阶段,它位于系统的固化存储器中,比如ROM或Flash。
在ARM版本的Linux系统中,常用的引导加载程序有U-Boot和GRUB等。
引导加载程序的主要功能是加载内核镜像到内存中,并将控制权转交给内核。
二、内核初始化引导加载程序将内核镜像加载到内存后,控制权被转交给内核。
内核初始化是系统启动的第二阶段,它主要完成以下几个步骤:1. 设置异常向量表:ARM架构中,异常是指硬件产生的中断或故障,比如系统调用、中断请求等。
内核需要设置异常向量表,以便正确处理异常。
2. 初始化处理器:内核对处理器进行初始化,包括设置页表、启用缓存、初始化中断控制器等。
3. 启动第一个进程:内核创建第一个用户进程(一般是init进程),并将控制权转交给它。
init进程是系统中所有其他进程的父进程,负责系统的初始化工作。
三、设备树(Device Tree)设备树是ARM版本Linux系统中的一种机制,用于描述硬件设备的相关信息。
在内核初始化过程中,内核会解析设备树,并建立设备树对象,以便后续的设备驱动程序使用。
设备树描述了硬件设备的类型、地址、中断等信息,以及设备之间的连接关系。
它使得内核能够在运行时自动识别和配置硬件设备,大大提高了系统的可移植性和灵活性。
四、启动初始化(Init)启动初始化是系统启动的第三阶段,它是用户空间的第一个进程(init进程)接管系统控制权后的操作。
启动初始化主要完成以下几个任务:1. 挂载根文件系统:启动初始化会挂载根文件系统,使得用户可以访问文件系统中的文件和目录。
2. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。
Linux关机命令分析linux下有关关机重启的命令主要有:shutdown、reboot、halt、poweroff、telinit、init。
它们都可以达到关机或重启的目的,但是每个命令的工作流程并不一样。
它们都由软件包sysvinit生成,你可以从网上下载它的源码来分析各个命令的流程,同时,sysvinit也包含了与登陆等有关的命令。
下面分析sysvinit-2.86软件包的源码,同时参考它们的手册来对它们深入了解。
1、从Makefile可以知道,上面的命令并不都是互相独立的,poweroff、reboot是halt 的链接,telinit是init的链接。
ln -sf halt $(ROOT)/sbin/rebootln -sf halt $(ROOT)/sbin/poweroffln -sf init $(ROOT)/sbin/telinit在终端输入# ls -l /sbin/poweroff# ls -l /sbin/reboot# ls -l /sbin/telinit也可以看到上面的结果。
2、halt。
参数说明:[-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。
[-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。
[-d] 不写wtmp纪录〔已包含在选项[-n]中〕。
[-f] 没有调用shutdown而强制关机或重启(halt/reboot)。
[-h] 使硬盘处于standby模式。
[-i] 关掉所有的网络接口。
[-p] 该选项为缺省选项。
就是关机时调用poweroff。
前面已经知道,poweroff、reboot是halt的链接,halt会首先判断用户执行的是否是poweroff和reboot中的一个。
如果执行的是poweroff,则等效于-p参数,执行reboot 的情况将在下面说明。
linux内核initrd文件自定义方法重新编译内核后,可能加入了自定义的模块,就有可能需要修改init文件,而init文件就在initrd中,这里记录下操作步骤,以防遗忘。
1. cp /boot/initrd-3.2.img /tmp/mylinux/initrd-3.2.img.gz这里之所以进行改名,是因为initrd-3.2.img是经过gzip压缩过的,所以需要对其解压,但是gzip对解压的文件的文件后缀名又有要求,所以就先进行改名。
2. gunzip initrd-3.2.9.img.gz3. cpio -id < initrd-3.2.9.img经过以上三步,就在当前目录下解压了initrd文件,从而得到了init文件。
根据自己的需求修改init文件后,通过下面命令重新生成initrd文件。
4. find . | cpio -H newc -o | gzip -9 > /boot/initrd-3.2.9.img注意一下内容摘自网上资料,留作参考:en_init_cpio获取gen_init_cpio,工具,gen_init_cpio是编译内核时得到的,在内核源代码的usr 目录下,我们可以通过以下步骤获取它,进入内核源代码执行:# make menuconfig# make usr/这样即编译好gen_init_cpio,gen_initramfs_list.sh 在内核源代码的 script 目录下,将这两个文件 copy 到 /tmp 目录下,/tmp/initrd 为解压好的initrd 目录,执行以下命令制作initrd :#制作initrd :# gen_initramfs_list.sh initrd/ > filelist# gen_init_cpio filelist >initrd.img# gzip initrd.img# mv initrd.img initrd-'uname –r’.img只有用这个方式压缩的initrd ,在Linux系统重启的时候才能一正确的文件格式 boot 起来,也可以用这种方式修改安装光盘的initrd文件然后进行系统安装。
Linux 系统启动过程linux启动时我们会看到许多启动信息。
Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段:内核的引导。
运行 init。
系统初始化。
建立终端 。
用户登录系统。
init程序的类型:SysV: init, CentOS 5之前, 配置文件: /etc/inittab。
Upstart: init,CentOS 6, 配置文件: /etc/inittab, /etc/init/*.conf。
Systemd: systemd, CentOS 7,配置文件: /usr/lib/systemd/system、 /etc/systemd/system。
内核引导当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。
操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
运行initinit 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。
init 程序首先是需要读取配置文件 /etc/inittab。
运行级别许多程序需要开机启动。
它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。
init进程的一大任务,就是去运行这些开机启动的程序。
但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。
Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。
也就是说,启动时根据"运行级别",确定要运行哪些程序。
Linux系统有7个运行级别(runlevel):运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆运行级别2:多用户状态(没有NFS)运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式运行级别4:系统未使用,保留运行级别5:X11控制台,登陆后进入图形GUI模式运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动系统初始化在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit 是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。
Linux的init级别是用来定义系统启动时运行的服务和操作系统的行为。
init是Linux系统的第一个进程,它的主要任务是运行用户级别的应用程序,并在需要时以不同的运行级别(runlevel)来改变系统的运行状态。
Linux的init级别有以下几种:
•0:停机(千万不能把initdefault设置为0,系统默认运行级别不能设为0,否则不能正常启动)。
•1:单用户模式(root权限,用于系统维护,禁止远程登陆)。
•2:多用户状态(没有NFS)。
•3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式。
•4:系统未使用,保留。
•5:X11控制台,登陆后进入图形GUI模式。
•6:系统正常关闭并重启。
linux下module_init,module_exit解读linux下module_init,module_exit 解读linux 内核通常包含3个头⽂件:●Init.h //驱动初始化与退出相关函数●Module.h //内核模块相关函数,变量,以及宏●Kernel.h //函数原型已经宏定义_initlist 对应⼀个initlist结构体变量存放在initlist 区段,即在改区段可以找到所有初始化函数的指针。
initlist 区段地址:_initlist_start , initlist_end 两个变量来标识,既可以通过这2个变量来访问所有初始化函数的指针。
我们平时的驱动初始化函数与退出函数,⽆需固定地址,其实有连接器帮助我们把驱动初始化函数与退出函数固定好位置。
如何存放呢?我们来看下module_init(x)宏定义:__section__()函数作⽤:告诉连接器,变量存放在initlist区段__initlist_func_6 : 加载到内核映像的initcall区段,这⾥的6表⽰加载优先级.,内核加载时,会搜索“。
initcall”中所有条⽬,并按照有优先级加载。
数值越⼩,加载优先级越⾼,数值为0,优先级最⾼。
Module_init()作⽤:●初始化加载●后期内存释放即Linux→kernel →device’s driver code 中得初始化函数与反初始化函数代码所含内存,是可以被释放的只需要初始化⼀次的函数,都附上了_init属性__init 宏// 如果这个模块需要编译,则把这个函数放到.init.text区段Module_eixt(func)功能类似,忽略清理函数,因为内核模块不需要清理。
具体的函数执⾏流程:最终调⽤如下函数,释放initlist区段。
参考⽂档:《/doc/48d3e725bcd126fff7050b66.html /view/c9a1b2e9172ded630b1cb66d.html》。
一、什么是initinit是Linux系统操作中不可缺少的程序之一。
是一个由内核启动的用户级进程。
内核启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式来启动其他用户级的进程或服务。
所以,init始终是第一个进程(其PID始终为1)。
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。
如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
二、运行级别运行级就是操作系统当前正在运行的功能级别。
这个级别从1到6,具有不同的功能。
其功能级别如下:# 0 - 停机(千万不能把initdefault 设置为0 )# 1 - 单用户模式# 2 - 多用户,没有NFS# 3 - 完全多用户模式(标准的运行级)# 4 - 没有用到# 5 - X11 (xwindow)# 6 - 重新启动(千万不要把initdefault 设置为6——把被你黑掉的linux的initdefault 设置为0或6也算是拒绝服务攻击噢!)除此之外还有ABC三个运行级别,但在RHLinux中都没有意义。
这些级别在/etc/inittab 文件里指定。
这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d目录下的文件。
在大多数的Linux 发行版本中,启动脚本都是位于/etc/rc.d/init.d中的。
这些脚本被用ln 命令连接到/etc/rc.d/rcn.d 目录。
(这里的n 就是运行级0-6)三、运行级别的配置运行级别的配置是在/etc/inittab行内进行的,如下所示:12 : 2 : wait : / etc / init.d / rc 2各字段解释如下:id:runlevels:action:processid:是一个任意指定的四个字符以内的序列标号,在本文件内必须唯一;使用老版本的libc5(低于5.2.18)或a.out库编译出来的sysvinit限制为2字符。
linux服务⽅式启动程序脚本(init.d脚本)这才是真正正确的让jar后台启动的脚本,⽹络上的各种nohoup的脚本都是临时执⾏⼀次任务⽤的。
#!/bin/sh## init.d script##### BEGIN INIT INFO# Provides: mongodb# Required-Start: $network $local_fs $remote_fs# Required-Stop: $network $local_fs $remote_fs# Should-Start: $named# Should-Stop:# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Short-Description: An object/document-oriented database# Description: MongoDB is a high-performance, open source, schema-free# document-oriented data store that's easy to deploy, manage# and use. It's network accessible, written in C++ and offers# the following features:# .# * Collection oriented storage - easy storage of object-# style data# * Full index support, including on inner objects# * Query profiling# * Replication and fail-over support# * Efficient storage of binary data including large# objects (e.g. videos)# * Auto-sharding for cloud-level scalability (Q209)# .# This package is build with V8 JavaScript engine.# .# High performance, scalability, and reasonable depth of# functionality are the goals for the project.### END INIT INFODAEMON=/usr/local/jdk1.8.0_40/bin/javaOPTION=-jarVAR=/usr/local/danabang.storage/danabang.storage.jarDESC=danabang.storage# Default defaults. Can be overridden by the /etc/default/$NAMENAME=danabang.storagePIDFILE=/var/data/danabang.storage/log/$NAME.pidRUNAS=tangruiif test ! -x $DAEMON; thenecho "Could not find $DAEMON"exit 0fi. /lib/lsb/init-functionsSTARTTIME=1DIETIME=10 # Time to wait for the server to die, in seconds# If this value is set too low you might not# let some servers to die gracefully and# 'restart' will not workrunning_pid() {# Check if a given process pid's cmdline matches a given namepid=$1name=$2[ -z "$pid" ] && return 1[ ! -d /proc/$pid ] && return 1cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`# Is this the expected server[ "$cmd" != "$name" ] && return 1return 0}running() {# Check if the process is running looking at /proc# (works for all users)# No pidfile, probably no daemon present[ ! -f "$PIDFILE" ] && return 1pid=`cat $PIDFILE`running_pid $pid $DAEMON || return 1return 0}start_server() {# Start the process using the wrapperstart-stop-daemon --background --start --quiet --pidfile $PIDFILE \ --make-pidfile --chuid $RUNAS \--exec $DAEMON -- $OPTION $VARerrcode=$?return $errcode}stop_server() {# Stop the process using the wrapperstart-stop-daemon --stop --quiet --pidfile $PIDFILE \--user $RUNAS \--exec $DAEMONerrcode=$?return $errcode}force_stop() {# Force the process to die killing it manually[ ! -e "$PIDFILE" ] && returnif running ; thenkill -15 $pid# Is it really dead?sleep "$DIETIME"sif running ; thenkill -9 $pidsleep "$DIETIME"sif running ; thenecho "Cannot kill $NAME (pid=$pid)!"exit 1fififirm -f $PIDFILE}case "$1" instart)log_daemon_msg "Starting $DESC" "$NAME"# Check if it's running firstif running ; thenlog_progress_msg "apparently already running"log_end_msg 0exit 0fiif start_server ; then# NOTE: Some servers might die some time after they start,# this code will detect this issue if STARTTIME is set# to a reasonable value[ -n "$STARTTIME" ] && sleep $STARTTIME # Wait some time if running ; then# It's ok, the server started and is runninglog_end_msg 0else# It is not running after we did startlog_end_msg 1fielse# Either we could not start itlog_end_msg 1fi;;stop)log_daemon_msg "Stopping $DESC" "$NAME"if running ; then# Only stop the server if we see it runningerrcode=0stop_server || errcode=$?log_end_msg $errcodeelse# If it's not running don't do anythinglog_progress_msg "apparently not running"log_end_msg 0exit 0fi;;force-stop)# First try to stop gracefully the program$0 stopif running; then# If it's still running try to kill it more forcefullylog_daemon_msg "Stopping (force) $DESC" "$NAME"errcode=0force_stop || errcode=$?log_end_msg $errcodefi;;restart|force-reload)log_daemon_msg "Restarting $DESC" "$NAME"errcode=0stop_server || errcode=$?# Wait some sensible amount, some server need this[ -n "$DIETIME" ] && sleep $DIETIMEstart_server || errcode=$?[ -n "$STARTTIME" ] && sleep $STARTTIMErunning || errcode=$?log_end_msg $errcode;;status)log_daemon_msg "Checking status of $DESC" "$NAME"if running ; thenlog_progress_msg "running"log_end_msg 0elselog_progress_msg "apparently not running"log_end_msg 1exit 1fi;;*)N=/etc/init.d/$NAMEecho "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2 exit 1;;esacexit 0。
Android初始化语言包含了四种类型的声明:Actions(行动)、Commands(命令)、Services(服务)和Options(选项)。
所有这些都是以行为单位的,各种记号由空格来隔开。
C语言风格的反斜杠号可用于在记号间插入空格。
双引号也可用于防止字符串被空格分割成多个记号。
行末的反斜杠用于折行。
注释行以井号(#)开头(允许以空格开头)。
Actions和Services声明一个新的分组。
所有的命令或选项都属于最近申明的分组。
位于第一个分组之前的命令或选项将会被忽略。
Actions和Services有唯一的名字。
如果有重名的情况,第二个申明的将会被作为错误忽略。
(???我们是否应该以覆盖来代替忽略) Actions(行动) ---------- Actions其实就是一序列的Commands(命令)。
Actions都有一个trigger(触发器),它被用于决定action的执行时间。
当一个符合action触发条件的事件发生时,action会被加入到执行队列的末尾,除非它已经在队列里了。
队列中的每一个action都被依次提取出,而这个action中的每个command(命令)都将被依次执行。
Init在这些命令的执行期间还控制着其他的活动(设备节点的创建和注销、属性的设置、进程的重启)。
Actions的形式如下: on 《trigger》 《command》 《command》 《command》 Services(服务) ---------- Services(服务)是一个程序,他在初始化时启动,并在退出时重启(可选)。
Services(服务)的形式如下: service 《name》《pathname》 [ 《argument》 ]* 《option》 《option》 ... Options(选项) ---------- Options(选项)是一个Services(服务)的修正者。
linux启动顺序讲解⼀、简单介绍RHEL开机时的先后顺序BIOS —> MBR —> Kernel —> init1、当电脑⼀打开电源时电脑就会进⼊BIOS(BIOS的⼯作主要是检测⼀些硬件设备);2、检测完后会进⼊MBR也就是boot loader(MBR位于硬盘的第⼀个扇区总共512bytes,其中前446bytes⾥⾯的编码是在选择引导分区也就是决定要由哪个分区来引导);3、载⼊系统的Kernel(核⼼),在Kernel⾥主要是载⼊电脑设备的驱动程序,以便可以控制电脑上的设备,并且以只读⽅式来挂载根⽬录,也就是⼀开始只能读取到根⽬录所对应的那个分区,所以/etc、/bin、/sbin、/dev、/lib这五个⽬录必须同根⽬录在⼀个分区中;4、最后启动init这个程序,所以init这个程序的进程编号为1,是Linux中第⼀个执⾏的程序;init这个程序会根据Run level来执⾏以下这些程序:·/etc/rc.d/rc.sysinit;·/etc/rc.d/rc 和etc/rc.d/rc?.d/·/etc/rc.d/rc.local·如果有适当的图形界⾯管理程序⼆、BIOS初始化时主要的三个任务BIOS(B asic I nput/O utput S ystem)1、电脑周边设备的检测,加电⾃检POST (Power on self test);2、BIOS会选择要由哪⼀个设备来开机,例如:软盘启动、光盘启动、⽹络启动、最常见的从硬盘启动;3、选择好由哪个设备开机后,就开始读取这个设备的MBR 引导扇区;三、介绍Boot Loader中的主要⼯作1、Boot Loader可以安装在两个地⽅:·安装在硬盘的MBR中;·当有时候MBR中被其他开机管理程序占⽤就可以将Boot Loader 安装在硬盘中的其中⼀个分区的引导扇区上,;2、Boot Loader的程序码分为两个阶段:(1)Boot Loader第⼀阶段的程序码⾮常⼩,只有446bytes,可以存⼊在MBR或是某⼀个分区的引导扇区⾥,(2)Boot Loader第⼀阶段的程序码是从boot 分区来载⼊的,就是说Boot Loader 第⼆阶段程序码存放在/boot 这个分区中;3、下⾯来看三个Boot Loader 的开机流程范例,如在⼀块硬盘中安装了两个系统分别为:windows 2003 和Red hat linux当电脑开机后,会先载⼊MBR通过第⼀阶段程序码来载⼊第⼆阶段程序码,进⼊GRUB开机菜单这⾥选择哪个系统就会载⼊相应的核⼼;四、介绍GRUB和grub.conf 这个配置⽂件的内容其实从MBR载⼊Boot Loader开始,载⼊Kernel,载⼊init这些程序之间都是由GRUB这个多重开机管理程序所负责的。
init是Linux系统里的根进程,是系统所有进程的祖先。
它的主要作用是根据记录在/etc/inittab 里的一个脚本(script)程序产生进程。
这个文件通常用于控制用户的登录模式。
Linux系统的有效登录模式有0~9共十种,不过沿用UNIX系统的至多6种的限制,一般只有1到6有效。
init一般在系统启动时自动运行,也可以由root用户调用。
它的作用是切换系统的运行状态。
它的命令格式是:init NUM〈回车〉,其中NUM表示1到6的任一数字。
6种模式中有两种是系统内定的:0:停止系统运行。
init 0〈回车〉相当于halt〈回车〉。
6:重启系统。
init 6〈回车〉相当于reboot〈回车〉。
如果你了解/etc/inittab文件,就千万不要把0设为缺省登录模式,否则你的Linux的运行就只能两点一线了——开机←→停机,或者是开机←→重启的无限循环。
其他的4种模式实际上是由操作系统确定的。
如果你愿意修改Linux的源代码,你也可以定义这4种(甚至6种)模式的实际功能。
其实只要知道Linux发布厂商的约定就足够了,下面我们就以蓝点2.0为例,看看init的常用约定吧——init 1——进入单用户模式。
这和开机是选择Safe Mode是一样的,可以以root的权限对系统进行管理,但是不能进入图形模式,也不支持中文,声卡和网络服务等就更不用提了。
总之,它是系统可运行的最低软硬件配置。
它和Windows的安全模式是比较相似的,但一个本质的差别:在于只要你在Linux下运行相应的命令,硬件设备是可以在这种模式下被驱动的。
例如只要你的光驱连线正确,一个mount /dev/cdrom命令,你的光盘内容就随时可以在/mnt/cdrom里读出来。
要注意的是这一模式的字符控制台不能支持中文,但进入Xwin 仍然能看到蓝点漂亮的中文字体,输入法也完全没有问题。
init 2——进入无网络服务的多用户模式如果你的计算机根本没有连网,这个模式就跟普通模式一样了。
简要分析linux系统的启动过程接触linux系统运维已经好⼏年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程:⼀般来说,所有的操作系统的启动流程基本就是:总的来说,linux系统启动流程可以简单总结为以下⼏步:1)开机BIOS⾃检,加载硬盘。
2)读取MBR,进⾏MBR引导。
3)grub引导菜单(Boot Loader)。
4)加载内核kernel。
5)启动init进程,依据inittab⽂件设定运⾏级别6)init进程,执⾏rc.sysinit⽂件。
7)启动内核模块,执⾏不同级别的脚本程序。
8)执⾏/etc/rc.d/rc.local9)启动mingetty,进⼊系统登陆界⾯。
linux系统安装时,如果要想设置开启启动项,可以:开机到BIOS提醒界⾯,按键F11(Dell服务器的做法)进⼊BIOS设置BOOT MENU,继⽽设置启动项:硬盘HD启动,光盘CD/DVD启动,还是U盘USB启动。
下⾯就linux操作系统的启动过程做⼀详细解析记录:加载内核操作系统接管硬件以后,⾸先读⼊ /boot ⽬录下的内核⽂件。
[root@bastion-IDC ~]# ll /boot/total 21668-rw-r--r--. 1 root root 105195 Nov 22 2013 config-2.6.32-431.el6.x86_64drwxr-xr-x. 3 root root 1024 Aug 22 16:31 efidrwxr-xr-x. 2 root root 1024 Aug 22 16:32 grub-rw-------. 1 root root 15217153 Aug 22 16:32 initramfs-2.6.32-431.el6.x86_64.imgdrwx------. 2 root root 12288 Aug 22 16:24 lost+found-rw-r--r--. 1 root root 193758 Nov 22 2013 symvers-2.6.32-431.el6.x86_64.gz-rw-r--r--. 1 root root 2518236 Nov 22 2013 System.map-2.6.32-431.el6.x86_64-rwxr-xr-x. 1 root root 4128368 Nov 22 2013 vmlinuz-2.6.32-431.el6.x86_64启动初始化进程内核⽂件加载以后,就开始运⾏第⼀个程序 /sbin/init,它的作⽤是初始化系统环境。
Linux学习笔记Init进程系统第一个进程位于/sbin/init/etc/inittab init进程配置文件Init 0 关闭Init 6 重启Vi /etc/inittabId:3:initdefalt:id:runlevels:action:process除此之外还有ABC三个运行级别,但在RHLinux中都没有意义。
这些级别在/etc/inittab 文件里指定。
这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d目录下的文件。
在大多数的Linux 发行版本中,启动脚本都是位于/etc/rc.d/init.d中的。
这些脚本被用ln 命令连接到/etc/rc.d/rcn.d 目录。
(这里的n 就是运行级0-6)文件的类型1.普通文件-2.目录文件 d3.链接文件l4.管道文件p5.设备文件b(块)、c(字符)Id 检查登录者详细身份Who –umH 查看登录会话的信息File 文件名查看文件的类型Cat 查看文件内容More 分屏查看文件内容Less 滚屏查看文件内容Head 显示文件头head –nTail 显示文件尾grep 查看符合条件的字符•–i (忽略字符大小写的区别)•–v (查找不匹配字符串)重要目录/etc/passwd 用户帐户信息文件/etc/shadow 用户帐户安全信息文件/etc/group 组帐户信息文件/etc/gshadow 组帐户安全信息文件/etc/default/useradd 用户默认配置文件/etc/skel/ 用于为新用户分配初始化脚本文件目录Linux操作系统下以不同颜色命名的文件类型蓝色文件----------目录白色文件----------一般性文件,如文本文件,配置文件,源码文件等浅蓝色文件----------链接文件,主要是使用ln命令建立的文件绿色文件----------可执行文件,可执行的程序红色文件-----------压缩文件或者包文件Linux下用字符表示的文件类型-:普通文件d:目录文件l:链接文件b:块设备文件c:字符设备文件p:管道文件Linux文件系统配置文件/proc-----内核提供的一个接口,主要用来存储系统统计信息;/etc/mtab--------随着/proc/mount的变化而变化,文件系统的安装和卸载都会在这个文件中反映出来;/etc/fstab-------列出当前系统在启动时自动安装的所有文件系统,也可以使用mount -a 这个命令来手动的安装这个文件中列出的所有文件系统;另外也可以通过修改这个配置文件,使系统在启动时自动安装我们所需要的其他的文件系统;/etc/mtools.conf---------Dos文件系统上的操作的配置文件Linux系统管理配置文件/etc/group----------列出有效的组名称以及组中的用户信息;/etc/passwd---------帐号的密码文件;帐号----密码------用户号(UID)-----用户组号(GID)----所属组-----用户主目录---用户所使用的shell类型/etc/shadow--------包含加密后的帐号信息;/etc/shells-------包含系统的可以使用的shell的列表;/etc/motd---------每日的信息,root管理员向系统中所有用户传达信息时使用Linux系统命令配置文件/etc/lilo.conf 包含系统的缺省引导命令行参数,还有启动时使用的不同映象。
linux 的0号进程和1号进程linux 的 0号进程 和 1 号进程Linux 下有3个特殊的进程,idle 进程(PID = 0), init 进程(PID = 1)和kthreadd(PID = 2)* idle 进程由系统⾃动创建, 运⾏在内核态idle 进程其pid=0,其前⾝是系统创建的第⼀个进程,也是唯⼀⼀个没有通过fork 或者kernel_thread 产⽣的进程。
完成加载系统后,演变为进程调度、交换* init 进程由idle 通过kernel_thread 创建,在内核空间完成初始化后, 加载init 程序, 并最终⽤户空间由0进程创建,完成系统的初始化. 是系统中所有其它⽤户进程的祖先进程Linux 中的所有进程都是有init 进程创建并运⾏的。
⾸先Linux 内核启动,然后在⽤户空间中启动init 进程,再启动其他系统进程。
在系统启动完成完成后,init 将变为守护进程监视系统其他进程。
* kthreadd 进程由idle 通过kernel_thread 创建,并始终运⾏在内核空间, 负责所有内核线程的调度和管理它的任务就是管理和调度其他内核线程kernel_thread, 会循环执⾏⼀个kthread 的函数,该函数的作⽤就是运⾏kthread_create_list 全局链表中维护的kthread, 当我们调⽤kernel_thread 创建的内核线程会被加⼊到此链表中,因此所有的内核线程都是直接或者间接的以kthreadd 为⽗进程我们下⾯就详解分析0号进程的前世(init_task)今⽣(idle)idle 的创建在smp 系统中,每个处理器单元有独⽴的⼀个运⾏队列,⽽每个运⾏队列上⼜有⼀个idle 进程,即有多少处理器单元,就有多少idle 进程。
idle 进程其pid=0,其前⾝是系统创建的第⼀个进程,也是唯⼀⼀个没有通过fork()产⽣的进程。
在smp 系统中,每个处理器单元有独⽴的⼀个运⾏队列,⽽每个运⾏队列上⼜有⼀个idle 进程,即有多少处理器单元,就有多少idle 进程。
Linux0号进程,1号进程,2号进程 本节我们将从linux启动的第⼀个进程说起,以及后⾯第⼀个进程是如何启动1号进程,然后启动2号进程。
然后系统中所有的进程关系图做个简单的介绍⼀、0号进程 0号进程,通常也被称为idle进程,或者也称为swapper进程。
0号进程是linux启动的第⼀个进程,它的task_struct的comm字段为"swapper",所以也称为swpper进程。
1#define INIT_TASK_COMM "swapper" 当系统中所有的进程起来后,0号进程也就蜕化为idle进程,当⼀个core上没有任务可运⾏时就会去运⾏idle进程。
⼀旦运⾏idle进程则此core就可以进⼊低功耗模式了,在ARM上就是WFI。
我们本节重点关注是0号进程是如何启动的。
在linux内核中为0号进程专门定义了⼀个静态的task_struct的结构,称为init_task。
1/*2 * Set up the first task table, touch at your own risk!. Base=0,3 * limit=0x1fffff (=2MB)4*/5struct task_struct init_task6 = {7 #ifdef CONFIG_THREAD_INFO_IN_TASK8 .thread_info = INIT_THREAD_INFO(init_task),9 .stack_refcount = ATOMIC_INIT(1),10#endif11 .state = 0,12 .stack = init_stack,13 .usage = ATOMIC_INIT(2),14 .flags = PF_KTHREAD,15 .prio = MAX_PRIO - 20,16 .static_prio = MAX_PRIO - 20,17 .normal_prio = MAX_PRIO - 20,18 .policy = SCHED_NORMAL,19 .cpus_allowed = CPU_MASK_ALL,20 .nr_cpus_allowed= NR_CPUS,21 .mm = NULL,22 .active_mm = &init_mm,23 .tasks = LIST_HEAD_INIT(init_task.tasks),24 .ptraced = LIST_HEAD_INIT(init_task.ptraced),25 .ptrace_entry = LIST_HEAD_INIT(init_task.ptrace_entry),26 .real_parent = &init_task,27 .parent = &init_task,28 .children = LIST_HEAD_INIT(init_task.children),29 .sibling = LIST_HEAD_INIT(init_task.sibling),30 .group_leader = &init_task,31 RCU_POINTER_INITIALIZER(real_cred, &init_cred),32 RCU_POINTER_INITIALIZER(cred, &init_cred),33 .comm = INIT_TASK_COMM,34 .thread = INIT_THREAD,35 .fs = &init_fs,36 .files = &init_files,37 .signal = &init_signals,38 .sighand = &init_sighand,39 .blocked = {{0}},40 .alloc_lock = __SPIN_LOCK_UNLOCKED(init_task.alloc_lock),41 .journal_info = NULL,42 INIT_CPU_TIMERS(init_task)43 .pi_lock = __RAW_SPIN_LOCK_UNLOCKED(init_task.pi_lock),44 .timer_slack_ns = 50000, /* 50 usec default slack */45 .thread_pid = &init_struct_pid,46 .thread_group = LIST_HEAD_INIT(init_task.thread_group),47 .thread_node = LIST_HEAD_INIT(init_signals.thread_head),48 };49 EXPORT_SYMBOL(init_task); 这个结构体中的成员都是静态定义了,为了简单说明,对这个结构做了简单的删减。
Linuxinit详解(0,1,2,3,4,5,6)⼀、什么是 init init是Linux系统操作中不可缺少的程序之⼀。
所谓的init进程,它是⼀个由内核启动的⽤户级进程。
内核⾃⾏启动(已经被载⼊内存,开始运⾏,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动⼀个⽤户级程序init的⽅式,完成引导进程。
所以,init始终是第⼀个进程(其进程编号始终为1)。
内核会在过去曾使⽤过init的⼏个地⽅查找它,它的正确位置(对Linux系统来说)是/sbin/init。
如果内核找不到init,它就会试着运⾏/bin/sh,如果运⾏失败,系统的启动也会失败。
⼆、运⾏级别 那么,到底什么是运⾏级呢? 简单的说,运⾏级就是操作系统当前正在运⾏的功能级别。
这个级别从0到6 ,具有不同的功能。
不同的运⾏级定义如下:(可以参考Red Hat Linux ⾥⾯的/etc/inittab) 0 - 停机或者关机(千万不能把 initdefault 设置为0 ) 1 - 单⽤户模式(只有 root ⽤户进⾏维护) 2 - 多⽤户。
没有 NFS(Net File System) 3 - 完全多⽤户模式(标准的运⾏级) 4 - 没有⽤到 5 - X11,也称图形化(xwindow,即图形界⾯) 6 - 重新启动(千万不要把 initdefault 设置为 6 ) 这些级别在 /etc/inittab ⽂件⾥指定。
这个⽂件是 init 程序寻找的主要⽂件,最先运⾏的服务是放在 /etc/rc.d ⽬录下的⽂件。
在⼤多数的Linux 发⾏版本中,启动脚本都是位于 /etc/rc.d/init.d中的。
这些脚本被⽤ ln 命令连接到 /etc/rc.d/rcn.d ⽬录。
(这⾥的 n 就是运⾏级0-6) [root@test rc.d]# pwd/etc/rc.d[root@test rc.d]# lltotal 108drwxr-xr-x 2 root root 4096 Jan 32018 init.d-rwxr-xr-x 1 root root 2255 Dec 202011 rcdrwxr-xr-x 2 root root 4096 Nov 232017 rc0.ddrwxr-xr-x 2 root root 4096 Nov 232017 rc1.ddrwxr-xr-x 2 root root 4096 Nov 232017 rc2.ddrwxr-xr-x 2 root root 4096 Nov 232017 rc3.ddrwxr-xr-x 2 root root 4096 Nov 232017 rc4.ddrwxr-xr-x 2 root root 4096 Nov 232017 rc5.ddrwxr-xr-x 2 root root 4096 Nov 232017 rc6.d-rwxr-xr-x 1 root root 1434 Jan 102019 rc.local-rwxr-xr-x 1 root root 27052 Feb 222012 rc.sysinit查看当前系统的运⾏级别:[root@test ~]# runlevelN 3前⾯的参数N是系统之前运⾏级别,后边的3是系统当前的运⾏级别。
Linux文件系统启动过程及login的实现
1.busybox简介
busybox是一个集成了一百多个最常用linux命令和工具的软件,它将许多常用的LINUX 命令和工具结合到了一个单独的可执行程序中。
虽然与相应的GNU工具比较起来,busybox 所提供的功能和参数略少,但在比较小的系统(例如启动盘)或者嵌入式系统中,已经足够了。
busybox在设计上就充分考虑了硬件资源受限的特殊工作环境。
它采用一种很巧妙的办法减少自己的体积:所有的命令都通过“插件”的方式集中到一个可执行文件中,在实际应用过程中通过不同的符号链接来确定到底要执行哪个操作。
例如最终生成的可执行文件为busybox,当为它建立一个符号链接ls的时候,就可以通过执行这个新命令实现列目录的功能。
采用单一执行文件的方式最大限度地共享了程序代码,甚至连文件头、内存中的程序控制块等其他操作系统资源都共享了,对于资源比较紧张的系统来说,是最合适不过了。
Busybox配置如下:
编译make TARGET_ARCH=arm,生成的目标代码位于_install目录下。
2.文件系统启动过程
Linux的启动过程主要分成两个阶段:
1.启动内核。
在这个阶段,内核装入内存并在初始化每个设备驱动器时打印信息。
2.执行程序init。
装入内核并初始化设备后,运行init程序。
init程序处理所有程序的启动,包括重要系统程序和其它指定在启动时装入的软件。
现在主要详细介绍一下文件系统的启动过程,即linux启动过程的第二阶段,大概分为以下几个过程:
(1)运行init
init的进程号是1,从这一点就能看出,init进程是系统所有进程的起点,linux在完成核内引导以后,就开始运行init程序。
init程序需要读取配置文件/etc/inittab,以查看下一步做什么。
inittab是一个不可执行的文本文件,它有若干行指令所组成,告诉 init 要进入什么运行级别,以及在哪里可以找到该运行级别的配置文件。
以下是qsan的inittab 文件(部分注释省略):
以上面的inittab文件为例,来说明一下inittab的格式。
其中以#开始的行是注释行,除了注释行之外,每一行都有以下格式:
id:runlevel:action:process
id –入口标识符,用于标识文件/etc/inittab中的每一个登记项。
它是一个1-4位的字符串,对于getty或mingetty等其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。
runlevel–运行级。
说明该登记项适用于哪一个运行级。
为空表示适用于所有级别.它是init所处于的运行级别标识,一般使用0-6以及S或s。
0、1、6运行级别被系统保留。
0作为halt动作,1作为重启至单用户模式,6为重启。
S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现,实际上,进入单用户模式时,init直接在控制台(/dev/console)上运行/sbin/sulogin。
runlevel可以是并列的多个值,以匹配多个运行级别,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。
action–定义init命令应该向进程实施什么动作。
包括以下:
respawn-无论何时它终止,均重新启动命令
wait-运行命令一次。
在继续之前,init等待它终止
once-运行命令一次
boot-命令在启动过程中运行。
忽略运行等级字段
bootwait-命令在启动过程中运行,忽略运行等级字段。
在继续之前,init等待该进程终止initdefault-定义Linux系统的默认运行等级
powerwait-停电时命令运行。
在继续之前,init等待该进程终止
powerfail-停电时命令运行。
在继续之前,init不等待该进程终止
powerokwait-恢复电力时命令运行。
在继续之前,init等待该进程终止
powerfailnow-UPS发出电池即将耗尽的信号时,运行该命令
process - 是具体的执行程序。
程序后面可以带参数。
(2)系统初始化
sysinit、boot、bootwait等action将在系统启动时无条件运行,而忽略其中的runlevel。
因此init进程首先会执行etc/init.d/rcS脚本,rcS内容如下:
(3)启动对应运行级别的守护进程
返回/inittab,接下来根据系统进入的运行级别,启动对应运行级别的守护进程,这里为4,init将执行配置文件inittab中的以下这行:
l4:4:wait:/etc/init.d/rc 4
这一行表示以4为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受4作为参数,去执行/etc/rc.d/rc4.d/目录下的所有的rc启动脚本,/etc/rc.d/rc4.d/目录中的这些启动脚本实际上都是一些链接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。
而这些rc启动脚本有着类似的用法,它们一般能接受start、stop、restart、status等参数。
/etc/rc.d/rc4.d/中的rc启动脚本通常是K或S开头的链接文件,对于以S开头的启动脚本,将以start参数来运行。
而如果发现存在相应的脚本也存在K打头的链接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。
这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。
(4)建立终端
rc执行完毕后,返回init。
这时基本系统环境已经设置好了,各种守护进程也已经启动了。
init接下来会打开终端,以便用户登录系统,如以下2行:
T0:134:respawn:/sbin/getty -L ttyS0 115200 vt100
T1:1:respawn:/sbin/getty -L ttyS1 115200 vt100
从上面可以看出在1、3、4的运行级别中将以respawn方式运行getty程序,它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户名将作为参数传给login程序来验证用户的身份。
注意:如果想绕过登录验证过程,想直接进入shell界面的话,则把以上两行注释掉,改为:T0:134:respawn:/bin/sh
(5)登录系统,启动完成
getty进程接收到用户名后,启动login进程.
login进程要求用户输入口令.
用户输入口令.
login进程对username和password进行检查.
login启动shell进程.
shell进程根据/etc/password中的shell类型,启动相应的shell.并启动/etc/profile文件和$HOME/.bash_profile文件.最后出现shell提示符,等待用户输入命令.
至此,启动过程结束。
3.login验证过程
Linux的帐号验证程序是login,login会接收getty传来的用户名作为用户名参数。
然后login会对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login 将输出nologin文件的内容,然后退出。
这通常用来系统维护时防止非root用户登录。
只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root 可以在任何终端上登录。
/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。
在分析完用户名后,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置帐户的其它信息,比如:主目录是什么、使用何种shell。
如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为/bin/bash。
login程序成功后,会向对应的终端在输出最近一次登录的信息(在/var/log/lastlog 中有记录),并检查用户是否有新邮件(在/usr/spool/mail/的对应用户名目录下)。
然后开始设置各种环境变量:对于bash来说,系统首先寻找/etc/profile脚本文件,并执行它;然后如果用户的主目录中存在.bash_profile文件,就执行它,在这些文件中又可能调用了其它配置文件,所有的配置文件执行后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。
以下是passwd,shadow和group脚本的格式说明:
注:一个最简单的文件系统至少需要包含以下几个目录,/sbin,/bin,/dev(需要console 和ttyS0两个文件),/proc,/etc(需要inittab,rcS文件),/home.。