Linux,你必需知道的
磁盘、进程、内存
- 保存数据的磁盘
- 实际处理数据的进程
- 存储各种运行信息的内存
磁盘和文件
Linux系统没有盘符的概念,它和所有类UNIX系统一样,有一个树型结构的文件系统。
1 | $ tree -d -L 1 / |
磁盘
df
查看系统已挂载文件系统情况,df只会显示已挂载的分区。
1 | df -h |
vdaX 指文件系统分区,v在这里代表KVM使用的virto虚拟文件系统,X是分区号。相应的,sata, ssd等磁盘使用s开头,传统的HHD机械硬盘使用h开头。
fdisk
查看磁盘硬件情况,fdisk 并不显示系统分区,显示电脑上的所有磁盘(包括未挂载磁盘)。
1 | sudo fdisk -l |
进程
控制进程就等于控制Linux
fork
:通过父进程创建一个子进程,子进程是父进程自身的一个副本。exec
:舍弃进程原本携带信息,在进程执行时用新的程序代码替代调用进程的内容。
后台执行
在执行命令的结尾加上 &
,可以使程序在后台运行。如:
1 | java -jar app.jar & |
使用 nohup
命令,可使程序输出不打印到时前端(终端),默认将打印到 nohup.out
文件。
1 | nohup java -jar app.jar & |
Ctrl+Z
使在前台运行的进程后台运行。
fg
将后台进程拉回前台运行。
快速的数据处理管道
管道蕴含着Linux从Unix中继承的一个重要概念:
程序应该只关注一个目标,并尽可能把它做好。程序应能够互相协同工作。让程序处理文本数据流,这是一个通用的接口
- stdin:标准输入,文件描述符 0
- stdout:标准输出,文件描述符 1
- stderr: 标准错误输出,文件描述符 2
1 | cat |
管道
管道中常用的快捷命令
命令 | 说明 |
---|---|
cut | 通过分隔符拆分后,显示指定的域 |
grep | 显示与模式相匹配的行 |
head | 显示文件的开始部分 |
paste | 通过指定的分隔符将两个文件的各行进行合并,或者通过指定的分隔符合并一个文件中的多行 |
sort | 对多行进行排序 |
tr | 替换、删除字符,压缩文字序列 |
uniq | 压缩连续的相同的行 |
wc | 显示文件字节数、字(word)数、行数 |
1 | history | grep <...> // 从历史记录查找使用过的命令 |
过滤并保存系统运行的所有进程号
1 | ps -ef > /tmp/tmp0 |
cut 命令把 -d 选项指定的文字作为文字分隔符,仅抽取 -f 选项定位的数据(域)。这个例子中,使用空格作为分隔符。但是,由于连续的空格会被当作多个分隔符,因此要事先通过 tr 命令将连续空格转换成一个空格。
内存
物理地址空间和逻辑地址空间
物理内存分为Linux内核自身使用的区域和用户进程使用的区域。内核使用低端内存,高端内存被分配给了用户进程。低端内存中的空闲区域也将被分配给用户进程使用。
进程在访问物理内存时并不直接指定物理地址,而是指定逻辑地址。内存的内核数据区域中预先设置逻辑地址和物理地址的对应“页表”,
然后 CPU 上搭载的 MMU(Memory Management Unit)硬件会参照该页表,自动实现对映射后物理地址上的数据的访问。
为每个进程提供独立的内存空间,等于实现了进程之间的安全保护。
通过 /proc/meminfo
系统运行内存信息文件查看内存状态
1 | cat /proc/meminfo |
通过 free
命令查看内存状态
1 | free |
Linux 发行版
Linux本身指 GNU/Linux 内核,但只有内核一般用户是没法使用的。所以世面上就出现了很多 Linux 发行版,它打包并整理了一系列开箱即用的工具。
CentOS
CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux
依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。
两者的不同,在于CentOS并不包含封闭源代码软件。
公司的服务器(测试、生产)环境使用的CentOS 7。
Ubuntu
Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于Debian GNU/Linux,由全球化的专业开发团队(Canonical Ltd)打造的。
其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词 [2] ,类似儒家“仁爱”的思想,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观。
公司部分开发人员的开发电脑安装了 Ubuntu 16.04 操作系统。
虚拟化
Linux拥有强大的虚拟化能力。常见的有:
- KVM:完全虚拟化,OpenStack默认使用它做为系统虚拟化工具
- Xen:完全虚拟化,类似KVM的另一套虚拟化
- Cgroup:半虚拟化,Docker/k8s等容器虚拟化的核心
一个邮件发送系统的虚拟网络构成。
开始使用Linux
终端
终端会话是用户与shell环境打交道的地方,如果你使用的是基于图形用户界面的系统,这指的就是终端窗口。如果没有图形用户界面(生产服务器或SSH会话),那么登录后你看到的就是shell提示符。
CentOS 7的终端提示如下:
1 | [hldev@centos7-001 opt]$ cd /usr/local/share/ |
$ 表示普通用户,**#** 表示管理员用户root。root是Linux系统中权限最高的用户。
环境变量
环境变量通常保存了可执行文件、库文件等的搜索路径列表。例如 $PATH
和 $LD_LIBRARY_PATH
:
1 | PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/hldev/.local/bin:/home/hldev/bin |
设置环境变量可以在命令行直接使用 export
命令:export JAVA_HOME="/opt/local/jdk1.8
。但这样设置在系统重启后就无效了,我们可以把它写到配置文件里面。全局配置:**/etc/profile,用户配置:~/.bash_prfile**。若环境变量写在配置文件内,在重启系统前默认是不会生效的,需要手动使其生效。
1 | . ~/.bash_profile |
安装软件
在Linux下一般有两种方式来安装软件:
- 使用包管理器自动安装
- 使用源码编译安装
RPM
CentOS 7 使用yum包管理器安装RPM格式的软件。常用命令有:
- 列出已安装包:
rpm -l
- 用yum安装软件:
sudo yum install <software name>
- 用yum更新软件:
sudo yum update <software name>
sudo yum update
(更新系统)
- 用yum卸载软件:
sudo yum erase <software name>
yum
工具和命令
命令
ls:查看文件
ls
列出目录内容。
1 | ls |
- -a 列出所有文件
- -l 列出文件明细
- -h 使用 human 友好的方式显示文件内容大小
- -F 将指示符添加到显示的项后面。如:* 可执行,/ 目录,@ 符号连接,= UNIX套接字,
tar(解)压缩
将多个文件压缩成一个单一文件,或相反。Linux tar 命令支持多种压缩格式。常用的有:gzip和bzip2
1 | tar czf dist.tar.gz dist |
- -c 压缩文件,
- -z 使用 gzip 进行(解)压缩
- -j 使用 bzip2 进行(解)压缩
- -x 解压文件
- -f 指定压缩生成/解压文件
cURL:数据传输命令行工具
cURL 是传输数据到服务器或从服务器获取数据的工具,支持多种协议。如:DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP。
上传文件
-XPOST
:使用HTTP POST方法-F \'filename=@app.jar\'
:上传文件字段设置为filename,引用本地目录的 app.jar 文件
1 | curl -XPOST -F 'filename=@app.jar' |
常用选项
--progress
:显示进度条--silent
:不显示进度信息-O
:设置远程文件下载到本地系统的目标文件名-C -
:支持断点续传,-C
后面的-
选项记cURL推断出正确的续传位置,也可以指定明确的字节偏移。
wget: 命令行HTTP客户端
下载文件
-c
: 断点下载文件
1 | wget -c https://mirrors.aliyun.com/centos/7.4.1708/isos/x86_64/CentOS-7-x86_64-DVD-1708.iso |
镜像网站
1 | wget -m -k -e robots=off https://www.hualongdata.com/ |
-e robots=off
:让wget耍流氓无视robots.txt协议
ps:查找进程
显示当前进程(所有或指定)的快照。
显示系统所有进程
1 | ps -ef |
显示系统所有终端所有用户进程
1 | ps -aux |
tail: 监控文件
实时监控 application.log
日志文件最新1024行内容:
1 | tail -f -n 1024 application.log |
top:查看系统运行状态
实时显示Linux系统运行状况
1 | $ top |
第一行:当前时间,系统运行时长,登录用户数,平均系统负载:1分钟、5分钟、15分钟
第二行:任务(进程)总数,运行数,休眠数,已停止数,僵尸进程数
第三行:CPU运行百分比。us: 用户空间占,用户进程空间内改变过优先级的进程占,空闲CPU占,等待输入输出的CPU,硬中断(Hardware IRQ)占,软中断(Software Interrupts)占
第四行:物理内存总数(KB),空闲内存,已使用内存,缓存的内存
第五行:交换空间总数,空闲交换内存,已使用,可使用
PID: 进程号
USER: 运行进程的用户
PR: 进程优先级
NI: nice值。负值表示高优先级,正值表示低优先级
VIRT: 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES: 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR: 共享内存大小,单位kb
S: 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU: 上次更新到现在的CPU时间占用百分比
%MEM: 进程使用的物理内存百分比
TIME+: 进程使用的CPU时间总计,单位1/100秒
COMMAND: 进程名称(命令名/命令行)
用户管理
group
创建用户组:groupadd -g 1100 devops
。创建一个组:devops,并指定组GID为1100
user
创建用户:useradd -u 1100 -g 1100 -G wheel -k -m -d /home/devops devops
。
-u
: 指定用户UID-g
: 指定组GID,需要存在-G
: 指定附加组,需要存在-k
: 骨架目录中的文件和目录将被拷贝到用户主目录-m
: 若-d
指定目录不存在则创建-d
: 指定用户主目录
ssh
ssh
OpenSSH客户端
1 | $ ssh -p 22222 hldev@centos7-001 |
sftp
基于SSH协议的FTP客户端,可以通过SSH登录服务器并使用FTP协议上传、下载文件
1 | $ sftp hldev@centos7-001 |
- put: 上传本地文件到服务器
- get: 从服务器下载文件
- !command: 命令前添加!,命令将在本地执行。
put
, get
命令还有些参数可以设置,常用如下:
- -P: 同步完整的文件权限的访问时间
- -r: 递归拷贝目录内的所有文件
scp
基于SSH协议的文件拷贝工具,可以将本地文件拷贝到远程服务器。
1 | $ scp README.md hldev@centos7-001:/home/hldev/ |
VIM,编辑器之神
CentOS系统默认只安装了VI,要使用VIM需要安装:sudo yum -y install vim
VIM全称是:Vi IMproved。改进的Vi,程序员的文本编辑器。VIM被称为编辑器之神。使用 VIM 非常简单,在终端输入 vim
即可。VIM支持全键盘操作,
不需要使用鼠标即可操作,可显著提供工作效率。
同时也可以指定要打开的文件。打开 vim 时可以使用参数,比如:-R
只读模式。在使用VIM查看比较大的日志文件等时候可以防止误操作修改文件。
VIM运行时有三种模式:
- Normal模式:在Normal模式下,用户可以移动光标、操纵文字、输入各种控制操作
- Edit模式:顾名思义,编辑模式下可以输入内容。
- Command模式(指令模式):在Normal模式下,按
shift+;
(输入英文冒号)则可进入指令模式。当编辑器下部出现闪烁的英文冒号时既进入指令模式。
使用VIM打开本文 vim README.md
,默认处于 Normal 模式。
VIM 基本使用
这时,可以使用键盘上的 H、J、K、L 4个键移动光标,分别为:向左、上、下、右移动。当光标移动到期望的位置后可以有多种方法进入Edit(编辑)模式。i
:在光标指定字符前进入编辑模式,a
:在光标指定字符后进入编辑模式,s
:替换光标指定字符并进入编辑模式。
退出Edit模式有两种方法:
- 按
Esc
键退出Edit模式并进入Normal模式 - 按
ctrl+[
组合键
VIM技巧
保存和退出(Command模式)
输入 w
将保存当前编辑内容,若是打开的新文件可以在 w
后输入需要保存的文件名。
输入 q
将退出VIM,退出前必需保存已编辑内容。若想放弃当前编辑内容并退出,输入 q!
。
w
, q
可以组合输入。比如保存并退出:wq
。
快速移动(Normal模式)
翻页
ctrl-f
向前翻一页,ctrl-b
向后翻一页(向前翻页时VIM将保留之前页的最后两行)。
快速定位到文本开头或结尾
连按两次 g
键将光标移动到整个文本开头,shift+g
将移动光标到整个文本结尾。
复制、粘贴行(Normal模式)
连续按两次 y
键复制单行,在需要粘贴的地方使用 p
键进行粘贴(将粘贴到光标所在行之下)。
复制多行
按 shift+v
组合键可以高亮一行,这时可以使用 J、K 进行上下移动,选中需要的多行后再按 y
键即可复制多行。
撤销、恢复编辑(Normal模式)
在Normal模式下按 u
键将撤销最后一次编辑(每次保存文件算一次编辑)。按 ctrl+r
将恢复撤销。撤销和恢复可进行多次。
自动补全(Edit模式)
在需要实例的文字后按 ctrl+c ctrl+p
会弹出自动补全选择框,这里可以使用 ctrl+n
或 ctrl+p
进行向下、向下移动,选中需要实例的单词后按 Enter
键即可。
将本地路径录入文本(Edit模式)
使用 ctrl+c ctrl+f
将弹出本地路径选择框(相对当前编辑文本路径),移动光标选中需要的路径,按 Enter
键后录入到文本中。
VIM配置
可以自定义VIM配置,VIM的配置文件为:.vimrc
,一般在用户主目录下。编辑配置文件:
1 | $ vim ~/.vimrc |
输入以下内容打开高亮和自动缩进。
1 | syntax on |
Shell
Shell是用户使用Linux的桥梁,它既是一种命令语言,又是一种程序。在Linux下,一般默认使用的是 Bash。以下内容非特殊说明,默认使用的Bash。
Bash脚本
可以将一系列命令放到一个脚本文件中自动执行,一般这类脚本文件都以 .sh
结尾。
1 | #!/usr/bin/env bash |
上面是一个普通的shell脚本,使用Bash执行。