INIT

 init

维基百科,自由的百科全书

init (initialization缩写) Unix  Unix-like 系统中用来产生其它所有进程的程序。它以守护进程的方式存在,其进程号为 1

Unix 系列中( System III  System V)init的作用,和研究中的 Unix  BSD 衍生版本相比,发生了一些变化。大多数Linux发行版是和 System V 相兼容的,但是一些发行版如 Arch  Slackware 采用的是BSD-风格,其它的如 Gentoo 是自己定制的。Ubuntu[1][2]和其它一些发行版现在开始采用 upstart[3] 来代替[4]传统的 init 进程。

目录

 [隐藏]

·                                 1 BSD-风格

·                                 2 SysV-风格

o                                        2.1 运行模式

o                                        2.2 默认的运行模式

·                                 跳过 init

·                                 其他风格

·                                

·                                 外部链

·                                 参考文献

[编辑]BSD-风格

BSD init 运行存放于'/etc/rc'的初始化 shell 脚本,然后启动基于文本模式的终端(getty)或者基于图形界面的终端(窗口系统,如 X)。 这里没有运行模式的问题,因为文件 'rc' 决定了 init 如何执行。

优点: 简单且易于手动编辑。

缺点: 如果第三方软件需要在启动过程执行它自身的初始化脚本,它必须修改已经存在的启动脚本,一旦这种过程中有一个小错误,都将导致系统无法正常启动。

值得注意的是,现代的 BSD 衍生系统一直支持使用 'rc.local' 文件的方式,它将在正常启动过程接近最后的时间以子脚本的方式来执行。这样做减少了整个系统无法启动的风险。然后,第三方软件包可以将它们独立的 start/stop 脚本安装到一个本地的 'rc.d' 目录中(通常这是由 ports collection/pkgsrc 完成的)FreeBSD  NetBSD 现在默认使用 rc.d ,该目录中所有的用户启动脚本,都被分成更小的子脚本,和 SysV 类似。rcorder 通常根据在 rc.d目录中脚本之间的依赖关系来决定脚本的执行顺序。

[编辑]SysV-风格

System V init 检查 '/etc/inittab' 文件中是否含有 'initdefault' 项。 这告诉 init 系统是否有一个默认运行模式。如果没有默认的运行模式,那么用户将进入系统控制台,手动决定进入何种运行模式。

优点: 灵活性强

缺陷: 比较复杂

[编辑]运行模式

System V运行模式描述了系统各种可能的状态。通常会有 8 种运行模式,即运行模式 0 6  S 或者 s。其中运行模式 3 "保留的"运行模式:

0. 关机

1. 单用户模式

6. 重启

除了模式 0, 1, 6, 每种 Unix Unix-like 系统对运行模式的定义不太一样。通常在 /etc/inittab 文件中定义了各种运行模式的工作范围。

[编辑]默认的运行模式

操作系统

默认的运行模式

AIX

2

Arch Linux

3

CentOS

3

Debian GNU/Linux

2 [5]

Gentoo Linux

3

Mandriva Linux

5

Mac OS X

3

Red Hat Linux / Fedora Core

3 or 5

Slackware Linux

3

Solaris

3 [6]

SUSE Linux

5 [7]

Ubuntu (Server and Desktop)

2 [8]

上面的表中有两种Linux发行版默认的运行模式为 5,模式 5 是多用户图形环境(X Window System),通常还包括display manager。然而在Solaris操作系统中,模式 5 被保留用来执行关机和自动切断电源。

大多数操作系统的用户可以用下面的命令来判断当前的运行模式是什么:

$ runlevel

$ who -r

 root 权限下,运行 telinit 或者 init 命令可以改变当前的运行模式。 /etc/inittab 文件中设置的默认的运行模式在 :initdefault: 项中。

[编辑]跳过 init

Linux系统中,现代的bootloader( LILO 或者 GRUB),用户可以在初始化过程中最后启动的进程 users can change which process the kernel spawns at the end of its initialization from the normal default of /sbin/init。 通常是在 bootloader 环境中通过执行 init=/foo/bar 命令。例如,如果执行init=/bin/bash,启动单用户 root shell 环境,无需用户密码。

BSD的变种,大多数平台, bootstrap 程序是可以被打断的,然后执行 boot -s 命令进入单用户模式。

单用户模式并不没有跳过 init,它仍然可以执行 /sbin/init,但是它将使 init 询问 exec() 将要执行的命令 (默认为 /bin/sh) 的路径,而不是采用正常的多用户启动顺序。 如果内核启动时在 /etc/ttys 文件中被标注为 "不安全" (在某些系统中,当前的"安全模式" 可能会有些变化), 在允许这种情况(或者回退到单用户模式,如果用户执行 CTRL+D)init 将首先询问 root 用户的密码。 如果该程序退出,内核将在多用户模式下重新执行 init 。 如果系统从多用户模式切换到单用户模式,还将碰到上述的情况。

如果内核加载后, init 不能被正常启动, 这将导致 panic 错误,此时系统将不可使用。想要通过 init 自身来改变 init 的路径,不同的版本情况不太一样(NetBSD中可执行 boot -a ; FreeBSD中利用 init_path 命令装载变量)

