Linux

IO

  • 阻塞IO,即常见的IO模型。一般设计为一个线程负责一个IO。
  • 非阻塞IO,即使用poll,即轮询的方式,虽然不会阻塞,但是会大量占用CPU。
  • IO复用,即使用select,即向系统内核递交一批感兴趣的描述符,内核会轮询这些描述符,直到有其中一个IO有数据。可以用一个线程操作一组IO。
  • 信号驱动IO,即使用信号处理函数来操作IO,用起来就像是使用中断处理函数。
  • 异步IO,即向内核提交好缓冲区,内核收到数据后自动将数据填充到缓冲区,并向进程发送信号。不常见。
  • epoll,与select相比,时间复杂度为o(1),使用水平触发和边缘触发两种方式。
    • 水平触发:只要这个文件描述符还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作。
    • 边缘触发:通过 epoll_wait 调用会得到有事件通知的文件描述符,对于每一个被通知的文件描述符,如可读,则必须将该文件描述符一直读到空。可能会阻塞。

进程操作

Ctrl+z - 挂起任务

fg - 切到前台

bg - 切到后台

jobs - 查看后台任务

disown - 脱离终端 disown %2 disown -a

Tools

Vim

Vim:多级撤销,语法高亮,自动补全,插件,通过网络配置文件,多文件编辑,编辑压缩文件。

配置 Vimrc

Vimrc:Vim配置文件。分为用户级别和系统级别。每一行为一个命令。通过配置Vimrc可以配置Vim界面和用法。配置既可以写在Vimrc中,也可以在运行时输入命令。

配置显示行号

1
2
3
:set number 
:set nonumber
:set number? # 查看是否开启

配置光标

1
2
3
:set ruler 
:set noruler
:set ruler? # 查看是否开启

配置查找高亮

1
2
3
4
:set hls 
:set nohls
:set hls? # 查看是否开启
:set ignorecase # 忽略大小写

其他配置

1
2
3
4
5
:set autoindent # 自动缩进
:set smartindent # 编程语言自动缩进
:set expandtab # 空格代替Tab
:map # 设置快捷键
:let # 赋值

模式

普通模式:打开时即是普通模式。此时有:

  • 输入数字,按回车 - 跳转到某行

可视模式:按下v,可以选中文本。

插入模式:按下i,可以输入文本。

命令模式:按下:,之后可以输入命令。

使用

搜索

1
/content

命令

1
2
3
:h vimrc # 查看 Vimrc 帮助
:version # 查看版本
:e ~/.vimrc # 编辑文件

移动光标

  • h: 左
  • j: 下
  • k: 上
  • l: 右
  • 0: 行首,包含缩进
  • shift + 6: 行首,不含缩进
  • shift + 4: 行尾
  • w/W: 移动单词首
  • b/B: 反向移动
  • e/E: 移动到单词尾
  • ge: 反向移动
  • ctrl + f: 向下翻页
  • ctrl + b: 向上翻页
  • ctrl + d: 向下翻半页
  • ctrl + u: 向上翻半页
  • 1g/g: 移动到第一行
  • g + ctrl: 文件信息
  • >>: 缩进
  • <<: 反缩进
  • :70-80>: 70-80行缩进
  • :71>3: 71-74行缩进

寄存器:

  • 无名寄存器:默认使用
  • 数字寄存器:0-9共10寄存器,0是复制专用。
  • 有名寄存器:可以被命名
  • 黑洞寄存器:相对于删除
1
:reg # 进入寄存器

复制

  • yy: 复制,到默认寄存器和0寄存器

删除

  • dd: 剪切,到1寄存器

粘贴

  • p:

撤销

  • u:

重做

  • ctrl + r

删除

  • "_d: 进入黑洞寄存器

字符转化大小写

  • ~

单词转化大小写

  • g~

重复操作

  • .

查找

  • f/F: 查找字符
  • /: 查找字符串
  • n/N: 查找之间跳转

替换

  • [range]s[ubstitute]/{pattern}/{string}/[flags]
  • :s/set/SET/g: 当前行替换
  • %s/set/SSS/g: 全局替换
  • shift + r/R: 替换当前行
  • r: 替换字符

缓冲区与多文件编辑

缓冲区:

  • 查看缓冲区列表:files, :buffers, :ls
  • :bf/bp/bn/bl/b[num]: 切换缓冲区
  • :ball: 编辑所有
  • :wall!: 保存所有
  • :qall!: 退出所有
  • :1-3bd: 关闭缓冲区

多窗口分屏

1
vim -O/o[num] # 水平/垂直分屏

创建分配

  • ctrl + w c/q: 关闭当前窗口
  • ctrl + w s: 上下分割当前文件
  • :sp filename: 上下分割,打开新文件
  • ctrl + w v: 左右分割当前文件
  • :vsp filename: 左右分割,打开新文件

切换分配

  • ctrl + w K: 向上移动
  • ctrl + w J: 向下移动
  • ctrl + w L: 向右移动
  • ctrl + w H: 向左移动
  • ctrl + w +: 增加高度
  • ctrl + w -: 减小高度
  • ctrl + w =: 保持一致

标签分组

  • :tabnew: 新建标签
  • :tabfind: 在新标签中打开文件
  • :tabs: 显示标签列表
  • :tabclose: 关闭当前标签
  • :tabonly: 仅保留当前标签
  • :tabn/p/first/last: 跳转标签
  • :tabm: 移动标签
  • gt/T: 跳转标签
  • ngt: 跳转标签

