仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 451|回复: 7
打印 上一主题 下一主题

[其他Linux] 带来一篇Linux 的启动流程

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-15 22:16:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
常常有些朋友在Linux论坛问一些问题,不过,其中大多数的问题都是很基的。
  半年前,我写了《盘算机是怎样启动的?》,切磋BIOS和主引诱纪录的感化。
  那篇文章不触及操纵体系,只与主板的板载程序有关。明天,我想接着往下写,切磋操纵体系接受硬件今后产生的事变,也就是操纵体系的启动流程。



  这个部分对照成心思。由于在BIOS阶段,盘算机的举动基础上被写逝世了,程序员能够做的事变其实不多;可是,一旦进进操纵体系,程序员几近能够定制一切方面。以是,这个部分与程序员的干系更亲切。
  我次要体贴的是Linux操纵体系,它是今朝服务器真个支流操纵体系。上面的内容针对的是Debian刊行版,由于我对其他刊行版不敷熟习。
  第一步、加载内核

  操纵体系接受硬件今后,起首读进/boot目次下的内核文件。



  以我的电脑为例,/boot目次上面也许是如许一些文件:
  1.   $ls/boot    config-3.2.0-3-amd64  config-3.2.0-4-amd64  grub  initrd.img-3.2.0-3-amd64  initrd.img-3.2.0-4-amd64  System.map-3.2.0-3-amd64  System.map-3.2.0-4-amd64  vmlinuz-3.2.0-3-amd64  vmlinuz-3.2.0-4-amd64  
复制代码
  第二步、启动初始化历程

  内核文件加载今后,就入手下手运转第一个程序/sbin/init,它的感化是初始化体系情况。



  因为init是第一个运转的程序,它的历程编号(pid)就是1。其他一切历程都从它衍生,都是它的子历程。
  第三步、加载开机启动程序

  很多程序是开机启动的。它们在Windows叫做"服务"(service),在Linux就叫做"保卫历程"(daemon)。一切"保卫历程"的启动剧本,都放在/init.d目次上面。init历程的次要义务,就是一一运转这些剧本。



  上面是我的电脑的/etc/init.d目次,内里有良多程序。
  1.   $ls/etc/init.d    acpid  alsa-utils  anacron  apache2  atd  avahi-daemon  binfmt-support  ...  
复制代码
  /etc/init.d这个目次名最初一个字母d,是directory的意义,暗示这是一个目次,用来与程序/etc/init辨别。
  第四步、运转级别
  有些开机启动程序,其实不必要一切场所都启动。好比,把Linux看成桌面情况时,就不必要启动Apache。体系同意为分歧的场所,分派分歧的开机启动程序,这就叫做"运转级别"(runlevel)。也就是说,启动时依据"运转级别",断定要运转哪些程序。



  Linux默许供应七种运转级别(0-6)。一样平常来讲,0是关机,1是单用户形式(也就是保护形式),6是重启。其他级别每一个刊行版不太一样,关于Debian来讲,2到5都是一样的多用户形式(也就是一般形式)。
  翻开文件/etc/inittab,能够看到第一行是如许的:
  1.   id:2:initdefault:  
复制代码
  这就是说,启动时的默许运转级别为2,用户能够修正这个值。
  init历程读取/etc/inittab文件,然后依照指定的"运转级别",加载响应的开机启动程序。那末,体系怎样晓得每一个级别应当加载哪些程序呢?
  回覆是每一个运转级别在/etc目次上面都有一个对应的子目次,内里指定了要加载的程序。
  1.   /etc/rc0.d  /etc/rc1.d  /etc/rc2.d  /etc/rc3.d  /etc/rc4.d  /etc/rc5.d  /etc/rc6.d  
复制代码
  下面目次名中的"rc",暗示runcommand(运转程序),最初的d暗示directory(目次)。让我们看看/etc/rc2.d目次中究竟指定了哪些程序。
  1.   $ls/etc/rc2.d    README  S01motd  S13rpcbind  S14nfs-common  S16binfmt-support  S16rsyslog  S16sudo  S17apache2  S18acpid  ...  
复制代码
  能够看到,除第一个文件README之外,其他文件都是"字母S+两位数字+程序名"的情势。字母S暗示Start,也就是启动的意义(启动剧本的运转参数为start),假如这个地位是字母K,就代表Kill(封闭),即假如从其他运转级别切换过去,必要封闭的程序(启动剧本的运转参数为stop)。前面的两位数字暗示处置按次,数字越小越早处置,以是第一个启动的程序是motd,然后是rpcbing、nfs......数字不异时,则依照程序名的字母按次启动。
  一切这件文件都是链接文件,指向目次/etc/init.d中对应的启动剧本文件。假如想增添或删除某些开机启动程序,不倡议手动修正这些链接文件,而是用一些专门命令举行办理(参考这里和这里)。
  第五步、用户登录

  开机启动程序加载终了今后,就要让用户登录了。



  一样平常来讲,用户的登录体例有三种:
  (1)命令行登录
  (2)ssh登录
  (3)图形界面登录
  这三种情形,都有本人的体例对用户举行认证。
  (1)命令行登录:init历程挪用getty程序(意为getteletype),让用户输出用户名和暗码。输出完成后,再挪用login程序,查对暗码(Debian还会再多运转一个身份查对程序/etc/pam.d/login)。假如暗码准确,就从文件/etc/passwd读取该用户指定的shell,然后启动这个shell。
  (2)ssh登录:这时候体系挪用sshd程序(Debian还会再运转/etc/pam.d/ssh),代替getty和login,然后启动shell。
  (3)图形界面登录:init历程挪用显现办理器,Gnome图形界面临应的显现办理器为gdm(GNOMEDisplayManager),然后用户输出用户名和暗码。假如暗码准确,就读取/etc/gdm3/Xsession,启动用户的会话。
  第六步、进进loginshell

  所谓shell,复杂说就是命令行界面,让用户能够间接与操纵体系对话。用户登录时翻开的shell,就叫做loginshell。



  Debian默许的shell是Bash,它会读进一系列的设置文件。上一步的三种情形,在这一步的处置,也存在差别。
  (1)命令行登录:起首读进/etc/profile,这是对一切用户都无效的设置;然后顺次寻觅上面三个文件,这是针对以后用户的设置。
  1.   ~/.bash_profile  ~/.bash_login  ~/.profile  
