Linux之基本系统(四)

基本系统


目录结构

/   根目录
│
├boot/              启动文件。所有与系统启动有关的文件都保存在这里
│    └grub/         Grub 引导器相关的文件
│
├dev/               设备文件
├proc/              内核与进程镜像
│
├mnt/               临时挂载
├media/             挂载媒体设备
│
├root/              root用户 的 $HOME 目录
├home/
│    ├user/         普通用户 的 $HOME 目录
│    └.../
│
├bin/               系统程序
├sbin/              管理员系统程序
├lib/               系统程序库文件
├etc/               系统程序和大部分应用程序的全局配置文件
│   ├init.d/        SystemV 风格的启动脚本
│   ├rcX.d/         SystemV 启动脚本的链接,定义运行级别
│   ├rc.d/          BSD 风格的启动脚本
│   ├rc.xxx         BSD 风格启动脚本,定义运行级别
│   ├network/       网络配置文件
│   ├X11/           图形界面配置文件
│
├usr/
│   ├bin/           应用程序
│   ├sbin/          管理员应用程序
│   ├lib/           应用程序库文件
│   ├share/         应用程序资源文件
│   ├src/           应用程序源代码
│   ├local/
│   │     ├soft/    用户程序
│   │     └.../     通常使用单独文件夹
│   ├X11R6/         图形界面系统
│
├var/               动态数据
│
├temp/              临时文件 

启动流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yuvdy2CD-1608126915258)(/Users/suyelu/工作/课程建设/课程设计方案/Linux/图片素材/OS启动顺序.jpg)]

  1. 按开机键
  2. 加载BIOS( 什么是BIOS,CMOS是什么)硬件信息,自检,并根据配置信息取得第一个可启动的设备
  3. 读取并执行第一个启动设备内MBR(什么是MBR)的boot loader。(grub等)
  4. 根据boot loader的设置加载kernel,kernel开始检测硬件,并加载驱动(kernel接手BIOS的工作)
  5. boot loader加载虚拟文件系统,并加载启动过程中需要的内核模块(USB,RAID,LVM,SCSI)
  6. 启动第一个进程init
  7. init启动终端getty
  8. 运行x windows系统

运行级别

运行级别即run level,Linux通过不同的run level来使用不同的服务启动系统,run level可以分为以下七种:

run level含义描述
0halt系统关机
1single user mode单用户模式,在系统出问题时维护用
2multi-user,without nfs多用户,纯文本模式,不包含NFS服务
3full multi-user mode完整的多用户纯文本模式
4unused系统保留
5X11在run level 3的基础上加载X windows
6reboot重启

对于run level机制的实现,现在有三种方式:

一种是传统的System V init

这种广为流传的方式至今仍被各种Linux distros所采用,在该方式下,init进程启动后第一时间就会读取文件**/etc/inittab**,该文件负责初始化系统,设置系统run level及执行各run level对应要执行的命令。

/etc/inittab文件的内容如下:

	#默认的启动级别
	id:5:initdefault:
	# System initialization.
  si::sysinit:/etc/rc.d/rc.sysinit
  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
  ###当运行级别为5时,以5为参数运行/etc/rc.d/rc脚本,init将等待其返回(wait)
  l5:5:wait:/etc/rc.d/rc 5
  l6:6:wait:/etc/rc.d/rc 6

  ###在启动过程中允许按CTRL-ALT-DELETE重启系统
  # Trap CTRL-ALT-DELETE
  ca::ctrlaltdel:/sbin/shutdown -t3 -r now
  # When our UPS tells us power has failed, assume we have a few minutes
  # of power left. Schedule a shutdown for 2 minutes from now.
  # This does, of course, assume you have powerd installed and your
  # UPS connected and working correctly.

  pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
  # If power was restored before the shutdown kicked in, cancel it.
  pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

  ###在2、3、4、5级别上以ttyX为参数执行/sbin/mingetty程序,打开ttyX终端用于用户登录,
  ###如果进程退出则再次运行mingetty程序(respawn)

  # Run gettys in standard runlevels
  1:2345:respawn:/sbin/mingetty tty1
  2:2345:respawn:/sbin/mingetty tty2
  3:2345:respawn:/sbin/mingetty tty3
  4:2345:respawn:/sbin/mingetty tty4
  5:2345:respawn:/sbin/mingetty tty5
  6:2345:respawn:/sbin/mingetty tty6

  ###在5级别上运行xdm程序,提供xdm图形方式登录界面,并在退出时重新执行(respawn)
  # Run xdm in runlevel 5
  x:5:respawn:/etc/X11/prefdm -nodaemon

在上面的inittab文件中,默认的启动级别是5,所以在执行完系统初始化之后,直接执行l5:5:wait:/etc/rc.d/rc 5其他行则略过。这一行会进入目录/etc/rc5.d,根据系统依赖关系遍历的执行里面的脚本和程序。

