|
楼主 |
发表于 2005-5-19 21:44:54
|
显示全部楼层
##下面的四行若没有mark,则每次开机issue及motd都会被改变,这应该
## 可算是 FAQ 级的问题了 ...... 因为我有自己设计的 issue 及 motd , 所以
## 下面的四行前面都有 # , 被注释掉 .
## 假如你要有自己的设定 , 下面一定都要 mark 起来
#echo > /etc/issue
#echo Welcome to Linux /bin/uname -a | /bin/cut -d -f3. >> /etc/issue
#echo >> /etc/issue
#echo "/bin/uname -a | /bin/cut -d -f1,3. (Posix)." > /etc/motd
?
## 接下来 , 将执行 rc.serial , 顾名思义 , rc.serial 是作串口设定的工作
## 在 rc.serial 中 , 内容虽然也是很简单 , 但并不像 rc.S 那样直接 . 换句话
## 说 , 读者至少要 " 稍微 " 懂一点 shell programming , 所以说呢 , 假如
## 还不会 shell programming 的读者呢 , 都应该赶快去找一本书来看一下 , 在
## 这篇文章的结尾 , 我会提出一些书单 , 各位可以去找找这几本书 ......
/bin/sh /etc/rc.d/rc.serial
echo '================= rc.S is finish NOW !!! ========================='
?
?
到了这里 , rc.S 的最後一步 , 是去执行 rc.serial . 大家可以看一看
/rc.d/rc.serial . 好像很长的样子 , 但实际上呢 , 各位必然发现到了 , 这个
shell script 大部份指令的前面都有一个 '#' 号 , 这代表着 , 这些指令完全
不会被执行 . 所以呢 , 真正有用的只不过寥寥十几行吧 ! 在另一方面来说 ,
假如你是用网卡连上网络 , 那 rc.serial 对你并没有什么大用处 .
?
**************************** rc.serial ******************************
#!/bin/sh
#
# /etc/rc.serial
# Initializes the serial ports on your system
#
# Version 2.01
echo '======================= rc.serial is begin !!! ====================='
cd /dev
## 下面三行中的前两行是设定一些变量 , 由于在这个 shell script 中 , 需要
## 用到 /bin/setserial -b 这个指令 , 或是需要用到所有以 cua 开头的 node
## 的次数太多了 , 因此 , 把它们设定为一个变量 , 是一个不错的方法 . 尤其
## PORTS=`echo cua? cua??` 这是一个聪明的写法 , 那为什么不写成 PORT=
## `echo cua*` 呢 ? 各位可以在 /dev 下分别使用这两个指令 , 观察输出到底
## 有什么不同 ......
SETSERIAL="/bin/setserial -b"
PORTS=`echo cua? cua??`
echo -n "Configuring serial ports...."
?
## 下面这行 , 没有学过 shell programming 的人很可能会看不懂 , 不过没有
## 关系 , 这行中的 ${SETSERIAL} 会被换成 /bin/setserial -b , 而 ${PORTS}
## 会被换成 cua0 cua1 cua2 ....... cua31 , 所以整句翻译就是 :
## /bin/setserial -b -W cua0 cua1 cua2 cua3 cua4 cua5 cua6 ...... cua31
## 那这行指令到底在做什么呢 ? 其实只是在做中断侦测的工作 .
${SETSERIAL} -W ${PORTS}
?
## 各位看到下面原来的注释了吧 . 当你有一些特殊的卡时 , 你可以把相对应部
## 份前面的 '#' 去掉 , 以便能做自动设定的工作 . 其实呢 , 这种情况实在
## 不多 , 大部份人的设备都差不了多少 , 说到关于串口 , 差异就更少了 .
#
# AUTOMATIC CONFIGURATION
#
# Uncomment the appropriate lines below to enable auto-configuration
# of a particular board. Or comment them out to disable them....
#
?
## 好了 , 这下我们又多了一个变量 : AUTO_IRQ , 这在下面会用到 .
AUTO_IRQ=auto_irq
?
## 下面几行非常整齐 , 它们可以分别被换成 :
## /bin/setserial -b /dev/cua? auto_irq skip_test autoconfig
## setserial 说穿了也没什么 , 这个指令可以让你对 serial port 做设定及回报
## 的动作 , 像 IRQ , I/O port 啦等等的事情 . 一般的情况下 , 大家的电脑中
## 通常只有 COM1-COM4 , 但假如你想增加新的 port , 那 setserial 就派上用
## 场了 .
# These are the standard COM1 through COM4 devices
#
# If you have an internal modeme with a Rockwell Chipset, add a "skip_test"
# to the /dev/cua3 line below. (It's not added by default because it will
# screw up people with 8514 displays).
#
${SETSERIAL} /dev/cua0 ${AUTO_IRQ} skip_test autoconfig
${SETSERIAL} /dev/cua1 ${AUTO_IRQ} skip_test autoconfig
${SETSERIAL} /dev/cua2 ${AUTO_IRQ} skip_test autoconfig
${SETSERIAL} /dev/cua3 ${AUTO_IRQ} autoconfig
# These are for the first AST Fourport board (base address 0x1A0)
#
${SETSERIAL} /dev/cua4 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua5 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua6 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua7 ${AUTO_IRQ} autoconfig
# These are for the second AST Fourport board (base address 0x2A0)
#
${SETSERIAL} /dev/cua8 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua9 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua10 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua11 ${AUTO_IRQ} autoconfig
?
## 从这里以下 , 我省略了一大段 , 因为这一大段都是支持特殊的卡
# These are the 3rd and 4th ports on the Accent Async board.
#
#${SETSERIAL} /dev/cua12 ${AUTO_IRQ} autoconfig
#${SETSERIAL} /dev/cua13 ${AUTO_IRQ} autoconfig
#
?
.
.
.
.
.
.
.
?
## 好了 , 我们跳掉了一大段 , 直到这里 . 各位看到下面的注解了 .
## 假如你想用手动的方法指定 IRQ , I/O port , 及指定 chip 的型号
## 那你可以拿掉下面对应那行前面的 '#' 并作适当的修改 , 比如说
## 你用的是比较新的 16550 或 16550A , 而不是 16450 , 那你就可以
## 在下面用手动的方法指定 . 实际上 , 用 autoconfig 及 autoirq
## 的选项就可以了 , 没有必要用手动的方式 . 除非侦测不到 .
###############################################################
#
# MANUAL CONFIGURATION
#
# If you want to do manual configuration of one or more of your
# serial ports, uncomment and modify the relevant lines.
#
###############################################################
# These are the standard COM1 through COM4 devices
#
#${SETSERIAL} /dev/cua0 uart 16450 port 0x3F8 irq 4
#${SETSERIAL} /dev/cua1 uart 16450 port 0x2F8 irq 3
#${SETSERIAL} /dev/cua2 uart 16450 port 0x3E8 irq 4
#${SETSERIAL} /dev/cua3 uart 16450 port 0x2E8 irq 3
.
.
.
.
.
.
.
.
## Ok , 到此 , rc.S 及 rc.serial 已经结束 , 因为截稿时间的关系 , rc.M
## rc.inet1 , rc.inet2 , rc.font , rc.local 将在以后为各位介绍 .
echo "done."
${SETSERIAL} -bg ${PORTS}
echo ' ====================== rc.serial is complete !!! ==================='
?
?
* 关于 Shell Programming 的书单 :
Title: The Unix C Shell Field Guide
Authors: Gail Anderson and Paul Anderson
Publisher: Prentice Hall
Edition: 1986
ISBN: 0-13-937468-X
这本是 C-Shell 的 Bible , 想学 C-Shell 的人 , 可以去看这本书 .
?
Title: Unix Shell Programming
Authors: Stephen Kochan and Patrick Wood
Publisher: Hayden
Edition: 1990
ISBN: 0-672-48448-X
喔 ! 这本书以 Bourne Shell 为主 , 内容深入浅出 , 读者很容易就可以了解
这本书的内容 , 进而掌握 Bourne Shell 的精髓 . 此外 , 这本书也有提到
Korn Shell , 大体上来说 , 是一本值得看的好书 .
?
*如何联系作者 :
E-Mail Address : jhhsu@csie.nctu.edu.tw
u8217017@cc.nctu.edu.tw
Dormitory : 交通大学十舍 317R
..
?
?
Linux 开机程序之研讨
CCCA 资工86 许景华
在上次的介绍中 , 我们已经看完了 rc.S 及 rc.serial 这两个 shell script .
现在 , 我们将把剩下的 shell script 再作一个介绍 .
首先还是看看全部的流程 :
?
init[1]
rc.S begin
rc.serial begin
rc.serial end
rc.S end <-- 上一次我们说明到这里
init[1] enter runlevel 5
rc.M begin
rc.inet1 begin
rc.inet1 end
rc.inet2 begin
rc.inet2 end
rc.font begin
rc.font end
rc.local begin
rc.local end
rc.M end
login
?
这次主要的部份可分为两项 : 因为 init 将会去读取 inittab , 所以 inittab
将被列为第一部份的重点 , 而第二部份就是 rc.M , rc.font , rc.local
这几个 shell script 的说明 . ( rc.inet1 , rc.inet2 这两个关于网络的
shell script 将在以后单独说明
好了 , 我们先从 inittab 看起吧 ! 看看上面的流程 , 在第一行 : init[1]
也就是 init 这个 process 被启动之后 , 它会去读取 /etc/inittab 这个文件
以完成系统的启动 . 从这里 , 我们看到了 LINUX 的确融合了 SVR4 及 SunOS
的一些特性 , inittab 这个文件 , 在 SunOS 系统中是不存在的 , 但是它却是
SVR4 典型的文件 . init 这个 process 会依据 /etc/inittab 中所记载的内容
进入不同的 run-level 并启动不同的 process . 所以 inittab 的重要性
可见一斑 . 那什么叫 run-level 呢 ? 所谓 run-level 就是系统中定义了许多
不同的 level , 而系统会随著 level 的不同而去启动不同的资源 .
现在就让我们来看一下 /etc/inittab 中的内容 :
在 /etc/inittab 这个文件中 , 每一列是一个进入点 , 假如我们仔细观察每一列
的话 , 那我们就会很容易的发现 , /etc/inittab 的每一列可以被 " : " 这个
字符分成好几个栏位 . 这几个栏位的格式如下 :
id:runlevels:action:process
而它们代表的意义分别如下 :
id : 由两个独特的字符所组成的辨示符号 , 在比较新的 UNIX 系统中 , 已不
受只能有两个字符的限制 .
runlevels : 指出下面一个栏位中的 action 以及 下下个栏位中的 process
会在那些 runlevel 中被执行 . 这一栏的合法值有 0,1,2...6
s 以及 S . 而在正常的启动程序之后 , Superuser 可以使用
telinit 这个指令来改变系统的 runlevel . 又因为在 LINUX 中
, runlevel 的预设值是 5 ( 等一下就会看到 所以 , 只有
那些每一列中 runlevel 那栏有 5 这个值的 , 后面的 process
才会被启动 . 所以 , 我们就可以想像的到 : " 由于系统的
runlevel 不同 , 所起动的 process 也不尽相同 , 所以系统
起动的资源在每个不同的 runlevel 就会有差异存在 .
action : 这个栏位有一点复杂 , 在这个栏位中记录着 init 在启动相对应的
process 时 , 对 process 所采取的动作 , 而合法的动作有下面几项:
initdefault : 指出系统在启动时 , 预设进入的 run-level 值 ,
比如说 , 我们可以在 /etc/inittab 中找到下面这
一列 : id:3:initdefault:
很明显的 , 系统将在启动时 , 进入 runlevel 为 3
的模式 . 当然 , 你可以把 3 改成 4 试试看 , 如
果你改成了 4 , 那将会执行 /etc/rc.d/rc.4 , 也
就是 run xdm . xdm 在以后有机会的话 , 将为各
位介绍 ......
sysinit : 在系统起动时 , 这个 process 会被执行 . 而所有 process
前的 action 中有 boot 及 bootwait 的 process , 必
须等到这些 action 为 sysinit 的 process 执行完之后
它们才能够执行 .
wait : 在起动一个 process 之后 , 若要再起动另一个 process , 则
必需等到这个 process 结束之后才能继续 .
respawn : 代表这个 process 即使在结束之后 , 也会重新被启动 ,
最典型的例子就是 getty ( 在 LINUX 中为 agetty .
看看下面的循环 :
-- getty --> login --> shell --> logout --
^ |??????????????????????????????????????? |
? |<---------------------------------------|
即使在 getty 结束之后 , 它也会重新被启动 .
ctrlaltdel : 想必有人会以键盘上的 Ctrl , Alt , 及 Del 这三个
键来达到使系统 shutdown 的目的 , 现在我们果然在
/etc/inittab 中看到了这一列 :
ca::ctrlaltdel:/sbin/shutdown -t3 -rf now
所以说 , 当我们按下这三个键的时候 , init 会收到
SIGINT 这个 signal , 接着就执行 shutdown 的动作
不过 , 我们最好不要养成按 Ctrl-Alt-Del 来使系统
shutdown 的习惯 , 尤其在单用户多任务的操作系统 , 像
OS/2 , 甚至 Windows 95 , shutdown 几乎都是标准
的关机程序了 , 更何况是多用户多任务的 LINUX , 所以 ,
shutdown 这个指令是一定要熟悉的 .
除了上面的几个 action 之外 , 另外还有一些合法的 action , 但这
些 action 并不需要太注意 , 要用的时候再利用 man init 去查询就
可以了 .
process : 这一栏中可以是 shell script 或是可执行的程序 .
好了 , 当我们了解 /etc/inittab 中每一栏的意义之后 , 要看懂 /etc/inittab
就是一件轻松愉快的工作了 . 在 /etc/inittab 档中 , 我们可以看到下面这一段
c1:12345:respawn:/sbin/agetty 38400 tty1
c2:12345:respawn:/sbin/agetty 38400 tty2
c3:45:respawn:/sbin/agetty 38400 tty3
c4:45:respawn:/sbin/agetty 38400 tty4
c5:45:respawn:/sbin/agetty 38400 tty5
c6:456:respawn:/sbin/agetty 38400 tty6 |
|