[编辑]其他风格

很多人一直努力地从某些方面改进传统的 init 守护进程,使它变得更完善。下面列出的是一些改进,没有特别的顺序:

§     SystemStarter, 用来替代 launchd  Apple Mac OS X开启进程

§     Initng, 完全代替 init ,可以异步开启进程

§     Upstart, 完全代替 init ,可以异步开启进程 由Ubuntu启动

§     Service Management Facility, 完全代替/重新设计 Solaris 启动 Solaris 10

§     runit, 跨平台完全代替 init 可以并行启动服务

§     BootScripts, GoboLinux

§     Mudur,  Python 写成的 init 替代品, 可以异步开启进程,Pardus Linux 发行版

下面列出的项目还没有大范围的使用:

§     eINIT, 完全代替 init ,可以异步开启进程,但是完成这个过程可以不使用 shell 脚本

§     svscan 来自 daemontools 被用作 1 号进程 - 似乎将被 runit 替代

§     cinit

§     twsinit, 部分用 x86 汇编写成, 只是用来证明一种概念

§     minit

§     OpenRC

[编辑]

§     pidof 或者 killall5, System V 开始在很多发行版中使用的另一种程序

[编辑]外部链接

§     Linux init man page

§     FreeBSD init man page

§     boot-scripts

§     runit

§     minit

§     rc.d

§     busybox

§     smf and milestones in Solaris 10

§     cinit

§     twsinit

§     Mudur

[编辑]参考文献

1.     ^ http://help.ubuntu.com/community/KnowThyUbuntu

2.     ^ http://www.linuxquestions.org/questions/ubuntu-63/since-we-have-no-etcinittab-506281/

3.     ^ http://www.netsplit.com/2006/08/26/upstart-in-universe/

4.     ^ http://linuxplanet.com/linuxplanet/reports/6366/1/

5.     ^ http://www.debianadmin.com/debian-and-ubuntu-linux-run-levels.html

6.     ^ http://docs.sun.com/app/docs/doc/817-1985/6mhm8o5ru

7.     ^ http://www.novell.com/documentation/sles10/pdfdoc/sles_admin/sles_admin.pdf

8.     ^ http://www.debianadmin.com/debian-and-ubuntu-linux-run-levels.html

 

 

Slackware启动脚本与System V启动脚本的区别何在?
作者:kkeller
翻译:windrose
Slackware
版本:Slackware 7.0及以上
写于:2002-6-24

好了,说来话长。莫谓言之不预也。

Slackware
使用BSD风格的init脚本,而很多别的发行版使用System V风格的init脚本。SysVBSD脚本都是能让人读懂的,即它们都是shell脚本,而不是已编译的程序。主要的区别在于脚本是如何设计的。

SysV
脚本倾向于接受诸如startstoprestart之类的参数,依它所启动的程序而定。所以你可以用 /etc/init.d/bind start 这样的命令来启动BIND,并用 /etc/init.d/bind stop 来停止BIND

SysV
的启动还倾向于使用符号链接来组织启动进程,例如在 /etc/rc.d/rc.4/中,可能会有指向别的目录中的真正的脚本的各种各样的符号链接。这些链接的命令会像是 S10networkS25xdm之类,其中的S表示启动(start)该项服务(如果是K,则表示kill),而数字指定了脚本执行的顺序。

SysV
风格的启动脚本的主要优点在于能够设置成自动配置许多东西。例如,若你进入runlevel 6,你可以建立一个链接叫K75bind来终止BIND,前提是链接所指向的文件已经设置好来做这件事。

SysV
风格脚本的主要缺点是太过弯弯绕。假如我想增加一个服务,我要先写一个SysV风格的脚本(不是容易的事),它至少要处理“start”(还可能有“stop”)。然后,我必须确保在每个要运行这个服务runlevel中正确地设置好符号链接。如果恰好这个服务需要在已经连续编号的两个脚本之间运行,我就需要做一些对符号链接重新编号的工作(例如,S10xxxS11yyy已经存在,而我想让zzzz在它们之间运行,我就需要对前两者之一重新建立符号链接来把zzzz挤进去)

想 暂时改变SysV的启动进程也是非常痛苦的事情。假如我不想在下次启动时运行xxx服务,最简单的办法是删除S10xxx这个链接,不算难吧?但如果我想 在每个runlevel中都去掉它,我就需要从每个有关目录中删除S10xxx这个链接。然后,假如我改了主意,想重新运行xxx,我需要手工重新建立所 有的符号链接。

这样子无疑是在已经很复杂的启动进程上叠床架屋,而Slackware是不会这么做的:它用BSD风格的启动脚本。

BSD
风格的脚本是直接了当的shell脚本,它们倾向于顺序运行,而不需要startstop之类参数。只要系统进入了它们的runlevel就会执行,就这么简单。

