不能excel打开无内容wwW790ru里面内容了,朋友那790rucOm才找的

打开的时候wwW790ru页面老是显示联接错误,如今的790rucOm是怎么回事_百度知道
打开的时候wwW790ru页面老是显示联接错误,如今的790rucOm是怎么回事
我有更好的答案
消息不会传的太快的:63y.ky5.tech 只有少数人知道
为您推荐:
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。404 Not Found
404 Not Found
The requested URL was not found on this server.
您要找的内容已被删除打开的时候wwW790ru页面老是显示联接错误,如今的790rucOm是怎么回事_denote唔懂啦_新浪博客
打开的时候wwW790ru页面老是显示联接错误,如今的790rucOm是怎么回事
“不怎样,是个事妈,小肚鸡肠又自以为是。”看起来石江对他的印象很是不好。
  “你和他没矛盾吧?还能说的上话吗?”杨耕有点担心。
  “没什么矛盾,咱们管理的是王景岩,和他不直接发生关系,怎么了?”石江弹了弹烟灰,问道。他不明白杨耕为什么会突然关心起这个讨厌的家伙来。
  “那就好,帮我个忙,你看看我们在呼市或者包头,有没有产品升级、加站点之类的项目,就是那种万八千块钱的。挑出来。”
  “这种项目每个月都会有不少。这和蔡晓雨有什么关系?”石江有些不解。
  “那就好,找出一个来,设法让蔡晓雨做。”
  “领导,你没事吧?蔡晓雨现在可是弘智的代理!”石江没想到杨耕会说这种话。
  “不用担心,责任由我来负,你只管做,不过,我可不是让他升级成弘智的软件,你的任务还是让他升级成我们飞捷的产品。有困难吗?”
  石江没有立刻说话,而是猛吸了一口烟,愣愣的看了杨耕半天,才道:“困难倒是没有,这家伙做弘智代理的时候,也想拿我们的货。我没同意,你知道咱们的行规。不过这小子很贪,有好处就上。我只是担心这样做合不合适?”石江说的行规,是指产品代理的唯一性。也就是说任何一个厂家都不允许自己的代理商同时销售竞争对手的产品,这是天条!
  杨耕明白石江的担心,自己这样做是很容易遭人怀疑的。于是解释道:“老石,你放心吧,这件事情我会给司徒总汇报,你也可以提前给司徒说一下。”
  “那倒不用,我马上就办。”石江放心了。看起来杨耕这样做应该不是出于私心。
  石江刚出去,人力资源部的小胡就把杨耕堵在了会议室。“杨领导,集团一年一度的优秀员工评审马上开始了,司徒总让我找你推荐一个人。你看看你部门谁合适?”
  杨耕对这种事一贯不热心,他觉得类似的评审基本都是扯淡。于是看着小姑娘,嬉皮笑脸的说道:“就一个吗?我把部门同事都推荐上去可以吗?”
  “你想得倒美,不行,只有一个。”小胡笑道。
  “那就魏丽娜吧。”杨耕不假思索地说道。
  朱弘毅的目光越过韩国川,落到了后面墙上的一幅山水画上,画中是蓝天、白云、高山、瀑布。山石林立、绿树葱葱。一个出家人拄着竹杖,踯躅在山水间。水不容泛,人大于山。这幅画他看了无数遍了,但是还是不能理解其中的意境,尤其是和画相配的那幅偈子:云在青天水在瓶。
  “占了天时,失了先机!”韩国川一直静静的听着朱弘毅的汇报,没说什么,脸上的表情还是淡淡的,看不出有任何的变化。等朱弘毅汇报完,他才开口总结道。
  朱弘毅坐在韩国川对面,看起来神情有些沮丧。韩国川说得没错,这个机会的丧失有些不可原谅。像梁启印这种人可不是随便就能见到的。
  韩国川是昨天刚刚出差回京的,朱弘毅接到华一答疑会邀请函后,就直接来到了他的办公室。朱弘毅清楚,华一项目已经超出了业务的范畴,开始渐渐变成了一个政治项目了。而‘业务’在‘政治’面前似乎连侏儒都算不上。这种项目只允许成功,不允许失败。但是越是大的项目越是三分人事七分天。谁都难说胜败,所以最好的办法就是及时汇报。
  看着朱弘毅沮丧的表情,韩国川知道小伙子的压力太大了。他了解朱弘毅,这个人少年老成,一般事情很难影响他的情绪,即使影响,他也基本能做到面不改色。但是今天的情况显然让他感到不安了。
  “弘毅,干嘛这么着急啊,项目不是才开始吗?这种大项目谁都没有必胜的把握,大家都是摸着石头过河,何况别人手里的牌未必赶得上我们。”韩国川安慰着。
  朱弘毅明白韩国川的意思,他的汇报实际上也带有一点私心。他必须让韩国川清楚,问题出在哪里。也算是给自己留一条后路。其实朱弘毅不说,韩国川也明白,和于德仁一起出去打单的确是一件令人提心吊胆的事。朱弘毅运气确实不好。
  看着桌上的邀请函,韩国川接着说道:“弘毅,这四家都不是善茬,你怎么看待他们。”
  “格雷开始渐渐的有问题了,估计前期犯了不可饶恕的错误。不过并不是没有翻盘的机会,只是不知道他们是否意识到了。其他三家,我了解得太少,陈雅那边也不知道他们做了什么。估计和我们一样都是刚介入不久。不过从常理判断,这样的项目,谁手里都应该有个金钢钻,否则断然不会轻易介入。”
  “有道理,现在的关键是我们必须要了解更多的对手情况,我们开始发展内线了吗?”韩国川问道。
  “还没有,我需要一个帮手。这事也正想和你商量,事关重大,我不想让分公司参与,但是又不知道部门里谁参与好。”朱弘毅试探着说道。
  韩国川明白朱弘毅的意思,日常的项目该让谁去做,朱弘毅是从不给韩国川商量的,只是事后给他打个招呼。不过这个项目的确有些非彼寻常。朱弘毅不敢擅自做主了。
  韩国川抽出两支烟,扔给朱弘毅一只,自己也点上,吸了一口,眯着眼睛问道:“你有目标人选了吗?”
  “还没有,想征求你的看法。”朱弘毅也点起烟,答道。
  “你看格格怎么样?她是蒙族人,也许比较容易谈的来。”
  “我看行,就她吧!”朱弘毅迅速地答道。
  听朱弘毅这么一说,韩国川马上意识到,这个家伙肯定是早就想好了,只是等着自己说出来,不由得笑了笑,小伙子真是煞费苦心了。
  最近关于俩人的风言风语就开始多起来了。朱弘毅未娶,格格未嫁。按说有点江湖传说再正常不过了,但是偏偏瑞和有个很死的规定,公司内部员工之间不准谈恋爱,否则必须有一个人离开,所以这两位的情况也只有他们自己知道了。
  这些风言风语韩国川也了解一些,不过他可没打算管。这是唐思哲的规定,可不是他韩国川的规定。让格格加入项目也完全是出于工作考虑。看着有些不好意思的朱弘毅,韩国川赶忙转移了话题。
  “有什么进一步的想法吗?”韩国川问道。
  “从陈雅那里得到一个消息,华一准备进军乳业,可能要做牛奶和冰激凌。我想从这里寻找突破口。”
  “我怎么觉得他们做的牛奶会有股煤渣子味呢?”韩国川半开玩笑的说道。
  “他们确实没有经验,尤其是在食品分销方面,但是这是我们的专长。国内这个行业的分销软件我们占了大半壁江山。而且飞捷和弘智在这方面都很差,我们一旦改变了华一的采购顺序,就会抢得先机。我想试试能不能通过这招把飞捷和弘智‘切’出去。”
  “好,先按你的思路做,一旦涉及到经营方向的问题,董事会必然会过问,尹国民也好说话了。不过,还是那句话,成败这种事情不要看得太重。很多事情都是尽人力,听天命。”
