ITPub博客

首页 > Linux操作系统 > Linux操作系统 > slackware启动脚本详解(转)

slackware启动脚本详解(转)

原创 Linux操作系统 作者:ilg 时间:2019-05-27 21:36:06 0 删除 编辑
slackware启动脚本详解(转)

  我们知道,kernel成功启动之后,在init/main.c中调用execve执行程序/sbin/init。init进程被称为初始化进程,因为它负责系统的启动。

  我以我的slackware10为例(不光因为它是我用的套件,而且启动脚本十分清晰明了),讲一讲启动的具体过程:

  (史前时期)loadlin,grub,lilo把内核参数传给kernel,如(BOOT_IMAGE=Linux ro root=307),,存储在/proc/cmdline中。

  内核启动成功后,把它的参数传给1号进程(init),因为也许有一些参数应被用户程序解释。

  init进程将从上到下的读取/etc/inittab文件,只要状态符合当前运行级就会去执行脚本。

  inittab由几行组成,每行被三个冒号分隔成四个部分,每个部分具有不同的含义。格式如下:

  行标识符:状态:动作:命令

  行标识符是你的运行级脚本的名字,不能使用重复的行标识符。

  状态是表示运行级脚本何时应该执行的数字。状态由0,1,2,3,4,5,6和S一个或多个数字字母组成。如果状态为空,就是系统启动必须执行的脚本。

  下面是slackware的状态定义:

  0 = halt

  1 = single user mode

  2 = unused (but configured the same as runlevel 3)

  3 = multiuser mode (default Slackware runlevel)

  4 = X11 with KDM/GDM/XDM (session managers)

  5 = unused (but configured the same as runlevel 3)

  6 = reboot

  S同状态1相同。

  动作有once, wait, respawn, sysinit, crtlaltdel, initdefault组成,说明了init执行脚本的方式。

  once:init在进入后只执行一次。init不等待命令的结束。

  wait:和once不同的是,init等待命令的结束。

  respawn:命令结束后会被重起。

  sysinit:init最先执行的运行级脚本,状态被忽略。说穿了就是无论何是都优先执行的脚本,应指向系统初始化脚本。

  ctrlaltdel:当“三指禅”被按下时,该运行级被启动,一般是指向重启脚本。

  initdefault:指定系统启动时的缺省运行级。在sysinit后执行。

  对于slackware的inittab:

  id:3:initdefault:

  id指出缺省为多用户字符界面(3),不要把它设置成0或6!注意没有命令。

  si:S:sysinit:/etc/rc.d/rc.S

  si指出系统初始化运行级,其中S等同于状态1,它指向/etc/rc.d/rc.S,也就是说init第一个去执行的shell脚本。

  rc:2345:wait:/etc/rc.d/rc.M

  rc指出多用户启动运行级,当状态为2,3,4,5时被执行,init等待命令的结束,这也是为什么启动时没有shell可用的原因。

  c1:1235:respawn:/sbin/agetty 38400 tty1 linux

  c1指出控制台1,当它被杀死时init将重启它。它打开一个终端tty1供你使用。

  x1:4:wait:/etc/rc.d/rc.4

  x1指出多用户GUI运行级,指向脚本rc.4。

  rc.S(系统初始化运行级脚本)做的事:

  • 安装proc文件系统。
  • 决定是否有需要使用Hotplug自动检测硬件。
  • 启动devfsd。
  • 安装devfs。
  • 为2.6内核启动udev。
  • 打开交换分区,其中要读取/etc/fstab中获取分区信息。
  • 检查根分区是否为只读,因为只有只读时才能检查硬盘。
  • 如有需要检查根分区。
  • 安装sysfs到/proc/sys。
  • 设置硬件时钟。
  • 配置isa设备。
  • 执行/etc/rc.d/rc.modules (这个文件将剩下的内核模块装入内核,稍后再讲)。
  • 初始化lvm卷,不要问我为什么。
  • 检查非根分区。
  • 安装本地硬盘分区。
  • 删除临时文件。
  • initrd被安装在/initrd中,它用来在内核启动第一时间载入一些内核模块和必需程序(如fsck)等。现在卸载它。
  • 创建utmp。
  • 如果你是用的zipslack(一个工作在vfat上的linux套件),配置umsdos。
  • 把Linux 2.4.27写入你的mtod文件
  • 执行rc.sysvinit。(不像rh,slackware是一个“叛徒”。它的init脚本结构不像大多数linux套件(基于SVR4),而像BSD,所以只是一个假文件。)
  • 执行rc.serical。(串口)
  • 安装随机数种子

  rc.modules:

  • 决定内核版本,到目录”/lib/modules/你的内核版本号/“去寻找模块
  • 更新内核模块依赖关系。
  • 装入APM高级管理,它被注释掉了,建议你启用它以正常关机。
  • 一大堆被注释掉了的硬件模块,如果hotplug找不到你的硬件就到这里来。

  rc.S执行完成后,slackware将执行缺省的运行级(3),也就是先执行rc.M(多用户进程级)。

  • 设置黑屏时间。
  • 设置主机名,主机名存储在/etc/HOSTNAME里,缺省为darkstar.example.net。
  • 设置dmesg缓冲区的大小。越多越好。
  • 执行rc.syslog,打开syslog和klogd。
  • 执行rc.pcmcia,初始化PCMCIA卡,我不懂。
  • 执行rc.inet1,设置网络。重点。
  • 执行rc.hotplug,即插即用。
  • 执行rc.inet2,网络守护进程。重点。
  • 把所有的锁文件删掉。
  • 把黑洞设备和临时目录设成777。
  • 运行ldconfig,更新共享库,我喜欢关掉。
  • 更新X字体缓存,关掉吧。不过安了新字体后自己要手动运行一次”fc-cache"而已。
  • 执行rc.CUPS,UNIX打印守护进程。
  • 打开appletalk。关了吧。
  • 打开用户限额。请看/usr/doc/Linux-HowTOs/Quota。
  • 执行rc.acpid。高级能源管理。
  • 执行rc.alsa。alsa声音系统。
  • 执行rc.font。用户自己的字体。
  • 执行rc.keymap。用户自己的keymap。
  • 把你的一大堆网络standalone进程打开。
  • 执行rc.gpm。字符界面上用鼠标。
  • 又执行rc.sysinit一次。BUG?
  • 执行rc.local。最后,执行用户你的自己的配置文件。

  rc.inet1:

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14102/viewspace-116599/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2002-06-18

  • 博文量
    1715
  • 访问量
    1300030