BSD
风格的主要缺点是你需要一些其他方法来控制后台服务。 例如,若我要停止BIND,我要先用命令 ps ax|grep named 找出 namedPID,然后kill这个PID(或者用这个pid的文件名)。但是我不能简单地下个命令 /etc/init.d/bind stop (除非我已经写了个这样的SysV脚本)

BSD
风格脚本的主要优点是它们非常容易阅读和编辑。例如,若我想增加一个服务zzzz, 我可以在 /etc/rd.d/rc.local中增加一行 /usr/local/bin/zzzz,这样只要是执行rc.localrunlevelzzzz就会随之运行。假如我只想在runlevel 4执行zzzz,我可以把它放在 /etc/rc.d/rc.4 (不是目录,而是一个脚本)中。如果我要改变执行顺序,我只要把zzzz放在适当的服务之间,多数编辑器都支持在文件中间插入文本(就算ed都支持)。还有,你可以用注释的方式停止一个服务,然后去掉注释让它重新运行。

因此,当多数发行版采用SysV风格时,Slackware采用了BSD风格。对于许多Slackware用户,BSD风格的易用性胜过SysV风格的强大功能。当然,你可以有自己的意见。

与普遍的观点相反,从一种风格转到另一种并不那么困难,只要把inittabrc文件从一个系统拷贝到另一个系统即可。init程序自身没有改变,所谓风格多是在inittab和它所调用的脚本中设置的。

译注:现在slackware为了提高兼容性,在/etc/rc.d/提供了rc.sysvinit脚本以适应某些基于SysV启动过程的商业程序的需要。另外,在许多设置服务的脚本中,也接受startstoprestart这一类参数,例如rc.sendmailrc.sshd等。

 

SysVBSD启动风格的比较(中英文对照)

作者:佚名  来源:不详  发布时间:2009-03-21 19:54:07  发布人:zangyl

减小字体  增大字体

 What's the difference between Slackware startup scripts and System V startup scripts?

Okay, this answer is very long. Just a warning.

Slackware uses BSD-style init scripts; many other distros use System V-style init scripts. Both SysV scripts and BSD scripts are human-readable, in that they are shell scripts, not compiled programs. The main difference is in how the scripts are designed.

SysV scripts tend to take arguments like start, stop, restart, and others, depending on the program it's starting. So you could say something like /etc/ init.d/bind start to start BIND, and /etc/init.d/bind stop to stop BIND.

SysV-style init also tends to use symlinks to organize the boot process: in /etc/rc.d/rc.4/, there might be various symlinks to actual scripts in another directory. The symlinks are named like S10network, S25xdm, and so on, where the S means to start the service (K means kill it), and the numbers designate the order in which scripts should run.

The main advantage of SysV style init scripts is that they can be set up to configure a lot of stuff automagically. If, for example, you go into runlevel 6, you can have a symlink in /etc/rc.d/rc.6/ called K75bind, which will kill off BIND if the file to which its linked is set up to do that.

The main disadvantage of SysV style is that it's terribly convoluted. If I want to add a service, for example, I need to write a SysV-style script (which is certainly nontrivial) to at least handle "start" (and possibly "stop"). Then I need to make sure I've got the symlink set up correctly in each runlevel where I want it to run, and if I happen to need it to execute between two scripts that are consecutively numbered, I need to do some symlink renumbering (e.g., if S10xxx and S11yyy exist, and I want zzzz to run between, I need to resymlink one of those files to squeeze zzzz between them).

It's also a huge pain to alter the SysV boot process temporarily--if I want service xxx to not run on next boot, the easiest way is to remove the S10xxx symlink. Not too hard, but if I want to remove it from every runlevel, I need to remove the S10xxx symlink from every directory. Then if I change my mind and want xxx to run again, I need to recreate all of the appropriate symlinks by hand.

It's one extra level of complexity to the already-complicated boot process, and one which Slackware doesn't use: it uses BSD-style startup scripts instead.

BSD-style scripts are straight-ahead shell scripts that tend to run sequentially and don't take arguments like start or stop. They run when the system enters their runlevel, and that's it.

The main disadvantage of BSD-style is that you have to use some other method of controlling daemons. For example, if I want to stop BIND, I need to ps ax|grep named, find named's PID, and kill the pid. (Or I can find the pid file.) But I can't say /etc/init.d/bind stop (unless I write a SysV-style script for that).

The main advantage of BSD-style scripts is that they're terribly easy to read and edit. For example, if I add a new service zzzz, I can add the line /usr/ local/bin/zzzz to /etc/rc.d/rc.local, and zzzz will run in the runlevels where rc.local executes. If I know I want zzzz only in runlevel 4, I can put it in /etc/ rc.d/rc.4 (no longer a directory, but a shell script). If I need to change the order, I can just put the call to zzzz between the services where it should run; most editors can handle inserting text in the middle of a file (even ed!). Also, you can easily comment out a service to stop it from running, and uncomment it later.

So, while most distributions use SysV style, Slackware uses BSD-style. For many Slackware users, the ease-of-use of the BSD-style greatly outweighs the power of SysV-style. You can certainly form your own opinion.
 

Contrary to popular belief, it's not that difficult to switch from one style to the other--just grab the inittab and rc files from one system and copy them to another. The init binary itself is not changed--most of the ''style'' is set in inittab and the scripts it calls.  