Visual 模式

1
2
3
4
5
6
viw # 选中单词
vis # 选中句子
vip # 选中段落
vi( # 选中括号中的内容
vi[ # 选中括号中的内容
vit # 选中标签中的内容

可视化模块

1
2
3
v # 面向字符
V/shift + v # 面向行
ctrl + v # 面向块

Apparmor

Linux 下的沙箱功能。

Linux

文件属性

文件类型
d: 目录
-: 文件
l: 链接文件
b: 存储设备
c: 串行设备

文件权限
属主:读写执行
属组
其他用户

更改权限

1
2
3
4
5
6
chgrp 属组 文件
chown 属主 文件
chown 属主:属组 文件
chmod 775 文件或目录
chmod +/-/=
chmod u=rwx,o=r (u,g,o,a 用户)

文件命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ls    # 查看文件 -a -d -l
cd # 打开目录
pwd # 当前目录 -P 实际路径
mkdir # 创建目录 -m 配置权限 -p 递归创建所有目录
rmdir # 删除目录 -p 递归删除所有目录
cp # 复制 -a pdr -d 复制链接的源文件 -f 强制 -i 覆盖时先询问 -l 硬链接操作 -p 复制文件和属性(备份常用) -r 递归复制 -s 复制为符号连接档 -u 如果目标旧才更新
rm # 删除 -f -i 询问 -r
mv # 移动 -f -i -u

cat # 显示内容 -A vET -b 列行号 -E 结尾用$标出 -n 列行号,带空白行 -T 显示Tab -v 列出特殊字符
tac # 显示内容,倒序
nl # 显示内容,并标行号
more # 一页一页显示 / 搜索字符串 :f 显示行数和文件名 q 退出 b 往回翻页
less # 同上,但可以向前翻页 ? 向前搜索字符串 n 重复前一个搜索 N 反向重复前一个搜索
head # 只看前几行
tail # 只看后几行

开机启动

一般 Linux 启动过程:

  1. Bios 启动
  2. boot-loader 启动
  3. 启动内核
  4. 内核初始化
  5. 初始化最后一步,启动pid = 1的init进程

init:是一个守护进程,相应的机制有 sysvinit upstart
sysvinit:是对 /etc/init.d 配置,service也是通过配置这一项实现开机启动的
upstart:这一机制在ubuntu用过一段时间后抛弃
systemd:用于克服sysvinit的缺点,功能强大,但是系统复杂

systemd 常用工具箱:

  • systemctl
  • journalctl
  • notify
  • analyze
  • cgls
  • cgtop
  • loginctl
  • nspawn

service 配置文件:

Ubuntu 18.04

在Ubuntu 18.04上完全使用SystemCtl来配置启动项,与之前的版本有很大区别,没有了init.d配置启动的方法。

打开/lib/systemd/system/rc-local.service,在后面追加:

1
2
3
[Install]  
WantedBy=multi-user.target
Alias=rc-local.service

编辑启动项配置文件:

1
sudo vi /etc/rc.local

配置启动内容

1
2
3
4
5
#!/bin/sh -e

# 启动内容
echo "abc" > /usr/local/test.log
exit 0

修改启动项的权限

1
sudo chmod +x /etc/rc.local

打开启动项:

1
sudo systemctl enable rc-local

其他SystemCtl命令

1
sudo systemctl daemon-reload # 重新加载配置文件

路由

设置静态地址

修改文件/etc/dhcp/dhcpd.conf

1
subnet 192.168.0.0 netmask 255.255.255.0 {  option routers 192.168.0.1;  option subnet-mask 255.255.255.0;  range dynamic-bootp 192.168.0.100 192.168.0.200;}

临时修改路由顺序

1
route del default gw 192.168.0.1 eth0route add default gw 192.168.0.1 dev eth0 metric 323

工具修改路由顺序

1
sudo ifmetric wlan0 50

目录结构

bin: 存储常用命令
boot: linux启动核心文件
dev: 设备
etc: 配置
home: 用户目录
lib: 动态链接共享库
lost+found:系统非法关机后,存放的文件
media: U盘,光驱等设备
mnt: 临时挂载其他文件系统
opt: 额外安装软件所需的目录,如oracle数据库
proc: 系统内存映射,虚拟目录,存储在内存上
root: 管理员主目录
sbin: 管理员程序
selinux: Redhat/CentOS特有,类似于防火墙
srv: 服务启动后需要提取的数据
sys: 文件系统sysfs,管理内核设备,进程,伪终端
tmp: 存放临时文件
usr: 重要,用户的应用程序,文件等,类似于Program Files文件夹
usr/bin: 系统用户的应用程序
usr/sbin: 超级用户的应用程序
usr/src: 内核源代码的默认目录
var: 存放不断扩充的东西,例如日志,网站等
run: 临时文件系统,存储系统启动后的信息。该文件夹重启后清除

用户管理

磁盘管理

vi/vim

配置文件

~/.bashrc

程序的前后台切换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 让程序在后台执行
./command &
# 查看后台程序
jobs -l
# 切换后台程序到前台
fg %[number]
# 终止后台程序
kill %[number]

# 切换前台程序到后台,并暂停
ctrl + z
# 后台程序由暂停变为继续执行
bg %[number]
# 不间断执行
nohup
# 查看nohup日志
tail -fn 50 nohup.out