study/linux/README.md

276 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 简介
本人之前用的是debian系列的Linux从2017.06开始使用centos发行版的Linux所以之后会添加一些关于centos的知识点。
## 基本知识
### linux 常用的命令
简单的就不解释了
```sh
cd、ls、mkdir、tar、rmdir、rm、mv、cp、cat
```
1. `ipcs` 用于显示进程间的通信设备,比如共享内存、信号量。
#### 管道命令
前一个命令的结果作为后一个命令的输入到第二个命令<br>
<span style="color:red;">注意</span><br>
1. 管道命令只处理前一个命令正确输出,不处理错误输出
2. 管道命令右边命令,必须能够接收标准输入流命令才行。
#### 输出重定向
1. `command > file` 将输出重定向到file
2. `command >> file` 讲输出以追加的方式重定向到file
3. `2 > file ,2 >> file` 将stderr重定向到file中
4. `1 > file 1 >> file` 将stdout重定向到file中
5. `command > file 2>&1,command >> file 2>&1` 将 stdout 和 stderr 合并后重定向到 file
#### 输入重定向
与输出重定向相似
#### /dev/null 文件
```sh
command > /dev/null
```
`/dev/null` 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。
但是 `/dev/null` 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
<br><span style="color:red;">注意</span><br>
0 是标准输入STDIN1 是标准输出STDOUT2 是标准错误输出STDERR
#### 文件时间
##### mtime 修改时间
当该文件的“内容数据”更改时,就会更新这个时间。内容数据指的是文件的内容,而不是文件的属性。
##### ctime 状态时间
当该文件的”状态status”改变时就会更新这个时间举例来说更改了权限与属性就会更新这个时间。
#### atime 存取时间
当“取用文件内容”时就会更新这个读取时间。举例来说使用cat去读取 `~/.bashrc`就会更新atime了。
![看不见](https://git.zeekling.cn/zeekling/study/raw/branch/master/linux/pics/view.jpeg)
![看不见](https://git.zeekling.cn/zeekling/study/raw/branch/master/linux/pics/view2.jpeg)
## vim 用法
[配置方法及其详细用法](https://git.zeekling.cn/linux/vimrc/src/branch/master/vim%E5%AE%89%E8%A3%85.md)
## 目录结构
```sh
/bin:常用命令
/boot:启动程序
/dev:设备文件
/etc:启动,关闭,配置程序与文件
/home:用户工作根目录
/lib:共享连接库
/root:超级用户的工作目录
/sbin:系统管理员常用管理程序
/tmp:临时文件
/lost+found:系统出现异常时,用于保存部分资料
/mnt:光驱,硬盘等的挂载点
/media:光驱的自动挂载点
/proc:操作系统的实时信息
/sys:系统中的硬件设备信息
/srv:服务器启动后需要的提取的信息
/var:某些大文件的溢出区,比方说各种服务的日志文件
/usr/bin:众多的应用程序
/usr/sbin:超级用户的一些管理程序
/opt:第三方软件
```
## 权限管理
```sh
➜ ~ ll
total 56K
drwxr-xr-x 2 lzh lzh 4.0K Oct 27 22:37 Desktop
drwxr-xr-x 10 lzh lzh 4.0K Jan 6 21:10 Documents
drwxr-xr-x 9 lzh lzh 4.0K Jan 8 01:30 Downloads
文件权限 - 连接数 - 文件所有者 - 文件所属用户组 - 文件大小 - 文件最后时间 - 文件名字
文件类型1 - 用户权限3 - 用户组权限3 - 其他用户权限3
```
### 权限
* ACL权限
* 用户
* 用户组
* 默认属性
* 特殊权限
* SUID权限(对单个用户有效)4 作用于可执行文件,执行者将均有改程序所有者的权限,本权限只在执行过程中有效
* SGID权限(对用户组有效)2可作用于可执行文件和目录
* 对于文件夹:
1. 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
2. 使用者在此目录下的群组将会变成该目录的群组;
3. 若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。
* 对于文件:
1. SGID 对二进制可执行文件有效;
2. 程式执行者对于该文件来说,需具备 x 的权限;
3. 执行者在执行的过程中将会获得该文件群组的支援。
* SBIT权限(只针对目录有效)1
1. 只针对目录有效;
2. 设置了sbit的文件夹下用户自己新建的文件只有root和自己能对文件进行操作。
## 文件系统
* ext2,ext3.ext4
* inode
![inode节点示意图](https://git.zeekling.cn/zeekling/study/raw/commit/3265fb4861a7c6075d409ab4bed7281e6436cd92/pics/inode1.gif)
1. 软连接
2. 硬链接
## linux 启动过程
### 一般操作系统的启动流程
***通电***-->***BIOS***-->***主引导记录***-->***操作系统***
### 加载内核
操作系统接管硬件以后,首先读入/boot目录下的内核文件。
***操作系统***-->***/boot***-->
如/boot文件夹下面
```sh
➜ /boot ls
config-4.3.0-kali1-amd64 grub
initrd.img-4.6.0-kali1-amd64 System.map-4.6.0-kali1-amd64
vmlinuz-4.6.0-kali1-amd64 config-4.6.0-kali1-amd64
initrd.img-4.3.0-kali1-amd64 System.map-4.3.0-kali1-amd64
vmlinuz-4.3.0-kali1-amd64
```
### 启动初始化进程
内核文件加载以后,就开始运行第一个程序`/sbin/init`,他的作用是初始化系统环境。
***操作系统***-->***/boot***-->***init进程***--> 
由于init是第一个运行的程序他的进程编号(pid)就是1。其他所有进程都从它衍生,都是他的子进程。
### 确认运行等级
许多程序需要开机启动。他们在Windows叫做服务在Linux叫做守护进程。
init进程的一大任务就是去运行这些开机启动的程序。但是不同的场合需要启动不同的程序比如作为服务器需要启动
Apache其桌面就不需要。linux允许为不同的场合分配不同的开机启动程序这就叫做运行级别。也就是说启动的时候根
据运行级别,确认运行那些程序。
***操作系统***-->***/boot***-->***init进程***-->***运行级别***-->
Linux预置七种运行级别(0-6)。一般来说0是关机1是单一用户模式(也就是维护模式)6是重启。运行级别2-5各个发行
版不太一样。init进程首先读取文件/etc/inittab,他是运行级别的设置文件。但是我在我的kali linux 上面就没有看到这个
文件不知道他去哪儿了,书上全都是骗人的。
<p>运行级别</p>
1. init 0 关机
2. init 1 单用户模式纯命令行界面
3. init 2 不完全多用户模式不含NFS模式纯命令行
4. init 3 完全多用户模式,服务正常开启,使我们服务器的默认运行模式
5. init 4 未分配
6. init 5 图形界面
7. init 6 重启
### 加载开机启动程序
***操作系统***-->***/boot***-->***init进程***-->***运行级别***-->***/etc/init.d***-->
```sh
➜ ~ ll /etc/rc2.d
总用量 4.0K
lrwxrwxrwx 1 root root 17 8月 13 00:09 K01apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 29 8月 15 01:51 K01apache-htcacheclean -> ../init.d/apache-htcacheclean
lrwxrwxrwx 1 root root 16 8月 13 00:09 K01atftpd -> ../init.d/atftpd
lrwxrwxrwx 1 root root 18 8月 13 00:09 K01beef-xss -> ../init.d/beef-xss
lrwxrwxrwx 1 root root 19 8月 13 00:09 K01bluetooth -> ../init.d/bluetooth
lrwxrwxrwx 1 root root 17 8月 13 00:09 K01couchdb -> ../init.d/couchdb
```
这样做的好处就是如果你要手动关闭或者重启某个进程,直接到目录/etc/init.d中寻找启动脚本即可比如重启
Apache服务器就运行下面命令
```sh
sudo /etc/init.d/apache2 restart
```
### 用户登陆
开机启动程序加载完毕以后,就要让用户登陆了。
***操作系统***-->***/boot***-->***init进程***-->***运行级别***-->***/etc/init.d***-->***用户登录***-->
一般来说用户登陆方式有三种:
1. 命令行登陆
2. ssh登陆
3. 图形界面登陆
### 进入login shell
所谓的shell简单说就是命令行界面让用户直接和操作系统对话。用户登陆时打开shell就叫做login shell 。
***操作系统***-->***/boot***-->***init进程***-->***运行级别***-->***/etc/init.d***-->***用户登录***-->
***Login shell***-->
1. 命令行模式登陆:首先读入/etc/profile这是对所有用户都有效的配置然后依次寻找下面三个文件这是针对当前用
户的配置(我用的是zsh所以这些文件前两个对我没有作用)
```
~/.bash_profile
~/.bash_login
~/.profile
```
2. ssh登陆与第一种情况完全相同。
3. 图形界面登陆:只加载/etc/profile和~/.profile。也就是说~/.bash_profile不管有没有都不会运行。
### 打开non-login shell
上一步完成以后Linux的启动过程就算结束了用户已经命令行提示符或者图形界面了
用户进入操作系统后常常会在打开开启一个shell。这个shell 就叫做non-login shell ,意思就是他不同于登陆时出现的那
个shell不读取/etc/profile和.profile等配置文件。
***操作系统***-->***/boot***-->***init进程***-->***运行级别***-->***/etc/init.d***-->***用户登录***-->
***Login shell***-->***Non-login shell***
### 注意
#### login shell 和no-login shell
login shell 每次打开是都要进行登录no-login shell不用每次都登陆。
### kali linux 源
```sh
deb http://ftp.cn.debian.org/debian jessie main non-free
deb http://http.kali.org/kali kali-rolling main non-free contrib
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free
deb-src http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
```
## linux 内存管理
### Linux内存地址空间
#### 内存地址——用户态&内核态
* 用户态Ring3 运行于用户态的代码则要受到处理器的诸多
* 内核态Ring0 在处理器的存储保护中,核心态
* 用户态切换到内核态的 3 种方式:系统调用、异常、外设中断
* 区别:每个进程都有完全属于自己的,独立的,不被干扰的内存空间;用户态的程序就不能随意操作内核地址空间,具
有一定的安全保护作用;内核态线程共享内核地址空间;
![linux](https://git.zeekling.cn/zeekling/study/raw/branch/master/pics/linux2.png)
#### 内存地址——MMU 地址转换
* MMU 是一种硬件电路,它包含两个部件,一个是分段部件,一个是分页部件
* 分段机制把一个逻辑地址转换为线性地址
* 分页机制把一个线性地址转换为物理地址
![分页](https://git.zeekling.cn/zeekling/study/raw/branch/master/pics/linux_page.png)
#### 内存地址——分段机制
* 段选择符
* 为了方便快速检索段选择符,处理器提供了 6 个分段寄存器来缓存段选择符,它们是: cs,ss,ds,es,fs 和 gs
* 段的基地址(Base Address):在线性地址空间中段的起始地址
* 段的界限(Limit):在虚拟地址空间中,段内可以使用的最大偏移量
* 分段实现
* 逻辑地址的段寄存器中的值提供段描述符,然后从段描述符中得到段基址和段界限,然后加上逻辑地址的偏移量,就得到了线性地址
![](https://git.zeekling.cn/zeekling/study/raw/branch/master/pics/linux_duan.png)
#### 内存地址——分页机制32 位)
* 分页机制是在分段机制之后进行的,它进一步将线性地址转换为物理地址
* 10 位页目录10 位页表项, 12 位页偏移地址
* 单页的大小为 4KB
![分页机制](https://git.zeekling.cn/zeekling/study/raw/branch/master/pics/linux_page32.png)
#### 用户态地址空间
![用户态地址空间](https://git.zeekling.cn/zeekling/study/raw/branch/master/pics/user_space.jpg)
* TEXT代码段可执行代码、字符串字面值、只读变量
* DATA数据段映射程序中已经初始化的全局变量
* BSS 段:存放程序中未初始化的全局变量
* HEAP运行时的堆在程序运行中使用 malloc 申请的内存区域
* MMAP共享库及匿名文件的映射区域
* STACK用户进程栈
#### 内核态地址空间
![内核态地址空间](https://git.zeekling.cn/zeekling/study/raw/branch/master/pics/kernel_space.jpg)
* 直接映射区:线性空间中从 3G 开始最大 896M 的区间,为直接内存映射区
* 动态内存映射区:该区域由内核函数 vmalloc 来分配
* 永久内存映射区:该区域可访问高端内存
* 固定映射区:该区域和 4G 的顶端只有 4k 的隔离带,其每个地址项都服务于特定的用途,如: ACPI_BASE 等
#### 进程内存空间
* 用户进程通常情况只能访问用户空间的虚拟地址,不能访问内核空间虚拟地址
* 内核空间是由内核负责映射,不会跟着进程变化;内核空间地址有自己对应的页表,用户进程各自有不同额页表
![进程内存空间](https://git.zeekling.cn/zeekling/study/raw/branch/master/pics/jingcheng.jpg)