好了,说来话长。莫谓言之不预也。

Slackware
使用BSD风格的init脚本,而很多别的发行版使用System V风格的init脚本。SysVBSD脚本都是能让人读懂的,即它们都是shell脚本,而不是已编译的程序。主要的区别在于脚本是如何设计的。

SysV
脚本倾向于接受诸如startstoprestart之类的参数,依它所启动的程序而定。所以你可以用 /etc/init.d/bind start 这样的命令来启动BIND,并用 /etc/init.d/bind stop 来停止BIND

SysV
的启动还倾向于使用符号链接来组织启动进程,例如在 /etc/rc.d/rc.4/中,可能会有指向别的目录中的真正的脚本的各种各样的符号链接。这些链接的命令会像是 S10networkS25xdm之类,其中的S表示启动(start)该项服务(如果是K,则表示kill),而数字指定了脚本执行的顺序。

SysV
风格的启动脚本的主要优点在于能够设置成自动配置许多东西。例如,若你进入runlevel 6,你可以建立一个链接叫K75bind来终止BIND,前提是链接所指向的文件已经设置好来做这件事。

SysV
风格脚本的主要缺点是太过弯弯绕。假如我想增加一个服务,我要先写一个SysV风格的脚本(不是容易的事),它至少要处理“start(还可能有“stop)。然后,我必须确保在每个要运行这个服务的runlevel中正确地设置好符号链接。如果恰好这个服务需要在已经连续编号的两个脚本之间运行,我就需要做一些对符号链接重新编号的工作(例如,S10xxxS11yyy已经存在,而我想让zzzz在它们之间运行,我就需要对前两者之一重新建立符号链接来把zzzz挤进去)

想暂时改变SysV的启动进程也是非常痛苦的事情。假如我不想在下次启动时运行xxx服务,最简单的办法是删除S10xxx这个链接,不算难吧?但如果我想在每个runlevel中都去掉它,我就需要从每个有关目录中删除S10xxx这个链接。然后,假如我改了主意,想重新运行xxx,我需要手工重新建立所有的符号链接。

这样子无疑是在已经很复杂的启动进程上叠床架屋,而Slackware是不会这么做的:它用BSD风格的启动脚本。

BSD
风格的脚本是直接了当的shell脚本,它们倾向于顺序运行,而不需要startstop之类参数。只要系统进入了它们的runlevel就会执行,就这么简单。

BSD
风格的主要缺点是你需要一些其他方法来控制后台服务。例如,若我要停止BIND,我要先用命令 ps ax|grep named 找出 namedPID,然后kill这个PID(或者用这个pid的文件名)。但是我不能简单地下个命令 /etc/init.d/bind stop (除非我已经写了个这样的SysV脚本)

BSD
风格脚本的主要优点是它们非常容易阅读和编辑。例如,若我想增加一个服务zzzz,我可以在 /etc/rd.d/rc.local中增加一行 /usr/local/bin/zzzz,这样只要是执行rc.localrunlevelzzzz就会随之运行。假如我只想在runlevel 4执行zzzz,我可以把它放在 /etc/rc.d/rc.4 (不是目录,而是一个脚本)中。如果我要改变执行顺序,我只要把zzzz放在适当的服务之间,多数编辑器都支持在文件中间插入文本(就算ed都支持)。还有,你可以用注释的方式停止一个服务,然后去掉注释让它重新运行。

因此,当多数发行版采用SysV风格时,Slackware采用了BSD风格。对于许多Slackware用户,BSD风格的易用性胜过SysV风格的强大功能。当然,你可以有自己的意见。

与普遍的观点相反,从一种风格转到另一种并不那么困难,只要把inittabrc文件从一个系统拷贝到另一个系统即可。init程序自身没有改变,所谓“风格”多是在inittab和它所调用的脚本中设置的。

译注:现在slackware为了提高兼容性,在/etc/rc.d/提供了rc.sysvinit脚本以适应某些基于SysV启动过程的商业程序的需要。另外,在许多设置服务的脚本中,也接受startstoprestart这一类参数,例如rc.sendmailrc.sshd等。

 

 

 

linux系统管理基础()

首先,建立或者编辑3个重要的用户安全方面的配置文件;
然后,了解一下守护进程和服务器初始化进程,学习编辑启动相关服务的目录;
最后,了解用户帐号和学习如何安全地创建帐号。

基本配置文件

/etc/securetty
/etc/shells.bash_logout文件

这里介绍的3个基本配置文件只有在你允许你的远程用户shell(例如使用Telnet)才真正显示出其中的重要性。必须保证它们的安全。

/etc/securetty

/etc/securetty
文件列出了root登录时使用的tty (终端类型)设备。这些设备每个一行地排列。
tty1 tty2 tty3 tty4 tty5 tty6 tty7 tty8
列出来的tty设备都是允许登录的,注释掉或是在这个文件中不存在的都是不允许root登录的

