基本系统
目录结构
/ 根目录
│
├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)]
- 按开机键
- 加载BIOS( 什么是BIOS,CMOS是什么)硬件信息,自检,并根据配置信息取得第一个可启动的设备
- 读取并执行第一个启动设备内MBR(什么是MBR)的boot loader。(grub等)
- 根据boot loader的设置加载kernel,kernel开始检测硬件,并加载驱动(kernel接手BIOS的工作)
- boot loader加载虚拟文件系统,并加载启动过程中需要的内核模块(USB,RAID,LVM,SCSI)
- 启动第一个进程init
- init启动终端getty
- 运行x windows系统
运行级别
运行级别即run level,Linux通过不同的run level来使用不同的服务启动系统,run level可以分为以下七种:
run level | 含义 | 描述 |
---|---|---|
0 | halt | 系统关机 |
1 | single user mode | 单用户模式,在系统出问题时维护用 |
2 | multi-user,without nfs | 多用户,纯文本模式,不包含NFS服务 |
3 | full multi-user mode | 完整的多用户纯文本模式 |
4 | unused | 系统保留 |
5 | X11 | 在run level 3的基础上加载X windows |
6 | reboot | 重启 |
对于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/sudoers | Sudoer 列表 |
Shell
/etc/shells | 可用 Shell 列表 |
---|---|
/etc/inputrc | ReadLine 控件设定 |
/etc/zsh/zprofile | 用户首选项 |
/etc/zsh/zshrc | bash 配置文件 |
系统环境
/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 *