# Linux 架构体系
# Unix/Linux 的体系架构
# Linux 系统体系结构
# windows 架构体系
# 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~]#
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
drwxr-xr-x | . | 1 | root | root | 800 | Sep 16 00:19 | logs |
---|---|---|---|---|---|---|---|
文件类型和权限 | ACL 权限 | 硬链接引用计数 | 所有者 | 所属组 | 文件大小 | 最后修改时间 | 文件名 |
文件类型和权限
-rw-r--r--
⽂件类型:- ⽂件、d 目录、l 软链接文件
u(所有者)、g(所属组)、o(其他人)
r(read)读取、w(write)写入、x(execute)执行
# ln
# 创建一个指向文件或目录的软链接
ln -s file1 lnk1
# 创建一个指向文件或目录的物理链接(硬链接)
ln file1 lnk1
2
3
4
5
📌 1. 软连接的特征
类似 Windows 快捷方式
软链接拥有自己的 i 节点和 Block 块,但是数据块中只保存源文件的⽂件名和 i 节点号,并没有实际的文件数据
软链接的文件权限都是 777(lrwxrwxrwx)
修改任意⼀个文件,另⼀个都会改变
删除源文件,软链接不能使⽤
软链接源⽂件必须写绝对路径
📌 2. 硬链接的特征
拥有相同的 i 节点和存储 block 块,可以看作是同一个⽂件
可以通过 i 节点访问
不能跨分区
不能针对目录使⽤
⼀般不使用
# locate
# 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令
locate \*.ps
2
在后台数据库中按文件名搜索,速度比较快
数据保存在
/var/lib/mlocate
后台数据库,每天更新一次可以用
updatedb
命令⽴刻更新数据库只能搜索文件名
建⽴索引的配置文件
/etc/updatedb.conf
PRUNE_BIND_MOUNTS = "yes"
全部生效,开启搜索限制
PRUNEFS
不搜索的文件系统
PRUNENAMES
忽略的文件类型
PRUNEPATHS
忽略的路径 /tmp
# whereis
搜索命令所在路径以及帮助文档所在位置
whereis 命令名
whereis ls
-b 只查找可执行⽂件
-m 只查找帮助文件
# which
可以看到别名,如
which ls
能看到的都是外部安装的命令
⽆法查看 Shell ⾃带的命令,如
which cd
# 环境变量
echo $PATH
定义的是系统搜索命令的路径
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
# find
文件搜索命令
find [搜索范围][搜索条件]
📌 1. 按名称搜索
- 避免⼤范围的搜索,会非常消耗系统资源
find / -name aaa.log
📌 2. 通配符
find 是在系统当中搜索符合条件的⽂件名,如果需要匹配,使用通配符匹配,通配符是完全匹配
通配符
*
匹配任意内容
?
匹配任意⼀个字符
[]
匹配任意一个中括号内的字符
find . -name "ab[cdef]"
📌 3. -i
- 不区分⼤小写
find / -iname A.log
📌 4. -user
- 按所有者进行搜索
find /root -user root
find /root -nouser
2
📌 5. 按时间搜索
find /nginx/access.log -mtime +5
参数 | 含义 |
---|---|
atime | ⽂件访问时间 |
ctime | 改变⽂件属性 |
mtime | 修改文件内容 |
参数 | 含义 |
---|---|
-5 | 5天内修改的⽂件 |
5 | 5天前当前修改的文件 |
+5 | 5天前修改的⽂件 |
📌 6. 按⼤小搜索
- k 小写,M 大写
find . -size 100k
参数 | 含义 |
---|---|
-8k | 小于8K |
8k | 等于8K |
+8k | ⼤于8K |
📌 7. 按 i 节点搜索
find . -inum 123456
📌 8. 综合应⽤
find /tmp -size +10k -a -size -20k
查找 /tmp 目录下,⼤于 10KB 并且小于 20KB 的文件
-a,and 逻辑与,两个条件都满⾜
-o,or 逻辑或,两个条件满⾜一个就可以
find /tmp -size +10k -a -size -20k -exec ls -lh {} \
- exec 对上个命令的结果进行操作
# grep
- 在⽂件当中匹配符合条件的字符串
grep "10" access.log
-i,忽略⼤小写
-v,排除指定字符串
注意
find 命令,在系统当中搜索符合条件的⽂件名,如果需要匹配,使⽤通配符匹配,通配符是完全匹配
grep 命令,在⽂件当中搜索符合条件的字符串,如果需要匹配,使⽤正则表达式进行匹配,正则表达式是包含匹配
# 命令帮助
📌 1. whatis
- whatis 可以查看某个命令的简短帮助信息。
whatis ls
📌 2. help
- help 命令用于显示 shell 内部命令的帮助信息。而对于外部命令的帮助信息只能使用 man 或者 info 命令查看。
help ls
# -s:输出短格式的帮助信息。仅包括命令格式。
help -s ls
2
📌 3. info
- info (opens new window) 命令是 Linux 下 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
查看 /etc/passwd 文件的信息:
man /etc/passwd
查看 passwd 命令所在位置:
man -w passwd
查看 /etc/passwd 文件手册页所在位置:
man -w 5 passwd
# 进程管理
📌 1. top
- top (opens new window) 命令用于实时显示进程的动态。
📌 2. ps
- ps (opens new window)(英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。
📌 3. kill、killall、pkill
kill (opens new window) 命令用于杀死指定进程 PID 的进程。
killall (opens new window) 用于杀死一个进程,与 kill 不同的是它会杀死指定名字的所有进程。
pkill (opens new window) 用于杀死一个进程,与 kill 不同的是它会杀死指定名字的所有进程,类似于 killall 命令。
# 网络管理
📌 1. ifconfig、ip
ifconfig (opens new window) 命令用于显示或设置网络设备。
ip (opens new window) 命令与 ifconfig 命令类似,但比 ifconfig 命令更加强大,主要功能是用于显示或设置网络设备。ip 命令是 Linux 加强版的的网络配置工具,用于代替 ifconfig 命令。
📌 2. traceroute
- traceroute (opens new window) 命令用于显示数据包到主机间的路径,可以用来排查网络故障。
📌 3. netstat、ss
netstat (opens new window) 命令用于显示网络状态。
ss (opens new window) 命令 Socket Statistics 的缩写。顾名思义,ss 命令可以用来获取 socket 统计信息,它可以显示和 netstat 类似的内容。ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比 netstat 更快速更高效。
这两个命令都可以用来找到占用网络端口的进程。
# 服务管理
📌 1. systemctl
- systemctl (opens new window) 是 Systemd 的主命令,用于管理系统。
# 命令行下载
📌 2. curl
- curl (opens new window) 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。
📌 3. wget
- wget (opens new window) 是一个在命令行中下载文件的工具。
# 压缩和解压缩
参考 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
-c 打包
-v 显示过程
-f 指定打包后的⽂件名
x 解打包
tar -xvf book.tar
# 关机和重启
📌 1. shutdown
shutdown 关机命令
-c 取消前⼀个关机命令
-h 关机
-r 重启
📌 2. init
- 关机
init 0
- 重启
init 6
系统的运行级别
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
# echo
输出命令
-e ⽀持反斜线控制的字符转换
控制字符 | 作⽤ |
---|---|
\a | 输出警告⾳ |
\b | 退格键,也就是向左删除键 |
\n | 换⾏符 |
\r | 回⻋键 |
\t | 制表符,也就是 Tab 键 |
\v | 垂直制表符 |
\0nnn | 按照八进制 ASCII 码表输出字符,其中 0 为数字零,nnn 是三位八进制数 |
\xhh | 按照⼗六进制 ASCII 码表输出字符,其中 hh 是两位⼗六进制数 |
echo -e "\a"
# 编写执行 shell
#!/bin/bash
echo -e "\e[1;34mhelloworld\e[0m"
2
赋予执行权限,直接运⾏
chmod 755 hello.sh
./hello.sh
2
通过 Bash 调⽤执行脚本
bash hello.sh
# 别名(alias)
- 查看已设置的别名
alias
- 设置别名
alias rm="rm -i"
- 默认情况下是临时生效的,如果想一直可用,可以将别名写入环境变量配置⽂件
~/.bashrc
中。
打开该文件,输入要设置的别名
vi ~/.bashrc
保存,然后执行
source ~/.bashrc
- 删除别名
unalias rm
# 命令的生效顺序
绝对路径或者相对路径
别名
bash 内部命令
按照 $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
2
📌 2. 管道符号
命令1的正确输出会作为命令2的操作对象。
命令1|命令2
ls /etc/ | more
netstat -an | grep ESTABLISHED | wc -l
2
📌 3. 通配符
匹配文件名和⽬录名
通配符 | 作用 |
---|---|
? | 匹配⼀个任意字符 |
* | 匹配0个或任意字符,也就是可以匹配任意内容 |
[] | 匹配中括号中任意⼀个字符 |
[-] | 匹配中括号中任意⼀个字符,- 代表范围 |
[^] | 匹配不是中括号中的⼀个字符 |
📌 4. 其它符号
符号 | 作用 |
---|---|
'' | 单引号。在单引号中所有的特殊符号,如 $ 和 ` 都没有特殊含义 |
"" | 双引号,在双引号里特殊符号都没有特殊含义,但是 $ ` 例外,拥有调⽤变量值,引⽤命令和转义的含义 |
`` | 反引号,扩起来的是系统命令 |
$() | 和反引号⼀样 |
# | 在 shell 脚本中,# 开头的行代表注释 |
$ | ⽤于调用变量的值 |
|转义符号 |
a=`ls`
b=$(ls)
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
2
root 组编号为0
1-499 系统预留的编号,预留给安装的软件和服务的
⽤户⼿动创建的用户组从 500 开始
组密码占位符都是 x
📌 2. /etc/gshadow
存放当前系统中⽤户组的密码信息
和 group 中的记录⼀一对应
# 组名称:组密码:组管理者:组中⽤户名
Group:*: :abc
2
📌 3. /etc/passwd
- 存储当前系统中所有用户的信息
# ⽤户名:密码占位符:⽤户编号:用户注释信息:用户主目录:shell 类型
user:x:123:456:xxxxx:/home/user:/bin/bash
2
📌 4. /etc/shadow
- 存放当前系统中所有用户的密码信息
# ⽤户名:密码:
user:xxx::::::
2
# 用户操作
# 添加组
groupadd student
# 修改组名称
groupmod -n stu student
# 修改组编号
groupmod -g 111 stu
# 添加分组并指定编号
groupadd -g 222 teacher
# 删除分组
groupdel 222
# 添加分组
groupadd teacher
# 为⽤户指定所属组
useradd -g teacher zhangsan
# 为⽤户指定工作⽬录
useradd -d /home/zhangsan zhangsan
# 指定注释
usermod -c iamateacher zhangsan
# 修改⽤户名
usermod -l zhangsan zhangsan2
# 删除用户
userdel zhangsan2
# 删除所属⽂件夹
userdel -r lisi
# ⽤户命令
# 显示登录的用户名
whoami
# 显示指定用户信息,包括用户编号,⽤户名,主要组的编号及名称,附属组列表
id zhangsan
# 显示 zhangsan ⽤户所在的所有组
groups zhangsan
# 显示用户详细资料
finger zhangsan
# 系统启动
# BIOS
- 计算机通电后,第⼀件事就是读取刷⼊ ROM 芯片的开机程序,这个程序叫做BIOS(Basic Input/Output System)。
# 硬件⾃检
BIOS 程序首先检查,计算机硬件能否满⾜运行的基本条件,这叫做硬件自检(Power-On Self-Test)。
如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出 CPU、内存、硬盘等信息。
# 启动顺序
硬件⾃检完成后,BIOS 把控制权转交给下一阶段的启动程序。
这时,BIOS 需要知道,"下一阶段的启动程序"具体存放在哪⼀个设备。
BIOS 需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做启动顺序(Boot Sequence)。
BIOS 按照"启动顺序",把控制权转交给排在第一位的储存设备。
这时,计算机读取该设备的第一个扇区,也就是读取最前面的 512 个字节。如果这 512 个字节的最后两个字节是
0x55
和0xAA
,表明这个设备可以用于启动;如果不是,表明设备不能⽤于启动,控制权于是被转交给"启动顺序"中的下一个设备。这最前⾯面的 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 配置免密登录
正常我们想访问服务器,是需要输入密码的。
免密登录就是让我们省去输入密码这一步,直接就能访问服务器。
# 免密登录原理
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"
2
# 上传配置公钥
ssh-copy-id
用于将公钥上传到服务器的 /root/.ssh/authorized_keys
文件中。
ssh-copy-id -i you_set_name_rsa.pub root@服务器ip/域名
在这一步中,一开始我用的是服务器的私网 IP:172.18.238.35。结果一直出现以下问题:
试着 ping 一下发现 ping 不通。后来换成了公网 IP:120.78.199.123。就可以了。
此时,在服务器中查看 authorized_keys 文件的内容就发现已经有我们上传的公钥了。
cat ~/.ssh/authorized_keys
注意
配置公钥文件的访问权限是 600,即 -rw-------
。
# 配置本地私钥
现在,我们就可以通过指定私钥的方式来登录服务器了。如果想退出服务器,直接输入 exit
命令然后回车就行了。
ssh -i id_rsa root@服务器ip/域名
但是,由于我之前在自己本地生成私钥的时候设置了访问密码,所以现在还得输入密码。要配置免密登录的话得把这个密码给去掉。
更改本地私钥的访问密码的方法如下:
在终端下输入
ssh-keygen -p
。系统会提示选择需要修改的私钥,在我的电脑上默认是 /var/root/.ssh/id_rsa。
选好文件后按回车,会提示输入旧密码。
输入好后会提示输入新密码。
连续两次回车,之前设置的私钥密码就被清除了。
再次访问服务器可以看到,可以直接登录了,不需要再输入密码。
- 进入到 home 目录下的 .ssh 目录中,通过以下命令将私钥复制一份到这里。
sudo cp /var/root/.ssh/id_rsa id_rsa
注意
配置私钥文件的访问权限是 600,即 -rw-------
。
# 配置免密登录功能的本地配置文件
上面我们虽然已经实现了 Linux 免密登录,但是需要我们输入的那行命令还是有点太长了。我们可以通过配置免密登录功能的本地配置文件来缩短这行命令。
- 编辑自己的 home 目录下(也就是路径显示为 ~)的 .ssh 目录中的 config 文件。默认情况下,.ssh 目录中要么为空,要么只有以下内容。其中 known_hosts 文件是你在第一次登录任何服务器的时候生成的文件。因此,我们需要在这里面创建一个 config 文件:
touch config
。
注意
配置 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
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
2
3
4
5
6
7
8
9
- 现在,就可以直接用
ssh starcoderln
命令登录服务器啦~ 😄
# 进程、线程与协程
进程的目的就是担当分配系统资源(CPU 时间、内存)的实体。
线程是操作系统能够进行运算调度的最小单位。
协程是一种用户态的轻量级线程,无法利用多核资源。
IO 密集型应用的发展: 多进程 -> 多线程 -> 事件驱动 -> 协程。
CPU 密集型应用的发展:多进程 -> 多线程。
调度和切换的时间:进程 > 线程 > 协程。
操作系统的设计,可以归结为三点:
以多进程形式,允许多个任务同时运行;
以多线程形式,允许单个任务分成不同的部分运行;
提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
- 进程与线程间的资源共享
← Cygwin Docker 介绍与使用 →