为了保证安全, /etc/securetty应该仅包括本地控制台。因此在/etc/securetty文件中仅保留一个或两个tty设备,而将其它内容删除是个好主意。
列表51列出了一个/etc/securetty 文件的例子。
如果该文件中未列出任何设备(文件内容为空),则在多用户运行级别下,只能通过su命令行使root权限了。

/etc/shells

/etc/shells
列出可信任的shell
chsh
命令允许用户在/etc/shells文件指定范围内改变登录shell
提供一台机器FTP服务的服务进程ftpd 检查用户shell是否列在 /etc/shells 文件中,如果不是将不允许该用户登录。

一般,比较常见的/etc/shells文件包括下面这些shell /bin/bash2 /bin/bash /bin/sh /bin/ash /bin/bsh /bin/tcsh /bin/csh

/etc/shells
文件中的安全漏洞:
许多Linux发行版本提供了许多可用shell,但是对于安全的系统来说这并不好;
shell
跟系统的其他部分一样,产生很多安全问题;
同时监控和升级一种shell要比监控和升级67shell容易得多;

绝大多数用户常用的shell都是Linux系统的缺省shell,因此/etc/shells文件应修改为仅仅包含下列一行:
/bin/bash
这样就保证了所有的用户登录都进入相似的bash shell环境。

/etc/skel/. bash_logout

当一个用户从一个文本模式的shell注销的时候,我们希望Linux清除屏幕上显示的内容,这样该用户在屏幕上的数据就不会被其他用户看到。编辑缺省的/etc/skel/. bash_logout文件,注销时清屏。

首先,编辑/etc/skel/.bash_logout文件。
每次用户注销时bash shell都要编辑$HOME/.bash_logout文件。这样,每次用户注销时都要执行它包含的任何命令。当添加新帐号时,创建$ HOME/.bash_logout文件的模板就是/etc/skel/.bash_logout。我们给这个文件增加一行: /usr/bin/clear这样,当用户注销时就会清除屏幕显示。

注意: /etc/skel/.bash_logout文件的改动仅对于编辑该文件以后创建的用户帐号有效。

初始化文件

SysV
风格的初始化进程

所谓的初始化一个启动指定的服务的过程。
/etc/inittab文件中,可以看到如表5.2所示的记录块。

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

表中的每一行只有在特定的运行级别下才运行,运行级别由该行前两个冒号中间的数字决定。基于运行级别,init将调用一个中心脚本,在此即/etc/rc.d/rc,并将当前运行级别作为一个参数传递给该脚本。
/etc/rc.d/rc
根据当前运行级别的信息调用相应的初始化脚本。这些脚本可能是
/etc/rc.d/rc0.d
/etc/rc.d/rc6.d
/etc/rc0.d
/etc/rc6.d
/sbin/rc0.d
/sbin/rc6.d

如果系统以运行级别3启动,init进程将运行/etc/rc.d/rc3.d(或者类似)目录中的所有脚本。这些脚本按照字母顺序运行,每个脚本执行一项特定的任务。
例如某个脚本可能启用网络接口,一个脚本启动Web服务器,另一个脚本或许启动sendmail。要编辑系统初始化进程, 你只需要添加或者删除特定运行级别目录中的shell脚本就可以了。

上述脚本实际上是对一些标准服务脚本的符号连接,真正的服务启动脚本一般位于/etc/rc.d/init.d /etc/init.d或者/sbin/init.d。这些脚本的执行顺序是可以控制的,其符号连接名字也是大同小异。
书上列表5.3列出了在/etc/rc.d/rc3.d目录中使用ls –l命令后的部分输出。

注意:符号连接是按照其执行顺序来命名的,同时每个连接只是../init.d目录中的一个脚本的符号连接。rc0.drc6.d的每个目录都包含一系列这些符号连接。连接位于哪个目录取决于运行级别要启动或者不启动(或者删除)哪个服务。
由于Systen V UNIX采用的是这种方式,所以称为SystemV风格的初始化配置。在Linux中简称为SysV初始化配置。

发现并禁止不需要的服务

如果你检查一下rcN.d目录, 你会注意到许多服务在每个运行级别上都会启动,特别是在rc3.drc5.d目录控制的多用户运行级别中。很显然,有时候并不需要所有这些服务,为了更好的安全性,应该关掉不需要的服务。
要关掉给定运行级别的服务,只要删除符号连接即可

