﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Xiaobo Sun -随笔分类-Unix</title><link>http://www.blogjava.net/sunxiaobo/category/28821.html</link><description>Eclipse-Unix
http://umlfact.berlios.de/~s_xsun/</description><language>zh-cn</language><lastBuildDate>Mon, 03 Aug 2009 02:39:10 GMT</lastBuildDate><pubDate>Mon, 03 Aug 2009 02:39:10 GMT</pubDate><ttl>60</ttl><item><title>Linux 启动</title><link>http://www.blogjava.net/sunxiaobo/archive/2008/12/11/245593.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Wed, 10 Dec 2008 17:23:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2008/12/11/245593.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/245593.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2008/12/11/245593.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/245593.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/245593.html</trackback:ping><description><![CDATA[<span class="g_ls">前言
<br />
linux有自己一套完整的启动体系，抓住了linux启动的脉络，linux的启动过程将不再神秘。
<br />
阅读之前建议先看一下附图。
<br />
<br />
本文中假设inittab中设置的init&nbsp;tree为：
<br />
/etc/rc.d/rc0.d
<br />
/etc/rc.d/rc1.d
<br />
/etc/rc.d/rc2.d
<br />
/etc/rc.d/rc3.d
<br />
/etc/rc.d/rc4.d
<br />
/etc/rc.d/rc5.d
<br />
/etc/rc.d/rc6.d
<br />
/etc/rc.d/init.d
<br />
<br />
目录
<br />
1.&nbsp;关于linux的启动
<br />
2.&nbsp;关于rc.d
<br />
3.&nbsp;启动脚本示例
<br />
4.&nbsp;关于rc.local
<br />
5.&nbsp;关于bash启动脚本
<br />
6.&nbsp;关于开机程序的自动启动
<br />
<br />
<br />
<br />
<br />
1.&nbsp;关于linux的启动
<br />
init是所有进程之父
<br />
init读取/etc/inittab，执行rc.sysinit脚本
<br />
(注意文件名是不一定的,有些unix甚至会将语句直接写在inittab中)
<br />
rc.sysinit脚本作了很多工作:
<br />
<br />
init&nbsp;$PATH
<br />
config&nbsp;network
<br />
start&nbsp;swap&nbsp;function
<br />
set&nbsp;hostname
<br />
check&nbsp;root&nbsp;file&nbsp;system,&nbsp;repair&nbsp;if&nbsp;needed
<br />
check&nbsp;root&nbsp;space
<br />
....
<br />
<br />
rc.sysinit根据inittab执行rc?.d脚本
<br />
linux是多用户系统，getty是多用户与单用户的分水岭
<br />
在getty之前运行的是系统脚本
<br />
<br />
2.&nbsp;关于rc.d
<br />
所有启动脚本放置在&nbsp;/etc/rc.d/init.d下
<br />
rc?.d中放置的是init.d中脚本的链接，命名格式是：
<br />
S{number}{name}
<br />
K{number}{name}
<br />
S开始的文件向脚本传递start参数
<br />
K开始的文件向脚本传递stop参数
<br />
number决定执行的顺序
<br />
<br />
3.&nbsp;启动脚本示例
<br />
<br />
这是一个用来启动httpd的&nbsp;/etc/rc.d/init.d/apache&nbsp;脚本：
<br />
<br />
代码:
<br />
#!/bin/bash
<br />
<br />
source&nbsp;/etc/sysconfig/rc
<br />
source&nbsp;$rc_functions
<br />
<br />
case&nbsp;"$1"&nbsp;in
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Starting&nbsp;Apache&nbsp;daemon..."
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/apache2/bin/apachectl&nbsp;-k&nbsp;start
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evaluate_retval
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Stopping&nbsp;Apache&nbsp;daemon..."
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/apache2/bin/apachectl&nbsp;-k&nbsp;stop
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evaluate_retval
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;restart)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Restarting&nbsp;Apache&nbsp;daemon..."
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/apache2/bin/apachectl&nbsp;-k&nbsp;restart
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evaluate_retval
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statusproc&nbsp;/usr/local/apache2/bin/httpd
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Usage:&nbsp;$0&nbsp;{start|stop|restart|status}"
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;1
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
<br />
esac<br />
可以看出他接受start,stop,restart,status参数
<br />
<br />
然后可以这样建立rc?.d的链接：
<br />
<br />
代码:
<br />
cd&nbsp;/etc/rc.d/init.d&nbsp;&amp;&amp;
<br />
ln&nbsp;-sf&nbsp;../init.d/apache&nbsp;../rc0.d/K28apache&nbsp;&amp;&amp;
<br />
ln&nbsp;-sf&nbsp;../init.d/apache&nbsp;../rc1.d/K28apache&nbsp;&amp;&amp;
<br />
ln&nbsp;-sf&nbsp;../init.d/apache&nbsp;../rc2.d/K28apache&nbsp;&amp;&amp;
<br />
ln&nbsp;-sf&nbsp;../init.d/apache&nbsp;../rc3.d/S32apache&nbsp;&amp;&amp;
<br />
ln&nbsp;-sf&nbsp;../init.d/apache&nbsp;../rc4.d/S32apache&nbsp;&amp;&amp;
<br />
ln&nbsp;-sf&nbsp;../init.d/apache&nbsp;../rc5.d/S32apache&nbsp;&amp;&amp;
<br />
ln&nbsp;-sf&nbsp;../init.d/apache&nbsp;../rc6.d/K28apache<br />
<br />
4.&nbsp;关于rc.local
<br />
<br />
经常使用的&nbsp;rc.local&nbsp;则完全是习惯问题，不是标准。
<br />
各个发行版有不同的实现方法，可以这样实现：
<br />
<br />
代码:
<br />
touch&nbsp;/etc/rc.d/rc.local
<br />
chmod&nbsp;+x&nbsp;/etc/rc.d/rc.local
<br />
ln&nbsp;-sf&nbsp;/etc/rc.d/rc.local&nbsp;/etc/rc.d/rc1.d/S999rc.local&nbsp;&amp;&amp;
<br />
ln&nbsp;-sf&nbsp;/etc/rc.d/rc.local&nbsp;/etc/rc.d/rc2.d/S999rc.local&nbsp;&amp;&amp;
<br />
ln&nbsp;-sf&nbsp;/etc/rc.d/rc.local&nbsp;/etc/rc.d/rc3.d/S999rc.local&nbsp;&amp;&amp;
<br />
ln&nbsp;-sf&nbsp;/etc/rc.d/rc.local&nbsp;/etc/rc.d/rc4.d/S999rc.local&nbsp;&amp;&amp;
<br />
ln&nbsp;-sf&nbsp;/etc/rc.d/rc.local&nbsp;/etc/rc.d/rc5.d/S999rc.local&nbsp;&amp;&amp;
<br />
ln&nbsp;-sf&nbsp;/etc/rc.d/rc.local&nbsp;/etc/rc.d/rc6.d/S999rc.local<br />
<br />
5.&nbsp;关于bash启动脚本
<br />
<br />
/etc/profile
<br />
/etc/bashrc
<br />
~/.bash_profile
<br />
~/.bashrc
<br />
是bash的启动脚本
<br />
<br />
一般用来设置单用户的启动环境，也可以实现开机单用户的程序，但要明确他们都是属于bash范畴而不是系统范畴。
<br />
<br />
他们的具体作用介绍如下：
<br />
<br />
/bin/bash这个命令解释程序(后面简称shell)使用了一系列启动文件来建立一个运行环境：
<br />
<br />
/etc/profile
<br />
/etc/bashrc
<br />
~/.bash_profile
<br />
~/.bashrc
<br />
~/.bash_logout
<br />
每一个文件都有特殊的功用并对登陆和交互环境有不同的影响。
<br />
/etc/profile&nbsp;和&nbsp;~/.bash_profile&nbsp;是在启动一个交互登陆shell的时候被调用。
<br />
/etc/bashrc&nbsp;和&nbsp;~/.bashrc&nbsp;是在一个交互的非登陆shell启动的时候被调用。
<br />
~/.bash_logout&nbsp;在用户注销登陆的时候被读取
<br />
<br />
一个交互的登陆shell会在&nbsp;/bin/login&nbsp;成功登陆之后运行。一个交互的非登陆shell是通过命令行来运行的，如
[prompt]$/bin/bash。一般一个非交互的shell出现在运行shell脚本的时候。之所以叫非交互的shell，是因为它不在命令行上
等待输入而只是执行脚本程序。<br />
=====================================================================================================<br />
</span>本文以RedHat9.0和i386平台为例，剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程。并且介绍了启动中涉及到的各种文件。
<p>　　阅读Linux源代码，无疑是深入学习Linux的最好方法。在本文对Linux启动过程的介绍中，我们也尝试从源代码的视角来更深入的剖析Linux的启动过程，所以其中也简单涉及到部分相关的Linux源<iframe marginwidth="0" marginheight="0" src="http://images.chinabyte.com/adjs/iframe-pip/y-software-pip.html" align="right" scrolling="no" width="360" frameborder="0" height="300"></iframe>代码，Linux启动这部分的源码主要使用的是C语言，也涉及到了少量的汇编。而启动过程中也执行了大量的shell(主要是bash shell)所写脚本。为了方便读者阅读，笔者将整个Linux启动过程分成以下几个部分逐一介绍，大家可以参考下图：</p>
<p>　　当用户打开PC的电源，BIOS开机自检，按BIOS中设置的启动设备(通常是硬盘)启动，接着启动设备上安装的引导<a href="http://dev.yesky.com/" class="bluekey" target="_blank">程序</a>lilo
或grub开始引导Linux，Linux首先进行内核的引导，接下来执行init程序，init程序调用了rc.sysinit和rc等程
序，rc.sysinit和rc当完成系统初始化和运行服务的任务后，返回init；init启动了mingetty后，打开了终端供用户登录系统，用户
登录成功后进入了Shell，这样就完成了从开机到登录的整个启动过程。</p>
<p align="center"><img onerror="this.src='http://www.yesky.com/image20010518/106686.png';" src="http://www.yesky.com/image20010518/106686.png" alt="" align="center" border="1" hspace="3" vspace="1" /></p>
下面就将逐一介绍其中几个关键的部分：
<p>　　第一部分：内核的引导(核内引导)</p>
<p>　　Red Hat9.0可以使用lilo或grub等引导<a href="http://dev.yesky.com/" class="bluekey" target="_blank">程序</a>开
始引导Linux系统，当引导程序成功完成引导任务后，Linux从它们手中接管了CPU的控制权，然后CPU就开始执行Linux的核心映象代码，开始
了Linux启动过程。这里使用了几个汇编程序来引导Linux，这一步泛及到Linux源代码树中的&#8220;arch/i386/boot&#8221;下的这几个文
件：bootsect.S、setup.S、video.S等。</p>
<p>　　其中bootsect.S是生成引导扇区的汇编源码，它完成加载动作后直接跳转到setup.S的程序入口。setup.S的主要功能就是将系
统参数（包括内存、磁盘等，由BIOS返回）拷贝到特别内存中，以便以后这些参数被保护模式下的代码来读取。此外，setup.S还将video.S中的
代码包含进来，检测和设置显示器和显示模式。最后，setup.S将系统转换到保护模式，并跳转到 0x100000。</p>
<p>　　那么0x100000这个内存地址中存放的是什么代码？而这些代码又是从何而来的呢？</p>
<p>　　0x100000这个内存地址存放的是解压后的内核，因为Red Hat提供的内核包含了众多<a href="http://drivers.yesky.com/" class="bluekey" target="_blank">驱动</a>和
功能而显得比较大，所以在内核编译中使用了&#8220;makebzImage&#8221;方式，从而生成压缩过的内核，在RedHat中内核常常被命名为vmlinuz，在
Linux的最初引导过程中，是通过"arch/i386/boot/compressed/"中的head.S利用misc.c中定义的
decompress_kernel()函数，将内核vmlinuz解压到0x100000的。</p>
<p>　　当CPU跳到0x100000时，将执行"arch/i386/kernel/head.S"中的startup_32，它也是vmlinux
的入口，然后就跳转到start_kernel()中去了。start_kernel()是"init/main.c"中的定义的函
数，start_kernel()中调用了一系列初始化函数，以完成kernel本身的设置。start_kernel()函数中，做了大量的工作来建立
基本的Linux核心环境。如果顺利执行完start_kernel()，则基本的Linux核心环境已经建立起来了。</p>
<p>　　在start_kernel()的最后，通过调用init()函数，系统创建第一个核心线程，启动了init过程。而核心线程init()主要
是来进行一些外设初始化的工作的，包括调用do_basic_setup()完成外设及其驱动程序的加载和初始化。并完成文件系统初始化和root文件系
统的安装。</p>
<p>　　当do_basic_setup()函数返回init()，init()又打开了/dev/console设备，重定向三个标准的输入输出文件
stdin、stdout和stderr到控制台，最后，搜索文件系统中的init程序（或者由init=命令行参数指定的程序），并使用
execve()系统调用加载执行init程序。到此init()函数结束，内核的引导部分也到此结束了，</p>
<p>第二部分：运行init
</p>
<p>　　init的进程号是1，从这一点就能看出，init进程是系统所有进程的起点，Linux在完成核内引导以后，就开始运行init<a href="http://dev.yesky.com/" class="bluekey" target="_blank">程序</a>，。init程序需要读取配置文件/etc/inittab。inittab是一个不可执行的文本文件，它有若干行指令所组成。在Redhat系统中，inittab的内容如下所示(以&#8220;###"开始的中注释为笔者增加的)：</p>
<p>　　#<br />
# inittab&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This file describes how the INIT process should set up<br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the system in a certain run-level.<br />
#<br />
# Author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Miquel van Smoorenburg, &lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#105;&#113;&#117;&#101;&#108;&#115;&#64;&#100;&#114;&#105;&#110;&#107;&#101;&#108;&#46;&#110;&#108;&#46;&#109;&#117;&#103;&#110;&#101;&#116;&#46;&#111;&#114;&#103;">miquels@drinkel.nl.mugnet.org</a>&gt;<br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Modified for RHS Linux by Marc Ewing and Donnie Barnes<br />
#</p>
<p>　　# Default runlevel. The runlevels used by RHS are:<br />
#&nbsp;&nbsp; 0 - halt (Do NOT set initdefault to this)<br />
#&nbsp;&nbsp; 1 - Single user mode<br />
#&nbsp;&nbsp; 2 - Multiuser, without NFS (The same as 3, if you do not havenetworking)<br />
#&nbsp;&nbsp; 3 - Full multiuser mode<br />
#&nbsp;&nbsp; 4 - unused<br />
#&nbsp;&nbsp; 5 - X11<br />
#&nbsp;&nbsp; 6 - reboot (Do NOT set initdefault to this)<br />
#<br />
###表示当前缺省运行级别为5(initdefault)；<br />
id:5:initdefault:</p>
<p>　　###启动时自动执行/etc/rc.d/rc.sysinit脚本(sysinit)<br />
# System initialization.<br />
si::sysinit:/etc/rc.d/rc.sysinit</p>
<p>　　l0:0:wait:/etc/rc.d/rc 0<br />
l1:1:wait:/etc/rc.d/rc 1<br />
l2:2:wait:/etc/rc.d/rc 2<br />
l3:3:wait:/etc/rc.d/rc 3<br />
l4:4:wait:/etc/rc.d/rc 4<br />
###当运行级别为5时，以5为参数运行/etc/rc.d/rc脚本，init将等待其返回(wait)<br />
l5:5:wait:/etc/rc.d/rc 5<br />
l6:6:wait:/etc/rc.d/rc 6</p>
<p>　　###在启动过程中允许按CTRL-ALT-DELETE重启系统<br />
# Trap CTRL-ALT-DELETE<br />
ca::ctrlaltdel:/sbin/shutdown -t3 -r now</p>
<p>　　# When our UPS tells us power has failed, assume we have a few minutes<br />
# of power left.&nbsp; Schedule a shutdown for 2 minutes from now.<br />
# This does, of course, assume you have powerd installed and your<br />
# UPS connected and working correctly.<br />
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"</p>
<p>　　# If power was restored before the shutdown kicked in, cancel it.<br />
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"</p>
<p>　　###在2、3、4、5级别上以ttyX为参数执行/sbin/mingetty程序，打开ttyX终端用于用户登录，<br />
###如果进程退出则再次运行mingetty程序(respawn)<br />
# Run gettys in standard runlevels<br />
1:2345:respawn:/sbin/mingetty tty1<br />
2:2345:respawn:/sbin/mingetty tty2<br />
3:2345:respawn:/sbin/mingetty tty3<br />
4:2345:respawn:/sbin/mingetty tty4<br />
5:2345:respawn:/sbin/mingetty tty5<br />
6:2345:respawn:/sbin/mingetty tty6</p>
<p>　　###在5级别上运行xdm程序，提供xdm图形方式登录界面，并在退出时重新执行(respawn)<br />
# Run xdm in runlevel 5<br />
x:5:respawn:/etc/X11/prefdm -nodaemon</p>
<p>以上面的inittab文件为例，来说明一下inittab的格式。其中以#开始的行是注释行，除了注释行之外，每一行都有以下格式：
</p>
<p>　　id:runlevel:action:process</p>
<p>　　对上面各项的详细解释如下：</p>
<p>　　1. id</p>
<p>　　id是指入口标识符，它是一个字符串，对于getty或mingetty等其他login<a href="http://dev.yesky.com/" class="bluekey" target="_blank">程序</a>项，要求id与tty的编号相同，否则getty程序将不能正常工作。</p>
<p>　　2. runlevel</p>
<p>　　runlevel是init所处于的运行级别的标识，一般使用0－6以及S或s。0、1、6运行级别被系统保留：其中0作为shutdown动
作，1作为重启至单用户模式，6为重启；S和s意义相同，表示单用户模式，且无需inittab文件，因此也不在inittab中出现，实际上，进入单用
户模式时，init直接在控制台（/dev/console）上运行/sbin/sulogin。在一般的系统实现中，都使用了2、3、4、5几个级别，
在Redhat系统中，2表示无NFS支持的多用户模式，3表示完全多用户模式（也是最常用的级别），4保留给用户自定义，5表示XDM图形登录方式。
7－9级别也是可以使用的，传统的Unix系统没有定义这几个级别。runlevel可以是并列的多个值，以匹配多个运行级别，对大多数action来
说，仅当runlevel与当前运行级别匹配成功才会执行。</p>
<p>　　3. action</p>
<p>　　action是描述其后的process的运行方式的。action可取的值包括：initdefault、sysinit、boot、bootwait等：</p>
<p>　　initdefault是一个特殊的action值，用于标识缺省的启动级别；当init由核心激活以后，它将读取inittab中的
initdefault项，取得其中的runlevel，并作为当前的运行级别。如果没有inittab文件，或者其中没有initdefault
项，init将在控制台上请求输入runlevel。</p>
<p>　　sysinit、boot、bootwait等action将在系统启动时无条件运行，而忽略其中的runlevel。</p>
<p>　　其余的action（不含initdefault）都与某个runlevel相关。各个action的定义在inittab的man手册中有详细的描述。</p>
<p>　　4. process</p>
<p>　　process为具体的执行程序。程序后面可以带参数。</p>
<p>　　第三部分：系统初始化</p>
<p>　　在init的配置文件中有这么一行：</p>
<p>　　si::sysinit:/etc/rc.d/rc.sysinit</p>
<p>　　它调用执行了/etc/rc.d/rc.sysinit，而rc.sysinit是一个bash shell的脚本，它主要是完成一些系统初始化的工作，rc.sysinit是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有：激活交换分区，检查磁盘，加载<a href="http://diy.yesky.com/" class="bluekey" target="_blank">硬件</a>模块以及其它一些需要优先执行任务。</p>
<p>　　rc.sysinit约有850多行，但是每个单一的功能还是比较简单，而且带有注释，建议有兴趣的用户可以自行阅读自己机器上的该文件，以了解系统初始化所详细情况。由于此文件较长，所以不在本文中列出来，也不做具体的介绍。</p>
<p>　　当rc.sysinit程序执行完毕后，将返回init继续下一步。</p>
<p>第四部分：启动对应运行级别的守护进程
</p>
<p>　　在rc.sysinit执行后，将返回init继续其它的动作，通常接下来会执行到/etc/rc.d/rc<a href="http://dev.yesky.com/" class="bluekey" target="_blank">程序</a>。以运行级别3为例，init将执行配置文件inittab中的以下这行：</p>
<p>　　l5:5:wait:/etc/rc.d/rc 5</p>
<p>　　这一行表示以5为参数运行/etc/rc.d/rc，/etc/rc.d/rc是一个Shell脚本，它接受5作为参数，去执行/etc
/rc.d/rc5.d/目录下的所有的rc启动脚本，/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些链接文件，而不是真正的rc
启动脚本，真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。而这些rc启动脚本有着类似的用法，它们一般能接受start、
stop、restart、status等参数。</p>
<p>　　/etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的链接文件，对于以以S开头的启动脚本，将以start参数来运行。而如果
发现存在相应的脚本也存在K打头的链接，而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志)，则将首先以stop为参数停止
这些已经启动了的守护进程，然后再重新运行。这样做是为了保证是当init改变运行级别时，所有相关的守护进程都将重启。</p>
<p>　　至于在每个运行级中将运行哪些守护进程，用户可以通过chkconfig或setup中的"System Services"来自行设定。常见的守护进程有：</p>
<p>　　amd：自动安装NFS守护进程<br />
apmd:高级电源管理守护进程<br />
arpwatch：记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库<br />
autofs：自动安装管理进程automount，与NFS相关，依赖于NIS<br />
crond：Linux下的计划任务的守护进程<br />
named：DNS服务器<br />
netfs：安装NFS、Samba和NetWare<a href="http://product.yesky.com/net/" class="bluekey" target="_blank">网络</a>文件系统<br />
network：激活已配置网络接口的脚本程序<br />
nfs：打开NFS服务<br />
portmap：RPC portmap管理器，它管理基于RPC服务的连接<br />
sendmail：邮件服务器sendmail<br />
smb：Samba文件共享/<a href="http://product.yesky.com/catalog/821/" class="bluekey" target="_blank">打印</a>服务<br />
syslog：一个让系统引导时起动syslog和klogd系统日志守候进程的脚本<br />
xfs：X Window字型服务器，为本地和远程X服务器提供字型集<br />
Xinetd：支持多种网络服务的核心守护进程，可以管理wuftp、sshd、telnet等服务</p>
<p>　　这些守护进程也启动完成了，rc程序也就执行完了，然后又将返回init继续下一步。</p>
<p>第五部分：建立终端
</p>
<p>　　rc执行完毕后，返回init。这时基本系统环境已经设置好了，各种守护进程也已经启动了。init接下来会打开6个终端，以便用户登录系统。通过按Alt+Fn(n对应1-6)可以在这6个终端中切换。在inittab中的以下6行就是定义了6个终端：</p>
<p>　　1:2345:respawn:/sbin/mingetty tty1<br />
2:2345:respawn:/sbin/mingetty tty2<br />
3:2345:respawn:/sbin/mingetty tty3<br />
4:2345:respawn:/sbin/mingetty tty4<br />
5:2345:respawn:/sbin/mingetty tty5<br />
6:2345:respawn:/sbin/mingetty tty6</p>
<p>　　从上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty<a href="http://dev.yesky.com/" class="bluekey" target="_blank">程序</a>，mingetty程序能打开终端、设置模式。同时它会显示一个文本登录界面，这个界面就是我们经常看到的登录界面，在这个登录界面中会提示用户输入用户名，而用户输入的用户将作为参数传给login程序来验证用户的身份。</p>
<p>　　第六部分：登录系统，启动完成</p>
<p>　　对于运行级别为5的图形方式用户来说，他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入KDE、Gnome等窗口管理器。而本文主要讲的还是文本方式登录的情况：</p>
<p>　　当我们看到mingetty的登录界面时，我们就可以输入用户名和密码来登录系统了。<br />
<br />
Linux的账号验证程序是
login，login会接收mingetty传来的用户名作为用户名参数。然后login会对用户名进行分析：如果用户名不是root，且存在/etc
/nologin文件，login将输出nologin文件的内容，然后退出。这通常用来系统维护时防止非root用户登录。只有/etc
/securetty中登记了的终端才允许root用户登录，如果不存在这个文件，则root可以在任何终端上登录。/etc/usertty文件用于对
用户作出附加访问限制，如果不存在这个文件，则没有其他限制。</p>
<p>　　在分析完用户名后，login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置账户的其它信息，比如：主目录是什么、使用何种shell。如果没有指定主目录，将默认为根目录；如果没有指定shell，将默认为/bin/bash。</p>
<p>　　login程序成功后，会向对应的终端在输出最近一次登录的信息(在/var/log/lastlog中有记录)，并检查用户是否有新邮件(在
/usr/spool/mail/的对应用户名目录下)。然后开始设置各种环境变量：对于bash来说，系统首先寻找/etc/profile脚本文件，
并执行它；然后如果用户的主目录中存在.bash_profile文件，就执行它，在这些文件中又可能调用了其它配置文件，所有的配置文件执行后后，各种
环境变量也设好了，这时会出现大家熟悉的命令行提示符，到此整个启动过程就结束了。</p>
<p>　　希望通过上面对Linux启动过程的剖析能帮助那些想深入学习Linux用户建立一个相关Linux启动过程的清晰概念，进而可以进一步研究Linux接下来是如何工作的。</p>
<br />
<span class="g_ls">
<br />
</span>
<img src ="http://www.blogjava.net/sunxiaobo/aggbug/245593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2008-12-11 01:23 <a href="http://www.blogjava.net/sunxiaobo/archive/2008/12/11/245593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows&amp;Linux copy&amp;paste</title><link>http://www.blogjava.net/sunxiaobo/archive/2008/10/30/237671.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Thu, 30 Oct 2008 11:07:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2008/10/30/237671.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/237671.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2008/10/30/237671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/237671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/237671.html</trackback:ping><description><![CDATA[Linux : "highlighted" means "copy", "middle mouse" means "paste"<br />
<br />
To make Xming's clipboard work<br />
change /etc/init.d/custom.conf<br />
<br />
&nbsp;&nbsp;&nbsp; in [daemon]<strong style="color: black; background-color: rgb(153, 255, 153);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KillInitClients=false</strong><br />
<img src ="http://www.blogjava.net/sunxiaobo/aggbug/237671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2008-10-30 19:07 <a href="http://www.blogjava.net/sunxiaobo/archive/2008/10/30/237671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell技巧</title><link>http://www.blogjava.net/sunxiaobo/archive/2008/10/15/234513.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Wed, 15 Oct 2008 12:13:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2008/10/15/234513.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/234513.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2008/10/15/234513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/234513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/234513.html</trackback:ping><description><![CDATA[<span style="color: rgb(4, 0, 0);"><span style="color: rgb(6, 0, 0);"><font id="zoom" class="f14"><font color="#cccccc"><span style="color: rgb(60, 255, 32);"><br />
<font size="1"><br />
</font><font class="normalfont"><br />
1.test测试命令<br />
test命令用于检查某个条件是否成立，它可以进行数值、字符和文件三个方面的测试，<br />
其测试符和相应的功能分别如下：<br />
(1)数值测试：<br />
-eq：等于则为真<br />
-ne：不等于则为真<br />
-gt：大于则为真<br />
-ge：大于等于则为真<br />
-lt：小于则为真<br />
-le：小于等于则为真<br />
(2)字符串测试：<br />
=：等于则为真<br />
!=：不相等则为真<br />
-z 字符串：字符串长度伪则为真<br />
-n 字符串：字符串长度不伪则为真<br />
(3)文件测试：<br />
-e 文件名：如果文件存在则为真<br />
-r 文件名：如果文件存在且可读则为真<br />
-w 文件名：如果文件存在且可写则为真<br />
-x 文件名：如果文件存在且可执行则为真<br />
-s 文件名：如果文件存在且至少有一个字符则为真<br />
-d 文件名：如果文件存在且为目录则为真<br />
-f 文件名：如果文件存在且为普通文件则为真<br />
-c 文件名：如果文件存在且为字符型特殊文件则为真<br />
-b 文件名：如果文件存在且为块特殊文件则为真<br />
另外，Linux还提供了与(&#8220;！&#8221;)、或(&#8220;-o)、非(&#8220;-a&#8221;)三个逻辑操作符用于将测试条件连接起来，<br />
其优先级为：&#8220;！&#8221;最高，&#8220;-a&#8221;次之，&#8220;-o&#8221;最低。<br />
同时，bash也能完成简单的算术运算，格式如下：<br />
$[expression]<br />
例如：var1=2<br />
var2=$[var1*10+1]<br />
则：var2的值为21。<br />
<br />
2.if条件语句<br />
if [ -x /sbin/quotaon ]; then <br />
echo "Turning on Quota for root filesystem" <br />
/sbin/quotaon / <br />
elif [ -x /sbin/quotaon ]; then<br />
/usr/bin/bash<br />
else<br />
echo "ok"<br />
fi <br />
<br />
3.for 循环<br />
#!/bin/sh<br />
WORD="a b c d e f g h i j l m n o p q r s t u v w x y z"<br />
for i in $WORD ; do <br />
echo $i <br />
done <br />
<br />
#!/bin/sh <br />
FILES=`ls /txt/*.txt`<br />
for txt in $FILES ; do <br />
doc=`echo $txt | sed "s/.txt/.doc/"` <br />
mv $txt $doc <br />
done <br />
<br />
4.while和until 循环<br />
#!/bin/sh <br />
while [ -f /var/run/ppp0.pid ] ; do <br />
killall pppd<br />
done<br />
<br />
#!/bin/sh <br />
until [ -f /var/run/ppp0.pid ] ; do <br />
sleep 1 <br />
done<br />
<br />
Shell还提供了true和false两条命令用于建立无限循环结构的需要，<br />
它们的返回状态分别是总为0或总为非0<br />
<br />
5.case 条件选择<br />
#!/bin/sh <br />
case $1 in <br />
start | begin) <br />
echo "start something" <br />
;; <br />
stop | end) <br />
echo "stop something" <br />
;; <br />
*) <br />
echo "Ignorant" <br />
;; <br />
esac<br />
case表达式中也可以使用shell的通配符(&#8220;*&#8221;、&#8220;？&#8221;、&#8220;[ ]&#8221;)。<br />
<br />
6.无条件控制语句break和continue<br />
break 用于立即终止当前循环的执行，而contiune用于不执行循环中后面的语句<br />
而立即开始下一个循环的执行。这两个语句只有放在do和done之间才有效。<br />
<br />
7.函数定义<br />
在shell中还可以定义函数。函数实际上也是由若干条shell命令组成的，<br />
因此它与shell程序形式上是相似的，不同的是它不是一个单独的进程，<br />
而是shell程序的一部分。函数定义的基本格式为：<br />
functionname<br />
{<br />
若干命令行<br />
}<br />
调用函数的格式为：<br />
functionname param1 param2 &#8230;&#8230;<br />
shell函数可以完成某些例行的工作，而且还可以有自己的退出状态，<br />
因此函数也可以作为if、while等控制结构的条件。<br />
在函数定义时不用带参数说明，但在调用函数时可以带有参数，此时<br />
shell将把这些参数分别赋予相应的位置参数$1、$2、...及$*。<br />
<br />
8.命令分组<br />
在shell中有两种命令分组的方法：&#8220;()&#8221;和&#8220;{}&#8221;，前者当shell执行()<br />
中的命令时将再创建一个新的子进程，然后这个子进程去执行圆括弧中的命令。<br />
当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、<br />
当前工作目录等)的改变影响到下面语句的执行时，就应该把这些命令放在圆括<br />
弧中，这样就能保证所有的改变只对子进程产生影响，而父进程不受任何干扰；<br />
{}用于将顺序执行的命令的输出结果用于另一个命令的输入(管道方式)。当我们<br />
要真正使用圆括弧和花括弧时(如计算表达式的优先级)，则需要在其前面加上转<br />
义符(\)以便让shell知道它们不是用于命令执行的控制所用。<br />
<br />
9.信号<br />
trap命令用于在shell程序中捕捉到信号，之后可以有三种反应方式：<br />
(1)执行一段程序来处理这一信号<br />
(2)接受信号的默认操作<br />
(3)忽视这一信号<br />
trap对上面三种方式提供了三种基本形式：<br />
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时，<br />
将执行双引号中的命令串。<br />
trap 'commands' signal-list<br />
trap "commands" signal-list<br />
为了恢复信号的默认操作，使用第二种形式的trap命令：<br />
trap signal-list<br />
第三种形式的trap命令允许忽视信号：<br />
trap " " signal-list<br />
注意：<br />
(1)对信号11(段违例)不能捕捉，因为shell本身需要捕捉该信号去进行内存的转储。<br />
(2)在trap中可以定义对信号0的处理(实际上没有这个信号)，shell程序在其终止<br />
(如执行exit语句)时发出该信号。<br />
(3)在捕捉到signal-list中指定的信号并执行完相应的命令之后，如果这些命令没有将<br />
shell程序终止的话，shell程序将继续执行收到信号时所执行的命令后面的命令，这样<br />
将很容易导致shell程序无法终止。<br />
另外，在trap语句中，单引号和双引号是不同的，当shell程序第一次碰到trap语句时，<br />
将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话，那么shell<br />
不会对commands中的变量和命令进行替换，否则commands中的变量和命令将用当时具体<br />
的值来替换。<br />
<br />
10. 运行shell程序的方法<br />
执行shell程序的方法有三种：<br />
(1)sh shell程序文件名<br />
格式为：<br />
bash shell 程序文件名<br />
这实际上是调用一个新的bash命令解释程序，而把shell程序文件名作为参数传递给它。<br />
新启动的shell将去读指定的文件，执行文件中列出的命令，当所有的命令都执行完结束。<br />
该方法的优点是可以利用shell调试功能。<br />
(2)sh&lt;shell程序文件名<br />
格式为：<br />
bash&lt;shell 程序文件名<br />
这种方式就是利用输入重定向，使shell命令解释程序的输入取自指定的程序文件。<br />
(3)用chmod命令使shell程序成为可执行的<br />
<br />
11. bash程序的调试<br />
bash -选择项 shell程序文件名<br />
几个常用的选择项是：<br />
-e：如果一个命令失败就立即退出<br />
-n：读入命令但是不执行它们<br />
-u：置换时把未设置的变量看作出错<br />
-v：当读入shell输入行时把它们显示出来<br />
-x：执行命令时把命令和它们的参数显示出来<br />
上面的所有选项也可以在shell程序内部用&#8220;set -选择项&#8221;的形式引用，而&#8220;set +选择项&#8221;则<br />
将禁止该选择项起作用。如果只想对程序的某一部分使用某些选择项时，则可以将该部分用<br />
上面两个语句包围起来。<br />
1.未置变量退出和立即退出<br />
未置变量退出特性允许用户对所有变量进行检查，如果引用了一个未赋值的变量就终止shell<br />
程序的执行。shell通常允许未置变量的使用，在这种情况下，变量的值为空。如果设置了未<br />
置变量退出选择项，则一旦使用了未置变量就显示错误信息，并终止程序的运行。未置变量退<br />
出选择项为&#8220;-u&#8221;。<br />
当shell运行时，若遇到不存在或不可执行的命令、重定向失败或命令非正常结束等情况时，如<br />
果未经重新定向，该出错信息会打印在终端屏幕上，而shell程序仍将继续执行。要想在错误发<br />
生时迫使shell程序立即结束，可以使用&#8220;-e&#8221;选项将shell程序的执行立即终止。<br />
2.shell程序的跟踪<br />
调试shell程序的主要方法是利用shell命令解释程序的&#8220;-v&#8221;或&#8220;-x&#8221;选项来跟踪程序的执行。&#8220;-v&#8221;<br />
选择项使shell在执行程序的过程中，把它读入的每一个命令行都显示出来，而&#8220;-x&#8221;选择项使shell<br />
在执行程序的过程中把它执行的每一个命令在行首用一个&#8220;+&#8221;加上命令名显示出来。并把每一个变量<br />
和该变量所取的值也显示出来，因此，它们的主要区别在于：在执行命令行之前无&#8220;-v&#8221;则打印出命<br />
令行的原始内容，而有&#8220;-v&#8221;则打印出经过替换后的命令行的内容。<br />
除了使用shell的&#8220;-v&#8221;和&#8220;-x&#8221;选择项以外，还可以在shell程序内部采取一些辅助调试的措施。<br />
例如，可以在shell程序的一些关键地方使用echo命令把必要的信息显示出来，它的作用相当于C语<br />
言中的printf语句，这样就可以知道程序运行到什么地方及程序目前的状态。<br />
<br />
12. bash的内部命令<br />
bash命令解释程序包含了一些内部命令。内部命令在目录列表时是看不见的，它们由shell本身提供。<br />
常用的内部命令有：echo、eval、exec、export、readonly、read、shift、wait和点(.)。<br />
下面简单介绍其命令格式和功能。<br />
1.echo<br />
命令格式：echo arg<br />
功能：在屏幕上打印出由arg指定的字符串。<br />
2.eval<br />
命令格式：eval args<br />
功能：当shell程序执行到eval语句时，shell读入参数args，并将它们组合成一个新的命令，然后<br />
执行。<br />
3.exec<br />
命令格式：exec 命令 命令参数<br />
功能：当shell执行到exec语句时，不会去创建新的子进程，而是转去执行指定的命令，<br />
当指定的命令执行完时，该进程，也就是最初的shell就终止了，所以shell程序中exec<br />
后面的语句将不再被执行。<br />
4.export<br />
命令格式：export 变量名 或：export 变量名=变量值<br />
功能：shell可以用export把它的变量向下带入子shell从而让子进程继承父进程中的环境变量。<br />
但子shell不能用export把它的变量向上带入父shell。<br />
注意：不带任何变量名的export语句将显示出当前所有的export变量。<br />
5.readonly<br />
命令格式：readonly 变量名<br />
功能：将一个用户定义的shell变量标识为不可变的。不带任何参数的readonly命令将显示出<br />
所有只读的shell变量。<br />
6.read<br />
命令格式：<br />
read变量名表<br />
功能：从标准输入设备读入一行，分解成若干字，赋值给shell程序内部定义的变量。<br />
7.shift语句<br />
功能：shift语句按如下方式重新命名所有的位置参数变量：$2成为$1，$3成为$2&#8230;&#8230;在程序中<br />
每使用一次shift语句，都使所有的位置参数依次向左移动一个位置，并使位置参数&#8220;$#&#8221;减一，<br />
直到减到0。<br />
8.wait<br />
功能：是shell等待在后台启动的所有子进程结束。Wait的返回值总是真。<br />
9.exit<br />
功能：退出shell程序。在exit之后可有选择地指定一个数字作为返回状态。<br />
10.&#8220;.&#8221;(点)<br />
命令格式：. Shell程序文件名<br />
功能：使shell读入指定的shell程序文件并依次执行文件中的所有语句。<br />
<br />
13. 特殊参数：<br />
1. $*: 代表所有参数，其间隔为IFS内定参数的第一个字元 <br />
2. $@: 与*星号类同。不同之处在於不参照IFS<br />
3. $#: 代表参数数量<br />
4. $?: 执行上一个指令的返回值<br />
5. $-: 最近执行的foreground pipeline的选项参数<br />
6. $$: 本身的Process ID<br />
7. $!: 执行上一个背景指令的PID<br />
8. $_: 显示出最後一个执行的命令</font></span><font class="normalfont"></font></font></font>
</span></span>
<img src ="http://www.blogjava.net/sunxiaobo/aggbug/234513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2008-10-15 20:13 <a href="http://www.blogjava.net/sunxiaobo/archive/2008/10/15/234513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>umlenkung &gt;&gt; , 2&gt;</title><link>http://www.blogjava.net/sunxiaobo/archive/2008/10/09/233461.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Thu, 09 Oct 2008 15:06:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2008/10/09/233461.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/233461.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2008/10/09/233461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/233461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/233461.html</trackback:ping><description><![CDATA[<table border="0" cellpadding="2" cellspacing="2" height="60" width="1">
</table>
umlenkung &gt;&gt; , 2&gt;
<img src ="http://www.blogjava.net/sunxiaobo/aggbug/233461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2008-10-09 23:06 <a href="http://www.blogjava.net/sunxiaobo/archive/2008/10/09/233461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux kernel  version 	 &gt;uname -r</title><link>http://www.blogjava.net/sunxiaobo/archive/2008/10/09/233460.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Thu, 09 Oct 2008 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2008/10/09/233460.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/233460.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2008/10/09/233460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/233460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/233460.html</trackback:ping><description><![CDATA[linux kernel&nbsp; version<br />
&nbsp;uname -r
<img src ="http://www.blogjava.net/sunxiaobo/aggbug/233460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2008-10-09 23:04 <a href="http://www.blogjava.net/sunxiaobo/archive/2008/10/09/233460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cd</title><link>http://www.blogjava.net/sunxiaobo/archive/2008/10/09/233458.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Thu, 09 Oct 2008 14:28:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2008/10/09/233458.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/233458.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2008/10/09/233458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/233458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/233458.html</trackback:ping><description><![CDATA[<em>cd</em> ~ : go to your  home <em>directory <br />
cd</em> - : go to the <em>last directory</em> you were in <em><br />
cd</em> .. : go up a <em>directory</em>
<img src ="http://www.blogjava.net/sunxiaobo/aggbug/233458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2008-10-09 22:28 <a href="http://www.blogjava.net/sunxiaobo/archive/2008/10/09/233458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>umask</title><link>http://www.blogjava.net/sunxiaobo/archive/2008/08/08/220961.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Fri, 08 Aug 2008 10:41:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2008/08/08/220961.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/220961.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2008/08/08/220961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/220961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/220961.html</trackback:ping><description><![CDATA[1) 文件的最大权限rwx rwx rwx (777)<br />
2 ) u m a s k值为0 2 2 - - - -w- -w-<br />
3) 目录权限rwx r-x r-x (755) 这就是目录创建缺省权限<br />
4) 文件权限rw- r-- r-- (644) 这就是文件创建缺省权限
<img src ="http://www.blogjava.net/sunxiaobo/aggbug/220961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2008-08-08 18:41 <a href="http://www.blogjava.net/sunxiaobo/archive/2008/08/08/220961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Vim cut, copy and paste</title><link>http://www.blogjava.net/sunxiaobo/archive/2008/07/11/214284.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Fri, 11 Jul 2008 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2008/07/11/214284.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/214284.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2008/07/11/214284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/214284.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/214284.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/sunxiaobo/aggbug/214284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2008-07-11 15:53 <a href="http://www.blogjava.net/sunxiaobo/archive/2008/07/11/214284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VM shared folder</title><link>http://www.blogjava.net/sunxiaobo/archive/2008/05/18/201268.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Sun, 18 May 2008 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2008/05/18/201268.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/201268.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2008/05/18/201268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/201268.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/201268.html</trackback:ping><description><![CDATA[Shared Folders是Vmware4
的一个新功能，更加方便了在Host，Guest操作系统间共享文件。它是把Host机器上的一个目录共享给Guest机器使用。点击Edit-
&gt;;Virtual machine settigns-&gt;;Option-&gt;;Shared
Folders-&gt;;Add，选定要共享的文件夹并给这个文件夹命名，下一步。选定&#8220;Enable this
share&#8221;，还有只读和重启后失效的选项，根据需要选择。 <br />
确定以后，vmware会把这个文件夹自动mount到/mnt/hgfs目录下
<img src ="http://www.blogjava.net/sunxiaobo/aggbug/201268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2008-05-18 17:10 <a href="http://www.blogjava.net/sunxiaobo/archive/2008/05/18/201268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fstab</title><link>http://www.blogjava.net/sunxiaobo/archive/2008/01/09/174045.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Wed, 09 Jan 2008 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2008/01/09/174045.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/174045.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2008/01/09/174045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/174045.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/174045.html</trackback:ping><description><![CDATA[During the <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/boot.html">boot process</a>, file systems listed in <tt class="FILENAME">/etc/fstab</tt> are automatically mounted (unless they are listed with
the <code class="OPTION">noauto</code> option).<br />
<pre class="PROGRAMLISTING"><tt class="REPLACEABLE"><em>device</em></tt>       <tt class="REPLACEABLE"><em>/mount-point</em></tt> <tt class="REPLACEABLE"><em>fstype</em></tt>     <tt class="REPLACEABLE"><em>options</em></tt>      <tt class="REPLACEABLE"><em>dumpfreq</em></tt>     <tt class="REPLACEABLE"><em>passno</em></tt>
</pre>
<div class="VARIABLELIST">
<dl><dt><tt class="LITERAL">device</tt></dt><dd>
<p>A device name (which should exist), as explained in <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/disks-naming.html">Section 18.2</a>.</p>
</dd><dt><tt class="LITERAL">mount-point</tt></dt><dd>
<p>A directory (which should exist), on which to mount the file system.</p>
</dd><dt><tt class="LITERAL">fstype</tt></dt><dd>
<p>The file system type to pass to <a href="http://www.freebsd.org/cgi/man.cgi?query=mount&amp;sektion=8"><span class="CITEREFENTRY"><span class="REFENTRYTITLE">mount</span>(8)</span></a>. The default
FreeBSD file system is <tt class="LITERAL">ufs</tt>.</p>
</dd><dt><tt class="LITERAL">options</tt></dt><dd>
<p>Either <code class="OPTION">rw</code> for read-write file systems, or <code class="OPTION">ro</code> for read-only file systems, followed by any other options that
may be needed. A common option is <code class="OPTION">noauto</code> for file systems not
normally mounted during the boot sequence. Other options are listed in the <a href="http://www.freebsd.org/cgi/man.cgi?query=mount&amp;sektion=8"><span class="CITEREFENTRY"><span class="REFENTRYTITLE">mount</span>(8)</span></a> manual
page.</p>
</dd><dt><tt class="LITERAL">dumpfreq</tt></dt><dd>
<p>This is used by <a href="http://www.freebsd.org/cgi/man.cgi?query=dump&amp;sektion=8"><span class="CITEREFENTRY"><span class="REFENTRYTITLE">dump</span>(8)</span></a> to determine
which file systems require dumping. If the field is missing, a value of zero is
assumed.</p>
</dd><dt><tt class="LITERAL">passno</tt></dt><dd>
<p>This determines the order in which file systems should be checked. File systems that
should be skipped should have their <tt class="LITERAL">passno</tt> set to zero. The root
file system (which needs to be checked before everything else) should have its <tt class="LITERAL">passno</tt> set to one, and other file systems' <tt class="LITERAL">passno</tt> should be set to values greater than one. If more than one
file systems have the same <tt class="LITERAL">passno</tt> then <a href="http://www.freebsd.org/cgi/man.cgi?query=fsck&amp;sektion=8"><span class="CITEREFENTRY"><span class="REFENTRYTITLE">fsck</span>(8)</span></a> will attempt
to check file systems in parallel if possible.</p>
</dd></dl>
</div>
<p>Consult the <a href="http://www.freebsd.org/cgi/man.cgi?query=fstab&amp;sektion=5"><span class="CITEREFENTRY"><span class="REFENTRYTITLE">fstab</span>(5)</span></a> manual page
for more information on the format of the <tt class="FILENAME">/etc/fstab</tt> file and
the options it contains.</p>
<div class="SECT2">
<h2 class="SECT2"><a id="DISKS-MOUNT" name="DISKS-MOUNT">3.6.2 The <tt class="COMMAND">mount</tt> Command</a></h2>
<p>The <a href="http://www.freebsd.org/cgi/man.cgi?query=mount&amp;sektion=8"><span class="CITEREFENTRY"><span class="REFENTRYTITLE">mount</span>(8)</span></a> command is
what is ultimately used to mount file systems.</p>
<p>In its most basic form, you use:</p>
<div class="INFORMALEXAMPLE"><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" id="AEN4506" name="AEN4506"></a>
<pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">mount <tt class="REPLACEABLE"><em>device</em></tt> <tt class="REPLACEABLE"><em>mountpoint</em></tt></kbd>
</pre>
</div>
<p>There are plenty of options, as mentioned in the <a href="http://www.freebsd.org/cgi/man.cgi?query=mount&amp;sektion=8"><span class="CITEREFENTRY"><span class="REFENTRYTITLE">mount</span>(8)</span></a> manual page,
but the most common are:</p>
<div class="VARIABLELIST">
<p><strong>Mount Options</strong></p>
<dl><dt><code class="OPTION">-a</code></dt><dd>
<p>Mount all the file systems listed in <tt class="FILENAME">/etc/fstab</tt>. Except
those marked as &#8220;noauto&#8221;, excluded by the <code class="OPTION">-t</code>
flag, or those that are already mounted.</p>
</dd><dt><code class="OPTION">-d</code></dt><dd>
<p>Do everything except for the actual mount system call. This option is useful in
conjunction with the <code class="OPTION">-v</code> flag to determine what <a href="http://www.freebsd.org/cgi/man.cgi?query=mount&amp;sektion=8"><span class="CITEREFENTRY"><span class="REFENTRYTITLE">mount</span>(8)</span></a> is actually
trying to do.</p>
</dd><dt><code class="OPTION">-f</code></dt><dd>
<p>Force the mount of an unclean file system (dangerous), or forces the revocation of
write access when downgrading a file system's mount status from read-write to
read-only.</p>
</dd><dt><code class="OPTION">-r</code></dt><dd>
<p>Mount the file system read-only. This is identical to using the <code class="OPTION">ro</code> (<code class="OPTION">rdonly</code> for FreeBSD versions older
than 5.2) argument to the <code class="OPTION">-o</code> option.</p>
</dd><dt><code class="OPTION">-t</code> <tt class="REPLACEABLE"><em>fstype</em></tt></dt><dd>
<p>Mount the given file system as the given file system type, or mount only file systems
of the given type, if given the <code class="OPTION">-a</code> option.</p>
<p>&#8220;ufs&#8221; is the default file system type.</p>
</dd><dt><code class="OPTION">-u</code></dt><dd>
<p>Update mount options on the file system.</p>
</dd><dt><code class="OPTION">-v</code></dt><dd>
<p>Be verbose.</p>
</dd><dt><code class="OPTION">-w</code></dt><dd>
<p>Mount the file system read-write.</p>
</dd></dl>
</div>
<p>The <code class="OPTION">-o</code> option takes a comma-separated list of the options,
including the following:</p>
<div class="VARIABLELIST">
<dl><dt>noexec</dt><dd>
<p>Do not allow execution of binaries on this file system. This is also a useful security
option.</p>
</dd><dt>nosuid</dt><dd>
<p>Do not interpret setuid or setgid flags on the file system. This is also a useful
security option.</p>
</dd></dl>
</div>
</div>
<code class="OPTION"></code><br />
<img src ="http://www.blogjava.net/sunxiaobo/aggbug/174045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2008-01-09 16:16 <a href="http://www.blogjava.net/sunxiaobo/archive/2008/01/09/174045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>