# Linux 架构体系

# Unix/Linux 的体系架构

linux

linux

# Linux 系统体系结构

linux

# windows 架构体系

linux

linux

# Linux 常见目录

目录 作用
/bin 存放二进制可执行⽂件(ls,cat,mkdir 等),常⽤命令⼀般都在这里。
/etc 存放系统管理和配置文件。
/home 存放所有⽤户⽂件的根目录,是用户主目录的基点,⽐如用户 user 的主目录就是 /home/user,可以⽤ ~user 表示
/usr ⽤于存放系统应用程序,⽐较重要的目录有:/usr/local 是本地系统管理员软件安装目录 (安装系统级的应用),这是最庞大的目录,要⽤用到的应⽤程序和⽂件⼏乎都在这个⽬录。/usr/x11r6 存放 x window 系统的目录。/usr/bin 存放众多的应⽤程序。/usr/sbin 存放超级⽤户的⼀些管理程序。/usr/doc 存放 linux 文档。/usr/include 存放 linux 下开发和编译应用程序所需要的头文件。usr/lib 存放常⽤的动态链接库和软件包的配置⽂件。/usr/man 存放帮助文档。/usr/src 存放源代码,linux 内核的源代码就放在 /usr/src/linux 里。/usr/local/bin 存放本地增加的命令。/usr/local/lib 存放本地增加的库。
/opt 额外安装的可选应⽤程序包所放置的位置。一般情况下,我们可以把 tomcat 等都安装到这里。
/proc 虚拟⽂件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/root 超级⽤户(系统管理员)的主目录。
/sbin 存放⼆进制可执⾏⽂件,只有 root 才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如 ifconfig 等。
/dev ⽤于存放设备⽂件。
/mnt 系统管理员安装临时⽂件系统的安装点,系统提供这个⽬录是让用户临时挂载其他的⽂件系统。
/boot 存放⽤于系统引导时使用的各种⽂件。
/lib 存放跟文件系统中的程序运行所需要的共享库及内核模块。共享库又叫动态链接共享库,作用类似 windows 里的 .dll 文件,存放了根⽂文件系统程序运行所需的共享文件。
/tmp ⽤于存放各种临时文件,是公⽤的临时文件存储点。
/var ⽤于存放运行时需要改变数据的⽂件,也是某些⼤文件的溢出区,⽐方说各种服务的⽇志文件、系统启动⽇志等等。
/lost+found 这个⽬录平时是空的,系统⾮正常关机⽽留下“⽆家可归”的文件(windows 下叫什么 .chk)就在这里。

# Linux 常用命令

Linux 命令搜索引擎 (opens new window)

# 命令基本格式

📌 1. 命令提示符

[root@xiaoming~]#
1
  • root 当前登录⽤户

  • localhost 主机名

  • ~ 当前⼯作目录,默认是当前⽤户的家⽬录,root 就是 /root,普通用户是 /home/ 用户名

  • 提示符,超级用户是 #,普通用户是 $

📌 2. 命令格式

  • 命令[选项][参数]

  • 当有多个选项时,可以写在⼀起

  • 一般参数有简化和完整写法两种,-a--all 等效

# ls

  • 查询⽬录中的内容

  • ls [选项][⽂件或者目录]

  • 所有选项

选项 作用
-a 显示所有文件,包括隐藏⽂件
-l 显示详细信息
-d 查看目录本身的属性⽽非子文件 ls /etc/
-h 人性化的方式显示⽂件⼤小
-i 显示inode,也就是 i 节点,每个节点都有 ID 号
  • -l 显示详细信息
drwxr-xr-x . 1 root root 800 Sep 16 00:19 logs
1
drwxr-xr-x . 1 root root 800 Sep 16 00:19 logs
文件类型和权限 ACL 权限 硬链接引用计数 所有者 所属组 文件大小 最后修改时间 文件名

文件类型和权限

-rw-r--r--
1
  • ⽂件类型:- ⽂件、d 目录、l 软链接文件

  • u(所有者)、g(所属组)、o(其他人)

  • r(read)读取、w(write)写入、x(execute)执行

# ln

# 创建一个指向文件或目录的软链接
ln -s file1 lnk1