例:禁止运行级别5xfs字体服务(font server,rc.5中删除与之关联的脚本即可:
cd /etc/rc.d/rc5.d
mkdir disabled
mv S90xfs disabled
当然,rcN.d的路径应该与系统路径匹配, S90xfs名也应该与你的xfs符号连接相匹配。
注意:不要删除init.d目录中的原始脚本,否则将影响所有运行级别中的服务,而不仅是你要编辑的运行级别。

要确定哪些脚本是需要的,哪些是不需要的, 要求能够辨别服务以及每个脚本相关的服务。
5.1列出了常见的脚本。
如果不能确定某个服务是否可以禁止,可以尝试一下去掉该服务的系统。如果几天后没有出错,则表明并不真正需要它。这个规则的例外是syslog启动的日志daemon(守护程序)-对于安全来说日志是最重要的!
注意:重启系统才能使rcN.d的更改生效。

重新激活被禁止的服务

激活一项被禁止的服务:恢复对脚本的符号连接即可,注意服务的启动顺序。
例:为运行级别5重新安装xfs daemon,你可以使用下面的命令:
cd /etc/rc.d/rc5.d
mv disabled/S90xfs

用户管理

常识和经验

如果你必须重建一个符号连接,而不是简单地移动它,同时你不确定启动服务的顺序,可使用你的常识和经验。
如:网络daemon应该在网络本身启动之后,在依赖于该daemon的服务的启动之前。如果你第一次没有做对,可以略过它,直到你做对为止。最终你会重新发现一个工作正常的配置。

帐号文件

用户帐号文件——/etc/passwd
#head /etc/passwd

root:x:0:0:root:/root:/bin/bash
1列:用户名
2列:用户密码,出于安全,用x填充,真正的密码保存在shadow文件中。
3列:用户号(UID)。
4列:用户所属的组号。
5列:说明字段。
6列:用户宿主目录,用户登录后的默认目录。
7列:用户使用的shell

用户密码文件——/etc/shadow
密码以加密形式保存。

root:x:0:0:root:/root:/bin/bash
1列:用户名
2列:用户密码,出于安全,用x填充,真正的密码保存在shadow文件中。
3列:用户号(UID)。
4列:用户所属的组号。
5列:说明字段。
6列:用户宿主目录,用户登录后的默认目录。
7列:用户使用的shell

用户密码文件——/etc/shadow
密码以加密形式保存。

用户组帐号文件——/etc/group
#head /etc/group

root:x:0:root
1列:用户组名。
2列:用户组口令,出于安全,用x填充。
3列:用户组标识号(GID)。
4列:加入该用户组的用户列表。 (以该组作为附加用户组)

用户组密码文件——/etc/gshadow

相关命令

useradd
功能:添加用户
格式:useradd [选项] 用户名
选项:
-g
指定用户所属的用户组。
-G
用户加入的附加用户组,可以多个。
-d
指定用户的宿主目录。
-s
指定用户的登录Shell
-c
指定一段注释性描述。
-r
系统用户,不为该用户创建用户目录。

例:
# useradd sam
创建了一个用户sam
# useradd -s /bin/sh -g group –G adm,root gem
新建了一个用户gem,该用户的登录Shell/bin/sh,属于group用户组,同时又加入admroot用户组。

userdel
功能:删除用户
格式: userdel [选项] 用户名
选项:-r 删除用户帐号的同时删除用户的宿主目录。
例:
#userdel sam

usermod
功能:改变已有用户帐号的属性
格式: usermod [选项] 用户名
选项:-c -d -g -G –s,意义与useradd相同。
例:
#usermod -s /bin/ksh -d /home/z –g developer sam
将用户sam的登录Shell修改为ksh,主目录改为/home/z,所属的用户组改为developer

groupadd
功能:添加用户组
格式: groupadd [选项] 用户组名
选项:
-g
指定新用户组的组标识号(GID)。
-r
新建系统组。系统组的GID小于500
例:
#groupadd -g 101 group2

groupdel
功能:删除用户组
格式: groupdel [选项] 用户组名
例:
#groupdel group1

groupmod
功能:改变已有用户组帐号的属性
格式: usermod [选项] 用户组名
选项:
-g
为用户组指定新的组标识号。
-n
更改用户组的名字。
例:
#groupmod –g 10000 -n group3 group2
将组group2的标识号改为10000,组名修改为group3

passwd
功能:管理用户密码
格式: passwd [选项] 用户名
选项:
-l
锁定用户帐号
-u
解锁用户帐号
-d
删除指定用户的密码,使该用户无法登陆。
说明:新添加的用户帐号在设置密码之前无法登录。
例:
passwd
修改当前用户密码。

gpasswd
功能:管理用户组中的成员
格式: gpasswd [选项] 用户名 用户组名
选项:
-a
把用户加入用户组
-d
从用户组中删除用户
例:
#gpasswd –d user1 bin
用户user1加入用户组bin,用户组bin作为user1的附加用户组。

id
功能:显示当前用户的uid,用户所属的用户组gid,用户加入的附加组id
格式: id

whoami
功能:显示当前用户名称
格式: whoami

su
功能:转换为其它用户登陆
格式: su 用户名
例:
#su user1
#su –user1
转换为user1登陆,并使用user1的环境变量。
#su
转换为root用户。

groups
功能:显示用户已加入的附加组
格式: groups 用户名

安全地创建用户帐号

尽管许多小型系统的管理员在Linux安装完成后,使用adduser命令减号用户后就再也没有考虑过这个问题了,但是,如果要杜绝隐患,建立帐号与系统其它部分一样,亚必须是安全的。
实际上,在添加用户之前,必须保证在系统中激活shadow passwords。然后,由于每个销售商的adduser的实现不同,有些adduser命令甚至不起作用,所以安全意识强的管理员要手工添加用户来保证用户帐号的所有信息都正确输入。

Shadow
MD5

在创建用户帐号之前,应该保证安装并运行了ShadowMD5加密。
Shadow
可以保护你的用户密码不会被公开访问;没有shadow,你保存的所有用户的/etc/password文件对外界就都是可见的----个巨大的安全漏洞

查看shadow passwords

要查看你的系统中的shadow passwords是否激活,可检查/etc/shadow文件是否存在。该文件只有对root用户可读:
$cat /etc/shadow
Cat:/etc/shadow:Permission denied
如果你发现不存在shadow文件,或者shadow对于普通用户(非root)可读,则你的系统中或者未安装shadow,或者安装不正确。

现在几乎所有的版本都会缺省安装shadow password,而且多数还会缺省安装MD5加密。
如果你找不到/etc/shadow文件,检查你的发行版本CD或者FTP站点。多数情况下,如果你的发行版本介质上含有名为shadow或者类似名字的包,则使用rpm或者dselect安装它,就可以在你的系统上安装并激活shadow password
可以查看你的/etc/passwd文件来验证一下。如果你在任何用户项的第二个字段看到的不是x,那么使用pwconv程序来正确升级/eyc/passwd/etc/shadow文件.

添加用户的第一步:/usr/sbin/groupadd

大多数Linux发行版本缺省的建组方法是将所有的用户帐号放到一个group(组)中,通常是group 100,称为users。显然,强迫所有用户的文件属于一个共享组,对于每个用户数据的完整性来说是一个冒险。因此,明智的做法是给每个用户一个私有的组-只有当前用户属于的组。

方法如下:为用户组选择一个号码,调用/usr/sbin/groupadd创建该组。为清楚起见,最好是将所有的用户帐号号码限制在某个范围之内(例如,从60006999),这些号码比已经存在的group ID号码要大,专门为用户使用。
要找出目前使用的最大的组号码,可使用下面的命令:
cat /etc/group |cat –d:-f3 |sort -n

一旦你为新用户选定了一个组号码,就调用groupadd命令创建一个新组,并将用户的登录名作为最后一个参数:
/usr/sbin/groupadd –g 6001 johnB
根据用户组在你系统中的作用,你还希望在用户组成员列表中添加新的用户,可使用下面的方法:用vi或者类似的编辑器编辑/etc/group文件,将用户登录名追加到以逗号分隔的用户成员列表后面

添加用户的第二步:/usr/sbin/useradd

大多数Linux版本的缺省创建帐号的方法也是不太安全的,因此使用高级工具或者adduser脚本创建用户不是好办法。我们采用相对低级的useradd命令。
useradd
命令易于使用,只要提供-u(用户ID号码)、-g(组名)、-dhome目录)和-m(建立home目录)参数,后面加上要创建的用户名即可。