复制代码
  必要注重的是,这三个文件只需有一个存在,就不再读进前面的文件了。好比,如果~/.bash_profile存在,就不会再读进前面两个文件了。
  (2)ssh登录:与第一种情形完整不异。
  (3)图形界面登录:只加载/etc/prfile和~/.profile。也就是说,~/.bash_profile不论有无,都不会运转。
  第七步,翻开non-loginshell

  厚道说,上一步完成今后,Linux的启动历程就算停止了,用户已能够看到命令行提醒符大概图形界面了。可是,为了内容的完全,必需再先容一下这一步。
  用户进进操纵体系今后,经常会再手动开启一个shell。这个shell就叫做non-loginshell,意义是它分歧于登录时呈现的谁人shell,不读取/etc/profile和.profile等设置文件。



  non-loginshell的主要性,不但在于它是用户最常打仗的谁人shell,还在于它会读进用户本人的bash设置文件~/.bashrc。年夜多半时分,我们关于bash的定制,都是写在这个文件内里的。
  你大概会问,如果不进进non-loginshell,岂不是.bashrc就不会运转了,因而bash也就不克不及完成定制了?现实上,Debian已思索到这个成绩了,请翻开文件~/.profile,能够看到上面的代码:
  1.   if[-n"$BASH_VERSION"];then    if[-f"$HOME/.bashrc"];then      ."$HOME/.bashrc"    fi  fi  
复制代码
  下面代码先判别变量$BASH_VERSION是不是有值,然后判别主目次下是不是存在.bashrc文件,假如存在就运转该文件。第三行开首的谁人点,是source命令的简写情势,暗示运转某个文件,写成"source~/.bashrc"也是能够的。
  因而,只需运转~/.profile文件,~/.bashrc文件就会连带运转。可是上一节的第一种情形提到过,假如存在~/.bash_profile文件,那末有大概不会运转~/.profile文件。办理这个成绩很复杂,把上面代码写进.bash_profile就好了。
  1.   if[-f~/.profile];then    .~/.profile  fi  
复制代码
  如许一来,不论是哪一种情形,.bashrc城市实行,用户的设置能够宁神地都写进这个文件了。
  Bash的设置之以是云云烦琐,是因为汗青缘故原由酿成的。初期的时分,盘算机运转速率很慢,载进设置文件必要很长工夫,Bash的作者只好把设置文件分红了几个部分,阶段性载进。体系的通用设置放在/etc/profile,用户团体的、必要被一切子历程承继的设置放在.profile,不必要被承继的设置放在.bashrc。
  特地提一下,除Linux之外,MacOSX利用的shell也是Bash。可是,它只加载.bash_profile,然后在.bash_profile内里挪用.bashrc。并且,不论是ssh登录,仍是在图形界面里启动shell窗口,都是云云。
  参考链接
[1]DebianWiki,EnvironmentVariables
[2]DebianWiki,DotFiles
[3]DebianAdministration,Anintroductiontorun-levels
[4]DebianAdmin,DebianandUbuntuLinuxRunLevels
[5]LinuxInformationProject(LINFO),RunlevelDefinition
[6]LinuxQuestions.org,Whatarerunlevels?
[7]DaltonHubble,BashConfigurationsDemystified
linux系统的文件布置,etc/,opt/目录的内容等;
分手快乐 该用户已被删除
沙发
发表于 2015-1-17 17:25:01 | 只看该作者
熟读Linux系统有关知识,如系统目录树,有关内容可购书阅读或搜索论坛。
透明 该用户已被删除
板凳
发表于 2015-1-31 08:10:32 | 只看该作者
然我们对Linux的学习首先是通过对它的产生,发展,到今天仍然在不断完善开始的。
小妖女 该用户已被删除
地板
发表于 2015-2-6 18:58:00 | 只看该作者
得到到草率的回答或者根本得不到任何Linux答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。
因胸联盟 该用户已被删除
5#
发表于 2015-2-18 08:49:27 | 只看该作者
然我们对Linux的学习首先是通过对它的产生,发展,到今天仍然在不断完善开始的。
再见西城 该用户已被删除
6#
发表于 2015-3-6 03:52:42 | 只看该作者
把这个问题放在其他Linux社区请求帮助也是一种选择。如果Linux得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。
变相怪杰 该用户已被删除
7#
发表于 2015-3-12 21:08:29 | 只看该作者
一些显而易见的小错误还是用vi改正比较方便。以后的大一点的程序就得在Linux下调试了,因为有的头文件在VC里面说找不到。?
小魔女 该用户已被删除
8#
发表于 2015-3-20 04:31:24 | 只看该作者
如果你想深入学习Linux,看不懂因为文档实在是太难了。写的最好的、最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 14:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表