技术文章 Linux 控制台到BASH



用户登录过程剖析-控制台-bash

用户在控制台登录基本流程是:由init进程启动getty产生几个虚拟控制台(tty1,tty2等)。在控制台上显示登录,当用户敲入用户时,getty执行(exec)登录(login)进程,进入登录认证过程过程,认证成功后,登录进程(login)会fork相应用户shell的子进程,至此登录过程结束。用户可以在对应的shell下工作。其过程是getty, login, shell一般是bash。

Getty

getty有init启动,其配置在/etc/inittab中,getty可以启动虚拟控制台如tty1,也可以启动串口(可用于调试内核)和modem,在inittab中的配置文件如下。

# Format:

# <id>:<runlevels>:<action>:<process>

#

# Note that on most Debian systems tty7 is used by the X Window System,

# so if you want to add more getty's go ahead but skip tty7 if you run X.

#

1:2345:respawn:/sbin/getty 38400 tty1

2:23:respawn:/sbin/getty 38400 tty2

3:23:respawn:/sbin/getty 38400 tty3

4:23:respawn:/sbin/getty 38400 tty4

5:23:respawn:/sbin/getty 38400 tty5

6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)

#

#T0:235:respawn:/sbin/getty -L ttyS0 9600 vt100

#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

getty启动是会读取/etc/issue文件并且在控制台上显示,一般是发行版的一些信息,节点名等。

Login 过程

Login的基本流程如下图。

login

login的配置文件是/etc/login.defs, 其认证对应的重要文件是/etc/pam.d/login,这里定义了认证的限制(如怎么禁止非root用户登录,如何限制特定用户登录),以及认证成功后一些环境变量(如mail位置设定,资源限制设定)的设定。

重要的login相关的pam配置文件设定:

用户的访问控制:

    • 限制root在指定的虚拟终端登录:

Disallows root logins except on tty's listed in /etc/securetty

# (Replaces the `CONSOLE' setting from login.defs)

auth [success=ok ignore=ignore user_unknown=ignore default=die] pam_securetty.so

      • 限制非root用户登录:配置文件/etc/nologin存在则只允许root登录。

    # Disallows other than root logins when /etc/nologin exists

    # (Replaces the `NOLOGINS_FILE' option from login.defs)

    auth requisite pam_nologin.so

      • 限制特定用户登录

    # Uncomment and edit /etc/security/access.conf if you need to

    # set access limits.

    # (Replaces /etc/login.access file)

    # account required pam_access.so

    access.conf的文件格式比较复杂,请参考发行版的配置文件。

    环境变量

      • 环境变量

    # parsing /etc/environment needs "readenv=1"

    session required pam_env.so readenv=1

      • 本地化变量

    # locale variables are also kept into /etc/default/locale in etch

    # reading this file *in addition to /etc/environment* does not hurt

    session required pam_env.so readenv=1 envfile=/etc/default/locale

      • 资源限制

    # Sets up user limits according to /etc/security/limits.conf

    # (Replaces the use of /etc/limits in old login)

    session required pam_limits.so

      Bash

      用户在登录成功后,login启动/etc/passwd文件中用户指定的SHELL,通常是Bash,Bash相应的配置文件和启动过程如下图。

      login_process-bash

      说明:Bash有几种启动方式:

      1. 交互式登录:即是在登录过程中由登录进程创建的Bash子进程,如login进程启动的Bash,ssh登录时,sshd创建的子进程。

      2. 非登录的交互式:如在图形界面中,启动的终端。

      3. 非交互式:如运行脚本。

      对于图中的文件的权限是登录用户可读。在系统终端的登录中,bash是使用第一种启动方式。

      总结

      至此用户登录结束,用户进入交互式终端。总之用户要进入终端对系统进行操作,其过程由内核启动,init进程fork产生getty等待用户登录,用户在登录时候getty使用login进程(exec调用)替代自己,成功后login创建Bash子进程,用户进入终端界面。其中每一个程序都有自己的配置文件,设置环境变量等,如在login过程中可以设置环境变量LANG,Bash中也可以设置,且结果是,后面设置的取代前面的。Login设置的是全局的环境变量,Bash可以是全局的在/etc/下的配置文件,也可以在用户的home目录下设置用户的环境变量。

      问题思考: 结合系统登录过程,如何设置所有用户的LANG环境变量为zh_CN.GBK? 某一用户呢?

      scroll back to top
      Top