# 创建一个指向文件或目录的物理链接(硬链接)
ln file1 lnk1
1
2
3
4
5

📌 1. 软连接的特征

  • 类似 Windows 快捷方式

  • 软链接拥有自己的 i 节点和 Block 块,但是数据块中只保存源文件的⽂件名和 i 节点号,并没有实际的文件数据

  • 软链接的文件权限都是 777(lrwxrwxrwx)

  • 修改任意⼀个文件,另⼀个都会改变

  • 删除源文件,软链接不能使⽤

  • 软链接源⽂件必须写绝对路径

📌 2. 硬链接的特征

  • 拥有相同的 i 节点和存储 block 块,可以看作是同一个⽂件

  • 可以通过 i 节点访问

  • 不能跨分区

  • 不能针对目录使⽤

  • ⼀般不使用

# locate

# 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令
locate \*.ps
1
2
  • 在后台数据库中按文件名搜索,速度比较快

  • 数据保存在 /var/lib/mlocate 后台数据库,每天更新一次

  • 可以用 updatedb 命令⽴刻更新数据库

  • 只能搜索文件名

  • 建⽴索引的配置文件

/etc/updatedb.conf
1

PRUNE_BIND_MOUNTS = "yes" 全部生效,开启搜索限制

PRUNEFS 不搜索的文件系统

PRUNENAMES 忽略的文件类型

PRUNEPATHS 忽略的路径 /tmp

# whereis

  • 搜索命令所在路径以及帮助文档所在位置

  • whereis 命令名

whereis ls
1
  • -b 只查找可执行⽂件

  • -m 只查找帮助文件

# which

  • 可以看到别名,如 which ls

  • 能看到的都是外部安装的命令

  • ⽆法查看 Shell ⾃带的命令,如 which cd

# 环境变量

echo $PATH
1
  • 定义的是系统搜索命令的路径

  • /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

# find

  • 文件搜索命令

  • find [搜索范围][搜索条件]

📌 1. 按名称搜索

  • 避免⼤范围的搜索,会非常消耗系统资源
find / -name aaa.log
1

📌 2. 通配符

  • find 是在系统当中搜索符合条件的⽂件名,如果需要匹配,使用通配符匹配,通配符是完全匹配

  • 通配符

* 匹配任意内容

? 匹配任意⼀个字符

[] 匹配任意一个中括号内的字符

find . -name "ab[cdef]"
1

📌 3. -i

  • 不区分⼤小写
find / -iname A.log
1

📌 4. -user

  • 按所有者进行搜索
find /root -user root
find /root -nouser
1
2

📌 5. 按时间搜索

find /nginx/access.log -mtime +5
1
参数 含义
atime ⽂件访问时间
ctime 改变⽂件属性
mtime 修改文件内容
参数 含义
-5 5天内修改的⽂件
5 5天前当前修改的文件
+5 5天前修改的⽂件

📌 6. 按⼤小搜索

  • k 小写,M 大写
find . -size 100k
1
参数 含义
-8k 小于8K
8k 等于8K
+8k ⼤于8K

📌 7. 按 i 节点搜索

find . -inum 123456
1

📌 8. 综合应⽤

find /tmp -size +10k -a -size -20k
1
  • 查找 /tmp 目录下,⼤于 10KB 并且小于 20KB 的文件

  • -a,and 逻辑与,两个条件都满⾜

  • -o,or 逻辑或,两个条件满⾜一个就可以

find /tmp -size +10k -a -size -20k -exec ls -lh {} \
1
  • exec 对上个命令的结果进行操作

# grep

  • 在⽂件当中匹配符合条件的字符串
grep "10" access.log
1
  • -i,忽略⼤小写

  • -v,排除指定字符串

注意

  • find 命令,在系统当中搜索符合条件的⽂件名,如果需要匹配,使⽤通配符匹配,通配符是完全匹配

  • grep 命令,在⽂件当中搜索符合条件的字符串,如果需要匹配,使⽤正则表达式进行匹配,正则表达式是包含匹配

# 命令帮助

📌 1. whatis

  • whatis 可以查看某个命令的简短帮助信息。
whatis ls
1

📌 2. help

  • help 命令用于显示 shell 内部命令的帮助信息。而对于外部命令的帮助信息只能使用 man 或者 info 命令查看。
