Linux

Table of Contents

1 内核

1.1 运行级别

用户态 执行一般任务,如数学计算
内核态 对硬件外设进行操作,如读取磁盘文件、发送网络数据

1.1.1 优势

  • 安全性:进程必须通过内核提供的系统调用来操作硬件,所以不用担心应用程序对硬件进行非法操作。
  • 简化开发模型:由于将底层的实现都封装在系统调用中,简化了用户态应用开发的难度。

1.1.2 切换

进程切换到内核态通常有两种方式:

  • 直接使用内核提供的系统调用(system call)。
  • 使用 C 库函数( libc )封装的系统调用,即 C API。

04.png

2 进程

2.1 信号

信号 动作 按键 描述
1 SIGHUP 挂起(hang up)    
2 SIGINT 终止(interrupt) Ctrl+C  
3 SIGQUIT 停止 Ctrl+\ 进行 core dump
9 SIGKILL 无条件终止   无法捕获、忽略
15 SIGTERM 终止   可以捕获、忽略
17 SIGSTOP 无条件停止   不终止
18 SIGTSTP 暂停(temporary stop) Ctrl+Z 不终止(程序保留在内存,可以从停止的位置继续)
19 SIGCONT 继续    

2.2 权限

  • 进程是作为特定用户和组运行的,核心进程通常作为 root 运行。
  • 为了安全性,子进程会进行「降级」,比如 Apache 主进程作为 root 运行,而子进程作为其他用户运行。

2.3 调度优先级

  • 系统内核将 CPU 时间轮流分配给每个进程,调度优先级决定分配给进程的时间总量。
  • 数值为从 -20(最高) 到 +20(最低) 的整数。默认所有进程都以相同的优先级 0 启动。

2.4 系统调用

fork  
exec 通知内核执行一个程序,这个程序将会替代正在被调用的程序。
  新程序执行完成后,难以返回之前的程序。

3 文件系统

3.1 Glob

Shell 通过简单模式匹配文件和目录名的方式称为 globbing,Shell 将包含 glob 的参数替换为匹配的文件和目录名,这个过程称为扩展(expansion)。Shell 进行扩展是在运行具体命令之前,即 Shell 将扩展的结果作为参数传递给命令。

$ echo .bash*
.bash_history  .bash_logout  .bashrc
$ echo .bash'*'
.bash*
$ echo notfound*
notfound*
$ echo .*
. .. .file
$ echo .[^.]*
.file
$ echo .??*
.file

3.2 Inode

03.png

3.3 常用

/
    bin/   # GNU 用户级工具
    boot/  # 启动文件
    dev/   # 设备节点
    etc/   # 系统配置文件
        group
        hosts
        inittab  # 系统运行级
        password
        profile
        shadow   # 密码
    home/  # 用户目录
    lib/   # 系统和应用程序的库文件
    media/ # 可移动媒体设备挂载点
    mnt/   # 可移动媒体设备挂载点
    opt/   # 可选软件包
    proc/
        loadavg # 系统负载和进程队列数据
        meminfo # 内存使用数据
    root/  # 根主目录
    sbin/  # GNU 管理员级工具
    tmp/   # 临时文件
    usr/   # 用户安装程序
        bin/       # 系统程序
        etc/       # 附加程序
        local/bin/ # 自定义命令和脚本
        share/
            dict/words # 字典文件
    var/   # 可变文件,如日志

4

4.1 输入

Ctrl+D 表示文件结束符。

5 用户、组

  • 用户属于一个 primary 组,多个 secondary 组。
  • 新建的用户默认属于与其同名的组。
  • 新建的文件、目录默认属于创建者和创建者所属的组。

5.1 /etc/passwd

存储已创建的用户的信息。

<user>:<password>:<uid>:<gid>:<info>:<home_dir>:<shell>
    <password> # x 表示加密密码

# 示例
root:x:0:0:root:/root:/bin/bash
ubuntu:x:1001:1001:Ubuntu:/home/ubuntu:/bin/bash

6 权限

  文件 目录
r 读文件 读目录内容
w 写、删除文件 新建、重命名文件
    新建、重命名、删除子目录
x 执行文件 进入( cd )目录
  • 执行脚本语言文件必须同时有 r 权限。

6.1 Umask

  Read Write Execute
0
1  
2  
3    
4  
5    
6    
7      
$ umask
0002
$ touch tmp
-rw-rw-r-- ...
$ mkdir tmp
drwxrwxr-x ...

6.2 Sticky Bit

目录设置 sticky bit 后,目录下新建的文件和目录会继承此目录的所属组。

$ mkdir foo
drwxrwxr-x ... root root ... foo/
$ chgrp foo foo
drwxrwxr-x ... root foo ... foo/
$ chmod g+s foo                  # 设置 sticky bit
drwxrwsr-x ... root foo ... foo/ # 组权限变为 rws
$ cd foo
$ touch bar
-rw-rw-r-- ... root foo ... bar  # 继承所属组 foo

7 启动

7.1 运行级

0 关机
1 单用户模式
2 多用户模式(无网络)
3 多用户模式(全功能)
4 可定义用户
5 多用户模式(网络,图形化 X Window)
6 重启

不同的运行级启动不同的程序和脚本。

/etc/inittab 中列出系统的运行级,开机过程中会被读取。

7.2 开机运行

/etc/rc<n>.d # n 为运行级,rc = run commands
/etc/init.d
/etc/init.d/rc.d
/etc/init.d/rc.local
/etc/init.d/boot.local
/etc/rc.d/rc.local
/etc/rc.local

7.3 Shell 登录运行

~/.bash_profile 登录时(交互式 login 方式)运行一次
~/.bashrc 登录时及每次打开新 shell 时(交互式 non-login 方式)运行
~/.bash_logout shell 退出时运行

8 Shell

8.1 命令

    示例
内部命令 不需要单独的进程来运行 cd
外部命令 需要创建(fork)和执行一个子进程 /bin/ls
  对应 /bin/usr/bin 下的程序  

Sorry, your browser does not support SVG.

8.2 变量

Shell 变量 专属于 Shell 的临时变量,不能被 Shell 运行的命令使用。
环境变量 操作系统将 Shell 环境变量传递给 Shell 运行的命令。

8.2.1 Shell 变量

$ <NAME>=<value>
$ echo $<NAME>

8.2.2 环境变量

$ <NAME>=<value>
$ export <NAME>

8.2.3 环境变量列表

HOME Home 目录
PATH 命令搜索路径

8.3 快捷键

Ctrl A 移动到行首
Ctrl E 移动到行尾
Ctrl W 剪切前一个词
Ctrl U 剪切行首到光标位置
Ctrl K 剪切光标位置到行尾
Ctrl Y 粘贴

9 环境

9.1 用户配置

~/.bashrc 登录时自动运行,用于设定自定义环境变量等
~/.profile  
~/.bash_profile  

9.1.1 .bashrc

if [ "x${SSH_TTY}" != "x" ]; then
    chage -l <account> | grep "Account expires" | tr -d "\t"
fi

10 发行版

02.png

11 链接

Author: Victor Chen

Created: 2019-04-13 Sat 17:37

Validate