suyelu@HaiZei-Tech:/etc/rc5.d$ ll
total 12
drwxr-xr-x  2 root root 4096 Apr 23 12:56 ./
drwxr-xr-x 84 root root 4096 Apr 27 17:37 ../
lrwxrwxrwx  1 root root   18 Aug  9  2013 K01ondemand -> ../init.d/ondemand*
lrwxrwxrwx  1 root root   18 Aug  9  2013 K30pppd-dns -> ../init.d/pppd-dns*
lrwxrwxrwx  1 root root   15 Aug  9  2013 K50rsync -> ../init.d/rsync*
-rw-r--r--  1 root root  677 Jul 27  2012 README
lrwxrwxrwx  1 root root   20 Apr 23 12:56 S20agentwatch -> ../init.d/agentwatch*
lrwxrwxrwx  1 root root   22 Jun 12  2014 S20aliyun-rdate -> ../init.d/aliyun-rdate*
lrwxrwxrwx  1 root root   14 Jul 30  2013 S20nscd -> ../init.d/nscd*
lrwxrwxrwx  1 root root   17 Aug 14  2012 S20sysstat -> ../init.d/sysstat*
lrwxrwxrwx  1 root root   16 Aug 15  2013 S20udhcpd -> ../init.d/udhcpd*
lrwxrwxrwx  1 root root   16 Jun 12  2014 S20vsftpd -> ../init.d/vsftpd*
lrwxrwxrwx  1 root root   13 Aug 14  2012 S23ntp -> ../init.d/ntp*
lrwxrwxrwx  1 root root   19 Aug  6  2012 S70dns-clean -> ../init.d/dns-clean*
lrwxrwxrwx  1 root root   14 Aug 14  2012 S75sudo -> ../init.d/sudo*
lrwxrwxrwx  1 root root   17 Aug 16  2013 S80aegis -> /etc/init.d/aegis*
lrwxrwxrwx  1 root root   21 Aug  6  2012 S99grub-common -> ../init.d/grub-common*
lrwxrwxrwx  1 root root   18 Aug  6  2012 S99rc.local -> ../init.d/rc.local*

由以上我们可以看到/etc/rc5.d目录下的文件都是/etc/init.d里的程序的软链接,以S开头的是启动的意思,以K开头的是停止的意思,后两位数字是启动和停止的顺序,由系统依赖关系决定。

​ 执行完这些所有的程序之后,返回到inittab文件继续顺序执行,我们可以看到,这个文件中每一条命令都是一个格式,也就是利用**😗*分割的四个字段,我们把每个字段的意义说明如下:

id[标识符]:runlevels[系统运行级别]:action[process在一定条件下要执行的动作]:process[要启动程序]

id是每个登记项的标识符,用于唯一标识每个登记项,不能重复。

runlevels系统运行的级别,表示process的action要放在哪个或哪些级别上运行,数字直接相连,为空表示在所有级别上运行。

action表示对应登记项的process在一定条件下要执行的动作。

action描述
respawn启动并监视第4项指定的process,若process终止则重启它
wait执行第4项指定的process,并等待它执行完毕
once执行第4项指定的process
boot不论在哪个执行等级,系统启动时都会运行第4项指定的process
bootwait不论在哪个执行等级,系统启动时都会运行第4项指定的process,且一直等它执行完备
off关闭任何动作,相当于忽略该配置行
ondemand进入ondemand执行等级时,执行第4项指定的process
initdefault系统启动后进入的执行等级,该行不需要指定process
sysinit不论在哪个执行等级,系统会在执行boot 及bootwait之前执行第4项指定的process
powerwait当系统的供电不足时执行第4项指定的 process,且一直等它执行完毕
powerokwait当系统的供电恢复正常时执行第4项指定的process,且一直等它执行完毕
powerfailnow当系统的供电严重不足时执行第4项指定的process
ctrlaltdel当用户按下【Ctrl+Alt+Del】时执行的操作
kbrequest当用户按下特殊的组合键时执行第4项指定的process,此组合键需在keymaps文件定义

process要执行的脚本或命令,对于所有合法的shell程序都适用。

另一种是近几年提出的upstart方式

虽然目前采用upstart方式的Linux distros 并不多,但upstart方式旨在取代传统的system V init,可以说upstart是趋势。目前适用upstart方式的有Ubuntu(6.10 and later),Fedora(9.10 and later)和Debian。runlevel虽然也很重要,但是在使用upstart job的系统中,它对于服务的启动已不是关键所在。