继续上面的例子,用useradd命令添加一个用户:
/usr/sbin/useradd –u 6001 –g johnB –d /home/johnB –m johnB
这个命令将创建一个名为johnB的用户,并将其放在匹配号码的johnB组中。他的home目录是/home/johnB ,建立该home目录,并将/etc/skel中的所有模版文件拷贝到该目录中。

添加用户的第三步:passwdchage

现在,我们已经创建了用户组、帐号和home目录,该用户可以登录了。但是还没有给该用户设置口令-在用户登录并立即选择口令之前,这是一个无法容忍的安全漏洞。
在大型系统中,可能需要安装一个随机口令发生器,但是对于小型的系统,由系统管理员在用户第一次登录之前设置一个临时口令就足够了。命令如下:
passwd johnB

但是,仅选择一个临时口令还不够,我们希望johnB立即将口令更改为他自己选择的口令,同时,我们希望确保johnB能够经常更改他的口令,而不是太长时间不变或者易于被人猜到。可以使用chage命令来实现这些要求,该命令用来控制Linux系统中口令的有效期。
chage
命令的参数选项如表5.2所示。

例:口令管理命令
chage –m 0 –M 990 –d 0 –I 0 –E 0 –W 10 johnB
上述命令强制johnB在首次登录时更改其口令,同时它还牵制该用户以后每90天更改一次口令,提前10天给出更改警告。
这些改动做完之后johnB的帐号就安全创建完成了,他可以随时登录进入系统。

为增加安全性,正确使用/etc/securetty /etc/ shells.bash_logout文件;
编辑SysV风格的初始化脚本目录,在系统启动时激活或者禁止某些服务的启动;
安全添加用户帐号的正确方法,包括创建用户私有组、口令和帐号过期时间;
当今Linux发行版本中shadowMD5的重要性,以及维护系统口令数据库完整性的方法。 

 

 

 

 

init

http://www.17wi.com/doc-view-420.html

 

目录

[显示全部]

一、什么是INIT:编辑本段回目录

  
  init是Linux系统操作中不可缺少的程序之一。  
  所谓的init进程,它是一个由内核启动的用户级进程。  
  内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数  
据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始  
终是第一个进程(其进程编号始终为1)。  
  内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)  
是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的  
启动也会失败。

二、运行级别编辑本段回目录

 
  那么,到底什么是运行级呢?  
  简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有  