help ls
1
# -s:输出短格式的帮助信息。仅包括命令格式。
help -s ls
1
2

📌 3. info

📌 4. man

  • man 命令是 Linux 下最核心的命令之一。而 man 命令也并不是英文单词 “man” 的意思,它是单词 manual 的缩写,即使用手册的意思。

  • man 命令会列出一份完整的说明。 其内容包括命令语法、各选项的意义及相关命令 。更为强大的是,不仅可以查看 Linux 中命令的使用帮助,还可以查看软件服务配置文件、系统调用、库函数等帮助信息。

  • man 手册页文件存放在 /usr/share/man 目录下。

  • 常用参数

参数 含义
-a 在所有的 man 帮助手册中搜索
-d 主要用于检查,如果用户加入了一个新的文件,就可以用这个参数检查是否出错
-f 显示给定关键字的简短描述信息
-p 指定内容时使用分页程序
-M 指定 man 手册搜索的路径
-w 显示文件所在位置
  • 快捷键
快捷键 含义
q 退出
Enter 按行下翻
Space 按页下翻
b 上翻一页
/字符串 在手册页中查找字符串
  • 使用示例

查看 cp 命令的帮助信息:

man cp
1

查看 /etc/passwd 文件的信息:

man /etc/passwd
1

查看 passwd 命令所在位置:

man -w passwd
1

查看 /etc/passwd 文件手册页所在位置:

man -w 5 passwd
1

# 进程管理

📌 1. top