Upstart job是事件驱动的,系统服务的启动、停止等等均是由事件决定的,反过来,系统服务的启动、停止也可以作为事件源触发其他服务。并且事件并不一定得由系统内部产生,用户可以手工的键入start/stop [Service]产生事件来启动/终止服务。man upstart-evnets查看upstart job所定义的事件,可以发现,runlevel也被当作事件来对待(因runlevel的改变而产生的事件),诸如此类还有其他如 startup,started,filesystem等等。那么系统服务又是如何知道自己应该什么时候启动,什么时候终止的呢?答案就在于/etc /init中(有的distros可能是在/etc/event.d)。进入/etc/init目录下一看,均是系统服务的配置文件,或者说,是job definition files。(实际上Upstart init只需要/etc/init这么一个目录,不像System V init,“拐弯抹脚”转好多圈才到达目的地,在性能上不如前者)。

suyelu@HaiZei-Tech:/etc/init$ cat ssh.conf
# ssh - OpenBSD Secure Shell server
#
# The OpenSSH server provides secure shell access to the system.

description	"OpenSSH server"

start on filesystem or runlevel [2345]
stop on runlevel [!2345]

respawn
respawn limit 10 5
umask 022

# 'sshd -D' leaks stderr and confuses things in conjunction with 'console log'
console none

pre-start script
    test -x /usr/sbin/sshd || { stop; exit 0; }
    test -e /etc/ssh/sshd_not_to_be_run && { stop; exit 0; }
    test -c /dev/null || { stop; exit 0; }

    mkdir -p -m0755 /var/run/sshd
end script

# if you used to set SSHD_OPTS in /etc/default/ssh, you can change the
# 'exec' line here instead
exec /usr/sbin/sshd -D

细心的同学可以看到,在/etc/init/ssh.conf文件中,直接配置了该服务在什么级别下运行和结束。

第三种是最新的systemd方式

Systemd 提供了比 UpStart 更激进的并行启动能力,采用了 socket / D-Bus activation 等技术启动服务。一个显而易见的结果就是:更快的启动速度。

为了减少系统启动时间,systemd 的目标是:

  • 尽可能启动更少的进程
  • 尽可能将更多进程并行启动

同样地,UpStart 也试图实现这两个目标。UpStart 采用事件驱动机制,服务可以暂不启动,当需要的时候才通过事件触发其启动,这符合第一个设计目标;此外,不相干的服务可以并行启动,这也实现了第二个目标。

下面的图形演示了 UpStart 相对于 SysVInit 在并发启动这个方面的改进:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fnbehfcU-1608126915260)(/Users/suyelu/工作/课程建设/课程设计方案/Linux/图片素材/upstartvsinit.jpg)]

Systemd 能够更进一步提高并发性,即便对于那些 UpStart 认为存在相互依赖而必须串行的服务,比如 Avahi 和 D-Bus 也可以并发启动。从而实现如下图所示的并发启动过程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FH2ISq3g-1608126915262)(/Users/suyelu/工作/课程建设/课程设计方案/Linux/图片素材/systemd.jpg)]

配置文件

全局配置文件

系统初始化
/etc/inittab运行级别、控制台数量
/etc/timezone时区
/etc/inetd.conf超级进程
文件系统
/etc/fstab开机时挂载的文件系统
/etc/mtab当前挂载的文件系统
用户系统
/etc/passwd用户信息
/etc/shadow用户密码
/etc/group群组信息
/etc/gshadow群组密码
/etc/sudoersSudoer 列表
Shell
/etc/shells可用 Shell 列表
/etc/inputrcReadLine 控件设定
/etc/zsh/zprofile用户首选项
/etc/zsh/zshrcbash 配置文件
系统环境
/etc/environment环境变量
/etc/updatedb.conf文件检索数据库配置信息
/etc/issue发行信息
/etc/issue.net
/etc/screenrc屏幕设定
网络
/etc/iftab网卡 MAC地址绑定
/etc/hosts主机列表
/etc/hostname主机名
/etc/resolv.conf域名解析服务器地址
/etc/network/interfaces网卡配置文件

用户配置文件

   $ZDOTDIR/.zshenv
   $ZDOTDIR/.zprofile
   $ZDOTDIR/.zshrc
   $ZDOTDIR/.zlogin
   $ZDOTDIR/.zlogout

环境变量

环境变量是作用在整个系统中的变量,很多软件工作的时候都需要读取环境变量的值来确定其工作方式,比如cd。

环境变量命名通常使用大写字母。$符后面加上环境变量的名称,系统将不会直接调用这个变量的字符串。

相关命令:env export

常见环境变量

PATH

HOME

SHELL

LANG

HISTSIZE

软件管理

软件管理方式

源码安装
git clone XXXX
cd XXX
make
make install
#mysql
软件包管理系统
apt-get intstall *

apt-get remove *

apt-get update *

apt-get upgrade *

apt-cache search *
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值