denote鍞旀噦鍟
博客等级:
博客积分:0
博客访问:9
关注人气:0
荣誉徽章:全球最新的免费资源发布区
俄罗斯免费邮箱服务:Mail.ru,Yandex,Pochta.ru-支持SMTP外贸必备邮箱
& 日 17:13 &
邮箱是我们注册网络服务一项必备的工具,国内邮箱最流行的当属QQ Mail、网易邮箱、新浪邮箱了,而国外用的最多的邮箱应当是Gmail、Hotmail、Yahoo Mail这三家了。不过,对于一些外贸等用户来说,拥有一个特定国家的邮箱对于交流洽谈合作是非常重要。
俄罗斯免费邮箱服务可能平时大部分人还是用不着,但近年来随着国内不少朋友兴起的俄罗斯“外贸热”,选择一个Mail.ru,Yandex等俄罗斯流行的邮箱对于发展俄罗斯市场,寻求俄罗斯用户是十分有利的。QQ Mail、网易邮箱、新浪邮箱经常会被判定为垃圾邮件。
本篇文章就来为大家分享一下Mail.ru,Yandex,Pochta.ru这三个俄罗斯流行的免费邮箱服务,其中Mail.ru是俄罗斯元老级的邮箱,俄罗斯大多数的个人邮箱后缀都是@,Yandex.ru邮箱由于Yandex搜索引擎在俄罗斯的市场占有率,用户也是非常多。
还在找到其它的免费邮箱和SMTP发信的邮件服务,可以看看:
1、阿里邮箱:
俄罗斯免费邮箱服务:Mail.ru,Yandex,-支持SMTP外贸必备邮箱
一、 Mail.ru免费邮箱申请使用
1、Mail.ru官网:
1、官方网站:https://mail.ru/
2、Mail.ru是俄罗斯最大的电子信箱服务网站之一,也是俄罗斯发展最快的信息门户,类似于中国的网易。大家熟悉的Agent就是基本这个邮箱的即时通讯软件,用起来和QQ差不多。
3、进入到Mail.ru后,点击注册新用户,输入你的个人信息、密码等,邮箱域名后缀除了mail.ru ,还有bk.ru、inbox.ru 、list.ru等。(点击放大)
4、如果这个邮箱比较重要可以填写国内的手机号码,这样当Mail.ru账户出现问题时还可以使用手机验证登录。国内的手动可以正常接收到Mail.ru的验证码。
5、这个就是Mail.ru邮箱界面了,左侧就有收件箱、草稿箱等,右侧就是联系人、网盘等。Mail.ru初始大小是10GB,随着你的使用Mail.ru会自动增加容量。(点击放大)
6、这是Mail.ru邮箱查看邮件页面,和我们平常使用的邮箱是一样的,不明白的地方可以使用Chrome的Google翻译。
7、这是Mail.ru发信页面。
8、Mail.ru提供了网盘服务,你可以先将附件上传到网盘上,也可以从邮件中已经存在的图片等附件直接选择。总容量是25GB。
9、Mail.ru发信到国内一切正常,QQ邮箱收信没有问题。
二、Mail.ru邮箱设置和网盘SMTP收发信
1、登录到Mail.ru,在右上角可以进入到邮箱设置页面。
2、这里可以修改个人资料、重置密码、添加其它邮箱、短信通知、文件夹、过滤规则等。(点击放大)
3、在密码和安全选项中,你可以为Mail.ru设置“两步验证”,确保你的邮箱账号安全。
4、支持SMTP收发邮件,登录名类似是:freehao123@mail.ru;IMAP服务器- imap.mail.ru& 的POP3 -服务器- pop.mail.ru。端口 - IMAP -& 993(SSL / TLS加密协议), POP3 - 995(加密协议SSL / TLS), - 465(加密协议 SSL /TLS)。
5、国内的QQ邮箱等可以正常使用SMTP来收发Mail.ru的邮件。
6、另外,值得一提的就是Mail.ru的手机客户端了,你可以使用Mail.ru手机客户端来收发邮件。
三、Yandex.ru邮箱申请使用
1、Yandex.ru邮箱官网:
1、官方网站:https://mail./
2、是俄罗斯最大的搜索引擎,之前部落分享过它的免费相册服务:,它的邮箱服务也是非常受欢迎的。
3、注册一个Yandex.ru邮箱账号也比较简单,Yandex.ru已经默认为英文界面了,所以我们阅读起来不是很困难。
4、这是Yandex.ru的邮箱界面,比较干净简洁。
5、这是Yandex.ru的发信界面。
6、Yandex.ru的设置选项是在右上角可以找到。
7、这是Yandex.ru设置选项,包括修改密码、换皮肤、导入联系人、语言等。(点击放大)
8、Yandex.ru的SMTP服务器地址是smtp.yandex.com ,端口号 465(加密协议 SSL /TLS)。
四、Pochta.ru免费邮箱服务
1、Pochta.ru官网:
1、官方网站:https://www.pochta.ru/
2、是俄罗斯一个提供邮件、包裹等服务的网站,邮箱注册和使用有点麻烦,建议使用谷歌翻译。
五、俄罗斯免费邮箱服务小结
1、俄罗斯免费邮箱服务基本上就是Mail.ru,Yandex这两个了,Mail.ru是老牌的邮箱服务,如果与俄罗斯合作交流的话用Mail.ru是最好的工具了,Yandex邮箱简洁干净,国内访问速度比较流畅。
2、Mail.ru,Yandex,Rambler.ru基本上都支持POP3 和 SMTP收发邮件,国内的QQ邮箱、网易邮箱等都可以正常收发信,WP使用SMTP发信可以参考:。
文章出自:
版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。
您或许对下面这些文章有兴趣:&&&&&&&&&&&&&&&&&&&&本月吐槽辛苦排行榜
免费资源部落博主
经常混迹于各种免费资源中,尝鲜后乐于分享给他人。用WP搭建了部落博客,没事儿就折腾Wordpress,喜欢找免费空间,但只求精,稳定,耐用。有时也会介绍一点关于建站的知识和主机、服务器的使用心得与体会。
TA的专栏:&&|&&
关于本文的作者
所属分类:
链接地址:
浏览前页:
浏览后页:
部落快速搜索栏
各类专题梳理
网站导航栏
免费资源重点推荐
最新文章推荐
部落最新评论列表
部落本月最受关注的热点
(热度2℃) (热度2℃) (热度2℃) (热度1℃) (热度1℃) (热度1℃) (热度1℃) (热度1℃) (热度1℃) (热度1℃) (热度1℃) (热度1℃) (热度1℃)
部落本月踩得最多的宝贝
(踩1,312次) (踩1,197次) (踩1,087次) (踩1,074次) (踩1,047次) (踩960次) (踩920次) (踩838次) (踩838次) (踩820次)
免费资源部落,是一个致力发布和推广来自世界各地的免费资源,包括多样实用的免费空间、各种优秀的免费软件、各样可用的免费网盘等个人博客网站。站长qi是一位很普通不过的人,长期关注网络空间、互联网、软件应用、程序开发与设计、网络应用等。免费资源部落成立的目的就是希望与更多人分享网络快乐与精彩!本站持续修改完善中,如遇不便还请谅解^_^ &&为取得较佳浏览结果,请爱用
浏览本网页
最近更新日期:
  1.8 :