不同的功能。  
  不同的运行级定义如下:(可以参考Red Hat Linux 里面的/etc/inittab)  
  # 0 - 停机(千万不能把initdefault 设置为0 )  
  # 1 - 单用户模式  
  # 2 - 多用户,没有 NFS  
  # 3 - 完全多用户模式(标准的运行级)  
  # 4 - 没有用到  
  # 5 - X11 (xwindow)  
  # 6 - 重新启动 (千万不要把initdefault 设置为6 )  
  这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最  
先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚  
本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目  
录。(这里的n 就是运行级0-6) 

 

三、运行级别的配置编辑本段回目录

  
  运行级别的配置是在/etc/inittab行内进行的,如下所示:  
  12 : 2 : wait : / etc / init.d / rc 2  
  第一个字段是一个任意指定的标签;  
  第二个字段表示这一行适用于运行那个级别(这里是2);  
  第三个字 段表示进入运行级别时,init应该运行第四个字段内的命令一次,而且i  
nit应该等待该命令结束。/etc/init.d/rc命令运行启动和终止输入以便进入运行级别2  
时所需的任何命令。  
  第四个字段中的命令执行设置运行级别时的一切“杂活”。它启动已经没有运行的  
服务,终止不应该再在新运行级别内运行的服务。根据Linux版本的不同,采用的具体命  
令也不同,而且运行级别的配置也是有差别的。  
  init启动时,它会在/etc/inittab内查找一个代码行,这一行指定了默认的运行级  
别:  
  id : 2 : initdefault :  
  你可以要求init在启动时,进入非默认运行级别,这是通过为内核指定一个“sing  
le”或“emergency” 命令行参数来实现的。比如说,内核命令行参数的指定可通过LI  
LO来执行。这样一来,你就可以选择单用户模式了(即运行级别1)。  
  系统正在运行时,telinit命令可更改运行级别。运行级别发生变化时, init 就会  
从/etc/inittab运行相应的命令。

四、inittab中的特殊配置编辑本段回目录

  
  /etc/inittab中,有几个特殊的特性,允许init重新激活特殊事件。这些特殊特性  
都是用第三个字段中的特殊关键字标记出来的。比如:  
  1. powerwait  
  允许init在电源被切断时,关闭系统。其前提是具有U P S和监视U P S并通知init  
电源已被切断的软件。  
  2. ctrlaltdel  
  允许init在用户于控制台键盘上按下C t r l + A l t + D e l组合键时,重新启动  
系统。注意,如果该系统放在一个公共场所,系统管理员可将C t r l + A l t + D e   
l组合键配置为别的行为,比如忽略等。 

 3. sysinit  
  系统启动时准备运行的命令。比如说,这个命令将清除/tmp。  
  上面列出的特殊关键字尚不完整。其他的关键字及其使用详情,可参考你的initta  
b手册页。

五、在单用户模式下引导编辑本段回目录

  
  一个重要的运行级别就是单用户模式(运行级别1),该模式中,只有一个系统管理  
员使用特定的机器,而且尽可能少地运行系统服务,其中包含登录。单用户模式对少数  
管理任务(比如在/usr分区上运行fsck)而言,是很有必要的,因为这需要卸载分区,  
但这是不可能的,除非所有的服务系统已被杀死。  
  一个正在运行的系统可以进入单用户模式,具体做法是利用init,请求运行级别1。  
内核启动时,在内核命令行指定single或emergency关键字,就可进入运行级别1了。内  
核同时也为init指定命令行, init从关键字得知自己不应该采用默认的运行级别(内核  
命令行的输入方式和你启动系统的方式有关)。  
  有时,以单用户模式进行启动是必要的,这样一来,用户在装入分区之前,或至少  
在装入分散的/usr分区之前,能手工运行fsck(在分散的文件系统上,任何活动都可能  
使其更为分散,所以应该尽可能地运行fsck)。  
  如果自动化的fsck在启动时失败了,启动脚本init的运行将自动进入单用户模式。  
这样做是为了防止系统使用不连贯的文件系统,这个文件系统是f s c k不能自动修复的  
。文件系统不连贯的现象极为少见,而且通常会导致硬盘的不连贯或实验性的内核释放  
,但最好能做到防患于未然。  
  由于安全上的考虑,在单用户模式下,启动外壳脚本之前,配置得当的系统会要求  
用户提供root密码。否则,它会简单地为L I L O输入合适的一行代码,以r o o t的身  
份登录(当然,如果/etc/passwd已经由于文件系统的问题而不连贯了,就不适合这里的  
原则了,为对付这种情况,你最好随时准备一张启动盘)。  
  不同的运行级有不同的用处,也应该根据自己的不同情形来设置。  
  例如,如果丢失了root口令,那么可以让机器启动进入单用户状态。在启动后的 l  
ilo 提示符下输入:  
  init=/bin/sh rw 使机器进入运行级1 ,并把 root 文件系统挂为读写。他会跳过  
所有系统认证,让你可以使用passwd 程序来改变root口令,然后启动到一个新的运行级  
。 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值