朱文昊的中文博客--专注技术,向往自由
操作系统使用
剖析Linux系统启动过程
2010年05月15日
当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux,Linux首先进行内核的引导,接下来执行init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc当完成系统初始化和运行服务的任务后,返回init;init启动了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。
下面就将逐一介绍其中几个关键的部分:
第一部分:内核的引导(核内引导)
Red Hat9.0可以使用lilo或grub等引导程序开始引导Linux系统,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU的控制权,然后CPU就开始执行Linux的核心映象代码,开始了Linux启动过程。这里使用了几个汇编程序来引导Linux,这一步泛及到Linux源代码树中的“arch/i386/boot”下的这几个文件:bootsect.S、setup.S、video.S等。
其中bootsect.S是生成引导扇区的汇编源码,它完成加载动作后直接跳转到setup.S的程序入口。setup.S的主要功能就是将系统参数(包括内存、磁盘等,由BIOS返回)拷贝到特别内存中,以便以后这些参数被保护模式下的代码来读取。此外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。最后,setup.S将系统转换到保护模式,并跳转到 0×100000。
那么0×100000这个内存地址中存放的是什么代码?而这些代码又是从何而来的呢?
0×100000这个内存地址存放的是解压后的内核,因为Red Hat提供的内核包含了众多驱动和功能而显得比较大,所以在内核编译中使用了“makebzImage”方式,从而生成压缩过的内核,在RedHat中内核常常被命名为vmlinuz,在Linux的最初引导过程中,是通过”arch/i386/boot/compressed/”中的head.S利用misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0×100000的。
当CPU跳到0×100000时,将执行”arch/i386/kernel/head.S”中的startup_32,它也是vmlinux的入口,然后就跳转到start_kernel()中去了。start_kernel()是”init/main.c”中的定义的函数,start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。start_kernel()函数中,做了大量的工作来建立基本的Linux核心环境。如果顺利执行完start_kernel(),则基本的Linux核心环境已经建立起来了。
在start_kernel()的最后,通过调用init()函数,系统创建第一个核心线程,启动了init过程。而核心线程init()主要是来进行一些外设初始化的工作的,包括调用do_basic_setup()完成外设及其驱动程序的加载和初始化。并完成文件系统初始化和root文件系统的安装。
当do_basic_setup()函数返回init(),init()又打开了/dev/console设备,重定向三个标准的输入输出文件stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。到此init()函数结束,内核的引导部分也到此结束了.
find和grep并用,进行全文搜索的用法
2010年05月1日
find / -type f -exec grep -l “IP” {} \;
why ?
find / -type f -> find all files starting from /
find …. -exec -> for each item found, do the following command. Where you normally place the filename in you command, put {} .
grep -l “IP” something -> returns the filename if string “IP” is found in file something
Hope this helps
Gert (引用此人2000年的帖子,谢谢)
小技巧-Suse Linux下设置Cron job简便方法
2010年01月14日
很多时候设置Cron job,也就是自动执行的脚本,来定时做一些重复劳动的事情,一般都是采用导入或者修改Crontab的方法来实现。最近发现我的SuseLinux下面,有个很偷懒的做法,就是把待执行的脚本,直接放在/etc/下面的cron.daily/ cron.hourly/ cron.monthly/ cron.weekly/几个文件夹之一当中,就可以自动执行了。具体那个是每天一次,每小时一次,每月一次,每周一次,不用我说,大家都能看出来了吧。
具体的执行策略,据我观察,就是从脚本放入文件夹开始差不多计时的。比如现在放入一个脚本到cron.daily差不多以后每天这个时候就会执行一遍。(不计cron本身醒来去读该文件夹的时间误差啦)
注意,是直接把需要执行的脚本或者程序放进去就可以啦,一点不需要在crontab的格式上烦神了。
我爱OpenSuse~~
2010年01月9日
虽然Redhat超级权威,CentOS非常权威,Ubuntu风头很劲,Debian根正苗红,可是我还是喜欢我的Suse,我的笔记本用的是OpenSuse11.2,我的服务器就用了OpenSuse11.1. Oh, 我为什么用11.1?我的服务商提供的默认版本就是11.1啦,笔记本可以随便升级,但是服务器就不自找麻烦了,11.1的包已经足够新了。比CentOS5的默认包来说,可以说紧跟时代潮流了。比如允许Moodle2.0的系统要求,CentOs5是无法满足的,PHP和MySQL的版本都过低。
顺便说说怎么样升级不同的Suse版本吧,我的经验是在笔记本上从11.1升级到11.2版本。首先下载了11.2版本的DVD ISO,(可能不需要DVD ISO吧,CD ISO可能也够了),放在硬盘上,在yast界面指定更新源到该ISO,同时删掉11.1的源,然后做Factory Update, 或者Update吧。基本就会升级好的。比较危险的地方是,我装了很多扩展包,就是不包含在DVD ISO中的那种,升级是一定要联网的,所以千万不能升级网络驱动和Network Manager之类的。这个方面我吃过亏了,结果图形界面升级失败,害的我在文字节目下再升级了一次才搞定。这样升级的缺点就是无法同时升级文件系统。全新安装的默认文件系统是ext4,我的还是ext3,网上看到外国大牛有办法从ext3升级到ext4的,不过暂不敢尝试,我的笔记本上数据太多了,暂时连个备份的地方都没有,等家里发展一个NAS以后再说吧。



Facebook
Twitter
Picasa
LinkedIn
Youtube
Digg
Buzz