/etc/modprobe.conf, /etc/sysconfig/*
  1.9 : ,
  2.1 :
  2.2 : ,
  2.3 :,
  3.2 :
  3.3 :
  3.4 : ,
  3.8 :
Linux 的开机流程分析
开机不是只要按一下电源钮而关机只要关掉电源钮就可以了吗?有何大学问?话是这样没错啦,但是由于
Linux 是一套多人多工的作业系统,你难保你在关机时没有人在线上,如果你关机的时候碰巧一大群人在线上工作,
那会让当时在线上工作的人马上断线的!那不是害死人了!一些资料可是无价之宝哩!
另外 Linux 在执行的时候,虽然你在画面上只会看到黑压压的一片,完全没有任何画面,
但其实他是有很多的程序在背景底下执行的,例如登录档管控程式、前面提到的例行性工作排程等,
当然还有一大堆网路服务,如邮件伺服器、WWW 伺服器等等。你如果随便关机的话,
是很容易伤害硬碟及资料传输的动作的!所以在 Linux 下关机可是一门大学问喔。
开机流程一览
既然开机是很严肃的一件事,那我们就来了解一下整个开机的过程吧!
好让大家比较容易发现开机过程里面可能会发生问题的地方,以及出现问题后的解决之道!
不过,由于开机的过程中,那个开机管理程式 (Boot Loader) 使用的软体可能不一样,例如目前各大
Linux distributions 的主流为 grub,但早期 Linux 预设是使用 LILO ,台湾地区则很多朋友喜欢使用
但无论如何,我们总是得要了解整个 boot loader 的工作情况,才能了解为何进行多重开机的设定时,
老是听人家讲要先安装 Windows 再安装 Linux 的原因~
假设以个人电脑架设的 Linux 主机为例 (先回到看看相关的硬体常识喔),
当你按下电源按键后电脑硬体会主动的读取 BIOS 来载入硬体资讯及进行硬体系统的自我测试,
之后系统会主动的去读取第一个可开机的装置 (由 BIOS 设定的) ,此时就可以读入开机管理程式了。
开机管理程式可以指定使用哪个核心档案来开机,并实际载入核心到记忆体当中解压缩与执行,
此时核心就能够开始在记忆体内活动,并侦测所有硬体资讯与载入适当的驱动程式来使整部主机开始运作,
等到核心侦测硬体与载入驱动程式完毕后,一个最阳春的作业系统就开始在你的 PC
上面跑了。
主机系统开始运作后,此时 Linux 才会呼叫外部程式开始准备软体执行的环境,
并且实际的载入所有系统运作所需要的软体程式哩!最后系统就会开始等待你的登入与操作啦!
简单来说,系统开机的经过可以汇整成底下的流程的:
大概的流程就是上面写的那个样子啦,你会发现 init 这个家伙占的比重非常重!
所以我们才会在 指令中谈到这家伙。
那每一个程序的内容主要是在干嘛呢?底下就分别来谈一谈吧!
BIOS, boot loader 与 kernel 载入
我们在曾经谈过简单的开机流程与 MBR 的功能,
当时为了多重开机而进行的简短的介绍。现在你已经有足够的 Linux 基础了,所以底下让我们来加强说明啦!
BIOS, 开机自我测试与 MBR
我们在就曾谈过电脑主机架构,
在个人电脑架构下,你想要启动整部系统首先就得要让系统去载入 BIOS (Basic Input Output System),并透过 BIOS
程式去载入 CMOS 的资讯,并且藉由 CMOS 内的设定值取得主机的各项硬体设定,
例如 CPU 与周边设备的沟通时脉啊、开机装置的搜寻顺序啊、硬碟的大小与类型啊、
系统时间啊、各周边汇流排的是否启动 Plug and Play (PnP, 随插即用装置) 啊、
各周边设备的 I/O 位址啊、以及与 CPU 沟通的 IRQ 岔断等等的资讯。
在取得这些资讯后,BIOS 还会进行开机自我测试 (Power-on Self Test, POST) ()。
然后开始执行硬体侦测的初始化,并设定 PnP 装置,之后再定义出可开机的装置顺序,
接下来就会开始进行开机装置的资料读取了 (MBR 相关的任务开始)。
由于我们的系统软体大多放置到硬碟中嘛!所以 BIOS 会指定开机的装置好让我们可以读取磁碟中的作业系统核心档案。
但由于不同的作业系统他的档案系统格式不相同,因此我们必须要以一个开机管理程式来处理核心档案载入 (load) 的问题,
因此这个开机管理程式就被称为 Boot Loader 了。那这个 Boot Loader
程式安装在哪里呢?就在开机装置的第一个磁区 (sector) 内,也就是我们一直谈到的 MBR
(Master Boot Record, 主要开机记录区)。
那你会不会觉得很奇怪啊?既然核心档案需要 loader 来读取,那每个作业系统的 loader 都不相同,
这样的话 BIOS 又是如何读取 MBR 内的 loader 呢?很有趣的问题吧!其实 BIOS 是透过硬体的 INT 13 中断功能来读取 MBR
的,也就是说,只要 BIOS 能够侦测的到你的磁碟 (不论该磁碟是 SATA 还是 IDE 介面),那他就有办法透过 INT 13
这条通道来读取该磁碟的第一个磁区内的 MBR 啦!()
这样 boot loader 也就能够被执行啰!
我们知道每颗硬碟的第一个磁区内含有 446 bytes的 MBR 区域,那么如果我的主机上面有两颗硬碟的话,
系统会去哪颗硬碟的 MBR 读取 boot loader 呢?这个就得要看 BIOS 的设定了。
基本上,我们常常讲的‘系统的 MBR’其实指的是 第一个开机装置的 MBR 才对!
所以,改天如果你要将开机管理程式安装到某颗硬碟的 MBR 时,
要特别注意当时系统的‘第一个开机装置’是哪个,否则会安装到错误的硬碟上面的 MBR 喔!重要重要!
Boot Loader 的功能
刚刚说到 Loader 的最主要功能是要认识作业系统的档案格式并据以载入核心到主记忆体中去执行。
由于不同作业系统的档案格式不一致,因此每种作业系统都有自己的 boot loader 啦!用自己的 loader
才有办法载入核心档案嘛!那问题就来啦,你应该有听说过多重作业系统吧?也就是在一部主机上面安装多种不同的作业系统。
既然你 (1)必须要使用自己的 loader 才能够载入属于自己的作业系统核心,而
(2)系统的 MBR 只有一个,那你怎么会有办法同时在一部主机上面安装 Windows 与 Linux 呢?
这就得要回到去回忆一下档案系统功能了。
其实每个档案系统 (filesystem, 或者是 partition) 都会保留一块开机磁区 (boot sector) 提供作业系统安装 boot loader ,
而通常作业系统预设都会安装一份 loader 到他根目录所在的档案系统的 boot sector 上。如果我们在一部主机上面安装 Windows
与 Linux 后,该 boot sector, boot loader 与 MBR 的相关性会有点像下图:
图 1.2.1、 boot loader 安装在 MBR, boot sector 与作业系统的关系
如上图所示,每个作业系统预设是会安装一套 boot loader 到他自己的档案系统中 (就是每个 filesystem
左下角的方框),而在 Linux 系统安装时,你可以选择将 boot loader 安装到 MBR 去,也可以选择不安装。
如果选择安装到 MBR 的话,那理论上你在 MBR 与 boot sector 都会保有一份 boot loader 程式的。
至于 Windows 安装时,他预设会主动的将 MBR 与 boot sector 都装上一份 boot loader!所以啦,
你会发现安装多重作业系统时,你的 MBR 常常会被不同的作业系统的 boot loader 所覆盖啦! ^_^
我们刚刚提到的两个问题还是没有解决啊!虽然各个作业系统都可以安装一份 boot loader 到他们的 boot sector 中,
这样作业系统可以透过自己的 boot loader 来载入核心了。问题是系统的 MBR 只有一个哩!
你要怎么执行 boot sector 里面的 loader 啊?这个我们得要回忆一下。boot loader
主要的功能如下:
提供选单:使用者可以选择不同的开机项目,这也是多重开机的重要功能!
载入核心档案:直接指向可开机的程式区段来开始作业系统;
转交其他 loader:将开机管理功能转交给其他 loader 负责。
由于具有选单功能,因此我们可以选择不同的核心来开机。而由于具有控制权转交的功能,因此我们可以载入其他 boot sector
内的 loader 啦!不过 Windows 的 loader 预设不具有控制权转交的功能,因此你不能使用 Windows 的 loader
来载入 Linux 的 loader 喔!这也是为啥第三章谈到 MBR 与多重开机时,会特别强调先装 Windows 再装 Linux 的缘故。
我们将上述的三个功能以底下的图示来解释你就看的懂了!(与第三章的图示也非常类似啦!)
图 1.2.2、 开机管理程式的选单功能与控制权转交功能示意图
如上图所示,我的 MBR 使用 Linux 的 grub 这个开机管理程式,并且里面假设已经有了三个选单,
第一个选单可以直接指向 Linux 的核心档案并且直接载入核心来开机;第二个选单可以将开机管理程式控制权交给 Windows
来管理,此时 Windows 的 loader 会接管开机流程,这个时候他就能够启动 windows 了。第三个选单则是使用 Linux
在 boot sector 内的开机管理程式,此时就会跳出另一个 grub 的选单啦!了解了吗?
而最终 boot loader 的功能就是‘载入 kernel 档案’啦!
载入核心侦测硬体与 initrd 的功能
当我们藉由 boot loader 的管理而开始读取核心档案后,接下来, Linux 就会将核心解压缩到主记忆体当中,
并且利用核心的功能,开始测试与驱动各个周边装置,包括储存装置、CPU、网路卡、音效卡等等。
此时 Linux 核心会以自己的功能重新侦测一次硬体,而不一定会使用 BIOS
侦测到的硬体资讯喔!也就是说,核心此时才开始接管 BIOS 后的工作了。
那么核心档案在哪里啊?一般来说,他会被放置到 /boot 里面,并且取名为 /boot/vmlinuz 才对!
[root@www ~]# ls --format=single-column -F /boot
config-2.6.18-92.el5
&==此版本核心被编译时选择的功能与模组设定档
&==就是开机管理程式 grub 相关资料目录
initrd-2.6.18-92.el5.img
&==虚拟档案系统档!
System.map-2.6.18-92.el5
&==核心功能放置到记忆体位址的对应表
vmlinuz-2.6.18-92.el5
&==就是核心档案啦!最重要者!
从上表我们也可以知道此版本的 Linux 核心为 2.6.18-92.el5 这个版本!为了硬体开发商与其他核心功能开发者的便利,
因此 Linux 核心是可以透过动态载入核心模组的 (就请想成驱动程式即可),这些核心模组就放置在 /lib/modules/ 目录内。
由于模组放置到磁碟根目录内 (要记得 /lib 不可以与 / 分别放在不同的 partition !),
因此在开机的过程中核心必须要挂载根目录,这样才能够读取核心模组提供载入驱动程式的功能。
而且为了担心影响到磁碟内的档案系统,因此开机过程中根目录是以唯读的方式来挂载的喔。
一般来说,非必要的功能且可以编译成为模组的核心功能,目前的 Linux distributions 都会将他编译成为模组。
因此 USB, SATA, SCSI... 等磁碟装置的驱动程式通常都是以模组的方式来存在的。
现在来思考一种情况,假设你的 linux 是安装在 SATA 磁碟上面的,你可以透过 BIOS 的 INT 13 取得 boot loader 与
kernel 档案来开机,然后 kernel 会开始接管系统并且侦测硬体及尝试挂载根目录来取得额外的驱动程式。
问题是,核心根本不认识 SATA 磁碟,所以需要载入 SATA 磁碟的驱动程式,
否则根本就无法挂载根目录。但是 SATA 的驱动程式在 /lib/modules 内,你根本无法挂载根目录又怎么读取到
/lib/modules/ 内的驱动程式?是吧!非常的两难吧!在这个情况之下,你的 Linux 是无法顺利开机的!
那怎办?没关系,我们可以透过虚拟档案系统来处理这个问题。
虚拟档案系统 (Initial RAM Disk) 一般使用的档名为 /boot/initrd
,这个档案的特色是,他也能够透过 boot loader 来载入到记忆体中,
然后这个档案会被解压缩并且在记忆体当中模拟成一个根目录,
且此模拟在记忆体当中的档案系统能够提供一支可执行的程式,透过该程式来载入开机过程中所最需要的核心模组,
通常这些模组就是 USB, RAID, LVM, SCSI 等档案系统与磁碟介面的驱动程式啦!等载入完成后,
会帮助核心重新呼叫 /sbin/init 来开始后续的正常开机流程。
图 1.2.3、 BIOS 与 boot loader 及核心载入流程示意图
如上图所示,boot loader 可以载入 kernel
与 initrd ,然后在记忆体中让 initrd 解压缩成为根目录,
kernel 就能够藉此载入适当的驱动程式,最终释放虚拟档案系统,并挂载实际的根目录档案系统,
就能够开始后续的正常开机流程。更详细的 initrd 说明,你可以自行使用 man initrd 去查阅看看。
底下让我们来了解一下 CentOS 5.x 的 initrd 档案内容有什么吧! ^_^
# 1. 先将 /boot/initrd 复制到 /tmp/initrd 目录中,等待解压缩:
[root@www ~]# mkdir /tmp/initrd
[root@www ~]# cp /boot/initrd-2.6.18-92.el5.img /tmp/initrd/
[root@www ~]# cd /tmp/initrd
[root@www initrd]# file initrd-2.6.18-92.el5.img
initrd-2.6.18-92.el5.img: gzip compressed data, ...
# 原来是 gzip 的压缩档!因为是 gzip ,所以副档名给他改成 .gz 吧!
# 2. 将上述的档案解压缩:
[root@www initrd]# mv initrd-2.6.18-92.el5.img initrd-2.6.18-92.el5.gz
[root@www initrd]# gzip -d initrd-2.6.18-92.el5.gz
[root@www initrd]# file initrd-2.6.18-92.el5
initrd-2.6.18-92.el5: ASCII cpio archive (SVR4 with no CRC)
# 搞了老半天,原来还是 cpio 的指令压缩成的档案啊!解压缩看看!
# 3. 用 cpio 解压缩
[root@www initrd]# cpio -ivcdu & initrd-2.6.18-92.el5
[root@www initrd]# ll
drwx------ 2 root root
4096 Apr 10 02:05 bin
drwx------ 3 root root
4096 Apr 10 02:05 dev
drwx------ 2 root root
4096 Apr 10 02:05 etc
-rwx------ 1 root root
1888 Apr 10 02:05 init
-rw------- 1 root root 5408768 Apr 10 02:00 initrd-2.6.18-92.el5
drwx------ 3 root root
4096 Apr 10 02:05 lib
drwx------ 2 root root
4096 Apr 10 02:05 proc
lrwxrwxrwx 1 root root
3 Apr 10 02:05 sbin -& bin
drwx------ 2 root root
4096 Apr 10 02:05 sys
drwx------ 2 root root
4096 Apr 10 02:05 sysroot
# 看!是否很像根目录!尤其也是有 init 这个执行档!务必看一下权限!
# 接下来看看 init 这个档案内有啥咚咚?
# 4. 观察 init 档案内较重要的执行项目
[root@www initrd]# cat init
#!/bin/nash
&==使用类似 bash 的 shell 来执行
mount -t proc /proc /proc
&==挂载记忆体的虚拟档案系统
....(中间省略)....
echo Creating initial device nodes
mknod /dev/null c 1 3
&==建立系统所需要的各项装置!
....(中间省略)....
echo "Loading ehci-hcd.ko module"
insmod /lib/ehci-hcd.ko
&==载入各项核心模组,就是驱动程式!
....(中间省略)....
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro hdc2 &==尝试挂载根目录啦!
....(底下省略)....
嘿嘿!透过上述执行档的内容,我们可以知道 initrd 有载入模组并且尝试挂载了虚拟档案系统。
接下来就能够顺利的运作啦!那么是否一定需要 initrd 呢?
是否没有 initrd 就无法顺利开机?
不见得的!需要 initrd 最重要的原因是,当开机时无法挂载根目录的情况下,
此时就一定需要 initrd ,例如你的根目录在特殊的磁碟介面 (USB, SATA, SCSI) ,
或者是你的档案系统较为特殊 (LVM, RAID) 等等,才会需要 initrd。
如果你的 Linux 是安装在 IDE 介面的磁碟上,并且使用预设的 ext2/ext3 档案系统,
那么不需要 initrd 也能够顺利的开机进入 Linux 的!
在核心完整的载入后,您的主机应该就开始正确的运作了,接下来,就是要开始执行系统的第一支程式: /sbin/init。
第一支程式 init 及设定档
/etc/inittab 与 runlevel
在核心载入完毕、进行完硬体侦测与驱动程式载入后,此时你的主机硬体应该已经准备就绪了 (ready) ,
此时核心会主动的呼叫第一支程式,那就是 /sbin/init 啰。这也是为啥 指令介绍时,你会发现 init 的 PID 号码是一号啦。
/sbin/init 最主要的功能就是准备软体执行的环境,包括系统的主机名称、网路设定、语系处理、档案系统格式及其他服务的启动等。
而所有的动作都会透过 init 的设定档,亦即是 /etc/inittab 来规划,而
inittab 内还有一个很重要的设定项目,那就是预设的 runlevel (开机执行等级) 啦!
Run level:执行等级有哪些?
那么什么是 run level 呢?他有什么功用啊?其实很简单啦, Linux 就是藉由设定 run level
来规定系统使用不同的服务来启动,让 Linux 的使用环境不同。基本上,依据有无网路与有无 X Window
而将 run level 分为 7 个等级,分别是:
0 - halt (系统直接关机)
1 - single user mode (单人维护模式,用在系统出问题时的维护)
2 - Multi-user, without NFS (类似底下的 runlevel 3,但无 NFS 服务)
3 - Full multi-user mode (完整含有网路功能的纯文字模式)
4 - unused (系统保留功能)
5 - X11 (与 runlevel 3 类似,但加载使用 X Window)
6 - reboot (重新开机)
由于 run level 0, 4, 6 不是关机、重新开机就是系统保留的,所以:‘
您当然不能将预设的 run level 设定为这三个值 ’,
否则系统就会不断的自动关机或自动重新开机....
好了,那么我们开机时,到底是如何取得系统的 run level 的?当然是 /etc/inittab 所设定的啰!
那么 /etc/inittab 到底有什么资讯呢?我们先来看看这个档案的内容好了:
/etc/inittab 的内容与语法
[root@www ~]# vim /etc/inittab
id:5:initdefault:
&==预设的 runlevel 设定, 此 runlevel 为 5
si::sysinit:/etc/rc.d/rc.sysinit
&==准备系统软体执行的环境的脚本执行档
# 7 个不同 run level 的,需要启动的服务的 scripts 放置路径:
l0:0:wait:/etc/rc.d/rc 0
&==runlevel 0 在 /etc/rc.d/rc0.d/
l1:1:wait:/etc/rc.d/rc 1
&==runlevel 1 在 /etc/rc.d/rc1.d/
l2:2:wait:/etc/rc.d/rc 2
&==runlevel 2 在 /etc/rc.d/rc2.d/
l3:3:wait:/etc/rc.d/rc 3
&==runlevel 3 在 /etc/rc.d/rc3.d/
l4:4:wait:/etc/rc.d/rc 4
&==runlevel 4 在 /etc/rc.d/rc4.d/
l5:5:wait:/etc/rc.d/rc 5
&==runlevel 5 在 /etc/rc.d/rc5.d/
l6:6:wait:/etc/rc.d/rc 6
&==runlevel 6 在 /etc/rc.d/rc6.d/
# 是否允许按下 [ctrl]+[alt]+[del] 就重新开机的设定项目:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# 底下两个设定则是关于不断电系统的 (UPS),一个是没电力时的关机,一个是复电的处理
pf::powerfail:/sbin/shutdown -f -h +2 "Power F System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power R Shutdown Cancelled"
1:2345:respawn:/sbin/mingetty tty1
&==其实 tty1~tty6 是由底下这六行决定的。
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon &==X window 则是这行决定的!
让我们解析一下这个档案吧!首先,这个档案的语法是利用冒号 (:) 将设定分隔成为四个栏位,每个栏位的意义与说明如下:
[设定项目]:[run level]:[init 的动作行为]:[指令项目]
设定项目:最多四个字元,代表 init 的主要工作项目,只是一个简单的代表说明。
run level:该项目在哪些 run level 底下进行的意思。如果是 35 则代表 runlevel 3 与 5 都会执行。
init 的动作项目:主要可以进行的动作项目意义有:
inittab 设定值意义说明
initdefault代表预设的 run level 设定值
sysinit代表系统初始化的动作项目
ctrlaltdel代表 [ctrl]+[alt]+[del] 三个按键是否可以重新开机的设定
wait代表后面栏位设定的指令项目必须要执行完毕才能继续底下其他的动作
respawn代表后面栏位的指令可以无限制的再生 (重新启动)。举例来说, tty1 的 mingetty 产生的可登入画面,
在你登出而结束后,系统会再开一个新的可登入画面等待下一个登入。
更多的设定项目请参考 man inittab 的说明。
指令项目:亦即应该可以进行的指令,通常是一些 script 啰。
init 的处理流程
事实上 /etc/inittab 的设定也有点类似 shell script 啦,因为该档案内容的设定也是一行一行的从上往下处理的,
因此我们可以知道 CentOS 的 init 依据 inittab 设定的处理流程会是:
先取得 runlevel 亦即预设执行等级的相关等级 (以鸟哥的测试机为例,为 5 号);
使用 /etc/rc.d/rc.sysinit 进行系统初始化
由于 runlevel 是 5 ,因此只进行‘l5:5:wait:/etc/rc.d/rc 5’,其他行则略过
设定好 [ctrl]+[alt]+[del] 这组的组合键功能
设定不断电系统的 pf, pr 两种机制;
启动 mingetty 的六个终端机 (tty1 ~ tty6)
最终以 /etc/X11/perfdm -nodaemon 启动图形介面啦!
现在你可以知道为啥 [ctrl]+[alt]+[del] 可以重新开机而我们预设提供 6 个虚拟终端机 (tty1~tty6)
给你使用了吧!由于整个设定都是依据 /etc/inittab 来决定的,因此如果你想要修改任何细节的话,
可以这样做喔:
如果不想让使用者利用 [crtl]+[alt]+[del] 来重新启动系统,可以将‘
ca::ctrlaltdel:/sbin/shutdown -t3 -r now ’加上注解 (#) 来取消该设定
规定开机的预设 run level 是纯文字的 3 号或者是具有图形介面的 5 号 ,可经由
‘ id:5:initdefault: ’那个数字来决定!
以鸟哥自己这个档案为例,我是使用预设的图形介面。如果你想要关闭图形介面的话,将该行 5 改成 3
如果不想要启动六个终端机 (tty1~tty6),那么可以将‘
6:2345:respawn:/sbin/mingetty tty6’关闭数个。但务必至少启动一个喔!
所以说,你现在会自行修改登入时的预设 run level 设定值了吗?够简单的吧?
一般来说,我们预设都是 3 或者是 5 来作为预设的 run level 的。但有时后可能需要进入 run level 1,
也就是单人维护模式的环境当中。这个 run level 1 有点像是 Windows 系统当中的‘安全模式’啦,
专门用来处理当系统有问题时的操作环境。此外,当系统发现有问题时,举例来说,不正常关机造成
filesystem 的不一致现象时,系统会主动的进入单人维护模式呢!
好了, init 在取得 run level 之后,接下来要干嘛?
上面 /etc/inittab 档案内容不是有提到 sysinit 吗?准备初始化系统了吧!
init 处理系统初始化流程
(/etc/rc.d/rc.sysinit)
还记得上面提到 /etc/inittab 里头有这一句‘ si::sysinit:/etc/rc.d/rc.sysinit ’吧?
这表示:‘我开始载入各项系统服务之前,得先做好整个系统环境,我主要利用
/etc/rc.d/rc.sysinit 这个 shell script 来设定好我的系统环境的。’够清楚了吧?
所以,我想要知道到底 CentOS 开机的过程当中帮我进行了什么动作,就得要仔细的分析 /etc/rc.d/rc.sysinit 啰。
老实说,这个档案的档名在各不同的 distributions 当中都不相同,
例如 SuSE server 9 就使用 /etc/init.d/boot 与 /etc/init.d/rc 来进行的。
所以,你最好还是自行到 /etc/inittab 去察看一下系统的工作喔! ^_^
如果你使用 vim 去查阅过 /etc/rc.d/rc.sysinit 的话,那么可以发现他主要的工作大抵有这几项:
取得网路环境与主机类型:
读取网路设定档 /etc/sysconfig/network ,取得主机名称与预设通讯闸 (gateway) 等网路环境。
测试与挂载记忆体装置 /proc 及 USB 装置 /sys:
除挂载记忆体装置 /proc 之外,还会主动侦测系统上是否具有 usb 的装置,
若有则会主动载入 usb 的驱动程式,并且尝试挂载 usb 的档案系统。
决定是否启动 SELinux :
我们在谈到的 SELinux 在此时进行一些检测,
并且检测是否需要帮所有的档案重新编写标准的 SELinux 类型 (auto relabel)。
启动系统的乱数产生器
乱数产生器可以帮助系统进行一些密码加密演算的功能,在此需要启动两次乱数产生器。
设定终端机 (console) 字形:
设定显示于开机过程中的欢迎画面 (text banner);
设定系统时间 (clock) 与时区设定:需读入 /etc/sysconfig/clock 设定值
周边设备的侦测与 Plug and Play (PnP) 参数的测试:
根据核心在开机时侦测的结果 (/proc/sys/kernel/modprobe ) 开始进行 ide / scsi /
网路 / 音效 等周边设备的侦测,以及利用以载入的核心模组进行 PnP 装置的参数测试。
使用者自订模组的载入
使用者可以在 /etc/sysconfig/modules/*.modules 加入自订的模组,则此时会被载入到系统当中
载入核心的相关设定:
系统会主动去读取 /etc/sysctl.conf 这个档案的设定值,使核心功能成为我们想要的样子。
设定主机名称与初始化电源管理模组 (ACPI)
初始化软体磁碟阵列:主要是透过 /etc/mdadm.conf 来设定好的。
初始化 LVM 的档案系统功能
以 fsck 检验磁碟档案系统:会进行 filesystem check
进行磁碟配额 quota 的转换 (非必要):
重新以可读写模式挂载系统磁碟:
启动 quota 功能:所以我们不需要自订 quotaon 的动作
启动系统虚拟乱数产生器 (pseudo-random):
清除开机过程当中的暂存档案:
将开机相关资讯载入 /var/log/dmesg 档案中。
在 /etc/rc.d/rc.sysinit 将基本的系统设定资料都写好了,也将系统的资料设定完整!
而如果你想要知道到底开机的过程中发生了什么事情呢?那么就执行‘ dmesg ’吧。
另外,基本上,在这个档案当中所进行的很多工作的预设设定档,其实都在 /etc/sysconfig/ 当中呢!
所以,请记得将 /etc/sysconfig/ 内的档案好好的瞧一瞧喔! ^_^
在这个过程当中,比较值得注意的是自订模组的载入!在 CentOS 当中,如果我们想要载入核心模组的话,
可以将整个模组写入到 /etc/sysconfig/modules/*.modules 当中,在该目录下,
只要记得档名最后是以 .modules 结尾即可。
这个过程是非必要的,因为我们目前的预设模组实在已经很够用了,除非是您的主机硬体实在太新了,
非要自己载入新的模组不可,否则,在经过 /etc/rc.d/rc.sysinit 的处理后,
你的主机系统应该是已经跑得很顺畅了啦!就等着你将系统相关的服务与网路服务启动啰!
启动系统服务与相关启动设定档
(/etc/rc.d/rc N & /etc/sysconfig)
载入核心让整个系统准备接受指令来工作,再经过 /etc/rc.d/rc.sysinit
的系统模组与相关硬体资讯的初始化后,你的 CentOS 系统应该已经顺利工作了。
只是,我们还得要启动系统所需要的各项‘服务’啊!这样主机才能提供我们相关的网路或者是主机功能嘛!
这个时候,依据我们在 /etc/inittab 里面提到的 run level 设定值,就可以来决定启动的服务项目了。
举例来说,使用 run level 3 当然就不需要启动 X Window 的相关服务啰,您说是吧?
那么各个不同的 run level 服务启动的各个 shell script 放在哪?还记得 /etc/inittab 里面提到的:
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
&==本例中,以此项目来解释
l6:6:wait:/etc/rc.d/rc 6
上面提到的就是各个 run level 要执行的各项脚本放置处啦!主要是透过 /etc/rc.d/rc 这个指令来处理相关任务!
由于鸟哥使用预设的 runlevel 5 ,因此我们主要针对上述特殊字体那行来解释好了: /etc/rc.d/rc 5 的意义是这样的
(建议您自行使用 vim 去观察一下 /etc/rc.d/rc 这个档案,你会更有概念!):
透过外部第一号参数 ($1) 来取得想要执行的脚本目录。亦即由 /etc/rc.d/rc 5 可以取得
/etc/rc5.d/ 这个目录来准备处理相关的脚本程式;
找到 /etc/rc5.d/K??* 开头的档案,并进行‘ /etc/rc5.d/K??* stop ’的动作;
找到 /etc/rc5.d/S??* 开头的档案,并进行‘ /etc/rc5.d/S??* start ’的动作;
透过上面的说明我们可以知道所有的项目都与 /etc/rc5.d/ 有关,那么我们就来瞧瞧这个目录下有些什么玩意儿吧!
[root@www ~]# ll /etc/rc5.d/
lrwxrwxrwx 1 root root 16 Sep
2008 K02dhcdbd -& ../init.d/dhcdbd
....(中间省略)....
lrwxrwxrwx 1 root root 14 Sep
2008 K91capi -& ../init.d/capi
lrwxrwxrwx 1 root root 23 Sep
2008 S00microcode_ctl -& ../init.d/microcode_ctl
lrwxrwxrwx 1 root root 22 Sep
2008 S02lvm2-monitor -& ../init.d/lvm2-monitor
....(中间省略)....
lrwxrwxrwx 1 root root 17 Sep
2008 S10network -& ../init.d/network
....(中间省略)....
lrwxrwxrwx 1 root root 11 Sep
2008 S99local -& ../rc.local
lrwxrwxrwx 1 root root 16 Sep
2008 S99smartd -& ../init.d/smartd
....(底下省略)....
在这个目录下的档案很有趣,主要具有几个特点:
档名全部以 Sxx 或 Kxx ,其中 xx 为数字,且这些数字在档案之间是有相关性的!
全部是连结档,连结到 stand alone 服务启动的目录 /etc/init.d/ 去
我们在谈过服务的启动主要是以‘/etc/init.d/服务档名 {start,stop}’来启动与关闭的,那么透过刚刚 /etc/rc.d/rc
程式的解说,我们可以清楚的了解到了 /etc/rc5.d/[SK]xx
其实就是跑到 /etc/init.d/ 去找到相对应的服务脚本,
然后分别进行 start (Sxx) 或 stop (Kxx) 的动作而已啦!举例来说,以上述的表格内的 K91capi 及 S10network 为例好了,
透过 /etc/rc.d/rc 5 的执行,这两个档案会这样进行:
/etc/rc5.d/K91capi stop --& /etc/init.d/capi stop
/etc/rc5.d/S10network start --& /etc/init.d/network start
所以说,你有想要启动该 runlevel 时就执行的服务,那么利用 Sxx 并指向 /etc/init.d/ 的特定服务启动脚本后,
该服务就能够在开机时启动啦!就这么简单!问题是,你需要自行处理这个 K, S 开头的连结档吗?
并不需要的,
就是在负责处理这个连结档啦!这样有没有跟第十八章的观念串在一起了呢? ^_^
那么为什么 K 与 S 后面要有数字呢?因为各不同的服务其实还是互有关系的。举例来说,如果要启动
WWW 服务,总是得要有网路吧?所以 /etc/init.d/network 就会比较先被启动啦!那么您就会知道在 S 或者是 K
后面接的数字是啥意思了吧?嘿嘿,那就是执行的顺序啦!那么哪个档案被最后执行呢?
看到最后一个被执行的项目是啥?没错,就是 S99local ,亦即是:
/etc/rc.d/rc.local 这个档案啦!
使用者自订开机启动程序
(/etc/rc.d/rc.local)
在完成预设 runlevel 指定的各项服务的启动后,如果我还有其他的动作想要完成时,举例来说,
我还想要寄一封 mail 给某个系统管理帐号,通知他,系统刚刚重新开机完毕,那么是否应该要制作一个 shell
script 放置在 /etc/init.d/ 里面,然后再以连结方式连结到
/etc/rc5.d/ 里面呢?呵呵!当然不需要!还记得上一小节提到的 /etc/rc.d/rc.local 吧?
这个档案就可以执行您自己想要执行的系统指令了。
也就是说,我有任何想要在开机时就进行的工作时,直接将他写入 /etc/rc.d/rc.local ,
那么该工作就会在开机的时候自动被载入喔!而不必等我们登入系统去启动呢!
是否很方便啊!一般来说,鸟哥就很喜欢把自己制作的 shell script 完整档名写入
/etc/rc.d/rc.local ,如此一来,开机就会将我的 shell script 执行过,真是好棒那!
根据 /etc/inittab
之设定,载入终端机或 X-Window 介面
在完成了系统所有服务的启动后,接下来 Linux 就会启动终端机或者是 X Window 来等待使用者登入啦!
实际参考的项目是 /etc/inittab 内的这一段:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon
这一段代表,在 run level 2, 3, 4, 5 时,都会执行 /sbin/mingetty 这个咚咚,
而且执行六个,这也是为何我们 Linux 会提供‘六个纯文字终端机’的设定所在啊!
因为 mingetty 就是在启动终端机的指令说。
要注意的是那个 respawn 的 init 动作项目,他代表‘当后面的指令被终止 (terminal) 时,
init 会主动的重新启动该项目。’这也是为何我们登入 tty1 终端机介面后,以 exit 离开后,
系统还是会重新显示等待使用者输入的画面的原因啊!
如果改天您不想要有六个终端机时,可以取消某些终端机介面吗?当然可以啊!
就将上面表格当中的某些项目注解掉即可!例如不想要 tty5 与 tty6 ,就将那两行注解,
则下次重新开机后,您的 Linux 就只剩下‘ F1 ~ F4 ’有效而已,这样说,可以了解吧!!^_^
至于如果我们使用的是 run level 5 呢?那么除了这六个终端机之外, init 还会执行 /etc/X11/prefdm -nodaemon
那个指令喔!该指令我们会在 再来详谈!
他主要的功能就是在启动 X Window 啦!
开机过程会用到的主要设定档
我们在 /sbin/init 的运作过程中有谈到许多执行脚本,包括 /etc/rc.d/rc.sysinit 以及 /etc/rc.d/rc 等等,
其实这些脚本都会使用到相当多的系统设定档,这些开机过程会用到的设定档则大多放置在 /etc/sysconfig/ 目录下。
同时,由于核心还是需要载入一些驱动程式 (核心模组),此时系统自订的装置与模组对应档 (/etc/modprobe.conf)
就显的挺重要了喔!
关于模组: /etc/modprobe.conf
还记得我们在
当中谈到的载入使用者自订模组的地方吗?就是在 /etc/sysconfig/modules/ 目录下啊!
虽然核心提供的预设模组已经很足够我们使用了,但是,某些条件下我们还是得对模组进行一些参数的规划,
此时就得要使用到 /etc/modprobe.conf 啰!举例来说,鸟哥的 CentOS 主机的 modprobe.conf 有点像这样:
[root@www ~]# cat /etc/modprobe.conf
alias eth0 8139too
&==让 eth0 使用 8139too 的模组
alias scsi_hostadapter pata_sis
alias snd-card-0 snd-trident
options snd-card-0 index=0
&==额外指定 snd-card-0 的参数功能
options snd-trident index=0
这个档案大多在指定系统内的硬体所使用的模组啦!这个档案通常系统是可以自行产生的,所以你不必手动去订正他!
不过,如果系统捉到错误的驱动程式,或者是你想要使用更新的驱动程式来对应相关的硬体配备时,
你就得要自行手动的处理一下这个档案了。
以上表的第一行为例,鸟哥使用螃蟹卡 (Realtek 的晶片组) 来作为我的网路卡,那螃蟹卡使用的模组就是 8139too
啦!这样看的懂了吧?当我要启动网路卡时,系统会跑到这个档案来查阅一下,然后载入 8139too
驱动程式来驱动网路卡啰!更多的相关说明,请 man modprobe.conf 喔!
/etc/sysconfig/*
不说您也知道,整个开机的过程当中,老是读取的一些服务的相关设定档都是记录在 /etc/sysconfig
目录下的!那么该目录底下有些啥玩意儿?我们找几个重要的档案来谈谈:
authconfig:
这个档案主要在规范使用者的身份认证的机制,包括是否使用本机的 /etc/passwd, /etc/shadow 等,
以及 /etc/shadow 密码记录使用何种加密演算法,还有是否使用外部密码伺服器提供的帐号验证 (NIS, LDAP) 等。
系统预设使用 MD5 加密演算法,并且不使用外部的身份验证机制;
此档案在设定 Linux 主机的时区,可以使用格林威治时间(GMT),也可以使用台湾的本地时间 (local)。基本上,在
clock 档案内的设定项目‘ ZONE ’所参考的时区位于 /usr/share/zoneinfo
目录下的相对路径中。而且要修改时区的话,还得将 /usr/share/zoneinfo/Asia/Taipei
这个档案复制成为 /etc/localtime 才行!
i18n 在设定一些语系的使用方面,例如最麻烦的文字介面下的日期显示问题!
如果你是以中文安装的,那么预设语系会被选择 zh_TW.UTF8 ,所以在纯文字介面之下,
你的档案日期显示可能就会呈现乱码!这个时候就需要更改一下这里啦!更动这个 i18n
的档案,将里面的 LC_TIME 改成 en 即可!
keyboard & mouse:
keyboard 与 mouse 就是在设定键盘与滑鼠的形式;
network 可以设定是否要启动网路,以及设定主机名称还有通讯闸 (GATEWAY) 这两个重要资讯呢!
network-scripts/:
至于 network-scripts 里面的档案,则是主要用在设定网路卡~
这部份我们在才会提到!
总而言之一句话,这个目录下的档案很重要的啦!开机过程里面常常会读取到的!
Run level 的切换
在我们完成上面的所有资讯后,其实整个 Linux 主机就已经在等待我们使用者的登入啦!
但是,相信您应该还是会有一点疑问的地方,那就是:‘我该如何切换
run level 呢?’会不会很难啊?不会啦!很简单~但是依据执行的时间而有不同的方式啊!
事实上,与 run level 有关的启动其实是在 /etc/rc.d/rc.sysinit
执行完毕之后。也就是说,其实 run level 的不同仅是 /etc/rc[0-6].d
里面启动的服务不同而已。不过,依据开机是否自动进入不同 run level 的设定,我们可以说:
要每次开机都执行某个预设的 run level ,则需要修改 /etc/inittab
内的设定项目,
亦即是‘ id:5:initdefault: ’里头的数字啊;
如果仅只是暂时变更系统的 run level 时,则使用 init [0-6] 来进行 run level 的变更。
但下次重新开机时,依旧会是以 /etc/inittab 的设定为准。
假设原本我们是以 run level 5 登入系统的,但是因为某些因素,想要切换成为 run level 3 时,
该怎么办呢?很简单啊,执行‘ init 3 ’即可切换。但是 init 3 这个动作到底做了什么呢?
我们不是说了吗?事实上,不同的 run level 只是载入的服务不同罢了,
亦即是 /etc/rc5.d/ 还有 /etc/rc3.d 内的 Sxxname 与 Kxxname 有差异而已。
所以说,当执行 init 3 时,系统会:
先比对 /etc/rc3.d/ 及 /etc/rc5.d 内的 K 与 S 开头的档案;
在新的 runlevel 亦即是 /etc/rc3.d/ 内有多的 K 开头档案,则予以关闭;
在新的 runlevel 亦即是 /etc/rc3.d/ 内有多的 S 开头档案,则予以启动;
也就是说,两个 run level 都存在的服务就不会被关闭啦!如此一来,就很容易切换 run level 了,
而且还不需要重新开机呢!真方便。那我怎么知道目前的 run level 是多少呢?
直接在 bash 当中输入 runlevel 即可啊!
[root@www ~]# runlevel
# 左边代表前一个 runlevel ,右边代表目前的 runlevel。
# 由于之前并没有切换过 runlevel ,因此前一个 runlevel 不存在 (N)
# 将目前的 runlevel 切换成为 3 (注意, tty7 的资料会消失!)
[root@www ~]# init 3
NIT: Sending processes the TERM signal
Applying Intel CPU microcode update:
Starting background readahead:
Starting irqbalance:
Starting httpd:
Starting anacron:
# 这代表,新的 runlevel 亦即是 runlevel3 比前一个 runlevel 多出了上述 5 个服务
[root@www ~]# runlevel
# 看吧!前一个是 runlevel 5 ,目前的是 runlevel 3 啦!
那么你能不能利用 init 来进行关机与重新开机呢?可以的啦!利用‘ init 0 ’就能够关机,
而‘ init 6 ’就能够重新开机!为什么?往前翻一下 runlevel 的定义即可了解吧!
核心与核心模组
谈完了整个开机的流程,您应该会知道,在整个开机的过程当中,是否能够成功的驱动我们主机的硬体配备,
是核心 (kernel) 的工作!而核心一般都是压缩档,因此在使用核心之前,就得要将他解压缩后,
才能载入主记忆体当中。
另外,为了应付日新月异的硬体,目前的核心都是具有‘可读取模组化驱动程式’的功能,
亦即是所谓的‘ modules (模组化)’的功能啦!所谓的模组化可以将他想成是一个‘外挂程式’,
该外挂程式可能由硬体开发厂商提供,也有可能我们的核心本来就支援~不过,较新的硬体,
通常都需要硬体开发商提供驱动程式模组啦!
那么核心与核心模组放在哪?
核心: /boot/vmlinuz 或 /boot/vmlinuz-version;
核心解压缩所需 RAM Disk: /boot/initrd (/boot/initrd-version);
核心模组: /lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel;
核心原始码: /usr/src/linux (要安装才会有!否则预设不安装的!)
如果该核心被顺利的载入系统当中了,那么就会有几个资讯纪录下来:
核心版本: /proc/version
系统核心功能: /proc/sys/kernel
问题来啦,如果我有个新的硬体,偏偏我的作业系统不支援,该怎么办?很简单啊!
重新编译核心,并加入最新的硬体驱动程式原始码;
将该硬体的驱动程式编译成为模组,在开机时载入该模组
上面第一点还很好理解,反正就是重新编译核心就是了。不过,核心编译很不容易啊!
我们会在后续章节约略介绍核心编译的整个程序。比较有趣的则是将该硬体的驱动程式编译成为模组啦!
关于编译的方法,可以参考后续的的介绍。
我们这个章节仅是说明一下,如果想要载入一个已经存在的模组时,该如何是好?
核心模组与相依性
既然要处理核心模组,自然就得要了解了解我们核心提供的模组之间的相关性啦!
基本上,核心模组的放置处是在 /lib/modules/$(uname -r)/kernel 当中,里面主要还分成几个目录:
arch :与硬体平台有关的项目,例如 CPU 的等级等等;
crypto :核心所支援的加密的技术,例如 md5 或者是 des 等等;
drivers :一些硬体的驱动程式,例如显示卡、网路卡、PCI 相关硬体等等;
fs :核心所支援的 filesystems ,例如 vfat, reiserfs, nfs 等等;
lib :一些函式库;
net :与网路有关的各项协定资料,还有防火墙模组 (net/ipv4/netfilter/*) 等等;
sound :与音效有关的各项模组;
如果要我们一个一个的去检查这些模组的主要资讯,然后定义出他们的相依性,
我们可能会疯掉吧!所以说,我们的 Linux 当然会提供一些模组相依性的解决方案啰~
对啦!那就是检查 /lib/modules/$(uname -r)/modules.dep
这个档案啦!他记录了在核心支援的模组的各项相依性。
那么这个档案如何建立呢?挺简单!利用 depmod 这个指令就可以达到建立该档案的需求了!
[root@www ~]# depmod [-Ane]
选项与参数:
:不加任何参数时, depmod 会主动的去分析目前核心的模组,并且重新写入
/lib/modules/$(uname -r)/modules.dep 当中。若加入 -A 参数时,则 depmod
会去搜寻比 modules.dep 内还要新的模组,如果真找到新模组,才会更新。
:不写入 modules.dep ,而是将结果输出到荧幕上(standard out);
:显示出目前已载入的不可执行的模组名称
范例一:若我做好一个网路卡驱动程式,档名为 a.ko,该如何更新核心相依性?
[root@www ~]# cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net
[root@www ~]# depmod
以上面的范例一为例,我们的 Linux kernel 2.6.x 版本的核心模组副档名一定是 .ko 结尾的,
当你使用 depmod 之后,该程式会跑到模组标准放置目录 /lib/modules/$(uname -r)/kernel ,
并依据相关目录的定义将全部的模组捉出来分析,最终才将分析的结果写入 modules.dep 档案中的呐!
这个档案很重要喔!因为他会影响到本章稍后会介绍的
指令的应用!
核心模组的观察
那你到底晓不晓得目前核心载入了多少的模组呢?粉简单啦!利用 lsmod 即可!
[root@www ~]# lsmod
....(中间省略)....
9too,8139cp &==mii 还被 8139cp, 8139too 使用
....(中间省略)....
&==底下三个是 USB 相关的模组!
使用 lsmod 之后,系统会显示出目前已经存在于核心当中的模组,显示的内容包括有:
模组名称(Module);
模组的大小(size);
此模组是否被其他模组所使用 (Used by)。
也就是说,模组其实真的有相依性喔!举上表为例, mii 这个模组会被 8139too 所使用。
简单的说,就是‘当你要载入 8139too 时,需要先载入 mii 这个模组才可以顺利的载入 8139too’的意思。
那么除了显示出目前的模组外,我还可以查阅每个模组的资讯吗?举例来说,我们知道 8139too
是螃蟹卡的驱动程式,那么 mii 是什么咚咚?就用 modinfo 来观察吧!
[root@www ~]# modinfo [-adln] [module_name|filename]
选项与参数:
:仅列出作者名称;
:仅列出该 modules 的说明 (description);
:仅列出授权 (license);
:仅列出该模组的详细路径。
范例一:由上个表格当中,请列出 mii 这个模组的相关资讯:
[root@www ~]# modinfo mii
/lib/modules/2.6.18-92.el5/kernel/drivers/net/mii.ko
description:
MII hardware support library
Jeff Garzik &&
srcversion:
16DCEDEE4BD
2.6.18-92.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
# 可以看到这个模组的来源,以及该模组的简易说明!(是硬体支援函式库)
范例二:我有一个模组名称为 a.ko ,请问该模组的资讯为?
[root@www ~]# modinfo a.ko
....(省略)....
事实上,这个 modinfo 除了可以‘查阅在核心内的模组’之外,还可以检查‘某个模组档案’,
因此,如果你想要知道某个档案代表的意义为何,利用 modinfo 加上完整档名吧!
看看就晓得是啥玩意儿啰! ^_^
核心模组的载入与移除
好了,如果我想要自行手动载入模组,又该如何是好?有很多方法啦,最简单而且建议的,是使用 modprobe 这个指令来载入模组,
这是因为 modprobe 会主动的去搜寻 modules.dep 的内容,先克服了模组的相依性后,
才决定需要载入的模组有哪些,很方便。至于 insmod 则完全由使用者自行载入一个完整档名的模组,
并不会主动的分析模组相依性啊!
[root@www ~]# insmod [/full/path/module_name] [parameters]
范例一:请尝试载入 cifs.ko 这个‘档案系统’模组
[root@www ~]# insmod /lib/modules/$(uname -r)/kernel/fs/cifs/cifs.ko
[root@www ~]# lsmod | grep cifs
他立刻就将该模组载入啰~但是 insmod 后面接的模组必须要是完整的‘档名’才行!那如何移除这个模组呢?
[root@www ~]# rmmod [-fw] module_name
选项与参数:
:强制将该模组移除掉,不论是否正被使用;
:若该模组正被使用,则 rmmod 会等待该模组被使用完毕后,才移除他!
范例一:将刚刚载入的 cifs 模组移除!
[root@www ~]# rmmod cifs
范例二:请载入 vfat 这个‘档案系统’模组
[root@www ~]# insmod /lib/modules/$(uname -r)/kernel/fs/vfat/vfat.ko
insmod: error inserting '/lib/modules/2.6.18-92.el5/kernel/fs/vfat/vfat.ko':
-1 Unknown symbol in module
# 无法载入 vfat 这个模组啊!伤脑筋!
使用 insmod 与 rmmod 的问题就是,你必须要自行找到模组的完整档名才行,而且如同上述范例二的结果,
万一模组有相依属性的问题时,你将无法直接载入或移除该模组呢!所以近年来我们都建议直接使用 modprobe
来处理模组载入的问题,这个指令的用法是:
[root@www ~]# modprobe [-lcfr] module_name
选项与参数:
:列出目前系统所有的模组!(更详细的代号对应表)
:列出目前在 /lib/modules/`uname -r`/kernel 当中的所有模组完整档名;
:强制载入该模组;
:类似 rmmod ,就是移除某个模组啰~
范例一:载入 cifs 模组
[root@www ~]# modprobe cifs
# 很方便吧!不需要知道完整的模组档名,这是因为该完整档名已经记录到
# /lib/modules/`uname -r`/modules.dep 当中的缘故啊!如果要移除的话:
[root@www ~]# modprobe -r cifs
使用 modprobe 真的是要比 insmod 方便很多!因为他是直接去搜寻 modules.dep 的纪录,
所以啰,当然可以克服模组的相依性问题,而且还不需要知道该模组的详细路径呢!
好方便! ^_^
尝试使用 modprobe 载入 vfat 这个模组,并且观察该模组的相关模组是哪个?
我们使用 modprobe 来载入,再以 lsmod 来观察与 grep 撷取关键字看看:
[root@www ~]# modprobe vfat
[root@www ~]# lsmod | grep vfat
1 vfat &==原来就是 fat 这个模组啊!
[root@www ~]# modprobe -r vfat &==测试完移除此模组
核心模组的额外参数设定:
/etc/modprobe.conf
这个档案我们之前已经谈过了,这里只是再强调一下而已,如果您想要修改某些模组的额外参数设定,
就在这个档案内设定吧!我们假设一个案例好了,假设我的网路卡 eth0 是使用 ne ,
但是 eth1 同样也使用 ne ,为了避免同一个模组会导致网路卡的错乱,
因此,我可以先找到 eth0 与 eth1 的 I/O 与 IRQ ,假设:
eth0 : I/O (0x300) 且 IRQ=5
eth1 : I/O (0x320) 且 IRQ=7
[root@www ~]# vi /etc/modprobe.conf
alias eth0 ne
alias eth1 ne
options eth0 io=0x300 irq=5
options eth1 io=0x320 irq=7
嘿嘿!如此一来,我的 Linux 就不会捉错网路卡的对应啰!因为被我强制指定某个 I/O 咯嘛! ^_^
Boot Loader: Grub
在看完了前面的整个开机流程,以及核心模组的整理之后,你应该会发现到一件事情,
那就是‘ boot loader 是载入核心的重要工具’啊!没有 boot loader 的话,那么
kernel 根本就没有办法被系统载入的呢!所以,底下我们会先谈一谈 boot loader 的功能,
然后再讲一讲现阶段 Linux 里头最主流的 grub 这个 boot loader 吧!
boot loader 的两个 stage
我们在第一小节开机流程的地方曾经讲过,在 BIOS 读完资讯后,接下来就是会 了。这个 boot loader
可以具有选单功能、直接载入核心档案以及控制权移交的功能等,
系统必须要有 loader 才有办法载入该作业系统的核心就是了。但是我们都知道, MBR
是整个硬碟的第一个 sector 内的一个区块,充其量整个大小也才 446 bytes 而已。
我们的 loader 功能这么强,光是程式码与设定资料不可能只占不到 446 bytes 的容量吧?那如何安装?
为了解决这个问题,所以 Linux 将 boot loader 的程式码执行与设定值载入分成两个阶段 (stage) 来执行:
Stage 1:执行 boot loader 主程式:
第一阶段为执行 boot loader 的主程式,这个主程式必须要被安装在开机区,亦即是 MBR 或者是 boot sector
。但如前所述,因为 MBR 实在太小了,所以,MBR 或 boot sector 通常仅安装 boot loader 的最小主程式,
并没有安装 loader 的相关设定档;
Stage 2:主程式载入设定档:
第二阶段为透过 boot loader 载入所有设定档与相关的环境参数档案 (包括档案系统定义与主要设定档 menu.lst),
一般来说,设定档都在 /boot 底下。
那么这些设定档是放在哪里啊?这些与 grub 有关的档案都放置到 /boot/grub 中,那我们就来看看有哪些档案吧!
[root@www ~]# ls -l /boot/grub
-rw-r--r--
device.map
&==grub 的装置对应档(底下会谈到)
-rw-r--r--
e2fs_stage1_5
&==ext2/ext3 档案系统之定义档
-rw-r--r--
fat_stage1_5
&==FAT 档案系统之定义档
-rw-r--r--
ffs_stage1_5
&==FFS 档案系统之定义档
-rw-------
&==grub 在 Red Hat 的设定档
-rw-r--r--
iso9660_stage1_5
&==光碟机档案系统定义档
-rw-r--r--
jfs_stage1_5
&==jfs 档案系统定义档
lrwxrwxrwx
menu.lst -& ./grub.conf &==其实 menu.lst 才是设定档!
-rw-r--r--
minix_stage1_5
&==minix 档案系统定义档
-rw-r--r--
reiserfs_stage1_5
&==reiserfs 档案系统定义档
-rw-r--r--
splash.xpm.gz
&==开机时在 grub 底下的背景图示
-rw-r--r--
&==stage 1 的相关说明
-rw-r--r--
&==stage 2 的相关说明
-rw-r--r--
ufs2_stage1_5
&==UFS 的档案系统定义档
-rw-r--r--
vstafs_stage1_5
&==vstafs 档案系统定义档
-rw-r--r--
xfs_stage1_5
&==xfs 档案系统定义档
从上面的说明你可以知道 /boot/grub/ 目录下最重要的就是设定档 (menu.lst) 以及各种档案系统的定义!
我们的 loader 读取了这种档案系统定义资料后,就能够认识档案系统并读取在该档案系统内的核心档案啰。
的设定档档名,其实应该是 menu.lst 的,只是在 Red Hat 里面被定义成为 /boot/grub.conf 而已。
鸟哥建议您还是记忆 menu.lst 比较好喔!
所以从上面的档案来看, grub 认识的档案系统真的非常多喔!正因为如此,所以 grub
才会取代 Lilo 这个老牌的 boot loader 嘛!好了,接下来就来瞧瞧设定档内有啥设定值吧!
grub 的设定档
/boot/grub/menu.lst 与选单类型
grub 是目前使用最广泛的 Linux 开机管理程式,旧的 Lilo 这个开机管理程式现在已经很少见了,
所以本章才会将 Lilo 的介绍舍弃的说。grub 的优点挺多的,包括有:
认识与支援较多的档案系统,并且可以使用 grub 的主程式直接在档案系统中搜寻核心档名;
开机的时候,可以‘自行编辑与修改开机设定项目’,类似 bash 的指令模式;
可以动态搜寻设定档,而不需要在修改设定档后重新安装 grub 。亦即是我们只要修改完
/boot/grub/menu.lst 里头的设定后,下次开机就生效了!
上面第三点其实就是 Stage 1, Stage 2 分别安装在 MBR (主程式) 与档案系统当中 (设定档与定义档) 的原因啦!
好了,接下来,让我们好好了解一下 grub 的设定档: /boot/grub/menu.lst 这玩意儿吧!
要注意喔,那个 lst 是 LST 的小写,不要搞错啰!
硬碟与分割槽在 grub 中的代号
安装在 MBR 的 grub 主程式,最重要的任务之一就是从磁碟当中载入核心档案,
以让核心能够顺利的驱动整个系统的硬体。所以啰, grub 必须要认识硬碟才行啊!那么 grub 到底是如何认识硬碟的呢?
嘿嘿! grub 对硬碟的代号设定与传统的 Linux 磁碟代号可完全是不同的!grub 对硬碟的识别使用的是如下的代号:
够神了吧?跟 /dev/hda1 风马牛不相干~怎么办啊?其实只要注意几个东西即可,那就是:
硬碟代号以小括号 ( ) 包起来;
硬碟以 hd 表示,后面会接一组数字;
以‘搜寻顺序’做为硬碟的编号,而不是依照硬碟排线的排序!(这个重要!)
第一个搜寻到的硬碟为 0 号,第二个为 1 号,以此类推;
每颗硬碟的第一个 partition 代号为 0 ,依序类推。
所以说,第一颗‘搜寻到的硬碟’代号为:‘(hd0)’,而该颗硬碟的第一号分割槽为‘(hd0,0)’,这样说了解了吧?
反正你要记得,在 grub 里面,他开始的数字是 0 而不是 1 就是了!
在较旧的主机板上面,通常第一颗硬碟会插在 IDE 1 的 master 上,就会是 /dev/hda,所以常常我们可能会误会
/dev/hda 就是 (hd0),其实不是喔!要看你的 BIOS 设定值才行!有的主机板 BIOS
可以调整开机的硬碟搜寻顺序,那么就要注意了,因为 grub 的硬碟代号可能会跟着改变呐!留意留意!
所以说,整个硬碟代号为:
硬碟搜寻顺序在 Grub
当中的代号
第一颗(hd0) (hd0,0) (hd0,1) (hd0,4)....
第二颗(hd1) (hd1,0) (hd1,1) (hd1,4)....
第三颗(hd2) (hd2,0) (hd2,1) (hd2,4)....
这样应该比较好看出来了吧?第一颗硬碟的 MBR 安装处的硬碟代号就是‘(hd0)’,
而第一颗硬碟的第一个分割槽的 boot sector 代号就是‘(hd0,0)’第一颗硬碟的第一个逻辑分割槽的
boot sector 代号为‘(hd0,4)’了了吧!
假设你的系统仅有一颗 SATA 硬碟,请说明该硬碟的第一个逻辑分割槽在 Linux 与 grub 当中的档名与代号:
因为是 SATA 磁碟,加上使用逻辑分割槽,因此 Linux 当中的档名为 /dev/sda5 才对 (1~4 保留给 primary 与 extended 使用)。
至于 grub 当中的磁碟代号则由于仅有一颗磁碟,因此代号会是‘ (hd0,4) ’才对。
/boot/grub/menu.lst 设定档:
了解了 grub 当中最麻烦的硬碟代号后,接下来,我们就可以瞧一瞧设定档的内容了。先看一下鸟哥的 CentOS
内的 /boot/grub/menu.lst 好了:
[root@www ~]# vim /boot/grub/menu.lst
&==预设开机选项,使用第 1 个开机选单 (title)
&==若 5 秒内未动键盘,使用预设选单开机
splashimage=(hd0,0)/grub/splash.xpm.gz &==背景图示所在的档案
hiddenmenu
&==读秒期间是否显示出完整的选单画面(预设隐藏)
title CentOS (2.6.18-92.el5)
&==第一个选单的内容
root (hd0,0)
kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet
initrd /initrd-2.6.18-92.el5.img
在 title 以前的四行,都是属于 grub 的整体设定,包括预设的等待时间与预设的开机项目,
还有显示的画面特性等等。至于 title 后面才是指定开机的核心档案或者是 boot loader 控制权。
在整体设定方面的项目主要常见的有:
这个必须要与 title 作为对照,在设定档里面有几个 title ,开机的时候就会有几个选单可以选择。
由于 grub 启始号码为 0 号,因此 default=0 代表使用‘第一个 title 项目’来开机的意思。
default 的意思是,如果在读秒时间结束前都没有动到键盘, grub 预设使用此 title 项目 (在此为 0 号) 来开机。
开机时会进行读秒,如果在 5 秒钟内没有按下任何按键,就会使用上面提到的 default 后面接的那个 title
项目来开机的意思。如果你觉得 5 秒太短,那可以将这个数值调大 (例如 30 秒) 即可。此外,如果 timeout=0
代表直接使用 default 值进行开机而不读秒,timeout=-1 则代表直接进入选单不读秒了!
splashimage=(hd0,0)/grub/splash.xpm.gz
有没有发现你的 CentOS 在开机的时候背景不是黑白而是有色彩变化的呢?那就是这个档案提供的背景图示啦()!不过这个档案的实际路径写法怎么会是这样啊?很简单啊~上述的意思是:在 (hd0,0) 这个分割槽内的最顶层目录中,底下的 grub/splash.xpm.gz 那个档案的意思。
由于鸟哥将 /boot 这个目录独立成为 /dev/hda1 ,因此这边就会写成‘在 /dev/hda1
里面的 grub/splash.xpm.gz ’的意思啦!想一想,如果你的 /boot 目录并没有独立成为一个分割槽,
这里会写成如何?
hiddenmenu
这个说的是,开机时是否要显示选单?目前 CentOS 预设是不要显示选单,
如果您想要显示选单,那就将这个设定值注解掉!
整体设定的地方大概是这样,而底下那个 title 则是显示开机的设定项目。如同前一小节提到的,开机时可以选择
(1)直接指定核心档案开机或 (2)将 boot loader 控制权转移到下个 loader
(此过程称为 chain-loader)。每个 title 后面接的是‘该开机项目名称的显示’,亦即是在选单出现时,选单上面的名称而已。
那么这两种方式的设定有啥不同呢?
直接指定核心开机
既然要指定核心开机,所以当然要找到核心档案啦!此外,有可能还需要用到 initrd 的 RAM Disk 设定档。但是如前说的,
尚未开机完成,所以我们必须要以 grub 的硬碟识别方式找出完整的 kernel 与 initrd 档名才行。
因此,我们可能需要有底下的方式来设定才行!
1. 先指定核心档案放置的 partition,再读取档案 (目录树),
最后才加入档案的实际档名与路径 (kernel 与 initrd);
鸟哥的 /boot 为 /dev/hda1 ,因此核心档案的设定则成为:
&==代表核心档案放在那个 partition 当中
/vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet
/initrd-2.6.18-92.el5.img
上面的 root, kernel, initrd 后面接的参数的意义说明如下:
root :代表的是‘核心档案放置的那个 partition 而不是根目录’喔!不要搞错了!
以鸟哥的案例来说,我的根目录为 /dev/hda2 而 /boot 独立为 /dev/hda1 ,因为与 /boot 有关,
所以磁碟代号就会成为 (hd0,0) 啰。
kernel :至于 kernel 后面接的则是核心的档名,而在档名后面接的则是核心的参数。
由于开机过程中需要挂载根目录,因此 kernel 后面接的那个 root=LABEL=/1 指的是‘Linux 的根目录在哪个 partition ’的意思。
还记得功能吧?
是的,这里使用 LABEL 来挂载根目录。至于 rhgb 为色彩显示而 quiet 则是安静模式 (荧幕不会输出核心侦测的资讯)。
initrd :就是前面提到的 initrd 制作出 RAM Disk 的档案档名啦!
2. 直接指定 partition 与档名,不需要额外指定核心档案所在装置代号
(hd0,0)/vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet
(hd0,0)/initrd-2.6.18-92.el5.img
老实说,鸟哥比较喜欢这种样式的档名写法,因为这样我们就能够知道核心档案是在哪个装置内的某个档名,
而不会去想到我们的根目录 (/, root) 啦!让我们来想想 /boot 有独立分割与无独立分割的情况吧!
我的系统分割是: /dev/hda1 (/), /dev/hda2 (swap) 而已,且我的核心档案为 /boot/vmlinuz,请问 grub 的 menu.lst
内该如何撰写核心档案位置?
我们使用叠代的方式来了解一下好了。由于核心档名为 /boot/vmlinuz,转成装置档名与代号会成为如下的过程:
原始档案:
/boot/vmlinuz ↓
Linux 装置:(/dev/hda1)/boot/vmlinuz ↓
装置:(hd0,0)/boot/vmlinuz
所以最终的 kernel 写法会变成:
kernel (hd0,0)/boot/vmlinuz root=/dev/hda1 ...
同上,只是我的分割情况变成: /dev/sda1 (/boot), /dev/sda5 (/) 时?
由于 /boot 被独立出来了,所以情况会不一样喔!如下所示:
原始档案:
/boot/vmlinuz ↓
Linux 装置:(/dev/sda1)/vmlinuz ↓
装置:(hd0,0)/vmlinuz
所以最终的 kernel 写法会变成:
kernel (hd0,0)/vmlinuz root=/dev/sda5 ...
利用 chain loader 的方式转交控制权
所谓的 chain loader (开机管理程式的链结) 仅是在将控制权交给下一个 boot loader 而已,
所以 grub 并不需要认识与找出 kernel 的档名 ,‘ 他只是将 boot
的控制权交给下一个 boot sector 或 MBR 内的 boot loader 而已 ’
所以通常他也不需要去查验下一个 boot loader 的档案系统!
一般来说, chain loader 的设定只要两个就够了,一个是预计要前往的 boot sector 所在的分割槽代号,
另一个则是设定 chainloader 在那个分割槽的 boot sector (第一个磁区) 上!假设我的 Windows 分割槽在
/dev/hda1 ,且我又只有一颗硬碟,那么要 grub 将控制权交给 windows 的 loader 只要这样就够了:
[root@www ~]# vi /boot/grub/menu.lst
....前略....
title Windows partition
root (hd0,0)
&==设定使用此分割槽
chainloader +1
&== +1 可以想成第一个磁区,亦即是 boot sector
上面的范例中,我们可以很简单的这样想:那个 (hd0,0) 就是 Windows 的 C 槽所在磁碟,
而 chainloader +1 就是让系统载入该分割槽当中的第一个磁区 (就是 boot sector) 内的开机管理程式。
不过,由于 Windows 的开机碟需要设定为活化 (active) 状态,且我们的 grub 预设会去检验该分割槽的档案系统。
因此我们可以重新将上面的范例改写成这样:
[root@www ~]# vi /boot/grub/menu.lst
....前略....
title Windows partition
rootnoverify (hd0,0)
&==不检验此分割槽
chainloader +1
makeactive
&==设定此分割槽为开机碟(active)
grub 的功能还不止此,他还能够隐藏某些分割槽。举例来说,我的 /dev/hda5 是安装 Linux 的分割槽,
我不想让 Windows 能够认识这个分割槽时,你可以这样做:
[root@www ~]# vi /boot/grub/menu.lst
....前略....
title Windows partition
hide (hd0,4)
&==隐藏 (hd0,4) 这个分割槽
rootnoverify (hd0,0)
chainloader +1
makeactive
initrd 的重要性与建立新
initrd 档案
我们在本章稍早之前‘ ’的地方已经提到过 initrd
这玩意儿,他的目的在于提供开机过程中所需要的最重要核心模组,以让系统开机过程可以顺利完成。
会需要 initrd 的原因,是因为核心模组放置于 /lib/modules/$(uname -r)/kernel/ 当中,
这些模组必须要根目录 (/) 被挂载时才能够被读取。但是如果核心本身不具备磁碟的驱动程式时,
当然无法挂载根目录,也就没有办法取得驱动程式,因此造成两难的地步。
initrd 可以将 /lib/modules/.... 内的‘开机过程当中一定需要的模组’包成一个档案 (档名就是 initrd),
然后在开机时透过主机的 INT 13 硬体功能将该档案读出来解压缩,并且 initrd 在记忆体内会模拟成为根目录,
由于此虚拟档案系统 (Initial RAM Disk) 主要包含磁碟与档案系统的模组,因此我们的核心最后就能够认识实际的磁碟,
那就能够进行实际根目录的挂载啦!所以说:‘initrd
内所包含的模组大多是与开机过程有关,而主要以档案系统及硬碟模组 (如 usb, SCSI 等) 为主’的啦!
一般来说,需要 initrd 的时刻为:
根目录所在磁碟为 SATA、USB 或 SCSI 等连接介面;
根目录所在档案系统为 LVM, RAID 等特殊格式;
根目录所在档案系统为非传统 Linux 认识的档案系统时;
其他必须要在核心载入时提供的模组。
之前鸟哥忽略 initrd 这个档案的重要性,是因为鸟哥很穷... ^_^。因为鸟哥的 Linux 主机都是较早期的硬体,
使用的是 IDE 介面的硬碟,而且并没有使用 LVM 等特殊格式的档案系统,而 Linux 核心本身就认识 IDE 介面的磁碟,
因此不需要 initrd 也可以顺利开机完成的。自从 SATA 硬碟流行起来后,没有 initrd 就没办法开机了!
因为 SATA 硬碟使用的是 SCSI 模组来驱动的,而 Linux 预设将 SCSI 功能编译成为模组....
一般来说,各 distribution 提供的核心都会附上 initrd 档案,但如果你有特殊需要所以想重制 initrd 档案的话,
可以使用 mkinitrd 来处理的。这个档案的处理方式很简单, man mkinitrd 就知道了! ^_^。
我们还是简单的介绍一下去!
[root@www ~]# mkinitrd [-v] [--with=模组名称] initrd档名 核心版本
选项与参数:
:显示 mkinitrd 的运作过程
--with=模组名称:模组名称指的是模组的名字而已,不需要填写档名。举例来说,
目前核心版本的 ext3 档案系统模组为底下的档名:
/lib/modules/$(uname -r)/kernel/fs/ext3/ext3.ko
那你应该要写成: --with=ext3 就好了 (省略 .ko)
initrd档名:你所要建立的 initrd 档名,尽量取有意义又好记的名字。
:某一个核心的版本,如果是目前的核心则是‘ $(uname -r) ’
范例一:以 mkinitrd 的预设功能建立一个 initrd 虚拟磁碟档案
[root@www ~]# mkinitrd -v initrd_$(uname -r) $(uname -r)
Creating initramfs
Looking for deps of module ehci-hcd
Looking for deps of module ohci-hcd
....(中间省略)....
Adding module ehci-hcd
&==最终加入 initrd 的就是底下的模组
Adding module ohci-hcd
Adding module uhci-hcd
Adding module jbd
Adding module ext3
Adding module scsi_mod
Adding module sd_mod
Adding module libata
Adding module pata_sis
[root@www ~]# ll initrd_*
-rw------- 1 root root 2406443 Apr 30 02:55 initrd_2.6.18-92.el5
# 由于目前的核心版本可使用 uname -r 取得,因此鸟哥使用较简单的指令来处理啰~
# 此时 initrd 会被建立起来,你可以将他移动到 /boot 等待使用。
范例二:增加 8139too 这个模组的 initrd 档案
[root@www ~]# mkinitrd -v --with=8139too initrd_vbirdtest $(uname -r)
....(前面省略)....
Adding module mii
Adding module 8139too
&==看到没!这样就加入了!
initrd 建立完成之后,同时核心也处理完毕后,我们就可以使用 grub 来建立选单了!底下继续瞧一瞧吧!
测试与安装 grub
如果你的 Linux 主机本来就是使用 grub 作为 loader 的话,那么你就不需要重新安装 grub 了,
因为 grub 本来就会主动去读取设定档啊!您说是吧!但如果你的 Linux 原来使用的并非 grub ,
那么就需要来安装啦!如何安装呢?首先,你必须要使用 grub-install 将一些必要的档案复制到
/boot/grub 里面去,你应该这样做的:
安装些什么呢?因为 boot loader 有两个 stage ,而设定档得要放置到适当的地方。
这个 grub-install 就是在安装设定档 (包括档案系统定义档与 menu.lst 等等) 而已!
如果要将 grub 的 stage1 主程式安装起来,就得要使用 grub shell 的功能喔!本章稍后会介绍。
[root@www ~]# grub-install [--root-directory=DIR] INSTALL_DEVICE
选项与参数:
--root-directory=DIR 那个 DIR 为实际的目录,使用 grub-install 预设会将
grub 所有的档案都复制到 /boot/grub/* ,如果想要复制到其他目录与装置去,
就得要用这个参数。
INSTALL_DEVICE 安装的装置代号啦!
范例一:将 grub 安装在目前系统的 MBR 底下,我的系统为 /dev/hda:
[root@www ~]# grub-install /dev/hda
# 因为原本 /dev/hda 就是使用 grub ,所以似乎不会出现什么特别的讯息。
# 如果去查阅一下 /boot/grub 的内容,会发现所有的档案都更新了,因为我们重装了!
范例二:我的 /home 为独立的 /dev/hda3 ,如何安装 grub 到 /dev/hda3 (boot sector)
[root@www ~]# grub-install --root-directory=/home /dev/hda3
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /home/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
&==会给予装置代号的对应表!
[root@www ~]# ll /home/boot/grub/
-rw-r--r-- 1 root root
30 Apr 30 11:12 device.map
-rw-r--r-- 1 root root
7584 Apr 30 11:12 e2fs_stage1_5
....(底下省略)....
# 看!档案都安装进来了!但是注意到,我们并没有设定档喔!那要自己建立!
所以说, grub-install 是安装 grub 相关的档案 (例如档案系统定义档)
到你的装置上面去等待在开机时被读取,但还需要设定好设定档 (menu.lst) 后,再以 grub shell 来安装 grub 主程式到
MBR 或者是 boot sector 上面去喔!好了,那我们来思考一下想要安装的资料。
我预计开机时要直接显示选单,且选单倒数为 30 秒。另外,在原本的 menu.lst 当中新增三个开机选单,分别如下说明:
假设 /dev/hda1 内含有 boot loader ,此 loader 如何取得控制权?
如何重新读取 MBR 内的 loader ?
利用你原本的系统核心档案,建立一个可强制进入单人维护模式的选单
第一点很简单,就利用上一小节的说明来处理即可。至于第二点,MBR 的读取读的是整颗硬碟的第一个磁区,
因此 root (hd0) 才是对的。第三点则与核心的后续参数有关。整个档案可以被改写成这样:
[root@www ~]# vim /boot/grub/menu.lst
timeout=30
splashimage=(hd0,0)/grub/splash.xpm.gz
#hiddenmenu
title CentOS (2.6.18-92.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet
initrd /initrd-2.6.18-92.el5.img
title /dev/hda1 boot sector
&==本例中的第一个新增选单
root (hd0,0)
chainloader +1
title MBR loader
&==新增的第二个选单
root (hd0)
&==MBR 为整颗磁碟的第一个磁区,所以用整颗磁碟的代}

我要回帖

更多关于 excel打开不显示内容 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信