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 | :set number |
配置光标
1 | :set ruler |
配置查找高亮
1 | :set hls |
其他配置
1 | :set autoindent # 自动缩进 |
模式
普通模式:打开时即是普通模式。此时有:
- 输入数字,按回车 - 跳转到某行
可视模式:按下v
,可以选中文本。
插入模式:按下i
,可以输入文本。
命令模式:按下:
,之后可以输入命令。
使用
搜索
1 | /content |
命令
1 | :h vimrc # 查看 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 | viw # 选中单词 |
可视化模块
1 | v # 面向字符 |
Apparmor
Linux 下的沙箱功能。
Linux
文件属性
文件类型
d: 目录
-: 文件
l: 链接文件
b: 存储设备
c: 串行设备
文件权限
属主:读写执行
属组
其他用户
更改权限
1 | chgrp 属组 文件 |
文件命令
1 | ls # 查看文件 -a -d -l |
开机启动
一般 Linux 启动过程:
- Bios 启动
- boot-loader 启动
- 启动内核
- 内核初始化
- 初始化最后一步,启动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 配置文件:
- WantedBy:服务所在的target,官方有一张表可以查看所有的选项。
Ubuntu 18.04
在Ubuntu 18.04上完全使用SystemCtl来配置启动项,与之前的版本有很大区别,没有了init.d
配置启动的方法。
打开/lib/systemd/system/rc-local.service
,在后面追加:
1 | [Install] |
编辑启动项配置文件:
1 | sudo vi /etc/rc.local |
配置启动内容
1 |
|
修改启动项的权限
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 | # 让程序在后台执行 |