📌 2. ps

  • ps (opens new window)(英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。

📌 3. kill、killall、pkill

# 网络管理

📌 1. ifconfig、ip

  • ifconfig (opens new window) 命令用于显示或设置网络设备。

  • ip (opens new window) 命令与 ifconfig 命令类似,但比 ifconfig 命令更加强大,主要功能是用于显示或设置网络设备。ip 命令是 Linux 加强版的的网络配置工具,用于代替 ifconfig 命令。

📌 2. traceroute

📌 3. netstat、ss

  • netstat (opens new window) 命令用于显示网络状态。

  • ss (opens new window) 命令 Socket Statistics 的缩写。顾名思义,ss 命令可以用来获取 socket 统计信息,它可以显示和 netstat 类似的内容。ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比 netstat 更快速更高效。

  • 这两个命令都可以用来找到占用网络端口的进程。

# 服务管理

📌 1. systemctl

# 命令行下载

📌 2. curl

  • curl (opens new window) 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。

📌 3. wget

# 压缩和解压缩

参考 Linux 常用命令大全(简版) (opens new window)

  • gzip
命令 示例 含义
gzip 源⽂件 gzip a.txt 压缩为 .gz 格式的压缩⽂件,源⽂件会消失
gzip -c 源⽂件 > 压缩⽂件 gzip -c yum.txt >yum.txt.gz 压缩为.gz格式的压缩⽂件,源⽂件不会消失
gzip -r ⽬录 gzip -r xx 压缩⽬录下的所有⼦⽂件,但是不压缩⽬录
gzip -d 压缩⽂件名 gzip -d yum.txt.gz 解压缩⽂件,不保留压缩包
gunzip 压缩⽂件 gunzip yum.txt.gz 解压缩⽂件,不保留压缩包
  • .bz2 格式压缩
命令 示例 含义
bzip2 源⽂件 bzip2 1.txt 压缩为 .bz2 格式的⽂件,不保留源⽂件
bzip2 -k 源⽂件 bzip2 -k 1.txt 压缩为 .bz2 格式的⽂件,保留源⽂件
bzip2 -d 压缩⽂件名 bzip2 -d 1.txt.bz2 解压压缩包
bunzip2 压缩⽂件名 bunzip2 1.txt.bz2 解压压缩包
  • tar

tar -cvf 打包⽂件名 源文件

tar -cvf book.tar book
1

-c 打包

-v 显示过程

-f 指定打包后的⽂件名

x 解打包

tar -xvf book.tar
1

# 关机和重启

📌 1. shutdown

shutdown 关机命令

  • -c 取消前⼀个关机命令

  • -h 关机

  • -r 重启

📌 2. init

  • 关机
init 0
1
  • 重启
init 6
1

系统的运行级别

  • 0 关机

  • 1 单⽤户

  • 2 不完全多用户,不包含 NFS 服务

  • 3 完全多⽤户

  • 4 未分配

  • 5 图形界⾯

  • 6 重启

📌 3. logout

退出登录

# 查看登录用户信息

📌 1. w

查看登录⽤户信息

USER TTY FROM LOGIN IDLE JCPU PCPU WHAT
登录的用户名 登录的终端:tty1 本地终端,pts/0 远程终端 登录的 IP 登录时间 ⽤户闲置时间 该终端所有进程占用的时间 当前进程所占用的时间 正在执⾏的命令

📌 2. who

查看登录用户信息

USER TTY LOGIN
登录的⽤用户名 登录的终端:tty1 本地终端,pts/0 远程终端 登录时间(登录的IP)

📌 3. last

查看当前登录和过去登录的⽤户信息,默认读取 /var/log/wtmp 文件

  • 用户名

  • 登录终端

  • 登录IP

  • 登录时间

  • 退出时间(在线时间)

📌 4. lastlog

查看所有用户的最后⼀次登录时间

  • ⽤户名

  • 登录终端

  • 登录IP

  • 最后⼀次登录时间

# 其他命令

# shell

  • shell 是⼀个命令行解释器,它为用户提供了⼀个向 Linux 内核发送请求以便运行程序的界⾯系统级程序。

  • ⽤户可以用 Shell 来启动、挂起、停止或者编写一些程序。

  • Shell (opens new window) 还是⼀个功能相当强⼤的编程语言,易编写,易调试,灵活性较强。

  • Shell 是解释执⾏的脚本语言,在 Shell 中可以直接调用 Linux 系统命令。

# 查看⽀持的shell

/etc/shells
1

# echo

  • 输出命令

  • -e ⽀持反斜线控制的字符转换

控制字符 作⽤
\a 输出警告⾳
\b 退格键,也就是向左删除键
\n 换⾏符
\r 回⻋键
\t 制表符,也就是 Tab 键
\v 垂直制表符
\0nnn 按照八进制 ASCII 码表输出字符,其中 0 为数字零,nnn 是三位八进制数
\xhh 按照⼗六进制 ASCII 码表输出字符,其中 hh 是两位⼗六进制数
echo -e "\a"
1

# 编写执行 shell

#!/bin/bash
echo -e "\e[1;34mhelloworld\e[0m"
1
2

赋予执行权限,直接运⾏

chmod 755 hello.sh
./hello.sh
1
2

通过 Bash 调⽤执行脚本

bash hello.sh
1

# 别名(alias)

  • 查看已设置的别名
alias
1
  • 设置别名
alias rm="rm -i"
1
  • 默认情况下是临时生效的,如果想一直可用,可以将别名写入环境变量配置⽂件 ~/.bashrc 中。

打开该文件,输入要设置的别名

vi ~/.bashrc
1

保存,然后执行

source ~/.bashrc
1
  • 删除别名
unalias rm
1

# 命令的生效顺序

  1. 绝对路径或者相对路径

  2. 别名

  3. bash 内部命令

  4. 按照 $PATH 环境变量定义的目录查找顺序找到的第⼀个命令

# 命令快捷键

命令 含义
ctrl+c 强制终⽌当前命令
ctrl+l 清屏
ctrl+a 光标移动到命令行⾸
ctrl+e 光标移动到命令行尾
ctrl+u 从光标所在的位置删除到⾏⾸
ctrl+z 把命令放入后台
ctrl+r 在历史命令中搜索
ctrl+s 暂停屏幕输出
ctrl+q 恢复屏幕输出

提示

如果在终端里不小心按了 ctrl+s,可以按 ctrl+q 恢复输出。

# 历史命令

  • history [选项][历史命令保存⽂文件]

  • 选项

选项 含义
-c 清空历史命令
-w 把缓存中的历史命令写入历史命令保存文件~/.bash_history
  • 默认保存 1000 条,/etc/profile,HISSIZE=10000

# 调用

  • 使⽤上下箭头调⽤以前的历史命令

  • 使用 !n 重复执行第 n 条历史命令

  • 使用 !! 重复执行上⼀条命令

  • 使⽤ !字符 重复执行最后一条以该字符串开头的命令

# 管道符号

📌 1. 多命令顺序执行

  • ; 分号,没有任何逻辑关系的连接符。当多个命令用分号连接时,各命令之间的执行成功与否彼此没有任何影响,都会一条一条执行下去。

  • || 逻辑或,当⽤此连接符连接多个命令时,前⾯的命令执行成功,则后⾯的命令不会执行。前⾯的命令执行失败,后⾯的命令才会执⾏。

  • && 逻辑与,当用此连接符连接多个命令时,前⾯的命令执行成功,才会执行后⾯的命令,前⾯的命令执行失败,后面的命令不会执行,与 || 正好相反。

  • | 管道符,当⽤此连接符连接多个命令时,前⾯命令执行的正确输出,会交给后⾯的命令继续处理。 若前面的命令执⾏失败,则会报错,若后⾯面的命令⽆法处理前⾯命令的输出,也会报错。

date;ls
ls && echo yes || echo no
1
2

📌 2. 管道符号

  • 命令1的正确输出会作为命令2的操作对象。

  • 命令1|命令2

ls /etc/ | more
netstat -an | grep ESTABLISHED | wc -l
1
2

📌 3. 通配符

匹配文件名和⽬录名

通配符 作用
? 匹配⼀个任意字符
* 匹配0个或任意字符,也就是可以匹配任意内容
[] 匹配中括号中任意⼀个字符
[-] 匹配中括号中任意⼀个字符,- 代表范围
[^] 匹配不是中括号中的⼀个字符

📌 4. 其它符号

符号 作用
'' 单引号。在单引号中所有的特殊符号,如 $ 和 ` 都没有特殊含义
"" 双引号,在双引号里特殊符号都没有特殊含义,但是 $ ` 例外,拥有调⽤变量值,引⽤命令和转义的含义
`` 反引号,扩起来的是系统命令
$() 和反引号⼀样
# 在 shell 脚本中,# 开头的行代表注释
$ ⽤于调用变量的值
|转义符号
a=`ls`
b=$(ls)
1
2

# vi 编辑器

  • VI visual interface(可视化接⼝)

  • 类似于 windows 中的记事本

  • vim 支持多级撤销

  • 跨平台

  • 语法⾼亮

  • ⽀持图形界⾯

# 操作模式

  • :w 保存

  • :q 退出

  • :! 强制保存

  • :ls 列出所有的⽂件

  • :n 下⼀个

  • :N 上⼀个

  • :15 跳转到指定行

  • /xxx 从光标位置开始向后搜索 xxx 字符串

  • ?xxx 从光标位置开始向前搜索 xxx 字符串

# 用户和⽤户组

  • 使用操作系统的人都是用户

  • ⽤户组是具有相同系统权限的⼀组用户

# 用户组

📌 1. /etc/group

  • /etc/group 存储当前系统中所有⽤户组信息
# 组名称:组密码占位符:组编号:组中⽤用户名列列表
group:x:123:abc,def
1
2
  • root 组编号为0

  • 1-499 系统预留的编号,预留给安装的软件和服务的

  • ⽤户⼿动创建的用户组从 500 开始

  • 组密码占位符都是 x

📌 2. /etc/gshadow

  • 存放当前系统中⽤户组的密码信息

  • 和 group 中的记录⼀一对应

# 组名称:组密码:组管理者:组中⽤户名
Group:*: :abc
1
2

📌 3. /etc/passwd

  • 存储当前系统中所有用户的信息
# ⽤户名:密码占位符:⽤户编号:用户注释信息:用户主目录:shell 类型
user:x:123:456:xxxxx:/home/user:/bin/bash
1
2

📌 4. /etc/shadow

  • 存放当前系统中所有用户的密码信息
# ⽤户名:密码:
user:xxx::::::
1
2

# 用户操作

# 添加组

groupadd student
1

# 修改组名称

groupmod -n stu student
1

# 修改组编号

groupmod -g 111 stu
1

# 添加分组并指定编号

groupadd -g 222 teacher
1

# 删除分组

groupdel 222
1

# 添加分组

groupadd teacher
1

# 为⽤户指定所属组

useradd -g teacher zhangsan
1

# 为⽤户指定工作⽬录

useradd -d /home/zhangsan zhangsan
1

# 指定注释

usermod -c iamateacher zhangsan
1

# 修改⽤户名

usermod -l zhangsan zhangsan2
1

# 删除用户

userdel zhangsan2
1

# 删除所属⽂件夹

userdel -r lisi
1

# ⽤户命令

# 显示登录的用户名

whoami
1

# 显示指定用户信息,包括用户编号,⽤户名,主要组的编号及名称,附属组列表

id zhangsan
1

# 显示 zhangsan ⽤户所在的所有组

groups zhangsan
1

# 显示用户详细资料

finger zhangsan
1

# 系统启动

# BIOS

  • 计算机通电后,第⼀件事就是读取刷⼊ ROM 芯片的开机程序,这个程序叫做BIOS(Basic Input/Output System)

# 硬件⾃检

  • BIOS 程序首先检查,计算机硬件能否满⾜运行的基本条件,这叫做硬件自检(Power-On Self-Test)

  • 如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出 CPU、内存、硬盘等信息。

# 启动顺序

  • 硬件⾃检完成后,BIOS 把控制权转交给下一阶段的启动程序。

  • 这时,BIOS 需要知道,"下一阶段的启动程序"具体存放在哪⼀个设备。

  • BIOS 需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做启动顺序(Boot Sequence)

  • BIOS 按照"启动顺序",把控制权转交给排在第一位的储存设备。

  • 这时,计算机读取该设备的第一个扇区,也就是读取最前面的 512 个字节。如果这 512 个字节的最后两个字节是 0x550xAA,表明这个设备可以用于启动;如果不是,表明设备不能⽤于启动,控制权于是被转交给"启动顺序"中的下一个设备。

  • 这最前⾯面的 512 个字节,就叫做主引导记录(Master boot record,缩写为 MBR)

# 主引导记录的结构

"主引导记录"只有 512 个字节,放不了太多东西。它的主要作用是,告诉计算机到硬盘的哪一个位置去找操作系统。

  • 第 1-446 字节:是用来记录系统的启动信息的,调⽤操作系统的机器码。

  • 第 447-510 字节(64个字节):分区表(Partition table),分区表的作用,是将硬盘分成若⼲个区。

  • 第 511-512 字节:主引导记录签名(0x55 和 0xAA)。

# 分区表

  • 磁盘分区是使用分区编辑器在磁盘上划分几个逻辑部分。

  • 磁盘⼀旦划分成多个分区,不同类的目录与文件可以存储进不同的分区内。

  • "主引导记录"因此必须知道将控制权转交给哪个区。

  • 分区表的⻓度只有 64 个字节,⾥面⼜分成四项,每项 16 个字节。所以,一个硬盘最多只能分四个一级分区,⼜叫做"主分区"。

    第 1 个字节:如果为 0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区⾥面只能有⼀个是激活的。

    第 2-4 个字节:主分区第⼀个扇区的物理位置(柱⾯、磁头、扇区号等等)。

    第 5 个字节:主分区类型,⽐如 FAT32、NTFS 等。

    第 6-8 个字节:主分区最后一个扇区的物理位置。

    第 9-12 字节:该主分区第⼀个扇区的逻辑地址。

    第 13-16 字节:主分区的扇区总数。

# 硬盘启动

  • 计算机的控制权就要转交给硬盘的某个分区了。

  • 四个主分区⾥面,只有⼀个是激活的。计算机会读取激活分区的第⼀个扇区,叫做卷引导记录(Volume boot record,缩写为 VBR)

# 操作系统

  • 控制权转交给操作系统后,操作系统的内核⾸先被载⼊内存。

  • 以 Linux 系统为例,先载入 /boot ⽬录下⾯的 kernel 。内核加载成功后,第一个运行的程序是 /sbin/init 。它根据配置文件(Debian 系统是 /etc/initab)产生 init 进程。这是 Linux 启动后的第一个进程,pid 进程编号为1,其他进程都是它的后代。

  • 然后,init 线程加载系统的各个模块,⽐如窗⼝程序和⽹络程序,直至执行 /bin/login 程序, 跳出登录界面,等待用户输入用户名和密码。

# Linux 文件权限

在 Linux 系统中,文件或目录的权限分为以下几种:

权限表示 权限说明
r:4
w:2
x:1 执行
-:0 无权限
  • rwx = 4 + 2 + 1 = 7 (可读可写执行)

  • rw = 4 + 2 = 6 (可读可写不可执行)

  • rx = 4 + 1 = 5 (可读不可写可执行)

  • 一般表示文件权限时,常用三位数字表示,比如最高权限 777。其中,第一个数字表示当前文件的拥有者的权限,第二个数字表示当前文件的所属组(同组用户)的权限,第三个数字表示当前文件的组外用户权限

  • 不过,当我们在终端里查看文件权限时,看到的会是这样表示的:drwxrwxrwx。其中,最前面一位表示的是文件类型,后面九位分为三块,分别对应数字表示的三位数字。

文件类型 含义
d 目录(directroy)
- 文件(regular file)
s 套字文件(socket)
p 管道文件(pipe)或命名管道文件(named pipe)
l 符号链接文件(symbolic link)
b 该文件是面向块的设备文件(block-oriented device file)
c 该文件是面向字符的设备文件(charcter-oriented device file)

# Linux 配置免密登录

正常我们想访问服务器,是需要输入密码的。

linux

免密登录就是让我们省去输入密码这一步,直接就能访问服务器。

# 免密登录原理

  • ssh 的前身就是 telnet 协议,ssh 就包含了 ssl 协议。ssh 和 ssl 的关系就跟 HTTPS 和 HTTP 的关系一样。ssh 就是带加密的 telnet 协议。

  • 使用通过 ssh 协议生成的非对称加密秘钥进行连接,同步公钥到服务端,每次请求的服务器时,服务器验证是否存在公钥,会使用公钥加密一段信息传输到客户端,客户端再使用配对的私钥解密进行验证,从而验证客户端登录。

# 详细流程

  • 在客户端使用 ssh-keygen 生成一对密钥:公钥 + 私钥

  • 将客户端公钥追加到服务端的 authorized_key 文件中,完成公钥认证操作

  • 认证完成后,客户端向服务端发起登录请求,并传递公钥到服务端

  • 服务端检索 authorized_key 文件,确认该公钥是否存在

  • 如果存在该公钥,则生成随机数R,并用公钥来进行加密,生成公钥加密字符串 pubKey(R)

  • 将公钥加密字符串传递给客户端

  • 客户端使用私钥解密公钥加密字符串,得到 R

  • 服务端和客户端通信时会产生一个会话 ID(sessionKey),用 MD5 对 R 和 SessionKey 进行加密,生成摘要(即 MD5 加密字符串)

  • 客户端将生成的 MD5 加密字符串传给服务端

  • 服务端同样生成 MD5(R,SessionKey) 加密字符串

  • 如果客户端传来的加密字符串等于服务端自身生成的加密字符串,则认证成功

  • 此时不用输入密码,即完成建连,可以开始远程执行 shell 命令了

# 生成密钥对

ssh-keygen 用于生成公钥和私钥。常用的参数如下:

  • -t: 指定生成密钥类型(rsa、dsa)。默认为rsa

  • -f: 指定存放私钥的文件,公钥文件名为私钥文件名加 .pub 后缀。默认为 id_rsa

  • -P: 指定 passphrase(私钥的密码),用于确保私钥的安全。默认为空

  • -C: 备注。默认为 user@hostname

# 生成的密钥对存放在 /Users/apple/.ssh 目录下
ssh-keygen -t rsa -C "you_set_name" -f "you_set_name_rsa"
1
2

# 上传配置公钥

ssh-copy-id 用于将公钥上传到服务器的 /root/.ssh/authorized_keys 文件中。

ssh-copy-id -i you_set_name_rsa.pub root@服务器ip/域名
1

在这一步中,一开始我用的是服务器的私网 IP:172.18.238.35。结果一直出现以下问题:

linux

试着 ping 一下发现 ping 不通。后来换成了公网 IP:120.78.199.123。就可以了。

linux

此时,在服务器中查看 authorized_keys 文件的内容就发现已经有我们上传的公钥了。

cat ~/.ssh/authorized_keys
1

linux

注意

配置公钥文件的访问权限是 600,即 -rw-------

# 配置本地私钥

现在,我们就可以通过指定私钥的方式来登录服务器了。如果想退出服务器,直接输入 exit 命令然后回车就行了。

ssh -i id_rsa root@服务器ip/域名
1

linux

但是,由于我之前在自己本地生成私钥的时候设置了访问密码,所以现在还得输入密码。要配置免密登录的话得把这个密码给去掉。

更改本地私钥的访问密码的方法如下:

  • 在终端下输入 ssh-keygen -p

  • 系统会提示选择需要修改的私钥,在我的电脑上默认是 /var/root/.ssh/id_rsa。

  • 选好文件后按回车,会提示输入旧密码。

  • 输入好后会提示输入新密码。

  • 连续两次回车,之前设置的私钥密码就被清除了。

linux

再次访问服务器可以看到,可以直接登录了,不需要再输入密码。

linux

  • 进入到 home 目录下的 .ssh 目录中,通过以下命令将私钥复制一份到这里。
sudo cp /var/root/.ssh/id_rsa id_rsa
1

注意

配置私钥文件的访问权限是 600,即 -rw-------

# 配置免密登录功能的本地配置文件

上面我们虽然已经实现了 Linux 免密登录,但是需要我们输入的那行命令还是有点太长了。我们可以通过配置免密登录功能的本地配置文件来缩短这行命令。

  • 编辑自己的 home 目录下(也就是路径显示为 ~)的 .ssh 目录中的 config 文件。默认情况下,.ssh 目录中要么为空,要么只有以下内容。其中 known_hosts 文件是你在第一次登录任何服务器的时候生成的文件。因此,我们需要在这里面创建一个 config 文件:touch config

linux

注意

配置 config 文件的访问权限为 644,即 -rw-r--r--

  • 免密配置文件 config 的模版如下:
# 多主机配置,适用于同一个私钥给多台服务器使用的情况
Host gateway-produce
HostName IP或绑定的域名
Port 22
Host node-produce
HostName IP或绑定的域名
Port 22
Host java-produce
HostName IP或绑定的域名
Port 22

Host *-produce  # * 为通配符,匹配所有-produce 的服务器
User root
IdentityFile ~/.ssh/produce_key_rsa
Protocol 2
Compression yes
ServerAliveInterval 60
ServerAliveCountMax 20
LogLevel INFO

#单主机配置,适用于一个私钥只给一台服务器使用的情况
Host star-cloud                  # 给服务器取的别名
User root                        # 登录服务器的用户名
HostName IP或绑定的域名            # 服务器的 IP 地址或域名,注意前面不要加协议
IdentityFile ~/.ssh/id_rsa       # 私钥文件
Protocol 2
Compression yes
ServerAliveInterval 60
ServerAliveCountMax 20
LogLevel INFO

#单主机配置
Host git.yideng.site
User git
IdentityFile ~/.ssh/evilboy_rsa
Protocol 2
Compression yes
ServerAliveInterval 60
ServerAliveCountMax 20
LogLevel INFO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
  • 我自己电脑上配置的 config 文件内容如下:
Host starcoderln
User root
HostName 120.78.199.123
IdentityFile ~/.ssh/id_rsa
Protocol 2
Compression yes
ServerAliveInterval 60
ServerAliveCountMax 20
LogLevel INFO
1
2
3
4
5
6
7
8
9
  • 现在,就可以直接用 ssh starcoderln 命令登录服务器啦~ 😄

linux

# 进程、线程与协程

  • 进程的目的就是担当分配系统资源(CPU 时间、内存)的实体

  • 线程是操作系统能够进行运算调度的最小单位

  • 协程是一种用户态的轻量级线程,无法利用多核资源

  • IO 密集型应用的发展: 多进程 -> 多线程 -> 事件驱动 -> 协程

  • CPU 密集型应用的发展:多进程 -> 多线程

  • 调度和切换的时间:进程 > 线程 > 协程

  • 操作系统的设计,可以归结为三点:

  1. 以多进程形式,允许多个任务同时运行;

  2. 以多线程形式,允许单个任务分成不同的部分运行;

  3. 提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

linux

  • 进程与线程间的资源共享

linux

上次更新时间: 2021年11月30日 16:37:18