第一讲
Linux 的起源、历史、特点、定义
起源
1991 年 Linus Torvalds 仿造 Minix 开发了与 UNIX 兼容的 Linux 操作系统内核。
历史
1991 年 10 月发布linux0.02 版本
1993 年发布linux0.99 版本
1994 年 3 月发布linux1.0 版本,遵循GPL 协议
1994 年加入GNU 组织
…
当前最新稳定内核版本为:6.3.4
https://www.kernel.org
特点
-
开放性(遵循标准)
-
多用户
-
多任务
-
良好的用户界面
-
设备独立性(把外部设备当作文件处理)
-
丰富的网络功能
-
可靠的系统安全
-
良好的可移植性
定义
什么是 linux?
是一个类 UNIX 内核的可以自由发布的实现版本,是一个操作系统的底层核心(内核)
Linux => 内核
Linux 系统 => 内核 + 工具 + 配套软件
GNU GPL
GNU GPL 全称是 GNU General Public License(自由文件许可)
GPL核心思想:
保证任何人有共享、修改、发布自由软件的自由
自由软件的衍生作品必须以 GPL 为重新发布的许可证
允许公司销售自由软件(硬件/服务),提供源代码
常见的发行版本
Linux 类型
- Linux 系统:内核 + 实用工具(专家才会用)
- Linux 发行版:内核 + 配套软件(普通用户也能使用)
常见的发行版本有:Centos、Ubuntu、Debian
软件提供方式
-
自由软件
- 源码公开
- 任何人都可以自由传播、下载、使用、改写、重新发布
- 自由软件不一定免费
- 举例:gcc、make
-
免费软件
- 免费
- 不一定公开源码。
- 举例:QQ、WeChat
-
商业软件
- 由开发者出售并提供技术服务
- 用户只有使用权
- 不提供源代码
- 举例:Photoshop
-
共享(试用)软件
- 用户在试用该程序拷贝一段时间之后,必须向开发者交纳使用费用,否则不能继续使用
- 不提供源代码
- 举例:VMware
第二讲
Linux 的安装方式、安装过程、远程连接方式
安装方式
- 虚拟机安装
- 云主机
虚拟机安装方式
- 好处
- 独立于原系统,可随时增删
- 与宿主之间文件共享
- 快照,随时恢复
- 共享网络
- 解决驱动问题
- 不足
- 对宿主机硬件设备要求较高
云主机安装方式
- 好处
- 动态扩容
- 有网就能访问
- 不足
- 付费
- 受限于网速
远程连接方式
- SSH 客户端
Linux 内核版本号
-
稳定版
内核的特性已经固定,代码运行稳定可靠,不再增加新的特性,要改进也只是修改代码中的错误。
-
2.6 及以下版本(x.y.zz)
- 次版本号=偶数 => 稳定版本
- 次版本号=奇数 => 测试版本
-
3.0 开始
次版本号不再表示一个内核是稳定版本还是测试版本,所有发布出来的正式版本都是稳定版本
目录结构
Windows 下一般分了 C、D、E、F 盘等
Linux 下没有分磁盘,在根路径下存在许多系统文件,它们都有特定的用途:
- bin:常用系统程序目录
- boot:开机设定目录,也是摆放核心 vmlinuz 的地方
- dev:系统设备装置文件目录
- etc:系统配置文件
- etc/rc.d/init.d:系统开机时载入服务的 scripts 的摆放地点
- home:系统使用者的目录
- lib:Linux 执行或编译程序函数库目录
- mnt:软驱与光驱接入挂载的地方
- proc:系统核心与执行程序的一些信息
- root:系统管理员目录
- usr/bin./bin:一般执行文件摆放的地方
- usr/sbin./sbin:系统管理员常用指令集
- var:系统日志文件
- lost+fount:系统不正常产生错误时遗失的片段
系统结构、主要组件构成
系统结构图:
主要组件:
关机/重启命令
命令 | 选项 | 含义 | 常用命令例子 |
---|---|---|---|
shutdown | -h | 关闭系统并停止电源 | shutdown -h now 关闭系统并立即停止电源 |
作用:关机 | -r | 关闭系统并重新启动 | shutdown -r +5 关闭系统并在 5 分钟后重新启动 |
-c | 取消之前的关机计划 | shutdown -c 取消之前的关机计划 | |
-k | 发送警告信息而不进行关机操作 | shutdown -k +10 发送警告信息并在 10 分钟后进行关机操作 | |
init | 0 | 关闭系统并停止电源 | init 0 关闭系统并停止电源 |
作用:切换运行模式 | 6 | 关闭系统并重新启动 | init 6 关闭系统并重新启动 |
3 | 进入多用户模式,允许多个用户登录使用 | init 3 进入多用户模式,允许多个用户登录使用 | |
5 | 进入图形化界面模式,允许用户登录使用图形化界面 | init 5 进入图形化界面模式,允许用户登录使用图形化界面 | |
halt | -p | 关闭系统并停止电源 | halt -p 关闭系统并停止电源 |
作用:关机 | -d | 不要在wtmp中记录 | halt -d 关闭系统,但不留下日记记录 |
reboot | -f | 强制重启,不进行正常的系统关机操作 | reboot -f 强制重启,不进行正常的系统关机操作 |
作用:重新启动 | -d | 不要在wtmp中记录 | reboot -d 重启系统,但不留下日记记录 |
系统说明文档查询
命令:man xxx(xxx为命令名)
- 回车 下一行
- 空格 下一页
- q 退出
例如:man ls
安装 man 命令:yum install -y man man-pages
第三讲
Linux交互方式
- shell
- 操作系统
- 图形界面
Shell的作用、种类
Shell 是一个作为实现虚拟终端的一种程序,它允许用户向操作系统输入需要执行的命令,返回执行结果。
种类
-
ash
贝尔实验室开发的Shell,bsh是对ash的符号链接
-
bash(GNU Linux操作系统上默认的 Shell)
是GNU的Bourne Again Shell。sh以及bash2都是对它的符号链接
-
tcsh
是Berkeley UNIX C Shell。csh是对它的符号链接
-
ksh
Korn Shell的语法与Bourne Shell相同,同时具备了C Shell的易用特点
-
zsh
Korn Shell 的一个增强版本,具备bash Shell的许多特点
Shell的功能
- Shell提示符(# $)
- 命令自动补全(tab键)
- 历史记录查看(键盘上下键)
- 输入输出重定向(> >> <)
- 管道(|)
常用快捷键:
-
ctrl + r
反向搜索命令历史记录
-
ctrl + a
ahead 移动光标到行首
-
ctrl + e
end 移动光标到行尾
-
ctrl + d
delete 删除光标所在字符
-
ctrl + u
光标所在位置剪切到行首
-
ctrl + k
光标所在位置剪切到行尾
-
ctrl + y
粘贴剪切板内容
重定向
-
输出重定向
文件不存在则创建,文件存在则覆盖
echo abc > list.txt
-
追加重定向
文件不存在则创建,文件存在则在末尾追加内容
echo abc >> list.txt
高级重定向
文件描述符有以下三种
- 0 标准输入
- 1 标准输出
- 2 错误输出
# 默认情况,将正常输出和错误输出都输出到屏幕
ls /usr/abc
# 通过重定向,改变标准输出的位置
ls /usr/abc > ok.txt
# 文件描述符 1 即为标准输出
ls /usr/abc 1> ok.txt
# 指定文件描述符 2 改变标准错误输出的位置
ls /usr/abc 2> err.txt
# 同时改变标准输出和标准错误输出的位置
ls /usr/abc 1> ok.txt 2> err.txt
管道
将第一个命令的输出传递给第二个命令
文件类型
-
普通文件(regular file):[-]
纯文字文件(ascii)或二进制文件(binary)
-
目录(directory):[d]
-
链接文件(link):[I]
-
设备文件(device):
- 块(block)设备文件:[b]
- 字符(character)设备文件:[c]
-
管道文件(Pipe):[p]
-
Socket文件(Socket):[s]
路径
相对路径
指从用户工作目录开始的路径
绝对路径
指从 根 开始的路径,也称为完全路径
~ 当前用户主目录
/ 根路径
目录
工作目录
用户某一时刻处在的目录,也成为当前目录
用户主目录
每个用户都有自己的目录。root用户在/root下,普通用户一般在/home下。
用户主目录可以用符号 ~ 表示
特殊目录
- . 代表该目录自己
- … 代表该目录的父目录
- 对于根目录,. 和 … 都代表其自己
常用命令
echo
作用:打印内容
格式:echo [-n] 字符串
-n 表示输出字符串的最后不换行
clear
作用:清空屏幕
格式:clear
ls
作用:显示指定工作目录下的内容
格式:ls [选项] <路径>
选项 | 作用 |
---|---|
-a | all,列出所有文件,包含隐藏文件 |
-l | long,长格式打印 |
-i | inode,列出 inode 节点的值 |
-t | time,按时间排序 |
-S | size,按文件大小排序 |
-d | directory,如果是目录,则只显示目录,不显示目录下的内容 |
-R | recursive,递归显示目录及子目录的内容 |
pwd
作用:显示当前路径
格式:pwd
cd
作用:切换路径
格式:cd <路径>
mkdir
作用:创建目录
格式:mkdir [选项] <目录>
-p 自动创建不存在的中间目录
例子:
# 自动创建中间不存在的目录
mkdir -p dir4/dir5
rmdir
作用:删除目录。(只能删除空目录)
格式:rmdir [选项] <目录>
-p 删除路径中的空目录
rm
作用:删除文件或目录
格式:rm [选项] <路径>
-r 递归删除子目录的内容
-f 强制删除不进行提示
touch
作用:用于改变文件的时间记录/创建一个空文件
格式:touch [选项] <文件>
-a 改变档案的读取时间记录
-m 改变档案的修改时间记录
-r 使用参考档的时间记录
-d 设定时间与日期,可以使用各种不同的格式
cat
作用:连接文件并打印到标准输出设备上
格式:cat [选项] <文件>
-n 给每行编号
-b 除了空白行,给每行编号
more
作用:分页显示文件内容
格式:more [选项] <文件>
+n 从第 n 行开始显示
-S 把连续的多行空行显示为一行
基本操作:
q:退出
空格:下一页
回车:下一行
less
作用:分页显示文件内容
格式:less [选项] <文件>
-e 当文件显示结束后,自动退出
-f 强迫打开特殊文件
-i 忽略搜索时的大小写
-N 显示每行的行号
-S 显示连续空行为一行
基本操作:
q:退出
空格:下一页
回车:下一行
上下移动键:上下移动
命令 | 区别 |
---|---|
less | 支持向前和向后翻页,可以搜索文本,支持多种操作和快捷键。less 按需加载,速度会比 more 快一些 |
more | 只支持向前翻页,无法向后翻页,只能使用空格键翻页,不能搜索文本。 |
head
作用:显示文件的开头的内容。默认情况下显示文件的前 10 行内容。
格式:head [选项] <文件>
-q 隐藏文件名
-v 显示文件名
-c<数目> 显示的字节数
-n<行数> 显示的行数
例子:
# 显示前 5 行内容
head -5 file
head -n 5 file
# 显示前 20 个字符的内容
head -c 20 file
tail
作用:显示文件的结尾的内容。默认情况下显示文件的最后 10 行内容。
格式:tail [选项] <文件>
-f 当文件发生变化时,输出文件新增内容
-c<数目> 显示的字符数
-n<行数> 显示的行数
-v 显示详细的处理信息
例子:
# 显示最后 5 行内容
tail -5 file
tail -n 5 file
# 显示最后 20 个字符的内容
tail -c 20 file
# 实时监控文件的内容
tail -f file
cp
作用:文件或目录的复制
格式:cp [选项] 原路径 目标路径
-a 复制目录时,保留连接、文件属性,并复制目录下的所有内容
-f 覆盖已存在的目标文件而不进行提示
-p 除复制文件的内容外,还把修改时间和访问权限也复制到新文件中
-r 递归复制目录中的所有内容,包括子目录
mv
作用:移动文件或目录(重命名)
格式:mv [选项] 原路径 目标路径
-i 目标路径如果同名,先询问是否覆盖
-f 覆盖已经存在的目标文件而不提示
-n 不要覆盖任何已存在的文件或目录
第四讲
用户类型
超级用户
uid 为 0
root,有最高权限,可以对 Linux 做任何操作
普通用户
uid 范围为 1001以后
权限受限,用户之间私人的资源是相互隔离的
系统用户
uid 范围为 1-1000
与系统和程序服务相关的用户,默认情况下,这些特殊用户无法登录。
用户信息文件
用户信息文件存储在 /etc/passwd
- 每一行存储一个用户的账号信息
- 存储格式为:用户名:加密密码:用户ID:用户组ID:用户主目录:登录Shell
口令文件
口令文件存储在 /etc/shadow
- 每一行存储一个用户的登录密码信息,加密
- 只有 root 用户才能读取这个文件
组信息文件
组信息文件存储在 /etc/group
- 每一行记录系统中的用户组信息
- 组名:密码字段:用户组ID:用户名列表
常用命令
useradd
作用:新增用户
格式:useradd [选项] 用户名
-d dirName 指定用户主目录。默认在 /home 下新建一个与用户名相同的用户主目录
-s shellName 指定用户登录时使用的 Shell。默认为 /bin/bash
-g groupName 指定用户所属的组名。创建用户时默认创建一个与用户同名的组
-G groupList 一个用户可以属于多个组。用户创建时属于的组成为主组,其他的叫附属组
-u uid 指定新用户的 UID。新用户默认 UID 为当前最高 UID + 1
权限:需要 root 权限
passwd
作用:修改密码
格式:passwd [用户名]
权限:普通用户只能修改自己密码。root 可以修改其他人密码。
usermod
作用:修改用户属性
格式:usermod [选项] 用户名
-d dirName 指定用户主目录。默认在 /home 下新建一个与用户名相同的用户主目录
-s shellName 指定用户登录时使用的 Shell。默认为 /bin/bash
-g groupName 指定用户所属的组名。创建用户时默认创建一个与用户同名的组
-G groupList 一个用户可以属于多个组。用户创建时属于的组成为主组,其他的叫附属组
-u uid 指定新用户的 UID。新用户默认 UID 为当前最高 UID + 1
权限:需要 root 权限
userdel
作用:删除用户
格式:userdel [-r] 用户名
权限:需要 root 权限
groupadd
作用:增加用户组
格式:groupadd [-g n] 组名
-g n 指定组的 ID 为 n
权限:需要 root 权限
groupdel
作用:删除用户组
格式:groupdel 组名
权限:需要 root 权限
chmod
作用:改变指定目录或文件的权限
格式:chmod [-R] 权限模式 路径
-
u 表示文件拥有者
-
g 表示同组用户
-
o 表示其他以外的人
-
a 表示这三者皆是
-
+表示增加权限
-
-表示取消权限
-
=表示设置特定的权限
-
r 表示可读取
-
w 表示可写入
-
x 表示可执行
例子:
chmod a=rx,u+w,g-x,o-rx a.txt
chmod 640 a.txt
# 递归设置
chmod -R 765 dir
chown
作用:改变指定目录或文件的所属用户、所属组
格式:chown [-R] 用户名[:组名] 路径
权限:需要 root 权限
例子:
# 只修改用户名
chown wilson a.txt
# 同时修改用户名和组名
chown wilson:wilson a.txt
# 递归处理
chown -R wilson dir
chgrp
作用:改变指定目录或文件的所属组
格式:chgrp [-R] 组名 路径
权限:需要 root 权限
ln
作用:创建文件的快捷方式
格式:ln [-s] 源路径 目标路径(需要指定绝对路径,否则链接失效)
加 -s 就是创建软链接
tar
作用:备份文件
格式:tar [选项] 压缩文件名 路径
-c 创建备份
-C path 切换到指定目录
-f 指定备份文件
-t 测试备份文件
-v 显示指令执行过程
-x 从备份中还原文件
-z 通过 gzip 指令处理备份文件
例子:
# 对 dir 的内容打包(没有压缩,只是打包)
tar cvf dir.tar dir
# 默认解包到当前目录下
tar xvf dir.tar
# 指定解包到 /tmp 目录下
tar xvf dir.tar -C /tmp
# 打包压缩
tar zcvf dir.tar.gz dir
gzip
作用:用于压缩文件(只对文件有效)
格式:gzip [选项] 文件
-d 解开压缩文件
-l 列出压缩文件的相关信息
-r 递归处理指定目录
-v 显示指令执行过程
-t 测试压缩文件是否有误
unzip
作用:用于解压缩 zip 文件
格式:unzip [选项] 路径
-n 解压时不要覆盖原有文件
-l 列出压缩文件的相关信息
-d dir 指定解压时存放的目录
-v 显示指令执行过程
-t 测试压缩文件是否有误
例子:
# 默认解压到当前目录
unzip a.txt.zip
# 通过 -d 指定解压目录
unzip -d /tmp a.txt.zip
awk
作用:强大的文本数据处理工具
格式:awk [选项] ‘脚本命令’ 文件名
-F fs 指定分隔符fs,fs可以是字符串或正则表达式
-v 复制一个用户定义变量
-f scriptfile 从脚本文件中读取 awk 命令
例子:
# $1,$5 是定位符,表示取哪一列
cat /ect/passwd | awk -F: '{print $1,$5}'
awk -F: '{print $1,$5}' /etc/passwd
# -va=1 表示设置一个值为1的局部变量 a,可以在后面使用
cat /etc/passwd | awk -va=1 -F: '{print $1,$4+a}'
sed
作用:自动编辑一个或多个文件,简化对文件的反复操作、编写转化程序等
格式:sed [选项] 处理文件路径
a 在指定行号之后插入
c 整行替换
s 匹配替换
i 在指定行号位置插入
d 删除
例子:
# 在第一行后插入内容
sed '1a Hello Unix' test.txt
# 替换第二行的内容
sed '2c Hello Unix' test.txt
# 全局替换内容
sed 's/b/B/' test.txt
注意:以上操作不会修改源文件,如果想要修改源文件,需要加上 -i 选项
cut
作用:从指定文件中过滤或提取特定内容,并显示在当前屏幕上。
格式:cut [选项] 路径
-b 以字节为单位进行分割
-c 以字符为单位进行分割
-d 自定义分隔符,默认为制表符
-f 与 -d 一起使用,指定显示哪些列
例子:
cut -d: -f1,3,5 /etc/passwd
cut -c2-5 /etc/passwd
cut -c2,5,7 /etc/passwd
tr
作用:用于转换或删除文件中的字符
格式:tr [-d] 字符串1 字符串2
例子:
# 小写转大写
cat /etc/passwd | tr 'a-z' 'A-Z'
# 删除所有 a/b/c 字符
tr -d 'a-c' < test.txt
find
作用:查找文件或者目录
格式:find 路径 [选项] 表达式
-amin n 过去n分钟内被读取过的文件
-atime n 过去n天内被读取过的文件
-cmin n 过去n分钟内被修改过的文件
-ctime n 过去n天内被修改过的文件
-type c 文件类型是c的文件
-perm p 文件权限为p的文件
-name n 文件名为n的文件
例子:
# 查找当前目录下所有以 .conf 结尾的文件(含目录)
find . -name "*.conf"
# 查找根目录下权限为765,以 .txt 结尾的文件(含目录)
find / -perm 765 -name "*.txt"
#
grep
作用:查找文件中符合条件的字符串
格式:grep [选项] pattern [文件]
-i 忽略字符大小写的差别
-v 显示不包含匹配文本的所有行
-n 显示匹配行及行号
例子:
# 打印包含 root 的行
grep 'root' /etc/passwd
cat /etc/passwd | grep 'root'
# 打印不包含 root 的行
cat /etc/passwd | grep -v 'root'
软链接/硬链接
硬链接
给文件一个副本(别名),同时建立两者之间的连接关系。
- 修改其中一个,与其连接的文件同时被修改
- 删除其中一个,其余文件不受影响
- 硬链接与源文件存在于同一个文件系统中
软链接
产生一个特殊的文件,该文件的内容是指向另一个文件的位置。
- 软链接文件是一个快捷方式
- 删除了源文件,软链接文件就没用了
- 软链接可以跨越不同的文件系统
特性 | 软链接 | 硬链接 |
---|---|---|
适用场景 | 跨文件系统的链接、可跨越不同的机器和网络 | 仅适用于同一文件系统内的链接 |
inode节点 | 不与原文件共享inode节点,有自己独立的inode节点 | 与原文件共享inode节点,与原文件的inode节点相同 |
链接数 | 链接数为 1,即使创建多个软链接,也只会计算为 1 | 链接数大于等于 2,每创建一个硬链接,链接数加 1 |
文件的属性 | 拥有自己的文件属性,如权限、时间戳等 | 与原文件共享相同的文件属性 |
对链接进行操作(修改、删除)对原文件的影响 | 不会影响原文件,只会影响软链接本身 | 修改任意一个文件都会影响其他文件。 |
对原文件进行操作(修改、删除)对链接的影响 | 原文件被删除或移动后,软链接会失效 | 原文件被删除或移动后,硬链接仍然有效 |
注:软链接也称为符号链接。
课后作业
# 以长格式的形式打印/tmp目录下的所有文件,包括隐藏文件
ls -la /tmp
# 把/tmp/a.txt文件的权限修改为rwxr-xr--
chmod 754 /tmp/a.txt
# 把/tmp/b.txt文件的文件拥有者修改为mail,同组用户修改为games
chown mail:games /tmp/b.txt
# 把/tmp/c.txt重命名为/tmp/c.txt.bak
mv /tmp/c.txt /tmp/c.txt.bak
# 把当前时间追加到当前用户主目录下的d.txt文件
date >> d.txt
# 把系统当前用户的个数追加到当前用户主目录下的d.txt文件
wc -l /etc/passwd >> ~/d.txt
# 创建当前用户主目录下d.txt的软链接,链接到/tmp/e.txt
ln -s ~/d.txt /tmp/e.txt
# 利用tar打包/tmp目录,生成 tmp.tar压缩包,并保存在当前目录下
tar -zcvf ./tmp.tar /tmp
# 查看进程名为vsftpd 的进程信息
ps -ef | grep vsftpd
# 查找/usr目录下以xml结尾的所有文件
find /usr -name "*.xml"
第五讲
常用命令
cal
作用:打印日期
格式:cal
-3 显示最近三个月的日历
-s 将星期天作为月的第一天
-m 将星期一作为月的第一天
-y 显示当年日历
date
作用:显示或设定系统的日期与时间
格式:date [选项] 时间格式
%H 小时(00-23)
%M 分钟(00-59)
%S 秒(00-60)
%Y 完整年份(0000-9999)
%m 月份(01-12)
%d 日(01-31)
命令 | 作用 |
---|---|
date | 显示当前的日期和时间 |
date -s | 设置系统时间为指定的时间 |
date +% | 按照指定的格式显示当前的日期和时间 |
date -d | 显示指定字符串所表示的日期和时间 |
例子:
date "+%Y-%m-%d %H:%M:%S"
wc
作用:默认统计文件内的行/字和字节数
格式:wc [选项] 文件路径
-c 按字节统计
-l 按行数统计
-m 按字符统计
-w 按单词统计
sort
作用:对内容排序
格式:sort [选项] 文件路径
-f 排序时,将小写字母视为大写字母
-n 按照数值大小排序
-u 去重排序
-o file 将排序后的结果存入指定的文件
-r 以相反的顺序来排序
cat a.txt
# a
# c
# b
# c
sort a.txt
# a
# b
# c
# c
which
作用:查找文件
格式:which | whereis 命令
例子:
which useradd
whereis useradd
su
作用:变更为其他使用者的身份。除 root 外,需要键入该使用者的密码。
格式:su [选项] [用户名]
例子:
su -c "whoami" wilson
vi的使用
三种模式
末行模式
# 保存&退出
:q # 正常退出
:q! # 强制退出
:w # 写入文件
:w filename # 另存为
:wq # 写入后退出
:wq! # 写入后强制退出
:x # 与:wq一样
# 临时显示行号
:set nu | :set number # 显示所有行号
:nu | :number # 显示光标所在行号
:set nonu | :set nonumber # 取消行号显示
# 长期显示行号
vi ~/.vimrc # 修改当前用户的vim配置文件
# 搜索
/<pattern> # 从光标所在文件往下搜索
?<pattern> # 从光标所在位置往上搜索
# n -> 向下搜索下一个匹配项 N -> 向上搜索上一个匹配项
# 替换
:s/x/y # 把光标所在行第一个匹配的 x 替换为 y
:n,m s/x/y # 把第n行到m行每行中第一个匹配的x替换为y
:% s/x/y # 把当前文件中所有行的第一个匹配的x替换为y
g # 全局匹配 :s/x/y/g
# 删除
:n,m d # 删除第n行到m行之间的内容
命令模式
-
h左 j下 k上 l后,也可以使用键盘上下左右键
-
$ 移动到行末
-
0,^ 定位到行首
-
gg 定位到第一行行首
-
G 定位到末行行首
-
nG 定位到第n行行首
-
n+ 向下移动n行
-
n- 向上移动n行
-
w | nw (word) 移动到下一/n个字首
-
e | ne (end) 移动到下一/n个字尾
-
b | nb (back) 移动到上一/n个字首
-
( 上一句
-
) 下一句
-
{ 上一段
-
} 下一段
-
ctrl + b 上翻一页
-
ctrl + f 下翻一页
-
ctrl + u 上翻半页
-
ctrl + d 下翻半页
-
x | nx 删除一/n个字符
-
dd | ndd 删除一/n行
-
dG 删除所有内容
-
d[w|e|b|$|^|G|gg…] 删除光标移动范围内的内容
-
u 撤销上一步操作
-
U 撤销对当前行的所有操作
-
yy | nyy 复制一/n行
-
d[w|e|b|$|^|G|gg…] 复制光标移动范围内的内容
-
p 粘贴到光标所在位置下一个字符位置
vi下的删除操作,删除的内容会缓存到粘贴板上,可以通过p来重新粘贴
-
r | nr 替换光标所在字符(相同字符)
-
R 进入替换模式,替换光标所在字符,直到按下ESC
-
s #删除光标所在字符后插入
-
i #在光标左侧插入
-
I #在光标所在行首插入
-
a #在光标右侧插入
-
A #在光标所在行尾插入
-
o #在光标所在行的下一行插入
-
O #在光标所在行的上一行插入
-
S #删除光标所在行
-
ZZ 与末行模式 :wq 效果一样
单文件打开
# 默认定位第一行
vi /path/to/file
# 打开文件后把光标置于第n行
vi +n filename
# 打开文件后把光标置于最后一行
vi + filename
多文件打开
vi filename1 filename2 filename3
# 末行模式下进行切换
# :e filename2
vi和Shell交互
在末行模式下,用 ! 符号来访问 Linux 的 Shell
:!cat /etc/passwd | more
vi文件冲突
每次打开文件会创建一个 *.swp 的临时文件
当多界面编辑、vi异常退出时会导致异常
删除 *.swp 即可
文本格式转换
Window 换行结束符号有两个控制字符,一个是归位字符^M
,另一个是换行字符^J
Linux 中只使用一个换行字符 \n
使用工具进行格式转换
yum install -y dos2unix unix2dos
使用
unix2dos | dos2unix filename 格式转换后覆盖更新原文件
unix2dos | dos2unix -n newFilename filename 格式转换后存为新文件
课后作业
# 执行 man ls > out.txt ,生成out.txt文件
man ls > out.txt
# 使用 vi 打开 out.txt
vi out.txt
# 显示所有行号
:set number
# 光标移动到100行,向右移动10个字符
100G 10l(或10键盘右方向键)
# 移动到第一行,往下搜索“1024”,定位到第二个匹配项
gg /1024 n(向下查找第二个)
# 将50行到100行之间的小写“o”改写为大写"O
:50,100 s/o/O/g
# 修改完了,突然反悔,如何恢复修改前?
多次执行u
# 复制65到73行之间这9行的内容,粘贴到最后一行
65gg 9yy G p
# 删除21到42行之间的所有内容
20G 22dd
# 把当前文档另存为 out.txt.bak
:w out.txt.bak
# 定位到28行,删除3个单词
28G d3w
# 在第一行新增一行,输入"I am a Student!"
gg O I am a Student!
# 保存退出
:wq
第六讲
禁用/激活网络接口
ifconfig ens33 up / ifup ens33
ifconfig ens33 down / ifdown ens33
网络配置相关文件
文件 | 作用 |
---|---|
/etc/sysconfig/network | 最基本的网络信息,系统启动时读取该文件 |
/etc/sysconfig/network-scripts/ ** | 此目录下的文件是系统启动时用来初始化网络的一些信息。 |
/etc/host.conf | 域名解析的配置文件 |
/etc/resolv/conf | 域名服务器配置文件 |
/etc/protocols | 定义使用的网络互联协议及协议号 |
/etc/services | 设定主机的不同端口的网络服务 |
开启自启动
/etc/rc.d/rc.local
-
赋予脚本可执行权限
chmod +x /opt/script/autostart.sh
-
在 /etc/rc.d/rc.local 末尾增加想要执行的脚本内容
echo “/opt/script/autostart.sh” >> /etc/rc.d/rc.local
-
给 /etc/rc.d/rc.local 赋予可执行权限
chmod +x /etc/rc.d/rc.local
chkconfig
-
将脚本移动到 /etc/rc.d/init.d 目录下
mv /opt/script/autostart.sh /etc/rc.d/init.d
-
赋予脚本可执行权限
chmod +x /etc/rc.d/init.d/autostart.sh
-
添加脚本到开机自启动项目中
cd /etc/rc.d/init.d
chkconfig -add autostart.sh
chkconfig autostart.sh on
systemctl
以 mysql 为例
systemctl enable mtsql.service
systemctl start mysql
常用命令
ping
命令 | 作用 |
---|---|
ping | 向指定主机发送 ICMP 回显请求 |
ping -c | 向指定主机发送指定数量的 ICMP 回显请求 |
ping -i | 指定发送 ICMP 回显请求的时间间隔 |
ping -s | 指定 ICMP 回显请求的数据包大小 |
ping -t | 指定 ICMP 回显请求的生存时间 |
ping -v | 显示 ICMP 回显请求和回应的详细信息 |
其中 <host>
是要测试的目标主机的 IP 地址或域名。
第七讲
网络服务模型
Linux系统中的网络服务模型有两种:
-
独立的守护进程工作模式(stand-alone)
守护进程的工作就是打开一个端口,并且等待(Listen)进入连接
如果客户端发起一个连接请求,守护进程就创建(Fork)一个子进程响应这个连接,而主进程继续监听其他的服务请求
-
基于 xinetd 的工作模式(Internet Super Server)
xinetd能够同时监听多个指定的端口,在接受用户请求时,它能够根据用户请求的端口不同,启动不同的网络服务进程来处理这些用户请求
可以把xinetd看做一个管理启动服务的管理服务器,它决定把一个客户请求交给哪个程序处理,然后就启动相应的守护进程
工作模式 | 优点 | 缺点 |
---|---|---|
独立的守护进程工作模式 | - 不需要安装 xinetd 服务 - 相对简单,易于管理和维护 - 可以独立地控制每个服务的访问权限 | - 每个服务都需要独立地监听端口,占用系统资源 - 容易受到网络攻击 - 无法限制并发连接数 |
基于 xinetd 的工作模式 | - 可以集中管理所有服务的访问权限 - 可以限制并发连接数,防止 DoS 攻击 - 可以根据需要启动和停止服务,减少系统资源占用 | - 需要安装 xinetd 服务,增加系统复杂性 - 需要编写 xinetd 配置文件,增加配置难度 - xinetd 进程本身可能成为系统安全漏洞 |
FTP的两种工作模式
主动模式PORT(服务器主动连接客户端)
主动指的是FTP服务器“主动”去连接客户端的数据端口来传输数
-
客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口(即tcp 21端口)
-
客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器
-
服务器会从它自己的数据端口(20)“主动”连接到客户端指定的数据端口(N+1)
-
客户端就可以和ftp服务器建立数据传输通道了
被动模式PASV(服务器被动等待客户端连接)
被动:指的是FTP服务器“被动”等待客户端来连接自己的数据端口
-
客户端打开两个任意的非特权本地端口(N >1024和N+1)
-
第一个端口连接服务器的21端口,提交PASV命令
-
服务器会开启一个任意的非特权端口(P > 1024),并发送给客户端
-
客户端发起从本地端口N+1到服务器的端口的连接用来传送数据。(注意此模式下的FTP服务器不需要开启tcp 20端口了)
第八讲
Shell编程的特点
-
shell程序可以认为是将shell命令按照控制结构组织到一个文本文件中,批量的交给shell去执行
-
不同的shell解释器使用不同的shell命令语法
-
shell程序解释执行,不生成可以执行的二进制文件
-
可以帮助用户完成特定的任务,提高使用、维护系统的效率
-
了解shell程序可以更好的配置和使用Linux,实现自动化运维
变量的声明和使用
变量的特点:
- 弱类型,不用声明类型
- 可以存储不同的内容
- 大小写区分
格式:变量=值(等号两边不能有空格)
使用:
- $变量名(变量名为一个字符时使用)
- ${变量名}(变量名多于一个字符时使用)
注意:
- 如果字符串里包含空格,则必须使用引号括起来
- 等号两边不能有空格
- 默认情况下,所有输入的内容都是字符串
获取输入
使用 read 可以将用户的输入赋值给变量
# 将输入赋值给x(单个输入)
read x
# 将输入转换成数组赋值给arr(多个输入)
read -a arr
read可以接收选项,例如:
-
-a,表示将输入转换成数组(
read
命令默认会以空格、制表符和换行符作为分隔符) -
-r,不将输入中的
\
视作转义字符 -
-p,指定一段提示语,如:
read -p "提示..." x
单引号、双引号和反引号
双引号
- 字符串通常放在双引号中
- 如果在参数中包含一个或多个空白字符,必须给参数加双引号
- 如果把一个带有$字符的变量放在双引号中,程序执行到该行时会把变量替换为它的值
- 可用 \ 字符取消 $ 的特殊含义
单引号
- 单引号内的字符都作为普通字符出现
反引号
- 反引号内的字符串被 Shell 解释为命令行,在执行时 Shell 会先执行该命令行,并以它的标准输出结果取代整个反引号内容
位置变量
bash在解释用户命令时,会把所输入的命令后面的参数使用位置变量传递给bash脚本程序
-
$0,代表脚本的名字
-
$1、 2 … 2… 2…n,分别代表参数1、参数2…参数n
-
$*,包括参数的列表(字符串)
-
$@,包括参数的列表(数组)
-
$#,包括参数的个数
环境变量
环境变量 | 说明 |
---|---|
$HOME | 用户的主目录 |
$IFS | 内部的域分隔符,一般为空格符、制表符或换行符 |
$PATH | 寻找命令或可执行文件的搜索路径列表,路径以冒号分隔 |
$$ | Shell脚本的进程号 |
$? | 紧邻的前驱命令的返回值 0=成功 1=失败 |
$TERM | 使用的终端类型 |
$SHELL | 查看当前用户所使用的的shell |
常用的运算符
整数的算术运算符:
+、-、*、/、%;
赋值运算符:
=、+=、-=、*=、/=、%=
位运算符:
<<、>>、&、|、~、^;
位运算赋值运算符:
<<=、>>=、&=、|=、~=、^=;
逻辑运算符:
&&,||,!,>,>=,<,<=,!=,==
数学表达式
计算表达式的值有三种方法:
-
expr 命令
格式:expr arg
例:
- s=
expr 2 + 3
- s=
expr $s \* 4
注意:
- 运算符和参数之间要有空格隔开
- 通配符号(*)作为乘法运算符时要用 \ 转义
- s=
-
let 命令
例:
- let s=(2+3)*4
注意:
- 运算符和参数之间不能有空格
- 当运算符中有<、>、&、|等符号时,同样需要用引号(单引号、双引号)或者斜杠来修饰运算符
-
$((数学表达式))
例:echo $((2*3+4))
条件判断
常见的条件:
- 变量属性
- 文件属性
- 命令执行的结果
- 多种条件的逻辑组合
判断结果:
- 真:0
- 假:1
格式:
- test condition
- [ condition ] (condition左右两边需要有空格)
测试文件属性
常用的文件属性条件判断 | |
---|---|
-f fn | 如果fn存在且fn为普通文件则返回真,否则返回假。 file |
-b fn | 如果fn存在且fn为块设备则返回真,否则返回假。 block |
-e fn | 如果fn存在则返回真,否则返回假。 exist |
-d fn | 如果fn 存在且fn为目录则返回真,否则返回假。 directory |
-r fn | 如果fn存在且fn可读则返回真,否则返回假。 read |
-w fn | 如果fn存在且fn可写则返回真,否则返回假。 write |
-x fn | 如果fn存在且fn可执行则返回真,否则返回假。 execute |
-O fn | 如果fn存在且被当前用户拥有则返回真,否则返回假。 |
-L fn | 如果fn存在且fn为符号链接则返回真,否则返回假。 |
测试字符串属性
常用字符串属性条件判断 | |
---|---|
string_1 = string_2 | 如果string_1和string_2两个字符串相等则返回真,否则返回假; |
string_1 != string_2 | 如果string_1和string_2两个字符串不相等则返回真,否则返回假; |
-z string | 如果字符串string的长度为0则返回真,否则返回假; zero |
-n string | 如果字符串string长度不为0则返回真,否则返回假; |
string | 同-n string,如果字符串string长度不为0返回真,否则返回假。 |
测试整数关系
常用的整数关系条件判断 | |
---|---|
mum_1 –eq num_2 | 如果num_1和num_2相等则返回真,否则返回假; |
mum_1 –ne num_2 | 如果num_1不等于num_2则返回真,否则返回假; |
mum_1 –gt num_2 | 如果num_1大于num_2则返回真,否则返回假; |
mum_1 –lt num_2 | 如果num_1小于num_2则返回真,否则返回假; |
mum_1 –le num_2 | 如果num_1小于等于num_2则返回真,否则返回假; |
mum_1 –ge num_2 | 如果num_1大于等于num_2则返回真,否则返回假; |
逻辑运算
逻辑与-a:condition1 -a condition2,如果两个条件都为真,则结果为真
逻辑或-o:condition1 -o condition2,如果两个条件有一个为真,则结果为真
逻辑非!:! condition,结果与condition相反
控制结构
控制结构可以分为分支和循环两种:
常见的分支结构:
- if
- case
常见的循环结构:
- for
- while
- until
例子
输入:1 2 3 4 5 输出:20
#!/bin/bash
while true
do
echo 'Input a list of number:'
read -a nums
if [ ${nums[0]} = 'q' ];
then
exit
fi
total=0
for num in ${nums[@]}
do
let total=${total}+${num}
done
echo "the result is ${total}"
done
根据输入执行命令
#!/bin/bash
func()
{
echo -e
echo "Use one of the following options:"
echo "P:To display current directory"
echo "S:To display the name of running file"
echo "D:To display today's date and present time"
echo "L:To see the list of files in your present working directory"
echo "W:To see who is logged in"
echo "I:To see the ip address of this local machine"
echo "Q:To quit this program"
echo "Enter your option and hit:"
}
while true
do
func
read input
case ${input} in
p|P)
pwd
;;
s|S)
echo $0
;;
d|D)
date "+%Y-%m-%d %H:%M:%S"
;;
l|L)
ls
;;
w|W)
who
;;
i|I)
ifconfig
;;
q|Q)
exit
;;
*)
echo "usage error!"
;;
esac
done
根据输入判断成绩
#!/bin/bash
while true
do
echo 'Please enter your score:'
read score
if [ "$score" -lt 0 ];
then
exit
elif [ "$score" -lt 60 ];
then
echo 'Failed!'
elif [ "$score" -ge 60 -a "$score" -lt 70 ];
then
echo 'Passed!'
elif [ "$score" -ge 70 -a "$score" -lt 80 ];
then
echo 'Medium!'
elif [ "$score" -ge 80 -a "$score" -lt 90 ];
then
echo 'Good!'
elif [ "$score" -ge 90 -a "$score" -le 100 ];
then
echo 'Excellent!'
else
echo 'error score!'
fi
done
第九讲
makefile文件
main.o部分的命令应为:gcc -c main.c -o main.o -L f1 -L f2
第十讲
磁盘设备命名规则
前两个字母表示分区所在设备的类型:
- hd:IDE硬盘
- sd:SCSI硬盘(U盘,移动硬盘等)
第三个字母表示分区在哪个设备上:
- hda:第一块IDE硬盘
- sda:第一块SCSI硬盘
- sdb:第二块SCSI硬盘
数字表示分区的次序:
- had1:第一块IDE硬盘第一分区
- sdb2:第二块SCSI硬盘第二个分区
查看硬盘及分区情况:
fdisk -l
文件系统
常见的文件系统
FAT、NTFS、ExtFAT、ext2、ext3、ext4、xfs、APFS
虚拟文件系统VFS
VFS是 Linux 内核中的软件层,它在内核中提供了一组标准的、抽象的文件操作,允许不同的文件系统实现共存,并向用户空间程序提供统一的文件系统接口。
VFS并不是一个实际的文件系统,它只存在于内存,系统启动时建立,关闭时消亡。
设备挂载
计算机系统中,所有的存储设备都是以目录树的形式对文件进行管理的
在Linux系统中,所有的文件都是在以“/”目录为根的一棵“大”目录树中进行管理。如果要使用USB存储设备、光盘或软盘等存储设备,必须将这些设备中的“小”目录树像嫁接一样挂载(mount)到Linux系统的“大”目录树中。
挂载点
Linux系统中有一个**/mnt**目录,专门用作挂载点(mount Point)目录
在挂载设备时首先查看挂载点目录是否存在,如果不存在必须首先创建该目录,否则mount命令无法正常执行
进程
Linux系统上所有运行的东西都可以称之为一个进程,如每个用户任务、每个系统管理任务
进程是一个程序的运行
进程与程序的区别:
- 程序只是一个静态的指令集合,不占系统的运行资源,只占用磁盘空间
- 进程是一个随时都可能发生变化的、动态的、使用系统运行资源(cpu,内存等)的程序
- 一个程序可以启动多个进程
进程的类型
Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性:
- 交互进程:有 Shell 启动的进程
- 批处理进程:这种进程和终端没有联系,是一个进程序列
- 守护进程:在后台持续运行的进程
进程在启动形态上分为两类:
前台进程
- 用户键入一个命令,回车执行,就已经启动了一个前台的进程
- 适合需要实时反馈的操作
- 前台进程会一直占用终端,直到进程执行结束
- ctrl+c强制结束进程执行
- kill杀死进程
后台进程
- 一般不需要用户交互或者实时的反馈
- 在命令结尾加上 &
常用操作
- jobs:查看所有后台进程列表
- ctrl+z 前台进程->后台进程,并暂停执行
- fg :将后台进程调至前台执行
- bg :将一个后台暂停的进程,继续执行
- kill杀死进程
常用命令
service
作用:启动、停止、重启或查询服务状态
命令 | 作用 |
---|---|
service start | 启动指定服务 |
service stop | 停止指定服务 |
service restart | 重启指定服务 |
service status | 查询指定服务状态 |
at
作用:指定在将来某个时刻执行某些命令
格式:at [选项] [时间]
执行方式:
- 交互式
- 指定文件
注意:
- at通过atd守护进程来实现,只执行一次
- 执行结束后会发邮件通知结果
crontab
作用:设定周期性任务。
格式:crontab [-u user] 文件 / crontab [-u user] {-l | -r | -e}
-e 执行文字编辑器来设定时间表
-r 删除目前的时程表
-l 列出目前的时程表
crontab文件编写格式
* * * * * 开头,分别代表分钟、小时、日、月、星期几
# 每天凌晨12点重启app.js
0 0 * * * /usr/local/bin/pm2 restart /root/project/centos/app/app.js
ps
作用:显示当前进程的状态
格式:ps [选项]
-A 列出所有的进程
-w 显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的进程
-e 显示所有进程
-f 采用全格式显示
kill
作用:删除执行中的程序或工作
格式:kill [-s <信息名称或编号>] [程序] / kill [-l <信息编号>]
1 重新加载进程
9 杀死一个进程
15 正常停止一个进程
注意:kill命令是向进程发送信号,不是杀死的意思,-9表示无条件退出,但由进程自行决定是否退出。这就是为什么kill -9终止不了系统进程和守护进程的原因
free
作用:显示内存状态,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。
格式:free [选项]
b | 以Byte为单位显示内存使用情况 |
---|---|
k | 以KB为单位显示内存使用情况 |
m | 以MB为单位显示内存使用情况 |
h | 以合适的单位显示内存使用情况,最大为三位数 |
o | 不显示缓冲区调节列 |
s<间隔描述> | 持续观察内存使用状况 |
t | 显示内存总和列 |
作用:发送邮件
例子:
# 给root用户发送邮件 -s指定主题
echo "这是邮件内容" | mail -s "邮件主题" root
第十一讲
Docker
Docker 是一个应用打包、分发、部署的工具
Docker与普通虚拟机的区别:
Docker:可理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要。
普通虚拟机:一个完整而庞大的系统,包含各种不管你要不要的软件。
特性 | 普通虚拟机 | Docker |
---|---|---|
跨平台 | 通常只能在桌面级系统运行,例如 Windows/Mac,无法在不带图形界面的服务器上运行 | 支持的系统非常多,各类 Windows 和 Linux 都支持 |
性能 | 性能损耗大,内存占用高,因为把整个完整系统都虚拟出来了 | 性能好,只虚拟软件所需运行环境,最大化减少没用的配置 |
自动化 | 需要手动安装所有东西 | 一个命令就可以自动部署好所需环境 |
一致性 | 环境一致性不高,不同系统差异大 | 一致性好,不同系统都一样部署方式 |
重要概念
仓库
集中存放镜像文件的地方,分为公开仓库和私有仓库两类。最大的公开仓库是DockerHub,用户可以在本地搭建私有仓库。
镜像
一个只读模板,包含一个完整的Linux OS环境和用户所需的应用程序,用以新建Docker容器。类似Java中的类。
容器
基于某个镜像创建的实例。可以想象成一个精简版的Linux OS环境和其下(包括root用户权限和用户空间、进程空间等)运行的应用程序空间。部分高权限内容无法使用。
工作流程
-
打包:就是把你软件运行所需的依赖、第三方库、软件打包到一起,变成一个安装包。
-
分发:你可以把你打包好的“安装包”上传到一个镜像仓库,其他人可以非常方便的获取和安装。
-
部署:拿着“安装包”,就可以使用一个命令把应用运行起来,自动模拟出一摸一样的运行环境,且跨平台Windows/Mac/Linux。
常用命令
搜索镜像
docker search 镜像名 [-no-trunc]
-no-trunc 不截断过长的描述
标准输出的结果:
NAME 镜像名
DSECRIPTION 描述
STARS 收藏数
OFFICIAL 是否是官方镜像
AUTOMATED 是否自动构建
拉取镜像
docker pull [选项] [仓库地址[:端口号]/]仓库名[:标签]
缺省仓库地址为 DockerHub
私有仓库地址格式一般为 <域名/IP>[:端口号]
查看镜像
docker images [选项] [REPOSITORY]
标准输出的结果:
REPOSITORY 镜像下载仓库源
TAG 镜像标记
IMAGE_ID 镜像唯一ID号
CREATED 创建时间
SIZE 镜像大小
删除镜像
docker image rm [选项] <镜像1> [<镜像2> …]
<镜像>可以填写镜像短ID / 镜像长ID / 镜像名
-f表示强制删除,一般用于被占用镜像的删除
显示容器
docker ps [选项]
-a 显示所有容器,包括未启动的容器
-f:根据条件过滤显示的内容
-n:列出最近创建的n个容器
-q:静默模式,只显示容器编号
终止容器
docker stop CONTAINER
CONTAINER 可以是 ID 也可以是 NAME
重启容器
docker restart CONTAINER
CONTAINER 可以是 ID 也可以是 NAME
删除容器
docker rm [选项] CONTAINER
-f 强制删除一个运行中的容器
启动容器
启动容器有三种方式:
-
基于镜像新建一个容器并启动
docker run [选项] NAME[:TAG]
-name=“”:为容器指定一个新名字(唯一,不指定则随机)
-d:后台运行容器,并返回ID
-t:为容器分配一个伪输入终端
-i:以交互模式运行容器(一般与-t一起用,进入后台)
-p:端口映射,<host端口>:<容器端口>
-v:目录映射,<host目录>:<容器目录>
-e:设置环境变量
例:
docker run -it centos:7 /bin/bash
-
重新启动
docker start <容器>
<容器>可以填写容器ID / 容器名
-
daemon 守护态运行
进入容器
-
attach
docker attach CONTAINER
连接到容器后台,所有窗口都会同步显示,exit会退出容器
-
exec
docker exec [选项] CONTAINER COMMAND [参数]
在运行的容器中执行命令exit不会退出容器
-d:后台运行
-i:保持STDIN 打开
-t:分配一个伪终端
创建镜像
docker commit [选项] 容器名 [REPOSITORY[:TAG]]
-a:提交的镜像作者
-m:提交时的说明文字
-c:创建文件时使用Dockerfile指令
–docker build [选项] path
path:dockerfile所在目录
-t:镜像的名字及标签,如:REPOSITORY[:TAG]
Dockerfile
用来构建镜像的文本文件,包含所需的指令和说明。
Dockerfile结构:
-
基础镜像信息(centos ubuntu …… nginx ……)
-
维护者信息(docker search可查看)
-
镜像操作指令(tar yum make)
-
容器启动时执行指令(系统启动时,第一个加载的程序/脚本/命令)
FROM centos:7
MAINTAINER scau
RUN yum install -y vim
CMD ["echo","hello dockerfile"]
Dockerfile操作指令 | |
---|---|
FROM [镜像] | 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令,例如centos:7。from有两层含义:①开启一个新的镜像②必须写的一行指令 |
MAINTAINER [名字] | 说明新镜像的维护人信息(可写可不写) |
RUN命令 | 每一条RUN后面跟一条命令,在所基于的镜像上执行命令,并提交到新的镜像中,RUN必须大写 |
CMD [“要运行的程序”,“参数1”、“参数2”] | 指定启动容器时需要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能执行最后一条,“bin/bash”也是一条CMD,并且会覆盖image镜像里面的cmd。 |
EXPOSE [端口号] | 指定新镜像加载到Docker时要开启的端口暴露端口,就是这个容器暴露出去的端口号。 |
ENV [环境变量] [变量值] | 设置一个环境变量的值,会被后面的RUN使用。容器可以根据自己的需求创建时传入环境变量,镜像不可以。 |
ADD [源文件/目录] [目标文件/目录] | ①将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,②或者是一个URL,③若源文件是压缩包则会将其解压缩。 |
COPY [源文件/目录] [目标文件/目录] | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中,copy只能用于复制,add复制的同时,如果复制的对象是压缩包,ADD还可以解压,copy比add节省资源。 |
VOLUME [“目录”] | 在容器中创建一个挂载点,简单来说就是-v,指定镜像的目录挂载到宿主机上(由容器创建和管理)。 |
USER [用户名/UID] | 指定运行容器时的用户 |
WORKDIR [路径] | 为后续的RUN、CMD、ENTRYPOINT指定工作目录,相当于是一个临时的"CD",否则需要使用绝对路径,例如workdir /opt。移动到opt目录,并在这下面的指令都是在opt下执行。 |
例子:
镜像管理
标记镜像
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
例:docker tag ubuntu:20.04 172.26.30.14:5000/myubuntu:v3
上传镜像
docker push [选项] NAME[:TAG]
注意:这是从本地镜像上传到镜像仓库(要先登陆到镜像仓库)
例:docker push scau/mycentos:v1(登录dockerhub,假设ID为scau)
容器管理
导入/导出容器
docker export [选项] CONTAINER
-o:将输出内容写到文件
例:
docker export -o mycentosv1.tar 37cdf85196fc
将id为37cdf85196fc的容器保存为tar文件
docker import [选项] file|URL [REPOSITORY[:TAG]]
-c:应用docker指令创建镜像
-m:提交时的说明文字
例:
docker import mycentosv1.tar mycentos:v2
从镜像归档文件mycentosv1.tar创建镜像,命名为mycentos:v4
第十二讲
X Window
组成
X Window系统由三个基本元素组成
-
X服务端
是控制输入及输出设备并维护相关资源的程序,它接收输入设备的信息,并将其传给X Client,而将X Client传来的信息输出到屏幕上(在屏幕上构造方块(窗口),然后画出里面的元素)
-
X客户端
是应用程序的核心部分,它与硬件无关,每个应用程序就是一个X Client
-
X通信通道
X通信通道的主体是xlib(X函数库)
X Client调用xlib,利用相应的通信功能向X Server发出请求
X Server完成任务之后,同样调用xlib把结果显示到指定的设备上去
更改系统运行级别
-
init n 或 telinit n
- n 为级别号,需要root权限
- 例:init 5
-
startx
- 启动图形化环境(需要安装图形化界面)
- 例:startx
-
长期
- 修改配置文件 /etc/inittab(CentOS6及以前)
- systemctl set-default *.targer(CentOS7之后)
系统初始化过程
CentOS7之前
CentOS7及之后
CentOS7及之后,systemd替代了init进程
与init类似:
- systemd总是第一个进程(PID=1)
- systemd进程扮演了终极父进程的角色,失去了父进程的子进程就会以systemd作为它们的父进程